<?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=Emma+Nowhere</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=Emma+Nowhere"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Emma_Nowhere"/>
	<updated>2026-07-25T18:26:39Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=1180794</id>
		<title>User:Emma Nowhere</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=1180794"/>
		<updated>2013-08-16T02:40:11Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=934522</id>
		<title>Linkset Resizer 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=934522"/>
		<updated>2010-06-02T17:41:53Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* Resizer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Resizer by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Yet another object resizer script.  Seeing as I was the person who originally opened the JIRA for [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams]&lt;br /&gt;
I thought I should put it to good use.  I like it more than the other resizer scripts out there, but of course, I&#039;m biased.  In any case, it never hurts to have more&lt;br /&gt;
code being shared.&lt;br /&gt;
&lt;br /&gt;
How to use with menu:&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
#Type /1resizer to show the menu&lt;br /&gt;
#Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
#Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
where x is the percentage of the original size you want to resize to.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
The script below is configured to be used as a drop-in script for a user or builder that wants to resize something for themselves.  If putting into a product, you may&lt;br /&gt;
want to set START_ON_TOUCH to be TRUE so that your customers can just touch the object to start resizing.  You may also want to set SAY_STATUS to FALSE&lt;br /&gt;
so that a bunch of text doesn&#039;t get sent to the chat window (only seen by the owner, but can still be annoying to the end-user).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resizer ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Resizer&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 6/1/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use with menu:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1resizer to show the menu&lt;br /&gt;
// 3. Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
// 4. Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
//&lt;br /&gt;
// Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
// where x is the percentage of the original size you want to resize to.&lt;br /&gt;
//&lt;br /&gt;
// If using in a product with no other scripts, change START_ON_TOUCH below to TRUE&lt;br /&gt;
// so user can initiate resizing by just touching the object.&lt;br /&gt;
 &lt;br /&gt;
integer START_ON_TOUCH = FALSE;&lt;br /&gt;
 &lt;br /&gt;
// Display status messages in chat window (to owner only)&lt;br /&gt;
 &lt;br /&gt;
integer SAY_STATUS = TRUE;&lt;br /&gt;
 &lt;br /&gt;
// Channel to listen for commands on&lt;br /&gt;
 &lt;br /&gt;
integer CHAT_CHANNEL = 1;&lt;br /&gt;
 &lt;br /&gt;
// SL constraints&lt;br /&gt;
 &lt;br /&gt;
float MIN_SIZE = .01;&lt;br /&gt;
float MAX_SIZE = 10;&lt;br /&gt;
float MAX_DISTANCE = 10; &lt;br /&gt;
float MIN_SCALE = .1;&lt;br /&gt;
 &lt;br /&gt;
integer MENU_CHANNEL = -1001;&lt;br /&gt;
 &lt;br /&gt;
list backupPrims = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
 &lt;br /&gt;
float scale = 1.0;&lt;br /&gt;
 &lt;br /&gt;
init_menu_channel() {&lt;br /&gt;
    MENU_CHANNEL = ((integer)(&amp;quot;0x&amp;quot; + llGetSubString((string)llGetKey(), -8, -1)) &amp;amp; 0x3FFFFFFF) ^ 0xBFFFFFFF;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
say_status(string msg) {&lt;br /&gt;
    if (SAY_STATUS) llOwnerSay(msg);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        say_status(&amp;quot;Backing up prim positions and sizes.&amp;quot;);&lt;br /&gt;
        backupPrims = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        vector root_pos = &amp;lt;0, 0, 0&amp;gt;;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_POSITION, PRIM_SIZE]);&lt;br /&gt;
            vector pos = llList2Vector(params, 0);&lt;br /&gt;
            vector size = llList2Vector(params, 1);&lt;br /&gt;
            if (i == 1)&lt;br /&gt;
            {&lt;br /&gt;
                root_pos = pos;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pos = pos - root_pos;&lt;br /&gt;
            }&lt;br /&gt;
            backupPrims = backupPrims + pos + size;&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        say_status(&amp;quot;Prim positions and sizes backed up.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
float min(float a, float b) {&lt;br /&gt;
    if (a &amp;lt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
float max(float a, float b) {&lt;br /&gt;
    if (a &amp;gt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
float constrainMinMax(float value, float min, float max) {&lt;br /&gt;
    value = max(value, min);&lt;br /&gt;
    value = min(value, max);&lt;br /&gt;
    return value;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector constrainSize(vector size) {&lt;br /&gt;
    size.x = constrainMinMax(size.x, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
    size.y = constrainMinMax(size.y, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
    size.z = constrainMinMax(size.z, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
    return size;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector constrainDistance(vector delta) {&lt;br /&gt;
    delta.x = min(delta.x, MAX_DISTANCE);&lt;br /&gt;
    delta.y = min(delta.y, MAX_DISTANCE);&lt;br /&gt;
    delta.z = min(delta.z, MAX_DISTANCE);&lt;br /&gt;
    return delta;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
process(integer restore) {&lt;br /&gt;
    backup();&lt;br /&gt;
&lt;br /&gt;
    if (restore) {&lt;br /&gt;
        say_status(&amp;quot;Restoring previously backed up positions and sizes.&amp;quot;);&lt;br /&gt;
        scale = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        say_status(&amp;quot;Resizing prims to &amp;quot; + (string)llRound(scale * 100) + &amp;quot;% of original size.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
        vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
 &lt;br /&gt;
        if (!restore) size = constrainSize(size * scale);&lt;br /&gt;
 &lt;br /&gt;
        if (i == 1) {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            if (!restore) pos = constrainDistance(pos * scale);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (restore) {&lt;br /&gt;
        say_status(&amp;quot;Previously backed up prim positions and sizes restored.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        say_status(&amp;quot;Prims resized.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
finish() {&lt;br /&gt;
    say_status(&amp;quot;Deleting Resizer script.&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
menu() {&lt;br /&gt;
    llDialog(llGetOwner(),&lt;br /&gt;
    &amp;quot;Resizer\n\nMake a backup of your object first.\n\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
    [&amp;quot;Revert&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;Finish&amp;quot;, &amp;quot;-1%&amp;quot;, &amp;quot;-5%&amp;quot;, &amp;quot;-10%&amp;quot;, &amp;quot;+1%&amp;quot;, &amp;quot;+5%&amp;quot;, &amp;quot;+10%&amp;quot;], MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
handle_message(integer channel, string name, key id, string message) &lt;br /&gt;
{&lt;br /&gt;
    if (channel == CHAT_CHANNEL) {&lt;br /&gt;
        if (message == &amp;quot;resizer&amp;quot;) {&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (llSubStringIndex(message, &amp;quot;resizer&amp;quot;) == 0) {  &lt;br /&gt;
            list params = llParseString2List(message, [&amp;quot; &amp;quot;], [] );&lt;br /&gt;
            if (llGetListLength(params) == 2) {&lt;br /&gt;
                string scale_param = llList2String(params, 1);&lt;br /&gt;
                if (llGetSubString(scale_param, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
                    scale = (((float)llGetSubString(scale_param, 0, -2)) / 100);&lt;br /&gt;
                    scale = max(scale, MIN_SCALE);&lt;br /&gt;
                    process(FALSE);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else if (channel == MENU_CHANNEL) {&lt;br /&gt;
        if (message == &amp;quot;Revert&amp;quot;) {&lt;br /&gt;
            process(TRUE);&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Finish&amp;quot;) {        &lt;br /&gt;
            finish();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (llGetSubString(message, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
            scale = scale + (((float)llGetSubString(message, 0, -2)) / 100);&lt;br /&gt;
            scale = max(scale, MIN_SCALE);&lt;br /&gt;
            process(FALSE);&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        if (START_ON_TOUCH) {&lt;br /&gt;
            // we only want a touch_start handler if we&#039;re going to use it&lt;br /&gt;
            // so change state rather than just testing inside touch_start&lt;br /&gt;
            // for START_ON_TOUCH to be true.&lt;br /&gt;
            state start_on_touch;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            llListen(CHAT_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
            init_menu_channel();&lt;br /&gt;
            llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
            llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHAT_CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHAT_CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        handle_message(channel, name, id, message);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
state start_on_touch&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHAT_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        init_menu_channel();&lt;br /&gt;
        llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch for resizer menu.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch for resizer menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        handle_message(channel, name, id, message);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        menu();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Link Resizer 2}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=934512</id>
		<title>Linkset Resizer 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=934512"/>
		<updated>2010-06-02T17:26:34Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* Resizer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Resizer by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Yet another object resizer script.  Seeing as I was the person who originally opened the JIRA for [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams]&lt;br /&gt;
I thought I should put it to good use.  I like it more than the other resizer scripts out there, but of course, I&#039;m biased.  In any case, it never hurts to have more&lt;br /&gt;
code being shared.&lt;br /&gt;
&lt;br /&gt;
How to use with menu:&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
#Type /1resizer to show the menu&lt;br /&gt;
#Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
#Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
where x is the percentage of the original size you want to resize to.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
The script below is configured to be used as a drop-in script for a user or builder that wants to resize something for themselves.  If putting into a product, you may&lt;br /&gt;
want to set START_ON_TOUCH to be TRUE so that your customers can just touch the object to start resizing.  You may also want to set SAY_STATUS to FALSE&lt;br /&gt;
so that a bunch of text doesn&#039;t get sent to the chat window (only seen by the owner, but can still be annoying to the end-user).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resizer ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Resizer&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 6/1/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use with menu:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1resizer to show the menu&lt;br /&gt;
// 3. Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
// 4. Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
//&lt;br /&gt;
// Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
// where x is the percentage of the original size you want to resize to.&lt;br /&gt;
//&lt;br /&gt;
// If using in a product with no other scripts, change START_ON_TOUCH below to TRUE&lt;br /&gt;
// so user can initiate resizing by just touching the object.&lt;br /&gt;
 &lt;br /&gt;
integer START_ON_TOUCH = FALSE;&lt;br /&gt;
 &lt;br /&gt;
// Display status messages in chat window (to owner only)&lt;br /&gt;
 &lt;br /&gt;
integer SAY_STATUS = TRUE;&lt;br /&gt;
 &lt;br /&gt;
// Channel to listen for commands on&lt;br /&gt;
 &lt;br /&gt;
integer CHAT_CHANNEL = 1;&lt;br /&gt;
 &lt;br /&gt;
// SL constraints&lt;br /&gt;
 &lt;br /&gt;
float MIN_SIZE = .01;&lt;br /&gt;
float MAX_SIZE = 10;&lt;br /&gt;
float MAX_DISTANCE = 10; &lt;br /&gt;
float MIN_SCALE = .1;&lt;br /&gt;
 &lt;br /&gt;
integer MENU_CHANNEL = -1001;&lt;br /&gt;
 &lt;br /&gt;
list backupPrims = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
 &lt;br /&gt;
float scale = 1.0;&lt;br /&gt;
 &lt;br /&gt;
init_menu_channel() {&lt;br /&gt;
    MENU_CHANNEL = ((integer)(&amp;quot;0x&amp;quot; + llGetSubString((string)llGetKey(), -8, -1)) &amp;amp; 0x3FFFFFFF) ^ 0xBFFFFFFF;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
say_status(string msg) {&lt;br /&gt;
    if (SAY_STATUS) llOwnerSay(msg);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        say_status(&amp;quot;Backing up prim positions and sizes.&amp;quot;);&lt;br /&gt;
        backupPrims = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        vector root_pos = &amp;lt;0, 0, 0&amp;gt;;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_POSITION, PRIM_SIZE]);&lt;br /&gt;
            vector pos = llList2Vector(params, 0);&lt;br /&gt;
            vector size = llList2Vector(params, 1);&lt;br /&gt;
            if (i == 1)&lt;br /&gt;
            {&lt;br /&gt;
                root_pos = pos;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pos = pos - root_pos;&lt;br /&gt;
            }&lt;br /&gt;
            backupPrims = backupPrims + pos + size;&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        say_status(&amp;quot;Prim positions and sizes backed up.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        say_status(&amp;quot;Restoring previously backed up positions and sizes.&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
            vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
            if (i == 1) {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        say_status(&amp;quot;Previously backed up prim positions and sizes restored.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    scale = 1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
finish() {&lt;br /&gt;
    say_status(&amp;quot;Deleting Resizer script.&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
float min(float a, float b) {&lt;br /&gt;
    if (a &amp;lt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
float max(float a, float b) {&lt;br /&gt;
    if (a &amp;gt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
float constrainMinMax(float value, float min, float max) {&lt;br /&gt;
    value = max(value, min);&lt;br /&gt;
    value = min(value, max);&lt;br /&gt;
    return value;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector constrainSize(vector size) {&lt;br /&gt;
    size.x = constrainMinMax(size.x, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
    size.y = constrainMinMax(size.y, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
    size.z = constrainMinMax(size.z, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
    return size;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector constrainDistance(vector delta) {&lt;br /&gt;
    delta.x = min(delta.x, MAX_DISTANCE);&lt;br /&gt;
    delta.y = min(delta.y, MAX_DISTANCE);&lt;br /&gt;
    delta.z = min(delta.z, MAX_DISTANCE);&lt;br /&gt;
    return delta;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
process() {&lt;br /&gt;
    backup();&lt;br /&gt;
 &lt;br /&gt;
    say_status(&amp;quot;Resizing prims to &amp;quot; + (string)llRound(scale * 100) + &amp;quot;% of original size.&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
        vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
 &lt;br /&gt;
        size = constrainSize(size * scale);&lt;br /&gt;
 &lt;br /&gt;
        if (i == 1) {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            pos = constrainDistance(pos * scale);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    say_status(&amp;quot;Prims resized.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
menu() {&lt;br /&gt;
    llDialog(llGetOwner(),&lt;br /&gt;
    &amp;quot;Resizer\n\nMake a backup of your object first.\n\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
    [&amp;quot;Revert&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;Finish&amp;quot;, &amp;quot;-1%&amp;quot;, &amp;quot;-5%&amp;quot;, &amp;quot;-10%&amp;quot;, &amp;quot;+1%&amp;quot;, &amp;quot;+5%&amp;quot;, &amp;quot;+10%&amp;quot;], MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
handle_message(integer channel, string name, key id, string message) &lt;br /&gt;
{&lt;br /&gt;
    if (channel == CHAT_CHANNEL) {&lt;br /&gt;
        if (message == &amp;quot;resizer&amp;quot;) {&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (llSubStringIndex(message, &amp;quot;resizer&amp;quot;) == 0) {  &lt;br /&gt;
            list params = llParseString2List(message, [&amp;quot; &amp;quot;], [] );&lt;br /&gt;
            if (llGetListLength(params) == 2) {&lt;br /&gt;
                string scale_param = llList2String(params, 1);&lt;br /&gt;
                if (llGetSubString(scale_param, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
                    scale = (((float)llGetSubString(scale_param, 0, -2)) / 100);&lt;br /&gt;
                    scale = max(scale, MIN_SCALE);&lt;br /&gt;
                    process();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else if (channel == MENU_CHANNEL) {&lt;br /&gt;
        if (message == &amp;quot;Revert&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Finish&amp;quot;) {        &lt;br /&gt;
            finish();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (llGetSubString(message, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
            scale = scale + (((float)llGetSubString(message, 0, -2)) / 100);&lt;br /&gt;
            scale = max(scale, MIN_SCALE);&lt;br /&gt;
            process();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        if (START_ON_TOUCH) {&lt;br /&gt;
            // we only want a touch_start handler if we&#039;re going to use it&lt;br /&gt;
            // so change state rather than just testing inside touch_start&lt;br /&gt;
            // for START_ON_TOUCH to be true.&lt;br /&gt;
            state start_on_touch;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            llListen(CHAT_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
            init_menu_channel();&lt;br /&gt;
            llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
            llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHAT_CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHAT_CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        handle_message(channel, name, id, message);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
state start_on_touch&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHAT_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        init_menu_channel();&lt;br /&gt;
        llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch for resizer menu.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch for resizer menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        handle_message(channel, name, id, message);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        menu();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Link Resizer 2}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=933843</id>
		<title>Category:LSL Library</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=933843"/>
		<updated>2010-06-01T16:28:01Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* LSL Script Library */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}{{RightToc}}&lt;br /&gt;
==Script Library==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em 0.5em 1.5em&amp;quot;&amp;gt;&lt;br /&gt;
Come to this page to see complex examples that show how to combine parts of LSL.&lt;br /&gt;
&lt;br /&gt;
Go to the [[:Category:LSL Examples|LSL Examples]] page to see brief examples of how to use parts of LSL &lt;br /&gt;
&lt;br /&gt;
Why collect complex examples here? Well, ...&lt;br /&gt;
&lt;br /&gt;
There are many [[script|scripts]] that have become buried in the [http://forums-archive.secondlife.com/15/1.html Scripting Library archive] or the newer [https://blogs.secondlife.com/community/forums/scripting_library?view=discussions Scripting Library forum], were lost with the death of the early scripting forums, or sit idle in [[inventory|inventories]] that could be useful and should be more accessible.&lt;br /&gt;
&lt;br /&gt;
Other scripters may be in the same situation. This wiki is a well-suited medium for a script library. Feel free to add your scripts to the script library by creating new pages for them and linking to those pages here.&lt;br /&gt;
&lt;br /&gt;
Note that there are many more scripts in the LSL Library here, but you can&#039;t get to them if you don&#039;t know they exist, because they are subpages now, instead of an automatically updated category.  Good luck searching.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules for posting: ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
#Your script must be tested and working. If it&#039;s not, stick it in your user-space until it is. This is a list of working, usable scripts.&lt;br /&gt;
#Add a link to your script&#039;s page here. Link back to this page from your script&#039;s page. Start your page with &amp;lt;nowiki&amp;gt;{{LSL Header}}&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
#Do not add scripts that duplicate the same functionality as an existing script or built in {{LSLGC|Functions|function}}. If yours does, explain why.&lt;br /&gt;
#Do not list simple scripts here. Include those among the [[:Category:LSL Examples|LSL Examples]] instead.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
==LSL Script Library==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||[[1st necessity of SL]]&lt;br /&gt;
||[[User:Beer Dailey|Beer Dailey]]&lt;br /&gt;
||Monitors for avatars and (de)activates scripts states to control script performance/lag.&lt;br /&gt;
|-&lt;br /&gt;
||[[3D Radar]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||Rezzes a ball for each avatar in range. Each ball tracks its own AV and displays distance.&lt;br /&gt;
|-&lt;br /&gt;
||[[Aim Detection]]&lt;br /&gt;
||[[User:Han Shuffle|Han Shuffle]]&lt;br /&gt;
||Monitors for avatars and reports back to owner about who is aiming at them.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kireji_Haiku/A_more_complex_freebie-giver_(setup_with_notecard)|A more complex freebie-giver (setup with notecard)]]&lt;br /&gt;
||&#039;&#039;&#039;[[User:Kireji Haiku|Kireji Haiku]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Kireji Haiku|talk]]|[[Special:Contributions/Kireji Haiku|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt;&lt;br /&gt;
||A freebie giver which gives up to nine different lists of its inventory items and gives the ability to send an eMail as feedback to the owner (or the owners!). Complete setup with notecard support and ability to resctrict to group. Including parts of [[llList2CSV]], [[AdvancedNotecardReader]], [[llUnSit]], [[llSameGroup]], [[llParticleSystem]] and last but not least the three main functions [[llEmail]], [[llGiveInventoryList]] and [[llDialog]].&lt;br /&gt;
|-&lt;br /&gt;
||[[AntiDelay Node]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Uses [[llMessageLinked]] to stop those pesky delays.&lt;br /&gt;
|-&lt;br /&gt;
||[[AO Overriding Pose Ball]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||No more turning your AO off and on when you sit down&lt;br /&gt;
|-&lt;br /&gt;
||[[ARCFOUR Strong Encryption Implementation]]&lt;br /&gt;
||[[User:Nekow42 Zarf|Nekow42 Zarf]]&lt;br /&gt;
||An LSL implementation of ARCFOUR, the most popular stream cipher still in use. It is licensed under a Creative Commons Attribution 3.0 license.&lt;br /&gt;
|-&lt;br /&gt;
||[[Assembly Programming Language|Assembly-Like Programming Language]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A compiler that runs assembly-like programs.&lt;br /&gt;
|-&lt;br /&gt;
||[[Associative Array Emulator|Associative Array (Dictionary) Emulator]]&lt;br /&gt;
||[[User:Alynna Vixen|Alynna Vixen]]&lt;br /&gt;
||This library provides a set of functions for using a list as an associative array where string based keys can refer to one or more variant elements.&lt;br /&gt;
|-&lt;br /&gt;
||[[AvatarFollower]]&lt;br /&gt;
||[[User:Dale Innis|Dale Innis]]&lt;br /&gt;
||Allows one avatar to automatically follow another.&lt;br /&gt;
|-&lt;br /&gt;
||[[Base2Dec]]&lt;br /&gt;
||[[User:Siann Beck|Siann Beck]]&lt;br /&gt;
||Convert a number to decimal from any base.&lt;br /&gt;
|-&lt;br /&gt;
||[[Basic A-Star Pathfinder]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| My own interpretation of A Star into a highly efficient algorithmn&lt;br /&gt;
|-&lt;br /&gt;
||[[Basic Encryption Modules]]&lt;br /&gt;
||[[User:Beverly Larkin|Beverly Larkin]]&lt;br /&gt;
||Basic encryption scripts, allows you to encrypt a float and shout it to another prim on a randomly chosen channel.&lt;br /&gt;
|-&lt;br /&gt;
||[[Be happy]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Basic smile attachment script, makes your avatar smile.&lt;br /&gt;
|-&lt;br /&gt;
||[[Best Neighbor Ad Hiding Script|Best Neighbor]]&lt;br /&gt;
||[[User:Doran Zemlja|Doran Zemlja]]&lt;br /&gt;
||Reduce ad clutter by hiding ads when users are on their own land nearby.&lt;br /&gt;
|-&lt;br /&gt;
||[[BigNum|BigNum Library (RSA Encryption)]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A BigNum Library for dealing with big numbers! Specialized for modular multiplication, and RSA encryption.&lt;br /&gt;
|-&lt;br /&gt;
||[[Binary Clock v1.1|Binary Clock]]&lt;br /&gt;
||[[User:Fox Diller|Fox Diller]]&lt;br /&gt;
||A Binary Clock.&lt;br /&gt;
|-&lt;br /&gt;
||[[BinaryDecimalConverter]]&lt;br /&gt;
||[[User:Soundless Smalls|Soundless Smalls]]&lt;br /&gt;
||Converts a binary value to a decimal value and vice versa.&lt;br /&gt;
|-&lt;br /&gt;
||[[Blacklist and Remote Kill|Blacklist and Remote Kill]]&lt;br /&gt;
||[[User:Chase Quinnell|Chase Quinnell]]&lt;br /&gt;
||Blacklist(denial of use) or a creator kill script(can delete someone&#039;s item by command on private channel)&lt;br /&gt;
|-&lt;br /&gt;
||[[User_talk:Rolig_Loon/Bookmark_URLs|Bookmark URLs]]&lt;br /&gt;
||[[User:Rolig Loon|Rolig Loon]]&lt;br /&gt;
||Dialog driven HUD reads bookmarked URLs from notecards and navigates directly to them with user&#039;s in-world browser.&lt;br /&gt;
|-&lt;br /&gt;
||[[Builders Buddy|Builder&#039;s Buddy Tool]]&lt;br /&gt;
||[[User:Newfie Pendragon|Newfie Pendragon]]&lt;br /&gt;
||Script to easily move/rotate large builds that exceed the linkable size limit (30 meters).&lt;br /&gt;
|-&lt;br /&gt;
||[[Button Click Detector]]&lt;br /&gt;
||{{User|Sendao Goodman}}&lt;br /&gt;
||Use [[llDetectedTouchUV]] to determine which button was pressed on a texture.&lt;br /&gt;
|-&lt;br /&gt;
||[[Camera Sync]]&lt;br /&gt;
||[[User:Meyermagic Salome|Meyermagic Salome]] and [[User:Nomad Padar|Nomad Padar]]&lt;br /&gt;
||A system to synchronize the cameras of two avatars.&lt;br /&gt;
|-&lt;br /&gt;
||[[Chatbot]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Compile and run the LSL you type on a channel, faster than you can thru the 2007-08 SL GUI.&lt;br /&gt;
|-&lt;br /&gt;
||[[Chat Logger (GPL)]]&lt;br /&gt;
||[[User:Nobody Fugazi|Nobody Fugazi]]&lt;br /&gt;
||Chat logger which requests permission from participants before recording them.&lt;br /&gt;
|-&lt;br /&gt;
||[[Chat_Relay|Chat Relay]]&lt;br /&gt;
||[[User:grumble Loudon|grumble Loudon]]&lt;br /&gt;
||A Chat relay which can be routed using a path header and won&#039;t echo.&lt;br /&gt;
|-&lt;br /&gt;
||[[ClickAndDrag]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| Click and Drag user interface elements using dynamic feedback&lt;br /&gt;
|-&lt;br /&gt;
||[[Code Racer]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Race two versions of code forever, to see which runs faster.&lt;br /&gt;
|-&lt;br /&gt;
||[[Code Sizer]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Count the bytes compiled from source code, to measure how to write small code.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Programs#v7-D_Enh._Color_Picker|Color Changer]]&lt;br /&gt;
||[[User:Void_Singer|Void_Singer]]&lt;br /&gt;
||Dialog driven color changer. Supports 16million+ colors, web color codes, multiple targeted prims, with save and recall.&lt;br /&gt;
|-&lt;br /&gt;
||[[Color Changer|Color Changer Plus]]&lt;br /&gt;
||[[User:Neo Calcutt|Neo Calcutt]]&lt;br /&gt;
||A color changer with 14 colors, a random function, and a custom vector function.&lt;br /&gt;
|-&lt;br /&gt;
||[[Color conversion scripts|Color Conversion]]&lt;br /&gt;
||[[User:Sally LaSalle|Sally LaSalle]]&lt;br /&gt;
||Convert between Red Green Blue (RGB) and Hue Saturation Value (HSV).&lt;br /&gt;
|-&lt;br /&gt;
||[[ColorConvert]]&lt;br /&gt;
||[[User:Siann Beck|Siann Beck]]&lt;br /&gt;
||Convert color values to vector from RGB, hex or HTML color name.&lt;br /&gt;
|-&lt;br /&gt;
||[[Color script]]&lt;br /&gt;
||[[User:Masakazu Kojima|Masakazu Kojima]]&lt;br /&gt;
||Script for changing colors trough a listener with pre-defined colors.&lt;br /&gt;
|-&lt;br /&gt;
||[[Library Combined Library|Combined Library]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Library of mostly encoding and decoding functions, some more useful then others.&lt;br /&gt;
* String functions: Replace / Trim right / Trim left / Trim both&lt;br /&gt;
* Unicode conversion: UTF8 to Unicode / Unicode to UTF8&lt;br /&gt;
* List functions: Replace / Compare&lt;br /&gt;
|-&lt;br /&gt;
||[[Computer:jaycoonlanguage]]&lt;br /&gt;
||[[User:jayco121 Bing|jayco121 Bing]]&lt;br /&gt;
|| A language written in LSL that is meant for my computer (available at the shop).&lt;br /&gt;
|-&lt;br /&gt;
||[[Read Note Card Configuration|Configuration Notecard Reader]]&lt;br /&gt;
||{{User|Dedric Mauriac}}&lt;br /&gt;
||A script to read configuration information from a notecard. Parses notecard to extract key words and their assigned values. Allows for comment lines and many more useful features.&lt;br /&gt;
|-&lt;br /&gt;
||[[AdvancedNotecardReader|Configuration Notecard Reader (advanced)]]&lt;br /&gt;
||[[Lear Cale|Lear Cale]]&lt;br /&gt;
||Robust configuration notecard reader; supports multiple notecards with same suffix, handles reconfig on inventory change, and does not usurp the default state.&lt;br /&gt;
|-&lt;br /&gt;
||[[Library_Chat_Relay|Conversation Relay]]&lt;br /&gt;
||[[User:Jippen Faddoul|Jippen Faddoul]]&lt;br /&gt;
||Chat relay which requests permission from participants before relaying their messages. Also includes their attachments. (ToS compliant).&lt;br /&gt;
|-&lt;br /&gt;
||[[Curtain script]]&lt;br /&gt;
||[[User:Zilla Larsson|Zilla Larsson]]&lt;br /&gt;
||A simple script to retract/stretch curtains, blinds, bedcovers and more&lt;br /&gt;
|-&lt;br /&gt;
||[[Dataserver API]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Dataserver Framework for Notecards.&lt;br /&gt;
|-&lt;br /&gt;
||[[Date Library]]&lt;br /&gt;
||[[User:Corto Maltese|Corto Maltese]]&lt;br /&gt;
|| Date library, based on number of day since march 3rd 1600, can be used to calculate weekday, date differences, and date offset, and date formating.&lt;br /&gt;
|-&lt;br /&gt;
||[[Day of the Week]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Function to get day of the week from [[llGetUnixTime]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Days in Month]]&lt;br /&gt;
||[[User:IntLibber Brautigan begin_of_the_skype_highlighting     end_of_the_skype_highlighting begin_of_the_skype_highlighting     end_of_the_skype_highlighting|IntLibber Brautigan]]&lt;br /&gt;
||Clicking on it returns the number of days in the present month. Useful for scripting calendars and tier systems that need to know the number of days in the month at hand or to calculate for any month. Even adjusts for leap years.&lt;br /&gt;
|-&lt;br /&gt;
||[[Deed Tools]]&lt;br /&gt;
||[[User:Falados Kapuskas|Falados Kapuskas]]&lt;br /&gt;
||Tools that allow the creator to modify Group-Owned (Deeded) Objects via chat.&lt;br /&gt;
|-&lt;br /&gt;
||[[Describe Chatter]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Chat to see yourself as others do.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog Control]]&lt;br /&gt;
||[[User:Nargus Asturias|Nargus Asturias]]&lt;br /&gt;
|| A (not-so) simple dialog &amp;amp; menu control script. Call dialog and receive selected value via [[link_message]](), with built-in timer and [[link_message]]() notification on time out. Supports multi-pages dialog and numeric property dialog. Button text and dialog&#039;s returned value can differ.&lt;br /&gt;
Latest version also has [[Dialog Menus Control]] built-in; which allow multi-level menus through SL dialog system.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog NumberPad|Dialog Number Pad]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Use a dialog to accept positive integer input from users.&lt;br /&gt;
|-&lt;br /&gt;
||[[Displayer Script]]&lt;br /&gt;
||[[User:Akinori Kimagawa|Akinori Kimagawa]]&lt;br /&gt;
||[[Display Words On Top Of An Object]]&lt;br /&gt;
|-&lt;br /&gt;
||[[Drink script]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Used mainly for food and drink in Second Life.&lt;br /&gt;
|-&lt;br /&gt;
||[[TOXDropBox|DropBox]]&lt;br /&gt;
||[[User:Dimentox Travanti|Dimentox Travanti]]&lt;br /&gt;
|| This is a Drop box which allows people to drop certain items in a object &amp;amp; has many config options.&lt;br /&gt;
|-&lt;br /&gt;
||[[Efficiency Tester]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Tests the speed of a function.&lt;br /&gt;
|-&lt;br /&gt;
||[[Email-to-IM|Email2IM]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Send IMs to SL friends via [[email]] (translate emails from friends into IMs).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kireji_Haiku/SIMchat_headset|Encrypted Region-wide chat]]&lt;br /&gt;
||&#039;&#039;&#039;[[User:Kireji Haiku|Kireji Haiku]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Kireji Haiku|talk]]|[[Special:Contributions/Kireji Haiku|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt;&lt;br /&gt;
||Encrypted Region-wide chat&lt;br /&gt;
|-&lt;br /&gt;
||[[ExplodingObjects]]&lt;br /&gt;
||[[User:Dale Innis|Dale Innis]]&lt;br /&gt;
||Causes an object (of the appropriate type) to explode on command.&lt;br /&gt;
|-&lt;br /&gt;
||[[FadeEasy]]&lt;br /&gt;
||[[User:Nika Rugani|Nika Rugani]]&lt;br /&gt;
||The easy way of fading objects in or out (Using llSetLinkAlpha)&lt;br /&gt;
|-&lt;br /&gt;
||[[FastConeSpread]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| Fast Algorithmn to achieve cone spread, main use in weaponry systems.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:PixelProphet Lane/Scripts#Fast List Prim Contents|Fast List Prim Contents]]&lt;br /&gt;
||[[User:PixelProphet Lane|PixelProphet Lane]]&lt;br /&gt;
||Fast and efficient method to print Object Inventory (Name, Type and next Owner permissions)&lt;br /&gt;
|-&lt;br /&gt;
||[[Find Avatar Key|Find Avatar Key]]&lt;br /&gt;
||[[User:Huney Jewell|Huney Jewell]]&lt;br /&gt;
||Explores [[UUID]] of avatar whose name is said in local chat or who touches the prim.&lt;br /&gt;
|-&lt;br /&gt;
||[[First Name Letter Prize]]&lt;br /&gt;
||[[User:RaithSphere Whybrow|RaithSphere Whybrow]]&lt;br /&gt;
||Gives a prize if the person who sits on it&#039;s first letter of first name matches the random letter!&lt;br /&gt;
|-&lt;br /&gt;
||[[Fix Small Prims|Fix_Small_Prims]]&lt;br /&gt;
||[[User:Emma Nowhere|Emma Nowhere]]&lt;br /&gt;
||Finds and adjusts the smallest prims in a linkset so that it can be scaled down further.&lt;br /&gt;
|-&lt;br /&gt;
||[[Float2Hex]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Very useful for transporting [[float|floats]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Float Box Contents]]&lt;br /&gt;
||[[User:Rolig Loon|Rolig Loon]]&lt;br /&gt;
||Displays object inventory in hover text, identified by type and updated marquee-style.&lt;br /&gt;
|-&lt;br /&gt;
||[[Follower (script)|Follower]]&lt;br /&gt;
||Unknown, uploaded by [[User:Slik Swindlehurst|Slik Swindlehurst]]&lt;br /&gt;
||Makes an object follow the nearest person. Do not use for [[grief|griefing]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Geometric|Geometric Library]]&lt;br /&gt;
||Community Project&lt;br /&gt;
||A substantial amount of various geometric functions for intersection and other purposes of 3D maths.&lt;br /&gt;
|-&lt;br /&gt;
||[[Get Profile Picture]]&lt;br /&gt;
||[[User:Valentine Foxdale|Valentine Foxdale]]&lt;br /&gt;
||Sets the texture of the object to profile picture of the person that touches ot&lt;br /&gt;
|-&lt;br /&gt;
||[[GetTimestampOffset]]&lt;br /&gt;
||[[User:Siann_Beck|Siann Beck]]&lt;br /&gt;
||Returns [[llGetTimestamp]]() with an hour offset.&lt;br /&gt;
|-&lt;br /&gt;
||[[Give InvItem every n hours]]&lt;br /&gt;
||[[User:Criz Collins|Criz Collins]]&lt;br /&gt;
||Will give an inventory item on touch only every n hours, even if somebody touches the object more than once. &lt;br /&gt;
|-&lt;br /&gt;
||[[Give random object]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Touch to receive a random object in the prim&#039;s inventory&lt;br /&gt;
|-&lt;br /&gt;
||[[Google Charts]]&lt;br /&gt;
||[[User:Dedric Mauriac|Dedric Mauriac]]&lt;br /&gt;
||Create links to display raw data as a chart image.&lt;br /&gt;
|-&lt;br /&gt;
||[[Google_Translator]]&lt;br /&gt;
||[[User:Ugleh Ulrik|Ugleh Ulrik]]&lt;br /&gt;
||Translates spanish to english, and its simple to make it any other way.&lt;br /&gt;
|-&lt;br /&gt;
||[[Go transparent when walking]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||An attachment that goes invisible when you walk and visible when you don&#039;t walk.&lt;br /&gt;
|-&lt;br /&gt;
||[[Group Authorization]]&lt;br /&gt;
||[[User:Chase Quinnell|Chase Quinnell]]&lt;br /&gt;
||Checks to see if object is set to appropriate group (checks by [[Group key finder|group key]])&lt;br /&gt;
|-&lt;br /&gt;
||[[Group Information v1.0]]&lt;br /&gt;
||[[User:Tyrennic Rivera|Tyrennic Rivera]]&lt;br /&gt;
||When clicked the prim will show group information (set on the prim) from the official Second Life Search page.&lt;br /&gt;
|-&lt;br /&gt;
||[[Group key finder]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Touch to find the key of the group&lt;br /&gt;
|-&lt;br /&gt;
||[[Group Privacy]]&lt;br /&gt;
||[[User:Chance Unknown|Chance Unknown]]&lt;br /&gt;
||Security device to insure members of a group can have a private area. Deactivates when nobody present.&lt;br /&gt;
|-&lt;br /&gt;
||[[Hello Avatar]]&lt;br /&gt;
||Linden Lab&lt;br /&gt;
||SL&#039;s default script.&lt;br /&gt;
|-&lt;br /&gt;
||[[Hello Avatar Companion]]&lt;br /&gt;
||[[Chase Quinnell]]&lt;br /&gt;
||Companion to the original [[Hello Avatar]] script&lt;br /&gt;
|-&lt;br /&gt;
||[[Hierarchics]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| Advanced script to create an efficient self-aware hierarchic structure.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Rolig_Loon/High-Capacity_Greeter-Counter|High-Capacity Greeter-Counter]]&lt;br /&gt;
||[[User:Rolig Loon|Rolig Loon]]&lt;br /&gt;
||Uses a memory compression algorithm to store hashed visitor UUID&#039;s in a string instead of using a list. &lt;br /&gt;
|-&lt;br /&gt;
||[[Holodeck]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Home Rezzing System (Open Source).&lt;br /&gt;
|-&lt;br /&gt;
||[[Interpolation|Interpolation Library]]&lt;br /&gt;
||[[User:Nexii_Malthus|Nexii Malthus]]&lt;br /&gt;
||A small set of interpolation functions.&lt;br /&gt;
|-&lt;br /&gt;
||[[Intra-Region Update Server]]&lt;br /&gt;
||[[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
||Centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
|-&lt;br /&gt;
||[[Inventory_Based_Menu]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Inventory Based Menu System.&lt;br /&gt;
|-&lt;br /&gt;
||[[iTunes RPC Email|iTunes RPC]]&lt;br /&gt;
||[[User:Fox Diller|Fox Diller]]&lt;br /&gt;
||iTunes RPC via LSL [[llEmail]] and [[llRemoteDataReply]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Key Pad Door|Keypad Door]]&lt;br /&gt;
||[[User:Tdub Dowler|Tdub Dowler]]&lt;br /&gt;
|| Door and keypad with changeable code. Follow instructions carefully!&lt;br /&gt;
|-&lt;br /&gt;
||[[Last Sound System]]&lt;br /&gt;
||[[User:Babbage Linden|Babbage Linden]]&lt;br /&gt;
||An LSL [http://Last.fm Last.fm] client.&lt;br /&gt;
|-&lt;br /&gt;
||[[LibraryDisplayLandScreenshot]]&lt;br /&gt;
||[[User:Jon Desmoulins|Jon Desmoulins]]&lt;br /&gt;
||A modified version of LibraryDisplayProfilePic using the new [[PARCEL_DETAILS_ID]] Implemented in Server v1.36&lt;br /&gt;
|-&lt;br /&gt;
||[[Linkset resizer]]&lt;br /&gt;
||[[User:Maestro Linden|Maestro Linden]]&lt;br /&gt;
||Systematically rescales a linkset by moving and resizing each prim (by using [[llGetLinkPrimitiveParams]] and [[llSetLinkPrimitiveParamsFast]])&lt;br /&gt;
|-&lt;br /&gt;
||[[Linkset resizer with menu]]&lt;br /&gt;
||[[User:Brilliant Scientist|Brilliant Scientist]]&lt;br /&gt;
||A menu-driven script that rescales a linkset by moving and resizing the prims using [[llGetLinkPrimitiveParams]] and [[llSetLinkPrimitiveParamsFast]] functions. Based on [[Linkset resizer]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Linkset Resizer 2]]&lt;br /&gt;
||[[User:Emma Nowhere|Emma Nowhere]]&lt;br /&gt;
||A more user-friendly resizer script designed for either drop-in use by the end-user or builder or for use in products. Based on [[Fix Small Prims]].&lt;br /&gt;
|-&lt;br /&gt;
||[[List2CSV]]&lt;br /&gt;
||[[User:Kunnis Basiat|Kunnis Basiat]]&lt;br /&gt;
||List2CSV &amp;amp; CSV2List that include preserving type and escaping characters.&lt;br /&gt;
|-&lt;br /&gt;
||[[list_cast]]&lt;br /&gt;
||[[User:Fractured Crystal|Fractured Crystal]]&lt;br /&gt;
||Casts a list of strings into the type they appear to be. Designed for preprocessing user input for feeding into [[llSetPrimitiveParams]]&lt;br /&gt;
|-&lt;br /&gt;
||[[Listener Script]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Use to [[listen]] to other people&#039;s conversations (Like spying)&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#List:_Find_Last_Index|List: Find Last Index]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Returns the last index of searched item in a source list. (backwards version of [[llListFindList]])&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#List:_Multi-Find_Index_.28First_or_Last.29|List: Multi Find]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Returns the first found index of multiple search items in a list. (Multi-item version of [[llListFindList]]. Fwd and Rev versions included)&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#List:_Get_Reverse_Order|List: Reverse]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Returns an input List in reverse order&lt;br /&gt;
|-&lt;br /&gt;
||[[Load URL]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Touch to get a dialog to visit the URL inside the script.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kephra_Nurmi/lsDancemachine|lsDancemachine]]&lt;br /&gt;
||[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
|| Low lag client server dancemachine.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kephra_Nurmi/lsDeejay|lsDeejay Home Edition]] &lt;br /&gt;
||[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
|| Client server media control for music, video, youtube, pictures, and texture animations.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kephra_Nurmi/lsDialog|lsDialog]]&lt;br /&gt;
||[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
|| Universal notecard driven menu dialog system.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kephra_Nurmi/lsDisplay|lsDisplay]]&lt;br /&gt;
||[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
|| Picture cycler with preloader.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kephra_Nurmi/lsDistributor|lsDistributor]]&lt;br /&gt;
||[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
|| Simple &#039;try&#039; and &#039;buy&#039; vendor system.&lt;br /&gt;
|-&lt;br /&gt;
||[[LSL_languageAPI]]&lt;br /&gt;
||[[User:Gypsy paz|Gypsy Paz]]&lt;br /&gt;
||Multi-lingual API from notecard based language files&lt;br /&gt;
|-&lt;br /&gt;
||[[Mandelbrot Explorer]]&lt;br /&gt;
||[[User:Babbage Linden|Babbage Linden]]&lt;br /&gt;
||An interactive fractal explorer.&lt;br /&gt;
|-&lt;br /&gt;
||[[Merge Sort]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Implements a Merge Sort in LSL, however this code is 300(ish) times slower than [[llListSort]]. Don&#039;t use this in a script!&lt;br /&gt;
|-&lt;br /&gt;
||[[Minesweeper]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A simple minesweeper game.&lt;br /&gt;
|-&lt;br /&gt;
||[[Morse Code]]&lt;br /&gt;
||{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
||A script that allows for the conversion to and from morse code and can &amp;quot;play&amp;quot; morse code.&lt;br /&gt;
|-&lt;br /&gt;
||[[Multi Item Rezzer|Multi Item Rezzer]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||A rework of my old High Altitude Rezzer. Place the objects that you wish to choose from to be rezzed inside. Sit on the rezzer and pick the item and the height. It will go to target height and rez the object.&lt;br /&gt;
|-&lt;br /&gt;
||[[Multirezzer|Multirezzer (on collision)]]&lt;br /&gt;
||[[User:Beet Streeter|Beet Streeter]]&lt;br /&gt;
||Spawns up to 10 objects when the object containing the script collides with a user.&lt;br /&gt;
|-&lt;br /&gt;
||[[Name2Key in LSL]]&lt;br /&gt;
||[[User:Maeva Anatine|Maeva Anatine]]&lt;br /&gt;
||Get the Name2Key feature inside your scripts. Works even on lastly subscribed avatars.&lt;br /&gt;
|-&lt;br /&gt;
||[[No Auto-Return]]&lt;br /&gt;
||[[User:Bellla Clarity|Bella Clarity]]&lt;br /&gt;
||To stop your long and hard builds from getting returned in sandboxes (&#039;&#039;only single prims, though!&#039;&#039;).&lt;br /&gt;
|-&lt;br /&gt;
||[[No Auto-Return NR]]&lt;br /&gt;
||[[User:Jor3l Boa|Jor3l Boa]]&lt;br /&gt;
||This really works (29-05-09), needs a nearby region to do the trick and avoid auto return. (Tested on Blue and Rausch)&lt;br /&gt;
|-&lt;br /&gt;
||[[No Auto-Return (Multi)]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A revision of Bella&#039;s that works for multi-prim objects.&lt;br /&gt;
|-&lt;br /&gt;
||[[No Limit Teleporter]]&lt;br /&gt;
||[[User:Morgam Biedermann|Morgam Biedermann]]&lt;br /&gt;
||Teleport to infinite altitudes (up to 4096m)&lt;br /&gt;
|-&lt;br /&gt;
||[[Object Size]]&lt;br /&gt;
||[[User:Chase Quinnell|Chase Quinnell]]&lt;br /&gt;
||Gets the dimensions and footprint of a linkset&lt;br /&gt;
|-&lt;br /&gt;
||[[Object to Data v1.3|Object to Data]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Turns an object into text (and back). Allows people to transfer objects through notecards (or otherwise).&lt;br /&gt;
|-&lt;br /&gt;
||[[Online Indicator|Online Indicator]]&lt;br /&gt;
||[[User:Kristy Fanshaw|Kristy Fanshaw]]&lt;br /&gt;
||Will show if the user is online or not. Displays users profile picture and allows to send IM&#039;s to user. Also gives a link to open the users profile&lt;br /&gt;
|-&lt;br /&gt;
||[[Open Group Join]]&lt;br /&gt;
||[[User:Alicia Stella|Alicia Stella]]&lt;br /&gt;
||User Touches Object to Join Group from Group Info window, (no bot.)&lt;br /&gt;
|-&lt;br /&gt;
||[[Open Zyngo Skin Installer]]&lt;br /&gt;
||[[User:Tmzasz Luminos|Tmzasz Luminos]]&lt;br /&gt;
||A Simple Script designed to install skins on the popular Skill machines.&lt;br /&gt;
|-&lt;br /&gt;
||[[One Script, many doors]]&lt;br /&gt;
||[[User:Kyrah Abattoir|Kyrah Abattoir]]&lt;br /&gt;
||Door script able to manage more than 50 linked doors from a single script instance.&lt;br /&gt;
|-&lt;br /&gt;
||[[ParseString2List]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Same as [[llParseString2List]] and [[llParseStringKeepNulls]], but not limited to 8 spacers or separators. Thus substitute a call to the [[llParseString2List]] and [[llParseStringKeepNulls]] functions by a call to [[Parse_String_To_List|ParseString2List]] whenever you have more than 8 separators or more than 8 spacers.&lt;br /&gt;
|-&lt;br /&gt;
||[[Password Generator]]&lt;br /&gt;
||[[User:Syntrax Canucci|Syntrax Canucci]]&lt;br /&gt;
||This is an over-complicated, semi-complex password generator, which goes through multiple steps.&lt;br /&gt;
|-&lt;br /&gt;
||[[Pathfinder]]&lt;br /&gt;
||[[User:Babbage Linden|Babbage Linden]]&lt;br /&gt;
||A potential field based pathfinding library.&lt;br /&gt;
|-&lt;br /&gt;
||[[Phantom Child]]&lt;br /&gt;
||[[User:Aeron Kohime|Aeron Kohime]]&lt;br /&gt;
||Causes a child in a link set to become phantom without the entire object becoming phantom.&lt;br /&gt;
|-&lt;br /&gt;
||[[PhysicsLib]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| Interesting set of fun physics functions.&lt;br /&gt;
|-&lt;br /&gt;
||[[Play and Loop Sound]]&lt;br /&gt;
||[[User:Bellla Clarity|Bella Clarity]]&lt;br /&gt;
||Very short and simple script; plays and loops a sound in an object.&lt;br /&gt;
|-&lt;br /&gt;
||[[Posing stand|Posing Stand]]&lt;br /&gt;
||[[User:Bellla Clarity|Bella Clarity]]&lt;br /&gt;
||Just a pose script to edit [[attachments]] more easily.&lt;br /&gt;
|-&lt;br /&gt;
||[[PosJump]]&lt;br /&gt;
||[[User:Uchi Desmoulins|Uchi Desmoulins]]&lt;br /&gt;
||A much more efficient alternative to the popular [[warpPos]] function for bypassing 10m distance-moved limitations.&lt;br /&gt;
|-&lt;br /&gt;
||[[Prefix Calculator]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
|| A calculator that evaluates expressions in prefix notation. &lt;br /&gt;
&amp;lt;code&amp;gt;+ 3 4 = 5. * + 1 2 + 3 4 = 14.&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||[[Progress Bar]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| Flexible and powerful little function for creating progress bars useful in hovertext.&lt;br /&gt;
|-&lt;br /&gt;
||[[Pseudo-random Number Generator]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Generates a Pseudo-random number between -0x7FFFFFFF and 0x7FFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Rolig_Loon/Quiz_From_Notecard|Quiz From Notecard]]&lt;br /&gt;
||[[User:Rolig Loon|Rolig Loon]]&lt;br /&gt;
||A multiple-choice testing script that reads questions and answer choices from a notecard and presents them in dialog boxes.&lt;br /&gt;
|-&lt;br /&gt;
||[[Rainbow_palette]]&lt;br /&gt;
||[[User:Rui Clary|Rui Clary]]&lt;br /&gt;
||Build a color picker, using only one prim, and a few lines of code.&lt;br /&gt;
|-&lt;br /&gt;
||[[Random AV Profile Projector]]&lt;br /&gt;
||[[User:Debbie Trilling|Debbie Trilling]]&lt;br /&gt;
||Randomly selects an AV from a crowd &amp;amp; then projects their profile picture as a &#039;holographic&#039; image &lt;br /&gt;
|-&lt;br /&gt;
||[[Random Object Vendor]]&lt;br /&gt;
||[[User:CodeBastard Redgrave|CodeBastard Redgrave]]&lt;br /&gt;
||Simple vendor that gives out random objects when paid the right amount &lt;br /&gt;
|-&lt;br /&gt;
||[[Random Password Generator]]&lt;br /&gt;
||[[User:Jor3l Boa|Jor3l Boa]]&lt;br /&gt;
||Generate Random passwords based on String Length.&lt;br /&gt;
|-&lt;br /&gt;
||[[RavText]]&lt;br /&gt;
||[[User:Ravenous Dingo|Ravenous Dingo]]&lt;br /&gt;
||An alternate to XyText.  This is a lightweight, multiple font 10 character text display system.  It only supports uppercase alphanumeric text and a few special characters, but it is very fast, renders quickly and supports multiple fonts. It is meant for specialized use when all that is desired is basic, fast text display and the extra &amp;quot;bells and whistles&amp;quot; are not needed.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:PixelProphet Lane/Scripts#Real Object Inventory To Dialog|Real Object Inventory To Dialog]]&lt;br /&gt;
||[[User:PixelProphet Lane|PixelProphet Lane]]&lt;br /&gt;
||Display any amount of items contained in an Object in a Dialog, regardless of item name length.&lt;br /&gt;
|-&lt;br /&gt;
||[[RentalBoxv1|Rental Box, Simply]]&lt;br /&gt;
||[[User:Sendao Goodman|Sendao Goodman]]&lt;br /&gt;
||Simple explanation of how to make rental boxes.&lt;br /&gt;
|-&lt;br /&gt;
||[[Rental Cube]]&lt;br /&gt;
||[[User:Hank Ramos|Hank Ramos]]&lt;br /&gt;
||Simple cube for renting out a space.&lt;br /&gt;
|-&lt;br /&gt;
||[[Remote Texture Loader]]&lt;br /&gt;
||{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
||A set of scripts for remotely loading textures within a sim. This means that a single &amp;quot;texture server&amp;quot; can manage multiple changing billboards within a sim.&lt;br /&gt;
|-&lt;br /&gt;
||[[Say Region Frames Per Second|Region Frames Per Second]]&lt;br /&gt;
||[[User:Heymeriou Mystakidou|Heymariou Mystakidou]]&lt;br /&gt;
|| Says the region name and frames per second out loud on command.&lt;br /&gt;
|-&lt;br /&gt;
||[[sbDialog]]&lt;br /&gt;
||[[User:Siann_Beck|Siann Beck]]&lt;br /&gt;
||A simple replacement function for [[llDialog]]. It re-orders the button list so that the button values, as passed to it, display left-to-right, top-to-bottom. It also opens a [[llListen|listen]] on the specified channel, and returns the handle.&lt;br /&gt;
|-&lt;br /&gt;
||[[Scheduler]]&lt;br /&gt;
||[[User:Haravikk Mistral|Haravikk Mistral]]&lt;br /&gt;
||Schedule multiple events using a single script timer&lt;br /&gt;
|-&lt;br /&gt;
||[[Scheme_Interpreter|Scheme Interpreter]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A scheme interpreter capable of handling most scheme expressions, including lambda and lists.&lt;br /&gt;
|-&lt;br /&gt;
||[[Script Override Functions]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||bypass default strings, integer etc in chat channel.&lt;br /&gt;
|-&lt;br /&gt;
||[[Scripted Attachment Detector.lsl|Scripted Attachment Detector]]&lt;br /&gt;
||{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
||A script that will display avatars wearing scripted attatchments in hovertext. This may be worn as an hud or rezzed. &lt;br /&gt;
|-&lt;br /&gt;
||[[Self Upgrading Script Enhanced]]&lt;br /&gt;
||[[User:Cron Stardust|Cron Stardust]]&lt;br /&gt;
||Keeps only latest version of the script on prim (even with multiple adds of the same script!)&lt;br /&gt;
|-&lt;br /&gt;
||[[Sensor Visualizer]]&lt;br /&gt;
||[[User:Cerise Sorbet|Cerise Sorbet]]&lt;br /&gt;
||Shows the size and shape you get with [[llSensor]] range and arc parameters&lt;br /&gt;
|-&lt;br /&gt;
||[[Serverless Key Exchange]]&lt;br /&gt;
||[[User:Sendao Goodman|Sendao Goodman]]&lt;br /&gt;
||Maintains a network of object keys without using an external server.&lt;br /&gt;
|-&lt;br /&gt;
||[[SHA1|SHA1 Hash]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Preforms a SHA1 Hash on an input text. Similar to MD5 only (slightly) more secure. &lt;br /&gt;
|-&lt;br /&gt;
||[[Sim Map Particle Projector]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||Displays a floating map of the sim the script is in.&lt;br /&gt;
|-&lt;br /&gt;
||[[Sim Restart Logger]]&lt;br /&gt;
||[[User:Kyrah Abattoir|Kyrah Abattoir]]&lt;br /&gt;
||Counts region restarts and displays log of last 9 restarts together with region FPS and dilation. &lt;br /&gt;
|-&lt;br /&gt;
||[[Simple Elevator in a Box]]&lt;br /&gt;
||[[User:Hank Ramos|Hank Ramos]]&lt;br /&gt;
||Simple elevator example.&lt;br /&gt;
|-&lt;br /&gt;
||[[Skillingo AntiHack Script]]&lt;br /&gt;
||[[User:Tmzasz Luminos|Tmzasz Luminos]]&lt;br /&gt;
||A simple Protection script for skillingo thats modifyable to work with other machines.&lt;br /&gt;
|-&lt;br /&gt;
||[[Skunk Money]]&lt;br /&gt;
||[[User:Hank Ramos|Hank Ramos]]&lt;br /&gt;
||Fun gambling machine of yesteryear, which only supports freeplay now due to SL regulations against gambling. &lt;br /&gt;
|-&lt;br /&gt;
||[[SLateIt]]&lt;br /&gt;
||[[User:Babbage Linden|Babbage Linden]]&lt;br /&gt;
||An augmented virtual reality HUD.&lt;br /&gt;
|-&lt;br /&gt;
||[[SLetanque]]&lt;br /&gt;
||[[User:Babbage Linden|Babbage Linden]]&lt;br /&gt;
||An LSL petanque game.&lt;br /&gt;
|-&lt;br /&gt;
||[[SLURL HUD]]&lt;br /&gt;
||[[User:CodeBastard Redgrave|CodeBastard Redgrave]]&lt;br /&gt;
||Touch this HUD to get a SLURL through IM, email and floating text.&lt;br /&gt;
|-&lt;br /&gt;
||[[SL Mail V1.2]]&lt;br /&gt;
||[[User:Flennan Roffo|Flennan Roffo]]&lt;br /&gt;
||Second Life mail client V1.2 (released sept&#039;07). Send and receive mail from within Second Life from and to any address. With Address Book function and many chat commands. V1.3 is upcoming soon! &lt;br /&gt;
|-&lt;br /&gt;
||[[SL_NTPoHTTP_v1.1_client|SL NTPoHTTP client]]&lt;br /&gt;
|[[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
||Second Life Needs Time Parsing over Hyper Text Transfer Protocol&lt;br /&gt;
Emulates the function of [[llGetWallclock]] for any timezone by using SLOpenID&#039;s SLNTPoHTTP service. Also supports ISO 8601 and RFC 2822 timestamps. Script is dependent upon an external service operated by the author!&lt;br /&gt;
|-&lt;br /&gt;
||[[Smooth Rotating Door]]&lt;br /&gt;
|[[User:Toy Wylie|Toy Wylie]]&lt;br /&gt;
||A script for doors that open and close smoothly using llTargetOmega&lt;br /&gt;
|-&lt;br /&gt;
||[[Smooth Sliding Door]]&lt;br /&gt;
|[[User:SimonT Quinnell|SimonT Quinnell]]&lt;br /&gt;
||A script for sliding doors that open and close smoothly using [[llMoveToTarget]]. Asjusts for prim orientation.&lt;br /&gt;
|-&lt;br /&gt;
||[[Speed Tester]]&lt;br /&gt;
||{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
||Similar to the [[Efficiency Tester]], this script allows you to test the speed of a particular function or snippet with multiple trials giving min/max/avg/median and the standard deviation.&lt;br /&gt;
|-&lt;br /&gt;
||[[Spiral Staircase Generator]]&lt;br /&gt;
|[[User:Meyermagic Salome|Meyermagic Salome]]&lt;br /&gt;
||Generates nice looking spiral staircases without much hassle.&lt;br /&gt;
|-&lt;br /&gt;
||[[Static URL&#039;s for HTTP-In Service|Static_URLs]]&lt;br /&gt;
||[[User:Jor3l Boa|Jor3l Boa]]&lt;br /&gt;
||How to generate a static url for HTTP-In temporal limitations.&lt;br /&gt;
|-&lt;br /&gt;
||[[String Compare]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Compares two strings and reliably returns either 1, -1, or 0 if they are the same.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#String:_Find_Last_Index|String: Reverse]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Returns an input string in reverse order&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#String:_Get_Reverse_Order|String: Last Index]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Returns the last index of search found in string (the backward equivalent of [[llSubStringIndex]])&lt;br /&gt;
|-&lt;br /&gt;
||[[Teleport HUD]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||WORKS TO 4096 METERS!! Very user friendly teleport HUD. Add destinations by touching &amp;quot;Add&amp;quot; &amp;amp; naming destination in chat. Automatically gets sim name and coordinates. Will only display the destinations in the sim you are currently in. Demonstrates more advanced list manipulation and stride functions.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Programs#v7-D_Enh._Landmark-2-Map|Teleporter (landmark based)]]&lt;br /&gt;
||[[User:Void_Singer|Void_Singer]]&lt;br /&gt;
||Uses Landmarks to offer map teleports. Works as Hud or inworld objects, just drop in landmarks and go.&lt;br /&gt;
|-&lt;br /&gt;
||[[Text_Scroller|Text Scroller]]&lt;br /&gt;
||[[User:Fred_Gandt|Fred Gandt]]&lt;br /&gt;
||A simple text display object that scrolls text (applied as a texture) from right to left (like &#039;&#039;those&#039;&#039; LED signs) in a continuous loop.&lt;br /&gt;
|-&lt;br /&gt;
||[[Bobbyb&#039;s texture changer|Texture Changers]]&lt;br /&gt;
||{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
||A collection of texture changing scripts.&lt;br /&gt;
|-&lt;br /&gt;
||[[Texture Menu Management|Texture Management]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Dialog Menu based Texture Selection.&lt;br /&gt;
|-&lt;br /&gt;
||[[Tic Tac Toe]]&lt;br /&gt;
||[[User:CG Linden|CG Linden]]&lt;br /&gt;
||Step by step demo on how to implement a larger scripting project&lt;br /&gt;
|-&lt;br /&gt;
||[[TightList]]&lt;br /&gt;
||[[User:Strife Onizuka|Revolution Perenti]]&lt;br /&gt;
||Tight List is a family of functions for encoding lists as strings and then decoding them back into lists.&lt;br /&gt;
There are two flavors: TightList and TightListType. TightListType preserves types and uses a 6 char header, while TightList uses a 1 char header that doesn&#039;t preserve type. &lt;br /&gt;
|-&lt;br /&gt;
||[[Timer Module]]&lt;br /&gt;
||[[User:Isabelle Aquitaine|Isabelle Aquitaine]]&lt;br /&gt;
||Manage multiple timers via linked messages.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#Unix_time_code_to_list_format|Timestamp:&amp;lt;br&amp;gt;Unix time code to list format]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||converts Unix timestamps to their [Y, M, D, h, m, s] equivalents (ex: 1234567890 to [2009, 2, 13, 3, 31, 30])&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#List_format_to_Unix_time_code.|Timestamp:&amp;lt;br&amp;gt;List format to Unix time code]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||converts [Y, M, D, h, m, s] timestamps to their Unix equivalents (ex: [2009, 2, 13, 3, 31, 30] to 1234567890)&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#Weekday_from_Unix_timestamp|Timestamp:&amp;lt;br&amp;gt;Weekday from Unix timestamp]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Gets weekday from Unix timestamps (ex: &amp;quot;Friday&amp;quot; from 1234567890)&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#Weekday_from_.28_Y.2C_M.2C_D_.29_format|Timestamp:&amp;lt;br&amp;gt;Weekday from (Y, M, D) format]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Gets weekday from (Y, M, D) timestamps (ex: &amp;quot;Friday&amp;quot; from (2009, 2, 13))&lt;br /&gt;
|-&lt;br /&gt;
||[[Touch A Quote]]&lt;br /&gt;
||[[User:CodeBastard Redgrave|CodeBastard Redgrave]]&lt;br /&gt;
||Touch an object to read quotes sequentially from a notecard&lt;br /&gt;
|-&lt;br /&gt;
||[[Touring Balloon]]&lt;br /&gt;
||[[User:Hank Ramos|Hank Ramos]]&lt;br /&gt;
||Automated touring balloon with many options from long ago.  Always seems to work on one SL release, and not the other.&lt;br /&gt;
|-&lt;br /&gt;
||[[Under Age Boot]]&lt;br /&gt;
|[[User:Chance Unknown|Chance Unknown]]&lt;br /&gt;
||Security device example to teleport home accounts below a minimum age limit; can be useful in combating free griefer accounts.&lt;br /&gt;
|-&lt;br /&gt;
||[[Universal Translator]]&lt;br /&gt;
|[[User:Hank Ramos|Hank Ramos]]&lt;br /&gt;
||Chat listener that handles seamless translation of public chat between 50+ written languages without the need for configuration.  Handles numerous avatars, auto-detects languages, and works together with multiple copies of translators to spread-workload using a sophisticated back-end communications sub-system.&lt;br /&gt;
|-&lt;br /&gt;
||[[Unix2DateTime]]&lt;br /&gt;
|[[User:Flennan Roffo|Flennan Roffo]]&lt;br /&gt;
||Conversion from Unix time ([[llGetUnixTime]]()) to date and time string and vice versa.&lt;br /&gt;
|-&lt;br /&gt;
||[[Unmutable Descript Nagger]]&lt;br /&gt;
|[[User:Bobbyb30 Zohari|Bobbyb30 Zohari]]&lt;br /&gt;
||To nag avatars to take off their scripted attatchments.&lt;br /&gt;
|-&lt;br /&gt;
||[[UUID2Channel]]&lt;br /&gt;
||[[User:Project Neox|Project Neox]]&lt;br /&gt;
||Optimised version of the original key2channel generators.&lt;br /&gt;
|-&lt;br /&gt;
||[[UUID Song Generator]]&lt;br /&gt;
||{{User|Sendao Goodman}}&lt;br /&gt;
||Translates a UUID into a simple song and plays it.&lt;br /&gt;
|-&lt;br /&gt;
||[[VirtualID_URLMap|VirtualID URL Mapper for HTTP-in]]&lt;br /&gt;
|[[User:Cenji Neutra|Cenji Neutra]]&lt;br /&gt;
||A script showing how to setup a static URL of the form &amp;lt;your-alias&amp;gt;.obj.virtualid.info which maps to the dynamic HTTP-in URL LSL generates and keeps it up-to-date.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Programs#v7-D_Advanced_Visitor_Greeter|Visitor Greeter]]&lt;br /&gt;
|[[User:Void_Singer|Void_Singer]]&lt;br /&gt;
||Reduced spam visitor greeter, highly configurable, easy to modify.&lt;br /&gt;
|-&lt;br /&gt;
||[[Visitor Logger (Web/Basic) ]]&lt;br /&gt;
|[[User:Buddy Sprocket|Buddy Sprocket]]&lt;br /&gt;
||A very basic visitor logger - log visitors in SL to a text file on your web-site.&lt;br /&gt;
|-&lt;br /&gt;
||[[Vote Simple]]&lt;br /&gt;
|[[User:JB_Kraft|JB Kraft]]&lt;br /&gt;
||Simple vote collector. One avi, one vote.&lt;br /&gt;
|-&lt;br /&gt;
||[[WarpPos]]&lt;br /&gt;
|[[User:Keknehv Psaltery|Keknehv Psaltery]]&lt;br /&gt;
||Non-physical movement without the 10m limit.&lt;br /&gt;
|-&lt;br /&gt;
||[[Wiki3DBuilder]] [[Wiki3DBuilder1.0]]&lt;br /&gt;
||[[User:Salahzar Stenvaag|Salahzar Stenvaag]] &lt;br /&gt;
||Allows a group of people to collectively build up complex 3D mindmaps with connected concepts. Uses particles for connections and low prim usage. Nodes can be textured, colored, changed form size moved collectively by everybody and can distribute notecards, landmarks, URL, objects, textures. I provide two version 0.1 and 1.0 and probably next version will communicate with moodle and sloodle external websites.&lt;br /&gt;
|-&lt;br /&gt;
||[[Window Control]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||For window opacity, helpful for buildings.&lt;br /&gt;
|-&lt;br /&gt;
||[[WHMcs SecondLife plugin]]&lt;br /&gt;
|[[User:Alicia Sautereau|Alicia Sautereau]]&lt;br /&gt;
||Linden Dollar payment plugin for the WHMcs hosting portal.&lt;br /&gt;
|-&lt;br /&gt;
||[[XTEA Strong Encryption Implementation]]&lt;br /&gt;
||[[User:Morse Dillon|Morse Dillon]]&lt;br /&gt;
||An LSL implementation of XTEA (eXtended Tiny Encryption Algorithm).  This is the first known public release of a &#039;real&#039; strong encryption implementation in LSL and is released under the GNU General Public License (GPL).&lt;br /&gt;
|-&lt;br /&gt;
||[[XyText 1.5|XyText]]&lt;br /&gt;
||[[User:Xylor Baysklef|Xylor Baysklef]]&lt;br /&gt;
|| Display text (up to 10 characters) on a prim. Use as many prims as desired.&lt;br /&gt;
|-&lt;br /&gt;
||[[XyyyyzText|XyyyyzText]]&lt;br /&gt;
||[[User:Criz Collins|Criz Collins]]&lt;br /&gt;
|| Display text (up to 10 characters) on a prim. Displays different text for each line instead of one single text, that will be broken into the next lines. Watch here for what that means: http://screencast.com/t/1wMLujLcEO&lt;br /&gt;
|-&lt;br /&gt;
||[[XyzzyText|XyzzyText]]&lt;br /&gt;
||[[User:Thraxis Epsilon|Thraxis Epsilon]] and [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
|| Display text (up to 10 characters) on a prim. Way more efficient than XyText.&lt;br /&gt;
|-&lt;br /&gt;
||[[Youtube TV]]&lt;br /&gt;
||[[User:Morgam Biedermann|Morgam Biedermann]]&lt;br /&gt;
||Watch your favorite Youtube videos / auto set the texture to the parcel media texture.&lt;br /&gt;
|-&lt;br /&gt;
||[[Zero Lag Poseball]]&lt;br /&gt;
||[[User:Jippen Faddoul|Jippen Faddoul]]&lt;br /&gt;
||A simple poseball with no lag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Support Script Library==&lt;br /&gt;
These are scripts in other languages, intended to be run on other systems that support scripts written in LSL&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:Ina Centaur/UUID/calimg.api|Calendar Image UUID API]]&lt;br /&gt;
|| [[User:Ina Centaur|Ina Centaur]]&lt;br /&gt;
|| API that gives the UUID of an image of a calendar image give month and year arguments.&lt;br /&gt;
|-&lt;br /&gt;
||[[HTTP Post request to a PHP server]]&lt;br /&gt;
||[[User:Corto Maltese|Corto Maltese]]&lt;br /&gt;
|| This small library allows you to make simple POST requests to your website. The libraries allow you to get your request through the variable $_POST on the server. It also include a basic security mechanism aimed to stop hacking. Comprises of LSL client script and PHP server script.&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:Ina Centaur/PHP/k2n.php|Key2Name.php]]&lt;br /&gt;
|| [[User:Ina Centaur|Ina Centaur]]&lt;br /&gt;
|| Get Avatar&#039;s Name using Second Life search service. (like in LSL Key2Name)&lt;br /&gt;
|-&lt;br /&gt;
|| [[Lame_Object_DNS_and_Cross_Sim_Messaging|Lame Object DNS and Cross Sim Messaging]]&lt;br /&gt;
|| [[User:Liandra Ceawlin|Liandra Ceawlin]]&lt;br /&gt;
|| Simple, cheeseball method of doing cross-sim communications with http-in and an external object DNS service.&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:SignpostMarv Martin/PHP/llXorBase64StringsCorrect|llXorBase64StringsCorrect]]&lt;br /&gt;
|| [[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
|| An implementation of [[llXorBase64StringsCorrect]] in PHP- should be useful if you&#039;re using llXorBase64StringsCorrect to do cryptography work in LSL2 and posting it out to the web via [[llHTTPRequest]].&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:SignpostMarv Martin/PHP/lsl fu.php|lsl_fu.php]]&lt;br /&gt;
|| [[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
|| A basic OOP&#039;d PHP Class containing VeloxSeverine&#039;s $_POST fixer and Marv&#039;s own eccentric ideas for &amp;quot;fixing&amp;quot; things.&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:Jor3l Boa/PHP/n2k.php|Name2Key.php]]&lt;br /&gt;
|| [[User:Jor3l Boa|Jor3l Boa]]&lt;br /&gt;
|| Get Avatar&#039;s UUID using Second Life search service. (like in LSL Name2Key)&lt;br /&gt;
|-&lt;br /&gt;
|| [[Public_Object_DNS|Public Object DNS]]&lt;br /&gt;
|| [[User:Liandra Ceawlin|Liandra Ceawlin]]&lt;br /&gt;
|| Public object DNS-like system running on GAE, for http-in. Hopefully scalable enough for wide-spread usage.&lt;br /&gt;
|-&lt;br /&gt;
|| Silo&lt;br /&gt;
|| [[User:Zero_Linden|Zero Linden]]&lt;br /&gt;
|| General purpose data store in PHP.  Use this to persist arbitrary data from LSL via [[llHTTPRequest]].  See:&lt;br /&gt;
* [http://www.notabene-sl.com/misc/silo-README.txt README] file&lt;br /&gt;
* [http://www.notabene-sl.com/misc/silo.tgz silo.tgz] tarball&lt;br /&gt;
* forum post [http://forums-archive.secondlife.com/54/69/119570/1.html Announcement].&lt;br /&gt;
|-&lt;br /&gt;
||[[Silverday ObjectDNS]]&lt;br /&gt;
||[[User:Till Stirling|Till Stirling]]&lt;br /&gt;
||Dynamic Object-DNS-System to provide dynamic mapping of LSL-URLs to persistent domains. Features include redirect service, password protected domains, write protected domains, LSL-API for all necessary functions, optional web-interface.&lt;br /&gt;
|-&lt;br /&gt;
|| [http://aubretec.com/products/sldb SLDB]&lt;br /&gt;
|| [[User:Luc Aubret|Luc Aubret]]&lt;br /&gt;
|| Flexible web database storage using PHP/MySQL.  Used to store per-user field/value pairs from in-world objects using [[llHTTPRequest]]. &lt;br /&gt;
* [http://aubretec.com/support/manuals/sldbkit/ Implementation Guide]&lt;br /&gt;
* [http://aubretec.com/wp-content/uploads/2009/05/sldb.zip Download] (.zip, 12kb)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Articles&#039;&#039;&#039;&lt;br /&gt;
*[[:Category:LSL Examples| Examples]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=933833</id>
		<title>Category:LSL Library</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=933833"/>
		<updated>2010-06-01T16:27:09Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* LSL Script Library */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}{{RightToc}}&lt;br /&gt;
==Script Library==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em 0.5em 1.5em&amp;quot;&amp;gt;&lt;br /&gt;
Come to this page to see complex examples that show how to combine parts of LSL.&lt;br /&gt;
&lt;br /&gt;
Go to the [[:Category:LSL Examples|LSL Examples]] page to see brief examples of how to use parts of LSL &lt;br /&gt;
&lt;br /&gt;
Why collect complex examples here? Well, ...&lt;br /&gt;
&lt;br /&gt;
There are many [[script|scripts]] that have become buried in the [http://forums-archive.secondlife.com/15/1.html Scripting Library archive] or the newer [https://blogs.secondlife.com/community/forums/scripting_library?view=discussions Scripting Library forum], were lost with the death of the early scripting forums, or sit idle in [[inventory|inventories]] that could be useful and should be more accessible.&lt;br /&gt;
&lt;br /&gt;
Other scripters may be in the same situation. This wiki is a well-suited medium for a script library. Feel free to add your scripts to the script library by creating new pages for them and linking to those pages here.&lt;br /&gt;
&lt;br /&gt;
Note that there are many more scripts in the LSL Library here, but you can&#039;t get to them if you don&#039;t know they exist, because they are subpages now, instead of an automatically updated category.  Good luck searching.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules for posting: ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
#Your script must be tested and working. If it&#039;s not, stick it in your user-space until it is. This is a list of working, usable scripts.&lt;br /&gt;
#Add a link to your script&#039;s page here. Link back to this page from your script&#039;s page. Start your page with &amp;lt;nowiki&amp;gt;{{LSL Header}}&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
#Do not add scripts that duplicate the same functionality as an existing script or built in {{LSLGC|Functions|function}}. If yours does, explain why.&lt;br /&gt;
#Do not list simple scripts here. Include those among the [[:Category:LSL Examples|LSL Examples]] instead.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
==LSL Script Library==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||[[1st necessity of SL]]&lt;br /&gt;
||[[User:Beer Dailey|Beer Dailey]]&lt;br /&gt;
||Monitors for avatars and (de)activates scripts states to control script performance/lag.&lt;br /&gt;
|-&lt;br /&gt;
||[[3D Radar]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||Rezzes a ball for each avatar in range. Each ball tracks its own AV and displays distance.&lt;br /&gt;
|-&lt;br /&gt;
||[[Aim Detection]]&lt;br /&gt;
||[[User:Han Shuffle|Han Shuffle]]&lt;br /&gt;
||Monitors for avatars and reports back to owner about who is aiming at them.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kireji_Haiku/A_more_complex_freebie-giver_(setup_with_notecard)|A more complex freebie-giver (setup with notecard)]]&lt;br /&gt;
||&#039;&#039;&#039;[[User:Kireji Haiku|Kireji Haiku]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Kireji Haiku|talk]]|[[Special:Contributions/Kireji Haiku|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt;&lt;br /&gt;
||A freebie giver which gives up to nine different lists of its inventory items and gives the ability to send an eMail as feedback to the owner (or the owners!). Complete setup with notecard support and ability to resctrict to group. Including parts of [[llList2CSV]], [[AdvancedNotecardReader]], [[llUnSit]], [[llSameGroup]], [[llParticleSystem]] and last but not least the three main functions [[llEmail]], [[llGiveInventoryList]] and [[llDialog]].&lt;br /&gt;
|-&lt;br /&gt;
||[[AntiDelay Node]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Uses [[llMessageLinked]] to stop those pesky delays.&lt;br /&gt;
|-&lt;br /&gt;
||[[AO Overriding Pose Ball]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||No more turning your AO off and on when you sit down&lt;br /&gt;
|-&lt;br /&gt;
||[[ARCFOUR Strong Encryption Implementation]]&lt;br /&gt;
||[[User:Nekow42 Zarf|Nekow42 Zarf]]&lt;br /&gt;
||An LSL implementation of ARCFOUR, the most popular stream cipher still in use. It is licensed under a Creative Commons Attribution 3.0 license.&lt;br /&gt;
|-&lt;br /&gt;
||[[Assembly Programming Language|Assembly-Like Programming Language]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A compiler that runs assembly-like programs.&lt;br /&gt;
|-&lt;br /&gt;
||[[Associative Array Emulator|Associative Array (Dictionary) Emulator]]&lt;br /&gt;
||[[User:Alynna Vixen|Alynna Vixen]]&lt;br /&gt;
||This library provides a set of functions for using a list as an associative array where string based keys can refer to one or more variant elements.&lt;br /&gt;
|-&lt;br /&gt;
||[[AvatarFollower]]&lt;br /&gt;
||[[User:Dale Innis|Dale Innis]]&lt;br /&gt;
||Allows one avatar to automatically follow another.&lt;br /&gt;
|-&lt;br /&gt;
||[[Base2Dec]]&lt;br /&gt;
||[[User:Siann Beck|Siann Beck]]&lt;br /&gt;
||Convert a number to decimal from any base.&lt;br /&gt;
|-&lt;br /&gt;
||[[Basic A-Star Pathfinder]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| My own interpretation of A Star into a highly efficient algorithmn&lt;br /&gt;
|-&lt;br /&gt;
||[[Basic Encryption Modules]]&lt;br /&gt;
||[[User:Beverly Larkin|Beverly Larkin]]&lt;br /&gt;
||Basic encryption scripts, allows you to encrypt a float and shout it to another prim on a randomly chosen channel.&lt;br /&gt;
|-&lt;br /&gt;
||[[Be happy]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Basic smile attachment script, makes your avatar smile.&lt;br /&gt;
|-&lt;br /&gt;
||[[Best Neighbor Ad Hiding Script|Best Neighbor]]&lt;br /&gt;
||[[User:Doran Zemlja|Doran Zemlja]]&lt;br /&gt;
||Reduce ad clutter by hiding ads when users are on their own land nearby.&lt;br /&gt;
|-&lt;br /&gt;
||[[BigNum|BigNum Library (RSA Encryption)]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A BigNum Library for dealing with big numbers! Specialized for modular multiplication, and RSA encryption.&lt;br /&gt;
|-&lt;br /&gt;
||[[Binary Clock v1.1|Binary Clock]]&lt;br /&gt;
||[[User:Fox Diller|Fox Diller]]&lt;br /&gt;
||A Binary Clock.&lt;br /&gt;
|-&lt;br /&gt;
||[[BinaryDecimalConverter]]&lt;br /&gt;
||[[User:Soundless Smalls|Soundless Smalls]]&lt;br /&gt;
||Converts a binary value to a decimal value and vice versa.&lt;br /&gt;
|-&lt;br /&gt;
||[[Blacklist and Remote Kill|Blacklist and Remote Kill]]&lt;br /&gt;
||[[User:Chase Quinnell|Chase Quinnell]]&lt;br /&gt;
||Blacklist(denial of use) or a creator kill script(can delete someone&#039;s item by command on private channel)&lt;br /&gt;
|-&lt;br /&gt;
||[[User_talk:Rolig_Loon/Bookmark_URLs|Bookmark URLs]]&lt;br /&gt;
||[[User:Rolig Loon|Rolig Loon]]&lt;br /&gt;
||Dialog driven HUD reads bookmarked URLs from notecards and navigates directly to them with user&#039;s in-world browser.&lt;br /&gt;
|-&lt;br /&gt;
||[[Builders Buddy|Builder&#039;s Buddy Tool]]&lt;br /&gt;
||[[User:Newfie Pendragon|Newfie Pendragon]]&lt;br /&gt;
||Script to easily move/rotate large builds that exceed the linkable size limit (30 meters).&lt;br /&gt;
|-&lt;br /&gt;
||[[Button Click Detector]]&lt;br /&gt;
||{{User|Sendao Goodman}}&lt;br /&gt;
||Use [[llDetectedTouchUV]] to determine which button was pressed on a texture.&lt;br /&gt;
|-&lt;br /&gt;
||[[Camera Sync]]&lt;br /&gt;
||[[User:Meyermagic Salome|Meyermagic Salome]] and [[User:Nomad Padar|Nomad Padar]]&lt;br /&gt;
||A system to synchronize the cameras of two avatars.&lt;br /&gt;
|-&lt;br /&gt;
||[[Chatbot]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Compile and run the LSL you type on a channel, faster than you can thru the 2007-08 SL GUI.&lt;br /&gt;
|-&lt;br /&gt;
||[[Chat Logger (GPL)]]&lt;br /&gt;
||[[User:Nobody Fugazi|Nobody Fugazi]]&lt;br /&gt;
||Chat logger which requests permission from participants before recording them.&lt;br /&gt;
|-&lt;br /&gt;
||[[Chat_Relay|Chat Relay]]&lt;br /&gt;
||[[User:grumble Loudon|grumble Loudon]]&lt;br /&gt;
||A Chat relay which can be routed using a path header and won&#039;t echo.&lt;br /&gt;
|-&lt;br /&gt;
||[[ClickAndDrag]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| Click and Drag user interface elements using dynamic feedback&lt;br /&gt;
|-&lt;br /&gt;
||[[Code Racer]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Race two versions of code forever, to see which runs faster.&lt;br /&gt;
|-&lt;br /&gt;
||[[Code Sizer]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Count the bytes compiled from source code, to measure how to write small code.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Programs#v7-D_Enh._Color_Picker|Color Changer]]&lt;br /&gt;
||[[User:Void_Singer|Void_Singer]]&lt;br /&gt;
||Dialog driven color changer. Supports 16million+ colors, web color codes, multiple targeted prims, with save and recall.&lt;br /&gt;
|-&lt;br /&gt;
||[[Color Changer|Color Changer Plus]]&lt;br /&gt;
||[[User:Neo Calcutt|Neo Calcutt]]&lt;br /&gt;
||A color changer with 14 colors, a random function, and a custom vector function.&lt;br /&gt;
|-&lt;br /&gt;
||[[Color conversion scripts|Color Conversion]]&lt;br /&gt;
||[[User:Sally LaSalle|Sally LaSalle]]&lt;br /&gt;
||Convert between Red Green Blue (RGB) and Hue Saturation Value (HSV).&lt;br /&gt;
|-&lt;br /&gt;
||[[ColorConvert]]&lt;br /&gt;
||[[User:Siann Beck|Siann Beck]]&lt;br /&gt;
||Convert color values to vector from RGB, hex or HTML color name.&lt;br /&gt;
|-&lt;br /&gt;
||[[Color script]]&lt;br /&gt;
||[[User:Masakazu Kojima|Masakazu Kojima]]&lt;br /&gt;
||Script for changing colors trough a listener with pre-defined colors.&lt;br /&gt;
|-&lt;br /&gt;
||[[Library Combined Library|Combined Library]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Library of mostly encoding and decoding functions, some more useful then others.&lt;br /&gt;
* String functions: Replace / Trim right / Trim left / Trim both&lt;br /&gt;
* Unicode conversion: UTF8 to Unicode / Unicode to UTF8&lt;br /&gt;
* List functions: Replace / Compare&lt;br /&gt;
|-&lt;br /&gt;
||[[Computer:jaycoonlanguage]]&lt;br /&gt;
||[[User:jayco121 Bing|jayco121 Bing]]&lt;br /&gt;
|| A language written in LSL that is meant for my computer (available at the shop).&lt;br /&gt;
|-&lt;br /&gt;
||[[Read Note Card Configuration|Configuration Notecard Reader]]&lt;br /&gt;
||{{User|Dedric Mauriac}}&lt;br /&gt;
||A script to read configuration information from a notecard. Parses notecard to extract key words and their assigned values. Allows for comment lines and many more useful features.&lt;br /&gt;
|-&lt;br /&gt;
||[[AdvancedNotecardReader|Configuration Notecard Reader (advanced)]]&lt;br /&gt;
||[[Lear Cale|Lear Cale]]&lt;br /&gt;
||Robust configuration notecard reader; supports multiple notecards with same suffix, handles reconfig on inventory change, and does not usurp the default state.&lt;br /&gt;
|-&lt;br /&gt;
||[[Library_Chat_Relay|Conversation Relay]]&lt;br /&gt;
||[[User:Jippen Faddoul|Jippen Faddoul]]&lt;br /&gt;
||Chat relay which requests permission from participants before relaying their messages. Also includes their attachments. (ToS compliant).&lt;br /&gt;
|-&lt;br /&gt;
||[[Curtain script]]&lt;br /&gt;
||[[User:Zilla Larsson|Zilla Larsson]]&lt;br /&gt;
||A simple script to retract/stretch curtains, blinds, bedcovers and more&lt;br /&gt;
|-&lt;br /&gt;
||[[Dataserver API]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Dataserver Framework for Notecards.&lt;br /&gt;
|-&lt;br /&gt;
||[[Date Library]]&lt;br /&gt;
||[[User:Corto Maltese|Corto Maltese]]&lt;br /&gt;
|| Date library, based on number of day since march 3rd 1600, can be used to calculate weekday, date differences, and date offset, and date formating.&lt;br /&gt;
|-&lt;br /&gt;
||[[Day of the Week]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Function to get day of the week from [[llGetUnixTime]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Days in Month]]&lt;br /&gt;
||[[User:IntLibber Brautigan begin_of_the_skype_highlighting     end_of_the_skype_highlighting begin_of_the_skype_highlighting     end_of_the_skype_highlighting|IntLibber Brautigan]]&lt;br /&gt;
||Clicking on it returns the number of days in the present month. Useful for scripting calendars and tier systems that need to know the number of days in the month at hand or to calculate for any month. Even adjusts for leap years.&lt;br /&gt;
|-&lt;br /&gt;
||[[Deed Tools]]&lt;br /&gt;
||[[User:Falados Kapuskas|Falados Kapuskas]]&lt;br /&gt;
||Tools that allow the creator to modify Group-Owned (Deeded) Objects via chat.&lt;br /&gt;
|-&lt;br /&gt;
||[[Describe Chatter]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Chat to see yourself as others do.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog Control]]&lt;br /&gt;
||[[User:Nargus Asturias|Nargus Asturias]]&lt;br /&gt;
|| A (not-so) simple dialog &amp;amp; menu control script. Call dialog and receive selected value via [[link_message]](), with built-in timer and [[link_message]]() notification on time out. Supports multi-pages dialog and numeric property dialog. Button text and dialog&#039;s returned value can differ.&lt;br /&gt;
Latest version also has [[Dialog Menus Control]] built-in; which allow multi-level menus through SL dialog system.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog NumberPad|Dialog Number Pad]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Use a dialog to accept positive integer input from users.&lt;br /&gt;
|-&lt;br /&gt;
||[[Displayer Script]]&lt;br /&gt;
||[[User:Akinori Kimagawa|Akinori Kimagawa]]&lt;br /&gt;
||[[Display Words On Top Of An Object]]&lt;br /&gt;
|-&lt;br /&gt;
||[[Drink script]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Used mainly for food and drink in Second Life.&lt;br /&gt;
|-&lt;br /&gt;
||[[TOXDropBox|DropBox]]&lt;br /&gt;
||[[User:Dimentox Travanti|Dimentox Travanti]]&lt;br /&gt;
|| This is a Drop box which allows people to drop certain items in a object &amp;amp; has many config options.&lt;br /&gt;
|-&lt;br /&gt;
||[[Efficiency Tester]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Tests the speed of a function.&lt;br /&gt;
|-&lt;br /&gt;
||[[Email-to-IM|Email2IM]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Send IMs to SL friends via [[email]] (translate emails from friends into IMs).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kireji_Haiku/SIMchat_headset|Encrypted Region-wide chat]]&lt;br /&gt;
||&#039;&#039;&#039;[[User:Kireji Haiku|Kireji Haiku]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Kireji Haiku|talk]]|[[Special:Contributions/Kireji Haiku|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt;&lt;br /&gt;
||Encrypted Region-wide chat&lt;br /&gt;
|-&lt;br /&gt;
||[[ExplodingObjects]]&lt;br /&gt;
||[[User:Dale Innis|Dale Innis]]&lt;br /&gt;
||Causes an object (of the appropriate type) to explode on command.&lt;br /&gt;
|-&lt;br /&gt;
||[[FadeEasy]]&lt;br /&gt;
||[[User:Nika Rugani|Nika Rugani]]&lt;br /&gt;
||The easy way of fading objects in or out (Using llSetLinkAlpha)&lt;br /&gt;
|-&lt;br /&gt;
||[[FastConeSpread]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| Fast Algorithmn to achieve cone spread, main use in weaponry systems.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:PixelProphet Lane/Scripts#Fast List Prim Contents|Fast List Prim Contents]]&lt;br /&gt;
||[[User:PixelProphet Lane|PixelProphet Lane]]&lt;br /&gt;
||Fast and efficient method to print Object Inventory (Name, Type and next Owner permissions)&lt;br /&gt;
|-&lt;br /&gt;
||[[Find Avatar Key|Find Avatar Key]]&lt;br /&gt;
||[[User:Huney Jewell|Huney Jewell]]&lt;br /&gt;
||Explores [[UUID]] of avatar whose name is said in local chat or who touches the prim.&lt;br /&gt;
|-&lt;br /&gt;
||[[First Name Letter Prize]]&lt;br /&gt;
||[[User:RaithSphere Whybrow|RaithSphere Whybrow]]&lt;br /&gt;
||Gives a prize if the person who sits on it&#039;s first letter of first name matches the random letter!&lt;br /&gt;
|-&lt;br /&gt;
||[[Fix Small Prims|Fix_Small_Prims]]&lt;br /&gt;
||[[User:Emma Nowhere|Emma Nowhere]]&lt;br /&gt;
||Finds and adjusts the smallest prims in a linkset so that it can be scaled down further.&lt;br /&gt;
|-&lt;br /&gt;
||[[Float2Hex]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Very useful for transporting [[float|floats]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Float Box Contents]]&lt;br /&gt;
||[[User:Rolig Loon|Rolig Loon]]&lt;br /&gt;
||Displays object inventory in hover text, identified by type and updated marquee-style.&lt;br /&gt;
|-&lt;br /&gt;
||[[Follower (script)|Follower]]&lt;br /&gt;
||Unknown, uploaded by [[User:Slik Swindlehurst|Slik Swindlehurst]]&lt;br /&gt;
||Makes an object follow the nearest person. Do not use for [[grief|griefing]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Geometric|Geometric Library]]&lt;br /&gt;
||Community Project&lt;br /&gt;
||A substantial amount of various geometric functions for intersection and other purposes of 3D maths.&lt;br /&gt;
|-&lt;br /&gt;
||[[Get Profile Picture]]&lt;br /&gt;
||[[User:Valentine Foxdale|Valentine Foxdale]]&lt;br /&gt;
||Sets the texture of the object to profile picture of the person that touches ot&lt;br /&gt;
|-&lt;br /&gt;
||[[GetTimestampOffset]]&lt;br /&gt;
||[[User:Siann_Beck|Siann Beck]]&lt;br /&gt;
||Returns [[llGetTimestamp]]() with an hour offset.&lt;br /&gt;
|-&lt;br /&gt;
||[[Give InvItem every n hours]]&lt;br /&gt;
||[[User:Criz Collins|Criz Collins]]&lt;br /&gt;
||Will give an inventory item on touch only every n hours, even if somebody touches the object more than once. &lt;br /&gt;
|-&lt;br /&gt;
||[[Give random object]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Touch to receive a random object in the prim&#039;s inventory&lt;br /&gt;
|-&lt;br /&gt;
||[[Google Charts]]&lt;br /&gt;
||[[User:Dedric Mauriac|Dedric Mauriac]]&lt;br /&gt;
||Create links to display raw data as a chart image.&lt;br /&gt;
|-&lt;br /&gt;
||[[Google_Translator]]&lt;br /&gt;
||[[User:Ugleh Ulrik|Ugleh Ulrik]]&lt;br /&gt;
||Translates spanish to english, and its simple to make it any other way.&lt;br /&gt;
|-&lt;br /&gt;
||[[Go transparent when walking]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||An attachment that goes invisible when you walk and visible when you don&#039;t walk.&lt;br /&gt;
|-&lt;br /&gt;
||[[Group Authorization]]&lt;br /&gt;
||[[User:Chase Quinnell|Chase Quinnell]]&lt;br /&gt;
||Checks to see if object is set to appropriate group (checks by [[Group key finder|group key]])&lt;br /&gt;
|-&lt;br /&gt;
||[[Group Information v1.0]]&lt;br /&gt;
||[[User:Tyrennic Rivera|Tyrennic Rivera]]&lt;br /&gt;
||When clicked the prim will show group information (set on the prim) from the official Second Life Search page.&lt;br /&gt;
|-&lt;br /&gt;
||[[Group key finder]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Touch to find the key of the group&lt;br /&gt;
|-&lt;br /&gt;
||[[Group Privacy]]&lt;br /&gt;
||[[User:Chance Unknown|Chance Unknown]]&lt;br /&gt;
||Security device to insure members of a group can have a private area. Deactivates when nobody present.&lt;br /&gt;
|-&lt;br /&gt;
||[[Hello Avatar]]&lt;br /&gt;
||Linden Lab&lt;br /&gt;
||SL&#039;s default script.&lt;br /&gt;
|-&lt;br /&gt;
||[[Hello Avatar Companion]]&lt;br /&gt;
||[[Chase Quinnell]]&lt;br /&gt;
||Companion to the original [[Hello Avatar]] script&lt;br /&gt;
|-&lt;br /&gt;
||[[Hierarchics]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| Advanced script to create an efficient self-aware hierarchic structure.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Rolig_Loon/High-Capacity_Greeter-Counter|High-Capacity Greeter-Counter]]&lt;br /&gt;
||[[User:Rolig Loon|Rolig Loon]]&lt;br /&gt;
||Uses a memory compression algorithm to store hashed visitor UUID&#039;s in a string instead of using a list. &lt;br /&gt;
|-&lt;br /&gt;
||[[Holodeck]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Home Rezzing System (Open Source).&lt;br /&gt;
|-&lt;br /&gt;
||[[Interpolation|Interpolation Library]]&lt;br /&gt;
||[[User:Nexii_Malthus|Nexii Malthus]]&lt;br /&gt;
||A small set of interpolation functions.&lt;br /&gt;
|-&lt;br /&gt;
||[[Intra-Region Update Server]]&lt;br /&gt;
||[[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
||Centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
|-&lt;br /&gt;
||[[Inventory_Based_Menu]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Inventory Based Menu System.&lt;br /&gt;
|-&lt;br /&gt;
||[[iTunes RPC Email|iTunes RPC]]&lt;br /&gt;
||[[User:Fox Diller|Fox Diller]]&lt;br /&gt;
||iTunes RPC via LSL [[llEmail]] and [[llRemoteDataReply]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Key Pad Door|Keypad Door]]&lt;br /&gt;
||[[User:Tdub Dowler|Tdub Dowler]]&lt;br /&gt;
|| Door and keypad with changeable code. Follow instructions carefully!&lt;br /&gt;
|-&lt;br /&gt;
||[[Last Sound System]]&lt;br /&gt;
||[[User:Babbage Linden|Babbage Linden]]&lt;br /&gt;
||An LSL [http://Last.fm Last.fm] client.&lt;br /&gt;
|-&lt;br /&gt;
||[[LibraryDisplayLandScreenshot]]&lt;br /&gt;
||[[User:Jon Desmoulins|Jon Desmoulins]]&lt;br /&gt;
||A modified version of LibraryDisplayProfilePic using the new [[PARCEL_DETAILS_ID]] Implemented in Server v1.36&lt;br /&gt;
|-&lt;br /&gt;
||[[Linkset resizer]]&lt;br /&gt;
||[[User:Maestro Linden|Maestro Linden]]&lt;br /&gt;
||Systematically rescales a linkset by moving and resizing each prim (by using [[llGetLinkPrimitiveParams]] and [[llSetLinkPrimitiveParamsFast]])&lt;br /&gt;
|-&lt;br /&gt;
||[[Linkset resizer with menu]]&lt;br /&gt;
||[[User:Brilliant Scientist|Brilliant Scientist]]&lt;br /&gt;
||A menu-driven script that rescales a linkset by moving and resizing the prims using [[llGetLinkPrimitiveParams]] and [[llSetLinkPrimitiveParamsFast]] functions. Based on [[Linkset resizer]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Linkset Resizer 2]]&lt;br /&gt;
||[[User:Emma Nowhere|Emma Nowhere]]&lt;br /&gt;
||A more user-friendly resizer script designed for either drop-in use by the end-user or builder or for use in products. Based on [[Fix Small Prims]]].&lt;br /&gt;
|-&lt;br /&gt;
||[[List2CSV]]&lt;br /&gt;
||[[User:Kunnis Basiat|Kunnis Basiat]]&lt;br /&gt;
||List2CSV &amp;amp; CSV2List that include preserving type and escaping characters.&lt;br /&gt;
|-&lt;br /&gt;
||[[list_cast]]&lt;br /&gt;
||[[User:Fractured Crystal|Fractured Crystal]]&lt;br /&gt;
||Casts a list of strings into the type they appear to be. Designed for preprocessing user input for feeding into [[llSetPrimitiveParams]]&lt;br /&gt;
|-&lt;br /&gt;
||[[Listener Script]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Use to [[listen]] to other people&#039;s conversations (Like spying)&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#List:_Find_Last_Index|List: Find Last Index]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Returns the last index of searched item in a source list. (backwards version of [[llListFindList]])&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#List:_Multi-Find_Index_.28First_or_Last.29|List: Multi Find]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Returns the first found index of multiple search items in a list. (Multi-item version of [[llListFindList]]. Fwd and Rev versions included)&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#List:_Get_Reverse_Order|List: Reverse]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Returns an input List in reverse order&lt;br /&gt;
|-&lt;br /&gt;
||[[Load URL]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||Touch to get a dialog to visit the URL inside the script.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kephra_Nurmi/lsDancemachine|lsDancemachine]]&lt;br /&gt;
||[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
|| Low lag client server dancemachine.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kephra_Nurmi/lsDeejay|lsDeejay Home Edition]] &lt;br /&gt;
||[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
|| Client server media control for music, video, youtube, pictures, and texture animations.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kephra_Nurmi/lsDialog|lsDialog]]&lt;br /&gt;
||[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
|| Universal notecard driven menu dialog system.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kephra_Nurmi/lsDisplay|lsDisplay]]&lt;br /&gt;
||[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
|| Picture cycler with preloader.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Kephra_Nurmi/lsDistributor|lsDistributor]]&lt;br /&gt;
||[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
|| Simple &#039;try&#039; and &#039;buy&#039; vendor system.&lt;br /&gt;
|-&lt;br /&gt;
||[[LSL_languageAPI]]&lt;br /&gt;
||[[User:Gypsy paz|Gypsy Paz]]&lt;br /&gt;
||Multi-lingual API from notecard based language files&lt;br /&gt;
|-&lt;br /&gt;
||[[Mandelbrot Explorer]]&lt;br /&gt;
||[[User:Babbage Linden|Babbage Linden]]&lt;br /&gt;
||An interactive fractal explorer.&lt;br /&gt;
|-&lt;br /&gt;
||[[Merge Sort]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Implements a Merge Sort in LSL, however this code is 300(ish) times slower than [[llListSort]]. Don&#039;t use this in a script!&lt;br /&gt;
|-&lt;br /&gt;
||[[Minesweeper]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A simple minesweeper game.&lt;br /&gt;
|-&lt;br /&gt;
||[[Morse Code]]&lt;br /&gt;
||{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
||A script that allows for the conversion to and from morse code and can &amp;quot;play&amp;quot; morse code.&lt;br /&gt;
|-&lt;br /&gt;
||[[Multi Item Rezzer|Multi Item Rezzer]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||A rework of my old High Altitude Rezzer. Place the objects that you wish to choose from to be rezzed inside. Sit on the rezzer and pick the item and the height. It will go to target height and rez the object.&lt;br /&gt;
|-&lt;br /&gt;
||[[Multirezzer|Multirezzer (on collision)]]&lt;br /&gt;
||[[User:Beet Streeter|Beet Streeter]]&lt;br /&gt;
||Spawns up to 10 objects when the object containing the script collides with a user.&lt;br /&gt;
|-&lt;br /&gt;
||[[Name2Key in LSL]]&lt;br /&gt;
||[[User:Maeva Anatine|Maeva Anatine]]&lt;br /&gt;
||Get the Name2Key feature inside your scripts. Works even on lastly subscribed avatars.&lt;br /&gt;
|-&lt;br /&gt;
||[[No Auto-Return]]&lt;br /&gt;
||[[User:Bellla Clarity|Bella Clarity]]&lt;br /&gt;
||To stop your long and hard builds from getting returned in sandboxes (&#039;&#039;only single prims, though!&#039;&#039;).&lt;br /&gt;
|-&lt;br /&gt;
||[[No Auto-Return NR]]&lt;br /&gt;
||[[User:Jor3l Boa|Jor3l Boa]]&lt;br /&gt;
||This really works (29-05-09), needs a nearby region to do the trick and avoid auto return. (Tested on Blue and Rausch)&lt;br /&gt;
|-&lt;br /&gt;
||[[No Auto-Return (Multi)]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A revision of Bella&#039;s that works for multi-prim objects.&lt;br /&gt;
|-&lt;br /&gt;
||[[No Limit Teleporter]]&lt;br /&gt;
||[[User:Morgam Biedermann|Morgam Biedermann]]&lt;br /&gt;
||Teleport to infinite altitudes (up to 4096m)&lt;br /&gt;
|-&lt;br /&gt;
||[[Object Size]]&lt;br /&gt;
||[[User:Chase Quinnell|Chase Quinnell]]&lt;br /&gt;
||Gets the dimensions and footprint of a linkset&lt;br /&gt;
|-&lt;br /&gt;
||[[Object to Data v1.3|Object to Data]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Turns an object into text (and back). Allows people to transfer objects through notecards (or otherwise).&lt;br /&gt;
|-&lt;br /&gt;
||[[Online Indicator|Online Indicator]]&lt;br /&gt;
||[[User:Kristy Fanshaw|Kristy Fanshaw]]&lt;br /&gt;
||Will show if the user is online or not. Displays users profile picture and allows to send IM&#039;s to user. Also gives a link to open the users profile&lt;br /&gt;
|-&lt;br /&gt;
||[[Open Group Join]]&lt;br /&gt;
||[[User:Alicia Stella|Alicia Stella]]&lt;br /&gt;
||User Touches Object to Join Group from Group Info window, (no bot.)&lt;br /&gt;
|-&lt;br /&gt;
||[[Open Zyngo Skin Installer]]&lt;br /&gt;
||[[User:Tmzasz Luminos|Tmzasz Luminos]]&lt;br /&gt;
||A Simple Script designed to install skins on the popular Skill machines.&lt;br /&gt;
|-&lt;br /&gt;
||[[One Script, many doors]]&lt;br /&gt;
||[[User:Kyrah Abattoir|Kyrah Abattoir]]&lt;br /&gt;
||Door script able to manage more than 50 linked doors from a single script instance.&lt;br /&gt;
|-&lt;br /&gt;
||[[ParseString2List]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Same as [[llParseString2List]] and [[llParseStringKeepNulls]], but not limited to 8 spacers or separators. Thus substitute a call to the [[llParseString2List]] and [[llParseStringKeepNulls]] functions by a call to [[Parse_String_To_List|ParseString2List]] whenever you have more than 8 separators or more than 8 spacers.&lt;br /&gt;
|-&lt;br /&gt;
||[[Password Generator]]&lt;br /&gt;
||[[User:Syntrax Canucci|Syntrax Canucci]]&lt;br /&gt;
||This is an over-complicated, semi-complex password generator, which goes through multiple steps.&lt;br /&gt;
|-&lt;br /&gt;
||[[Pathfinder]]&lt;br /&gt;
||[[User:Babbage Linden|Babbage Linden]]&lt;br /&gt;
||A potential field based pathfinding library.&lt;br /&gt;
|-&lt;br /&gt;
||[[Phantom Child]]&lt;br /&gt;
||[[User:Aeron Kohime|Aeron Kohime]]&lt;br /&gt;
||Causes a child in a link set to become phantom without the entire object becoming phantom.&lt;br /&gt;
|-&lt;br /&gt;
||[[PhysicsLib]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| Interesting set of fun physics functions.&lt;br /&gt;
|-&lt;br /&gt;
||[[Play and Loop Sound]]&lt;br /&gt;
||[[User:Bellla Clarity|Bella Clarity]]&lt;br /&gt;
||Very short and simple script; plays and loops a sound in an object.&lt;br /&gt;
|-&lt;br /&gt;
||[[Posing stand|Posing Stand]]&lt;br /&gt;
||[[User:Bellla Clarity|Bella Clarity]]&lt;br /&gt;
||Just a pose script to edit [[attachments]] more easily.&lt;br /&gt;
|-&lt;br /&gt;
||[[PosJump]]&lt;br /&gt;
||[[User:Uchi Desmoulins|Uchi Desmoulins]]&lt;br /&gt;
||A much more efficient alternative to the popular [[warpPos]] function for bypassing 10m distance-moved limitations.&lt;br /&gt;
|-&lt;br /&gt;
||[[Prefix Calculator]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
|| A calculator that evaluates expressions in prefix notation. &lt;br /&gt;
&amp;lt;code&amp;gt;+ 3 4 = 5. * + 1 2 + 3 4 = 14.&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||[[Progress Bar]]&lt;br /&gt;
||[[User:Nexii Malthus|Nexii Malthus]]&lt;br /&gt;
|| Flexible and powerful little function for creating progress bars useful in hovertext.&lt;br /&gt;
|-&lt;br /&gt;
||[[Pseudo-random Number Generator]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Generates a Pseudo-random number between -0x7FFFFFFF and 0x7FFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Rolig_Loon/Quiz_From_Notecard|Quiz From Notecard]]&lt;br /&gt;
||[[User:Rolig Loon|Rolig Loon]]&lt;br /&gt;
||A multiple-choice testing script that reads questions and answer choices from a notecard and presents them in dialog boxes.&lt;br /&gt;
|-&lt;br /&gt;
||[[Rainbow_palette]]&lt;br /&gt;
||[[User:Rui Clary|Rui Clary]]&lt;br /&gt;
||Build a color picker, using only one prim, and a few lines of code.&lt;br /&gt;
|-&lt;br /&gt;
||[[Random AV Profile Projector]]&lt;br /&gt;
||[[User:Debbie Trilling|Debbie Trilling]]&lt;br /&gt;
||Randomly selects an AV from a crowd &amp;amp; then projects their profile picture as a &#039;holographic&#039; image &lt;br /&gt;
|-&lt;br /&gt;
||[[Random Object Vendor]]&lt;br /&gt;
||[[User:CodeBastard Redgrave|CodeBastard Redgrave]]&lt;br /&gt;
||Simple vendor that gives out random objects when paid the right amount &lt;br /&gt;
|-&lt;br /&gt;
||[[Random Password Generator]]&lt;br /&gt;
||[[User:Jor3l Boa|Jor3l Boa]]&lt;br /&gt;
||Generate Random passwords based on String Length.&lt;br /&gt;
|-&lt;br /&gt;
||[[RavText]]&lt;br /&gt;
||[[User:Ravenous Dingo|Ravenous Dingo]]&lt;br /&gt;
||An alternate to XyText.  This is a lightweight, multiple font 10 character text display system.  It only supports uppercase alphanumeric text and a few special characters, but it is very fast, renders quickly and supports multiple fonts. It is meant for specialized use when all that is desired is basic, fast text display and the extra &amp;quot;bells and whistles&amp;quot; are not needed.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:PixelProphet Lane/Scripts#Real Object Inventory To Dialog|Real Object Inventory To Dialog]]&lt;br /&gt;
||[[User:PixelProphet Lane|PixelProphet Lane]]&lt;br /&gt;
||Display any amount of items contained in an Object in a Dialog, regardless of item name length.&lt;br /&gt;
|-&lt;br /&gt;
||[[RentalBoxv1|Rental Box, Simply]]&lt;br /&gt;
||[[User:Sendao Goodman|Sendao Goodman]]&lt;br /&gt;
||Simple explanation of how to make rental boxes.&lt;br /&gt;
|-&lt;br /&gt;
||[[Rental Cube]]&lt;br /&gt;
||[[User:Hank Ramos|Hank Ramos]]&lt;br /&gt;
||Simple cube for renting out a space.&lt;br /&gt;
|-&lt;br /&gt;
||[[Remote Texture Loader]]&lt;br /&gt;
||{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
||A set of scripts for remotely loading textures within a sim. This means that a single &amp;quot;texture server&amp;quot; can manage multiple changing billboards within a sim.&lt;br /&gt;
|-&lt;br /&gt;
||[[Say Region Frames Per Second|Region Frames Per Second]]&lt;br /&gt;
||[[User:Heymeriou Mystakidou|Heymariou Mystakidou]]&lt;br /&gt;
|| Says the region name and frames per second out loud on command.&lt;br /&gt;
|-&lt;br /&gt;
||[[sbDialog]]&lt;br /&gt;
||[[User:Siann_Beck|Siann Beck]]&lt;br /&gt;
||A simple replacement function for [[llDialog]]. It re-orders the button list so that the button values, as passed to it, display left-to-right, top-to-bottom. It also opens a [[llListen|listen]] on the specified channel, and returns the handle.&lt;br /&gt;
|-&lt;br /&gt;
||[[Scheduler]]&lt;br /&gt;
||[[User:Haravikk Mistral|Haravikk Mistral]]&lt;br /&gt;
||Schedule multiple events using a single script timer&lt;br /&gt;
|-&lt;br /&gt;
||[[Scheme_Interpreter|Scheme Interpreter]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A scheme interpreter capable of handling most scheme expressions, including lambda and lists.&lt;br /&gt;
|-&lt;br /&gt;
||[[Script Override Functions]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||bypass default strings, integer etc in chat channel.&lt;br /&gt;
|-&lt;br /&gt;
||[[Scripted Attachment Detector.lsl|Scripted Attachment Detector]]&lt;br /&gt;
||{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
||A script that will display avatars wearing scripted attatchments in hovertext. This may be worn as an hud or rezzed. &lt;br /&gt;
|-&lt;br /&gt;
||[[Self Upgrading Script Enhanced]]&lt;br /&gt;
||[[User:Cron Stardust|Cron Stardust]]&lt;br /&gt;
||Keeps only latest version of the script on prim (even with multiple adds of the same script!)&lt;br /&gt;
|-&lt;br /&gt;
||[[Sensor Visualizer]]&lt;br /&gt;
||[[User:Cerise Sorbet|Cerise Sorbet]]&lt;br /&gt;
||Shows the size and shape you get with [[llSensor]] range and arc parameters&lt;br /&gt;
|-&lt;br /&gt;
||[[Serverless Key Exchange]]&lt;br /&gt;
||[[User:Sendao Goodman|Sendao Goodman]]&lt;br /&gt;
||Maintains a network of object keys without using an external server.&lt;br /&gt;
|-&lt;br /&gt;
||[[SHA1|SHA1 Hash]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Preforms a SHA1 Hash on an input text. Similar to MD5 only (slightly) more secure. &lt;br /&gt;
|-&lt;br /&gt;
||[[Sim Map Particle Projector]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||Displays a floating map of the sim the script is in.&lt;br /&gt;
|-&lt;br /&gt;
||[[Sim Restart Logger]]&lt;br /&gt;
||[[User:Kyrah Abattoir|Kyrah Abattoir]]&lt;br /&gt;
||Counts region restarts and displays log of last 9 restarts together with region FPS and dilation. &lt;br /&gt;
|-&lt;br /&gt;
||[[Simple Elevator in a Box]]&lt;br /&gt;
||[[User:Hank Ramos|Hank Ramos]]&lt;br /&gt;
||Simple elevator example.&lt;br /&gt;
|-&lt;br /&gt;
||[[Skillingo AntiHack Script]]&lt;br /&gt;
||[[User:Tmzasz Luminos|Tmzasz Luminos]]&lt;br /&gt;
||A simple Protection script for skillingo thats modifyable to work with other machines.&lt;br /&gt;
|-&lt;br /&gt;
||[[Skunk Money]]&lt;br /&gt;
||[[User:Hank Ramos|Hank Ramos]]&lt;br /&gt;
||Fun gambling machine of yesteryear, which only supports freeplay now due to SL regulations against gambling. &lt;br /&gt;
|-&lt;br /&gt;
||[[SLateIt]]&lt;br /&gt;
||[[User:Babbage Linden|Babbage Linden]]&lt;br /&gt;
||An augmented virtual reality HUD.&lt;br /&gt;
|-&lt;br /&gt;
||[[SLetanque]]&lt;br /&gt;
||[[User:Babbage Linden|Babbage Linden]]&lt;br /&gt;
||An LSL petanque game.&lt;br /&gt;
|-&lt;br /&gt;
||[[SLURL HUD]]&lt;br /&gt;
||[[User:CodeBastard Redgrave|CodeBastard Redgrave]]&lt;br /&gt;
||Touch this HUD to get a SLURL through IM, email and floating text.&lt;br /&gt;
|-&lt;br /&gt;
||[[SL Mail V1.2]]&lt;br /&gt;
||[[User:Flennan Roffo|Flennan Roffo]]&lt;br /&gt;
||Second Life mail client V1.2 (released sept&#039;07). Send and receive mail from within Second Life from and to any address. With Address Book function and many chat commands. V1.3 is upcoming soon! &lt;br /&gt;
|-&lt;br /&gt;
||[[SL_NTPoHTTP_v1.1_client|SL NTPoHTTP client]]&lt;br /&gt;
|[[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
||Second Life Needs Time Parsing over Hyper Text Transfer Protocol&lt;br /&gt;
Emulates the function of [[llGetWallclock]] for any timezone by using SLOpenID&#039;s SLNTPoHTTP service. Also supports ISO 8601 and RFC 2822 timestamps. Script is dependent upon an external service operated by the author!&lt;br /&gt;
|-&lt;br /&gt;
||[[Smooth Rotating Door]]&lt;br /&gt;
|[[User:Toy Wylie|Toy Wylie]]&lt;br /&gt;
||A script for doors that open and close smoothly using llTargetOmega&lt;br /&gt;
|-&lt;br /&gt;
||[[Smooth Sliding Door]]&lt;br /&gt;
|[[User:SimonT Quinnell|SimonT Quinnell]]&lt;br /&gt;
||A script for sliding doors that open and close smoothly using [[llMoveToTarget]]. Asjusts for prim orientation.&lt;br /&gt;
|-&lt;br /&gt;
||[[Speed Tester]]&lt;br /&gt;
||{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
||Similar to the [[Efficiency Tester]], this script allows you to test the speed of a particular function or snippet with multiple trials giving min/max/avg/median and the standard deviation.&lt;br /&gt;
|-&lt;br /&gt;
||[[Spiral Staircase Generator]]&lt;br /&gt;
|[[User:Meyermagic Salome|Meyermagic Salome]]&lt;br /&gt;
||Generates nice looking spiral staircases without much hassle.&lt;br /&gt;
|-&lt;br /&gt;
||[[Static URL&#039;s for HTTP-In Service|Static_URLs]]&lt;br /&gt;
||[[User:Jor3l Boa|Jor3l Boa]]&lt;br /&gt;
||How to generate a static url for HTTP-In temporal limitations.&lt;br /&gt;
|-&lt;br /&gt;
||[[String Compare]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Compares two strings and reliably returns either 1, -1, or 0 if they are the same.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#String:_Find_Last_Index|String: Reverse]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Returns an input string in reverse order&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#String:_Get_Reverse_Order|String: Last Index]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Returns the last index of search found in string (the backward equivalent of [[llSubStringIndex]])&lt;br /&gt;
|-&lt;br /&gt;
||[[Teleport HUD]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||WORKS TO 4096 METERS!! Very user friendly teleport HUD. Add destinations by touching &amp;quot;Add&amp;quot; &amp;amp; naming destination in chat. Automatically gets sim name and coordinates. Will only display the destinations in the sim you are currently in. Demonstrates more advanced list manipulation and stride functions.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Programs#v7-D_Enh._Landmark-2-Map|Teleporter (landmark based)]]&lt;br /&gt;
||[[User:Void_Singer|Void_Singer]]&lt;br /&gt;
||Uses Landmarks to offer map teleports. Works as Hud or inworld objects, just drop in landmarks and go.&lt;br /&gt;
|-&lt;br /&gt;
||[[Text_Scroller|Text Scroller]]&lt;br /&gt;
||[[User:Fred_Gandt|Fred Gandt]]&lt;br /&gt;
||A simple text display object that scrolls text (applied as a texture) from right to left (like &#039;&#039;those&#039;&#039; LED signs) in a continuous loop.&lt;br /&gt;
|-&lt;br /&gt;
||[[Bobbyb&#039;s texture changer|Texture Changers]]&lt;br /&gt;
||{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
||A collection of texture changing scripts.&lt;br /&gt;
|-&lt;br /&gt;
||[[Texture Menu Management|Texture Management]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Dialog Menu based Texture Selection.&lt;br /&gt;
|-&lt;br /&gt;
||[[Tic Tac Toe]]&lt;br /&gt;
||[[User:CG Linden|CG Linden]]&lt;br /&gt;
||Step by step demo on how to implement a larger scripting project&lt;br /&gt;
|-&lt;br /&gt;
||[[TightList]]&lt;br /&gt;
||[[User:Strife Onizuka|Revolution Perenti]]&lt;br /&gt;
||Tight List is a family of functions for encoding lists as strings and then decoding them back into lists.&lt;br /&gt;
There are two flavors: TightList and TightListType. TightListType preserves types and uses a 6 char header, while TightList uses a 1 char header that doesn&#039;t preserve type. &lt;br /&gt;
|-&lt;br /&gt;
||[[Timer Module]]&lt;br /&gt;
||[[User:Isabelle Aquitaine|Isabelle Aquitaine]]&lt;br /&gt;
||Manage multiple timers via linked messages.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#Unix_time_code_to_list_format|Timestamp:&amp;lt;br&amp;gt;Unix time code to list format]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||converts Unix timestamps to their [Y, M, D, h, m, s] equivalents (ex: 1234567890 to [2009, 2, 13, 3, 31, 30])&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#List_format_to_Unix_time_code.|Timestamp:&amp;lt;br&amp;gt;List format to Unix time code]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||converts [Y, M, D, h, m, s] timestamps to their Unix equivalents (ex: [2009, 2, 13, 3, 31, 30] to 1234567890)&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#Weekday_from_Unix_timestamp|Timestamp:&amp;lt;br&amp;gt;Weekday from Unix timestamp]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Gets weekday from Unix timestamps (ex: &amp;quot;Friday&amp;quot; from 1234567890)&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Functions#Weekday_from_.28_Y.2C_M.2C_D_.29_format|Timestamp:&amp;lt;br&amp;gt;Weekday from (Y, M, D) format]]&lt;br /&gt;
||[[User:Void Singer|Void Singer]]&lt;br /&gt;
||Gets weekday from (Y, M, D) timestamps (ex: &amp;quot;Friday&amp;quot; from (2009, 2, 13))&lt;br /&gt;
|-&lt;br /&gt;
||[[Touch A Quote]]&lt;br /&gt;
||[[User:CodeBastard Redgrave|CodeBastard Redgrave]]&lt;br /&gt;
||Touch an object to read quotes sequentially from a notecard&lt;br /&gt;
|-&lt;br /&gt;
||[[Touring Balloon]]&lt;br /&gt;
||[[User:Hank Ramos|Hank Ramos]]&lt;br /&gt;
||Automated touring balloon with many options from long ago.  Always seems to work on one SL release, and not the other.&lt;br /&gt;
|-&lt;br /&gt;
||[[Under Age Boot]]&lt;br /&gt;
|[[User:Chance Unknown|Chance Unknown]]&lt;br /&gt;
||Security device example to teleport home accounts below a minimum age limit; can be useful in combating free griefer accounts.&lt;br /&gt;
|-&lt;br /&gt;
||[[Universal Translator]]&lt;br /&gt;
|[[User:Hank Ramos|Hank Ramos]]&lt;br /&gt;
||Chat listener that handles seamless translation of public chat between 50+ written languages without the need for configuration.  Handles numerous avatars, auto-detects languages, and works together with multiple copies of translators to spread-workload using a sophisticated back-end communications sub-system.&lt;br /&gt;
|-&lt;br /&gt;
||[[Unix2DateTime]]&lt;br /&gt;
|[[User:Flennan Roffo|Flennan Roffo]]&lt;br /&gt;
||Conversion from Unix time ([[llGetUnixTime]]()) to date and time string and vice versa.&lt;br /&gt;
|-&lt;br /&gt;
||[[Unmutable Descript Nagger]]&lt;br /&gt;
|[[User:Bobbyb30 Zohari|Bobbyb30 Zohari]]&lt;br /&gt;
||To nag avatars to take off their scripted attatchments.&lt;br /&gt;
|-&lt;br /&gt;
||[[UUID2Channel]]&lt;br /&gt;
||[[User:Project Neox|Project Neox]]&lt;br /&gt;
||Optimised version of the original key2channel generators.&lt;br /&gt;
|-&lt;br /&gt;
||[[UUID Song Generator]]&lt;br /&gt;
||{{User|Sendao Goodman}}&lt;br /&gt;
||Translates a UUID into a simple song and plays it.&lt;br /&gt;
|-&lt;br /&gt;
||[[VirtualID_URLMap|VirtualID URL Mapper for HTTP-in]]&lt;br /&gt;
|[[User:Cenji Neutra|Cenji Neutra]]&lt;br /&gt;
||A script showing how to setup a static URL of the form &amp;lt;your-alias&amp;gt;.obj.virtualid.info which maps to the dynamic HTTP-in URL LSL generates and keeps it up-to-date.&lt;br /&gt;
|-&lt;br /&gt;
||[[User:Void_Singer/Programs#v7-D_Advanced_Visitor_Greeter|Visitor Greeter]]&lt;br /&gt;
|[[User:Void_Singer|Void_Singer]]&lt;br /&gt;
||Reduced spam visitor greeter, highly configurable, easy to modify.&lt;br /&gt;
|-&lt;br /&gt;
||[[Visitor Logger (Web/Basic) ]]&lt;br /&gt;
|[[User:Buddy Sprocket|Buddy Sprocket]]&lt;br /&gt;
||A very basic visitor logger - log visitors in SL to a text file on your web-site.&lt;br /&gt;
|-&lt;br /&gt;
||[[Vote Simple]]&lt;br /&gt;
|[[User:JB_Kraft|JB Kraft]]&lt;br /&gt;
||Simple vote collector. One avi, one vote.&lt;br /&gt;
|-&lt;br /&gt;
||[[WarpPos]]&lt;br /&gt;
|[[User:Keknehv Psaltery|Keknehv Psaltery]]&lt;br /&gt;
||Non-physical movement without the 10m limit.&lt;br /&gt;
|-&lt;br /&gt;
||[[Wiki3DBuilder]] [[Wiki3DBuilder1.0]]&lt;br /&gt;
||[[User:Salahzar Stenvaag|Salahzar Stenvaag]] &lt;br /&gt;
||Allows a group of people to collectively build up complex 3D mindmaps with connected concepts. Uses particles for connections and low prim usage. Nodes can be textured, colored, changed form size moved collectively by everybody and can distribute notecards, landmarks, URL, objects, textures. I provide two version 0.1 and 1.0 and probably next version will communicate with moodle and sloodle external websites.&lt;br /&gt;
|-&lt;br /&gt;
||[[Window Control]]&lt;br /&gt;
||[[User:Emmas Seetan|Emmas Seetan]]&lt;br /&gt;
||For window opacity, helpful for buildings.&lt;br /&gt;
|-&lt;br /&gt;
||[[WHMcs SecondLife plugin]]&lt;br /&gt;
|[[User:Alicia Sautereau|Alicia Sautereau]]&lt;br /&gt;
||Linden Dollar payment plugin for the WHMcs hosting portal.&lt;br /&gt;
|-&lt;br /&gt;
||[[XTEA Strong Encryption Implementation]]&lt;br /&gt;
||[[User:Morse Dillon|Morse Dillon]]&lt;br /&gt;
||An LSL implementation of XTEA (eXtended Tiny Encryption Algorithm).  This is the first known public release of a &#039;real&#039; strong encryption implementation in LSL and is released under the GNU General Public License (GPL).&lt;br /&gt;
|-&lt;br /&gt;
||[[XyText 1.5|XyText]]&lt;br /&gt;
||[[User:Xylor Baysklef|Xylor Baysklef]]&lt;br /&gt;
|| Display text (up to 10 characters) on a prim. Use as many prims as desired.&lt;br /&gt;
|-&lt;br /&gt;
||[[XyyyyzText|XyyyyzText]]&lt;br /&gt;
||[[User:Criz Collins|Criz Collins]]&lt;br /&gt;
|| Display text (up to 10 characters) on a prim. Displays different text for each line instead of one single text, that will be broken into the next lines. Watch here for what that means: http://screencast.com/t/1wMLujLcEO&lt;br /&gt;
|-&lt;br /&gt;
||[[XyzzyText|XyzzyText]]&lt;br /&gt;
||[[User:Thraxis Epsilon|Thraxis Epsilon]] and [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
|| Display text (up to 10 characters) on a prim. Way more efficient than XyText.&lt;br /&gt;
|-&lt;br /&gt;
||[[Youtube TV]]&lt;br /&gt;
||[[User:Morgam Biedermann|Morgam Biedermann]]&lt;br /&gt;
||Watch your favorite Youtube videos / auto set the texture to the parcel media texture.&lt;br /&gt;
|-&lt;br /&gt;
||[[Zero Lag Poseball]]&lt;br /&gt;
||[[User:Jippen Faddoul|Jippen Faddoul]]&lt;br /&gt;
||A simple poseball with no lag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Support Script Library==&lt;br /&gt;
These are scripts in other languages, intended to be run on other systems that support scripts written in LSL&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:Ina Centaur/UUID/calimg.api|Calendar Image UUID API]]&lt;br /&gt;
|| [[User:Ina Centaur|Ina Centaur]]&lt;br /&gt;
|| API that gives the UUID of an image of a calendar image give month and year arguments.&lt;br /&gt;
|-&lt;br /&gt;
||[[HTTP Post request to a PHP server]]&lt;br /&gt;
||[[User:Corto Maltese|Corto Maltese]]&lt;br /&gt;
|| This small library allows you to make simple POST requests to your website. The libraries allow you to get your request through the variable $_POST on the server. It also include a basic security mechanism aimed to stop hacking. Comprises of LSL client script and PHP server script.&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:Ina Centaur/PHP/k2n.php|Key2Name.php]]&lt;br /&gt;
|| [[User:Ina Centaur|Ina Centaur]]&lt;br /&gt;
|| Get Avatar&#039;s Name using Second Life search service. (like in LSL Key2Name)&lt;br /&gt;
|-&lt;br /&gt;
|| [[Lame_Object_DNS_and_Cross_Sim_Messaging|Lame Object DNS and Cross Sim Messaging]]&lt;br /&gt;
|| [[User:Liandra Ceawlin|Liandra Ceawlin]]&lt;br /&gt;
|| Simple, cheeseball method of doing cross-sim communications with http-in and an external object DNS service.&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:SignpostMarv Martin/PHP/llXorBase64StringsCorrect|llXorBase64StringsCorrect]]&lt;br /&gt;
|| [[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
|| An implementation of [[llXorBase64StringsCorrect]] in PHP- should be useful if you&#039;re using llXorBase64StringsCorrect to do cryptography work in LSL2 and posting it out to the web via [[llHTTPRequest]].&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:SignpostMarv Martin/PHP/lsl fu.php|lsl_fu.php]]&lt;br /&gt;
|| [[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
|| A basic OOP&#039;d PHP Class containing VeloxSeverine&#039;s $_POST fixer and Marv&#039;s own eccentric ideas for &amp;quot;fixing&amp;quot; things.&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:Jor3l Boa/PHP/n2k.php|Name2Key.php]]&lt;br /&gt;
|| [[User:Jor3l Boa|Jor3l Boa]]&lt;br /&gt;
|| Get Avatar&#039;s UUID using Second Life search service. (like in LSL Name2Key)&lt;br /&gt;
|-&lt;br /&gt;
|| [[Public_Object_DNS|Public Object DNS]]&lt;br /&gt;
|| [[User:Liandra Ceawlin|Liandra Ceawlin]]&lt;br /&gt;
|| Public object DNS-like system running on GAE, for http-in. Hopefully scalable enough for wide-spread usage.&lt;br /&gt;
|-&lt;br /&gt;
|| Silo&lt;br /&gt;
|| [[User:Zero_Linden|Zero Linden]]&lt;br /&gt;
|| General purpose data store in PHP.  Use this to persist arbitrary data from LSL via [[llHTTPRequest]].  See:&lt;br /&gt;
* [http://www.notabene-sl.com/misc/silo-README.txt README] file&lt;br /&gt;
* [http://www.notabene-sl.com/misc/silo.tgz silo.tgz] tarball&lt;br /&gt;
* forum post [http://forums-archive.secondlife.com/54/69/119570/1.html Announcement].&lt;br /&gt;
|-&lt;br /&gt;
||[[Silverday ObjectDNS]]&lt;br /&gt;
||[[User:Till Stirling|Till Stirling]]&lt;br /&gt;
||Dynamic Object-DNS-System to provide dynamic mapping of LSL-URLs to persistent domains. Features include redirect service, password protected domains, write protected domains, LSL-API for all necessary functions, optional web-interface.&lt;br /&gt;
|-&lt;br /&gt;
|| [http://aubretec.com/products/sldb SLDB]&lt;br /&gt;
|| [[User:Luc Aubret|Luc Aubret]]&lt;br /&gt;
|| Flexible web database storage using PHP/MySQL.  Used to store per-user field/value pairs from in-world objects using [[llHTTPRequest]]. &lt;br /&gt;
* [http://aubretec.com/support/manuals/sldbkit/ Implementation Guide]&lt;br /&gt;
* [http://aubretec.com/wp-content/uploads/2009/05/sldb.zip Download] (.zip, 12kb)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Articles&#039;&#039;&#039;&lt;br /&gt;
*[[:Category:LSL Examples| Examples]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere/Linkset_Resizer&amp;diff=933823</id>
		<title>User:Emma Nowhere/Linkset Resizer</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere/Linkset_Resizer&amp;diff=933823"/>
		<updated>2010-06-01T16:22:07Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: moved User:Emma Nowhere/Linkset Resizer to Linkset Resizer 2:&amp;amp;#32;Make easier to find with other scripts in the LSL script library&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Linkset Resizer 2]]&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=933813</id>
		<title>Linkset Resizer 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=933813"/>
		<updated>2010-06-01T16:22:07Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: moved User:Emma Nowhere/Linkset Resizer to Linkset Resizer 2:&amp;amp;#32;Make easier to find with other scripts in the LSL script library&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Resizer by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Yet another object resizer script.  Seeing as I was the person who originally opened the JIRA for [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams]&lt;br /&gt;
I thought I should put it to good use.  I like it more than the other resizer scripts out there, but of course, I&#039;m biased.  In any case, it never hurts to have more&lt;br /&gt;
code being shared.&lt;br /&gt;
&lt;br /&gt;
How to use with menu:&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
#Type /1resizer to show the menu&lt;br /&gt;
#Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
#Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
where x is the percentage of the original size you want to resize to.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
The script below is configured to be used as a drop-in script for a user or builder that wants to resize something for themselves.  If putting into a product, you may&lt;br /&gt;
want to set START_ON_TOUCH to be TRUE so that your customers can just touch the object to start resizing.  You may also want to set SAY_STATUS to FALSE&lt;br /&gt;
so that a bunch of text doesn&#039;t get sent to the chat window (only seen by the owner, but can still be annoying to the end-user).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resizer ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Resizer&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 6/1/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use with menu:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1resizer to show the menu&lt;br /&gt;
// 3. Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
// 4. Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
//&lt;br /&gt;
// Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
// where x is the percentage of the original size you want to resize to.&lt;br /&gt;
//&lt;br /&gt;
// If using in a product with no other scripts, change START_ON_TOUCH below to TRUE&lt;br /&gt;
// so user can initiate resizing by just touching the object.&lt;br /&gt;
&lt;br /&gt;
integer START_ON_TOUCH = FALSE;&lt;br /&gt;
&lt;br /&gt;
// Display status messages in chat window (to owner only)&lt;br /&gt;
&lt;br /&gt;
integer SAY_STATUS = TRUE;&lt;br /&gt;
&lt;br /&gt;
// Channel to listen for commands on&lt;br /&gt;
&lt;br /&gt;
integer CHAT_CHANNEL = 1;&lt;br /&gt;
&lt;br /&gt;
// SL constraints&lt;br /&gt;
&lt;br /&gt;
float MIN_SIZE = .01;&lt;br /&gt;
float MAX_SIZE = 10;&lt;br /&gt;
float MAX_DISTANCE = 10; &lt;br /&gt;
float MIN_SCALE = .1;&lt;br /&gt;
&lt;br /&gt;
integer MENU_CHANNEL = -1001;&lt;br /&gt;
 &lt;br /&gt;
list backupPrims = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
float scale = 1.0;&lt;br /&gt;
&lt;br /&gt;
init_menu_channel() {&lt;br /&gt;
    MENU_CHANNEL = ((integer)(&amp;quot;0x&amp;quot; + llGetSubString((string)llGetKey(), -8, -1)) &amp;amp; 0x3FFFFFFF) ^ 0xBFFFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
say_status(string msg) {&lt;br /&gt;
    if (SAY_STATUS) llOwnerSay(msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        say_status(&amp;quot;Backing up prim positions and sizes.&amp;quot;);&lt;br /&gt;
        backupPrims = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        vector root_pos = &amp;lt;0, 0, 0&amp;gt;;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_POSITION, PRIM_SIZE]);&lt;br /&gt;
            vector pos = llList2Vector(params, 0);&lt;br /&gt;
            vector size = llList2Vector(params, 1);&lt;br /&gt;
            if (i == 1)&lt;br /&gt;
            {&lt;br /&gt;
                root_pos = pos;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pos = pos - root_pos;&lt;br /&gt;
            }&lt;br /&gt;
            backupPrims = backupPrims + pos + size;&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        say_status(&amp;quot;Prim positions and sizes backed up.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        say_status(&amp;quot;Restoring previously backed up positions and sizes.&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
            vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
            if (i == 1) {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        say_status(&amp;quot;Previously backed up prim positions and sizes restored.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    scale = 1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
finish() {&lt;br /&gt;
    say_status(&amp;quot;Deleting Resizer script.&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float min(float a, float b) {&lt;br /&gt;
    if (a &amp;lt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float max(float a, float b) {&lt;br /&gt;
    if (a &amp;gt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainMinMax(float value, float min, float max) {&lt;br /&gt;
    value = max(value, min);&lt;br /&gt;
    value = min(value, max);&lt;br /&gt;
    return value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainSize(float size) {&lt;br /&gt;
    return constrainMinMax(size, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainDistance(float distance) {&lt;br /&gt;
    return min(distance, MAX_DISTANCE);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
process() {&lt;br /&gt;
    backup();&lt;br /&gt;
 &lt;br /&gt;
    say_status(&amp;quot;Resizing prims to &amp;quot; + (string)llRound(scale * 100) + &amp;quot;% of original size.&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
        vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
 &lt;br /&gt;
        size.x = constrainSize(size.x * scale);&lt;br /&gt;
        size.y = constrainSize(size.y * scale);&lt;br /&gt;
        size.z = constrainSize(size.z * scale);&lt;br /&gt;
&lt;br /&gt;
        if (i == 1) {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            pos = pos * scale;&lt;br /&gt;
            pos.x = constrainDistance(pos.x);&lt;br /&gt;
            pos.y = constrainDistance(pos.y);&lt;br /&gt;
            pos.z = constrainDistance(pos.z);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    say_status(&amp;quot;Prims resized.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu() {&lt;br /&gt;
    llDialog(llGetOwner(),&lt;br /&gt;
    &amp;quot;Resizer\n\nMake a backup of your object first.\n\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
    [&amp;quot;Revert&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;Finish&amp;quot;, &amp;quot;-1%&amp;quot;, &amp;quot;-5%&amp;quot;, &amp;quot;-10%&amp;quot;, &amp;quot;+1%&amp;quot;, &amp;quot;+5%&amp;quot;, &amp;quot;+10%&amp;quot;], MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
handle_message(integer channel, string name, key id, string message) &lt;br /&gt;
{&lt;br /&gt;
    if (channel == CHAT_CHANNEL) {&lt;br /&gt;
        if (message == &amp;quot;resizer&amp;quot;) {&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (llSubStringIndex(message, &amp;quot;resizer&amp;quot;) == 0) {  &lt;br /&gt;
            list params = llParseString2List(message, [&amp;quot; &amp;quot;], [] );&lt;br /&gt;
            if (llGetListLength(params) == 2) {&lt;br /&gt;
                string scale_param = llList2String(params, 1);&lt;br /&gt;
                if (llGetSubString(scale_param, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
                    scale = (((float)llGetSubString(scale_param, 0, -2)) / 100);&lt;br /&gt;
                    scale = max(scale, MIN_SCALE);&lt;br /&gt;
                    process();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else if (channel == MENU_CHANNEL) {&lt;br /&gt;
        if (message == &amp;quot;Revert&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Finish&amp;quot;) {        &lt;br /&gt;
            finish();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (llGetSubString(message, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
            scale = scale + (((float)llGetSubString(message, 0, -2)) / 100);&lt;br /&gt;
            scale = max(scale, MIN_SCALE);&lt;br /&gt;
            process();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        if (START_ON_TOUCH) {&lt;br /&gt;
            // we only want a touch_start handler if we&#039;re going to use it&lt;br /&gt;
            // so change state rather than just testing inside touch_start&lt;br /&gt;
            // for START_ON_TOUCH to be true.&lt;br /&gt;
            state start_on_touch;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            llListen(CHAT_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            init_menu_channel();&lt;br /&gt;
            llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHAT_CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHAT_CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        handle_message(channel, name, id, message);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state start_on_touch&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHAT_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        init_menu_channel();&lt;br /&gt;
        llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch for resizer menu.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch for resizer menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        handle_message(channel, name, id, message);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        menu();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=933803</id>
		<title>Linkset Resizer 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=933803"/>
		<updated>2010-06-01T16:18:51Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Resizer by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Yet another object resizer script.  Seeing as I was the person who originally opened the JIRA for [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams]&lt;br /&gt;
I thought I should put it to good use.  I like it more than the other resizer scripts out there, but of course, I&#039;m biased.  In any case, it never hurts to have more&lt;br /&gt;
code being shared.&lt;br /&gt;
&lt;br /&gt;
How to use with menu:&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
#Type /1resizer to show the menu&lt;br /&gt;
#Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
#Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
where x is the percentage of the original size you want to resize to.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
The script below is configured to be used as a drop-in script for a user or builder that wants to resize something for themselves.  If putting into a product, you may&lt;br /&gt;
want to set START_ON_TOUCH to be TRUE so that your customers can just touch the object to start resizing.  You may also want to set SAY_STATUS to FALSE&lt;br /&gt;
so that a bunch of text doesn&#039;t get sent to the chat window (only seen by the owner, but can still be annoying to the end-user).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resizer ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Resizer&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 6/1/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use with menu:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1resizer to show the menu&lt;br /&gt;
// 3. Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
// 4. Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
//&lt;br /&gt;
// Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
// where x is the percentage of the original size you want to resize to.&lt;br /&gt;
//&lt;br /&gt;
// If using in a product with no other scripts, change START_ON_TOUCH below to TRUE&lt;br /&gt;
// so user can initiate resizing by just touching the object.&lt;br /&gt;
&lt;br /&gt;
integer START_ON_TOUCH = FALSE;&lt;br /&gt;
&lt;br /&gt;
// Display status messages in chat window (to owner only)&lt;br /&gt;
&lt;br /&gt;
integer SAY_STATUS = TRUE;&lt;br /&gt;
&lt;br /&gt;
// Channel to listen for commands on&lt;br /&gt;
&lt;br /&gt;
integer CHAT_CHANNEL = 1;&lt;br /&gt;
&lt;br /&gt;
// SL constraints&lt;br /&gt;
&lt;br /&gt;
float MIN_SIZE = .01;&lt;br /&gt;
float MAX_SIZE = 10;&lt;br /&gt;
float MAX_DISTANCE = 10; &lt;br /&gt;
float MIN_SCALE = .1;&lt;br /&gt;
&lt;br /&gt;
integer MENU_CHANNEL = -1001;&lt;br /&gt;
 &lt;br /&gt;
list backupPrims = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
float scale = 1.0;&lt;br /&gt;
&lt;br /&gt;
init_menu_channel() {&lt;br /&gt;
    MENU_CHANNEL = ((integer)(&amp;quot;0x&amp;quot; + llGetSubString((string)llGetKey(), -8, -1)) &amp;amp; 0x3FFFFFFF) ^ 0xBFFFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
say_status(string msg) {&lt;br /&gt;
    if (SAY_STATUS) llOwnerSay(msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        say_status(&amp;quot;Backing up prim positions and sizes.&amp;quot;);&lt;br /&gt;
        backupPrims = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        vector root_pos = &amp;lt;0, 0, 0&amp;gt;;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_POSITION, PRIM_SIZE]);&lt;br /&gt;
            vector pos = llList2Vector(params, 0);&lt;br /&gt;
            vector size = llList2Vector(params, 1);&lt;br /&gt;
            if (i == 1)&lt;br /&gt;
            {&lt;br /&gt;
                root_pos = pos;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pos = pos - root_pos;&lt;br /&gt;
            }&lt;br /&gt;
            backupPrims = backupPrims + pos + size;&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        say_status(&amp;quot;Prim positions and sizes backed up.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        say_status(&amp;quot;Restoring previously backed up positions and sizes.&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
            vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
            if (i == 1) {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        say_status(&amp;quot;Previously backed up prim positions and sizes restored.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    scale = 1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
finish() {&lt;br /&gt;
    say_status(&amp;quot;Deleting Resizer script.&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float min(float a, float b) {&lt;br /&gt;
    if (a &amp;lt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float max(float a, float b) {&lt;br /&gt;
    if (a &amp;gt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainMinMax(float value, float min, float max) {&lt;br /&gt;
    value = max(value, min);&lt;br /&gt;
    value = min(value, max);&lt;br /&gt;
    return value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainSize(float size) {&lt;br /&gt;
    return constrainMinMax(size, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainDistance(float distance) {&lt;br /&gt;
    return min(distance, MAX_DISTANCE);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
process() {&lt;br /&gt;
    backup();&lt;br /&gt;
 &lt;br /&gt;
    say_status(&amp;quot;Resizing prims to &amp;quot; + (string)llRound(scale * 100) + &amp;quot;% of original size.&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
        vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
 &lt;br /&gt;
        size.x = constrainSize(size.x * scale);&lt;br /&gt;
        size.y = constrainSize(size.y * scale);&lt;br /&gt;
        size.z = constrainSize(size.z * scale);&lt;br /&gt;
&lt;br /&gt;
        if (i == 1) {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            pos = pos * scale;&lt;br /&gt;
            pos.x = constrainDistance(pos.x);&lt;br /&gt;
            pos.y = constrainDistance(pos.y);&lt;br /&gt;
            pos.z = constrainDistance(pos.z);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    say_status(&amp;quot;Prims resized.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu() {&lt;br /&gt;
    llDialog(llGetOwner(),&lt;br /&gt;
    &amp;quot;Resizer\n\nMake a backup of your object first.\n\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
    [&amp;quot;Revert&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;Finish&amp;quot;, &amp;quot;-1%&amp;quot;, &amp;quot;-5%&amp;quot;, &amp;quot;-10%&amp;quot;, &amp;quot;+1%&amp;quot;, &amp;quot;+5%&amp;quot;, &amp;quot;+10%&amp;quot;], MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
handle_message(integer channel, string name, key id, string message) &lt;br /&gt;
{&lt;br /&gt;
    if (channel == CHAT_CHANNEL) {&lt;br /&gt;
        if (message == &amp;quot;resizer&amp;quot;) {&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (llSubStringIndex(message, &amp;quot;resizer&amp;quot;) == 0) {  &lt;br /&gt;
            list params = llParseString2List(message, [&amp;quot; &amp;quot;], [] );&lt;br /&gt;
            if (llGetListLength(params) == 2) {&lt;br /&gt;
                string scale_param = llList2String(params, 1);&lt;br /&gt;
                if (llGetSubString(scale_param, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
                    scale = (((float)llGetSubString(scale_param, 0, -2)) / 100);&lt;br /&gt;
                    scale = max(scale, MIN_SCALE);&lt;br /&gt;
                    process();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else if (channel == MENU_CHANNEL) {&lt;br /&gt;
        if (message == &amp;quot;Revert&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Finish&amp;quot;) {        &lt;br /&gt;
            finish();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (llGetSubString(message, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
            scale = scale + (((float)llGetSubString(message, 0, -2)) / 100);&lt;br /&gt;
            scale = max(scale, MIN_SCALE);&lt;br /&gt;
            process();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        if (START_ON_TOUCH) {&lt;br /&gt;
            // we only want a touch_start handler if we&#039;re going to use it&lt;br /&gt;
            // so change state rather than just testing inside touch_start&lt;br /&gt;
            // for START_ON_TOUCH to be true.&lt;br /&gt;
            state start_on_touch;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            llListen(CHAT_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            init_menu_channel();&lt;br /&gt;
            llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHAT_CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHAT_CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        handle_message(channel, name, id, message);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state start_on_touch&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHAT_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        init_menu_channel();&lt;br /&gt;
        llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch for resizer menu.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch for resizer menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        handle_message(channel, name, id, message);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        menu();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=933783</id>
		<title>User:Emma Nowhere</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=933783"/>
		<updated>2010-06-01T15:31:01Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mysterious Scripter&lt;br /&gt;
&lt;br /&gt;
==LSL Projects==&lt;br /&gt;
&lt;br /&gt;
[[Intra-Region_Update_Server]] - Centrally update objects such as Freeview screens or teleport pads&lt;br /&gt;
&lt;br /&gt;
[[User:Emma_Nowhere/Resizer|Resizer]] - Yet another resizer script&lt;br /&gt;
&lt;br /&gt;
==My Other SL-Related Projects==&lt;br /&gt;
&lt;br /&gt;
[http://www.nowherevirtual.com/ Nowhere Virtual] - LandSculptor, MapPainter&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere/Resizer&amp;diff=933722</id>
		<title>User:Emma Nowhere/Resizer</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere/Resizer&amp;diff=933722"/>
		<updated>2010-06-01T04:59:46Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: moved User:Emma Nowhere/Resizer to User:Emma Nowhere/Linkset Resizer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[User:Emma Nowhere/Linkset Resizer]]&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=933712</id>
		<title>Linkset Resizer 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=933712"/>
		<updated>2010-06-01T04:59:46Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: moved User:Emma Nowhere/Resizer to User:Emma Nowhere/Linkset Resizer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Resizer by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Yet another object resizer script.  Seeing as I was the person who originally opened the JIRA for [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams]&lt;br /&gt;
I thought I should put it to good use.  I like it more than the other resizer scripts out there, but of course, I&#039;m biased.  In any case, it never hurts to have more&lt;br /&gt;
code being shared.&lt;br /&gt;
&lt;br /&gt;
How to use with menu:&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
#Type /1resizer to show the menu&lt;br /&gt;
#Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
#Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
where x is the percentage of the original size you want to resize to.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resizer ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Resizer&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 5/30/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use with menu:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1resizer to show the menu&lt;br /&gt;
// 3. Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
// 4. Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
//&lt;br /&gt;
// Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
// where x is the percentage of the original size you want to resize to.&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
float MIN_SIZE = .01;&lt;br /&gt;
float MAX_SIZE = 10;&lt;br /&gt;
float MAX_DISTANCE = 10; &lt;br /&gt;
float MIN_SCALE = .1;&lt;br /&gt;
 &lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
integer MENU_CHANNEL = -1001;&lt;br /&gt;
 &lt;br /&gt;
list backupPrims = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
float scale = 1.0;&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Backing up prim positions and sizes.&amp;quot;);&lt;br /&gt;
        backupPrims = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        vector root_pos = &amp;lt;0, 0, 0&amp;gt;;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_POSITION, PRIM_SIZE]);&lt;br /&gt;
            vector pos = llList2Vector(params, 0);&lt;br /&gt;
            vector size = llList2Vector(params, 1);&lt;br /&gt;
            if (i == 1)&lt;br /&gt;
            {&lt;br /&gt;
                root_pos = pos;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pos = pos - root_pos;&lt;br /&gt;
            }&lt;br /&gt;
            backupPrims = backupPrims + pos + size;&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        llOwnerSay(&amp;quot;Prim positions and sizes backed up.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Restoring previously backed up positions and sizes.&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
            vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
            if (i == 1) {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;Previously backed up prim positions and sizes restored.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    scale = 1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
finish() {&lt;br /&gt;
    llOwnerSay(&amp;quot;Deleting Resizer script.&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float min(float a, float b) {&lt;br /&gt;
    if (a &amp;lt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float max(float a, float b) {&lt;br /&gt;
    if (a &amp;gt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainMinMax(float value, float min, float max) {&lt;br /&gt;
    value = max(value, min);&lt;br /&gt;
    value = min(value, max);&lt;br /&gt;
    return value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainSize(float size) {&lt;br /&gt;
    return constrainMinMax(size, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainDistance(float distance) {&lt;br /&gt;
    return min(distance, MAX_DISTANCE);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
process() {&lt;br /&gt;
    backup();&lt;br /&gt;
 &lt;br /&gt;
    llOwnerSay(&amp;quot;Resizing prims to &amp;quot; + (string)llRound(scale * 100) + &amp;quot;% of original size.&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
        vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
 &lt;br /&gt;
        size.x = constrainSize(size.x * scale);&lt;br /&gt;
        size.y = constrainSize(size.y * scale);&lt;br /&gt;
        size.z = constrainSize(size.z * scale);&lt;br /&gt;
&lt;br /&gt;
        if (i == 1) {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            pos = pos * scale;&lt;br /&gt;
            pos.x = constrainDistance(pos.x);&lt;br /&gt;
            pos.y = constrainDistance(pos.y);&lt;br /&gt;
            pos.z = constrainDistance(pos.z);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Prims resized.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu() {&lt;br /&gt;
    llDialog(llGetOwner(),&lt;br /&gt;
    &amp;quot;Resizer\n\nMake a backup of your object first.\n\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
    [&amp;quot;Restore&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;Finish&amp;quot;, &amp;quot;-1%&amp;quot;, &amp;quot;-5%&amp;quot;, &amp;quot;-10%&amp;quot;, &amp;quot;+1%&amp;quot;, &amp;quot;+5%&amp;quot;, &amp;quot;+10%&amp;quot;], MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;resizer&amp;quot;) {&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Restore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Finish&amp;quot;) {        &lt;br /&gt;
            finish();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (llSubStringIndex(message, &amp;quot;resizer&amp;quot;) == 0) {  &lt;br /&gt;
            list params = llParseString2List(message, [&amp;quot; &amp;quot;], [] );&lt;br /&gt;
            if (llGetListLength(params) == 2) {&lt;br /&gt;
                string scale_param = llList2String(params, 1);&lt;br /&gt;
                if (llGetSubString(scale_param, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
                    scale = (((float)llGetSubString(scale_param, 0, -2)) / 100);&lt;br /&gt;
                    scale = max(scale, MIN_SCALE);&lt;br /&gt;
                    process();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (llGetSubString(message, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
            scale = scale + (((float)llGetSubString(message, 0, -2)) / 100);&lt;br /&gt;
            scale = max(scale, MIN_SCALE);&lt;br /&gt;
            process();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=933702</id>
		<title>Linkset Resizer 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=933702"/>
		<updated>2010-06-01T04:09:59Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Resizer by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Yet another object resizer script.  Seeing as I was the person who originally opened the JIRA for [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams]&lt;br /&gt;
I thought I should put it to good use.  I like it more than the other resizer scripts out there, but of course, I&#039;m biased.  In any case, it never hurts to have more&lt;br /&gt;
code being shared.&lt;br /&gt;
&lt;br /&gt;
How to use with menu:&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
#Type /1resizer to show the menu&lt;br /&gt;
#Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
#Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
where x is the percentage of the original size you want to resize to.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resizer ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Resizer&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 5/30/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use with menu:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1resizer to show the menu&lt;br /&gt;
// 3. Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
// 4. Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
//&lt;br /&gt;
// Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
// where x is the percentage of the original size you want to resize to.&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
float MIN_SIZE = .01;&lt;br /&gt;
float MAX_SIZE = 10;&lt;br /&gt;
float MAX_DISTANCE = 10; &lt;br /&gt;
float MIN_SCALE = .1;&lt;br /&gt;
 &lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
integer MENU_CHANNEL = -1001;&lt;br /&gt;
 &lt;br /&gt;
list backupPrims = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
float scale = 1.0;&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Backing up prim positions and sizes.&amp;quot;);&lt;br /&gt;
        backupPrims = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        vector root_pos = &amp;lt;0, 0, 0&amp;gt;;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_POSITION, PRIM_SIZE]);&lt;br /&gt;
            vector pos = llList2Vector(params, 0);&lt;br /&gt;
            vector size = llList2Vector(params, 1);&lt;br /&gt;
            if (i == 1)&lt;br /&gt;
            {&lt;br /&gt;
                root_pos = pos;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pos = pos - root_pos;&lt;br /&gt;
            }&lt;br /&gt;
            backupPrims = backupPrims + pos + size;&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        llOwnerSay(&amp;quot;Prim positions and sizes backed up.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Restoring previously backed up positions and sizes.&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
            vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
            if (i == 1) {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;Previously backed up prim positions and sizes restored.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    scale = 1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
finish() {&lt;br /&gt;
    llOwnerSay(&amp;quot;Deleting Resizer script.&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float min(float a, float b) {&lt;br /&gt;
    if (a &amp;lt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float max(float a, float b) {&lt;br /&gt;
    if (a &amp;gt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainMinMax(float value, float min, float max) {&lt;br /&gt;
    value = max(value, min);&lt;br /&gt;
    value = min(value, max);&lt;br /&gt;
    return value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainSize(float size) {&lt;br /&gt;
    return constrainMinMax(size, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainDistance(float distance) {&lt;br /&gt;
    return min(distance, MAX_DISTANCE);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
process() {&lt;br /&gt;
    backup();&lt;br /&gt;
 &lt;br /&gt;
    llOwnerSay(&amp;quot;Resizing prims to &amp;quot; + (string)llRound(scale * 100) + &amp;quot;% of original size.&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
        vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
 &lt;br /&gt;
        size.x = constrainSize(size.x * scale);&lt;br /&gt;
        size.y = constrainSize(size.y * scale);&lt;br /&gt;
        size.z = constrainSize(size.z * scale);&lt;br /&gt;
&lt;br /&gt;
        if (i == 1) {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            pos = pos * scale;&lt;br /&gt;
            pos.x = constrainDistance(pos.x);&lt;br /&gt;
            pos.y = constrainDistance(pos.y);&lt;br /&gt;
            pos.z = constrainDistance(pos.z);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Prims resized.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu() {&lt;br /&gt;
    llDialog(llGetOwner(),&lt;br /&gt;
    &amp;quot;Resizer\n\nMake a backup of your object first.\n\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
    [&amp;quot;Restore&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;Finish&amp;quot;, &amp;quot;-1%&amp;quot;, &amp;quot;-5%&amp;quot;, &amp;quot;-10%&amp;quot;, &amp;quot;+1%&amp;quot;, &amp;quot;+5%&amp;quot;, &amp;quot;+10%&amp;quot;], MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;resizer&amp;quot;) {&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Restore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Finish&amp;quot;) {        &lt;br /&gt;
            finish();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (llSubStringIndex(message, &amp;quot;resizer&amp;quot;) == 0) {  &lt;br /&gt;
            list params = llParseString2List(message, [&amp;quot; &amp;quot;], [] );&lt;br /&gt;
            if (llGetListLength(params) == 2) {&lt;br /&gt;
                string scale_param = llList2String(params, 1);&lt;br /&gt;
                if (llGetSubString(scale_param, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
                    scale = (((float)llGetSubString(scale_param, 0, -2)) / 100);&lt;br /&gt;
                    scale = max(scale, MIN_SCALE);&lt;br /&gt;
                    process();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (llGetSubString(message, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
            scale = scale + (((float)llGetSubString(message, 0, -2)) / 100);&lt;br /&gt;
            scale = max(scale, MIN_SCALE);&lt;br /&gt;
            process();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=933692</id>
		<title>User:Emma Nowhere</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=933692"/>
		<updated>2010-06-01T04:09:05Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mysterious Scripter&lt;br /&gt;
&lt;br /&gt;
==LSL Projects==&lt;br /&gt;
&lt;br /&gt;
[[Intra-Region_Update_Server]] - Centrally update objects such as Freeview screens or teleport pads&lt;br /&gt;
&lt;br /&gt;
[[User:Emma_Nowhere/Resizer|Resizer]] - Yet another resizer script&lt;br /&gt;
&lt;br /&gt;
==My Other SL-Related Projects==&lt;br /&gt;
&lt;br /&gt;
[http://emmanowhere.blogspot.com/ Nowhere but here...] - My blog&lt;br /&gt;
&lt;br /&gt;
[http://www.photomovr.com/ PhotoMovr] - Convert Flickr photo sets into SL-Ready Quicktime movies for use as parcel media&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=933682</id>
		<title>Linkset Resizer 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Linkset_Resizer_2&amp;diff=933682"/>
		<updated>2010-06-01T04:05:45Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: Yet Another Resizer Script&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Resizer by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Yet another object resizer script.  Seeing as I was the person who originally open the JIRA for [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams]&lt;br /&gt;
I thought I should put it to good use.  I like it more than the other resizer scripts out there, but of course, I&#039;m biased.  In any case, it never hurts to have more&lt;br /&gt;
code being shared.&lt;br /&gt;
&lt;br /&gt;
How to use with menu:&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
#Type /1resizer to show the menu&lt;br /&gt;
#Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
#Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
where x is the percentage of the original size you want to resize to.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resizer ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Resizer&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 5/30/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use with menu:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1resizer to show the menu&lt;br /&gt;
// 3. Hit the appropriate buttons to scale up or down the linkset&lt;br /&gt;
// 4. Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
//&lt;br /&gt;
// Optionally, enter the percentage directly via chat by typing /1resizer x%&lt;br /&gt;
// where x is the percentage of the original size you want to resize to.&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
float MIN_SIZE = .01;&lt;br /&gt;
float MAX_SIZE = 10;&lt;br /&gt;
float MAX_DISTANCE = 10; &lt;br /&gt;
float MIN_SCALE = .1;&lt;br /&gt;
 &lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
integer MENU_CHANNEL = -1001;&lt;br /&gt;
 &lt;br /&gt;
list backupPrims = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
float scale = 1.0;&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Backing up prim positions and sizes.&amp;quot;);&lt;br /&gt;
        backupPrims = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        vector root_pos = &amp;lt;0, 0, 0&amp;gt;;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_POSITION, PRIM_SIZE]);&lt;br /&gt;
            vector pos = llList2Vector(params, 0);&lt;br /&gt;
            vector size = llList2Vector(params, 1);&lt;br /&gt;
            if (i == 1)&lt;br /&gt;
            {&lt;br /&gt;
                root_pos = pos;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pos = pos - root_pos;&lt;br /&gt;
            }&lt;br /&gt;
            backupPrims = backupPrims + pos + size;&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        llOwnerSay(&amp;quot;Prim positions and sizes backed up.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Restoring previously backed up positions and sizes.&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
            vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
            if (i == 1) {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;Previously backed up prim positions and sizes restored.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    scale = 1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
finish() {&lt;br /&gt;
    llOwnerSay(&amp;quot;Deleting Resizer script.&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float min(float a, float b) {&lt;br /&gt;
    if (a &amp;lt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float max(float a, float b) {&lt;br /&gt;
    if (a &amp;gt; b) return a;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainMinMax(float value, float min, float max) {&lt;br /&gt;
    value = max(value, min);&lt;br /&gt;
    value = min(value, max);&lt;br /&gt;
    return value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainSize(float size) {&lt;br /&gt;
    return constrainMinMax(size, MIN_SIZE, MAX_SIZE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float constrainDistance(float distance) {&lt;br /&gt;
    return min(distance, MAX_DISTANCE);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
process() {&lt;br /&gt;
    backup();&lt;br /&gt;
 &lt;br /&gt;
    llOwnerSay(&amp;quot;Resizing prims to &amp;quot; + (string)llRound(scale * 100) + &amp;quot;% of original size.&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector pos = llList2Vector(backupPrims, (i - 1) * 2);&lt;br /&gt;
        vector size = llList2Vector(backupPrims, ((i - 1) * 2) + 1);&lt;br /&gt;
 &lt;br /&gt;
        size.x = constrainSize(size.x * scale);&lt;br /&gt;
        size.y = constrainSize(size.y * scale);&lt;br /&gt;
        size.z = constrainSize(size.z * scale);&lt;br /&gt;
&lt;br /&gt;
        if (i == 1) {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            pos = pos * scale;&lt;br /&gt;
            pos.x = constrainDistance(pos.x);&lt;br /&gt;
            pos.y = constrainDistance(pos.y);&lt;br /&gt;
            pos.z = constrainDistance(pos.z);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_POSITION, pos, PRIM_SIZE, size]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Prims resized.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu() {&lt;br /&gt;
    llDialog(llGetOwner(),&lt;br /&gt;
    &amp;quot;Resizer\n\nMake a backup of your object first.\n\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
    [&amp;quot;Restore&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;Finish&amp;quot;, &amp;quot;-1%&amp;quot;, &amp;quot;-5%&amp;quot;, &amp;quot;-10%&amp;quot;, &amp;quot;+1%&amp;quot;, &amp;quot;+5%&amp;quot;, &amp;quot;+10%&amp;quot;], MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Ready&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Resizer Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;resizer for menu.&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;resizer&amp;quot;) {&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Restore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Finish&amp;quot;) {        &lt;br /&gt;
            finish();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (llSubStringIndex(message, &amp;quot;resizer&amp;quot;) == 0) {  &lt;br /&gt;
            list params = llParseString2List(message, [&amp;quot; &amp;quot;], [] );&lt;br /&gt;
            if (llGetListLength(params) == 2) {&lt;br /&gt;
                string scale_param = llList2String(params, 1);&lt;br /&gt;
                if (llGetSubString(scale_param, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
                    scale = (((float)llGetSubString(scale_param, 0, -2)) / 100);&lt;br /&gt;
                    scale = max(scale, MIN_SCALE);&lt;br /&gt;
                    process();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (llGetSubString(message, -1, -1) == &amp;quot;%&amp;quot;) {&lt;br /&gt;
            scale = scale + (((float)llGetSubString(message, 0, -2)) / 100);&lt;br /&gt;
            scale = max(scale, MIN_SCALE);&lt;br /&gt;
            process();&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=933073</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=933073"/>
		<updated>2010-05-30T18:14:45Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* About */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Now updated to use [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams].&lt;br /&gt;
&lt;br /&gt;
In Second Life, no prim can be less that .01 meters in any given dimension (width, length, or height).  When you try to resize an object, you often find you can&#039;t shrink it below a certain size.  This is because one of the prims in the object is already at it&#039;s minimum size in one of it&#039;s dimensions.  This script checks every prim in an object and slightly increases the sizes of the prims which are already at their smallest possible sizes, so that the overall object that the prim is part of can be scaled down.  This usually lets you reduce the object in size by an additional 20%.  You can repeat the process several times if you&#039;re not able to shrink the object enough on the first try.  &lt;br /&gt;
&lt;br /&gt;
In the instructions below, we&#039;ll refer to your object that you want to resize, such as a necklace or a tree, as a &amp;quot;linkset&amp;quot;.  We call it this because the object consists of a linked set of prims, rather than one single prim.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not familiar with how prims and linking work, please read the following wiki pages:&lt;br /&gt;
&lt;br /&gt;
[[Prim]]&lt;br /&gt;
&lt;br /&gt;
[[Link]]&lt;br /&gt;
&lt;br /&gt;
How to use with menu:&lt;br /&gt;
&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
#Type /1fsp to show the menu&lt;br /&gt;
#Hit the &amp;quot;Fix&amp;quot; button to fix all the small prims&lt;br /&gt;
#Resize the linkset object to the desired size with the Viewer Editing Tools&lt;br /&gt;
#Type /1fsp to show the menu again&lt;br /&gt;
#Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(Advanced) How to use with chat commands:&lt;br /&gt;
&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;).&lt;br /&gt;
#Type /1fsprun to fix all the small prims&lt;br /&gt;
#Resize the linkset object to the desired size with the Viewer Editing Tools&lt;br /&gt;
#Type /1fsprestore if you need to return them to their original sizes (you should only use this for no-copy objects, otherwise make a copy before you start)&lt;br /&gt;
#Type /1fspcleanup to remove the scripts from the linkset and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FixSmallPrims ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims2&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 5/30/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use with menu:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fsp to show the menu&lt;br /&gt;
// 3. Hit the &amp;quot;Fix&amp;quot; button to fix all the small prims&lt;br /&gt;
// 4. Resize the linkset object to the desired size with the Editing Tools&lt;br /&gt;
// 5. Type /1fsp to show the menu again&lt;br /&gt;
// 6. Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
//&lt;br /&gt;
// (Advanced) How to use via chat commands:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fsp to show the menu&lt;br /&gt;
// 3. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 4. Resize the linkset object to the desired size with the Editing Tools&lt;br /&gt;
// 5. Type /1fsprestore to return them to their original sizes&lt;br /&gt;
// 6. Type /1fspcleanup to remove the script and finalize prim sizes&lt;br /&gt;
 &lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
integer MENU_CHANNEL = -1001;&lt;br /&gt;
 &lt;br /&gt;
list backupScales = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
 &lt;br /&gt;
list rescaleFlags = [];&lt;br /&gt;
 &lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Backing up prim sizes&amp;quot;);&lt;br /&gt;
        backupScales = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
            vector scale = llList2Vector(params, 0);&lt;br /&gt;
            backupScales = backupScales + [scale];&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        llOwnerSay(&amp;quot;Prim sizes backed up&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Restoring previously backed up prim sizes&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector scale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;Previously backed up prim sizes restored&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
cleanup() {&lt;br /&gt;
    llOwnerSay(&amp;quot;Cleaning up FixSmallPrims data and finalizing prim sizes&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector backupScale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
        integer rescaleI = (i - 1) * 3;&lt;br /&gt;
        integer rescaleX = llList2Integer(rescaleFlags, rescaleI);&lt;br /&gt;
        integer rescaleY = llList2Integer(rescaleFlags, rescaleI + 1);&lt;br /&gt;
        integer rescaleZ = llList2Integer(rescaleFlags, rescaleI + 2);&lt;br /&gt;
 &lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleX) {&lt;br /&gt;
            scale.x = backupScale.x;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleY) {&lt;br /&gt;
            scale.y = backupScale.y;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleZ) {&lt;br /&gt;
            scale.z = backupScale.z;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Cleaning size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    llOwnerSay(&amp;quot;Deleting FixSmallPrims script&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
 &lt;br /&gt;
    llOwnerSay(&amp;quot;Starting fixing prims&amp;quot;);&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
 &lt;br /&gt;
        integer rescaleX = FALSE;&lt;br /&gt;
        integer rescaleY = FALSE;&lt;br /&gt;
        integer rescaleZ = FALSE;&lt;br /&gt;
 &lt;br /&gt;
        if (scale.x &amp;lt; .015) {&lt;br /&gt;
            scale.x = .015;&lt;br /&gt;
            rescaleX = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (scale.y &amp;lt; .015) {&lt;br /&gt;
            scale.y = .015;&lt;br /&gt;
            rescaleY = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (scale.z &amp;lt; .015) {&lt;br /&gt;
            scale.z = .015;&lt;br /&gt;
            rescaleZ = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Fixing size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        rescaleFlags = rescaleFlags + [rescaleX, rescaleY, rescaleZ];&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Done fixing prims\n\nResize your object and type /&amp;quot; + (string)CHANNEL + &amp;quot;fsp for menu when done.\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu() {&lt;br /&gt;
    llDialog(llGetOwner(),&lt;br /&gt;
    &amp;quot;Fix Small Prims\n\nMake a backup of your object first.\n\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
    [&amp;quot;Fix&amp;quot;, &amp;quot;Finish&amp;quot;], MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Ready&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;fsp for menu&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;fsp for menu&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;fsp&amp;quot;) {&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;FixSmallPrims script is installed and ready&amp;quot;);            &lt;br /&gt;
            if (backupStored) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Original prim sizes have been backed up&amp;quot;);            &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if ((message == &amp;quot;fspcleanup&amp;quot;) || (message == &amp;quot;Finish&amp;quot;)) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if ((message == &amp;quot;fsprun&amp;quot;) || (message == &amp;quot;Fix&amp;quot;)) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=933063</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=933063"/>
		<updated>2010-05-30T18:13:53Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* About */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Now updated to use [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams].&lt;br /&gt;
&lt;br /&gt;
In Second Life, no prim can be less that .01 meters in any given dimension (width, length, or height).  When you try to resize an object, you often find you can&#039;t shrink it below a certain size.  This is because one of the prims in the object is already at it&#039;s minimum size in one of it&#039;s dimensions.  This script checks every prim in an object and slightly increases the sizes of the prims which are already at their smallest possible sizes, so that the overall object that the prim is part of can be scaled down.  This usually lets you reduce the object in size by an additional 20%.  You can repeat the process several times if you&#039;re not able to shrink the object enough on the first try.  &lt;br /&gt;
&lt;br /&gt;
In the instructions below, we&#039;ll refer to your object that you want to resize, such as a necklace or a tree, as a &amp;quot;linkset&amp;quot;.  We call it this because the object consists of a linked set of prims, rather than one single prim.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not familiar with how prims and linking work, please read the following wiki pages:&lt;br /&gt;
&lt;br /&gt;
[[Prim]]&lt;br /&gt;
&lt;br /&gt;
[[Link]]&lt;br /&gt;
&lt;br /&gt;
How to use with menu:&lt;br /&gt;
&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
#Type /1fsp to show the menu&lt;br /&gt;
#Hit the &amp;quot;Fix&amp;quot; button to fix all the small prims&lt;br /&gt;
#Resize the linkset object to the desired size with the Editing Tools&lt;br /&gt;
#Type /1fsp to show the menu again&lt;br /&gt;
#Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(Advanced) How to use with chat commands:&lt;br /&gt;
&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;).&lt;br /&gt;
#Type /1fsprun to fix all the small prims&lt;br /&gt;
#Resize the linkset object to the desired size using the Second Life editing tools&lt;br /&gt;
#Type /1fsprestore if you need to return them to their original sizes (you should only use this for no-copy objects, otherwise make a copy before you start)&lt;br /&gt;
#Type /1fspcleanup to remove the scripts from the linkset and finalize prim sizes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FixSmallPrims ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims2&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 5/30/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use with menu:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fsp to show the menu&lt;br /&gt;
// 3. Hit the &amp;quot;Fix&amp;quot; button to fix all the small prims&lt;br /&gt;
// 4. Resize the linkset object to the desired size with the Editing Tools&lt;br /&gt;
// 5. Type /1fsp to show the menu again&lt;br /&gt;
// 6. Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
//&lt;br /&gt;
// (Advanced) How to use via chat commands:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fsp to show the menu&lt;br /&gt;
// 3. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 4. Resize the linkset object to the desired size with the Editing Tools&lt;br /&gt;
// 5. Type /1fsprestore to return them to their original sizes&lt;br /&gt;
// 6. Type /1fspcleanup to remove the script and finalize prim sizes&lt;br /&gt;
 &lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
integer MENU_CHANNEL = -1001;&lt;br /&gt;
 &lt;br /&gt;
list backupScales = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
 &lt;br /&gt;
list rescaleFlags = [];&lt;br /&gt;
 &lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Backing up prim sizes&amp;quot;);&lt;br /&gt;
        backupScales = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
            vector scale = llList2Vector(params, 0);&lt;br /&gt;
            backupScales = backupScales + [scale];&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        llOwnerSay(&amp;quot;Prim sizes backed up&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Restoring previously backed up prim sizes&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector scale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;Previously backed up prim sizes restored&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
cleanup() {&lt;br /&gt;
    llOwnerSay(&amp;quot;Cleaning up FixSmallPrims data and finalizing prim sizes&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector backupScale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
        integer rescaleI = (i - 1) * 3;&lt;br /&gt;
        integer rescaleX = llList2Integer(rescaleFlags, rescaleI);&lt;br /&gt;
        integer rescaleY = llList2Integer(rescaleFlags, rescaleI + 1);&lt;br /&gt;
        integer rescaleZ = llList2Integer(rescaleFlags, rescaleI + 2);&lt;br /&gt;
 &lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleX) {&lt;br /&gt;
            scale.x = backupScale.x;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleY) {&lt;br /&gt;
            scale.y = backupScale.y;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleZ) {&lt;br /&gt;
            scale.z = backupScale.z;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Cleaning size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    llOwnerSay(&amp;quot;Deleting FixSmallPrims script&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
 &lt;br /&gt;
    llOwnerSay(&amp;quot;Starting fixing prims&amp;quot;);&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
 &lt;br /&gt;
        integer rescaleX = FALSE;&lt;br /&gt;
        integer rescaleY = FALSE;&lt;br /&gt;
        integer rescaleZ = FALSE;&lt;br /&gt;
 &lt;br /&gt;
        if (scale.x &amp;lt; .015) {&lt;br /&gt;
            scale.x = .015;&lt;br /&gt;
            rescaleX = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (scale.y &amp;lt; .015) {&lt;br /&gt;
            scale.y = .015;&lt;br /&gt;
            rescaleY = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (scale.z &amp;lt; .015) {&lt;br /&gt;
            scale.z = .015;&lt;br /&gt;
            rescaleZ = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Fixing size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        rescaleFlags = rescaleFlags + [rescaleX, rescaleY, rescaleZ];&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Done fixing prims\n\nResize your object and type /&amp;quot; + (string)CHANNEL + &amp;quot;fsp for menu when done.\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu() {&lt;br /&gt;
    llDialog(llGetOwner(),&lt;br /&gt;
    &amp;quot;Fix Small Prims\n\nMake a backup of your object first.\n\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
    [&amp;quot;Fix&amp;quot;, &amp;quot;Finish&amp;quot;], MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Ready&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;fsp for menu&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;fsp for menu&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;fsp&amp;quot;) {&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;FixSmallPrims script is installed and ready&amp;quot;);            &lt;br /&gt;
            if (backupStored) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Original prim sizes have been backed up&amp;quot;);            &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if ((message == &amp;quot;fspcleanup&amp;quot;) || (message == &amp;quot;Finish&amp;quot;)) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if ((message == &amp;quot;fsprun&amp;quot;) || (message == &amp;quot;Fix&amp;quot;)) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=933053</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=933053"/>
		<updated>2010-05-30T18:11:38Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* FixSmallPrims */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Now updated to use [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams].&lt;br /&gt;
&lt;br /&gt;
In Second Life, no prim can be less that .01 meters in any given dimension (width, length, or height).  When you try to resize an object, you often find you can&#039;t shrink it below a certain size.  This is because one of the prims in the object is already at it&#039;s minimum size in one of it&#039;s dimensions.  This script checks every prim in an object and slightly increases the sizes of the prims which are already at their smallest possible sizes, so that the overall object that the prim is part of can be scaled down.  This usually lets you reduce the object in size by an additional 20%.  You can repeat the process several times if you&#039;re not able to shrink the object enough on the first try.  &lt;br /&gt;
&lt;br /&gt;
In the instructions below, we&#039;ll refer to your object that you want to resize, such as a necklace or a tree, as a &amp;quot;linkset&amp;quot;.  We call it this because the object consists of a linked set of prims, rather than one single prim.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not familiar with how prims and linking work, please read the following wiki pages:&lt;br /&gt;
&lt;br /&gt;
[[Prim]]&lt;br /&gt;
&lt;br /&gt;
[[Link]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How to use:&lt;br /&gt;
&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;).&lt;br /&gt;
#Type /1fsprun to fix all the small prims&lt;br /&gt;
#Resize the linkset object to the desired size using the Second Life editing tools&lt;br /&gt;
#Type /1fsprestore if you need to return them to their original sizes (you should only use this for no-copy objects, otherwise make a copy before you start)&lt;br /&gt;
#Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FixSmallPrims ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims2&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 5/30/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use with menu:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fsp to show the menu&lt;br /&gt;
// 3. Hit the &amp;quot;Fix&amp;quot; button to fix all the small prims&lt;br /&gt;
// 4. Resize the linkset object to the desired size with the Editing Tools&lt;br /&gt;
// 5. Type /1fsp to show the menu again&lt;br /&gt;
// 6. Hit the &amp;quot;Finish&amp;quot; button to remove the script and finalize prim sizes&lt;br /&gt;
//&lt;br /&gt;
// (Advanced) How to use via chat commands:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fsp to show the menu&lt;br /&gt;
// 3. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 4. Resize the linkset object to the desired size with the Editing Tools&lt;br /&gt;
// 5. Type /1fsprestore to return them to their original sizes&lt;br /&gt;
// 6. Type /1fspcleanup to remove the script and finalize prim sizes&lt;br /&gt;
 &lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
integer MENU_CHANNEL = -1001;&lt;br /&gt;
 &lt;br /&gt;
list backupScales = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
 &lt;br /&gt;
list rescaleFlags = [];&lt;br /&gt;
 &lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Backing up prim sizes&amp;quot;);&lt;br /&gt;
        backupScales = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
            vector scale = llList2Vector(params, 0);&lt;br /&gt;
            backupScales = backupScales + [scale];&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        llOwnerSay(&amp;quot;Prim sizes backed up&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Restoring previously backed up prim sizes&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector scale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;Previously backed up prim sizes restored&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
cleanup() {&lt;br /&gt;
    llOwnerSay(&amp;quot;Cleaning up FixSmallPrims data and finalizing prim sizes&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector backupScale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
        integer rescaleI = (i - 1) * 3;&lt;br /&gt;
        integer rescaleX = llList2Integer(rescaleFlags, rescaleI);&lt;br /&gt;
        integer rescaleY = llList2Integer(rescaleFlags, rescaleI + 1);&lt;br /&gt;
        integer rescaleZ = llList2Integer(rescaleFlags, rescaleI + 2);&lt;br /&gt;
 &lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleX) {&lt;br /&gt;
            scale.x = backupScale.x;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleY) {&lt;br /&gt;
            scale.y = backupScale.y;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleZ) {&lt;br /&gt;
            scale.z = backupScale.z;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Cleaning size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    llOwnerSay(&amp;quot;Deleting FixSmallPrims script&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
 &lt;br /&gt;
    llOwnerSay(&amp;quot;Starting fixing prims&amp;quot;);&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
 &lt;br /&gt;
        integer rescaleX = FALSE;&lt;br /&gt;
        integer rescaleY = FALSE;&lt;br /&gt;
        integer rescaleZ = FALSE;&lt;br /&gt;
 &lt;br /&gt;
        if (scale.x &amp;lt; .015) {&lt;br /&gt;
            scale.x = .015;&lt;br /&gt;
            rescaleX = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (scale.y &amp;lt; .015) {&lt;br /&gt;
            scale.y = .015;&lt;br /&gt;
            rescaleY = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (scale.z &amp;lt; .015) {&lt;br /&gt;
            scale.z = .015;&lt;br /&gt;
            rescaleZ = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Fixing size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        rescaleFlags = rescaleFlags + [rescaleX, rescaleY, rescaleZ];&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Done fixing prims\n\nResize your object and type /&amp;quot; + (string)CHANNEL + &amp;quot;fsp for menu when done.\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
menu() {&lt;br /&gt;
    llDialog(llGetOwner(),&lt;br /&gt;
    &amp;quot;Fix Small Prims\n\nMake a backup of your object first.\n\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
    [&amp;quot;Fix&amp;quot;, &amp;quot;Finish&amp;quot;], MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Ready&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;fsp for menu&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Type /&amp;quot; + (string)CHANNEL + &amp;quot;fsp for menu&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;fsp&amp;quot;) {&lt;br /&gt;
            menu();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;FixSmallPrims script is installed and ready&amp;quot;);            &lt;br /&gt;
            if (backupStored) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Original prim sizes have been backed up&amp;quot;);            &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if ((message == &amp;quot;fspcleanup&amp;quot;) || (message == &amp;quot;Finish&amp;quot;)) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if ((message == &amp;quot;fsprun&amp;quot;) || (message == &amp;quot;Fix&amp;quot;)) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=929922</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=929922"/>
		<updated>2010-05-27T03:06:11Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Now updated to use [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams].&lt;br /&gt;
&lt;br /&gt;
In Second Life, no prim can be less that .01 meters in any given dimension (width, length, or height).  When you try to resize an object, you often find you can&#039;t shrink it below a certain size.  This is because one of the prims in the object is already at it&#039;s minimum size in one of it&#039;s dimensions.  This script checks every prim in an object and slightly increases the sizes of the prims which are already at their smallest possible sizes, so that the overall object that the prim is part of can be scaled down.  This usually lets you reduce the object in size by an additional 20%.  You can repeat the process several times if you&#039;re not able to shrink the object enough on the first try.  &lt;br /&gt;
&lt;br /&gt;
In the instructions below, we&#039;ll refer to your object that you want to resize, such as a necklace or a tree, as a &amp;quot;linkset&amp;quot;.  We call it this because the object consists of a linked set of prims, rather than one single prim.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not familiar with how prims and linking work, please read the following wiki pages:&lt;br /&gt;
&lt;br /&gt;
[[Prim]]&lt;br /&gt;
&lt;br /&gt;
[[Link]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How to use:&lt;br /&gt;
&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;).&lt;br /&gt;
#Type /1fsprun to fix all the small prims&lt;br /&gt;
#Resize the linkset object to the desired size using the Second Life editing tools&lt;br /&gt;
#Type /1fsprestore if you need to return them to their original sizes (you should only use this for no-copy objects, otherwise make a copy before you start)&lt;br /&gt;
#Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FixSmallPrims ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims2&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 4/26/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 3. Resize the linkset object to the desired size&lt;br /&gt;
// 4. Type /1fsprestore to return them to their original sizes&lt;br /&gt;
// 5. Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
&lt;br /&gt;
list backupScales = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
list rescaleFlags = [];&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Backing up prim sizes&amp;quot;);&lt;br /&gt;
        backupScales = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
            vector scale = llList2Vector(params, 0);&lt;br /&gt;
            backupScales = backupScales + [scale];&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        llOwnerSay(&amp;quot;Prim sizes backed up&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Restoring previously backed up prim sizes&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector scale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;Previously backed up prim sizes restored&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cleanup() {&lt;br /&gt;
    llOwnerSay(&amp;quot;Cleaning up FixSmallPrims data and finalizing prim sizes&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector backupScale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
        integer rescaleI = (i - 1) * 3;&lt;br /&gt;
        integer rescaleX = llList2Integer(rescaleFlags, rescaleI);&lt;br /&gt;
        integer rescaleY = llList2Integer(rescaleFlags, rescaleI + 1);&lt;br /&gt;
        integer rescaleZ = llList2Integer(rescaleFlags, rescaleI + 2);&lt;br /&gt;
        &lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
        &lt;br /&gt;
        if (rescaleX) {&lt;br /&gt;
            scale.x = backupScale.x;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleY) {&lt;br /&gt;
            scale.y = backupScale.y;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleZ) {&lt;br /&gt;
            scale.z = backupScale.z;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Cleaning size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llOwnerSay(&amp;quot;Deleting FixSmallPrims script&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
&lt;br /&gt;
    llOwnerSay(&amp;quot;Starting fixing prims&amp;quot;);&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
&lt;br /&gt;
        integer rescaleX = FALSE;&lt;br /&gt;
        integer rescaleY = FALSE;&lt;br /&gt;
        integer rescaleZ = FALSE;&lt;br /&gt;
        &lt;br /&gt;
        if (scale.x &amp;lt; .015) {&lt;br /&gt;
            scale.x = .015;&lt;br /&gt;
            rescaleX = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (scale.y &amp;lt; .015) {&lt;br /&gt;
            scale.y = .015;&lt;br /&gt;
            rescaleY = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (scale.z &amp;lt; .015) {&lt;br /&gt;
            scale.z = .015;&lt;br /&gt;
            rescaleZ = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Fixing size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        rescaleFlags = rescaleFlags + [rescaleX, rescaleY, rescaleZ];&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Done fixing prims&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Ready&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        if (message == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;FixSmallPrims script is installed and ready&amp;quot;);            &lt;br /&gt;
            if (backupStored) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Original prim sizes have been backed up&amp;quot;);            &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspcleanup&amp;quot;) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprun&amp;quot;) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=929912</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=929912"/>
		<updated>2010-05-27T03:05:52Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Now updated to use [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams].&lt;br /&gt;
&lt;br /&gt;
In Second Life, no prim can be less that .01 meters in any given dimension (width, length, or height).  When you try to resize an object, you often find you can&#039;t shrink it below a certain size.  This is because one of the prims in the object is already at it&#039;s minimum size in one of it&#039;s dimensions.  This script checks every prim in an object and slightly increases the sizes of the prims which are already at their smallest possible sizes, so that the overall object that the prim is part of can be scaled down.  This usually lets you reduce the object in size by an additional 20%.  You can repeat the process several times if you&#039;re not able to shrink the object enough on the first try.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the instructions below, we&#039;ll refer to your object that you want to resize, such as a necklace or a tree, as a &amp;quot;linkset&amp;quot;.  We call it this because the object consists of a linked set of prims, rather than one single prim.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not familiar with how prims and linking work, please read the following wiki pages:&lt;br /&gt;
&lt;br /&gt;
[[Prim]]&lt;br /&gt;
&lt;br /&gt;
[[Link]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How to use:&lt;br /&gt;
&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;).&lt;br /&gt;
#Type /1fsprun to fix all the small prims&lt;br /&gt;
#Resize the linkset object to the desired size using the Second Life editing tools&lt;br /&gt;
#Type /1fsprestore if you need to return them to their original sizes (you should only use this for no-copy objects, otherwise make a copy before you start)&lt;br /&gt;
#Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FixSmallPrims ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims2&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 4/26/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 3. Resize the linkset object to the desired size&lt;br /&gt;
// 4. Type /1fsprestore to return them to their original sizes&lt;br /&gt;
// 5. Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
&lt;br /&gt;
list backupScales = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
list rescaleFlags = [];&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Backing up prim sizes&amp;quot;);&lt;br /&gt;
        backupScales = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
            vector scale = llList2Vector(params, 0);&lt;br /&gt;
            backupScales = backupScales + [scale];&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        llOwnerSay(&amp;quot;Prim sizes backed up&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Restoring previously backed up prim sizes&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector scale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;Previously backed up prim sizes restored&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cleanup() {&lt;br /&gt;
    llOwnerSay(&amp;quot;Cleaning up FixSmallPrims data and finalizing prim sizes&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector backupScale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
        integer rescaleI = (i - 1) * 3;&lt;br /&gt;
        integer rescaleX = llList2Integer(rescaleFlags, rescaleI);&lt;br /&gt;
        integer rescaleY = llList2Integer(rescaleFlags, rescaleI + 1);&lt;br /&gt;
        integer rescaleZ = llList2Integer(rescaleFlags, rescaleI + 2);&lt;br /&gt;
        &lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
        &lt;br /&gt;
        if (rescaleX) {&lt;br /&gt;
            scale.x = backupScale.x;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleY) {&lt;br /&gt;
            scale.y = backupScale.y;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleZ) {&lt;br /&gt;
            scale.z = backupScale.z;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Cleaning size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llOwnerSay(&amp;quot;Deleting FixSmallPrims script&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
&lt;br /&gt;
    llOwnerSay(&amp;quot;Starting fixing prims&amp;quot;);&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
&lt;br /&gt;
        integer rescaleX = FALSE;&lt;br /&gt;
        integer rescaleY = FALSE;&lt;br /&gt;
        integer rescaleZ = FALSE;&lt;br /&gt;
        &lt;br /&gt;
        if (scale.x &amp;lt; .015) {&lt;br /&gt;
            scale.x = .015;&lt;br /&gt;
            rescaleX = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (scale.y &amp;lt; .015) {&lt;br /&gt;
            scale.y = .015;&lt;br /&gt;
            rescaleY = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (scale.z &amp;lt; .015) {&lt;br /&gt;
            scale.z = .015;&lt;br /&gt;
            rescaleZ = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Fixing size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        rescaleFlags = rescaleFlags + [rescaleX, rescaleY, rescaleZ];&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Done fixing prims&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Ready&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        if (message == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;FixSmallPrims script is installed and ready&amp;quot;);            &lt;br /&gt;
            if (backupStored) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Original prim sizes have been backed up&amp;quot;);            &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspcleanup&amp;quot;) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprun&amp;quot;) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=929902</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=929902"/>
		<updated>2010-05-27T03:04:01Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Now updated to use [https://jira.secondlife.com/browse/SVC-224 LLGetLinkPrimitiveParams].&lt;br /&gt;
&lt;br /&gt;
In Second Life, no prim can be less that .01 meters in any given dimension (width, length, or height).  When you try to resize an object, you often find you can&#039;t shrink it below a certain size.  This is because one of the prims in the object is already at it&#039;s minimum size in one of it&#039;s dimensions.  This script checks every prim in an object and slightly increases the sizes of the prims which are already at their smallest possible sizes, so that the overall object that the prim is part of can be scaled down.  This usually lets you reduce the object in size by an additional 20%.  You can repeat the process several times if you&#039;re not able to shrink the object enough on the first try.  &lt;br /&gt;
&lt;br /&gt;
In the instructions below, we&#039;ll refer to your object that you want to resize, such as a necklace or a tree, as a &amp;quot;linkset&amp;quot;.  We call it this because the object consists of a linked set of prims, rather than one single prim.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not familiar with how prims and linking work, please read the following wiki pages:&lt;br /&gt;
&lt;br /&gt;
[[Prim]]&lt;br /&gt;
&lt;br /&gt;
[[Link]]&lt;br /&gt;
&lt;br /&gt;
How to use:&lt;br /&gt;
&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;).&lt;br /&gt;
#Type /1fsprun to fix all the small prims&lt;br /&gt;
#Resize the linkset object to the desired size using the Second Life editing tools&lt;br /&gt;
#Type /1fsprestore if you need to return them to their original sizes (you should only use this for no-copy objects, otherwise make a copy before you start)&lt;br /&gt;
#Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FixSmallPrims ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims2&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 4/26/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 3. Resize the linkset object to the desired size&lt;br /&gt;
// 4. Type /1fsprestore to return them to their original sizes&lt;br /&gt;
// 5. Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
&lt;br /&gt;
list backupScales = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
list rescaleFlags = [];&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Backing up prim sizes&amp;quot;);&lt;br /&gt;
        backupScales = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
            vector scale = llList2Vector(params, 0);&lt;br /&gt;
            backupScales = backupScales + [scale];&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        llOwnerSay(&amp;quot;Prim sizes backed up&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Restoring previously backed up prim sizes&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector scale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;Previously backed up prim sizes restored&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cleanup() {&lt;br /&gt;
    llOwnerSay(&amp;quot;Cleaning up FixSmallPrims data and finalizing prim sizes&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector backupScale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
        integer rescaleI = (i - 1) * 3;&lt;br /&gt;
        integer rescaleX = llList2Integer(rescaleFlags, rescaleI);&lt;br /&gt;
        integer rescaleY = llList2Integer(rescaleFlags, rescaleI + 1);&lt;br /&gt;
        integer rescaleZ = llList2Integer(rescaleFlags, rescaleI + 2);&lt;br /&gt;
        &lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
        &lt;br /&gt;
        if (rescaleX) {&lt;br /&gt;
            scale.x = backupScale.x;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleY) {&lt;br /&gt;
            scale.y = backupScale.y;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleZ) {&lt;br /&gt;
            scale.z = backupScale.z;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Cleaning size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llOwnerSay(&amp;quot;Deleting FixSmallPrims script&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
&lt;br /&gt;
    llOwnerSay(&amp;quot;Starting fixing prims&amp;quot;);&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
&lt;br /&gt;
        integer rescaleX = FALSE;&lt;br /&gt;
        integer rescaleY = FALSE;&lt;br /&gt;
        integer rescaleZ = FALSE;&lt;br /&gt;
        &lt;br /&gt;
        if (scale.x &amp;lt; .015) {&lt;br /&gt;
            scale.x = .015;&lt;br /&gt;
            rescaleX = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (scale.y &amp;lt; .015) {&lt;br /&gt;
            scale.y = .015;&lt;br /&gt;
            rescaleY = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (scale.z &amp;lt; .015) {&lt;br /&gt;
            scale.z = .015;&lt;br /&gt;
            rescaleZ = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Fixing size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        rescaleFlags = rescaleFlags + [rescaleX, rescaleY, rescaleZ];&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Done fixing prims&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Ready&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        if (message == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;FixSmallPrims script is installed and ready&amp;quot;);            &lt;br /&gt;
            if (backupStored) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Original prim sizes have been backed up&amp;quot;);            &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspcleanup&amp;quot;) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprun&amp;quot;) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=929892</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=929892"/>
		<updated>2010-05-27T03:03:29Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: Updated to use LLGetLinkPrimitiveParams as per SVC-224&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Now updated to use [https://jira.secondlife.com/browse/SVC-224 | LLGetLinkPrimitiveParams].&lt;br /&gt;
&lt;br /&gt;
In Second Life, no prim can be less that .01 meters in any given dimension (width, length, or height).  When you try to resize an object, you often find you can&#039;t shrink it below a certain size.  This is because one of the prims in the object is already at it&#039;s minimum size in one of it&#039;s dimensions.  This script checks every prim in an object and slightly increases the sizes of the prims which are already at their smallest possible sizes, so that the overall object that the prim is part of can be scaled down.  This usually lets you reduce the object in size by an additional 20%.  You can repeat the process several times if you&#039;re not able to shrink the object enough on the first try.  &lt;br /&gt;
&lt;br /&gt;
In the instructions below, we&#039;ll refer to your object that you want to resize, such as a necklace or a tree, as a &amp;quot;linkset&amp;quot;.  We call it this because the object consists of a linked set of prims, rather than one single prim.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not familiar with how prims and linking work, please read the following wiki pages:&lt;br /&gt;
&lt;br /&gt;
[[Prim]]&lt;br /&gt;
&lt;br /&gt;
[[Link]]&lt;br /&gt;
&lt;br /&gt;
How to use:&lt;br /&gt;
&lt;br /&gt;
#Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;).&lt;br /&gt;
#Type /1fsprun to fix all the small prims&lt;br /&gt;
#Resize the linkset object to the desired size using the Second Life editing tools&lt;br /&gt;
#Type /1fsprestore if you need to return them to their original sizes (you should only use this for no-copy objects, otherwise make a copy before you start)&lt;br /&gt;
#Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT:&#039;&#039;&#039;  You should always make a backup copy of the object before using this script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FixSmallPrims ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims2&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// Last modified: 4/26/2010&lt;br /&gt;
//&lt;br /&gt;
// How to use:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 3. Resize the linkset object to the desired size&lt;br /&gt;
// 4. Type /1fsprestore to return them to their original sizes&lt;br /&gt;
// 5. Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
&lt;br /&gt;
list backupScales = [];&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
list rescaleFlags = [];&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Backing up prim sizes&amp;quot;);&lt;br /&gt;
        backupScales = [];&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
            vector scale = llList2Vector(params, 0);&lt;br /&gt;
            backupScales = backupScales + [scale];&lt;br /&gt;
        }&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
        llOwnerSay(&amp;quot;Prim sizes backed up&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Restoring previously backed up prim sizes&amp;quot;);&lt;br /&gt;
        integer p = llGetNumberOfPrims();&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
        {&lt;br /&gt;
            vector scale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;Previously backed up prim sizes restored&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cleanup() {&lt;br /&gt;
    llOwnerSay(&amp;quot;Cleaning up FixSmallPrims data and finalizing prim sizes&amp;quot;);&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        vector backupScale = llList2Vector(backupScales, i - 1);&lt;br /&gt;
        integer rescaleI = (i - 1) * 3;&lt;br /&gt;
        integer rescaleX = llList2Integer(rescaleFlags, rescaleI);&lt;br /&gt;
        integer rescaleY = llList2Integer(rescaleFlags, rescaleI + 1);&lt;br /&gt;
        integer rescaleZ = llList2Integer(rescaleFlags, rescaleI + 2);&lt;br /&gt;
        &lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
        &lt;br /&gt;
        if (rescaleX) {&lt;br /&gt;
            scale.x = backupScale.x;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleY) {&lt;br /&gt;
            scale.y = backupScale.y;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleZ) {&lt;br /&gt;
            scale.z = backupScale.z;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Cleaning size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llOwnerSay(&amp;quot;Deleting FixSmallPrims script&amp;quot;);&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
&lt;br /&gt;
    llOwnerSay(&amp;quot;Starting fixing prims&amp;quot;);&lt;br /&gt;
    rescaleFlags = [];&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 1; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE]);&lt;br /&gt;
        vector scale = llList2Vector(params, 0);&lt;br /&gt;
&lt;br /&gt;
        integer rescaleX = FALSE;&lt;br /&gt;
        integer rescaleY = FALSE;&lt;br /&gt;
        integer rescaleZ = FALSE;&lt;br /&gt;
        &lt;br /&gt;
        if (scale.x &amp;lt; .015) {&lt;br /&gt;
            scale.x = .015;&lt;br /&gt;
            rescaleX = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (scale.y &amp;lt; .015) {&lt;br /&gt;
            scale.y = .015;&lt;br /&gt;
            rescaleY = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (scale.z &amp;lt; .015) {&lt;br /&gt;
            scale.z = .015;&lt;br /&gt;
            rescaleZ = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Fixing size of linked prim #&amp;quot; + (string)i);&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale]);&lt;br /&gt;
        }&lt;br /&gt;
        rescaleFlags = rescaleFlags + [rescaleX, rescaleY, rescaleZ];&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Done fixing prims&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Ready&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        llOwnerSay(&amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        if (message == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;FixSmallPrims script is installed and ready&amp;quot;);            &lt;br /&gt;
            if (backupStored) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Original prim sizes have been backed up&amp;quot;);            &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fspcleanup&amp;quot;) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;fsprun&amp;quot;) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Sculpted_Prims:_Resident-made_Tools&amp;diff=477602</id>
		<title>Sculpted Prims: Resident-made Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Sculpted_Prims:_Resident-made_Tools&amp;diff=477602"/>
		<updated>2009-09-02T03:46:16Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Help|Object=*}}&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This page showcases &#039;&#039;&#039;special purpose tools&#039;&#039;&#039; for creating, manipulating, and viewing sculpted prims.  Most of them are created by SL residents, but the reason they are on this page is that they are &#039;&#039;not&#039;&#039; general purpose 3D tools.&lt;br /&gt;
For that list, see [[Sculpted Prims: 3d Software Guide]].&lt;br /&gt;
&lt;br /&gt;
= Preview Tools = &lt;br /&gt;
&lt;br /&gt;
== Offline Preview Tools ==&lt;br /&gt;
&lt;br /&gt;
Basic tools that can be used to preview what a sculpt texture will look like when uploaded into Second Life and rendered as a prim.  All of these are made by other Residents and should generally be considered beta or works in progress.&lt;br /&gt;
&lt;br /&gt;
=== AvPainter ===&lt;br /&gt;
Sculpty previewer that allows you to preview with texture. Also allows you to paint directly on the surface to create texture maps. Support for layers. Full version allows texture maps to be saved as PSD and TGA.&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Pootle Trollop | Pootle Trollop]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.xstreetsl.com/modules.php?name=Marketplace&amp;amp;file=item&amp;amp;ItemID=158462 Purchase from Xstreet] or [http://avpainter.osbyte.net/dl.php?name=demo&amp;amp;regcode=demo Download Demo]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: A PC running Windows XP or Vista, as well as [http://www.microsoft.com/downloads/details.aspx?familyid=0856eacb-4362-4b0d-8edd-aab15c5e04f5&amp;amp;displaylang=en Microsoft .NET Framework Version 2.0 Redistributable]. Includes XNA/DirectX component installer.&lt;br /&gt;
&lt;br /&gt;
=== Sculptaire ===&lt;br /&gt;
Open source sculpty previewer that also allows preview with texture.&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Flame Swenholt | Flame Swenholt]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://sourceforge.net/projects/sculptaire/ Download from website]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: Windows 2000 SP4, Windows XP SP2 or Windows Vista (NOT x64!), as well as [http://www.microsoft.com/downloads/details.aspx?familyid=0856eacb-4362-4b0d-8edd-aab15c5e04f5&amp;amp;displaylang=en Microsoft .NET Framework Version 2.0 Redistributable]&lt;br /&gt;
&lt;br /&gt;
=== SculptySpace ===&lt;br /&gt;
Supports textured Sculpt preview with Second Life style texture parameters.&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Sculpty Carver | Sculpty Carver]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.sculptyspace.com/index.php?id=2 Download from website]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: Windows XP SP2 or Windows Vista, [http://www.microsoft.com/downloads/details.aspx?familyid=200b2fd9-ae1a-4a14-984d-389c36f85647&amp;amp;displaylang=en Microsoft Visual C++ 2005 SP1 Redistributable]&lt;br /&gt;
&lt;br /&gt;
=== XNA Sculptpreview ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Eddy Stryker | Eddy Stryker]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [[User:Eddy_Stryker/XNA_Sculptpreview | XNA Sculptpreview]]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: Windows XP SP2 or Windows Vista, along with the Microsoft XNA framework (see above link for details)&lt;br /&gt;
*&#039;&#039;&#039;Derivatives&#039;&#039;&#039;: [http://mailerdaemon.home.comcast.net/SculptedPreview.zip XNA SculptPreview] - Modified version to include LOD and a more sensible camera configuration (and a bunch of other changes under the hood).&lt;br /&gt;
&lt;br /&gt;
=== A Hacky Sculpt Previewer ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Yumi Murakami | Yumi Murakami]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.bijodesign.com/sculpt/SculptPreview.html Web Start Launcher], [http://www.bijodesign.com/sculpt/SculptPreview.jar Executable JAR file], [[Hacky Sculpt Previewer | Source Code]] (Java SDK required to run from the source).&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: [http://java.com/en/download/index.jsp Java Runtime Engine 1.6 or higher], [http://java.sun.com/products/java-media/3D/download.html Java 3d API] and any OS that will run them (Win and Linux are well covered, Mac is not).  If installing or upgrading the JRE, be sure to do it before installing Java3d.  The Web Start link above should be able to automatically install any needed components.  Note that it will attempt to automatically redirect your browser to a download page, so if nothing happens when you click on it, please check your security settings will allow this.&lt;br /&gt;
&lt;br /&gt;
=== Cel_Sculptpreview ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Cel Edman | Cel Edman]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.xs4all.nl/~elout/sculptie/ Download from website]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: [http://java.com/en/download/index.jsp Java Runtime Engine 1.6 or higher] installed on your system. This is a simple Sculpt previewer created in [http://processing.org/ Processing]. Downloads available for Windows, Mac OS X and Linux. Currenly not further developed, since Cel continues on developing Sculptypaint (Resident-made Sculpt Creation Tools) at the moment, that got this realtime previewer as well.&lt;br /&gt;
&lt;br /&gt;
=== SIEE(Sculptie Importer Exporter and Editor) ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Rex Cronon | Rex Cronon]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.elektralusion.com/siee_123008/ Run it from website]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: [http://java.com/en/download/index.jsp Java Runtime Engine 1.6 or higher] installed on your system. This is java applet.  To run it you only need to have a browser that allows applets to run. It has many functions.  I personally use it with ArtOfIllusions.  I plan to have it allow the use of addons.  If you have any questions, comments, or you find any bugs please send me an IM in world:) This program is free to use for a limited time.  My only request is that you mention it:)&amp;lt;br/&amp;gt;&lt;br /&gt;
Thank you Eleanora Newell for hosting it:)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== In-world Preview Tools ==&lt;br /&gt;
&lt;br /&gt;
Tools that can be used to view in Second Life what a sculpt will look like before the texture is uploaded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Texture Wizard (Commercial) ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Website:&#039;&#039;&#039; [http://sl.infomyth.com/texturepreview/texturepreview.htm Infomyth.com]&lt;br /&gt;
*&#039;&#039;&#039;In-World:&#039;&#039;&#039; [http://slurl.com/secondlife/Horowitz/164/20/21/ Horowitz]&lt;br /&gt;
*&#039;&#039;&#039;Cost:&#039;&#039;&#039; L$399 (about $1.80 U.S.)&lt;br /&gt;
*&#039;&#039;&#039;Operating Systems:&#039;&#039;&#039; Windows XP&lt;br /&gt;
&lt;br /&gt;
Works using the media texture on your land (you must own or rent land to use it) using QuickTime, the way an in-game TV does. Saving a .bmp, .jpg or .psd file will automatically update the image in-game. You can see your changes live on a prim. Avoids uploads until you are done (you must still upload for a permanent version). Also works just as a regular texture previewer.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sculpt Preview using Parcel Media ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Website:&#039;&#039;&#039; [http://nandnerd.info/blog/2007/06/16/sculpty-media-video-url-previewer/ blog.nandnerd.info/...]&lt;br /&gt;
*&#039;&#039;&#039;Forum Discussion:&#039;&#039;&#039; [http://forums.secondlife.com/showthread.php?t=191214 forums.SecondLife.com]&lt;br /&gt;
*&#039;&#039;&#039;Author:&#039;&#039;&#039; [[User:nand Nerd | nand Nerd]]&lt;br /&gt;
*&#039;&#039;&#039;In-World:&#039;&#039;&#039; [http://slurl.com/secondlife/Lasiocampa/133/209/57 Lasiocampa]&lt;br /&gt;
*&#039;&#039;&#039;Requirements:&#039;&#039;&#039; Web hosting (free small image hosting at http://imageshack.us works without hassle)&lt;br /&gt;
&lt;br /&gt;
Tutorial on using the Parcel Media as a Sculpt Texture Preview. Example available at location above (Lasiocampa 133,209,57).&lt;br /&gt;
&lt;br /&gt;
= Special purpose Sculpt Creation / Manipulation Tools =&lt;br /&gt;
&lt;br /&gt;
The tools listed here aren&#039;t fully-fledged 3d modeling programs &amp;amp;mdash;  they are stand-alone tools for creating sculpt maps, usually in some limited way.  As with the previewers above, consider them works in progress.&lt;br /&gt;
&lt;br /&gt;
On the other hand, if they do what you want, a lathe tool, for example, then they are much easier than buying, setting up, learning, and using a full 3D modeler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LandSculptor ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039;[[User:Emma Nowhere | Emma Nowhere]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039;http://www.nowherevirtual.com/landsculptor/&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Web browser&lt;br /&gt;
&lt;br /&gt;
Makes a sculptie model of any region in SL. LandSculptor scans the sim region and creates a sculpt map texture you can use to make detailed models of your land. Rez the LandSculptor and start scanning and in about a minute, you&#039;ll be provided with a set of textures to make your own sculptie model.&lt;br /&gt;
&lt;br /&gt;
=== Sculptie-O-matic ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039;[[User:Contagious Republic | Contagious Republic]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039;http://slurl.com/secondlife/Sri%20Syadasti/21/86/37&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; 86 prims at most, but typically 30 or so. Only during creation.&lt;br /&gt;
&lt;br /&gt;
It currently turns a linkset of spheres, cylinders and boxes into a sculptie and outputs it as a text file, which you can decode into a regular sculptie file at a certain web site. The sculptie will look as much like the linkset within technical limits, such as the fact it does not support prim holes yet (except for cylinders).&lt;br /&gt;
&lt;br /&gt;
You can fit 64 boxes into a sculptie; 28 for spheres; 85 for spikes, or mix thereof. As they can be placed independantly, you get the unprecedented ability to make several window frames per sculpt, for example.&lt;br /&gt;
&lt;br /&gt;
The Sculptie-O-matic demo is 100% functional if you use it in its sandbox, including ability to output sculpt and use/sell them as normal. The demo also works anywhere the 1rst of each month, which is handy for contests, classes, and other events. The full version works anywhere, anytime.&lt;br /&gt;
&lt;br /&gt;
=== PloppSL ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039;[[User:Imp Iwish | Imp Iwish]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039; http://www.secondplopp.com/&lt;br /&gt;
*&#039;&#039;&#039;Operating Systems:&#039;&#039;&#039; Windows, Mac OS&lt;br /&gt;
&lt;br /&gt;
PloppSL allows you to create Sculpted Prims for Second Life by painting the front and back side of your model. Thus, texture and model are created in one step. You can create or use different textures for the front and backside of your model. You can also paint in your favored paint program, import the images into PloppSL by drag&amp;amp;drop and turn them into 3D models.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Resources&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://forums.secondlife.com/showthread.php?t=213219 sl forum thread] (restricted access)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TATARA - Sculpted Prim Previewer and Editor ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039;[[User:Yuzuru Jewell | Yuzuru Jewell]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039;http://kanae.net/secondlife/tatara.html&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Windows/Mac OS X/Linux using wine&lt;br /&gt;
&lt;br /&gt;
TATARA displays both a sculpted prim and its texture.&lt;br /&gt;
A sculpted Prim can be edited in the five modes:ROKURO/TOKOROTEN/MAGE/WAPPA/TSUCHI.&lt;br /&gt;
The five modes can be combined and used.&lt;br /&gt;
Furthermore, TATARA can correct coordinates for every control point in the BITMAP and TSUCHI mode.&lt;br /&gt;
Created by  Yuzuru Jewell...arigato!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ROKURO Sculpted Prim Maker ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039;[[User:Yuzuru Jewell | Yuzuru Jewell]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039; http://kanae.net/secondlife/&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Windows/Mac OS X/Linux using wine&lt;br /&gt;
&lt;br /&gt;
Rokuro translates from Japanese as &amp;quot;lathe&amp;quot; and that&#039;s basically what this is: a standalone version of the lathe tool found in many 3d modeling programs that saves directly to sculpt maps.  You draw a line in 2d by editing the various points and the program effectively spins that line around an axis to create the 3d object.  Cylinders and polygonal prisms are both possible.  Obviously limited to things you can create with this method so far, but easy for anyone to pick up and use and more features are still being added.  Created by  Yuzuru Jewell...arigato!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Resources&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://forums.secondlife.com/showthread.php?t=184264 sl forum thread] (restricted access)&lt;br /&gt;
&lt;br /&gt;
=== TOKOROTEN(extruder)Sculpted Prim Maker ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039;[[User:Yuzuru Jewell | Yuzuru Jewell]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039; http://kanae.net/secondlife/tokoroten.html&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Windows&lt;br /&gt;
&lt;br /&gt;
This Program makes Sculpted Prim texture .tga file of the pushed-out object.&lt;br /&gt;
TOKOROTEN is Japanese jelly extruded to thin strips.&lt;br /&gt;
An object will be pushed out if the form of the hole which you push out is made.&lt;br /&gt;
You can twist or round an object.   You draw a line in 2d by editing the various points and the program.  Obviously limited to things you can create with this method so far, but easy for anyone to pick up and use and more features are still being added.  Created by Resident Yuzuru Jewell...arigato!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Resources&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [http://forums.secondlife.com/showthread.php?t=184264 sl forum thread] (restricted access)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== sculpty.php ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039; [[User:nand Nerd | nand Nerd]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039; http://www.nandnerd.info/sculpty.php&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Browser&lt;br /&gt;
&lt;br /&gt;
A web-based series of tools, still rather primitive but constantly updating. Currently implemented are revolve and z,r revolve which both take a series of values (radii and z-pos,radii values respectively) and rotate them around the z-axis. Recently implemented a constant cross-section which extrudes a series of x,y values through the z-axis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SculptyPaint v.092===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Cel Edman | Cel Edman]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.xs4all.nl/~elout/sculptpaint/ Download from website]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: [http://java.com/en/download/index.jsp Java Runtime Engine 1.6 or higher] installed on your system?! In case it wont work. &lt;br /&gt;
Last update: march 10 - 2008. Realtime sculpt previewer.  Drawing tool: manipulate the width, height and shape of the Sculpt. Edit RGB Layers, Flower, Stone, Stair and Point, Texturesketch and Morph Tool. Downloads available for Windows, Mac-OSX and Linux.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Math Sculptor 1.0===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Burhop Piccard | Burhop Piccard]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: http://mark.burhop.net there is also a  [[MathSculptor|MathSculptor]] wiki page.&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: Windows XP or Vista. &lt;br /&gt;
Math Sculptor is free application for creating and viewing sculpted primitives. It provides dynamic viewing and modification of sculpties. What differentiates this application is that it is build upon an extendable &amp;quot;addin&amp;quot; architecture. This allows others to easily create new algorithms that generate completely new types of sculpties. See http://mark.burhop.net for more information and sample sculpted primitives.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SnurbO&#039;Matic ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Anjin Meili | Anjin Meili]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.slexchange.com/modules.php?name=Marketplace&amp;amp;file=item&amp;amp;ItemID=273452 Slexchange]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: Secondlife client and a sandbox with at least 1100 primitives. &lt;br /&gt;
SnurbO&#039;Matic is an in world tool that allows editing and creation of sculpties.  The system uses a molding method, allowing a mesh to be molded around other inworld objects.  Objects must not be phantom.  The mold may be modified using normal in world build tools.  Each mesh node is visualized as a sphere, and can be moved as desired.  Once finished, the mold is saved and a casting produced thru an automated web process.  The user gets a URL when completed for a TGA file containing the texture.  This can be further refined using off grid tools, or simply uploaded to Second Life as is.  For new modelers, its easier to start with a close approximation of an object, rather then manipulating a sphere to the object they wish.  For landscapers, the tool can produce organic, smooth, and unique rocks, logs, etc.  Search for the group SculptO&#039;Matic, or visit our sandbox and lab in Talakin. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sculpted Sim Terrain Mapper ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Anjin Meili | Anjin Meili]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.slexchange.com/modules.php?name=Marketplace&amp;amp;file=item&amp;amp;ItemID=270738 Slexchange]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: Secondlife client and a object create and script permissions on a parcel. &lt;br /&gt;
The Sculpted Sim Terrain Mapper creates a sculpted primitive map in 3D of any given Simulator.  The tool simply is rezzed onto a parcel in the sim, and allowed to run.  It will report back to the operator a URL to pickup a completed sculpted texture in TGA format.  The data collected may also be used to create higher detail maps of the simulator, by using more prims, up to an 8x8 grid of sculpted prims to represent a simulator.  Or just the default of one prim for the entire simulator.  While the packaged tool is fee based, due to the costs of operating the backend... There is an open source version written entirely in LSL that requires minimal server side support.  Contact Anjin Meili for a copy of the open source code.  This tool is an example of using data to create sculpted primitives, with very little interaction.  The source details using PPM as a description format within LSL for the sculpted texture map.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sculpt Studio ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:TheBlack Box | TheBlack Box]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.slexchange.com/modules.php?name=Marketplace&amp;amp;file=item&amp;amp;ItemID=278458 SL-Exchange]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: SL (34+ Prims) and Browser&lt;br /&gt;
&lt;br /&gt;
A high-end in-world sculpting tool for beginners, advanced and professional Sculptors,&lt;br /&gt;
that allows to apply SL building skills to sculpting.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Terrain Sculptor (Open Source) ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Cadroe Murphy | Cadroe Murphy]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://spinmass.blogspot.com/2007/08/terrain-sculptor-maps-sims-and-creates.html Blog]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: .NET 2.0&lt;br /&gt;
&lt;br /&gt;
Terrain Sculptor is a .NET application which uses a [http://www.libsecondlife.org/wiki/Main_Page libsecondlife] bot to retrieve the elevation data for a sim and generates a sculpty texture of the terrain.  It also downloads the world map image from the web for use as a texture.  The user can teleport to specific locations within sims and monitor the process through a graphical display.  The operation usually takes a number of seconds after logging into a sim.  Elevation data can be saved and loaded seperately.  The application is relatively user-friendly but errors are not always handled informatively.  The source code is open.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LD Sculpty Protect ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Langweiliger Dreier | Langweilliger Dreier]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.sculptytools.tk http://www.sculptytools.tk]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: Windows PC&lt;br /&gt;
&lt;br /&gt;
LD Sculpty Protect is a tool to protect sculpty textures in Second Life - that nobody can steal your hard work by simply making screenshots. It is optimized to manage multiple files at once. It is possible to use your own logo! See website for more information.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sculpty Hider ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Gorge Go | Gorge Go]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://caboosecode.webs.com/Programs/Sculpty_Hider.rar http://caboosecode.webs.com/Programs/Sculpty_Hider.rar]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: Windows PC&lt;br /&gt;
&lt;br /&gt;
This is a FREE alternative to Langweiliger&#039;s LD Sculpty Protect with all of the benofits.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LD Sculpty Shrink ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Langweiliger Dreier | Langweilliger Dreier]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.sculptytools.tk http://www.sculptytools.tk]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: Windows PC&lt;br /&gt;
&lt;br /&gt;
LD Sculpty Shrink is a tool to decrease size of sculpties to any size - to make sculpted nano prims for example. It is optimized to manage multiple files. (LD Sculpty Protect is included in this tool). See website for more information.&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sim Terrain Surveyor ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator&#039;&#039;&#039;: [[user:Glox Parisi | Glox Parisi]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it&#039;&#039;&#039;: [http://www.xstreetsl.com/modules.php?name=Marketplace&amp;amp;file=item&amp;amp;ItemID=1184678 SL-Exchange]&lt;br /&gt;
*&#039;&#039;&#039;Requires&#039;&#039;&#039;: Any graphics editor capable of portable pixmap files (*.ppm). &lt;br /&gt;
Scans the sim&#039;s elevation profile and chats the readings which you then convert into a sculpt map texture using GIMP, ACDSee or Photoshop or any other graphics editor that supports .ppm portable pixmap files.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Sculpted Prims]]&lt;br /&gt;
&lt;br /&gt;
= File Converters =&lt;br /&gt;
&lt;br /&gt;
These utilities are made to translate 3d files directly into sculpt maps, with varying degrees of sucess.&lt;br /&gt;
&lt;br /&gt;
=== 3dm2sculpt ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039; [[User:Cindy Crabgrass | Cindy Crabgrass]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039; [[3dm2sculpt|3dm2sculpt]]&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Windows&lt;br /&gt;
&lt;br /&gt;
A command-line utility that reads an [[#3D_File_Formats | OpenNURBS]] .3dm file and generates a .tga sculpt map from it. Still in need of a lot of testing but potentially very useful for any program that supports this format.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== obj2sculpt ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039; [[User:Cindy Crabgrass | Cindy Crabgrass]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039; http://forums.secondlife.com/showpost.php?p=1505114&amp;amp;postcount=14&lt;br /&gt;
*&#039;&#039;&#039;Link on the TG forums:&#039;&#039;&#039; Nonexistent, can someone please fix this?&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Windows&lt;br /&gt;
&lt;br /&gt;
A command-line utility that reads a Wavefront Style .obj file and generates a .tga sculpt texture from it.  Still in need of a lot of testing but potentially very useful for any program that supports this format.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sculpty Maker ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039;  2k Suisei&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039; http://www.shiny-life.com/sculpty-maker/&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Windows, zBrush&lt;br /&gt;
&lt;br /&gt;
Sculpty Maker is a free program for Windows PCs that allows you to create objects in zBrush and convert them to Second Life sculpted prims. It includes an in-world tool called Sculpty Rezzer that assembles the converted objects, and a plug-in for zBrush that allows you to export sculptmaps directly from zBrush. Please direct all support questions to Vlad Bjornson.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Importers =&lt;br /&gt;
&lt;br /&gt;
These utilities assist in bringing sculpted creations in to the Second Life world:&lt;br /&gt;
&lt;br /&gt;
=== SL Image Upload ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039; [[User:Eddy Stryker | Eddy Stryker]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039; [[SLImageUpload|SLImageUpload]]&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Windows, Linux, OSX&lt;br /&gt;
&lt;br /&gt;
A simple graphical user interface to upload textures to the grid. It will show you the compressed texture size before uploading and allow you to upload lossless images, perfect for 64x64 or smaller sculpt maps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== importprimscript ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039; [[User:Eddy Stryker | Eddy Stryker]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039; [[Importprimscript|Importprimscript]]&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Windows, Linux, OSX&lt;br /&gt;
&lt;br /&gt;
A command-line utility to batch upload an entire folder output from Qarl&#039;s Advanced Maya Sculpt Exporter in to Second Life and rez the scene as a full permission linkset. The sculpt maps are uploaded as lossless images and the textures are uploaded with the normal compression settings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Although the main utility is command-line, for using the app on Windows there is a GUI provided by Johan Durant on the importprimscript page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== redcap ===&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Creator:&#039;&#039;&#039; [[User:Adam Marker | Adam Marker]]&lt;br /&gt;
*&#039;&#039;&#039;Link to get it:&#039;&#039;&#039; [http://adammarker.org/redcap/ redcap]&lt;br /&gt;
*&#039;&#039;&#039;Requires:&#039;&#039;&#039; Ruby, ImageMagick&lt;br /&gt;
&lt;br /&gt;
redcap is an open-source command line utility for uploading images to Second Life.&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Open_Grid_Public_Beta/Map_Locations&amp;diff=89969</id>
		<title>Open Grid Public Beta/Map Locations</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Open_Grid_Public_Beta/Map_Locations&amp;diff=89969"/>
		<updated>2008-09-06T13:30:51Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /*  Emma Nowhere  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OpenSim regions cannot be placed directly adjacent to existing regions on aditi or vaak.&lt;br /&gt;
&lt;br /&gt;
:[[User:Zha_Ewry|Zha Ewry]]: &amp;quot;Setup as a very basic stand alone opensim. set the default location and the location of your region to be the same value, and run only one region on the server. (ie. in OpenSim.ini, make sure you set default_loc_x and default_loc_y, and make them match the ones in the default.xml in the Regions subdirectory of you r bin directory in your install.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
All units are in reference OpenSim&#039;s coordinate system.&lt;br /&gt;
&lt;br /&gt;
{{Alert Box| We have found that there is difficultly in teleporting to OpenSim regions at coordinates &#039;&#039;&#039;greater than 4096&#039;&#039;&#039;. See [https://jira.secondlife.com/browse/SVC-2941 SVC-2941]. Please select new map x/y coordinates for your regions.}} &lt;br /&gt;
&lt;br /&gt;
If you set regions adjacent to one another, you will see some odd effects, depending on if you had visited the adjacent region. If you haven&#039;t visited the adjacent region, it will not appear in your map or camera view. And you will be unable to cross over to it by walking or flying.&lt;br /&gt;
&lt;br /&gt;
To avoid the effect, select an offset of at least one unit from other sims. On the other hand, it&#039;s an interesting effect.&lt;br /&gt;
&lt;br /&gt;
Non-Linden Lab OpenSims should use default_loc_x and default_loc_y values greater than &#039;&#039;&#039;2304&#039;&#039;&#039; (Note Change).&lt;br /&gt;
&lt;br /&gt;
Map claims should be unique. Otherwise teleport failures will occur if you try to jump between regions at the same X/Y coordinates.&lt;br /&gt;
&lt;br /&gt;
Claim Map Locations Below&lt;br /&gt;
&lt;br /&gt;
==[[User:Whump_Linden | Whump Linden ]]==&lt;br /&gt;
&lt;br /&gt;
* 2048/2048 &lt;br /&gt;
* 2304/2560 &lt;br /&gt;
&lt;br /&gt;
==[[User:Enus_Linden | Enus Linden ]]==&lt;br /&gt;
&lt;br /&gt;
* 2304/2304&lt;br /&gt;
&lt;br /&gt;
==[[User:Dahlia_Trimble | Dahlia Trimble ]]==&lt;br /&gt;
&lt;br /&gt;
* 4096/4096&lt;br /&gt;
* 4352/4352&lt;br /&gt;
* 4608/4608&lt;br /&gt;
&lt;br /&gt;
==[[User:Christophe003_Carter | Christophe003 Carter ]]==&lt;br /&gt;
&lt;br /&gt;
* 4608/4608&lt;br /&gt;
&lt;br /&gt;
==[[User:Pier_Tempel | Pier Tempel ]]==&lt;br /&gt;
&lt;br /&gt;
* 5120/5120&lt;br /&gt;
&lt;br /&gt;
==[[User:BlueWall Slade | Bluewall Slade]]==&lt;br /&gt;
*2306/2306 URI: http://ascent.bluewallgroup.com:9300&lt;br /&gt;
&lt;br /&gt;
==[[User:Winne Woodget | Winne Woodget]]==&lt;br /&gt;
&lt;br /&gt;
* 6912/6912&lt;br /&gt;
&lt;br /&gt;
==[[User:Matias Carter | Matias Carter]]==&lt;br /&gt;
&lt;br /&gt;
* 2560/2560&lt;br /&gt;
&lt;br /&gt;
==[[User:Xugu Madison | Xugu Madison]]==&lt;br /&gt;
&lt;br /&gt;
* 2305/4093&lt;br /&gt;
* 2305/4094&lt;br /&gt;
* 2305/4095&lt;br /&gt;
&lt;br /&gt;
==[[User:Eddy Stryker | Eddy Stryker]]==&lt;br /&gt;
&lt;br /&gt;
* 5888/5888&lt;br /&gt;
&lt;br /&gt;
==[[User:Latif Khalifa | Latif Khalifa]]==&lt;br /&gt;
&lt;br /&gt;
* 6144/6144&lt;br /&gt;
&lt;br /&gt;
==[[User:Tracy Welles | Tracy Welles ]]==&lt;br /&gt;
&lt;br /&gt;
* 4352/4352&lt;br /&gt;
&lt;br /&gt;
==[[User:Bluecat Jun | Bluecat Jun ]]==&lt;br /&gt;
&lt;br /&gt;
* 3072/3072&lt;br /&gt;
&lt;br /&gt;
==[[User:Alynna Vixen | Alynna Vixen ]]==&lt;br /&gt;
&lt;br /&gt;
* 4864/5120 - [http://kitsunet.net:9000/ Kitsuhana]&lt;br /&gt;
&lt;br /&gt;
==[[User:Julie Wasserstrom | Julie Wasserstrom ]]==&lt;br /&gt;
&lt;br /&gt;
* 5888/5888&lt;br /&gt;
&lt;br /&gt;
==[[User:Chris Samtanko | Chris Samtanko ]]==&lt;br /&gt;
&lt;br /&gt;
*2308/2308 - http://planck.vworlds.co.uk:9000&lt;br /&gt;
*10001/9998 (OSGrid) - http://dirac.vworlds.co.uk:9000&lt;br /&gt;
&lt;br /&gt;
==[http://mrtopf.de/blog Tao Takashi ]==&lt;br /&gt;
&lt;br /&gt;
*6656/6656&lt;br /&gt;
&lt;br /&gt;
==[[User:Jim Kupferberg | Jim Kupferberg  ]]==&lt;br /&gt;
&lt;br /&gt;
*2329/2329&lt;br /&gt;
&lt;br /&gt;
==[[User:Emma Nowhere | Emma Nowhere ]]==&lt;br /&gt;
&lt;br /&gt;
*3000/3000&lt;br /&gt;
&lt;br /&gt;
==[[User:Gomez Bracken | Gomez Bracken ]]==&lt;br /&gt;
&lt;br /&gt;
*8448/8448&lt;br /&gt;
&lt;br /&gt;
==[[User:Ciemaar Flintoff | Ciemaar Flintoff ]]==&lt;br /&gt;
&lt;br /&gt;
*6656/7680&lt;br /&gt;
&lt;br /&gt;
==[[User:Media Hax | Media Hax ]]==&lt;br /&gt;
&lt;br /&gt;
*5632/5632&lt;br /&gt;
==[[User:Twa Hinkle | Twa Hinkle ]]==&lt;br /&gt;
&lt;br /&gt;
*7680/7680&lt;br /&gt;
&lt;br /&gt;
==[[User:Vicero Lambert | Vicero Lambert ]]==&lt;br /&gt;
&lt;br /&gt;
*5130/5130&lt;br /&gt;
&lt;br /&gt;
==[[User:Whichway Janus | Whichway Janus ]]==&lt;br /&gt;
&lt;br /&gt;
*3328/3329 OpenSim blocks&lt;br /&gt;
*3328/3330 OpenSim blocks &lt;br /&gt;
Updated location.&lt;br /&gt;
&lt;br /&gt;
Updated protocol sim - requires OGP Viewer build 94858 or higher. Running OpenSim trunk with OGP Protocol enabled.&lt;br /&gt;
&lt;br /&gt;
==[[User:Stamo Stuer | Stamo Stuer ]]==&lt;br /&gt;
&lt;br /&gt;
*5376/5376&lt;br /&gt;
&lt;br /&gt;
==[[User:Patnad Babii | Patnad Babii ]]==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=&amp;quot;pink&amp;quot;&amp;gt;9728/9728&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==[[User:Torrid Luna | Torrid Luna ]]==&lt;br /&gt;
&lt;br /&gt;
* 6144/8448&lt;br /&gt;
&lt;br /&gt;
==[http://blog.simgis.com Darb Dabney ]==&lt;br /&gt;
&lt;br /&gt;
* 4608/4352&lt;br /&gt;
&lt;br /&gt;
==[[User:Morph Wollongong | Morph Wollongong ]]==&lt;br /&gt;
&lt;br /&gt;
* 6789/6789&lt;br /&gt;
&lt;br /&gt;
==[[User:Estate Shepherd | Estate Shepherd ]]==&lt;br /&gt;
&lt;br /&gt;
* 8704/8704&lt;br /&gt;
&lt;br /&gt;
==[[User:Zerodog Witte | Zerodog Witte ]]==&lt;br /&gt;
&lt;br /&gt;
* 8448/8448&lt;br /&gt;
&lt;br /&gt;
==[[User:Lil Linden | Lil Linden]]==&lt;br /&gt;
&lt;br /&gt;
* 2806/2806&lt;br /&gt;
&lt;br /&gt;
==[[User:EriX Oh | EriX Oh]]==&lt;br /&gt;
&lt;br /&gt;
* 4352/4864&lt;br /&gt;
&lt;br /&gt;
==[[User:James Benedek | James Benedek]]==&lt;br /&gt;
&lt;br /&gt;
* 7936/7936&lt;br /&gt;
&lt;br /&gt;
==[[User:Hawk Carter | Hawk Carter]]==&lt;br /&gt;
&lt;br /&gt;
* 3500/3500  -  URI: http://81.169.130.81:10600 (UP)&lt;br /&gt;
&lt;br /&gt;
==[[User:McCoy Ducatillon | McCoy Ducatillon]]==&lt;br /&gt;
&lt;br /&gt;
* 8960/8960&lt;br /&gt;
&lt;br /&gt;
==[[User:Laurent Bechir | Laurent Bechir]]==&lt;br /&gt;
&lt;br /&gt;
* 5300/5300&lt;br /&gt;
&lt;br /&gt;
==[[User:Economic Mip | Economic Mip]]==&lt;br /&gt;
&lt;br /&gt;
* 9216/8960&lt;br /&gt;
&lt;br /&gt;
==[[User:whyroc Slade | whyroc Slade]]==&lt;br /&gt;
&lt;br /&gt;
* 10240/10240&lt;br /&gt;
&lt;br /&gt;
==[[User:Bartholomew Kleiber | Bartholomew Kleiber]]==&lt;br /&gt;
&lt;br /&gt;
* 3328/3840&lt;br /&gt;
&lt;br /&gt;
==[[User:Arbitar Basiat | Arbitar Basiat]]==&lt;br /&gt;
&lt;br /&gt;
* 13056/13056&lt;br /&gt;
&lt;br /&gt;
==[[User:KustomKreator4u Inglewood | KustomKreator4u Inglewood]]==&lt;br /&gt;
&lt;br /&gt;
* 11008/11008&lt;br /&gt;
&lt;br /&gt;
==[[User:TheCoolLeader Boyer | TheCoolLeader Boyer ]]==&lt;br /&gt;
&lt;br /&gt;
* 16384/16384&lt;br /&gt;
&lt;br /&gt;
==[[User:Aidamina Hunt | Aidamina Hunt ]]==&lt;br /&gt;
&lt;br /&gt;
* 25600/25600&lt;br /&gt;
&lt;br /&gt;
==[[User:Stirling Allen|Stirling Allen]] 19:59, 4 August 2008 (PDT)==&lt;br /&gt;
&lt;br /&gt;
*65536/65536 (ETA Friday 9 August)&lt;br /&gt;
&lt;br /&gt;
==[[User:Sonof Marvin|Sonof Marvin]]==&lt;br /&gt;
&lt;br /&gt;
*69683/69683&lt;br /&gt;
&lt;br /&gt;
==[[User:Radioactive Rosca|Radioactive Rosca]]==&lt;br /&gt;
&lt;br /&gt;
*4864/5376&lt;br /&gt;
&lt;br /&gt;
==[[User:Jim Brock|Jim Brock]]==&lt;br /&gt;
&lt;br /&gt;
* 9472/9472&lt;br /&gt;
&lt;br /&gt;
==[[User:Jonit Ivory|Jonit Ivory]]==&lt;br /&gt;
&lt;br /&gt;
* 11264/11264&lt;br /&gt;
&lt;br /&gt;
==[[User:Ideia Boa|Ideia Boa]]==&lt;br /&gt;
&lt;br /&gt;
* 4096/4608&lt;br /&gt;
&lt;br /&gt;
==[[User:Athanasius Skytower|Athanasius Skytower]]==&lt;br /&gt;
&lt;br /&gt;
* 5632/6656&lt;br /&gt;
&lt;br /&gt;
==[[User:camilla Yosuke|camilla Yosuke]]==&lt;br /&gt;
&lt;br /&gt;
* 3333/3333&lt;br /&gt;
&lt;br /&gt;
==[[User:bonghit Schism|bonghit Schism]]==&lt;br /&gt;
&lt;br /&gt;
* 12544/12544&lt;br /&gt;
&lt;br /&gt;
==[[User:Elio Donat|Elio Donat]]==&lt;br /&gt;
&lt;br /&gt;
* 6656/4353&lt;br /&gt;
&lt;br /&gt;
==[[User: Just Dinkin|Just Dinkin]]==&lt;br /&gt;
* 11520/11520&lt;br /&gt;
&lt;br /&gt;
==[[User: Miki Gymnast|Miki Gymnast]]==&lt;br /&gt;
* 8448/5632&lt;br /&gt;
&lt;br /&gt;
==[[User: Jillian Taringa|Jillian Taringa]]==&lt;br /&gt;
* 11776/11776&lt;br /&gt;
&lt;br /&gt;
==[[User: JB Kraft|JB Kraft]]==&lt;br /&gt;
* 6400/4608&lt;br /&gt;
&lt;br /&gt;
==[[User: Wangxiang Tuxing|Wangxiang Tuxing]]==&lt;br /&gt;
* 9472/11264&lt;br /&gt;
&lt;br /&gt;
==[[User: Tensai Hilra|Tensai Hilra]]==&lt;br /&gt;
* 12800/12800&lt;br /&gt;
&lt;br /&gt;
==[[User: Mirt Tenk|Mirt Tenk]]==&lt;br /&gt;
* 5376/7680&lt;br /&gt;
&lt;br /&gt;
==[[User: Maniac Choche|Maniac Choche]]==&lt;br /&gt;
* 5632/5888&lt;br /&gt;
&lt;br /&gt;
==[[User: Kish Kas|Kish Kas]]==&lt;br /&gt;
* 6400/6656&lt;br /&gt;
&lt;br /&gt;
==[[User: Bit2zero Planer|Bit2zero Planer]]==&lt;br /&gt;
* 6500/6656&lt;br /&gt;
&lt;br /&gt;
==[[User: Trifile Toshi|Trifile Toshi]]==&lt;br /&gt;
* 20736/20736&lt;br /&gt;
&lt;br /&gt;
==[[User: Micheil Merlin|Micheil Merlin]]==&lt;br /&gt;
* 4608/5120&lt;br /&gt;
&lt;br /&gt;
==[[User: Yuu Nakamichi|Yuu Nakamichi]]==&lt;br /&gt;
* 9728/8960&lt;br /&gt;
&lt;br /&gt;
==[[User: Norgan Torok|Norgan Torok]]==&lt;br /&gt;
* 6400/6400&lt;br /&gt;
&lt;br /&gt;
==[[User: Master Huldschinsky|Master Huldschinsky]]==&lt;br /&gt;
* 16400/16400&lt;br /&gt;
&lt;br /&gt;
==[[User: Giulio Perhaps|Giulio Perhaps]]==&lt;br /&gt;
* 16640/16640&lt;br /&gt;
&lt;br /&gt;
==[[User: Lexa Sands|Lexa Sands]]==&lt;br /&gt;
* 2305/2305 (previously 6400/6144) - Lexania - URI: http://lexa.ath.cx:9000&lt;br /&gt;
&lt;br /&gt;
==[[User:Junta Kohime | Junta Kohime ]]==&lt;br /&gt;
&lt;br /&gt;
* 6400/5888 - Born To Learn - URI: http://borntolearn.dyndns.org:9000&lt;br /&gt;
&lt;br /&gt;
==[[User: Strawberry Fride | Strawberry Fride]]==&lt;br /&gt;
* 17408/17408&lt;br /&gt;
&lt;br /&gt;
==[[User: G2 Proto | G2 Proto]]==&lt;br /&gt;
* 17664/17664 http://www.reactiongrid.com http://reactiongrid.com:10500&lt;br /&gt;
&lt;br /&gt;
==[[User: Kuraiko Yoshikawa|Kuraiko Yoshikawa]]==&lt;br /&gt;
*2435/2304 [http://zeitenwerk.de:9128 URI]&lt;br /&gt;
&lt;br /&gt;
==[[User: Prometheus Dovgal|Prometheus Dovgal]]==&lt;br /&gt;
*17920/17920&lt;br /&gt;
&lt;br /&gt;
==[[User: Cow Taurog|Cow Taurog]]==&lt;br /&gt;
* 16128/16128 - [http://cowtaurog.cjb.net:9000 The Pasture]&lt;br /&gt;
&lt;br /&gt;
==[[User: Camus Omegamu|Camus Omegamu]]==&lt;br /&gt;
* 4608/8704&lt;br /&gt;
&lt;br /&gt;
==[[User: m0rdred Veil|m0rdred Veil]]==&lt;br /&gt;
* 18176/18176 - La Isla West - URI: http://24.30.54.84:9000&lt;br /&gt;
&lt;br /&gt;
==[[User: Kliger Dinkin|Kliger Dinkin]]==&lt;br /&gt;
* 13312/13312&lt;br /&gt;
&lt;br /&gt;
==[[User: Audoa Giha|Audoa Giha]]==&lt;br /&gt;
* 19200/19200 Will be up/down for maint otherwise 24/7  URI: http://96.226.64.34:9010/&lt;br /&gt;
&lt;br /&gt;
==[[User: Ceyna Indigo|Ceyna Indigo]]==&lt;br /&gt;
* 32768/32768&lt;br /&gt;
==[[User: Bulli Schumann|Bulli Schumann]]==&lt;br /&gt;
&lt;br /&gt;
(Changed for the &#039;new&#039; coordinate system)&lt;br /&gt;
&lt;br /&gt;
* 3600/3600 - Come visit if you like... still very barren... but it will prob. be expanded in a while: http://83.247.63.174:9000&lt;br /&gt;
* 3600/3601 - experimental region (well... aren&#039;t they all?)&lt;br /&gt;
* 3601/3600 - experimental region (well... aren&#039;t they all?)&lt;br /&gt;
* 3601/3601 - experimental region (well... aren&#039;t they all?)&lt;br /&gt;
&lt;br /&gt;
==[[User: Ansel Gasparini|Ansel Gasparini]]==&lt;br /&gt;
* 4352/4608&lt;br /&gt;
&lt;br /&gt;
==[[User: Xerbi Zerbino|Xerbi Zerbino]]==&lt;br /&gt;
* 12032/12032&lt;br /&gt;
&lt;br /&gt;
==[[User: Siddhartha Fonda | Siddhartha Fonda]]==&lt;br /&gt;
* 22272/22272&lt;br /&gt;
&lt;br /&gt;
==[[User: elmanytas Ferrentino | elmanytas Ferrentino]]==&lt;br /&gt;
* 2560/2304&lt;br /&gt;
&lt;br /&gt;
==[[User:Mana Janus|Mana Janus]]==&lt;br /&gt;
* 2424/2424&lt;br /&gt;
&lt;br /&gt;
==[[User:Easyfresh Auer|Easyfresh Auer]]==&lt;br /&gt;
* 3810/3810&lt;br /&gt;
&lt;br /&gt;
==[[User:Nomad Ingwer|Nomad Ingwer]]==&lt;br /&gt;
* 27648/27648&lt;br /&gt;
&lt;br /&gt;
==[[User:Quinlan Quimby|Quinlan Quimby]]==&lt;br /&gt;
* 28416/28416&lt;br /&gt;
&lt;br /&gt;
==[[User:Woot Avro|Woot Avro]]==&lt;br /&gt;
* 4096/4608&lt;br /&gt;
&lt;br /&gt;
==[[User:Herfulnerful Holsworthy|Herfulnerful Holsworthy]]==&lt;br /&gt;
* 8192/16384&lt;br /&gt;
* 8192/16640&lt;br /&gt;
&lt;br /&gt;
==[[User:pb Qinan|pb Qinan]]==&lt;br /&gt;
* 9472/8960&lt;br /&gt;
&lt;br /&gt;
==[[User:Tara5 Oh|Tara5 Oh]]==&lt;br /&gt;
*15616/15616 - Visit us at URI: ugotrade.net:9000&lt;br /&gt;
&lt;br /&gt;
==[[User:Drax Lemieux|Drax Lemieux]]==&lt;br /&gt;
*16128/16128&lt;br /&gt;
&lt;br /&gt;
==[[User:Opensource Obscure|Opensource Obscure]]==&lt;br /&gt;
*51200/51200&lt;br /&gt;
&lt;br /&gt;
==[[User:Harleen Gretzky|Harleen Gretzky]]==&lt;br /&gt;
*5120/51200&lt;br /&gt;
&lt;br /&gt;
==[[User:Lapsus Weinstein|Lapsus Weinstein]]==&lt;br /&gt;
* Experimental Sandbox on Physical and Mental Health &lt;br /&gt;
-loginuri http://grid.centromimir.it:9000 -loginpage http://grid.centromimir.it &lt;br /&gt;
* Garda Lake, Caffe&#039; Freud, Centro Mimir, Suburbia&lt;br /&gt;
* 3584/3584(ogp)&lt;br /&gt;
* 3584/3585(ogp)&lt;br /&gt;
* 3585/3584(ogp)&lt;br /&gt;
* 3585/3585(ogp)&lt;br /&gt;
&lt;br /&gt;
==[[User:Amarillo Mertel|Amarillo Mertel]]==&lt;br /&gt;
*25600/25600&lt;br /&gt;
&lt;br /&gt;
==[[User:Rasmusson Oranos|Rasmusson Oranos]]==&lt;br /&gt;
*18432/18432&lt;br /&gt;
&lt;br /&gt;
==[[User:Tylor Ferraris|Tylor Ferraris]]==&lt;br /&gt;
*1054976/1054976&lt;br /&gt;
&lt;br /&gt;
==[[User:Teravus Ousley|Teravus Ousley]]==&lt;br /&gt;
*1048832/1048832 (ogp) -  4097/4097 (OpenSimulator)&lt;br /&gt;
&lt;br /&gt;
==[[User:EloiseJolie Capalini|EloiseJolie Capalini]]==&lt;br /&gt;
*3200/3200 (ogp) -  URI: http://213.186.37.135.com:9000&lt;br /&gt;
&lt;br /&gt;
==[[User:Jabba_Gruppman | Jabba Gruppman]]==&lt;br /&gt;
&lt;br /&gt;
* 5120/11264&lt;br /&gt;
&lt;br /&gt;
==[[User:Cecelia Lewis | Cecelia Lewis]]==&lt;br /&gt;
* 25856/25856&lt;br /&gt;
&lt;br /&gt;
==[[User:Albert Revolution|Albert Revolution]]==&lt;br /&gt;
*15872/15872 (ogp) - SOMBRALAND - &lt;br /&gt;
Accesible some hours at week. Spanish Time. I would like to test&lt;br /&gt;
importations from 3dMax Studio, Sculpties and building&lt;br /&gt;
&lt;br /&gt;
==[[User:Dedric Mauriac | Dedric Mauriac]]==&lt;br /&gt;
*4352/5120&lt;br /&gt;
&lt;br /&gt;
==[[User:Micky Jansma | Micky Jansma]]==&lt;br /&gt;
*28160/28160&lt;br /&gt;
&lt;br /&gt;
==[[User:Burnman Bedlam | Burnman Bedlam]]==&lt;br /&gt;
*14848/14848&lt;br /&gt;
&lt;br /&gt;
==[[User:Rancher Koenig | Rancher Koenig]]==&lt;br /&gt;
*5120/5120&lt;br /&gt;
&lt;br /&gt;
==[[User:Fin Umarov | Fin Umarov]]==&lt;br /&gt;
*25344/25344&lt;br /&gt;
&lt;br /&gt;
==[[User:Berry Steinhoff | Berry Steinhoff]]==&lt;br /&gt;
*13568/13568&lt;br /&gt;
&lt;br /&gt;
==[[User:Kaly Mayako|Kaly Mayako]]==&lt;br /&gt;
*9666/9666  -  URI: http://jukastream.com:9000&lt;br /&gt;
Open 10AM - 4PM French time&lt;br /&gt;
&lt;br /&gt;
==[[User:Armon_Aeon | Armon Aeon]]==&lt;br /&gt;
&lt;br /&gt;
*12288/12288 - URI:  http://surya.grids.litesim.com:8000/ogp_listen&lt;br /&gt;
&lt;br /&gt;
==[[User:Sered Woollahra | Sered Woollahra]]==&lt;br /&gt;
*3574/3574 - URI: http://prime.ciuso.com:9000 accessible unless down for maintenance.&lt;br /&gt;
&lt;br /&gt;
[[Category:Open_Grid_Public_Beta]]&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Open_Grid_Public_Beta/Public_Regions&amp;diff=81887</id>
		<title>Open Grid Public Beta/Public Regions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Open_Grid_Public_Beta/Public_Regions&amp;diff=81887"/>
		<updated>2008-08-01T01:55:25Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following OpenSim regions supporting the Open Grid protocol are available for you to teleport to once you&#039;ve authenticated to the agent domain:&lt;br /&gt;
&lt;br /&gt;
== Ugotrade ==&lt;br /&gt;
&lt;br /&gt;
* http://ugotrade.net:9000&lt;br /&gt;
* Times Available&lt;br /&gt;
* Contact: Tara5 Oh&lt;br /&gt;
&lt;br /&gt;
== COM.lounge / Tao Takashi / mrtopf.de ==&lt;br /&gt;
&lt;br /&gt;
* http://plonetv.de:9000&lt;br /&gt;
* always probably&lt;br /&gt;
* Contact: [http://mrtopf.de/blog Tao Takashi]&lt;br /&gt;
&lt;br /&gt;
== BlueWall ==&lt;br /&gt;
&lt;br /&gt;
* http://ascent.bluewallgroup.com:9300&lt;br /&gt;
* 24/7 - may be unavailable for short periods for updates/maintenance&lt;br /&gt;
* Contact: [[User:BlueWall Slade | Bluewall Slade]]&lt;br /&gt;
* E-Mail: [mailto://BlueWall.Slade@gmail.com BlueWall Slade]&lt;br /&gt;
&lt;br /&gt;
== Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
* Region URL: http://opensim.nowherevirtual.com:9000&lt;br /&gt;
* Times Available: 24/7 (except for maintenance)&lt;br /&gt;
* Contact: [[User:Emma Nowhere | Emma Nowhere ]]&lt;br /&gt;
* E-Mail: [mailto://emma.nowhere@gmail.com Emma Nowhere]&lt;br /&gt;
&lt;br /&gt;
== Region Name ==&lt;br /&gt;
&lt;br /&gt;
* Region URL&lt;br /&gt;
* Times Available&lt;br /&gt;
* Contact&lt;br /&gt;
&lt;br /&gt;
[[category:Open_Grid_Public_Beta]]&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Open_Grid_Public_Beta/Map_Locations&amp;diff=81784</id>
		<title>Open Grid Public Beta/Map Locations</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Open_Grid_Public_Beta/Map_Locations&amp;diff=81784"/>
		<updated>2008-07-31T18:42:52Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OpenSim regions cannot be placed directly adjacent to existing regions on aditi or vaak.&lt;br /&gt;
&lt;br /&gt;
:[[User:Zha_Ewry|Zha Ewry]]: &amp;quot;Setup as a very basic stand alone opensim. set the default location and the location of your region to be the same value, and run only one region on the server. (ie. in OpenSim.ini, make sure you set default_loc_x and default_loc_y, and make them match the ones in the default.xml in the Regions subdirectory of you r bin directory in your install. Make sure your X and Ys are multiples of 256.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Non-Linden Lab OpenSims should use default_loc_x and default_loc_y values greater than 4096.&lt;br /&gt;
&lt;br /&gt;
Claim Map Locations Below&lt;br /&gt;
&lt;br /&gt;
==[[User:Whump_Linden | Whump Linden ]]==&lt;br /&gt;
&lt;br /&gt;
* 2048/2048&lt;br /&gt;
* 2304/2560&lt;br /&gt;
&lt;br /&gt;
==[[User:Dahlia_Trimble | Dahlia Trimble ]]==&lt;br /&gt;
&lt;br /&gt;
* 4096/4096&lt;br /&gt;
&lt;br /&gt;
==[[User:BlueWall Slade | Bluewall Slade]]==&lt;br /&gt;
*6400/6400&lt;br /&gt;
&lt;br /&gt;
==[[User:Matias Carter | Matias Carter]]==&lt;br /&gt;
&lt;br /&gt;
* 7168/7168&lt;br /&gt;
&lt;br /&gt;
==[[User:Xugu Madison | Xugu Madison]]==&lt;br /&gt;
&lt;br /&gt;
* 8192/8192&lt;br /&gt;
&lt;br /&gt;
==[[User:Eddy Stryker | Eddy Stryker]]==&lt;br /&gt;
&lt;br /&gt;
* 5888/5888&lt;br /&gt;
&lt;br /&gt;
==[[User:Latif Khalifa | Latif Khalifa]]==&lt;br /&gt;
&lt;br /&gt;
* 6144/6144&lt;br /&gt;
&lt;br /&gt;
==[[User:Tracy Welles | Tracy Welles ]]==&lt;br /&gt;
&lt;br /&gt;
* 4352/4352&lt;br /&gt;
&lt;br /&gt;
==[[User:Bluecat Jun | Bluecat Jun ]]==&lt;br /&gt;
&lt;br /&gt;
* 7424/7424&lt;br /&gt;
&lt;br /&gt;
==[[User:Julie Wasserstrom | Julie Wasserstrom ]]==&lt;br /&gt;
&lt;br /&gt;
* 5888/5888&lt;br /&gt;
&lt;br /&gt;
==[[User:Chris Samtanko | Chris Samtanko ]]==&lt;br /&gt;
&lt;br /&gt;
*4864/4864&lt;br /&gt;
&lt;br /&gt;
==[http://mrtopf.de/blog Tao Takashi ]==&lt;br /&gt;
&lt;br /&gt;
*6656/6656&lt;br /&gt;
&lt;br /&gt;
==[[User:Jim Kupferberg | Jim Kupferberg  ]]==&lt;br /&gt;
&lt;br /&gt;
*6667/6667&lt;br /&gt;
&lt;br /&gt;
==[[User:Emma Nowhere | Emma Nowhere ]]==&lt;br /&gt;
&lt;br /&gt;
*5120/5120&lt;br /&gt;
&lt;br /&gt;
[[Category:Open_Grid_Public_Beta]]&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LSL_Browser_HUD&amp;diff=66638</id>
		<title>Talk:LSL Browser HUD</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LSL_Browser_HUD&amp;diff=66638"/>
		<updated>2008-05-08T17:54:54Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Thoughts ==&lt;br /&gt;
&lt;br /&gt;
It looks good, though i have a few ideas:&lt;br /&gt;
* There should be an address bar even if it is read only (don&#039;t want to make spoof attacks possible).&lt;br /&gt;
* The window should be user resizable without limitation other then the SL window size.&lt;br /&gt;
* It needs to be one or more of these a) minimizable b) tab browsing or c) window roll up (a button that collapses it to a title bar)&lt;br /&gt;
* There needs to be a &#039;&#039;&#039;BROWSER_HUD_JAVASCRIPT&#039;&#039;&#039; command that allows the object to manipulate it&#039;s Browser HUD. It would look something like [BROWSER_HUD_JAVASCRIPT, string eval].&lt;br /&gt;
** string eval - Would be executed in the Browser Hud window by the eval function.&lt;br /&gt;
** This would allow for a script to manipulate it&#039;s Browser Hud without having to bounce the user off a webserver.&lt;br /&gt;
** The user should only be able to eval javascript on approved URL handlers (http &amp;amp; https for starters, more could be added with some hidden pref), we don&#039;t want accidental privilege elevation by hijacking about:kitchensink.&lt;br /&gt;
* Consider extensions to navigator javascript object so that javascript can access viewer specific informations such as SL location, camera position, user name, etc. Might be useful. Consider adding new events so that javascript can hook them. Imagine a user map HUD that updated with the camera (and didn&#039;t rely upon script having to know where the camera was; would be a bandwidth savings).&lt;br /&gt;
** Permissions? Auto-grant?&lt;br /&gt;
*** [&#039;&#039;&#039;BROWSER_HUD_PERMISSIONS&#039;&#039;&#039;, integer mask] ?&lt;br /&gt;
--[[User:Strife Onizuka|Strife Onizuka]] 22:28, 9 April 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sweet idea! To replace current OI HUD, Hope this function officially support multi-language.&lt;br /&gt;
&lt;br /&gt;
-- [[User:Nock Forager|Nock Forager]] 23:43, 27 April 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Impersonation ==&lt;br /&gt;
&lt;br /&gt;
I just gots to know what would happen if...&lt;br /&gt;
&amp;lt;lsl&amp;gt;llMiniBrowserCreate( llGetOwner(), &amp;quot;Sillyness&amp;quot;,&lt;br /&gt;
    &amp;quot;secondlife:///app/browserhudchat/I&#039;m not a script impersonating the user, no really I&#039;m not!&amp;quot;,&lt;br /&gt;
    &amp;lt;0,0,0&amp;gt;, 0);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
--[[User:Strife Onizuka|Strife Onizuka]] 22:38, 9 April 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
This is the first LSL idea I&#039;ve seen in a long time that I&#039;m actually excited about.  Is there an JIRA open to vote for this?&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=39132</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=39132"/>
		<updated>2007-11-06T00:26:14Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* About */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Shrinking linked prims is difficult because no prim in the linked set can be smaller than .01 meters in any dimension (length, width, or height).&lt;br /&gt;
This script finds the smallest prims and increases their size slightly so that the linkset can be sized down.&lt;br /&gt;
&lt;br /&gt;
# Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
# Type /1fspsetup to copy copy scripts into all the prims in the linkset&lt;br /&gt;
# Take the linkset into inventory&lt;br /&gt;
# Re-rez the linkset from inventory&lt;br /&gt;
# Select the linkset and choose &amp;quot;Set Scripts to Running in Selection&amp;quot; under the Tools menu&lt;br /&gt;
# Type /1fsprun to fix all the small prims&lt;br /&gt;
# Resize the linkset object to the desired size&lt;br /&gt;
# Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FixSmallPrims ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// How to use:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fspsetup to copy copy scripts into all the prims in the linkset&lt;br /&gt;
// 3. Take the linkset into inventory&lt;br /&gt;
// 4. Re-rez the linkset from inventory&lt;br /&gt;
// 5. Select the linkset and choose &amp;quot;Set Scripts to Running in Selection&amp;quot; under the Tools menu&lt;br /&gt;
// 6. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 7. Resize the linkset object to the desired size&lt;br /&gt;
// 8. Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
&lt;br /&gt;
vector backupScale = ZERO_VECTOR;&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
integer rescaleX = FALSE;&lt;br /&gt;
integer rescaleY = FALSE;&lt;br /&gt;
integer rescaleZ = FALSE;&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        backupScale = llGetScale();&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llSetScale(backupScale);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleX = FALSE;&lt;br /&gt;
    rescaleY = FALSE;&lt;br /&gt;
    rescaleZ = FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cleanup() {&lt;br /&gt;
    vector scale = llGetScale();&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX) {&lt;br /&gt;
        scale.x = backupScale.x;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleY) {&lt;br /&gt;
        scale.y = backupScale.y;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleZ) {&lt;br /&gt;
        scale.z = backupScale.z;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
        llSay(0, &amp;quot;Cleaning scale of linked prim #&amp;quot; + (string)llGetLinkNumber());&lt;br /&gt;
        llSetScale(scale);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
&lt;br /&gt;
    vector scale = llGetScale();&lt;br /&gt;
&lt;br /&gt;
    if (scale.x &amp;lt; .015) {&lt;br /&gt;
        scale.x = .015;&lt;br /&gt;
        rescaleX = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (scale.y &amp;lt; .015) {&lt;br /&gt;
        scale.y = .015;&lt;br /&gt;
        rescaleY = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (scale.z &amp;lt; .015) {&lt;br /&gt;
        scale.z = .015;&lt;br /&gt;
        rescaleZ = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
        llSay(0, &amp;quot;Fixing size of linked prim #&amp;quot; + (string)llGetLinkNumber());&lt;br /&gt;
        llSetScale(scale);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GiveScriptToLinkedPrims()&lt;br /&gt;
{&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 2; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        key prim = llGetLinkKey(i);&lt;br /&gt;
        llGiveInventory(prim, llGetScriptName());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        if (linkNum &amp;lt; 2) llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        if (linkNum &amp;lt; 2) llSay(0, &amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
   }    &lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;fspsetup&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            GiveScriptToLinkedPrims();&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, 0, message, NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        &lt;br /&gt;
        if (str == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llSay(0, &amp;quot;Script is installed and running in linked prim #&amp;quot; + (string)linkNum);            &lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fspcleanup&amp;quot;) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fsprun&amp;quot;) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=39131</id>
		<title>Category:LSL Library</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=39131"/>
		<updated>2007-11-06T00:23:28Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* LSL Script Library */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
==Script Library==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em 0.5em 1.5em&amp;quot;&amp;gt;&lt;br /&gt;
Come to this page to see complex examples that show how to combine parts of LSL.&lt;br /&gt;
&lt;br /&gt;
Go to the [[:Category:LSL Examples|LSL Examples]] page to see brief examples of how to use parts of LSL &lt;br /&gt;
&lt;br /&gt;
Why collect complex examples here? Well, ...&lt;br /&gt;
&lt;br /&gt;
There are many [[script|scripts]] that have become buried in the [http://forums.secondlife.com/forumdisplay.php?f=15 Scripting Library forum], were lost with the death of the scripting forums, or sit idle in [[inventory|inventories]] that could be useful and should be more accessible.&lt;br /&gt;
&lt;br /&gt;
Other scripters may be in the same situation. This wiki is a well-suited medium for a script library. Feel free to add your scripts to the script library by creating new pages for them and linking to those pages here.&lt;br /&gt;
&lt;br /&gt;
Note that there are many more scripts in the LSL Library here, but you can&#039;t get to them if you don&#039;t know they exist, because they are subpages now, instead of an automatically updated category.  Good luck searching.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules for posting: ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
#Your script must be tested and working. If it&#039;s not, stick it in your user-space until it is. This is a list of working, usable scripts.&lt;br /&gt;
#Add a link to your script&#039;s page here. Link back to this page from your script&#039;s page. Start your page with &amp;lt;nowiki&amp;gt;{{LSL Header}}&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
#Do not add scripts that duplicate the same functionality as an existing script or built in {{LSLGC|Functions|function}}. If yours does, explain why.&lt;br /&gt;
#Do not list simple scripts here. Include those among the [[:Category:LSL Examples|LSL Examples]] instead.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
==LSL Script Library==&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||[[0-Lag_Poseball]]&lt;br /&gt;
||[[User:Jippen Faddoul|Jippen Faddoul]]&lt;br /&gt;
||A simple poseball with no lag&lt;br /&gt;
|-&lt;br /&gt;
||[[AntiDelay Node]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Uses llMessageLinked to stop those pesky delays.&lt;br /&gt;
|-&lt;br /&gt;
||[[Basic Encryption Modules]]&lt;br /&gt;
||[[User:Beverly Larkin|Beverly Larkin]]&lt;br /&gt;
||Basic encryption scripts, allows you to encrypt a float and shout it to another prim on a randomly chosen channel.&lt;br /&gt;
|-&lt;br /&gt;
||[[Binary Clock v1.1|Binary Clock]]&lt;br /&gt;
||[[User:Fox Diller|Fox Diller]]&lt;br /&gt;
||A Binary Clock.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
||[[Builders Buddy|Builder&#039;s Buddy Tool]]&lt;br /&gt;
||[[User:Newfie Pendragon|Newfie Pendragon]]&lt;br /&gt;
||Script to easily move/rotate large builds that exceed the linkable size limit (30 meters).&lt;br /&gt;
|-&lt;br /&gt;
||[[Camera Sync]]&lt;br /&gt;
||[[User:Meyermagic Salome|Meyermagic Salome]] and [[User:Nomad Padar|Nomad Padar]]&lt;br /&gt;
||A system to synchronize the cameras of two avatars.&lt;br /&gt;
|-&lt;br /&gt;
||[[Chatbot]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Compile and run the LSL you type on a channel, faster than you can thru the 2007-08 SL GUI.&lt;br /&gt;
|-&lt;br /&gt;
||[[Chat Logger (GPL)]]&lt;br /&gt;
||[[User:Nobody Fugazi|Nobody Fugazi]]&lt;br /&gt;
||Chat logger which requests permission from participants before recording them.&lt;br /&gt;
|-&lt;br /&gt;
||[[Chat_Relay|Chat Relay]]&lt;br /&gt;
||[[User:grumble Loudon|grumble Loudon]]&lt;br /&gt;
||A Chat relay which can be routed using a path header and won&#039;t echo.&lt;br /&gt;
|-&lt;br /&gt;
||[[Code Racer]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Race two versions of code forever, to see which runs faster.&lt;br /&gt;
|-&lt;br /&gt;
||[[Code Sizer]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Count the bytes compiled from source code, to measure how to write small code.&lt;br /&gt;
|-&lt;br /&gt;
||[[Color conversion scripts|Color Conversion]]&lt;br /&gt;
||[[User:Sally LaSalle|Sally LaSalle]]&lt;br /&gt;
||Convert between Red Green Blue (RGB) and Hue Saturation Value (HSV).&lt;br /&gt;
|-&lt;br /&gt;
||[[Library Combined Library|Combined Library]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Library of mostly encoding and decoding functions, some more useful then others.&lt;br /&gt;
* String functions: Replace / Trim right / Trim left / Trim both&lt;br /&gt;
* Unicode conversion: UTF8 to Unicode / Unicode to UTF8&lt;br /&gt;
* List functions: Replace / Compare&lt;br /&gt;
|-&lt;br /&gt;
||[[Computer:jaycoonlanguage]]&lt;br /&gt;
||[[User:jayco121 Bing|jayco121 Bing]]&lt;br /&gt;
|| A language written in LSL that is meant for my computer (available at the shop).&lt;br /&gt;
|-&lt;br /&gt;
||[[Library_Chat_Relay|Conversation Relay]]&lt;br /&gt;
||[[User:Jippen Faddoul|Jippen Faddoul]]&lt;br /&gt;
||Chat relay which requests permission from participants before relaying their messages. Also includes their attachments. (ToS compliant).&lt;br /&gt;
|-&lt;br /&gt;
||[[Dataserver API]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Dataserver Framework for Notecards.&lt;br /&gt;
|-&lt;br /&gt;
||[[Date Library]]&lt;br /&gt;
||[[User:Corto Maltese|Corto Maltese]]&lt;br /&gt;
|| Date library, based on number of day since march 3rd 1600, can be used to calculate weekday, date differences, and date offset, and date formating.&lt;br /&gt;
|-&lt;br /&gt;
||[[Day of the Week]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Function to get day of the week from [[llGetUnixTime]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Describe Chatter]]&lt;br /&gt;
||Anonymous&lt;br /&gt;
||Chat to see yourself as others do.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog Control]]&lt;br /&gt;
||[[User:Nargus Asturias|Nargus Asturias]]&lt;br /&gt;
|| A (not-so) simple dialog control script. Call dialog and receive selected value via link_message(), with built-in timer and link_message() notification on time out. Supports multi-pages dialog and numeric property dialog. Button text and dialog&#039;s returned value can differ.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog NumberPad|Dialog Number Pad]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Use a dialog to accept positive integer input from users.&lt;br /&gt;
|-&lt;br /&gt;
||[[Efficiency Tester]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Tests the speed of a function.&lt;br /&gt;
|-&lt;br /&gt;
||[[Email-to-IM|Email2IM]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Send IMs to SL friends via email (translate emails from friends into IMs).&lt;br /&gt;
|-&lt;br /&gt;
||[[Fix Small Prims|Fix_Small_Prims]]&lt;br /&gt;
||[[User:Emma Nowhere|Emma Nowhere]]&lt;br /&gt;
||Finds and adjusts the smallest prims in a linkset so that it can be scaled down further.&lt;br /&gt;
|-&lt;br /&gt;
||[[Float2Hex]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Very useful for transporting [[float|floats]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Follower (script)|Follower]]&lt;br /&gt;
||Unknown, uploaded by [[User:Slik Swindlehurst|Slik Swindlehurst]]&lt;br /&gt;
||Makes an object follow the nearest person. Do not use for [[grief|griefing]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Group Privacy]]&lt;br /&gt;
||[[User:Chance Unknown|Chance Unknown]]&lt;br /&gt;
||Security device to insure members of a group can have a private area. Deactivates when nobody present.&lt;br /&gt;
|-&lt;br /&gt;
||[[Hello Avatar]]&lt;br /&gt;
||Linden Lab&lt;br /&gt;
||SL&#039;s default script.&lt;br /&gt;
|-&lt;br /&gt;
||[[High Altitude Rezzer]]&lt;br /&gt;
||[[User:Jesse Barnett|Jesse Barnett]]&lt;br /&gt;
||Vehicle that goes straight up and then rezzes objects up to 4,096 meters.&lt;br /&gt;
|-&lt;br /&gt;
||[[iTunes RPC Email|iTunes RPC]]&lt;br /&gt;
||[[User:Fox Diller|Fox Diller]]&lt;br /&gt;
||iTunes RPC via LSL [[llEmail]] and [[llRemoteDataReply]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Holodeck]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Home Rezzing System (Open Source).&lt;br /&gt;
|-&lt;br /&gt;
||[[Intra-Region Update Server]]&lt;br /&gt;
||[[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
||Centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
|-&lt;br /&gt;
||[[Inventory Menu]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Inventory Based Menu System.&lt;br /&gt;
|-&lt;br /&gt;
||[[Key Pad Door|Keypad Door]]&lt;br /&gt;
||[[User:Tdub Dowler|Tdub Dowler]]&lt;br /&gt;
|| Door and keypad with changeable code. Follow instructions carefully!&lt;br /&gt;
|-&lt;br /&gt;
||[[Merge Sort]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Implements a Merge Sort in LSL, however this code is way slower than [[llListSort]]. Don&#039;t use this in a script!&lt;br /&gt;
|-&lt;br /&gt;
||[[Multirezzer|Multirezzer (on collision)]]&lt;br /&gt;
||[[User:Beet Streeter|Beet Streeter]]&lt;br /&gt;
||Spawns up to 10 objects when the object containing the script collides with a user.&lt;br /&gt;
|-&lt;br /&gt;
||[[SL_NTPoHTTP_v1.1_client|NTP over HTTP client]]&lt;br /&gt;
|[[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
||Emulates the function of [[llGetWallclock]] for any timezone by using SLOpenID&#039;s SLNTPoHTTP service. Also supports ISO 8601 and RFC 2822 timestamps.&lt;br /&gt;
|-&lt;br /&gt;
||[[Object to Data v1.1|Object to Data]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Turns an object into text. Allows people to transfer objects through notecards.&lt;br /&gt;
|-&lt;br /&gt;
||[[ParseString2List]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Same as [[llParseString2List]] and [[llParseStringKeepNulls]], but not limited to 8 spacers or separators. Thus substitute a call to the [[llParseString2List]] and [[llParseStringKeepNulls]] functions by a call to [[Parse_String_To_List|ParseString2List]] whenever you have more than 8 separators or more than 8 spacers. &lt;br /&gt;
|-&lt;br /&gt;
||[[Prefix Calculator]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
|| A calculator that evaluates expressions in prefix notation. &lt;br /&gt;
&amp;lt;code&amp;gt;+ 3 4 = 5. * + 1 2 + 3 4 = 14.&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||[[Pseudo-random Number Generator]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Generates a Pseudo-random number between -0x7FFFFFFF and 0x7FFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
||[[Say Region Frames Per Second|Region Frames Per Second]]&lt;br /&gt;
||[[User:Heymeriou Mystakidou|Heymariou Mystakidou]]&lt;br /&gt;
|| Says the region name and frames per second out loud on command.&lt;br /&gt;
|-&lt;br /&gt;
||[[Script Override Functions]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||bypass default strings, integer etc in chat channel.&lt;br /&gt;
|-&lt;br /&gt;
||[[Self Upgrading Script Enhanced]]&lt;br /&gt;
||[[User:Cron Stardust|Cron Stardust]]&lt;br /&gt;
||Keeps only latest version of the script on prim (even with multiple adds of the same script!)&lt;br /&gt;
|-&lt;br /&gt;
||[[SHA1|SHA1 Hash]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Preforms a SHA1 Hash on an input text. Similar to MD5 only (slightly) more secure.&lt;br /&gt;
|-&lt;br /&gt;
||[[SL Mail V1.2]]&lt;br /&gt;
||[[User:Flennan Roffo|Flennan Roffo]]&lt;br /&gt;
||Second Life mail client V1.2 (released sept&#039;07). Send and receive mail from within Second Life from and to any address. With Address Book function and many chat commands. V1.3 is upcoming soon! &lt;br /&gt;
|-&lt;br /&gt;
||[[String Compare]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Compares two strings and reliably returns either 1, -1, or 0 if they are the same.&lt;br /&gt;
|-&lt;br /&gt;
||[[Texture Menu Management|Texture Management]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Dialog Menu based Texture Selection.&lt;br /&gt;
|-&lt;br /&gt;
||[[TightList]]&lt;br /&gt;
||[[User:Strife Onizuka|Revolution Perenti]]&lt;br /&gt;
||Tight List is a family of functions for encoding lists as strings and then decoding them back into lists. &lt;br /&gt;
&lt;br /&gt;
There are two flavors: TightList and TightListType. TightListType preserves types and uses a 6 char header, while TightList uses a 1 char header that doesn&#039;t preserve type. &lt;br /&gt;
|-&lt;br /&gt;
||[[Timer Module]]&lt;br /&gt;
||[[User:Isabelle Aquitaine|Isabelle Aquitaine]]&lt;br /&gt;
||Manage multiple timers via linked messages.&lt;br /&gt;
|-&lt;br /&gt;
||[[Unix2DateTime]]&lt;br /&gt;
|[[User:Flennan Roffo|Flennan Roffo]]&lt;br /&gt;
||Conversion from Unix time (llGetUnixTime()) to date and time string and vice versa.&lt;br /&gt;
|-&lt;br /&gt;
||[[Under Age Boot]]&lt;br /&gt;
|[[User:Chance Unknown|Chance Unknown]]&lt;br /&gt;
||Security device example to teleport home accounts below a minimum age limit; can be useful in combating free griefer accounts.&lt;br /&gt;
|-&lt;br /&gt;
||[[WarpPos]]&lt;br /&gt;
|[[User:Keknehv Psaltery|Keknehv Psaltery]]&lt;br /&gt;
||Non-physical movement without the 10m limit.&lt;br /&gt;
|-&lt;br /&gt;
||[[XTEA Strong Encryption Implementation]]&lt;br /&gt;
||[[User:Morse Dillon|Morse Dillon]]&lt;br /&gt;
||An LSL implementation of XTEA (eXtended Tiny Encryption Algorithm).  This is the first known public release of a &#039;real&#039; strong encryption implementation in LSL and is released under the GNU General Public License (GPL).&lt;br /&gt;
|-&lt;br /&gt;
||[[XyText 1.5|XyText]]&lt;br /&gt;
||[[User:Xylor Baysklef|Xylor Baysklef]]&lt;br /&gt;
|| Display text (up to 10 characters) on a prim. Use as many prims as desired.&lt;br /&gt;
|-&lt;br /&gt;
||[[XyzzyText|XyzzyText]]&lt;br /&gt;
||[[User:Thraxis Epsilon|Thraxis Epsilon]] and [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
|| Display text (up to 10 characters) on a prim. Way more efficient than XyText.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Support Script Library==&lt;br /&gt;
These are scripts in other languages, intended to be run on other systems that support scripts written in LSL&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||[[Secure HTTP Post]]&lt;br /&gt;
||[[User:Corto Maltese|Corto Maltese]]&lt;br /&gt;
|| This small library allows you to send Secure requests to your website with a security mechanism aimed to stop hacking. Comprises of LSL client script and PHP server script.&lt;br /&gt;
|-&lt;br /&gt;
|| Silo&lt;br /&gt;
|| [[User:Zero_Linden|Zero Linden]]&lt;br /&gt;
|| General purpose data store in PHP.  Use this to persist arbitrary data from LSL via [[llHTTPRequest]].  See:&lt;br /&gt;
* [http://www.notabene-sl.com/misc/silo-README.txt README] file&lt;br /&gt;
* [http://www.notabene-sl.com/misc/silo.tgz silo.tgz] tarball&lt;br /&gt;
* forum post [http://forums.secondlife.com/showthread.php?t=119570 Announcement].&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:SignpostMarv Martin/PHP/llXorBase64StringsCorrect|llXorBase64StringsCorrect]]&lt;br /&gt;
|| [[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
|| An implementation of [[llXorBase64StringsCorrect]] in PHP- should be useful if you&#039;re using llXorBase64StringsCorrect to do cryptography work in LSL2 and posting it out to the web via [[llHTTPRequest]].&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:SignpostMarv Martin/PHP/lsl fu.php|lsl_fu.php]]&lt;br /&gt;
|| [[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
|| A basic OOP&#039;d PHP Class containing VeloxSeverine&#039;s $_POST fixer and Marv&#039;s own eccentric ideas for &amp;quot;fixing&amp;quot; things.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== See Also ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Articles&#039;&#039;&#039;&lt;br /&gt;
*[[:Category:LSL Examples| Examples]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=39130</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=39130"/>
		<updated>2007-11-06T00:20:21Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* UpdateServer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Shrinking linked prims is difficult because no prim in the linked set can be smaller that .01 meters in any dimension.&lt;br /&gt;
This script finds the smallest prims and increases their size slightly so that the link set can be sized down.&lt;br /&gt;
&lt;br /&gt;
# Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
# Type /1fspsetup to copy copy scripts into all the prims in the linkset&lt;br /&gt;
# Take the linkset into inventory&lt;br /&gt;
# Re-rez the linkset from inventory&lt;br /&gt;
# Select the linkset and choose &amp;quot;Set Scripts to Running in Selection&amp;quot; under the Tools menu&lt;br /&gt;
# Type /1fsprun to fix all the small prims&lt;br /&gt;
# Resize the linkset object to the desired size&lt;br /&gt;
# Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FixSmallPrims ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// How to use:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fspsetup to copy copy scripts into all the prims in the linkset&lt;br /&gt;
// 3. Take the linkset into inventory&lt;br /&gt;
// 4. Re-rez the linkset from inventory&lt;br /&gt;
// 5. Select the linkset and choose &amp;quot;Set Scripts to Running in Selection&amp;quot; under the Tools menu&lt;br /&gt;
// 6. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 7. Resize the linkset object to the desired size&lt;br /&gt;
// 8. Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
&lt;br /&gt;
vector backupScale = ZERO_VECTOR;&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
integer rescaleX = FALSE;&lt;br /&gt;
integer rescaleY = FALSE;&lt;br /&gt;
integer rescaleZ = FALSE;&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        backupScale = llGetScale();&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llSetScale(backupScale);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleX = FALSE;&lt;br /&gt;
    rescaleY = FALSE;&lt;br /&gt;
    rescaleZ = FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cleanup() {&lt;br /&gt;
    vector scale = llGetScale();&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX) {&lt;br /&gt;
        scale.x = backupScale.x;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleY) {&lt;br /&gt;
        scale.y = backupScale.y;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleZ) {&lt;br /&gt;
        scale.z = backupScale.z;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
        llSay(0, &amp;quot;Cleaning scale of linked prim #&amp;quot; + (string)llGetLinkNumber());&lt;br /&gt;
        llSetScale(scale);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
&lt;br /&gt;
    vector scale = llGetScale();&lt;br /&gt;
&lt;br /&gt;
    if (scale.x &amp;lt; .015) {&lt;br /&gt;
        scale.x = .015;&lt;br /&gt;
        rescaleX = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (scale.y &amp;lt; .015) {&lt;br /&gt;
        scale.y = .015;&lt;br /&gt;
        rescaleY = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (scale.z &amp;lt; .015) {&lt;br /&gt;
        scale.z = .015;&lt;br /&gt;
        rescaleZ = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
        llSay(0, &amp;quot;Fixing size of linked prim #&amp;quot; + (string)llGetLinkNumber());&lt;br /&gt;
        llSetScale(scale);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GiveScriptToLinkedPrims()&lt;br /&gt;
{&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 2; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        key prim = llGetLinkKey(i);&lt;br /&gt;
        llGiveInventory(prim, llGetScriptName());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        if (linkNum &amp;lt; 2) llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        if (linkNum &amp;lt; 2) llSay(0, &amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
   }    &lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;fspsetup&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            GiveScriptToLinkedPrims();&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, 0, message, NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        &lt;br /&gt;
        if (str == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llSay(0, &amp;quot;Script is installed and running in linked prim #&amp;quot; + (string)linkNum);            &lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fspcleanup&amp;quot;) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fsprun&amp;quot;) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=39129</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=39129"/>
		<updated>2007-11-06T00:17:21Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* About */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Shrinking linked prims is difficult because no prim in the linked set can be smaller that .01 meters in any dimension.&lt;br /&gt;
This script finds the smallest prims and increases their size slightly so that the link set can be sized down.&lt;br /&gt;
&lt;br /&gt;
# Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
# Type /1fspsetup to copy copy scripts into all the prims in the linkset&lt;br /&gt;
# Take the linkset into inventory&lt;br /&gt;
# Re-rez the linkset from inventory&lt;br /&gt;
# Select the linkset and choose &amp;quot;Set Scripts to Running in Selection&amp;quot; under the Tools menu&lt;br /&gt;
# Type /1fsprun to fix all the small prims&lt;br /&gt;
# Resize the linkset object to the desired size&lt;br /&gt;
# Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UpdateServer ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// How to use:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fspsetup to copy copy scripts into all the prims in the linkset&lt;br /&gt;
// 3. Take the linkset into inventory&lt;br /&gt;
// 4. Re-rez the linkset from inventory&lt;br /&gt;
// 5. Select the linkset and choose &amp;quot;Set Scripts to Running in Selection&amp;quot; under the Tools menu&lt;br /&gt;
// 6. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 7. Resize the linkset object to the desired size&lt;br /&gt;
// 8. Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
&lt;br /&gt;
vector backupScale = ZERO_VECTOR;&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
integer rescaleX = FALSE;&lt;br /&gt;
integer rescaleY = FALSE;&lt;br /&gt;
integer rescaleZ = FALSE;&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        backupScale = llGetScale();&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llSetScale(backupScale);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleX = FALSE;&lt;br /&gt;
    rescaleY = FALSE;&lt;br /&gt;
    rescaleZ = FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cleanup() {&lt;br /&gt;
    vector scale = llGetScale();&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX) {&lt;br /&gt;
        scale.x = backupScale.x;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleY) {&lt;br /&gt;
        scale.y = backupScale.y;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleZ) {&lt;br /&gt;
        scale.z = backupScale.z;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
        llSay(0, &amp;quot;Cleaning scale of linked prim #&amp;quot; + (string)llGetLinkNumber());&lt;br /&gt;
        llSetScale(scale);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
&lt;br /&gt;
    vector scale = llGetScale();&lt;br /&gt;
&lt;br /&gt;
    if (scale.x &amp;lt; .015) {&lt;br /&gt;
        scale.x = .015;&lt;br /&gt;
        rescaleX = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (scale.y &amp;lt; .015) {&lt;br /&gt;
        scale.y = .015;&lt;br /&gt;
        rescaleY = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (scale.z &amp;lt; .015) {&lt;br /&gt;
        scale.z = .015;&lt;br /&gt;
        rescaleZ = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
        llSay(0, &amp;quot;Fixing size of linked prim #&amp;quot; + (string)llGetLinkNumber());&lt;br /&gt;
        llSetScale(scale);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GiveScriptToLinkedPrims()&lt;br /&gt;
{&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 2; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        key prim = llGetLinkKey(i);&lt;br /&gt;
        llGiveInventory(prim, llGetScriptName());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        if (linkNum &amp;lt; 2) llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        if (linkNum &amp;lt; 2) llSay(0, &amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
   }    &lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;fspsetup&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            GiveScriptToLinkedPrims();&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, 0, message, NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        &lt;br /&gt;
        if (str == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llSay(0, &amp;quot;Script is installed and running in linked prim #&amp;quot; + (string)linkNum);            &lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fspcleanup&amp;quot;) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fsprun&amp;quot;) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=39128</id>
		<title>Fix Small Prims</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Fix_Small_Prims&amp;diff=39128"/>
		<updated>2007-11-06T00:14:34Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: New page: {{LSL Header}}{{RightToc}} &amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt; == About == &amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt; Fix Small Prims by Emma Nowhere  Shrinking linked prims is difficult because no pri...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Fix Small Prims by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
Shrinking linked prims is difficult because no prim in the linked set can be smaller that .01 meters in any dimension.&lt;br /&gt;
This script finds the smallest prims and increases their size slightly so that the link set can be sized down.&lt;br /&gt;
&lt;br /&gt;
1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
2. Type /1fspsetup to copy copy scripts into all the prims in the linkset&lt;br /&gt;
3. Take the linkset into inventory&lt;br /&gt;
4. Re-rez the linkset from inventory&lt;br /&gt;
5. Select the linkset and choose &amp;quot;Set Scripts to Running in Selection&amp;quot; under the Tools menu&lt;br /&gt;
6. Type /1fsprun to fix all the small prims&lt;br /&gt;
7. Resize the linkset object to the desired size&lt;br /&gt;
8. Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== UpdateServer ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// FixSmallPrims&lt;br /&gt;
// by Emma Nowhere&lt;br /&gt;
//&lt;br /&gt;
// How to use:&lt;br /&gt;
// 1. Install this script in the root prim of a linked set of prims (aka &amp;quot;linkset&amp;quot;)&lt;br /&gt;
// 2. Type /1fspsetup to copy copy scripts into all the prims in the linkset&lt;br /&gt;
// 3. Take the linkset into inventory&lt;br /&gt;
// 4. Re-rez the linkset from inventory&lt;br /&gt;
// 5. Select the linkset and choose &amp;quot;Set Scripts to Running in Selection&amp;quot; under the Tools menu&lt;br /&gt;
// 6. Type /1fsprun to fix all the small prims&lt;br /&gt;
// 7. Resize the linkset object to the desired size&lt;br /&gt;
// 8. Type /1fspcleanup to remove the scripts from the linkset&lt;br /&gt;
&lt;br /&gt;
integer CHANNEL = 1;&lt;br /&gt;
&lt;br /&gt;
vector backupScale = ZERO_VECTOR;&lt;br /&gt;
integer backupStored = FALSE;&lt;br /&gt;
&lt;br /&gt;
integer rescaleX = FALSE;&lt;br /&gt;
integer rescaleY = FALSE;&lt;br /&gt;
integer rescaleZ = FALSE;&lt;br /&gt;
&lt;br /&gt;
backup() {&lt;br /&gt;
    if (!backupStored) {&lt;br /&gt;
        backupScale = llGetScale();&lt;br /&gt;
        backupStored = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
restore() {&lt;br /&gt;
    if (backupStored) {&lt;br /&gt;
        llSetScale(backupScale);&lt;br /&gt;
    }&lt;br /&gt;
    rescaleX = FALSE;&lt;br /&gt;
    rescaleY = FALSE;&lt;br /&gt;
    rescaleZ = FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cleanup() {&lt;br /&gt;
    vector scale = llGetScale();&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX) {&lt;br /&gt;
        scale.x = backupScale.x;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleY) {&lt;br /&gt;
        scale.y = backupScale.y;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleZ) {&lt;br /&gt;
        scale.z = backupScale.z;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
        llSay(0, &amp;quot;Cleaning scale of linked prim #&amp;quot; + (string)llGetLinkNumber());&lt;br /&gt;
        llSetScale(scale);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llRemoveInventory(llGetScriptName()); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process() {&lt;br /&gt;
    restore();&lt;br /&gt;
    backup();&lt;br /&gt;
&lt;br /&gt;
    vector scale = llGetScale();&lt;br /&gt;
&lt;br /&gt;
    if (scale.x &amp;lt; .015) {&lt;br /&gt;
        scale.x = .015;&lt;br /&gt;
        rescaleX = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (scale.y &amp;lt; .015) {&lt;br /&gt;
        scale.y = .015;&lt;br /&gt;
        rescaleY = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (scale.z &amp;lt; .015) {&lt;br /&gt;
        scale.z = .015;&lt;br /&gt;
        rescaleZ = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (rescaleX || rescaleY || rescaleZ) {&lt;br /&gt;
        llSay(0, &amp;quot;Fixing size of linked prim #&amp;quot; + (string)llGetLinkNumber());&lt;br /&gt;
        llSetScale(scale);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GiveScriptToLinkedPrims()&lt;br /&gt;
{&lt;br /&gt;
    integer p = llGetNumberOfPrims();&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    for (i = 2; i &amp;lt;= p; i++)&lt;br /&gt;
    {&lt;br /&gt;
        key prim = llGetLinkKey(i);&lt;br /&gt;
        llGiveInventory(prim, llGetScriptName());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        if (linkNum &amp;lt; 2) llListen(CHANNEL, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        if (linkNum &amp;lt; 2) llSay(0, &amp;quot;FixSmallPrims Installed&amp;quot;);&lt;br /&gt;
   }    &lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;fspsetup&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            GiveScriptToLinkedPrims();&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, 0, message, NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        integer linkNum = llGetLinkNumber();&lt;br /&gt;
        &lt;br /&gt;
        if (str == &amp;quot;fsptest&amp;quot;) {&lt;br /&gt;
            llSay(0, &amp;quot;Script is installed and running in linked prim #&amp;quot; + (string)linkNum);            &lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fspbackup&amp;quot;) {&lt;br /&gt;
            backup();&lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fsprestore&amp;quot;) {&lt;br /&gt;
            restore();&lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fspcleanup&amp;quot;) {        &lt;br /&gt;
            cleanup();                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (str == &amp;quot;fsprun&amp;quot;) {&lt;br /&gt;
            process();            &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#vardefine:sort|Fix Small Prims}}{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23733</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23733"/>
		<updated>2007-06-18T22:10:28Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* About */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= About =&lt;br /&gt;
&lt;br /&gt;
Intra-Region Update Server by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel as well as a list of all registered subscribers.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside any prims that you want to receive object updates from an UpdateServer.  You can have as many prims as you want subscribed to an UpdateServer, for example, all the teleport pads in your region.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
To send updates to group-owned objects, both the server and subscriber must belong to the same group (share and deed to group) and you must make your group active for your avatar (so that your group tag is visible).&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.01 Release&lt;br /&gt;
 //    Copyright (C) 2007, Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //    License:&lt;br /&gt;
 //    &lt;br /&gt;
 //    This library is free software; you can redistribute it and/or&lt;br /&gt;
 //    modify it under the terms of the GNU Lesser General Public License&lt;br /&gt;
 //    as published by the Free Software Foundation; either&lt;br /&gt;
 //    version 2.1 of the License, or (at your option) any later version.&lt;br /&gt;
 //    &lt;br /&gt;
 //    This library is distributed in the hope that it will be useful,&lt;br /&gt;
 //    but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 //    GNU Lesser General Public License for more details.&lt;br /&gt;
 //    &lt;br /&gt;
 //    You should have received a copy of the GNU Lesser General Public License&lt;br /&gt;
 //    along with this library; if not, write to the Free Software&lt;br /&gt;
 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         if (l == 0) return;&lt;br /&gt;
 &lt;br /&gt;
         string command = llList2String(parsed, 0);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (command == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (command == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.01 Release&lt;br /&gt;
 //    Copyright (C) 2007, Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prin containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //    License:&lt;br /&gt;
 //    &lt;br /&gt;
 //    This library is free software; you can redistribute it and/or&lt;br /&gt;
 //    modify it under the terms of the GNU Lesser General Public License&lt;br /&gt;
 //    as published by the Free Software Foundation; either&lt;br /&gt;
 //    version 2.1 of the License, or (at your option) any later version.&lt;br /&gt;
 //    &lt;br /&gt;
 //    This library is distributed in the hope that it will be useful,&lt;br /&gt;
 //    but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 //    GNU Lesser General Public License for more details.&lt;br /&gt;
 //    &lt;br /&gt;
 //    You should have received a copy of the GNU Lesser General Public License&lt;br /&gt;
 //    along with this library; if not, write to the Free Software&lt;br /&gt;
 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llSay(0, &amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llSay(0, &amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         if (l == 0) return;&lt;br /&gt;
 &lt;br /&gt;
         string command = llList2String(parsed, 0);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23732</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23732"/>
		<updated>2007-06-18T22:08:10Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* UpdateServer - works better with group owned objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= About =&lt;br /&gt;
&lt;br /&gt;
Intra-Region Update Server by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel as well as a list of all registered subscribers.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside any prims that you want to receive object updates from an UpdateServer.  You can have as many prims as you want subscribed to an UpdateServer, for example, all the teleport pads in your region.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.01 Release&lt;br /&gt;
 //    Copyright (C) 2007, Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //    License:&lt;br /&gt;
 //    &lt;br /&gt;
 //    This library is free software; you can redistribute it and/or&lt;br /&gt;
 //    modify it under the terms of the GNU Lesser General Public License&lt;br /&gt;
 //    as published by the Free Software Foundation; either&lt;br /&gt;
 //    version 2.1 of the License, or (at your option) any later version.&lt;br /&gt;
 //    &lt;br /&gt;
 //    This library is distributed in the hope that it will be useful,&lt;br /&gt;
 //    but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 //    GNU Lesser General Public License for more details.&lt;br /&gt;
 //    &lt;br /&gt;
 //    You should have received a copy of the GNU Lesser General Public License&lt;br /&gt;
 //    along with this library; if not, write to the Free Software&lt;br /&gt;
 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         if (l == 0) return;&lt;br /&gt;
 &lt;br /&gt;
         string command = llList2String(parsed, 0);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (command == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (command == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.01 Release&lt;br /&gt;
 //    Copyright (C) 2007, Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prin containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //    License:&lt;br /&gt;
 //    &lt;br /&gt;
 //    This library is free software; you can redistribute it and/or&lt;br /&gt;
 //    modify it under the terms of the GNU Lesser General Public License&lt;br /&gt;
 //    as published by the Free Software Foundation; either&lt;br /&gt;
 //    version 2.1 of the License, or (at your option) any later version.&lt;br /&gt;
 //    &lt;br /&gt;
 //    This library is distributed in the hope that it will be useful,&lt;br /&gt;
 //    but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 //    GNU Lesser General Public License for more details.&lt;br /&gt;
 //    &lt;br /&gt;
 //    You should have received a copy of the GNU Lesser General Public License&lt;br /&gt;
 //    along with this library; if not, write to the Free Software&lt;br /&gt;
 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llSay(0, &amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llSay(0, &amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         if (l == 0) return;&lt;br /&gt;
 &lt;br /&gt;
         string command = llList2String(parsed, 0);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23730</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23730"/>
		<updated>2007-06-18T22:06:48Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* UpdateSubscriber - works better with group-owned objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= About =&lt;br /&gt;
&lt;br /&gt;
Intra-Region Update Server by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel as well as a list of all registered subscribers.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside any prims that you want to receive object updates from an UpdateServer.  You can have as many prims as you want subscribed to an UpdateServer, for example, all the teleport pads in your region.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         if (l == 0) return;&lt;br /&gt;
 &lt;br /&gt;
         string command = llList2String(parsed, 0);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (command == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (command == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.01 Release&lt;br /&gt;
 //    Copyright (C) 2007, Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prin containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //    License:&lt;br /&gt;
 //    &lt;br /&gt;
 //    This library is free software; you can redistribute it and/or&lt;br /&gt;
 //    modify it under the terms of the GNU Lesser General Public License&lt;br /&gt;
 //    as published by the Free Software Foundation; either&lt;br /&gt;
 //    version 2.1 of the License, or (at your option) any later version.&lt;br /&gt;
 //    &lt;br /&gt;
 //    This library is distributed in the hope that it will be useful,&lt;br /&gt;
 //    but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 //    GNU Lesser General Public License for more details.&lt;br /&gt;
 //    &lt;br /&gt;
 //    You should have received a copy of the GNU Lesser General Public License&lt;br /&gt;
 //    along with this library; if not, write to the Free Software&lt;br /&gt;
 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llSay(0, &amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llSay(0, &amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         if (l == 0) return;&lt;br /&gt;
 &lt;br /&gt;
         string command = llList2String(parsed, 0);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23195</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23195"/>
		<updated>2007-06-12T18:19:40Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* UpdateServer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= About =&lt;br /&gt;
&lt;br /&gt;
Intra-Region Update Server by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel as well as a list of all registered subscribers.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside any prims that you want to receive object updates from an UpdateServer.  You can have as many prims as you want subscribed to an UpdateServer, for example, all the teleport pads in your region.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         if (l == 0) return;&lt;br /&gt;
 &lt;br /&gt;
         string command = llList2String(parsed, 0);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (command == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (command == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prim containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         if (l == 0) return;&lt;br /&gt;
 &lt;br /&gt;
         string command = llList2String(parsed, 0);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23194</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23194"/>
		<updated>2007-06-12T18:18:41Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* UpdateSubscriber */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= About =&lt;br /&gt;
&lt;br /&gt;
Intra-Region Update Server by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel as well as a list of all registered subscribers.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside any prims that you want to receive object updates from an UpdateServer.  You can have as many prims as you want subscribed to an UpdateServer, for example, all the teleport pads in your region.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (llList2String(parsed, 0) == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prim containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         if (l == 0) return;&lt;br /&gt;
 &lt;br /&gt;
         string command = llList2String(parsed, 0);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23193</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23193"/>
		<updated>2007-06-12T18:16:11Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* UpdateSubscriber */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= About =&lt;br /&gt;
&lt;br /&gt;
Intra-Region Update Server by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel as well as a list of all registered subscribers.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside any prims that you want to receive object updates from an UpdateServer.  You can have as many prims as you want subscribed to an UpdateServer, for example, all the teleport pads in your region.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (llList2String(parsed, 0) == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prim containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         if (l == 0) return;&lt;br /&gt;
 &lt;br /&gt;
         string command = llList2String(parsed, 0);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (command == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (command == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (command == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23181</id>
		<title>User:Emma Nowhere</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23181"/>
		<updated>2007-06-12T17:17:18Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mysterious Scripter&lt;br /&gt;
&lt;br /&gt;
==LSL Projects==&lt;br /&gt;
&lt;br /&gt;
[[Intra-Region_Update_Server]] - Centrally update objects such as Freeview screens or teleport pads&lt;br /&gt;
&lt;br /&gt;
==My Other SL-Related Projects==&lt;br /&gt;
&lt;br /&gt;
[http://emmanowhere.blogspot.com/ Nowhere but here...] - My blog&lt;br /&gt;
&lt;br /&gt;
[http://www.photomovr.com/ PhotoMovr] - Convert Flickr photo sets into SL-Ready Quicktime movies for use as parcel media&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23180</id>
		<title>User:Emma Nowhere</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23180"/>
		<updated>2007-06-12T17:15:05Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mysterious Scripter&lt;br /&gt;
&lt;br /&gt;
==My Other SL-Related Projects==&lt;br /&gt;
&lt;br /&gt;
[http://emmanowhere.blogspot.com/ Nowhere but here...] - My blog&lt;br /&gt;
&lt;br /&gt;
[http://www.photomovr.com/ PhotoMovr] - Convert Flickr photo sets into SL-Ready Quicktime movies for use as parcel media&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23178</id>
		<title>User:Emma Nowhere</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23178"/>
		<updated>2007-06-12T17:13:16Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mysterious Scripter&lt;br /&gt;
&lt;br /&gt;
==My Other SL-Related Projects==&lt;br /&gt;
&lt;br /&gt;
[http://emmanowhere.blogspot.com/ My Blog: Nowhere but here...]&lt;br /&gt;
&lt;br /&gt;
[http://www.photomovr.com/ PhotoMovr] - Convert Flickr photo sets into SL-Ready Quicktime movies for use as parcel media&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23176</id>
		<title>User:Emma Nowhere</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23176"/>
		<updated>2007-06-12T17:12:38Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mysterious Scripter&lt;br /&gt;
&lt;br /&gt;
==My Other SL-Related Projects==&lt;br /&gt;
&lt;br /&gt;
[http://emmanowhere.blogspot.com/ My Blog: Nowhere but here...]&lt;br /&gt;
&lt;br /&gt;
[http://www.photomovr.com/ PhotoMovr] - Convert Flickr photosets into SL-Ready Quicktime movies for use as parcel media&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23175</id>
		<title>User:Emma Nowhere</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23175"/>
		<updated>2007-06-12T17:11:56Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mysterious Scripter&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://emmanowhere.blogspot.com/ Blog: Nowhere but here...]&lt;br /&gt;
&lt;br /&gt;
[http://www.photomovr.com/ PhotoMovr] - convert Flickr photosets into SL-Ready Quicktime movies for use as parcel media&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23174</id>
		<title>User:Emma Nowhere</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Emma_Nowhere&amp;diff=23174"/>
		<updated>2007-06-12T17:10:35Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mysterious Scripter&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[http://emmanowhere.blogspot.com/|Blog: Nowhere but here...]]&lt;br /&gt;
&lt;br /&gt;
[[http://www.photomovr.com/|PhotoMovr]] - convert Flickr photosets into SL-Ready Quicktime movies for use as parcel media&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23173</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23173"/>
		<updated>2007-06-12T17:08:20Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* About */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= About =&lt;br /&gt;
&lt;br /&gt;
Intra-Region Update Server by [[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel as well as a list of all registered subscribers.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside any prims that you want to receive object updates from an UpdateServer.  You can have as many prims as you want subscribed to an UpdateServer, for example, all the teleport pads in your region.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (llList2String(parsed, 0) == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prim containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23172</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23172"/>
		<updated>2007-06-12T17:02:56Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= About =&lt;br /&gt;
&lt;br /&gt;
Intra-Region Update Server by Emma Nowhere&lt;br /&gt;
&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel as well as a list of all registered subscribers.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside any prims that you want to receive object updates from an UpdateServer.  You can have as many prims as you want subscribed to an UpdateServer, for example, all the teleport pads in your region.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (llList2String(parsed, 0) == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prim containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23134</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23134"/>
		<updated>2007-06-12T01:25:41Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* UpdateSubscriber */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= How to use =&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel as well as a list of all registered subscribers.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside a prim that you want to receive object updates from an UpdateServer.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (llList2String(parsed, 0) == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prim containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23133</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23133"/>
		<updated>2007-06-12T01:25:01Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* How to use */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= How to use =&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel as well as a list of all registered subscribers.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside a prim that you want to receive object updates from an UpdateServer.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (llList2String(parsed, 0) == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prin containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23131</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23131"/>
		<updated>2007-06-12T01:21:44Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: /* How to use */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= How to use =&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside a prim that you want to receive object updates from an UpdateServer.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &#039;&#039;subscriberkey&#039;&#039; &#039;&#039;serverkey&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;subscriberkey&#039;&#039; is the key of the prim containing the script and &#039;&#039;serverkey&#039;&#039; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (llList2String(parsed, 0) == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prin containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23130</id>
		<title>Intra-Region Update Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Intra-Region_Update_Server&amp;diff=23130"/>
		<updated>2007-06-12T01:18:16Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= How to use =&lt;br /&gt;
This set of scripts allows you to centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateServer script inside a prim along with the objects (notecards, etc.) that you want to broadcast as updates to objects containing the UpdateSubscriber script.  &lt;br /&gt;
&lt;br /&gt;
To broadcast an update from the server, click on the server prim, and then click on the &amp;quot;Broadcast&amp;quot; button in the dialog.  The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.  The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new updates objects onto it.&lt;br /&gt;
&lt;br /&gt;
Place the UpdateSubscriber script inside a prim that you want to receive object updates from an UpdateServer.  You should have your UpdateServer already set up before adding this script to a prim.  At startup the script will broadcast a request for all UpdateServers in the region and output the results to you.&lt;br /&gt;
&lt;br /&gt;
You need to register the subscriber with a specific UpdateServer to enable updates to be received.  To do this, type:&lt;br /&gt;
&lt;br /&gt;
 /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;subscriberkey&amp;gt; is the key of the prin containing the script and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is displayed when this script displays the available UpdateServers in the region.  The UpdateSubscriber script will output exact text that you can copy and past into your chat line to do this.&lt;br /&gt;
&lt;br /&gt;
= Note to Sellers! =&lt;br /&gt;
Please give some attribution if you use these scripts. Thanks!&lt;br /&gt;
&lt;br /&gt;
= UpdateServer =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateServer&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //&lt;br /&gt;
 //    Place inside a prim along with the objects (notecards, etc.) that you&lt;br /&gt;
 //    want to broadcast as updates to objects containing the UpdateSubscriber&lt;br /&gt;
 //    script.  &lt;br /&gt;
 //&lt;br /&gt;
 //    To broadcast an update, click on the prim, and then click on the &amp;quot;Broadcast&amp;quot;&lt;br /&gt;
 //    button in the dialog.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Info&amp;quot; button displays the server&#039;s object key and listening channel.&lt;br /&gt;
 //&lt;br /&gt;
 //    The &amp;quot;Purge&amp;quot; button removes all contents from the prim so you can drag new&lt;br /&gt;
 //    updates objects onto it.&lt;br /&gt;
 //    &lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 integer dialogChannel = 52;&lt;br /&gt;
 integer dialogHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 &lt;br /&gt;
 list mainMenu = [&amp;quot;Info&amp;quot;, &amp;quot;Broadcast&amp;quot;, &amp;quot;Purge&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 deleteAllItems() {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) llRemoveInventory(name);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 broadcastAvailableUpdates() {&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting available updates...&amp;quot;);   &lt;br /&gt;
      &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if (name != scriptName) {&lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateAvailable &amp;quot; + llEscapeURL(name));        &lt;br /&gt;
             llSay(0, &amp;quot;UpdateAvailable item: &amp;quot; + name); &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     llSay(0, &amp;quot;Broadcasting complete&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 showServerInfo() {&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server key: &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
     llOwnerSay(&amp;quot;Update Server listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
 &lt;br /&gt;
     llRegionSay(listenChannel, &amp;quot;UpdateSubscribersQuery &amp;quot; + (string)serverKey);   &lt;br /&gt;
      &lt;br /&gt;
 }    &lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         serverKey = llGetKey();&lt;br /&gt;
         &lt;br /&gt;
         llSetText(&amp;quot;Update Server\n&amp;quot; + llGetObjectName() + &amp;quot;\n&amp;quot; + (string)serverKey, &amp;lt;1,0,0&amp;gt;, 1.0);&lt;br /&gt;
         &lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
         &lt;br /&gt;
         showServerInfo();&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     touch_start(integer num_detected) {&lt;br /&gt;
         llListenRemove(dialogHandle);&lt;br /&gt;
         dialogChannel = llFloor(llFrand(-99899.0) - 100);&lt;br /&gt;
         dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         integer group = llDetectedGroup(0);&lt;br /&gt;
         key agent = llDetectedKey(0);&lt;br /&gt;
         key objectowner = llGetOwner();&lt;br /&gt;
         if ((objectowner == agent) || group)  {&lt;br /&gt;
             llDialog(agent, &amp;quot;Update Server v1.0a&amp;quot;, mainMenu, dialogChannel);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) &lt;br /&gt;
     {&lt;br /&gt;
 &lt;br /&gt;
         if (channel == dialogChannel) {&lt;br /&gt;
 &lt;br /&gt;
             llListenRemove(dialogHandle);&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Broadcast&amp;quot;) broadcastAvailableUpdates();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Purge&amp;quot;) deleteAllItems();&lt;br /&gt;
 &lt;br /&gt;
             if (message == &amp;quot;Info&amp;quot;) showServerInfo();&lt;br /&gt;
 &lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
         &lt;br /&gt;
         if ((l == 4) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateRequest&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
             key destination = (key)llList2String(parsed, 2);&lt;br /&gt;
             key requestServer = (key)llList2String(parsed, 3);&lt;br /&gt;
 &lt;br /&gt;
             if (requestServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
                 llSay(0, &amp;quot;Giving item &amp;quot; + itemName + &amp;quot; to object &amp;quot; + llKey2Name(destination) + &amp;quot; (&amp;quot; + (string)destination + &amp;quot;)&amp;quot;);        &lt;br /&gt;
                 llGiveInventory(destination, itemName);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if (llList2String(parsed, 0) == &amp;quot;UpdateServersQuery&amp;quot;) {&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateServerAvailable &amp;quot; + (string)serverKey);&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegistered&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key subscriberUpdateServer = (key)llList2String(parsed, 1);&lt;br /&gt;
             key subscriberKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer != serverKey) return;&lt;br /&gt;
 &lt;br /&gt;
             if (subscriberUpdateServer == serverKey) {&lt;br /&gt;
 &lt;br /&gt;
                 string msg = &amp;quot;UpdateSubscriber &amp;quot; + llKey2Name(subscriberKey) + &lt;br /&gt;
                 &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;) registered to UpdateServer &amp;quot; + &lt;br /&gt;
                 llKey2Name(subscriberUpdateServer) + &amp;quot; (&amp;quot; + (string)subscriberUpdateServer + &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, msg);        &lt;br /&gt;
             }&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= UpdateSubscriber =&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 //    UpdateSubscriber&lt;br /&gt;
 //    Version 1.0a Release&lt;br /&gt;
 //    By Emma Nowhere&lt;br /&gt;
 //    emma.nowhere@yahoo.com&lt;br /&gt;
 //    &lt;br /&gt;
 //    Place inside a prim that you want to receive object updates from an&lt;br /&gt;
 //    UpdateServer.  You should have your UpdateServer already set up&lt;br /&gt;
 //    before adding this script to a prim.&lt;br /&gt;
 //&lt;br /&gt;
 //    At startup the script will broadcast a request for all UpdateServers &lt;br /&gt;
 //    in the region and output the results to you.&lt;br /&gt;
 //&lt;br /&gt;
 //    You need to register with a specific UpdateServer to enable updates&lt;br /&gt;
 //    to be received.&lt;br /&gt;
 //&lt;br /&gt;
 //    To lock onto a specific UpdateServer, type:&lt;br /&gt;
 //&lt;br /&gt;
 //    /128 UpdateSubscriberRegister &amp;lt;subscriberkey&amp;gt; &amp;lt;serverkey&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
 //    where &amp;lt;subscriberkey&amp;gt; is the key of the prin containing the script&lt;br /&gt;
 //    and &amp;lt;serverkey&amp;gt; is the key shown next to the UpdateServer name that is&lt;br /&gt;
 //    displayed when this script displays the available UpdateServers in&lt;br /&gt;
 //    the region.&lt;br /&gt;
 //&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 integer listenChannel = 128;&lt;br /&gt;
 integer listenHandle = 0;&lt;br /&gt;
 string scriptName;&lt;br /&gt;
 key subscriberKey;&lt;br /&gt;
 key serverKey;&lt;br /&gt;
 integer registered = FALSE;&lt;br /&gt;
 &lt;br /&gt;
 integer containsItem(string itemName) {&lt;br /&gt;
 &lt;br /&gt;
     integer total = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
     integer i;&lt;br /&gt;
     for (i = 0; i &amp;lt; total; i++) {&lt;br /&gt;
         string name = llGetInventoryName(INVENTORY_ALL, i);&lt;br /&gt;
         if ((name != scriptName) &amp;amp;&amp;amp; (itemName == name)) return TRUE;&lt;br /&gt;
     }&lt;br /&gt;
     return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 default {&lt;br /&gt;
 &lt;br /&gt;
     state_entry() {&lt;br /&gt;
 &lt;br /&gt;
         scriptName = llGetScriptName();&lt;br /&gt;
         subscriberKey = llGetKey();&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber installed in object &amp;quot; + llGetObjectName() + &amp;quot; (&amp;quot; + (string)subscriberKey + &amp;quot;)&amp;quot;);&lt;br /&gt;
         listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         llOwnerSay(&amp;quot;UpdateSubscriber listening on channel #&amp;quot; + (string)listenChannel);&lt;br /&gt;
         llRegionSay(listenChannel, &amp;quot;UpdateServersQuery&amp;quot;);&lt;br /&gt;
     }  &lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string message) {&lt;br /&gt;
 &lt;br /&gt;
         list parsed = llParseString2List(message, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
         integer l = llGetListLength(parsed);&lt;br /&gt;
 &lt;br /&gt;
         if (!registered) {&lt;br /&gt;
 &lt;br /&gt;
                 if ((l == 3) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscriberRegister&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     if ((key)llList2String(parsed, 1) != subscriberKey) return;&lt;br /&gt;
 &lt;br /&gt;
                     serverKey = (key)llList2String(parsed, 2);&lt;br /&gt;
 &lt;br /&gt;
                     llListenRemove(listenHandle);&lt;br /&gt;
 &lt;br /&gt;
                     listenHandle = llListen(listenChannel, &amp;quot;&amp;quot;, serverKey, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
                     llSay(0, &amp;quot;Registered to Update Server &amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
                     registered = TRUE;&lt;br /&gt;
                 }&lt;br /&gt;
                 else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateServerAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
                     key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
                     string msg = &amp;quot;Update Server available:\n&amp;quot; + llKey2Name(serverKey) + &amp;quot; (&amp;quot; + (string)serverKey + &amp;quot;)\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;Copy and paste the following line to register to this server:\n\n&amp;quot; +&lt;br /&gt;
                     &amp;quot;/128 UpdateSubscriberRegister &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
                     &lt;br /&gt;
                     llSay(0, msg);        &lt;br /&gt;
                 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
                 return;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateAvailable&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             string itemName = llUnescapeURL(llList2String(parsed, 1));&lt;br /&gt;
 &lt;br /&gt;
             if (containsItem(itemName)) {&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Deleting old version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRemoveInventory(itemName);&lt;br /&gt;
 &lt;br /&gt;
                 llSay(0, &amp;quot;Requesting new version of item &amp;quot; + itemName);&lt;br /&gt;
                 llRegionSay(listenChannel, &amp;quot;UpdateRequest &amp;quot; + llEscapeURL(itemName) + &amp;quot; &amp;quot; + (string)subscriberKey + &amp;quot; &amp;quot; + (string)serverKey);&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         else if ((l == 2) &amp;amp;&amp;amp; (llList2String(parsed, 0) == &amp;quot;UpdateSubscribersQuery&amp;quot;)) {&lt;br /&gt;
 &lt;br /&gt;
             key serverKey = (key)llList2String(parsed, 1);&lt;br /&gt;
 &lt;br /&gt;
             llRegionSay(listenChannel, &amp;quot;UpdateSubscriberRegistered &amp;quot; + (string)serverKey + &amp;quot; &amp;quot; + (string)subscriberKey);&lt;br /&gt;
         }&lt;br /&gt;
     &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=23129</id>
		<title>Category:LSL Library</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=23129"/>
		<updated>2007-06-12T01:14:57Z</updated>

		<summary type="html">&lt;p&gt;Emma Nowhere: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
==Script Library==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em 0.5em 1.5em&amp;quot;&amp;gt;&lt;br /&gt;
There are many [[script|scripts]] that have become buried in the [http://forums.secondlife.com/forumdisplay.php?f=15 Scripting Library forum], were lost with the death of the scripting forums, or sit idle in [[inventory|inventories]] that could be useful and should be more accessible.&lt;br /&gt;
&lt;br /&gt;
Other scripters may be in the same situation. This wiki is a well-suited medium for a script library. Feel free to add your scripts to the script library by creating new pages for them and linking to those pages here.&lt;br /&gt;
&lt;br /&gt;
Note that there are many more scripts in the LSL Library here, but you can&#039;t get to them if you don&#039;t know they exist, because they are subpages now, instead of an automatically updated category.  Good luck searching.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules for posting: ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
#Your script must be tested and working. If it&#039;s not, stick it in your user-space until it is. This is a list of working, usable scripts.&lt;br /&gt;
#Add a link to your script&#039;s page here. Link back to this page from your script&#039;s page. Start your page with &amp;lt;nowiki&amp;gt;{{LSL Header}}&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
#Do not add scripts that duplicate the same functionality as an existing script or built in {{LSLGC|Functions|function}}. If yours does, explain why.&lt;br /&gt;
#Do not post simple scripts to the library. Simple scripts should be posted to the [[:Category:LSL Examples| Examples list]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||[[Hello Avatar]]&lt;br /&gt;
||Linden Lab&lt;br /&gt;
||SL&#039;s default script&lt;br /&gt;
|-&lt;br /&gt;
||[[Basic Encryption Modules]]&lt;br /&gt;
||[[User:Beverly Larkin|Beverly Larkin]]&lt;br /&gt;
||Basic encryption scripts, allows you to encrypt a float, and shout it to another prim on a randomly chosen channel.&lt;br /&gt;
|-&lt;br /&gt;
||[[Builders Buddy|Builder&#039;s Buddy]]&lt;br /&gt;
||[[User:Newfie Pendragon|Newfie Pendragon]]&lt;br /&gt;
||Script to easily move/rotate large builds that exceed the linkable size limit (30 meters)&lt;br /&gt;
|-&lt;br /&gt;
||[[Camera Sync]]&lt;br /&gt;
||[[User:Meyermagic Salome|Meyermagic Salome]] and [[User:Nomad Padar|Nomad Padar]]&lt;br /&gt;
||A system to synchronize the cameras of two avatars&lt;br /&gt;
|-&lt;br /&gt;
||[[Chat Logger (GPL)]]&lt;br /&gt;
||[[User:Nobody Fugazi|Nobody Fugazi]]&lt;br /&gt;
||Chat logger which requests permission from participants before recording them.&lt;br /&gt;
|-&lt;br /&gt;
||[[Date Library]]&lt;br /&gt;
||[[User:Corto Maltese|Corto Maltese]]&lt;br /&gt;
|| Date library, based on number of day since march 3rd 1600, can be used to calculate weekday, date differences, and date offset, and date formating.&lt;br /&gt;
|-&lt;br /&gt;
||[[Day of the Week]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Function to get day of the week from [[llGetUnixTime]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog NumberPad|Dialog Number Pad]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Use a dialog to accept positive integer input from users.&lt;br /&gt;
|-&lt;br /&gt;
||[[Email-to-IM]]&lt;br /&gt;
||[[User:DoteDote Edison|DoteDote Edison]]&lt;br /&gt;
||Send IMs to SL friends via email (translate emails from friends into IMs).&lt;br /&gt;
|-&lt;br /&gt;
||[[Efficiency Tester]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Tests the speed of a function.&lt;br /&gt;
|-&lt;br /&gt;
||[[Float2Hex]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Very useful for transporting [[float|floats]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Follower (script)|Follower]]&lt;br /&gt;
||Unknown, uploaded by [[User:Slik Swindlehurst|Slik Swindlehurst]]&lt;br /&gt;
||Makes an object follow the nearest person. Do not use for [[grief|griefing]].&lt;br /&gt;
|-&lt;br /&gt;
||[[Intra-Region Update Server]]&lt;br /&gt;
||[[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
||Centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
|-&lt;br /&gt;
||[[Multirezzer|Multirezzer (on collision)]]&lt;br /&gt;
||[[User:Beet Streeter|Beet Streeter]]&lt;br /&gt;
||Spawns up to 10 objects when the object containing the script collides with a user.&lt;br /&gt;
|-&lt;br /&gt;
||[[Nargus Dialog Control 1.5]]&lt;br /&gt;
||[[User:Nargus Asturias|Nargus Asturias]]&lt;br /&gt;
|| A (not-so) simple dialog control script. Call dialog and receive selected value via link_message(), with built-in timer and link_message() notification on time out. Support multi-pages dialog and numerical property dialog. Button text and dialog&#039;s returned value can be difference.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Object to Data v1.0]]&lt;br /&gt;
|| [[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
|| Turns an object into text. Allows people to post their objects to websites.&lt;br /&gt;
|-&lt;br /&gt;
||[[Prefix Calculator]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
|| A calculator that evaluates expressions in prefix notation. + 3 4 = 5. * + 1 2 + 3 4 = 14.&lt;br /&gt;
|-&lt;br /&gt;
||[[Say Region Frames Per Second]]&lt;br /&gt;
||[[User:Heymeriou Mystakidou|Heymariou Mystakidou]]&lt;br /&gt;
|| Says the Region name and Frames per Second Out loud on command.&lt;br /&gt;
|-&lt;br /&gt;
||[[Secure HTTP Post]]&lt;br /&gt;
||[[User:Corto Maltese|Corto Maltese]]&lt;br /&gt;
|| This small library allow you to send Secure requests to your website with a security mechanism aimed to stop hacking.&lt;br /&gt;
|-&lt;br /&gt;
|| [[String Compare]]&lt;br /&gt;
|| [[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
|| Compares two strings and reliably returns either 1, -1, or 0 if they are the same. &lt;br /&gt;
|-&lt;br /&gt;
||[[Self Upgrading Script Enhanced]]&lt;br /&gt;
||[[User:Cron Stardust|Cron Stardust]]&lt;br /&gt;
|| Keeps only latest version of the script on prim (Even with multiple adds of the same script!)&lt;br /&gt;
|-&lt;br /&gt;
||[[User:SignpostMarv_Martin/LSL/SLNTPoHTTP_v1.1_client|SLNTPoHTTP v1.1 client]]&lt;br /&gt;
|[[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
||Emulates the function of [[llGetWallclock]] for any timezone by using SLOpenID&#039;s SLNTPoHTTP service. Also supports ISO 8601 and RFC 2822 timestamps.&lt;br /&gt;
|-&lt;br /&gt;
||[[Key Pad Door|Tdub&#039;s Keypad Door]]&lt;br /&gt;
||[[User:Tdub Dowler|Tdub Dowler]]&lt;br /&gt;
|| Door and keypad with changable code. Follow instructions carefully!&lt;br /&gt;
|-&lt;br /&gt;
||[[Timer Module]]&lt;br /&gt;
||[[User:Isabelle Aquitaine|Isabelle Aquitaine]]&lt;br /&gt;
||Manage multiple timers via linked messages.&lt;br /&gt;
|-&lt;br /&gt;
||[[WarpPos]]&lt;br /&gt;
|[[User:Keknehv Psaltery|Keknehv Psaltery]]&lt;br /&gt;
||Non-physical movement without the 10m limit.&lt;br /&gt;
|-&lt;br /&gt;
||[[XTEA Strong Encryption Implementation]]&lt;br /&gt;
||[[User:Morse Dillon|Morse Dillon]]&lt;br /&gt;
||An LSL implementation of XTEA (eXtended Tiny Encryption Algorithm).  This is the first known public release of a &#039;real&#039; strong encryption implementation in LSL and is released under the GNU General Public License (GPL).&lt;br /&gt;
|-&lt;br /&gt;
||[[XyText 1.5]]&lt;br /&gt;
||[[User:Xylor Baysklef|Xylor Baysklef]]&lt;br /&gt;
|| Display text (up to 10 characters) on a prim. Use as many prims as desired.&lt;br /&gt;
|-&lt;br /&gt;
||[[Computer:jaycoonlanguage]]&lt;br /&gt;
||[[User:jayco121 Bing]]&lt;br /&gt;
|| A language written in lsl that is meant for my computer (available at the shop).&lt;br /&gt;
|-}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==Support Script Library==&lt;br /&gt;
These are scripts in other languages, intended to be run on other systems that support scripts written in LSL&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|| Silo&lt;br /&gt;
|| [[User:Zero_Linden|Zero Linden]]&lt;br /&gt;
|| General purpose data store in PHP.  Use this to persist arbitrary data from LSL via [[llHTTPRequest]].  See:&lt;br /&gt;
* [http://www.notabene-sl.com/misc/silo-README.txt README] file&lt;br /&gt;
* [http://www.notabene-sl.com/misc/silo.tgz silo.tgz] tarball&lt;br /&gt;
* forum post [http://forums.secondlife.com/showthread.php?t=119570 Announcement].&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:SignpostMarv Martin/PHP/llXorBase64StringsCorrect|llXorBase64StringsCorrect]]&lt;br /&gt;
|| [[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
|| An implementation of [[llXorBase64StringsCorrect]] in PHP- should be useful if you&#039;re using llXorBase64StringsCorrect to do cryptography work in LSL2 and posting it out to the web via [[llHTTPRequest]].&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:SignpostMarv Martin/PHP/lsl fu.php|lsl_fu.php]]&lt;br /&gt;
|| [[User:SignpostMarv Martin|SignpostMarv Martin]]&lt;br /&gt;
|| A basic OOP&#039;d PHP Class containing VeloxSeverine&#039;s $_POST fixer and Marv&#039;s own eccentric ideas for &amp;quot;fixing&amp;quot; things.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Emma Nowhere</name></author>
	</entry>
</feed>