<?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;user=Revolution+Perenti&amp;feedformat=atom</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;user=Revolution+Perenti&amp;feedformat=atom"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Revolution_Perenti"/>
	<updated>2026-06-18T06:17:29Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Texture_Menu_Management&amp;diff=1173179</id>
		<title>Texture Menu Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Texture_Menu_Management&amp;diff=1173179"/>
		<updated>2012-10-06T18:00:04Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* Main Script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
=Texture Menu Management=&lt;br /&gt;
&lt;br /&gt;
(based on our previus script and released here for you as we did a custom edit for second-life community and i thought you may like to use this script as well.)&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
Allows you to have dialog based navigation of textures.&lt;br /&gt;
and browse the image you like to display on your [[prim]] from a dialog with simple and ease of navigation &lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Create a script and copy and paste the script below into your [[prim]].&lt;br /&gt;
and copy textures or photos from your [[inventory]] into the content tab of your [[prim]]&lt;br /&gt;
click your prim containing the script and textures and select a [[texture]] or photo from the menu dialog&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
integer listener;&lt;br /&gt;
integer MENU_CHANNEL = 1000;&lt;br /&gt;
&lt;br /&gt;
// opens menu channel and displays dialog&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(listener);&lt;br /&gt;
    listener = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;Select one object below: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        // reset scripts on rez&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        MENU1 = [];&lt;br /&gt;
        MENU2 = [];&lt;br /&gt;
        // count the textures in the prim to see if we need pages&lt;br /&gt;
        integer c = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
        if (c &amp;lt;= 12)&lt;br /&gt;
        {&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_TEXTURE, i);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {        &lt;br /&gt;
            for (; i &amp;lt; 11; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_TEXTURE, i);&lt;br /&gt;
            if(c &amp;gt; 22)&lt;br /&gt;
                c = 22;&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU2 += llGetInventoryName(INVENTORY_TEXTURE, i); &lt;br /&gt;
            MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
            MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;                          &lt;br /&gt;
        }&lt;br /&gt;
        // display the dialog &lt;br /&gt;
        Dialog(llDetectedKey(0), MENU1);&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 (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);  &lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }        &lt;br /&gt;
            else                    &lt;br /&gt;
            {&lt;br /&gt;
                // display the texture from menu selection &lt;br /&gt;
                llSetTexture(message, ALL_SIDES);&lt;br /&gt;
                &lt;br /&gt;
            }      &lt;br /&gt;
        }&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support ====&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Dazzle Software&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
Or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.org www.dazzlesoftware.org] Secondlife Open Source Section on Tutorials.&lt;br /&gt;
Latest version always available on [https://marketplace.secondlife.com/p/Dazzle-Software-Dialog-Menu-Based-Texture-API/374435 Marketplace] or [http://maps.secondlife.com/secondlife/Wyrd/230/83/97 Dazzle Software via Wyrd]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Script_Override_Functions&amp;diff=1173178</id>
		<title>Script Override Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Script_Override_Functions&amp;diff=1173178"/>
		<updated>2012-10-06T17:57:47Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* USAGE: /CHANNEL Object_Name,message,value eg: /1000 Object,channel,1001 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
== Script Override ==&lt;br /&gt;
Well, you like to override strings, integer etc. in chat channel. For example you like to enable debug or change the channel. I find this the best solution and it can be pretty useful API framework for many listens.&lt;br /&gt;
&lt;br /&gt;
==== USAGE: /CHANNEL Object_Name,message,value eg: /1000 Object,channel,1001 ====&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list csv_commands;&lt;br /&gt;
&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&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;
        csv_commands = llCSV2List( llToLower( message ));&lt;br /&gt;
//        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands, 1);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = (integer)llList2String( csv_commands, 2);&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel);&lt;br /&gt;
        }&lt;br /&gt;
        else if(command == &amp;quot;avatar&amp;quot; || message == &amp;quot;AVATAR&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0, &amp;quot;Hello, Avatar!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Support ====&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Dazzle Software&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
Or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.org www.dazzlesoftware.org] Secondlife Open Source Section on Tutorials.&lt;br /&gt;
Latest version always available on [http://maps.secondlife.com/secondlife/Wyrd/230/83/97 Dazzle Software via Wyrd]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;br /&gt;
{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Inventory_Based_Menu&amp;diff=1173177</id>
		<title>Inventory Based Menu</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Inventory_Based_Menu&amp;diff=1173177"/>
		<updated>2012-10-06T17:54:32Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
Ok you want to create a dialog based menu system, you want to support more than 12 buttons&lt;br /&gt;
so im going to give you quick overview of basic menu using [[llRezAtRoot]], [[llGetInventoryName]] &amp;amp; [[llGetInventoryNumber]]&lt;br /&gt;
&lt;br /&gt;
USAGE:just drop objects into the prim and rez them from the dialog by touching the prim.&lt;br /&gt;
&lt;br /&gt;
=== LSL Script ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
integer listener;&lt;br /&gt;
integer MENU_CHANNEL = 1000;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(listener);&lt;br /&gt;
    listener = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;Select one object below: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        MENU1 = [];&lt;br /&gt;
        MENU2 = [];&lt;br /&gt;
        integer c = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        if (c &amp;lt;= 12)&lt;br /&gt;
        {&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {        &lt;br /&gt;
            for (; i &amp;lt; 11; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            if(c &amp;gt; 22)&lt;br /&gt;
                c = 22;&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU2 += llGetInventoryName(INVENTORY_OBJECT, i); &lt;br /&gt;
            MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
            MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;                          &lt;br /&gt;
        }&lt;br /&gt;
        Dialog(llDetectedKey(0), MENU1);&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 (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);  &lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }        &lt;br /&gt;
            else                    &lt;br /&gt;
            {&lt;br /&gt;
                // todo add offsets so box sites perfect on rezzer &lt;br /&gt;
                llRezAtRoot(message, llGetPos(), ZERO_VECTOR, llGetRot(), 0);&lt;br /&gt;
            }      &lt;br /&gt;
        }&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Support ===&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Dazzle Software&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
Or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.org www.dazzlesoftware.org] Secondlife Open Source Section on Tutorials.&lt;br /&gt;
Latest version always available on [https://marketplace.secondlife.com/p/Dazzle-Software-Inventory-Menu-Rezzer-API/374439] or [http://maps.secondlife.com/secondlife/Wyrd/230/83/97 Dazzle Software via Wyrd]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Inventory_Based_Menu&amp;diff=1173176</id>
		<title>Inventory Based Menu</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Inventory_Based_Menu&amp;diff=1173176"/>
		<updated>2012-10-06T17:52:42Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
Introduction:&lt;br /&gt;
Ok you want to create a dialog based menu system, you want to support more than 12 buttons&lt;br /&gt;
so im going to give you quick overview of basic menu using [[llRezAtRoot]], [[llGetInventoryName]] &amp;amp; [[llGetInventoryNumber]]&lt;br /&gt;
&lt;br /&gt;
USAGE:just drop objects into the prim and rez them from the dialog by touching the prim.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
integer listener;&lt;br /&gt;
integer MENU_CHANNEL = 1000;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(listener);&lt;br /&gt;
    listener = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;Select one object below: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        MENU1 = [];&lt;br /&gt;
        MENU2 = [];&lt;br /&gt;
        integer c = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        if (c &amp;lt;= 12)&lt;br /&gt;
        {&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {        &lt;br /&gt;
            for (; i &amp;lt; 11; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            if(c &amp;gt; 22)&lt;br /&gt;
                c = 22;&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU2 += llGetInventoryName(INVENTORY_OBJECT, i); &lt;br /&gt;
            MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
            MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;                          &lt;br /&gt;
        }&lt;br /&gt;
        Dialog(llDetectedKey(0), MENU1);&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 (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);  &lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }        &lt;br /&gt;
            else                    &lt;br /&gt;
            {&lt;br /&gt;
                // todo add offsets so box sites perfect on rezzer &lt;br /&gt;
                llRezAtRoot(message, llGetPos(), ZERO_VECTOR, llGetRot(), 0);&lt;br /&gt;
            }      &lt;br /&gt;
        }&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.ca www.dazzlesoftware.ca] Secondlife Open Source Section on Tutorials.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Inventory_Based_Menu&amp;diff=1173174</id>
		<title>Inventory Based Menu</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Inventory_Based_Menu&amp;diff=1173174"/>
		<updated>2012-10-06T17:52:32Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
OK you want to create a dialog based menu system, you want to support more than 12 buttons&lt;br /&gt;
so I going to give you quick overview of basic menu using [[llRezAtRoot]], [[llGetInventoryName]] &amp;amp; [[llGetInventoryNumber]]&lt;br /&gt;
&lt;br /&gt;
USAGE:just drop objects into the prim and rez them from the dialog by touching the prim.&lt;br /&gt;
&lt;br /&gt;
=== LSL Script ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
integer listener;&lt;br /&gt;
integer MENU_CHANNEL = 1000;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(listener);&lt;br /&gt;
    listener = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;Select one object below: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        MENU1 = [];&lt;br /&gt;
        MENU2 = [];&lt;br /&gt;
        integer c = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        if (c &amp;lt;= 12)&lt;br /&gt;
        {&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {        &lt;br /&gt;
            for (; i &amp;lt; 11; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            if(c &amp;gt; 22)&lt;br /&gt;
                c = 22;&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU2 += llGetInventoryName(INVENTORY_OBJECT, i); &lt;br /&gt;
            MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
            MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;                          &lt;br /&gt;
        }&lt;br /&gt;
        Dialog(llDetectedKey(0), MENU1);&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 (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);  &lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }        &lt;br /&gt;
            else                    &lt;br /&gt;
            {&lt;br /&gt;
                // todo add offsets so box sites perfect on rezzer &lt;br /&gt;
                llRezAtRoot(message, llGetPos(), ZERO_VECTOR, llGetRot(), 0);&lt;br /&gt;
            }      &lt;br /&gt;
        }&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Support ===&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Dazzle Software&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
Or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.org www.dazzlesoftware.org] Secondlife Open Source Section on Tutorials.&lt;br /&gt;
Latest version always available on [https://marketplace.secondlife.com/p/Dazzle-Software-Primitizer-Inspire-GPL/1269199 Marketplace] or [https://marketplace.secondlife.com/p/Dazzle-Software-Inventory-Menu-Rezzer-API/374439 Dazzle Software via Wyrd]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Open_Source_Holodeck&amp;diff=1173173</id>
		<title>Open Source Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Open_Source_Holodeck&amp;diff=1173173"/>
		<updated>2012-10-06T17:46:42Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* Support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
== What is a Holodeck? ==&lt;br /&gt;
&lt;br /&gt;
A Holodeck stores Second Life scenes and lets you load them from a menu whenever you want. The old scene is cleared and the new one appears. Scenes can include any prim objects including furniture, pose balls and particle generators.&lt;br /&gt;
&lt;br /&gt;
== Creating a Holodeck ==&lt;br /&gt;
&lt;br /&gt;
=== The Shell ===&lt;br /&gt;
&lt;br /&gt;
The Scripts for the holodeck may look complex but once you have done it correctly everything is very simple to use. Building and setup are similar to methods you would normally use within SecondLife.&lt;br /&gt;
&lt;br /&gt;
The best way to start creating a holodeck would be to build a 20x20x10 shell. This will be your rezzing area for the holodeck scenes.&lt;br /&gt;
&lt;br /&gt;
One suggestion is to make the floor, walls and roof from appropriately-sized box prims.  A prim that will serve as a door&lt;br /&gt;
may be optionally included; the door prim MUST be a box prim.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: all the prims forming the shell should be sized and then rotated so that face 0 (in the lsl sense) faces the&lt;br /&gt;
interior of the holodeck, because the texture system will texture face 0 and the intention is that the interior of the&lt;br /&gt;
holodeck be textured.  For box prims, the &amp;quot;positive Z face&amp;quot; is face 0.&lt;br /&gt;
&lt;br /&gt;
Your shell should look something similar to the picture below.&lt;br /&gt;
&lt;br /&gt;
[[Image:holodeck shell.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== The Floor Panel ===&lt;br /&gt;
&lt;br /&gt;
Next we create a small floor panel. In the example we use a 0.500x0.500x0.100 cube. Link the floor panel to your holodeck shell. Make sure that the floor panel is the last object you link to the shell as this becomes the root prim. The floor panel &#039;&#039;&#039;MUST&#039;&#039;&#039; be the root prim in order for the holodeck to function properly.&lt;br /&gt;
&lt;br /&gt;
See the example below.&lt;br /&gt;
&lt;br /&gt;
[[Image:floor panel.jpg]]&lt;br /&gt;
&lt;br /&gt;
== The scripts for the floor panel ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Holodeck Core.lsl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// User Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//How long to listen for a menu response before shutting down the listener&lt;br /&gt;
float fListenTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//How often (in seconds) to check for change in position when moving&lt;br /&gt;
float fMovingRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
//How long to sit still before exiting active mode&lt;br /&gt;
float fStoppedTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//Minimum amount of time (in seconds) between movement updates&lt;br /&gt;
float fShoutRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
// label script name used for debug and PrototypeSay();&lt;br /&gt;
string label = &amp;quot;internal label&amp;quot;;&lt;br /&gt;
// Channel used by Prototype&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer MENU_CHANNEL;&lt;br /&gt;
integer MENU_HANDLE;&lt;br /&gt;
string PROTOTYPE_CREATOR;&lt;br /&gt;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
integer PROTOTYPE_RESET = -68195;&lt;br /&gt;
integer SHOW_MENU = -68194;&lt;br /&gt;
// Channel used by Prototype to talk to label scripts&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
// Feature Manager&lt;br /&gt;
integer PROTOTYPE_TEXTURE = TRUE;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Security Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
integer PROTOTYPE_ALLOW_IM = FALSE;&lt;br /&gt;
//*CHANGE BEGIN&lt;br /&gt;
//*Determine whether to sened email to original author&lt;br /&gt;
//*Default false&lt;br /&gt;
integer PROTOTYPE_ALLOW_EMAIL = FALSE;&lt;br /&gt;
//*CHANGE END&lt;br /&gt;
string  PROTOTYPE_EMAIL = &amp;quot;phoenixcms@hotmail.co.uk&amp;quot;;&lt;br /&gt;
string  PROTOTYPE_OWNER;&lt;br /&gt;
vector  Where;&lt;br /&gt;
string  Name;&lt;br /&gt;
string  SLURL;&lt;br /&gt;
integer X;&lt;br /&gt;
integer Y;&lt;br /&gt;
integer Z;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Menu System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Compatibility System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list objectSettings = [];&lt;br /&gt;
integer stride = 3;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
string COMPATIBILITY_NOTECARD = &amp;quot;compatibility&amp;quot;; //[objectname];&amp;lt;position&amp;gt;;&amp;lt;rotation&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DO NOT EDIT BELOW THIS LINE.... NO.. NOT EVEN THEN&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer PrototypeBaseMoving;&lt;br /&gt;
vector PrototypeLastPosition;&lt;br /&gt;
rotation PrototypeLastRotation;&lt;br /&gt;
integer iListenTimeout = 0;&lt;br /&gt;
&lt;br /&gt;
PrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//To avoid flooding the sim with a high rate of movements&lt;br /&gt;
//(and the resulting mass updates it will bring), we used&lt;br /&gt;
// a short throttle to limit ourselves&lt;br /&gt;
prototype_moved()&lt;br /&gt;
{&lt;br /&gt;
    PrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ llGetPos(), llGetRot() ], &amp;quot;|&amp;quot;));&lt;br /&gt;
    llResetTime(); //Reset our throttle&lt;br /&gt;
    PrototypeLastPosition = llGetPos();&lt;br /&gt;
    PrototypeLastRotation = llGetRot();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    iListenTimeout = llGetUnixTime() + llFloor(fListenTime);&lt;br /&gt;
    MENU_CHANNEL = llFloor(llFrand(-99999.0 - -100));&lt;br /&gt;
    MENU_HANDLE = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;www.sl-prototype.com: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
    llSetTimerEvent(fShoutRate);&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;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER || CHANGED_INVENTORY)&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry () &lt;br /&gt;
    {&lt;br /&gt;
        // Lets open our listen channel&lt;br /&gt;
        key_listen = llListen(PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG) DebugSay(&amp;quot;LISTEN ON CHANNEL &amp;quot; +(string)PROTOTYPE_CHANNEL);&lt;br /&gt;
        // Compatibility System Notecard&lt;br /&gt;
        llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        //Record our position&lt;br /&gt;
        PrototypeLastPosition = llGetPos();&lt;br /&gt;
        PrototypeLastRotation = llGetRot();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    dataserver(key queryId, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            objectSettings += llParseString2List(data, [&amp;quot;;&amp;quot;], []);&lt;br /&gt;
            iLine++;&lt;br /&gt;
            llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) DebugSay(&amp;quot;Done Reading Compatibility Notecard &amp;quot; + COMPATIBILITY_NOTECARD);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number==SHOW_MENU) {&lt;br /&gt;
            MENU1 = [];&lt;br /&gt;
            MENU2 = [];&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
                MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            Dialog(id, MENU1);&lt;br /&gt;
        }&lt;br /&gt;
        if (number==PROTOTYPE_RESET) {&lt;br /&gt;
            if (DEBUG) DebugSay(&amp;quot;Forgetting positions...&amp;quot;);&lt;br /&gt;
            PrototypeSay(&amp;quot;RESET&amp;quot;);&lt;br /&gt;
        }&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;
        list compatibility = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        PROTOTYPE_CREATOR = llGetCreator();&lt;br /&gt;
        //&lt;br /&gt;
        if ( command == llToLower(&amp;quot;CHANNEL&amp;quot;) || command == llToUpper(&amp;quot;CHANNEL&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)PROTOTYPE_CHANNEL );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;MESSAGE&amp;quot;) || command == llToUpper(&amp;quot;MESSAGE&amp;quot;))  &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_MESSAGE = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;PROTOTYPE MESSAGE set to &amp;quot; + (string)PROTOTYPE_MESSAGE );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // OPEN / CLOSE DOOR    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;DOOR&amp;quot;) || message == llToUpper(&amp;quot;DOOR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, PROTOTYPE_DOOR, &amp;quot;&amp;quot;,NULL_KEY );&lt;br /&gt;
            if (DEBUG) DebugSay(&amp;quot;Setting Door Permissions...&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        // SET COMPATIBILITY&lt;br /&gt;
        if (llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;)&lt;br /&gt;
            || llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            string object = llList2String(compatibility, 1);&lt;br /&gt;
            integer indexInSettings = llListFindList(objectSettings, [object]);&lt;br /&gt;
            if(indexInSettings &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                vector pos = (vector)llList2String(objectSettings, indexInSettings + 1);&lt;br /&gt;
                rotation rot = (rotation)llList2String(objectSettings, indexInSettings + 2);&lt;br /&gt;
                llRezAtRoot(object, pos + llGetPos(), ZERO_VECTOR, rot, 0);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // LOAD MENU SYSTEM    &lt;br /&gt;
        if (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                //Loop through backwards (safety precaution in case of inventory change)&lt;br /&gt;
                if (DEBUG) DebugSay(&amp;quot;Loading build pieces please wait...&amp;quot;);&lt;br /&gt;
                llRezAtRoot(message, llGetPos() + &amp;lt;0.00, 0.00, 0.30&amp;gt;, ZERO_VECTOR,&lt;br /&gt;
                    llGetRot(), PROTOTYPE_CHANNEL);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // REPOSTION SCENE    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;POSITION&amp;quot;) || message == llToUpper(&amp;quot;POSITION&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) DebugSay(&amp;quot;Positioning&amp;quot;);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            PrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
//*CHANGE BEGIN&lt;br /&gt;
//*Implement SAVE command&lt;br /&gt;
        // SAVE SCENE POSITION&lt;br /&gt;
        if ( message == llToLower(&amp;quot;SAVE&amp;quot;) || message == llToUpper(&amp;quot;SAVE&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            PrototypeSay(&amp;quot;RECORD &amp;quot;+(string)llGetPos()+&amp;quot;|&amp;quot;+(string)llGetRot());&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
//*CHANGE END&lt;br /&gt;
        // CLEAR SCENE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;CLEAR&amp;quot;) || message == llToUpper(&amp;quot;CLEAR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            PrototypeSay(&amp;quot;CLEAN&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if( message == llToLower(&amp;quot;HOLODECKDIE&amp;quot;) || message == llToUpper(&amp;quot;HOLODECKDIE&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            if(PROTOTYPE_CREATOR) llDie();&lt;br /&gt;
        }&lt;br /&gt;
        // DISABLE PHANTOM AS WE ARE NOW DONE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;NOPHANTOM&amp;quot;) || message == llToUpper(&amp;quot;NOPHANTOM&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            PrototypeSay(&amp;quot;PHANTOM&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Disabled Phantom&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    moving_start() //StartPrototype&lt;br /&gt;
    {&lt;br /&gt;
        if( !PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            PrototypeBaseMoving = TRUE;&lt;br /&gt;
            llSetTimerEvent(0.0); //Resets the timer if already running&lt;br /&gt;
            llSetTimerEvent(fMovingRate);&lt;br /&gt;
            prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer() &lt;br /&gt;
    {&lt;br /&gt;
        //Were we moving?&lt;br /&gt;
        if( PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            //Did we change position/rotation?&lt;br /&gt;
            if( (llGetRot() != PrototypeLastRotation) || (llGetPos() != PrototypeLastPosition) )&lt;br /&gt;
            {&lt;br /&gt;
                if( llGetTime() &amp;gt; fShoutRate ) {&lt;br /&gt;
                    prototype_moved();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
        // Have we been sitting long enough to consider ourselves stopped?&lt;br /&gt;
            if( llGetTime() &amp;gt; fStoppedTime )&lt;br /&gt;
            PrototypeBaseMoving = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Open listener?&lt;br /&gt;
        if( iListenTimeout != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            //Past our close timeout?&lt;br /&gt;
            if( iListenTimeout &amp;lt;= llGetUnixTime() )&lt;br /&gt;
            {&lt;br /&gt;
                iListenTimeout = 0;&lt;br /&gt;
                llListenRemove(MENU_HANDLE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Stop the timer?&lt;br /&gt;
        if( (iListenTimeout == 0) &amp;amp;&amp;amp; ( !PrototypeBaseMoving ) )&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) DebugSay(&amp;quot;Stopping Timer&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    } // END TIMER FUNCTION&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        PROTOTYPE_OWNER = llGetOwner();&lt;br /&gt;
        //Name = llGetRegionName();&lt;br /&gt;
        Name = llDumpList2String(llParseString2List(llGetRegionName(),[&amp;quot; &amp;quot;],[]),&amp;quot;_&amp;quot;);&lt;br /&gt;
        Where = llGetPos();&lt;br /&gt;
&lt;br /&gt;
        X = (integer)Where.x;&lt;br /&gt;
        Y = (integer)Where.y;&lt;br /&gt;
        Z = (integer)Where.z;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // I don&#039;t replace any spaces in Name with %20 and so forth.&lt;br /&gt;
&lt;br /&gt;
        SLURL = &amp;quot;http://slurl.com/secondlife/&amp;quot;&lt;br /&gt;
            + Name + &amp;quot;/&amp;quot; + (string)X + &amp;quot;/&amp;quot; + (string)Y + &amp;quot;/&amp;quot; + (string)Z + &amp;quot;/?title=&amp;quot; + Name;&lt;br /&gt;
&lt;br /&gt;
//*CHANGE BEGIN&lt;br /&gt;
//*Conditionally send email&lt;br /&gt;
        if(PROTOTYPE_ALLOW_EMAIL)&lt;br /&gt;
        {&lt;br /&gt;
            llEmail(PROTOTYPE_EMAIL, llKey2Name(PROTOTYPE_OWNER),&lt;br /&gt;
            SLURL + &amp;quot;\nRegistered user =&amp;quot; + llKey2Name(PROTOTYPE_OWNER)&lt;br /&gt;
                  + &amp;quot;Registered user key =&amp;quot; + PROTOTYPE_OWNER);&lt;br /&gt;
        }&lt;br /&gt;
//*CHANGE END&lt;br /&gt;
        if (PROTOTYPE_ALLOW_IM) {&lt;br /&gt;
            llInstantMessage(llGetCreator(), SLURL);&lt;br /&gt;
        }&lt;br /&gt;
        // Reset ourselves&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Texture Engine.lsl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
string TEXTURE_NOTECARD;&lt;br /&gt;
string prefix = &amp;quot;tex_&amp;quot;;&lt;br /&gt;
key TextureQuery;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
integer DEBUG = FALSE; // debug channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
//*CHANGE BEGIN&lt;br /&gt;
//*define message codes for link messages&lt;br /&gt;
integer HOLODECK_TEXTURE            = 0x2F34D;&lt;br /&gt;
//*CHANGE END&lt;br /&gt;
&lt;br /&gt;
DebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
default {&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        TEXTURE_NOTECARD = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
        if(DEBUG) DebugSay(&amp;quot;Reading Texture notecard &amp;quot; + TEXTURE_NOTECARD);&lt;br /&gt;
        TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        list texture = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            TEXTURE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)TEXTURE_CHANNEL);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(llList2String(texture, 0) == &amp;quot;image&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            iLine = 0;&lt;br /&gt;
            TEXTURE_NOTECARD = llList2String(texture, 1);&lt;br /&gt;
            if(DEBUG) DebugSay(&amp;quot;Reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////        &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == TextureQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data != EOF &amp;amp;&amp;amp; prefix == &amp;quot;tex_&amp;quot;) {    &lt;br /&gt;
            &lt;br /&gt;
                if(DEBUG) DebugSay(&amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);&lt;br /&gt;
//*CHANGE BEGIN&lt;br /&gt;
//*include message code in link message&lt;br /&gt;
                llMessageLinked(LINK_SET,HOLODECK_TEXTURE,data,NULL_KEY);&lt;br /&gt;
//*CHANGE END&lt;br /&gt;
&lt;br /&gt;
                // increment line count                 &lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                ++iLine;&lt;br /&gt;
                TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) DebugSay(&amp;quot;Done reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notecards for the Floor Panel ==&lt;br /&gt;
&lt;br /&gt;
Here we describe the notecards for texturing the shell that are to be placed in the floor panel.&lt;br /&gt;
&lt;br /&gt;
For each scene, we must included a notecard named tex_&amp;lt;scene name&amp;gt;.&lt;br /&gt;
For the clear scene (an artificial scene that represents the holodeck with no real scene rezzed) we must&lt;br /&gt;
include a notecard named &amp;quot;tex_*Clear*&amp;quot;.&lt;br /&gt;
These notecards specify the textures to be placed on the inner walls of the shell for that scene.  &lt;br /&gt;
Each notecard line in each notecard follows the form described below for the &amp;quot;clear scene&amp;quot; notecard&lt;br /&gt;
&lt;br /&gt;
In particular, the clear notecard (named &amp;quot;tex_*Clear*&amp;quot;) for the default Clear Scene contains lines as illustrated below.&lt;br /&gt;
Note the first field, up to the first &amp;quot;#&amp;quot;, of each line of the texture notecard, is the prim name of one&lt;br /&gt;
of the prims comprising the shell, so it may be useful to name all these prims, i.e. floor, roof and wall prims,&lt;br /&gt;
with unique names and then edit the notecards as required to create a new line for each object as required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
Object_Name#2f78ee38-9aca-f8d1-5306-458beab181f9#&amp;lt;3.0,1.0,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also create a&lt;br /&gt;
compatibility notecard named &amp;quot;compatibility&amp;quot; and place it in the floor panel.&lt;br /&gt;
Leave this blank. It will be used for a future feature to allow weather inside the holodeck and was &lt;br /&gt;
previously used for the old rez system from an early beta but was left in to be reused later on.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: due to the way notecards are implemented in SL, you must create a new notecard in your inventory,&lt;br /&gt;
put some text in it, delete the text, and then save the resulting notecard to make an empty notecard.&lt;br /&gt;
&lt;br /&gt;
=== Script for the Shell Prims ===&lt;br /&gt;
&lt;br /&gt;
The following script is used in wall, floor, and roof prims to provide a texture, particles, sound and a locate system.&lt;br /&gt;
The script &lt;br /&gt;
needs to be added to every prim of the shell that you wish to texture. &lt;br /&gt;
It is suggested that each prim should have a unique name for better control of the textures.&lt;br /&gt;
&lt;br /&gt;
System.lsl (updated to 2.0.2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Skidz Partz - Open Source Holodeck Version (2.0.1)&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// Debug&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
&lt;br /&gt;
// Sound System&lt;br /&gt;
list SOUND_VALUES;&lt;br /&gt;
integer SOUND_TYPE;&lt;br /&gt;
string SOUND_UUID;&lt;br /&gt;
float SOUND_VOLUME;&lt;br /&gt;
// Texture System&lt;br /&gt;
list TEXTURE_VALUES;&lt;br /&gt;
string HOLODECK_OBJECTNAME;&lt;br /&gt;
string TEXTURE_UID;&lt;br /&gt;
vector TEXTURE_REPEATS;&lt;br /&gt;
vector TEXTURE_OFFSETS;&lt;br /&gt;
float TEXTURE_ROTATE;&lt;br /&gt;
vector TEXTURE_COLOR;&lt;br /&gt;
float TEXTURE_ALPHA;&lt;br /&gt;
&lt;br /&gt;
// Lighting System&lt;br /&gt;
list LIGHT_VALUES;&lt;br /&gt;
integer  LIGHT_STATUS;&lt;br /&gt;
// Color of the light (RGB - each value between 0.0 and 1.0)&lt;br /&gt;
vector LIGHT_COLOR;&lt;br /&gt;
// Intensity of the light (values from 0.0 .. 1.0)&lt;br /&gt;
float  LIGHT_LEVEL;&lt;br /&gt;
// Radius of light cone&lt;br /&gt;
float  LIGHT_DISTANCE;&lt;br /&gt;
// Fall off (distance/intensity decrease) values from 0.0 ..1.0&lt;br /&gt;
float  LIGHT_FALLOFF;&lt;br /&gt;
&lt;br /&gt;
// Particle System&lt;br /&gt;
integer PARTICLE_FLAGS;&lt;br /&gt;
//&lt;br /&gt;
list PARTICLE_VALUES;&lt;br /&gt;
key PARTICLE_SRC_TARGET_KEY = &amp;quot;&amp;quot;;&lt;br /&gt;
string PARTICLE_SRC_TEXTURE = &amp;quot;&amp;quot;;&lt;br /&gt;
float PARTICLE_SRC_MAX_AGE;&lt;br /&gt;
float PARTICLE_PART_MAX_AGE;&lt;br /&gt;
float PARTICLE_BURST_RATE;&lt;br /&gt;
integer PARTICLE_BURST_PART_COUNT;&lt;br /&gt;
float PARTICLE_BURST_RADIUS;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MAX;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MIN;&lt;br /&gt;
float PARTICLE_START_ALPHA;&lt;br /&gt;
float PARTICLE_END_ALPHA;&lt;br /&gt;
float PARTICLE_INNERANGLE;&lt;br /&gt;
float PARTICLE_OUTERANGLE;&lt;br /&gt;
vector PARTICLE_START_COLOR;&lt;br /&gt;
vector PARTICLE_END_COLOR;&lt;br /&gt;
vector PARTICLE_START_SCALE;&lt;br /&gt;
vector PARTICLE_END_SCALE;&lt;br /&gt;
vector PARTICLE_ACCEL;&lt;br /&gt;
vector PARTICLE_OMEGA;&lt;br /&gt;
integer PARTICLE_SRC_PATTERN;&lt;br /&gt;
// Link Messages Channels&lt;br /&gt;
integer RESET_SCRIPTS = 0x2F34B;&lt;br /&gt;
integer HOLODECK_LIGHT            = 0x2F34C;&lt;br /&gt;
integer HOLODECK_TEXTURE            = 0x2F34D;&lt;br /&gt;
integer LOCATE_LIGHT = 0x2F34E;&lt;br /&gt;
integer LOCATE_TEXTURE = 0x2F34F;&lt;br /&gt;
integer HOLODECK_PARTICLE = 0x2F350;&lt;br /&gt;
integer HOLODECK_SOUND = 0x2F351;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
//*CHANGE BEGIN&lt;br /&gt;
//*Don&#039;t unrotate shell components&lt;br /&gt;
//*They must be remain oriented with face 0 toward the inside&lt;br /&gt;
//*It is face 0 that will be textured&lt;br /&gt;
//        vector eul = &amp;lt;0.00, 0.00, 0.00&amp;gt;;&lt;br /&gt;
//        eul *= DEG_TO_RAD;&lt;br /&gt;
//        rotation quat = llEuler2Rot( eul );&lt;br /&gt;
//        llSetRot( quat );&lt;br /&gt;
//*CHANGE END&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sent,integer num,string message,key id)&lt;br /&gt;
    {&lt;br /&gt;
    if (num == RESET_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
        llOwnerSay(&amp;quot;Resetting Holodeck Defaults&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_SOUND)&lt;br /&gt;
    {&lt;br /&gt;
        SOUND_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(SOUND_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            SOUND_TYPE = (integer)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_UUID = (string)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_VOLUME = (float)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            &lt;br /&gt;
            // Sound Change&lt;br /&gt;
            if(SOUND_TYPE == 1) &lt;br /&gt;
            { &lt;br /&gt;
               llPlaySound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 2) &lt;br /&gt;
            { &lt;br /&gt;
               llLoopSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 3) &lt;br /&gt;
            { &lt;br /&gt;
               llTriggerSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
                                                            &lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_TEXTURE)&lt;br /&gt;
    {&lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            &lt;br /&gt;
            //list conversions&lt;br /&gt;
            string LOCATE_TEXTURE_UID = llGetTexture(0);&lt;br /&gt;
            vector LOCATE_TEXTURE_REPEATS = llList2Vector(llGetPrimitiveParams([PRIM_TEXTURE,0]),1);&lt;br /&gt;
            vector LOCATE_TEXTURE_OFFSETS = llGetTextureOffset(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ROTATE = llGetTextureRot(0) * DEG_TO_RAD;&lt;br /&gt;
            vector LOCATE_TEXTURE_COLOR = llGetColor(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ALPHA = llGetAlpha(0);&lt;br /&gt;
                        &lt;br /&gt;
             llSay(0, (string)HOLODECK_GETOBJECTNAME+(string)&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_UID+                          // name&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_REPEATS+                      // repeats&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_OFFSETS+                      // offsets&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ROTATE+                       // rotation&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_COLOR+                      // color&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ALPHA);                     // alpha     &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_LIGHT)&lt;br /&gt;
    {          &lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            list LOCATE_PRIM_POINT_LIGHT =  llGetPrimitiveParams([PRIM_POINT_LIGHT]);&lt;br /&gt;
            list LOCATE_STATUS = ([&amp;quot;FALSE&amp;quot;,&amp;quot;TRUE&amp;quot;]);&lt;br /&gt;
            vector LIGHT_COLOR; &lt;br /&gt;
    &lt;br /&gt;
     // output the notecard to chat&lt;br /&gt;
     llSay(0, &amp;quot;locating Lighting Values for &amp;quot; + (string)HOLODECK_GETOBJECTNAME);&lt;br /&gt;
     llSleep(3);&lt;br /&gt;
     llSay(0, (string)HOLODECK_GETOBJECTNAME +                                                // Object Name&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2String(LOCATE_STATUS ,llList2Integer(LOCATE_PRIM_POINT_LIGHT,0)) + // Light Status&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2Vector(LOCATE_PRIM_POINT_LIGHT,1) +                                // Color&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,2) +                                  // Level&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,3) +                                  // Distance&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,4));                                  // falloff&lt;br /&gt;
     LOCATE_PRIM_POINT_LIGHT = [];   &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_LIGHT)&lt;br /&gt;
    {&lt;br /&gt;
        LIGHT_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            LIGHT_STATUS = (integer)llList2String(LIGHT_VALUES,1);&lt;br /&gt;
            LIGHT_COLOR = (vector)llList2String(LIGHT_VALUES,2);&lt;br /&gt;
            LIGHT_LEVEL = (float)llList2String(LIGHT_VALUES,3);&lt;br /&gt;
            LIGHT_DISTANCE = (float)llList2String(LIGHT_VALUES,4);&lt;br /&gt;
            LIGHT_FALLOFF = (float)llList2String(LIGHT_VALUES,5);&lt;br /&gt;
&lt;br /&gt;
            // Lighting Change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_POINT_LIGHT,&lt;br /&gt;
                LIGHT_STATUS, LIGHT_COLOR, LIGHT_LEVEL, LIGHT_DISTANCE, LIGHT_FALLOFF]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
    else if (num == HOLODECK_TEXTURE)&lt;br /&gt;
    {    &lt;br /&gt;
        TEXTURE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            TEXTURE_UID = llList2String(TEXTURE_VALUES,1);&lt;br /&gt;
            TEXTURE_REPEATS = (vector)llList2String(TEXTURE_VALUES,2);&lt;br /&gt;
            TEXTURE_OFFSETS = (vector)llList2String(TEXTURE_VALUES,3);&lt;br /&gt;
            TEXTURE_ROTATE = ((float)llList2String(TEXTURE_VALUES,4)) * DEG_TO_RAD;&lt;br /&gt;
            TEXTURE_COLOR = (vector)llList2String(TEXTURE_VALUES,5);&lt;br /&gt;
            TEXTURE_ALPHA = (float)llList2String(TEXTURE_VALUES,6);&lt;br /&gt;
            &lt;br /&gt;
            //texture change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_TEXTURE,0,TEXTURE_UID,TEXTURE_REPEATS,TEXTURE_OFFSETS,TEXTURE_ROTATE]);&lt;br /&gt;
            llSetPrimitiveParams([PRIM_COLOR,0,TEXTURE_COLOR,TEXTURE_ALPHA]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else if (num == HOLODECK_PARTICLE)&lt;br /&gt;
    {&lt;br /&gt;
        PARTICLE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(PARTICLE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            PARTICLE_PART_MAX_AGE = (float)llList2String(PARTICLE_VALUES,1);&lt;br /&gt;
            PARTICLE_FLAGS = (integer)llList2String(PARTICLE_VALUES,2);&lt;br /&gt;
            PARTICLE_START_COLOR = (vector)llList2String(PARTICLE_VALUES,3);&lt;br /&gt;
            PARTICLE_END_COLOR = (vector)llList2String(PARTICLE_VALUES,4);&lt;br /&gt;
            PARTICLE_START_SCALE = (vector)llList2String(PARTICLE_VALUES,5);&lt;br /&gt;
            PARTICLE_END_SCALE = (vector)llList2String(PARTICLE_VALUES,6);&lt;br /&gt;
            PARTICLE_SRC_PATTERN = (integer)llList2String(PARTICLE_VALUES,7);&lt;br /&gt;
            PARTICLE_BURST_RATE = (float)llList2String(PARTICLE_VALUES,8);&lt;br /&gt;
            PARTICLE_ACCEL = (vector)llList2String(PARTICLE_VALUES,9);&lt;br /&gt;
            PARTICLE_BURST_PART_COUNT = (integer)llList2String(PARTICLE_VALUES,10);&lt;br /&gt;
            PARTICLE_BURST_RADIUS = (float)llList2String(PARTICLE_VALUES,11);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MIN = (float)llList2String(PARTICLE_VALUES,12);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MAX = (float)llList2String(PARTICLE_VALUES,13);&lt;br /&gt;
            PARTICLE_INNERANGLE = (float)llList2String(PARTICLE_VALUES,14);&lt;br /&gt;
            PARTICLE_OUTERANGLE = (float)llList2String(PARTICLE_VALUES,15);&lt;br /&gt;
            PARTICLE_OMEGA = (vector)llList2String(PARTICLE_VALUES,16);&lt;br /&gt;
            PARTICLE_SRC_MAX_AGE = (float)llList2String(PARTICLE_VALUES,17);&lt;br /&gt;
            PARTICLE_START_ALPHA = (float)llList2String(PARTICLE_VALUES,18);&lt;br /&gt;
            PARTICLE_END_ALPHA = (float)llList2String(PARTICLE_VALUES,19);&lt;br /&gt;
            PARTICLE_SRC_TEXTURE = (string)llList2String(PARTICLE_VALUES,20);&lt;br /&gt;
            llSleep(1.5);&lt;br /&gt;
            // Particle Change&lt;br /&gt;
            llParticleSystem([  &lt;br /&gt;
                        PSYS_PART_MAX_AGE, PARTICLE_PART_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_FLAGS, PARTICLE_FLAGS,&lt;br /&gt;
                        PSYS_PART_START_COLOR, PARTICLE_START_COLOR,&lt;br /&gt;
                        PSYS_PART_END_COLOR, PARTICLE_END_COLOR,&lt;br /&gt;
                        PSYS_PART_START_SCALE, PARTICLE_START_SCALE,&lt;br /&gt;
                        PSYS_PART_END_SCALE, PARTICLE_END_SCALE,&lt;br /&gt;
                        PSYS_SRC_PATTERN, PARTICLE_SRC_PATTERN,&lt;br /&gt;
                        PSYS_SRC_BURST_RATE,PARTICLE_BURST_RATE,&lt;br /&gt;
                        PSYS_SRC_ACCEL,PARTICLE_ACCEL,&lt;br /&gt;
                        PSYS_SRC_BURST_PART_COUNT,PARTICLE_BURST_PART_COUNT,&lt;br /&gt;
                        PSYS_SRC_BURST_RADIUS,PARTICLE_BURST_RADIUS,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MIN,PARTICLE_BURST_SPEED_MIN,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MAX,PARTICLE_BURST_SPEED_MAX,&lt;br /&gt;
                        PSYS_SRC_ANGLE_BEGIN,PARTICLE_INNERANGLE,&lt;br /&gt;
                        PSYS_SRC_ANGLE_END,PARTICLE_OUTERANGLE,&lt;br /&gt;
                        PSYS_SRC_OMEGA,PARTICLE_OMEGA,&lt;br /&gt;
                        PSYS_SRC_MAX_AGE,PARTICLE_SRC_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_START_ALPHA,PARTICLE_START_ALPHA,&lt;br /&gt;
                        PSYS_PART_END_ALPHA,PARTICLE_END_ALPHA,&lt;br /&gt;
                        PSYS_SRC_TEXTURE, PARTICLE_SRC_TEXTURE,&lt;br /&gt;
                        PSYS_SRC_TARGET_KEY,PARTICLE_SRC_TARGET_KEY &lt;br /&gt;
                            ]);                         &lt;br /&gt;
        }            &lt;br /&gt;
    }&lt;br /&gt;
    if (DEBUG) llOwnerSay(&amp;quot;This Script Name &amp;quot; + (string)llGetScriptName()&lt;br /&gt;
        + &amp;quot;In Object Name &amp;quot; + (string)llGetObjectName()&lt;br /&gt;
        + &amp;quot;used &amp;quot; + (string)((16384 - llGetFreeMemory())/1024) + &amp;quot; kBytes&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script for the Door ===&lt;br /&gt;
&lt;br /&gt;
If the shell includes door prims, the following script should be place in each door prim. &lt;br /&gt;
This script does a hollow effect to give the impression of a door.&lt;br /&gt;
&lt;br /&gt;
Door System.lsl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message( integer sender, integer msg, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == PROTOTYPE_DOOR) {&lt;br /&gt;
            list open = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
            string open2 = llList2String(open, 3);&lt;br /&gt;
            if (llGetSubString(open2,0,2) != &amp;quot;0.0&amp;quot;)&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE,&lt;br /&gt;
                    PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.0,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
            else&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE,&lt;br /&gt;
                    PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.95,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Control Pannel ===&lt;br /&gt;
&lt;br /&gt;
Next we create a 0.500x0.500x0.100 box that is used for a control panel.&lt;br /&gt;
Link this to your holodeck shell linking the shell last becuase we want to keep the root prim intact.&lt;br /&gt;
I normally put this just to the side of the door but you can put this anywhere you like.&lt;br /&gt;
&lt;br /&gt;
Next right click select edit link parts and select the switch now we add the menu functions scripts.&lt;br /&gt;
&lt;br /&gt;
Menu System.lsl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list csv_commands;&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
integer SCENEMENU = -68194;&lt;br /&gt;
key agent;&lt;br /&gt;
key objectowner;&lt;br /&gt;
integer group;&lt;br /&gt;
// Set to TRUE to allow group members to use the dialog menu&lt;br /&gt;
// Set to FALSE to disallow group members from using the dialog menu&lt;br /&gt;
integer ingroup = 0;&lt;br /&gt;
//*CHANGE BEGIN&lt;br /&gt;
//*Flag for public access&lt;br /&gt;
integer public = 0;&lt;br /&gt;
//&lt;br /&gt;
integer DEBUG = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay(&amp;quot;Current chanel: &amp;quot;+(string)P_channel);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
//*CHANGE BEGIN&lt;br /&gt;
//*Fix typo - should be command not message&lt;br /&gt;
        if(command == llToLower(&amp;quot;PERMS&amp;quot;) || command == llToUpper(&amp;quot;PERMS&amp;quot;))&lt;br /&gt;
//*CHANGE END&lt;br /&gt;
        {&lt;br /&gt;
//*CHANGE BEGIN&lt;br /&gt;
//*Allow public access if PERMS is 2&lt;br /&gt;
//            ingroup = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            integer p = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(p == 0)&lt;br /&gt;
            {&lt;br /&gt;
                ingroup = FALSE;&lt;br /&gt;
                public = FALSE;&lt;br /&gt;
            }&lt;br /&gt;
            else if(p == 1)&lt;br /&gt;
            {&lt;br /&gt;
                ingroup = TRUE;&lt;br /&gt;
                public = FALSE;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                ingroup = TRUE;&lt;br /&gt;
                public = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;ingroup set to &amp;quot; + (string)ingroup);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;public set to &amp;quot; + (string)public);&lt;br /&gt;
//*CHANGE END&lt;br /&gt;
           return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    } // end listen();&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   &lt;br /&gt;
        group = llDetectedGroup(0); // Is the Agent in the objowners group?&lt;br /&gt;
        agent = llDetectedKey(0); // Agent&#039;s key&lt;br /&gt;
        objectowner = llGetOwner(); // objowners key&lt;br /&gt;
//*CHANGE BEGIN&lt;br /&gt;
//*Allow public access of menus&lt;br /&gt;
        // is the Agent = the owner OR is the agent in the owners group OR&lt;br /&gt;
        // public access is set&lt;br /&gt;
        if ( (objectowner == agent) || ( group &amp;amp;&amp;amp; ingroup ) || public )  {&lt;br /&gt;
            llMessageLinked(LINK_SET,SCENEMENU,&amp;quot;&amp;quot;,agent);&lt;br /&gt;
        }&lt;br /&gt;
//*CHANGE END&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setup Scene Clear ===&lt;br /&gt;
&lt;br /&gt;
Next create a box and label this box *Clear*&lt;br /&gt;
and add the following script. This will clear the scenes when you switch.&lt;br /&gt;
&lt;br /&gt;
Clear Label Script.lsl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
float gap = 15.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(0, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now take this box to your Inventry.&lt;br /&gt;
ow right click on your holodeck&amp;gt;content and drag the *Clear*  boxe into the root prim.&lt;br /&gt;
Wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
=== Make a Create Box for Creating New Scenes ===&lt;br /&gt;
&lt;br /&gt;
Now create another box Called *Create* give this box full permissions and take it into your inventry.&lt;br /&gt;
Now right click on your holodeck&amp;gt;content and drag the *Create* box into the root prim.&lt;br /&gt;
Wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
=== Script for Rezzed Objects ===&lt;br /&gt;
&lt;br /&gt;
The following script is not used in the shell.  Rather it will be placed in each scene object.&lt;br /&gt;
See the Builders Docs below for more information.&lt;br /&gt;
&lt;br /&gt;
internal label script.lsl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Configurable Settings&lt;br /&gt;
float fTimerInterval = 0.25; //Time in seconds between movement &#039;ticks&#039;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192; //Channel used by Base Prim to talk to Component Prims;&lt;br /&gt;
// This must match in both scripts&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Runtime Variables (Dont need to change below here unless making a derivative)&lt;br /&gt;
vector SceneOffset;&lt;br /&gt;
rotation SceneRotation;&lt;br /&gt;
integer SceneMove;&lt;br /&gt;
vector SceneDestPosition;&lt;br /&gt;
rotation SceneDestRotation;&lt;br /&gt;
integer SceneSaved = FALSE;&lt;br /&gt;
integer PROTOTYPE_VERSION = TRUE; // TRUE = Production, FALSE = Basic / NOMOD, NOCOPY NO TRANS Demo Box&lt;br /&gt;
integer PROTOTYPE_MESSAGE = TRUE;&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string first_word(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the first word in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the whole string.&lt;br /&gt;
    if(Token == &amp;quot;&amp;quot;) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, 0, pos - 1);&lt;br /&gt;
    else&lt;br /&gt;
        return In_String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string other_words(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
    //This routine searches for the other-than-first words in a string,&lt;br /&gt;
    // and returns it. If no word boundary found, returns&lt;br /&gt;
    // the an empty string.&lt;br /&gt;
    if( Token == &amp;quot;&amp;quot; ) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, pos + 1, llStringLength(In_String));&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
prototype_move()&lt;br /&gt;
{&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    vector SceneLastPosition = ZERO_VECTOR;&lt;br /&gt;
    while( (i &amp;lt; 5) &amp;amp;&amp;amp; (llGetPos() != SceneDestPosition) )&lt;br /&gt;
    {&lt;br /&gt;
        list lParams = [];&lt;br /&gt;
&lt;br /&gt;
        //If we&#039;re not there....&lt;br /&gt;
        if( llGetPos() != SceneDestPosition )&lt;br /&gt;
        {&lt;br /&gt;
            //We may be stuck on the ground...&lt;br /&gt;
            //Did we move at all compared to last loop?&lt;br /&gt;
            if( llGetPos() == SceneLastPosition )&lt;br /&gt;
            {&lt;br /&gt;
                //Yep, stuck...move straight up 10m (attempt to dislodge)&lt;br /&gt;
                lParams = [ PRIM_POSITION, llGetPos() + &amp;lt;0, 0, 10.0&amp;gt; ];&lt;br /&gt;
                //llSetPos(llGetPos() + &amp;lt;0, 0, 10.0&amp;gt;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //Record our spot for &#039;stuck&#039; detection&lt;br /&gt;
                SceneLastPosition = llGetPos();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //Try to move to destination&lt;br /&gt;
        integer iHops = llAbs(llCeil(llVecDist(llGetPos(), SceneDestPosition) / 10.0));&lt;br /&gt;
        integer x;&lt;br /&gt;
        for( x = 0; x &amp;lt; iHops; x++ ) {&lt;br /&gt;
            lParams += [ PRIM_POSITION, SceneDestPosition ];&lt;br /&gt;
        }&lt;br /&gt;
        llSetPrimitiveParams(lParams);&lt;br /&gt;
        //llSleep(0.1);&lt;br /&gt;
        ++i; // changed i++ too ++i credit goes to Simon Sugita for Speed Tweak :)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Set rotation&lt;br /&gt;
    llSetRot(SceneDestRotation);&lt;br /&gt;
}&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;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Open up the listener&lt;br /&gt;
        llListen(PROTOTYPE_SCRIPTS, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        //Set the channel to what&#039;s specified&lt;br /&gt;
        if( start_param != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_SCRIPTS = start_param;&lt;br /&gt;
            state reset_listeners;&lt;br /&gt;
        }&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;
        string command = llToUpper(first_word(message, &amp;quot; &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        if( command == &amp;quot;RECORD&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            SceneOffset = (llGetPos() - SceneVectorBase) / SceneRotationBase;&lt;br /&gt;
            SceneRotation = llGetRot() / SceneRotationBase;&lt;br /&gt;
            SceneSaved = TRUE;&lt;br /&gt;
            llOwnerSay(&amp;quot;Recorded position.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;MOVE&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
    &lt;br /&gt;
            //Don&#039;t move if we&#039;ve not yet recorded a position&lt;br /&gt;
            if( !SceneSaved ) return;&lt;br /&gt;
&lt;br /&gt;
            //Also ignore commands from bases with a different owner than us&lt;br /&gt;
            //(Anti-hacking measure)&lt;br /&gt;
            if( llGetOwner() != llGetOwnerKey(id) ) return;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            SceneDestPosition = (SceneOffset * SceneRotationBase) + SceneVectorBase;&lt;br /&gt;
            SceneDestRotation = SceneRotation * SceneRotationBase;&lt;br /&gt;
&lt;br /&gt;
            //Turn on our timer to perform the move?&lt;br /&gt;
            if( !SceneMove )&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(fTimerInterval);&lt;br /&gt;
                SceneMove = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;PHANTOM&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, turn phantom off&lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;DONE&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, remove script&lt;br /&gt;
            llRemoveInventory(llGetScriptName());&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;CLEAN&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            //Clean up&lt;br /&gt;
            llDie();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;FLUSH&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        //Turn ourselves off&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
&lt;br /&gt;
        //Do we need to move?&lt;br /&gt;
        if( SceneMove )&lt;br /&gt;
        {&lt;br /&gt;
            //Perform the move and clean up&lt;br /&gt;
            prototype_move();&lt;br /&gt;
            SceneMove = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state reset_listeners&lt;br /&gt;
{&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script for Scene Packages ===&lt;br /&gt;
&lt;br /&gt;
Likewise, this script is not part of the shell, but is rather placed in the box containing&lt;br /&gt;
all the objects for a scene.  See the Builder Docs below for more information.&lt;br /&gt;
&lt;br /&gt;
address script.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
float gap = 10.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
integer i;&lt;br /&gt;
integer iLine;&lt;br /&gt;
string item;&lt;br /&gt;
vector vThisPos;&lt;br /&gt;
rotation rThisRot;&lt;br /&gt;
&lt;br /&gt;
scene_entry()&lt;br /&gt;
{&lt;br /&gt;
    llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
    object = llGetObjectName();&lt;br /&gt;
    llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
    llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
       &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        scene_entry();&lt;br /&gt;
        vThisPos = llGetPos();&lt;br /&gt;
        rThisRot = llGetRot();&lt;br /&gt;
        iLine = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        for(i=0; i &amp;lt; iLine; i++)&lt;br /&gt;
        {&lt;br /&gt;
            item = llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            llSleep (1.00);&lt;br /&gt;
            llRezObject(item, vThisPos + &amp;lt;0.00, 0.00, 1.00&amp;gt;, ZERO_VECTOR, rThisRot, 0);&lt;br /&gt;
            llShout(PROTOTYPE_SCRIPTS, &amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            if (DEBUG) llShout (DEBUG_CHANNEL, &amp;quot;Rezzing &amp;quot; + item);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(DEBUG_CHANNEL, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;POSITION&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Builders Docs ==&lt;br /&gt;
&lt;br /&gt;
.::Prototype::. - Builders Manual&lt;br /&gt;
By Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
Welcome to the world of building with your Prototype System. Anyone wishing to build scenes for the Prototype needs to have a good understanding of building and texturing to succeed. Please read this manual through once fully and then as needed when you start building. This manual is divided into several sections:&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
Building scenes&lt;br /&gt;
Building Shells&lt;br /&gt;
Texture Card&lt;br /&gt;
Scene Creation&lt;br /&gt;
Tips&lt;br /&gt;
Packaging&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
The main thing to remember is any object you want to put in the Prototype scene/shell must be copy/mod at a minimum. The way the Prototype system works is by rezzing copies of an item from its inventory. These objects must be modified, adding a special script to make them work with the system scripts.&lt;br /&gt;
&lt;br /&gt;
There are two ways to build with the Prototype:&lt;br /&gt;
&lt;br /&gt;
# The linked scene&lt;br /&gt;
# The multi-item scene&lt;br /&gt;
&lt;br /&gt;
The linked scene is made from multiple objects and linked; the unlinked scene consists of a number or unlinked objects around the unit.&lt;br /&gt;
&lt;br /&gt;
A scene set will consist of the objects you create and a texture card. These will be explained in greater detail as we move along. The texture card must begin with tex_ or the system will not read them. Feel free to give your scenes a user friendly name, but only with letters, numbers, _ or – in the same name as the current scene we are building for.&lt;br /&gt;
&lt;br /&gt;
=== Building Scenes ===&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
# Create the objects you want in your scene and arrange them as you like&lt;br /&gt;
# Place a label script into each linked object or individual object you have set out in your scene &lt;br /&gt;
# Use /1000 SAVE to save the position and rotation of the current scene&lt;br /&gt;
# If you wish to modify the scene before repacking or move things around more, enter /1000 RESET and then follow step 3 again&lt;br /&gt;
# Next texture the walls, floor, and ceiling; set the repeats, etc. the way you want them&lt;br /&gt;
# Open the example tex_*Clear*, and go from prim to prim, and copy the info from the texture window to the notecard as explained above&lt;br /&gt;
# Name the suffix of the notecards something user friendly&lt;br /&gt;
# Right click on all the objects while holding the Ctrl key and choose edit; then take all the objects into your inventory&lt;br /&gt;
# Next, click on your control panel on the wall and press the *Create* button; this will prepare a package for your scene&lt;br /&gt;
# Now we will want to name the scene: right click this box, click edit, and fill in something friendly for your scene name and description&lt;br /&gt;
# Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts &lt;br /&gt;
# Drag the internal address script to the content tab of your inventory and drag the object from our scene that we took into our inventory earlier, copying this to the content tab; we now have all the requirements for loading scenes &lt;br /&gt;
# Right click on the Prototype floor panel, choose edit, check edit linked parts, then select the red area of the floor panel (inside the red field) and press Contents tab and drag the object package, and tex_package in there&lt;br /&gt;
# Type /1000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
# Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
=== Building Shells ===&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later, and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
# Create the objects you want as your Shell and arrange them as you like&lt;br /&gt;
# Place a external label script into each linked object or individual object you have set out as your prototype shell &lt;br /&gt;
# Use /2000 SAVE to save the position and rotation of the current shell; if you wish to modify the shell before repacking or move things around more enter /2000 RESET and then follow step 3 again&lt;br /&gt;
# Right click on all the object while holding the Ctrl key, edit and take all the objects into your inventory&lt;br /&gt;
# Next click on your control panel on the wall and press the *Create* button, preparing a package for your shell&lt;br /&gt;
# Now we will want to name the shell package: right click this box, edit it, and fill in something friendly for your shell name and description&lt;br /&gt;
# Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts&lt;br /&gt;
# Right click on the Prototype floor panel, go into edit, check edit link parts, then select the blue area of the floor panel (inside the blue field)&lt;br /&gt;
# Next go to the Content tab and drag the object package into it&lt;br /&gt;
# Type /2000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
# Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
=== Texture Card ===&lt;br /&gt;
The Prototype consists of eight wall, four ceiling, and four floor prims. The texture card has one line for each of these inner prim faces. The prims are named for their direction on the SL compass, and the name of each face on the texture card corresponds to these names. The card must begin with tex_xxx where xxx is the name of the scene, which must be the same name as will be given to the object card.&lt;br /&gt;
&lt;br /&gt;
Each line of the texture card has the following information:&lt;br /&gt;
&lt;br /&gt;
wall section#texture key#vector repeats#vector offsets#float rotation#vector color#float alpha&lt;br /&gt;
&lt;br /&gt;
Once it’s completed, it may look like the following:&lt;br /&gt;
&lt;br /&gt;
ene_wall#2eabe96c-2540-e1fa-ce7f-9030c3d958df#&amp;lt;1.5,1,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&lt;br /&gt;
Each of the items in the texture card must be separated by the symbol #&lt;br /&gt;
&lt;br /&gt;
*Wall Section*&lt;br /&gt;
The wall section name corresponds to the name given to each prim in the Prototype. Use the edit linked parts and then point to the prim, make a note of the wall name. Then go to the card and find the same line containing that wall name.&lt;br /&gt;
&lt;br /&gt;
*Texture Key*&lt;br /&gt;
This is the ID of the texture you are using. This texture must have full permissions. Right click on the prim, select texture, locate it in the list, then right click and copy UUID. Next paste this ID into the note card exactly between the ##.&lt;br /&gt;
&lt;br /&gt;
*Vector Repeats*&lt;br /&gt;
These numbers correspond to the horizontal/vertical repeats found in the texture tab in your edit window.  &lt;br /&gt;
&amp;lt;1.5,1,0&amp;gt;&lt;br /&gt;
The first number is horizontal repeats, the second one is vertical, the third is not used, so will always be 0. Please make sure that the numbers are separated with a comma or they will not work.&lt;br /&gt;
&lt;br /&gt;
*Vector Offsets*&lt;br /&gt;
This set of numbers corresponds to the horizontal/vertical offsets also found in the texture tab in the edit window. For most builds you will keep this set at NULL_VECTOR, since you can’t leave these numbers as 0,0,0. If you do need to offset a texture for some reason, you would replace NULL_VECTOR, with &amp;lt;.5,0,0&amp;gt;, again the first number in the set corresponds to the horizontal offset, the second for vertical offset, the third is not to be used, therefore is left at 0.&lt;br /&gt;
&lt;br /&gt;
*Float Rotation*&lt;br /&gt;
If the texture must be rotated for some reason on the prim face, you will enter that number in the float rotation section. In the example above it’s set at 90.0. Because of the location of some of the walls they will need to be set at 90.0 anyway.&lt;br /&gt;
&lt;br /&gt;
*Vector Color*&lt;br /&gt;
If you would like to tint the prim face, you will use this section. For walls that aren’t tinted, leave the numbers at 1,1,1 because this is equivalent to white/clear. 0,0,0 is black. Below are the basic colours, and included with the Prototype package is a full list of colours in SL format.&lt;br /&gt;
&lt;br /&gt;
Red, Green Blue&lt;br /&gt;
Number may go between 0.1 to 0.9 for each of the three colors&lt;br /&gt;
white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
*Float Alpha*&lt;br /&gt;
This corresponds to the amount of transparency, 1.0 being no transparency, 0.0 is full transparency.&lt;br /&gt;
&lt;br /&gt;
NOTE: One final word on textures. Make sure that when you reference a texture ID key, you keep that texture in your inventory.  If you delete it from inventory, after a while it will be deleted from the asset inventory SL keeps and won’t work anymore.&lt;br /&gt;
&lt;br /&gt;
That’s it for the texture note-card. It’s a little confusing in the beginning, but you will get the hang of it in no time. A demo note-card has been provided for you to use in what ever way you want. Just remember when naming the card, to use the tex_ prefix.&lt;br /&gt;
&lt;br /&gt;
=== Scene Creation ===&lt;br /&gt;
Depending on what you plan on using in your Prototype building, your scene will vary. Some people make their own furniture and other items for their scenes for their own use or for sale. Others use free items they have gathered around SL which have copy/mod permissions to build their scenes. The Prototype is perfect for personal homes, clubs, inns and hotels, skyboxes, anywhere you need to rez furniture. The wonderful thing is that you have multiple scenes stored in the Prototype and can change whenever you want, instead of having to keep dragging things from inventory. Or for those of you who don’t want to use all their prims on a home and 5 rooms, why not have one room with five scenes and a nice shell. There are places to purchase copy/mod pose balls for your scenes too.  &lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
Some tips when building items for your scenes:&lt;br /&gt;
&lt;br /&gt;
* Try to link as many prims together as they will load faster than ten smaller objects located around the box&lt;br /&gt;
* When placing objects keep in mind the location of the door&lt;br /&gt;
* When making an object that is an odd shape such as a torus, you may want to create a flat box prim below it, and link to that; it will save headaches later on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Packaging ===&lt;br /&gt;
When you decide to package the item for sale, make sure that you give copy rights to the next owner or they won’t be able to use it. It is also helpful to give full permissions on the texture. Ensure the name you give the object is user friendly, but also only contains letters, numbers _ or -. Don&#039;t forget to add the address script to each completed package.&lt;br /&gt;
&lt;br /&gt;
If you have any questions, please feel free to contact Revolution Perenti, and do join the .::Prototype::. Group you will receive updates of this manual and the scripts as they come out.  If you have any suggestions for this manual please feel free to let me know.&lt;br /&gt;
&lt;br /&gt;
Happy building!&lt;br /&gt;
&lt;br /&gt;
Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Holodeck Commands Quick Overview: ==&lt;br /&gt;
(.::Prototype 1.63::. should be replaced with what you called your root prim)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Commands Quick Guide&lt;br /&gt;
&lt;br /&gt;
// SCENE SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/1000 .::Prototype 1.63::.,CHANNEL,1001 (replace 1001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/1000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/1000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Prims Remaining on sim;&lt;br /&gt;
/1000 SIM&lt;br /&gt;
Prims Remaining on Parcel&lt;br /&gt;
/1000 PARCEL&lt;br /&gt;
Open or Close door;&lt;br /&gt;
/1000 DOOR&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/1000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/1000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/1000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/1000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/1000 EDIT&lt;br /&gt;
load weather type (this is future update and is reserved until beta testing is complete)&lt;br /&gt;
/1000 COMPATIBILITY Blizzard //replace Blizzard with weather type /snow, rain, blizzard, hail, storm, tornado&lt;br /&gt;
&lt;br /&gt;
// SHELL SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/2000 .::Prototype 1.63::.,CHANNEL,2001 (replace 2001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/2000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/2000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/2000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/2000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/2000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/2000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/2000 EDIT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Support ===&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Dazzle Software&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
Or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.org www.dazzlesoftware.org] Secondlife Open Source Section on Tutorials.&lt;br /&gt;
Latest version always available on [https://marketplace.secondlife.com/p/Dazzle-Software-Primitizer-Inspire-GPL/1269199 Marketplace] or [http://maps.secondlife.com/secondlife/Wyrd/230/83/97 Dazzle Software via Wyrd]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library|Holodeck}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=1173172</id>
		<title>Dataserver API</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=1173172"/>
		<updated>2012-10-06T17:41:29Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* How It Works */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
=Dataserver Framework=&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
&lt;br /&gt;
A common problem in SL is reading and parsing notecards by script. One application for this is so a script can be distributed as no-mod but still be configurable.&lt;br /&gt;
&lt;br /&gt;
The below framework demonstrates how to setup such an interface with very little work to retool.&lt;br /&gt;
&lt;br /&gt;
The default state reads the notecard and when it is done it activates the configuration state.&lt;br /&gt;
&lt;br /&gt;
===Testimonial===&lt;br /&gt;
&lt;br /&gt;
The most common problem I find is people asking about dataservers, reading from notecards to bypass variables within a notecard so you can release your script as nomod.&lt;br /&gt;
So I setup a simple system that I use time and time again that can be reused in any project.&lt;br /&gt;
The class itself is state based meaning the default state reads the notecard and then starts another state when the notecard is read and ready to use I explain this further below.&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string notecard_name = &amp;quot;configuration&amp;quot;;  // name of notecard goes here&lt;br /&gt;
&lt;br /&gt;
// internals&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer line;&lt;br /&gt;
key queryhandle;                   // to separate Dataserver requests&lt;br /&gt;
key notecarduuid;&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    queryhandle = llGetNotecardLine(notecard_name, line = 0);// request line&lt;br /&gt;
    notecarduuid = llGetInventoryKey(notecard_name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Config data loaded from notecard, with some sane defaults&lt;br /&gt;
integer channel = 1000;&lt;br /&gt;
string email_address = &amp;quot;revolution.perenti@skidzpartz.com&amp;quot;;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)         &lt;br /&gt;
    {&lt;br /&gt;
        // We want to reload channel notecard if it changed&lt;br /&gt;
        if (change &amp;amp; CHANGED_INVENTORY)&lt;br /&gt;
            if(notecarduuid != llGetInventoryKey(notecard_name))&lt;br /&gt;
                init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (query_id == queryhandle)&lt;br /&gt;
        {&lt;br /&gt;
            if (data != EOF)&lt;br /&gt;
            {   // not at the end of the notecard&lt;br /&gt;
                // yay!  Parsing time&lt;br /&gt;
                &lt;br /&gt;
                // pesky whitespace&lt;br /&gt;
                data = llStringTrim(data, STRING_TRIM_HEAD);&lt;br /&gt;
&lt;br /&gt;
                // is it a comment?&lt;br /&gt;
                if (llGetSubString (data, 0, 0) != &amp;quot;#&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    integer s = llSubStringIndex(data, &amp;quot;=&amp;quot;);&lt;br /&gt;
                    if(~s)//does it have an &amp;quot;=&amp;quot; in it?&lt;br /&gt;
                    {&lt;br /&gt;
                        string token = llToLower(llStringTrim(llDeleteSubString(data, s, -1), STRING_TRIM));&lt;br /&gt;
                        data = llStringTrim(llDeleteSubString(data, 0, s), STRING_TRIM);&lt;br /&gt;
&lt;br /&gt;
                        //Insert your token parsers here.&lt;br /&gt;
                        if (token == &amp;quot;email_address&amp;quot;)&lt;br /&gt;
                            email_address = data;&lt;br /&gt;
                        else if (token == &amp;quot;channel&amp;quot;)&lt;br /&gt;
                            channel = (integer)data;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                queryhandle = llGetNotecardLine(notecard_name, ++line);&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Notecard Data: &amp;quot; + data);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Done Reading Notecard&amp;quot;);&lt;br /&gt;
                state configuration ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state configuration&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(channel, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llShout(0, &amp;quot;Channel set to &amp;quot; + (string)channel);&lt;br /&gt;
        llShout(0, &amp;quot;Email set to &amp;quot; + (string)email_address);&lt;br /&gt;
    }   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Notecard==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
# This is the configuration file&lt;br /&gt;
channel = 1000&lt;br /&gt;
email_address = phoenixcms@hotmail.co.uk&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Lines that start with &amp;quot;#&amp;quot; are comments.&lt;br /&gt;
&lt;br /&gt;
==How It Works==&lt;br /&gt;
&lt;br /&gt;
The [[default]] [[state]] reads and parses all the lines in the notecard. As it reads the notecard it overwrites the default values with the values in the notecard. More specifically after each line has been validated and tokenized, the token is checked against supported tokens. If the token is supported the specific parser for the token is called, in the above example it is just a simple convert and copy. &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Dazzle Software&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
Or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.org www.dazzlesoftware.org] Secondlife Open Source Section on Tutorials.&lt;br /&gt;
Latest version always available on [https://marketplace.secondlife.com/p/Dazzle-Software-DataServer-API/374436 Marketplace] or [http://maps.secondlife.com/secondlife/Wyrd/230/83/97 Dazzle Software via Wyrd]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=1173171</id>
		<title>Dataserver API</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=1173171"/>
		<updated>2012-10-06T17:40:36Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* How It Works */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
=Dataserver Framework=&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
&lt;br /&gt;
A common problem in SL is reading and parsing notecards by script. One application for this is so a script can be distributed as no-mod but still be configurable.&lt;br /&gt;
&lt;br /&gt;
The below framework demonstrates how to setup such an interface with very little work to retool.&lt;br /&gt;
&lt;br /&gt;
The default state reads the notecard and when it is done it activates the configuration state.&lt;br /&gt;
&lt;br /&gt;
===Testimonial===&lt;br /&gt;
&lt;br /&gt;
The most common problem I find is people asking about dataservers, reading from notecards to bypass variables within a notecard so you can release your script as nomod.&lt;br /&gt;
So I setup a simple system that I use time and time again that can be reused in any project.&lt;br /&gt;
The class itself is state based meaning the default state reads the notecard and then starts another state when the notecard is read and ready to use I explain this further below.&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string notecard_name = &amp;quot;configuration&amp;quot;;  // name of notecard goes here&lt;br /&gt;
&lt;br /&gt;
// internals&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer line;&lt;br /&gt;
key queryhandle;                   // to separate Dataserver requests&lt;br /&gt;
key notecarduuid;&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    queryhandle = llGetNotecardLine(notecard_name, line = 0);// request line&lt;br /&gt;
    notecarduuid = llGetInventoryKey(notecard_name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Config data loaded from notecard, with some sane defaults&lt;br /&gt;
integer channel = 1000;&lt;br /&gt;
string email_address = &amp;quot;revolution.perenti@skidzpartz.com&amp;quot;;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)         &lt;br /&gt;
    {&lt;br /&gt;
        // We want to reload channel notecard if it changed&lt;br /&gt;
        if (change &amp;amp; CHANGED_INVENTORY)&lt;br /&gt;
            if(notecarduuid != llGetInventoryKey(notecard_name))&lt;br /&gt;
                init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (query_id == queryhandle)&lt;br /&gt;
        {&lt;br /&gt;
            if (data != EOF)&lt;br /&gt;
            {   // not at the end of the notecard&lt;br /&gt;
                // yay!  Parsing time&lt;br /&gt;
                &lt;br /&gt;
                // pesky whitespace&lt;br /&gt;
                data = llStringTrim(data, STRING_TRIM_HEAD);&lt;br /&gt;
&lt;br /&gt;
                // is it a comment?&lt;br /&gt;
                if (llGetSubString (data, 0, 0) != &amp;quot;#&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    integer s = llSubStringIndex(data, &amp;quot;=&amp;quot;);&lt;br /&gt;
                    if(~s)//does it have an &amp;quot;=&amp;quot; in it?&lt;br /&gt;
                    {&lt;br /&gt;
                        string token = llToLower(llStringTrim(llDeleteSubString(data, s, -1), STRING_TRIM));&lt;br /&gt;
                        data = llStringTrim(llDeleteSubString(data, 0, s), STRING_TRIM);&lt;br /&gt;
&lt;br /&gt;
                        //Insert your token parsers here.&lt;br /&gt;
                        if (token == &amp;quot;email_address&amp;quot;)&lt;br /&gt;
                            email_address = data;&lt;br /&gt;
                        else if (token == &amp;quot;channel&amp;quot;)&lt;br /&gt;
                            channel = (integer)data;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                queryhandle = llGetNotecardLine(notecard_name, ++line);&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Notecard Data: &amp;quot; + data);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Done Reading Notecard&amp;quot;);&lt;br /&gt;
                state configuration ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state configuration&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(channel, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llShout(0, &amp;quot;Channel set to &amp;quot; + (string)channel);&lt;br /&gt;
        llShout(0, &amp;quot;Email set to &amp;quot; + (string)email_address);&lt;br /&gt;
    }   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Notecard==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
# This is the configuration file&lt;br /&gt;
channel = 1000&lt;br /&gt;
email_address = phoenixcms@hotmail.co.uk&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Lines that start with &amp;quot;#&amp;quot; are comments.&lt;br /&gt;
&lt;br /&gt;
==How It Works==&lt;br /&gt;
&lt;br /&gt;
The [[default]] [[state]] reads and parses all the lines in the notecard. As it reads the notecard it overwrites the default values with the values in the notecard. More specifically after each line has been validated and tokenized, the token is checked against supported tokens. If the token is supported the specific parser for the token is called, in the above example it is just a simple convert and copy. &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Dazzle Software&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
Or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.org www.dazzlesoftware.org] Secondlife Open Source Section on Tutorials.&lt;br /&gt;
Latest version always available on [https://marketplace.secondlife.com/p/Dazzle-Software-DataServer-API/374436] or [http://maps.secondlife.com/secondlife/Wyrd/230/83/97 Dazzle Software via Wyrd]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=1167823</id>
		<title>Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=1167823"/>
		<updated>2012-05-30T11:26:14Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* Known Holodeck &amp;amp; Panocube Products: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
== What is a Holodeck? ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;Holodeck&#039;&#039;&#039; is a product used to save different forms of content (either furniture settings or even an entire environment), similar to &#039;Holodecks&#039; used in various sci-fi television shows and movies. For Second Life purposes, a holodeck allows you to rez a large variety of rooms or scenarios in limited space. Some systems even allow the scene to be located far away from its control panel, offering the convenience of large, rez-on-demand structures without tying up a large space in your house.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;holodeck-panocube&#039;&#039;&#039; consists of photos. The picture changes on every wall, plus the floor and ceiling, making a total immersed &amp;quot;single&amp;quot; image. A regular holodeck will rezz and derezz prims such as different houses with furniture, and might rezz surrounding panocube images in addition.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;skybox&#039;&#039;&#039; is a method to easily create a background to make a computer and video games look bigger than it really is, by creating the illusion of distant three-dimensional surroundings. A &#039;&#039;&#039;skydome&#039;&#039;&#039; employs the same concept but uses either a sphere or a hemisphere instead of a cube.&lt;br /&gt;
&lt;br /&gt;
Processing of 3d graphics is very costly, specifically in real-time games, and poses multiple limits. Levels have to be processed at tremendous speeds, making it difficult to render vast skyscapes in real-time. Additionally, due to the nature of computer graphics, objects at large distances suffer from floating point errors, causing levels to have strong limits on their extents.&lt;br /&gt;
&lt;br /&gt;
To compensate for these problems, games often employ skyboxes. Traditionally, these are simple cubes with up to 6 different textures placed on the faces. By careful alignment, a viewer in the exact middle of the skybox will perceive the illusion of a real 3-D world around it, made up of those 6 faces.&lt;br /&gt;
As a viewer moves through a 3-D scene, it is common for the skybox to remain stationary with respect to the viewer. This technique gives the skybox the illusion of being very far away since other objects in the scene appear to move, while the skybox does not. This imitates real life, where distant objects such as clouds, stars and even mountains appear to be stationary when the viewpoint is displaced by relatively small distances. Effectively, everything in a skybox will always appear to be infinitely distant from the viewer. This consequence of skyboxes dictates that designers should be careful not to carelessly include images of discrete objects in the textures of a skybox since the viewer may be able to perceive the inconsistencies of those objects&#039; sizes as the scene is traversed.&lt;br /&gt;
The source of a skybox can be any form of texture including photographs, hand-drawn images, or pre-rendered 3-D geometry. Usually, these textures are created and aligned in 6 directions, with viewing angles of 90 degrees (which covers up the 6 faces of the cube). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Known Holodeck &amp;amp; Panocube Products: ===&lt;br /&gt;
* &#039;&#039;&#039;Evolve Holodeck&#039;&#039;&#039; by evonic Ordram&lt;br /&gt;
* &#039;&#039;&#039;The Holodeck&#039;&#039;&#039; by Loki Clifton&lt;br /&gt;
* &#039;&#039;&#039;Horizons&#039;&#039;&#039; by Cheshyr Pontchartrain&lt;br /&gt;
* &#039;&#039;&#039;HyperCube&#039;&#039;&#039; by Domneth Dingson -D-VTech&lt;br /&gt;
* &#039;&#039;&#039;Super Sofa&#039;&#039;&#039; by LayZeeBones&lt;br /&gt;
* &#039;&#039;&#039;Holodeck&#039;&#039;&#039; by Soulmates Creations&lt;br /&gt;
* &#039;&#039;&#039;Paradise Blanket&#039;&#039;&#039; by OctoberWerks&lt;br /&gt;
* &#039;&#039;&#039;HoloRez&#039;&#039;&#039; by HoloRez Rang&lt;br /&gt;
* &#039;&#039;&#039;Skyboxer&#039;&#039;&#039; by Ethereal Fremont&lt;br /&gt;
* [https://marketplace.secondlife.com/p/Skidz-Partz-Primitizer-Open-Source-Holodeck/1269199 &#039;&#039;&#039;Primitizer&#039;&#039;&#039;] by Revolution Parenti&lt;br /&gt;
* &#039;&#039;&#039;The Titan&#039;&#039;&#039; by Jack Hathor&lt;br /&gt;
* &#039;&#039;&#039;Room Switch&#039;&#039;&#039; by Loki Ball&lt;br /&gt;
* &#039;&#039;&#039;The Green Wonder&#039;&#039;&#039; by Tina Freund&lt;br /&gt;
* &#039;&#039;&#039;Holodeck&#039;&#039;&#039; by Professor Eisenberg (Panocube)&lt;br /&gt;
* &#039;&#039;&#039;The Virtual Reality Room&#039;&#039;&#039; by Stephane Zugzwang (Panocube)&lt;br /&gt;
* &#039;&#039;&#039;Krull&#039;s VR Room System&#039;&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;Mobius Box&#039;&#039;&#039; by Fox Absolute&lt;br /&gt;
* &#039;&#039;&#039;DRUID Holodeck&#039;&#039;&#039; by Darwin Recreant and Ui Beam&lt;br /&gt;
* [http://world.secondlife.com/place/75b6d881-a0ea-617e-be05-8eed0211f737 &#039;&#039;&#039;The Ultimate Virtual Reality Holodeck&#039;&#039;&#039;] by Vander Reich &amp;amp; RichSz Rexen(Panocube) [http://reich-rexen.com/R&amp;amp;R-VR-HOLODECK-INSTRUCTIONS.pdf R&amp;amp;R-VR-HOLODECK-INSTRUCTIONS]&lt;br /&gt;
* [http://world.secondlife.com/place/6a21a533-d880-5f38-8ed5-2c4a365a4f38 &#039;&#039;&#039;SkyBox Lab&#039;&#039;&#039; HoloDeck SkyMaps] by ThoseGuys Footmen&lt;br /&gt;
* [http://world.secondlife.com/place/6a21a533-d880-5f38-8ed5-2c4a365a4f38 &#039;&#039;&#039;AWESOME BALLS&#039;&#039;&#039; 3D Environments - HoloDecks &amp;amp; SkyMaps]&lt;br /&gt;
&lt;br /&gt;
==Related Articles==&lt;br /&gt;
*[[Open Source Holodeck]]&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Texture_Menu_Management&amp;diff=1144169</id>
		<title>Texture Menu Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Texture_Menu_Management&amp;diff=1144169"/>
		<updated>2011-05-19T22:46:45Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* Main Script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
=Texture Menu Management=&lt;br /&gt;
&lt;br /&gt;
(based on our previus script and released here for you as we did a custom edit for second-life community and i thought you may like to use this script as well.)&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
Allows you to have dialog based navigation of textures.&lt;br /&gt;
and browse the image you like to display on your [[prim]] from a dialog with simple and ease of navigation &lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Create a script and copy and paste the script below into your [[prim]].&lt;br /&gt;
and copy textures or photos from your [[inventory]] into the content tab of your [[prim]]&lt;br /&gt;
click your prim containing the script and textures and select a [[texture]] or photo from the menu dialog&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
integer listener;&lt;br /&gt;
integer MENU_CHANNEL = 1000;&lt;br /&gt;
&lt;br /&gt;
// opens menu channel and displays dialog&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(listener);&lt;br /&gt;
    listener = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;Select one object below: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        // reset scripts on rez&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        MENU1 = [];&lt;br /&gt;
        MENU2 = [];&lt;br /&gt;
        // count the textures in the prim to see if we need pages&lt;br /&gt;
        integer c = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
        if (c &amp;lt;= 12)&lt;br /&gt;
        {&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_TEXTURE, i);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {        &lt;br /&gt;
            for (; i &amp;lt; 11; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_TEXTURE, i);&lt;br /&gt;
            if(c &amp;gt; 22)&lt;br /&gt;
                c = 22;&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU2 += llGetInventoryName(INVENTORY_TEXTURE, i); &lt;br /&gt;
            MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
            MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;                          &lt;br /&gt;
        }&lt;br /&gt;
        // display the dialog &lt;br /&gt;
        Dialog(llDetectedKey(0), MENU1);&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 (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);  &lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }        &lt;br /&gt;
            else                    &lt;br /&gt;
            {&lt;br /&gt;
                // display the texture from menu selection &lt;br /&gt;
                llSetTexture(message, ALL_SIDES);&lt;br /&gt;
                &lt;br /&gt;
            }      &lt;br /&gt;
        }&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.ca www.dazzlesoftware.ca] Secondlife Open Source Section on our Tutorials.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Script_Override_Functions&amp;diff=1144168</id>
		<title>Script Override Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Script_Override_Functions&amp;diff=1144168"/>
		<updated>2011-05-19T22:46:22Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
== Script Override ==&lt;br /&gt;
Well, you like to override strings, integer etc. in chat channel. For example you like to enable debug or change the channel. I find this the best solution and it can be pretty useful API framework for many listens.&lt;br /&gt;
&lt;br /&gt;
==== USAGE: /CHANNEL Object_Name,message,value eg: /1000 Object,channel,1001 ====&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list csv_commands;&lt;br /&gt;
&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&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;
        csv_commands = llCSV2List( llToLower( message ));&lt;br /&gt;
//        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands, 1);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = (integer)llList2String( csv_commands, 2);&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel);&lt;br /&gt;
        }&lt;br /&gt;
        else if(command == &amp;quot;avatar&amp;quot; || message == &amp;quot;AVATAR&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0, &amp;quot;Hello, Avatar!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.ca www.dazzlesoftware.ca] Secondlife Open Source Section on our Tutorials.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;br /&gt;
{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Inventory_Based_Menu&amp;diff=1144167</id>
		<title>Inventory Based Menu</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Inventory_Based_Menu&amp;diff=1144167"/>
		<updated>2011-05-19T22:44:21Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
Introduction:&lt;br /&gt;
Ok you want to create a dialog based menu system, you want to support more than 12 buttons&lt;br /&gt;
so im going to give you quick overview of basic menu using [[llRezAtRoot]], [[llGetInventoryName]] &amp;amp; [[llGetInventoryNumber]]&lt;br /&gt;
&lt;br /&gt;
USAGE:just drop objects into the prim and rez them from the dialog by touching the prim.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
integer listener;&lt;br /&gt;
integer MENU_CHANNEL = 1000;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(listener);&lt;br /&gt;
    listener = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;Select one object below: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        MENU1 = [];&lt;br /&gt;
        MENU2 = [];&lt;br /&gt;
        integer c = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        if (c &amp;lt;= 12)&lt;br /&gt;
        {&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {        &lt;br /&gt;
            for (; i &amp;lt; 11; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            if(c &amp;gt; 22)&lt;br /&gt;
                c = 22;&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU2 += llGetInventoryName(INVENTORY_OBJECT, i); &lt;br /&gt;
            MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
            MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;                          &lt;br /&gt;
        }&lt;br /&gt;
        Dialog(llDetectedKey(0), MENU1);&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 (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);  &lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }        &lt;br /&gt;
            else                    &lt;br /&gt;
            {&lt;br /&gt;
                // todo add offsets so box sites perfect on rezzer &lt;br /&gt;
                llRezAtRoot(message, llGetPos(), ZERO_VECTOR, llGetRot(), 0);&lt;br /&gt;
            }      &lt;br /&gt;
        }&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
If you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.ca www.dazzlesoftware.ca] Secondlife Open Source Section on Tutorials.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Open_Source_Holodeck&amp;diff=1144166</id>
		<title>Open Source Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Open_Source_Holodeck&amp;diff=1144166"/>
		<updated>2011-05-19T22:41:51Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
What is a Holodeck?&lt;br /&gt;
&lt;br /&gt;
A Holodeck stores Second Life scenes and lets you load them from a menu when ever you want. The old scene is cleared and the new one appears. Scenes can include any prim objects including furniture, pose balls and particle generators.&lt;br /&gt;
&lt;br /&gt;
== Creating a Holodeck ==&lt;br /&gt;
&lt;br /&gt;
=== the Shell ===&lt;br /&gt;
&lt;br /&gt;
The Scripts for the holodeck may look complex but once you have done it correctly everything is very simple to use. Building and setup are similar to methods you would normally use within SecondLife.&lt;br /&gt;
&lt;br /&gt;
The best way to start creating a holodeck would be to build a 20x20x10 shell. This will be your rezzing area for the holodeck scenes.&lt;br /&gt;
&lt;br /&gt;
Your shell should look something similar to the picture below.&lt;br /&gt;
&lt;br /&gt;
[[Image:holodeck shell.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== the floor panel ===&lt;br /&gt;
&lt;br /&gt;
Next we create a small floor panel. In the example we use a 0.500x0.500x0.100 cube. Link the floor panel to your holodeck shell. Make sure that the floor panel is the last object you link to the shell as this becomes the root prim. The floor panel &#039;&#039;&#039;MUST&#039;&#039;&#039; be the root prim in order for the holodeck to function properly.&lt;br /&gt;
&lt;br /&gt;
see example below&lt;br /&gt;
&lt;br /&gt;
[[Image:floor panel.jpg]]&lt;br /&gt;
&lt;br /&gt;
The Scripts&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Holodeck Core.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// User Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//How long to listen for a menu response before shutting down the listener&lt;br /&gt;
float fListenTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//How often (in seconds) to check for change in position when moving&lt;br /&gt;
float fMovingRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
//How long to sit still before exiting active mode&lt;br /&gt;
float fStoppedTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//Minimum amount of time (in seconds) between movement updates&lt;br /&gt;
float fShoutRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
// label script name used for debug and PrototypeSay();&lt;br /&gt;
string label = &amp;quot;internal label&amp;quot;;&lt;br /&gt;
// Channel used by Prototype&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer MENU_CHANNEL;&lt;br /&gt;
integer MENU_HANDLE;&lt;br /&gt;
string PROTOTYPE_CREATOR;&lt;br /&gt;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
integer PROTOTYPE_RESET = -68195;&lt;br /&gt;
integer SHOW_MENU = -68194;&lt;br /&gt;
// Channel used by Prototype to talk to label scripts&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
// Feature Manager&lt;br /&gt;
integer PROTOTYPE_TEXTURE = TRUE;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Security Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
integer PROTOTYPE_ALLOW_IM = FALSE;&lt;br /&gt;
string  PROTOTYPE_EMAIL = &amp;quot;phoenixcms@hotmail.co.uk&amp;quot;;&lt;br /&gt;
string  PROTOTYPE_OWNER;&lt;br /&gt;
vector  Where;&lt;br /&gt;
string  Name;&lt;br /&gt;
string  SLURL;&lt;br /&gt;
integer X;&lt;br /&gt;
integer Y;&lt;br /&gt;
integer Z;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Menu System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Compatibility System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list objectSettings = [];&lt;br /&gt;
integer stride = 3;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
string COMPATIBILITY_NOTECARD = &amp;quot;compatibility&amp;quot;; //[objectname];&amp;lt;position&amp;gt;;&amp;lt;rotation&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DO NOT EDIT BELOW THIS LINE.... NO.. NOT EVEN THEN&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer PrototypeBaseMoving;&lt;br /&gt;
vector PrototypeLastPosition;&lt;br /&gt;
rotation PrototypeLastRotation;&lt;br /&gt;
integer iListenTimeout = 0;&lt;br /&gt;
&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//To avoid flooding the sim with a high rate of movements&lt;br /&gt;
//(and the resulting mass updates it will bring), we used&lt;br /&gt;
// a short throttle to limit ourselves&lt;br /&gt;
prototype_moved()&lt;br /&gt;
{&lt;br /&gt;
    llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ llGetPos(), llGetRot() ], &amp;quot;|&amp;quot;));&lt;br /&gt;
    llResetTime(); //Reset our throttle&lt;br /&gt;
    PrototypeLastPosition = llGetPos();&lt;br /&gt;
    PrototypeLastRotation = llGetRot();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    iListenTimeout = llGetUnixTime() + llFloor(fListenTime);&lt;br /&gt;
    MENU_CHANNEL = llFloor(llFrand(-99999.0 - -100));&lt;br /&gt;
    MENU_HANDLE = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;www.sl-prototype.com: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
    llSetTimerEvent(fShoutRate);&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;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER || CHANGED_INVENTORY)&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry () &lt;br /&gt;
    {&lt;br /&gt;
        // Lets open our listen channel&lt;br /&gt;
        key_listen = llListen(PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;LISTEN ON CHANNEL &amp;quot; +(string)PROTOTYPE_CHANNEL);&lt;br /&gt;
        // Compatibility System Notecard&lt;br /&gt;
        llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        //Record our position&lt;br /&gt;
        PrototypeLastPosition = llGetPos();&lt;br /&gt;
        PrototypeLastRotation = llGetRot();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    dataserver(key queryId, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            objectSettings += llParseString2List(data, [&amp;quot;;&amp;quot;], []);&lt;br /&gt;
            iLine++;&lt;br /&gt;
            llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Done Reading Compatibility Notecard &amp;quot; + COMPATIBILITY_NOTECARD);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number==SHOW_MENU) {&lt;br /&gt;
            MENU1 = [];&lt;br /&gt;
            MENU2 = [];&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
                MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            Dialog(id, MENU1);&lt;br /&gt;
        }&lt;br /&gt;
        if (number==PROTOTYPE_RESET) {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Forgetting positions...&amp;quot;);&lt;br /&gt;
            llPrototypeSay(&amp;quot;RESET&amp;quot;);&lt;br /&gt;
        }&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;
        list compatibility = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        PROTOTYPE_CREATOR = llGetCreator();&lt;br /&gt;
        //&lt;br /&gt;
        if ( command == llToLower(&amp;quot;CHANNEL&amp;quot;) || command == llToUpper(&amp;quot;CHANNEL&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)PROTOTYPE_CHANNEL );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;MESSAGE&amp;quot;) || command == llToUpper(&amp;quot;MESSAGE&amp;quot;))  &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_MESSAGE = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;PROTOTYPE MESSAGE set to &amp;quot; + (string)PROTOTYPE_MESSAGE );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // OPEN / CLOSE DOOR    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;DOOR&amp;quot;) || message == llToUpper(&amp;quot;DOOR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, PROTOTYPE_DOOR, &amp;quot;&amp;quot;,NULL_KEY );&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Setting Door Permissions...&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        // SET COMPATIBILITY&lt;br /&gt;
        if (llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;)&lt;br /&gt;
            || llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            string object = llList2String(compatibility, 1);&lt;br /&gt;
            integer indexInSettings = llListFindList(objectSettings, [object]);&lt;br /&gt;
            if(indexInSettings &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                vector pos = (vector)llList2String(objectSettings, indexInSettings + 1);&lt;br /&gt;
                rotation rot = (rotation)llList2String(objectSettings, indexInSettings + 2);&lt;br /&gt;
                llRezAtRoot(object, pos + llGetPos(), ZERO_VECTOR, rot, 0);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // LOAD MENU SYSTEM    &lt;br /&gt;
        if (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                //Loop through backwards (safety precaution in case of inventory change)&lt;br /&gt;
                if (DEBUG) llDebugSay(&amp;quot;Loading build pieces please wait...&amp;quot;);&lt;br /&gt;
                llRezAtRoot(message, llGetPos() + &amp;lt;0.00, 0.00, 0.30&amp;gt;, ZERO_VECTOR,&lt;br /&gt;
                    llGetRot(), PROTOTYPE_CHANNEL);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // REPOSTION SCENE    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;POSITION&amp;quot;) || message == llToUpper(&amp;quot;POSITION&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Positioning&amp;quot;);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // CLEAR SCENE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;CLEAR&amp;quot;) || message == llToUpper(&amp;quot;CLEAR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;CLEAN&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if( message == llToLower(&amp;quot;HOLODECKDIE&amp;quot;) || message == llToUpper(&amp;quot;HOLODECKDIE&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            if(PROTOTYPE_CREATOR) llDie();&lt;br /&gt;
        }&lt;br /&gt;
        // DISABLE PHANTOM AS WE ARE NOW DONE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;NOPHANTOM&amp;quot;) || message == llToUpper(&amp;quot;NOPHANTOM&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;PHANTOM&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Disabled Phantom&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    moving_start() //StartPrototype&lt;br /&gt;
    {&lt;br /&gt;
        if( !PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            PrototypeBaseMoving = TRUE;&lt;br /&gt;
            llSetTimerEvent(0.0); //Resets the timer if already running&lt;br /&gt;
            llSetTimerEvent(fMovingRate);&lt;br /&gt;
            prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer() &lt;br /&gt;
    {&lt;br /&gt;
        //Were we moving?&lt;br /&gt;
        if( PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            //Did we change position/rotation?&lt;br /&gt;
            if( (llGetRot() != PrototypeLastRotation) || (llGetPos() != PrototypeLastPosition) )&lt;br /&gt;
            {&lt;br /&gt;
                if( llGetTime() &amp;gt; fShoutRate ) {&lt;br /&gt;
                    prototype_moved();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
        // Have we been sitting long enough to consider ourselves stopped?&lt;br /&gt;
            if( llGetTime() &amp;gt; fStoppedTime )&lt;br /&gt;
            PrototypeBaseMoving = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Open listener?&lt;br /&gt;
        if( iListenTimeout != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            //Past our close timeout?&lt;br /&gt;
            if( iListenTimeout &amp;lt;= llGetUnixTime() )&lt;br /&gt;
            {&lt;br /&gt;
                iListenTimeout = 0;&lt;br /&gt;
                llListenRemove(MENU_HANDLE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Stop the timer?&lt;br /&gt;
        if( (iListenTimeout == 0) &amp;amp;&amp;amp; ( !PrototypeBaseMoving ) )&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Stopping Timer&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    } // END TIMER FUNCTION&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        PROTOTYPE_OWNER = llGetOwner();&lt;br /&gt;
        //Name = llGetRegionName();&lt;br /&gt;
        Name = llDumpList2String(llParseString2List(llGetRegionName(),[&amp;quot; &amp;quot;],[]),&amp;quot;_&amp;quot;);&lt;br /&gt;
        Where = llGetPos();&lt;br /&gt;
&lt;br /&gt;
        X = (integer)Where.x;&lt;br /&gt;
        Y = (integer)Where.y;&lt;br /&gt;
        Z = (integer)Where.z;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // I don&#039;t replace any spaces in Name with %20 and so forth.&lt;br /&gt;
&lt;br /&gt;
        SLURL = &amp;quot;http://slurl.com/secondlife/&amp;quot;&lt;br /&gt;
            + Name + &amp;quot;/&amp;quot; + (string)X + &amp;quot;/&amp;quot; + (string)Y + &amp;quot;/&amp;quot; + (string)Z + &amp;quot;/?title=&amp;quot; + Name;&lt;br /&gt;
&lt;br /&gt;
        llEmail(PROTOTYPE_EMAIL, llKey2Name(PROTOTYPE_OWNER),&lt;br /&gt;
            SLURL + &amp;quot;\nRegistered user =&amp;quot; + llKey2Name(PROTOTYPE_OWNER)&lt;br /&gt;
                  + &amp;quot;Registered user key =&amp;quot; + PROTOTYPE_OWNER);&lt;br /&gt;
        if (PROTOTYPE_ALLOW_IM) {&lt;br /&gt;
            llInstantMessage(llGetCreator(), SLURL);&lt;br /&gt;
        }&lt;br /&gt;
        // Reset ourselves&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Texture Engine.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
string TEXTURE_NOTECARD;&lt;br /&gt;
string prefix = &amp;quot;tex_&amp;quot;;&lt;br /&gt;
key TextureQuery;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
integer DEBUG = FALSE; // debug channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
default {&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        TEXTURE_NOTECARD = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + TEXTURE_NOTECARD);&lt;br /&gt;
        TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        list texture = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            TEXTURE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)TEXTURE_CHANNEL);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(llList2String(texture, 0) == &amp;quot;image&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            iLine = 0;&lt;br /&gt;
            TEXTURE_NOTECARD = llList2String(texture, 1);&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////        &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == TextureQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data != EOF &amp;amp;&amp;amp; prefix == &amp;quot;tex_&amp;quot;) {    &lt;br /&gt;
            &lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);&lt;br /&gt;
                llMessageLinked(LINK_SET,0,data,NULL_KEY);&lt;br /&gt;
&lt;br /&gt;
                // increment line count                 &lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                ++iLine;&lt;br /&gt;
                TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Done reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Notecards&lt;br /&gt;
&lt;br /&gt;
*Clear* Notecard for default Clear Scene &lt;br /&gt;
(note the first line of texture notecards is object name so make sure you name all floor panels, roof and walls with unique name and edit the notecard as required add each object line to a new line as required.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
Object_Name#2f78ee38-9aca-f8d1-5306-458beab181f9#&amp;lt;3.0,1.0,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
compatibility notecard leave this blank at current its planned as future feature to allow weather inside the holodeck and was the old rez system from early beta but we left it here to be reused later on.&lt;br /&gt;
&lt;br /&gt;
=== Scripts for the Shell Prims ===&lt;br /&gt;
&lt;br /&gt;
Walls, Floor,Roof texture,particles,sound &amp;amp; locate system&lt;br /&gt;
needs to be added to every object you wish to texture each object needs a unique name too for better control of textures&lt;br /&gt;
System.lsl (updated to 2.0.2)&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Skidz Partz - Open Source Holodeck Version (2.0.1)&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// Debug&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
&lt;br /&gt;
// Sound System&lt;br /&gt;
list SOUND_VALUES;&lt;br /&gt;
integer SOUND_TYPE;&lt;br /&gt;
string SOUND_UUID;&lt;br /&gt;
float SOUND_VOLUME;&lt;br /&gt;
// Texture System&lt;br /&gt;
list TEXTURE_VALUES;&lt;br /&gt;
string HOLODECK_OBJECTNAME;&lt;br /&gt;
string TEXTURE_UID;&lt;br /&gt;
vector TEXTURE_REPEATS;&lt;br /&gt;
vector TEXTURE_OFFSETS;&lt;br /&gt;
float TEXTURE_ROTATE;&lt;br /&gt;
vector TEXTURE_COLOR;&lt;br /&gt;
float TEXTURE_ALPHA;&lt;br /&gt;
&lt;br /&gt;
// Lighting System&lt;br /&gt;
list LIGHT_VALUES;&lt;br /&gt;
integer  LIGHT_STATUS;&lt;br /&gt;
// Color of the light (RGB - each value between 0.0 and 1.0)&lt;br /&gt;
vector LIGHT_COLOR;&lt;br /&gt;
// Intensity of the light (values from 0.0 .. 1.0)&lt;br /&gt;
float  LIGHT_LEVEL;&lt;br /&gt;
// Radius of light cone&lt;br /&gt;
float  LIGHT_DISTANCE;&lt;br /&gt;
// Fall off (distance/intensity decrease) values from 0.0 ..1.0&lt;br /&gt;
float  LIGHT_FALLOFF;&lt;br /&gt;
&lt;br /&gt;
// Particle System&lt;br /&gt;
integer PARTICLE_FLAGS;&lt;br /&gt;
//&lt;br /&gt;
list PARTICLE_VALUES;&lt;br /&gt;
key PARTICLE_SRC_TARGET_KEY = &amp;quot;&amp;quot;;&lt;br /&gt;
string PARTICLE_SRC_TEXTURE = &amp;quot;&amp;quot;;&lt;br /&gt;
float PARTICLE_SRC_MAX_AGE;&lt;br /&gt;
float PARTICLE_PART_MAX_AGE;&lt;br /&gt;
float PARTICLE_BURST_RATE;&lt;br /&gt;
integer PARTICLE_BURST_PART_COUNT;&lt;br /&gt;
float PARTICLE_BURST_RADIUS;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MAX;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MIN;&lt;br /&gt;
float PARTICLE_START_ALPHA;&lt;br /&gt;
float PARTICLE_END_ALPHA;&lt;br /&gt;
float PARTICLE_INNERANGLE;&lt;br /&gt;
float PARTICLE_OUTERANGLE;&lt;br /&gt;
vector PARTICLE_START_COLOR;&lt;br /&gt;
vector PARTICLE_END_COLOR;&lt;br /&gt;
vector PARTICLE_START_SCALE;&lt;br /&gt;
vector PARTICLE_END_SCALE;&lt;br /&gt;
vector PARTICLE_ACCEL;&lt;br /&gt;
vector PARTICLE_OMEGA;&lt;br /&gt;
integer PARTICLE_SRC_PATTERN;&lt;br /&gt;
// Link Messages Channels&lt;br /&gt;
integer RESET_SCRIPTS = 0x2F34B;&lt;br /&gt;
integer HOLODECK_LIGHT            = 0x2F34C;&lt;br /&gt;
integer HOLODECK_TEXTURE            = 0x2F34D;&lt;br /&gt;
integer LOCATE_LIGHT = 0x2F34E;&lt;br /&gt;
integer LOCATE_TEXTURE = 0x2F34F;&lt;br /&gt;
integer HOLODECK_PARTICLE = 0x2F350;&lt;br /&gt;
integer HOLODECK_SOUND = 0x2F351;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector eul = &amp;lt;0.00, 0.00, 0.00&amp;gt;;&lt;br /&gt;
        eul *= DEG_TO_RAD;&lt;br /&gt;
        rotation quat = llEuler2Rot( eul );&lt;br /&gt;
        llSetRot( quat );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sent,integer num,string message,key id)&lt;br /&gt;
    {&lt;br /&gt;
    if (num == RESET_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
        llOwnerSay(&amp;quot;Resetting Holodeck Defaults&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_SOUND)&lt;br /&gt;
    {&lt;br /&gt;
        SOUND_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(SOUND_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            SOUND_TYPE = (integer)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_UUID = (string)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_VOLUME = (float)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            &lt;br /&gt;
            // Sound Change&lt;br /&gt;
            if(SOUND_TYPE == 1) &lt;br /&gt;
            { &lt;br /&gt;
               llPlaySound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 2) &lt;br /&gt;
            { &lt;br /&gt;
               llLoopSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 3) &lt;br /&gt;
            { &lt;br /&gt;
               llTriggerSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
                                                            &lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_TEXTURE)&lt;br /&gt;
    {&lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            &lt;br /&gt;
            //list conversions&lt;br /&gt;
            string LOCATE_TEXTURE_UID = llGetTexture(0);&lt;br /&gt;
            vector LOCATE_TEXTURE_REPEATS = llList2Vector(llGetPrimitiveParams([PRIM_TEXTURE,0]),1);&lt;br /&gt;
            vector LOCATE_TEXTURE_OFFSETS = llGetTextureOffset(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ROTATE = llGetTextureRot(0) * DEG_TO_RAD;&lt;br /&gt;
            vector LOCATE_TEXTURE_COLOR = llGetColor(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ALPHA = llGetAlpha(0);&lt;br /&gt;
                        &lt;br /&gt;
             llSay(0, (string)HOLODECK_GETOBJECTNAME+(string)&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_UID+                          // name&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_REPEATS+                      // repeats&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_OFFSETS+                      // offsets&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ROTATE+                       // rotation&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_COLOR+                      // color&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ALPHA);                     // alpha     &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_LIGHT)&lt;br /&gt;
    {          &lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            list LOCATE_PRIM_POINT_LIGHT =  llGetPrimitiveParams([PRIM_POINT_LIGHT]);&lt;br /&gt;
            list LOCATE_STATUS = ([&amp;quot;FALSE&amp;quot;,&amp;quot;TRUE&amp;quot;]);&lt;br /&gt;
            vector LIGHT_COLOR; &lt;br /&gt;
    &lt;br /&gt;
     // output the notecard to chat&lt;br /&gt;
     llSay(0, &amp;quot;locating Lighting Values for &amp;quot; + (string)HOLODECK_GETOBJECTNAME);&lt;br /&gt;
     llSleep(3);&lt;br /&gt;
     llSay(0, (string)HOLODECK_GETOBJECTNAME +                                                // Object Name&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2String(LOCATE_STATUS ,llList2Integer(LOCATE_PRIM_POINT_LIGHT,0)) + // Light Status&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2Vector(LOCATE_PRIM_POINT_LIGHT,1) +                                // Color&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,2) +                                  // Level&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,3) +                                  // Distance&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,4));                                  // falloff&lt;br /&gt;
     LOCATE_PRIM_POINT_LIGHT = [];   &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_LIGHT)&lt;br /&gt;
    {&lt;br /&gt;
        LIGHT_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            LIGHT_STATUS = (integer)llList2String(LIGHT_VALUES,1);&lt;br /&gt;
            LIGHT_COLOR = (vector)llList2String(LIGHT_VALUES,2);&lt;br /&gt;
            LIGHT_LEVEL = (float)llList2String(LIGHT_VALUES,3);&lt;br /&gt;
            LIGHT_DISTANCE = (float)llList2String(LIGHT_VALUES,4);&lt;br /&gt;
            LIGHT_FALLOFF = (float)llList2String(LIGHT_VALUES,5);&lt;br /&gt;
&lt;br /&gt;
            // Lighting Change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_POINT_LIGHT,&lt;br /&gt;
                LIGHT_STATUS, LIGHT_COLOR, LIGHT_LEVEL, LIGHT_DISTANCE, LIGHT_FALLOFF]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
    else if (num == HOLODECK_TEXTURE)&lt;br /&gt;
    {    &lt;br /&gt;
        TEXTURE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            TEXTURE_UID = llList2String(TEXTURE_VALUES,1);&lt;br /&gt;
            TEXTURE_REPEATS = (vector)llList2String(TEXTURE_VALUES,2);&lt;br /&gt;
            TEXTURE_OFFSETS = (vector)llList2String(TEXTURE_VALUES,3);&lt;br /&gt;
            TEXTURE_ROTATE = ((float)llList2String(TEXTURE_VALUES,4)) * DEG_TO_RAD;&lt;br /&gt;
            TEXTURE_COLOR = (vector)llList2String(TEXTURE_VALUES,5);&lt;br /&gt;
            TEXTURE_ALPHA = (float)llList2String(TEXTURE_VALUES,6);&lt;br /&gt;
            &lt;br /&gt;
            //texture change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_TEXTURE,0,TEXTURE_UID,TEXTURE_REPEATS,TEXTURE_OFFSETS,TEXTURE_ROTATE]);&lt;br /&gt;
            llSetPrimitiveParams([PRIM_COLOR,0,TEXTURE_COLOR,TEXTURE_ALPHA]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else if (num == HOLODECK_PARTICLE)&lt;br /&gt;
    {&lt;br /&gt;
        PARTICLE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(PARTICLE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            PARTICLE_PART_MAX_AGE = (float)llList2String(PARTICLE_VALUES,1);&lt;br /&gt;
            PARTICLE_FLAGS = (integer)llList2String(PARTICLE_VALUES,2);&lt;br /&gt;
            PARTICLE_START_COLOR = (vector)llList2String(PARTICLE_VALUES,3);&lt;br /&gt;
            PARTICLE_END_COLOR = (vector)llList2String(PARTICLE_VALUES,4);&lt;br /&gt;
            PARTICLE_START_SCALE = (vector)llList2String(PARTICLE_VALUES,5);&lt;br /&gt;
            PARTICLE_END_SCALE = (vector)llList2String(PARTICLE_VALUES,6);&lt;br /&gt;
            PARTICLE_SRC_PATTERN = (integer)llList2String(PARTICLE_VALUES,7);&lt;br /&gt;
            PARTICLE_BURST_RATE = (float)llList2String(PARTICLE_VALUES,8);&lt;br /&gt;
            PARTICLE_ACCEL = (vector)llList2String(PARTICLE_VALUES,9);&lt;br /&gt;
            PARTICLE_BURST_PART_COUNT = (integer)llList2String(PARTICLE_VALUES,10);&lt;br /&gt;
            PARTICLE_BURST_RADIUS = (float)llList2String(PARTICLE_VALUES,11);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MIN = (float)llList2String(PARTICLE_VALUES,12);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MAX = (float)llList2String(PARTICLE_VALUES,13);&lt;br /&gt;
            PARTICLE_INNERANGLE = (float)llList2String(PARTICLE_VALUES,14);&lt;br /&gt;
            PARTICLE_OUTERANGLE = (float)llList2String(PARTICLE_VALUES,15);&lt;br /&gt;
            PARTICLE_OMEGA = (vector)llList2String(PARTICLE_VALUES,16);&lt;br /&gt;
            PARTICLE_SRC_MAX_AGE = (float)llList2String(PARTICLE_VALUES,17);&lt;br /&gt;
            PARTICLE_START_ALPHA = (float)llList2String(PARTICLE_VALUES,18);&lt;br /&gt;
            PARTICLE_END_ALPHA = (float)llList2String(PARTICLE_VALUES,19);&lt;br /&gt;
            PARTICLE_SRC_TEXTURE = (string)llList2String(PARTICLE_VALUES,20);&lt;br /&gt;
            llSleep(1.5);&lt;br /&gt;
            // Particle Change&lt;br /&gt;
            llParticleSystem([  &lt;br /&gt;
                        PSYS_PART_MAX_AGE, PARTICLE_PART_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_FLAGS, PARTICLE_FLAGS,&lt;br /&gt;
                        PSYS_PART_START_COLOR, PARTICLE_START_COLOR,&lt;br /&gt;
                        PSYS_PART_END_COLOR, PARTICLE_END_COLOR,&lt;br /&gt;
                        PSYS_PART_START_SCALE, PARTICLE_START_SCALE,&lt;br /&gt;
                        PSYS_PART_END_SCALE, PARTICLE_END_SCALE,&lt;br /&gt;
                        PSYS_SRC_PATTERN, PARTICLE_SRC_PATTERN,&lt;br /&gt;
                        PSYS_SRC_BURST_RATE,PARTICLE_BURST_RATE,&lt;br /&gt;
                        PSYS_SRC_ACCEL,PARTICLE_ACCEL,&lt;br /&gt;
                        PSYS_SRC_BURST_PART_COUNT,PARTICLE_BURST_PART_COUNT,&lt;br /&gt;
                        PSYS_SRC_BURST_RADIUS,PARTICLE_BURST_RADIUS,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MIN,PARTICLE_BURST_SPEED_MIN,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MAX,PARTICLE_BURST_SPEED_MAX,&lt;br /&gt;
                        PSYS_SRC_ANGLE_BEGIN,PARTICLE_INNERANGLE,&lt;br /&gt;
                        PSYS_SRC_ANGLE_END,PARTICLE_OUTERANGLE,&lt;br /&gt;
                        PSYS_SRC_OMEGA,PARTICLE_OMEGA,&lt;br /&gt;
                        PSYS_SRC_MAX_AGE,PARTICLE_SRC_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_START_ALPHA,PARTICLE_START_ALPHA,&lt;br /&gt;
                        PSYS_PART_END_ALPHA,PARTICLE_END_ALPHA,&lt;br /&gt;
                        PSYS_SRC_TEXTURE, PARTICLE_SRC_TEXTURE,&lt;br /&gt;
                        PSYS_SRC_TARGET_KEY,PARTICLE_SRC_TARGET_KEY &lt;br /&gt;
                            ]);                         &lt;br /&gt;
        }            &lt;br /&gt;
    }&lt;br /&gt;
    if (DEBUG) llOwnerSay(&amp;quot;This Script Name &amp;quot; + (string)llGetScriptName()&lt;br /&gt;
        + &amp;quot;In Object Name &amp;quot; + (string)llGetObjectName()&lt;br /&gt;
        + &amp;quot;used &amp;quot; + (string)((16384 - llGetFreeMemory())/1024) + &amp;quot; kBytes&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Door ===&lt;br /&gt;
&lt;br /&gt;
Door Script to be places in one of the prims where you would like a door, this does a hollow effect to give the impression of the door and is controlled with link messages.&lt;br /&gt;
&lt;br /&gt;
Door System.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message( integer sender, integer msg, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == PROTOTYPE_DOOR) {&lt;br /&gt;
            list open = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
            string open2 = llList2String(open, 3);&lt;br /&gt;
            if (llGetSubString(open2,0,2) != &amp;quot;0.0&amp;quot;)&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE,&lt;br /&gt;
                    PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.0,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
            else&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE,&lt;br /&gt;
                    PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.95,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Control Pannel ===&lt;br /&gt;
&lt;br /&gt;
next we create a 0.500x0.500x0.100 box this is used for control panel&lt;br /&gt;
now link this to your holodeck shell linking the shell last becuase we want to keep the root prim intact i normally put this just to the side of the door but you can put this anywhere you like.&lt;br /&gt;
&lt;br /&gt;
Next right click select edit link parts and select the switch now we add the menu functions scripts.&lt;br /&gt;
&lt;br /&gt;
Menu System.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list csv_commands;&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
integer SCENEMENU = -68194;&lt;br /&gt;
key agent;&lt;br /&gt;
key objectowner;&lt;br /&gt;
integer group;&lt;br /&gt;
// Set to TRUE to allow group members to use the dialog menu&lt;br /&gt;
// Set to FALSE to disallow group members from using the dialog menu&lt;br /&gt;
integer ingroup = 0;&lt;br /&gt;
integer DEBUG = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay(&amp;quot;Current chanel: &amp;quot;+(string)P_channel);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(command == llToLower(&amp;quot;PERMS&amp;quot;) || message == llToUpper(&amp;quot;PERMS&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            ingroup = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;ingroup set to &amp;quot; + (string)ingroup);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    } // end listen();&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   &lt;br /&gt;
        group = llDetectedGroup(0); // Is the Agent in the objowners group?&lt;br /&gt;
        agent = llDetectedKey(0); // Agent&#039;s key&lt;br /&gt;
        objectowner = llGetOwner(); // objowners key&lt;br /&gt;
        // is the Agent = the owner OR is the agent in the owners group&lt;br /&gt;
        if ( (objectowner == agent) || ( group &amp;amp;&amp;amp; ingroup )  )  {&lt;br /&gt;
            llMessageLinked(LINK_SET,SCENEMENU,&amp;quot;&amp;quot;,agent);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup Scene Clear&lt;br /&gt;
&lt;br /&gt;
next create a box and label this box *Clear*&lt;br /&gt;
and add the following script this will clear the scenes when you switch.&lt;br /&gt;
&lt;br /&gt;
Clear Label Script.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
float gap = 15.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(0, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now take this box to your Inventry.&lt;br /&gt;
&lt;br /&gt;
now create another box Called *Create* give this box full permissions and take into your inventry&lt;br /&gt;
now right click on your holodeck-&amp;gt;content and drag the *Clear* &amp;amp; *Create* boxes into the root prim.&lt;br /&gt;
wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
internal label script.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Configurable Settings&lt;br /&gt;
float fTimerInterval = 0.25; //Time in seconds between movement &#039;ticks&#039;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192; //Channel used by Base Prim to talk to Component Prims;&lt;br /&gt;
// This must match in both scripts&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Runtime Variables (Dont need to change below here unless making a derivative)&lt;br /&gt;
vector SceneOffset;&lt;br /&gt;
rotation SceneRotation;&lt;br /&gt;
integer SceneMove;&lt;br /&gt;
vector SceneDestPosition;&lt;br /&gt;
rotation SceneDestRotation;&lt;br /&gt;
integer SceneSaved = FALSE;&lt;br /&gt;
integer PROTOTYPE_VERSION = TRUE; // TRUE = Production, FALSE = Basic / NOMOD, NOCOPY NO TRANS Demo Box&lt;br /&gt;
integer PROTOTYPE_MESSAGE = TRUE;&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string first_word(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the first word in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the whole string.&lt;br /&gt;
    if(Token == &amp;quot;&amp;quot;) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, 0, pos - 1);&lt;br /&gt;
    else&lt;br /&gt;
        return In_String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string other_words(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
    //This routine searches for the other-than-first words in a string,&lt;br /&gt;
    // and returns it. If no word boundary found, returns&lt;br /&gt;
    // the an empty string.&lt;br /&gt;
    if( Token == &amp;quot;&amp;quot; ) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, pos + 1, llStringLength(In_String));&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
prototype_move()&lt;br /&gt;
{&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    vector SceneLastPosition = ZERO_VECTOR;&lt;br /&gt;
    while( (i &amp;lt; 5) &amp;amp;&amp;amp; (llGetPos() != SceneDestPosition) )&lt;br /&gt;
    {&lt;br /&gt;
        list lParams = [];&lt;br /&gt;
&lt;br /&gt;
        //If we&#039;re not there....&lt;br /&gt;
        if( llGetPos() != SceneDestPosition )&lt;br /&gt;
        {&lt;br /&gt;
            //We may be stuck on the ground...&lt;br /&gt;
            //Did we move at all compared to last loop?&lt;br /&gt;
            if( llGetPos() == SceneLastPosition )&lt;br /&gt;
            {&lt;br /&gt;
                //Yep, stuck...move straight up 10m (attempt to dislodge)&lt;br /&gt;
                lParams = [ PRIM_POSITION, llGetPos() + &amp;lt;0, 0, 10.0&amp;gt; ];&lt;br /&gt;
                //llSetPos(llGetPos() + &amp;lt;0, 0, 10.0&amp;gt;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //Record our spot for &#039;stuck&#039; detection&lt;br /&gt;
                SceneLastPosition = llGetPos();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //Try to move to destination&lt;br /&gt;
        integer iHops = llAbs(llCeil(llVecDist(llGetPos(), SceneDestPosition) / 10.0));&lt;br /&gt;
        integer x;&lt;br /&gt;
        for( x = 0; x &amp;lt; iHops; x++ ) {&lt;br /&gt;
            lParams += [ PRIM_POSITION, SceneDestPosition ];&lt;br /&gt;
        }&lt;br /&gt;
        llSetPrimitiveParams(lParams);&lt;br /&gt;
        //llSleep(0.1);&lt;br /&gt;
        ++i; // changed i++ too ++i credit goes to Simon Sugita for Speed Tweak :)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Set rotation&lt;br /&gt;
    llSetRot(SceneDestRotation);&lt;br /&gt;
}&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;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Open up the listener&lt;br /&gt;
        llListen(PROTOTYPE_SCRIPTS, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        //Set the channel to what&#039;s specified&lt;br /&gt;
        if( start_param != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_SCRIPTS = start_param;&lt;br /&gt;
            state reset_listeners;&lt;br /&gt;
        }&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;
        string command = llToUpper(first_word(message, &amp;quot; &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        if( command == &amp;quot;RECORD&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            SceneOffset = (llGetPos() - SceneVectorBase) / SceneRotationBase;&lt;br /&gt;
            SceneRotation = llGetRot() / SceneRotationBase;&lt;br /&gt;
            SceneSaved = TRUE;&lt;br /&gt;
            llOwnerSay(&amp;quot;Recorded position.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;MOVE&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
    &lt;br /&gt;
            //Don&#039;t move if we&#039;ve not yet recorded a position&lt;br /&gt;
            if( !SceneSaved ) return;&lt;br /&gt;
&lt;br /&gt;
            //Also ignore commands from bases with a different owner than us&lt;br /&gt;
            //(Anti-hacking measure)&lt;br /&gt;
            if( llGetOwner() != llGetOwnerKey(id) ) return;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            SceneDestPosition = (SceneOffset * SceneRotationBase) + SceneVectorBase;&lt;br /&gt;
            SceneDestRotation = SceneRotation * SceneRotationBase;&lt;br /&gt;
&lt;br /&gt;
            //Turn on our timer to perform the move?&lt;br /&gt;
            if( !SceneMove )&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(fTimerInterval);&lt;br /&gt;
                SceneMove = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;PHANTOM&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, turn phantom off&lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;DONE&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, remove script&lt;br /&gt;
            llRemoveInventory(llGetScriptName());&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;CLEAN&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            //Clean up&lt;br /&gt;
            llDie();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;FLUSH&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        //Turn ourselves off&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
&lt;br /&gt;
        //Do we need to move?&lt;br /&gt;
        if( SceneMove )&lt;br /&gt;
        {&lt;br /&gt;
            //Perform the move and clean up&lt;br /&gt;
            prototype_move();&lt;br /&gt;
            SceneMove = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state reset_listeners&lt;br /&gt;
{&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Package Scripts)&lt;br /&gt;
address script.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
float gap = 10.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
integer i;&lt;br /&gt;
integer iLine;&lt;br /&gt;
string item;&lt;br /&gt;
vector vThisPos;&lt;br /&gt;
rotation rThisRot;&lt;br /&gt;
&lt;br /&gt;
scene_entry()&lt;br /&gt;
{&lt;br /&gt;
    llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
    object = llGetObjectName();&lt;br /&gt;
    llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
    llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
       &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        scene_entry();&lt;br /&gt;
        vThisPos = llGetPos();&lt;br /&gt;
        rThisRot = llGetRot();&lt;br /&gt;
        iLine = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        for(i=0; i &amp;lt; iLine; i++)&lt;br /&gt;
        {&lt;br /&gt;
            item = llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            llSleep (1.00);&lt;br /&gt;
            llRezObject(item, vThisPos + &amp;lt;0.00, 0.00, 1.00&amp;gt;, ZERO_VECTOR, rThisRot, 0);&lt;br /&gt;
            llShout(PROTOTYPE_SCRIPTS, &amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            if (DEBUG) llShout (DEBUG_CHANNEL, &amp;quot;Rezzing &amp;quot; + item);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(DEBUG_CHANNEL, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;POSITION&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Builders Docs ==&lt;br /&gt;
&lt;br /&gt;
.::Prototype::. - Builders Manual&lt;br /&gt;
By Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
Welcome to the world of building with your Prototype System. Anyone wishing to build scenes for the Prototype needs to have a good understanding of building and texturing to succeed. Please read this manual through once fully and then as needed when you start building. This manual is divided into several sections:&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
Building scenes&lt;br /&gt;
Building Shells&lt;br /&gt;
Texture Card&lt;br /&gt;
Scene Creation&lt;br /&gt;
Tips&lt;br /&gt;
Packaging&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
The main thing to remember is any object you want to put in the Prototype scene/shell must be copy/mod at a minimum. The way the Prototype system works is by rezzing copies of an item from its inventory. These objects must be modified, adding a special script to make them work with the system scripts.&lt;br /&gt;
&lt;br /&gt;
There are two ways to build with the Prototype:&lt;br /&gt;
&lt;br /&gt;
# The linked scene&lt;br /&gt;
# The multi-item scene&lt;br /&gt;
&lt;br /&gt;
The linked scene is made from multiple objects and linked; the unlinked scene consists of a number or unlinked objects around the unit.&lt;br /&gt;
&lt;br /&gt;
A scene set will consist of the objects you create and a texture card. These will be explained in greater detail as we move along. The texture card must begin with tex_ or the system will not read them. Feel free to give your scenes a user friendly name, but only with letters, numbers, _ or – in the same name as the current scene we are building for.&lt;br /&gt;
&lt;br /&gt;
=== Building Scenes ===&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
# Create the objects you want in your scene and arrange them as you like&lt;br /&gt;
# Place a label script into each linked object or individual object you have set out in your scene &lt;br /&gt;
# Use /1000 SAVE to save the position and rotation of the current scene&lt;br /&gt;
# If you wish to modify the scene before repacking or move things around more, enter /1000 RESET and then follow step 3 again&lt;br /&gt;
# Next texture the walls, floor, and ceiling; set the repeats, etc. the way you want them&lt;br /&gt;
# Open the example tex_*Clear*, and go from prim to prim, and copy the info from the texture window to the notecard as explained above&lt;br /&gt;
# Name the suffix of the notecards something user friendly&lt;br /&gt;
# Right click on all the objects while holding the Ctrl key and choose edit; then take all the objects into your inventory&lt;br /&gt;
# Next, click on your control panel on the wall and press the *Create* button; this will prepare a package for your scene&lt;br /&gt;
# Now we will want to name the scene: right click this box, click edit, and fill in something friendly for your scene name and description&lt;br /&gt;
# Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts &lt;br /&gt;
# Drag the internal address script to the content tab of your inventory and drag the object from our scene that we took into our inventory earlier, copying this to the content tab; we now have all the requirements for loading scenes &lt;br /&gt;
# Right click on the Prototype floor panel, choose edit, check edit linked parts, then select the red area of the floor panel (inside the red field) and press Contents tab and drag the object package, and tex_package in there&lt;br /&gt;
# Type /1000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
# Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
=== Building Shells ===&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later, and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
# Create the objects you want as your Shell and arrange them as you like&lt;br /&gt;
# Place a external label script into each linked object or individual object you have set out as your prototype shell &lt;br /&gt;
# Use /2000 SAVE to save the position and rotation of the current shell; if you wish to modify the shell before repacking or move things around more enter /2000 RESET and then follow step 3 again&lt;br /&gt;
# Right click on all the object while holding the Ctrl key, edit and take all the objects into your inventory&lt;br /&gt;
# Next click on your control panel on the wall and press the *Create* button, preparing a package for your shell&lt;br /&gt;
# Now we will want to name the shell package: right click this box, edit it, and fill in something friendly for your shell name and description&lt;br /&gt;
# Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts&lt;br /&gt;
# Right click on the Prototype floor panel, go into edit, check edit link parts, then select the blue area of the floor panel (inside the blue field)&lt;br /&gt;
# Next go to the Content tab and drag the object package into it&lt;br /&gt;
# Type /2000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
# Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
=== Texture Card ===&lt;br /&gt;
The Prototype consists of eight wall, four ceiling, and four floor prims. The texture card has one line for each of these inner prim faces. The prims are named for their direction on the SL compass, and the name of each face on the texture card corresponds to these names. The card must begin with tex_xxx where xxx is the name of the scene, which must be the same name as will be given to the object card.&lt;br /&gt;
&lt;br /&gt;
Each line of the texture card has the following information:&lt;br /&gt;
&lt;br /&gt;
wall section#texture key#vector repeats#vector offsets#float rotation#vector color#float alpha&lt;br /&gt;
&lt;br /&gt;
Once it’s completed, it may look like the following:&lt;br /&gt;
&lt;br /&gt;
ene_wall#2eabe96c-2540-e1fa-ce7f-9030c3d958df#&amp;lt;1.5,1,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&lt;br /&gt;
Each of the items in the texture card must be separated by the symbol #&lt;br /&gt;
&lt;br /&gt;
*Wall Section*&lt;br /&gt;
The wall section name corresponds to the name given to each prim in the Prototype. Use the edit linked parts and then point to the prim, make a note of the wall name. Then go to the card and find the same line containing that wall name.&lt;br /&gt;
&lt;br /&gt;
*Texture Key*&lt;br /&gt;
This is the ID of the texture you are using. This texture must have full permissions. Right click on the prim, select texture, locate it in the list, then right click and copy UUID. Next paste this ID into the note card exactly between the ##.&lt;br /&gt;
&lt;br /&gt;
*Vector Repeats*&lt;br /&gt;
These numbers correspond to the horizontal/vertical repeats found in the texture tab in your edit window.  &lt;br /&gt;
&amp;lt;1.5,1,0&amp;gt;&lt;br /&gt;
The first number is horizontal repeats, the second one is vertical, the third is not used, so will always be 0. Please make sure that the numbers are separated with a comma or they will not work.&lt;br /&gt;
&lt;br /&gt;
*Vector Offsets*&lt;br /&gt;
This set of numbers corresponds to the horizontal/vertical offsets also found in the texture tab in the edit window. For most builds you will keep this set at NULL_VECTOR, since you can’t leave these numbers as 0,0,0. If you do need to offset a texture for some reason, you would replace NULL_VECTOR, with &amp;lt;.5,0,0&amp;gt;, again the first number in the set corresponds to the horizontal offset, the second for vertical offset, the third is not to be used, therefore is left at 0.&lt;br /&gt;
&lt;br /&gt;
*Float Rotation*&lt;br /&gt;
If the texture must be rotated for some reason on the prim face, you will enter that number in the float rotation section. In the example above it’s set at 90.0. Because of the location of some of the walls they will need to be set at 90.0 anyway.&lt;br /&gt;
&lt;br /&gt;
*Vector Color*&lt;br /&gt;
If you would like to tint the prim face, you will use this section. For walls that aren’t tinted, leave the numbers at 1,1,1 because this is equivalent to white/clear. 0,0,0 is black. Below are the basic colours, and included with the Prototype package is a full list of colours in SL format.&lt;br /&gt;
&lt;br /&gt;
Red, Green Blue&lt;br /&gt;
Number may go between 0.1 to 0.9 for each of the three colors&lt;br /&gt;
white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
*Float Alpha*&lt;br /&gt;
This corresponds to the amount of transparency, 1.0 being no transparency, 0.0 is full transparency.&lt;br /&gt;
&lt;br /&gt;
NOTE: One final word on textures. Make sure that when you reference a texture ID key, you keep that texture in your inventory.  If you delete it from inventory, after a while it will be deleted from the asset inventory SL keeps and won’t work anymore.&lt;br /&gt;
&lt;br /&gt;
That’s it for the texture note-card. It’s a little confusing in the beginning, but you will get the hang of it in no time. A demo note-card has been provided for you to use in what ever way you want. Just remember when naming the card, to use the tex_ prefix.&lt;br /&gt;
&lt;br /&gt;
=== Scene Creation ===&lt;br /&gt;
Depending on what you plan on using in your Prototype building, your scene will vary. Some people make their own furniture and other items for their scenes for their own use or for sale. Others use free items they have gathered around SL which have copy/mod permissions to build their scenes. The Prototype is perfect for personal homes, clubs, inns and hotels, skyboxes, anywhere you need to rez furniture. The wonderful thing is that you have multiple scenes stored in the Prototype and can change whenever you want, instead of having to keep dragging things from inventory. Or for those of you who don’t want to use all their prims on a home and 5 rooms, why not have one room with five scenes and a nice shell. There are places to purchase copy/mod pose balls for your scenes too.  &lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
Some tips when building items for your scenes:&lt;br /&gt;
&lt;br /&gt;
* Try to link as many prims together as they will load faster than ten smaller objects located around the box&lt;br /&gt;
* When placing objects keep in mind the location of the door&lt;br /&gt;
* When making an object that is an odd shape such as a torus, you may want to create a flat box prim below it, and link to that; it will save headaches later on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Packaging ===&lt;br /&gt;
When you decide to package the item for sale, make sure that you give copy rights to the next owner or they won’t be able to use it. It is also helpful to give full permissions on the texture. Ensure the name you give the object is user friendly, but also only contains letters, numbers _ or -. Don&#039;t forget to add the address script to each completed package.&lt;br /&gt;
&lt;br /&gt;
If you have any questions, please feel free to contact Revolution Perenti, and do join the .::Prototype::. Group you will receive updates of this manual and the scripts as they come out.  If you have any suggestions for this manual please feel free to let me know.&lt;br /&gt;
&lt;br /&gt;
Happy building!&lt;br /&gt;
&lt;br /&gt;
Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Holodeck Commands Quick Overview: ==&lt;br /&gt;
(.::Prototype 1.63::. should be replaced with what you called your root prim)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Commands Quick Guide&lt;br /&gt;
&lt;br /&gt;
// SCENE SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/1000 .::Prototype 1.63::.,CHANNEL,1001 (replace 1001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/1000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/1000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Prims Remaining on sim;&lt;br /&gt;
/1000 SIM&lt;br /&gt;
Prims Remaining on Parcel&lt;br /&gt;
/1000 PARCEL&lt;br /&gt;
Open or Close door;&lt;br /&gt;
/1000 DOOR&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/1000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/1000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/1000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/1000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/1000 EDIT&lt;br /&gt;
load weather type (this is future update and is reserved until beta testing is complete)&lt;br /&gt;
/1000 COMPATIBILITY Blizzard //replace Blizzard with weather type /snow, rain, blizzard, hail, storm, tornado&lt;br /&gt;
&lt;br /&gt;
// SHELL SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/2000 .::Prototype 1.63::.,CHANNEL,2001 (replace 2001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/2000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/2000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/2000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/2000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/2000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/2000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/2000 EDIT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Support ===&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.ca www.dazzlesoftware.ca] Open Source Section on our forum.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
{{LSLC|Library|Holodeck}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Open_Source_Holodeck&amp;diff=1144165</id>
		<title>Open Source Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Open_Source_Holodeck&amp;diff=1144165"/>
		<updated>2011-05-19T22:39:16Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* Holodeck Commands Quick Overview: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
What is a Holodeck?&lt;br /&gt;
&lt;br /&gt;
A Holodeck stores Second Life scenes and lets you load them from a menu when ever you want. The old scene is cleared and the new one appears. Scenes can include any prim objects including furniture, pose balls and particle generators.&lt;br /&gt;
&lt;br /&gt;
== Creating a Holodeck ==&lt;br /&gt;
&lt;br /&gt;
=== the Shell ===&lt;br /&gt;
&lt;br /&gt;
The Scripts for the holodeck may look complex but once you have done it correctly everything is very simple to use. Building and setup are similar to methods you would normally use within SecondLife.&lt;br /&gt;
&lt;br /&gt;
The best way to start creating a holodeck would be to build a 20x20x10 shell. This will be your rezzing area for the holodeck scenes.&lt;br /&gt;
&lt;br /&gt;
Your shell should look something similar to the picture below.&lt;br /&gt;
&lt;br /&gt;
[[Image:holodeck shell.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== the floor panel ===&lt;br /&gt;
&lt;br /&gt;
Next we create a small floor panel. In the example we use a 0.500x0.500x0.100 cube. Link the floor panel to your holodeck shell. Make sure that the floor panel is the last object you link to the shell as this becomes the root prim. The floor panel &#039;&#039;&#039;MUST&#039;&#039;&#039; be the root prim in order for the holodeck to function properly.&lt;br /&gt;
&lt;br /&gt;
see example below&lt;br /&gt;
&lt;br /&gt;
[[Image:floor panel.jpg]]&lt;br /&gt;
&lt;br /&gt;
The Scripts&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Holodeck Core.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// User Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//How long to listen for a menu response before shutting down the listener&lt;br /&gt;
float fListenTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//How often (in seconds) to check for change in position when moving&lt;br /&gt;
float fMovingRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
//How long to sit still before exiting active mode&lt;br /&gt;
float fStoppedTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//Minimum amount of time (in seconds) between movement updates&lt;br /&gt;
float fShoutRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
// label script name used for debug and PrototypeSay();&lt;br /&gt;
string label = &amp;quot;internal label&amp;quot;;&lt;br /&gt;
// Channel used by Prototype&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer MENU_CHANNEL;&lt;br /&gt;
integer MENU_HANDLE;&lt;br /&gt;
string PROTOTYPE_CREATOR;&lt;br /&gt;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
integer PROTOTYPE_RESET = -68195;&lt;br /&gt;
integer SHOW_MENU = -68194;&lt;br /&gt;
// Channel used by Prototype to talk to label scripts&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
// Feature Manager&lt;br /&gt;
integer PROTOTYPE_TEXTURE = TRUE;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Security Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
integer PROTOTYPE_ALLOW_IM = FALSE;&lt;br /&gt;
string  PROTOTYPE_EMAIL = &amp;quot;phoenixcms@hotmail.co.uk&amp;quot;;&lt;br /&gt;
string  PROTOTYPE_OWNER;&lt;br /&gt;
vector  Where;&lt;br /&gt;
string  Name;&lt;br /&gt;
string  SLURL;&lt;br /&gt;
integer X;&lt;br /&gt;
integer Y;&lt;br /&gt;
integer Z;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Menu System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Compatibility System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list objectSettings = [];&lt;br /&gt;
integer stride = 3;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
string COMPATIBILITY_NOTECARD = &amp;quot;compatibility&amp;quot;; //[objectname];&amp;lt;position&amp;gt;;&amp;lt;rotation&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DO NOT EDIT BELOW THIS LINE.... NO.. NOT EVEN THEN&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer PrototypeBaseMoving;&lt;br /&gt;
vector PrototypeLastPosition;&lt;br /&gt;
rotation PrototypeLastRotation;&lt;br /&gt;
integer iListenTimeout = 0;&lt;br /&gt;
&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//To avoid flooding the sim with a high rate of movements&lt;br /&gt;
//(and the resulting mass updates it will bring), we used&lt;br /&gt;
// a short throttle to limit ourselves&lt;br /&gt;
prototype_moved()&lt;br /&gt;
{&lt;br /&gt;
    llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ llGetPos(), llGetRot() ], &amp;quot;|&amp;quot;));&lt;br /&gt;
    llResetTime(); //Reset our throttle&lt;br /&gt;
    PrototypeLastPosition = llGetPos();&lt;br /&gt;
    PrototypeLastRotation = llGetRot();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    iListenTimeout = llGetUnixTime() + llFloor(fListenTime);&lt;br /&gt;
    MENU_CHANNEL = llFloor(llFrand(-99999.0 - -100));&lt;br /&gt;
    MENU_HANDLE = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;www.sl-prototype.com: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
    llSetTimerEvent(fShoutRate);&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;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER || CHANGED_INVENTORY)&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry () &lt;br /&gt;
    {&lt;br /&gt;
        // Lets open our listen channel&lt;br /&gt;
        key_listen = llListen(PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;LISTEN ON CHANNEL &amp;quot; +(string)PROTOTYPE_CHANNEL);&lt;br /&gt;
        // Compatibility System Notecard&lt;br /&gt;
        llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        //Record our position&lt;br /&gt;
        PrototypeLastPosition = llGetPos();&lt;br /&gt;
        PrototypeLastRotation = llGetRot();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    dataserver(key queryId, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            objectSettings += llParseString2List(data, [&amp;quot;;&amp;quot;], []);&lt;br /&gt;
            iLine++;&lt;br /&gt;
            llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Done Reading Compatibility Notecard &amp;quot; + COMPATIBILITY_NOTECARD);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number==SHOW_MENU) {&lt;br /&gt;
            MENU1 = [];&lt;br /&gt;
            MENU2 = [];&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
                MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            Dialog(id, MENU1);&lt;br /&gt;
        }&lt;br /&gt;
        if (number==PROTOTYPE_RESET) {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Forgetting positions...&amp;quot;);&lt;br /&gt;
            llPrototypeSay(&amp;quot;RESET&amp;quot;);&lt;br /&gt;
        }&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;
        list compatibility = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        PROTOTYPE_CREATOR = llGetCreator();&lt;br /&gt;
        //&lt;br /&gt;
        if ( command == llToLower(&amp;quot;CHANNEL&amp;quot;) || command == llToUpper(&amp;quot;CHANNEL&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)PROTOTYPE_CHANNEL );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;MESSAGE&amp;quot;) || command == llToUpper(&amp;quot;MESSAGE&amp;quot;))  &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_MESSAGE = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;PROTOTYPE MESSAGE set to &amp;quot; + (string)PROTOTYPE_MESSAGE );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // OPEN / CLOSE DOOR    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;DOOR&amp;quot;) || message == llToUpper(&amp;quot;DOOR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, PROTOTYPE_DOOR, &amp;quot;&amp;quot;,NULL_KEY );&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Setting Door Permissions...&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        // SET COMPATIBILITY&lt;br /&gt;
        if (llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;)&lt;br /&gt;
            || llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            string object = llList2String(compatibility, 1);&lt;br /&gt;
            integer indexInSettings = llListFindList(objectSettings, [object]);&lt;br /&gt;
            if(indexInSettings &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                vector pos = (vector)llList2String(objectSettings, indexInSettings + 1);&lt;br /&gt;
                rotation rot = (rotation)llList2String(objectSettings, indexInSettings + 2);&lt;br /&gt;
                llRezAtRoot(object, pos + llGetPos(), ZERO_VECTOR, rot, 0);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // LOAD MENU SYSTEM    &lt;br /&gt;
        if (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                //Loop through backwards (safety precaution in case of inventory change)&lt;br /&gt;
                if (DEBUG) llDebugSay(&amp;quot;Loading build pieces please wait...&amp;quot;);&lt;br /&gt;
                llRezAtRoot(message, llGetPos() + &amp;lt;0.00, 0.00, 0.30&amp;gt;, ZERO_VECTOR,&lt;br /&gt;
                    llGetRot(), PROTOTYPE_CHANNEL);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // REPOSTION SCENE    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;POSITION&amp;quot;) || message == llToUpper(&amp;quot;POSITION&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Positioning&amp;quot;);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // CLEAR SCENE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;CLEAR&amp;quot;) || message == llToUpper(&amp;quot;CLEAR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;CLEAN&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if( message == llToLower(&amp;quot;HOLODECKDIE&amp;quot;) || message == llToUpper(&amp;quot;HOLODECKDIE&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            if(PROTOTYPE_CREATOR) llDie();&lt;br /&gt;
        }&lt;br /&gt;
        // DISABLE PHANTOM AS WE ARE NOW DONE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;NOPHANTOM&amp;quot;) || message == llToUpper(&amp;quot;NOPHANTOM&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;PHANTOM&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Disabled Phantom&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    moving_start() //StartPrototype&lt;br /&gt;
    {&lt;br /&gt;
        if( !PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            PrototypeBaseMoving = TRUE;&lt;br /&gt;
            llSetTimerEvent(0.0); //Resets the timer if already running&lt;br /&gt;
            llSetTimerEvent(fMovingRate);&lt;br /&gt;
            prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer() &lt;br /&gt;
    {&lt;br /&gt;
        //Were we moving?&lt;br /&gt;
        if( PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            //Did we change position/rotation?&lt;br /&gt;
            if( (llGetRot() != PrototypeLastRotation) || (llGetPos() != PrototypeLastPosition) )&lt;br /&gt;
            {&lt;br /&gt;
                if( llGetTime() &amp;gt; fShoutRate ) {&lt;br /&gt;
                    prototype_moved();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
        // Have we been sitting long enough to consider ourselves stopped?&lt;br /&gt;
            if( llGetTime() &amp;gt; fStoppedTime )&lt;br /&gt;
            PrototypeBaseMoving = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Open listener?&lt;br /&gt;
        if( iListenTimeout != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            //Past our close timeout?&lt;br /&gt;
            if( iListenTimeout &amp;lt;= llGetUnixTime() )&lt;br /&gt;
            {&lt;br /&gt;
                iListenTimeout = 0;&lt;br /&gt;
                llListenRemove(MENU_HANDLE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Stop the timer?&lt;br /&gt;
        if( (iListenTimeout == 0) &amp;amp;&amp;amp; ( !PrototypeBaseMoving ) )&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Stopping Timer&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    } // END TIMER FUNCTION&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        PROTOTYPE_OWNER = llGetOwner();&lt;br /&gt;
        //Name = llGetRegionName();&lt;br /&gt;
        Name = llDumpList2String(llParseString2List(llGetRegionName(),[&amp;quot; &amp;quot;],[]),&amp;quot;_&amp;quot;);&lt;br /&gt;
        Where = llGetPos();&lt;br /&gt;
&lt;br /&gt;
        X = (integer)Where.x;&lt;br /&gt;
        Y = (integer)Where.y;&lt;br /&gt;
        Z = (integer)Where.z;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // I don&#039;t replace any spaces in Name with %20 and so forth.&lt;br /&gt;
&lt;br /&gt;
        SLURL = &amp;quot;http://slurl.com/secondlife/&amp;quot;&lt;br /&gt;
            + Name + &amp;quot;/&amp;quot; + (string)X + &amp;quot;/&amp;quot; + (string)Y + &amp;quot;/&amp;quot; + (string)Z + &amp;quot;/?title=&amp;quot; + Name;&lt;br /&gt;
&lt;br /&gt;
        llEmail(PROTOTYPE_EMAIL, llKey2Name(PROTOTYPE_OWNER),&lt;br /&gt;
            SLURL + &amp;quot;\nRegistered user =&amp;quot; + llKey2Name(PROTOTYPE_OWNER)&lt;br /&gt;
                  + &amp;quot;Registered user key =&amp;quot; + PROTOTYPE_OWNER);&lt;br /&gt;
        if (PROTOTYPE_ALLOW_IM) {&lt;br /&gt;
            llInstantMessage(llGetCreator(), SLURL);&lt;br /&gt;
        }&lt;br /&gt;
        // Reset ourselves&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Texture Engine.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
string TEXTURE_NOTECARD;&lt;br /&gt;
string prefix = &amp;quot;tex_&amp;quot;;&lt;br /&gt;
key TextureQuery;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
integer DEBUG = FALSE; // debug channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
default {&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        TEXTURE_NOTECARD = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + TEXTURE_NOTECARD);&lt;br /&gt;
        TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        list texture = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            TEXTURE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)TEXTURE_CHANNEL);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(llList2String(texture, 0) == &amp;quot;image&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            iLine = 0;&lt;br /&gt;
            TEXTURE_NOTECARD = llList2String(texture, 1);&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////        &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == TextureQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data != EOF &amp;amp;&amp;amp; prefix == &amp;quot;tex_&amp;quot;) {    &lt;br /&gt;
            &lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);&lt;br /&gt;
                llMessageLinked(LINK_SET,0,data,NULL_KEY);&lt;br /&gt;
&lt;br /&gt;
                // increment line count                 &lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                ++iLine;&lt;br /&gt;
                TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Done reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Notecards&lt;br /&gt;
&lt;br /&gt;
*Clear* Notecard for default Clear Scene &lt;br /&gt;
(note the first line of texture notecards is object name so make sure you name all floor panels, roof and walls with unique name and edit the notecard as required add each object line to a new line as required.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
Object_Name#2f78ee38-9aca-f8d1-5306-458beab181f9#&amp;lt;3.0,1.0,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
compatibility notecard leave this blank at current its planned as future feature to allow weather inside the holodeck and was the old rez system from early beta but we left it here to be reused later on.&lt;br /&gt;
&lt;br /&gt;
=== Scripts for the Shell Prims ===&lt;br /&gt;
&lt;br /&gt;
Walls, Floor,Roof texture,particles,sound &amp;amp; locate system&lt;br /&gt;
needs to be added to every object you wish to texture each object needs a unique name too for better control of textures&lt;br /&gt;
System.lsl (updated to 2.0.2)&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Skidz Partz - Open Source Holodeck Version (2.0.1)&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// Debug&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
&lt;br /&gt;
// Sound System&lt;br /&gt;
list SOUND_VALUES;&lt;br /&gt;
integer SOUND_TYPE;&lt;br /&gt;
string SOUND_UUID;&lt;br /&gt;
float SOUND_VOLUME;&lt;br /&gt;
// Texture System&lt;br /&gt;
list TEXTURE_VALUES;&lt;br /&gt;
string HOLODECK_OBJECTNAME;&lt;br /&gt;
string TEXTURE_UID;&lt;br /&gt;
vector TEXTURE_REPEATS;&lt;br /&gt;
vector TEXTURE_OFFSETS;&lt;br /&gt;
float TEXTURE_ROTATE;&lt;br /&gt;
vector TEXTURE_COLOR;&lt;br /&gt;
float TEXTURE_ALPHA;&lt;br /&gt;
&lt;br /&gt;
// Lighting System&lt;br /&gt;
list LIGHT_VALUES;&lt;br /&gt;
integer  LIGHT_STATUS;&lt;br /&gt;
// Color of the light (RGB - each value between 0.0 and 1.0)&lt;br /&gt;
vector LIGHT_COLOR;&lt;br /&gt;
// Intensity of the light (values from 0.0 .. 1.0)&lt;br /&gt;
float  LIGHT_LEVEL;&lt;br /&gt;
// Radius of light cone&lt;br /&gt;
float  LIGHT_DISTANCE;&lt;br /&gt;
// Fall off (distance/intensity decrease) values from 0.0 ..1.0&lt;br /&gt;
float  LIGHT_FALLOFF;&lt;br /&gt;
&lt;br /&gt;
// Particle System&lt;br /&gt;
integer PARTICLE_FLAGS;&lt;br /&gt;
//&lt;br /&gt;
list PARTICLE_VALUES;&lt;br /&gt;
key PARTICLE_SRC_TARGET_KEY = &amp;quot;&amp;quot;;&lt;br /&gt;
string PARTICLE_SRC_TEXTURE = &amp;quot;&amp;quot;;&lt;br /&gt;
float PARTICLE_SRC_MAX_AGE;&lt;br /&gt;
float PARTICLE_PART_MAX_AGE;&lt;br /&gt;
float PARTICLE_BURST_RATE;&lt;br /&gt;
integer PARTICLE_BURST_PART_COUNT;&lt;br /&gt;
float PARTICLE_BURST_RADIUS;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MAX;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MIN;&lt;br /&gt;
float PARTICLE_START_ALPHA;&lt;br /&gt;
float PARTICLE_END_ALPHA;&lt;br /&gt;
float PARTICLE_INNERANGLE;&lt;br /&gt;
float PARTICLE_OUTERANGLE;&lt;br /&gt;
vector PARTICLE_START_COLOR;&lt;br /&gt;
vector PARTICLE_END_COLOR;&lt;br /&gt;
vector PARTICLE_START_SCALE;&lt;br /&gt;
vector PARTICLE_END_SCALE;&lt;br /&gt;
vector PARTICLE_ACCEL;&lt;br /&gt;
vector PARTICLE_OMEGA;&lt;br /&gt;
integer PARTICLE_SRC_PATTERN;&lt;br /&gt;
// Link Messages Channels&lt;br /&gt;
integer RESET_SCRIPTS = 0x2F34B;&lt;br /&gt;
integer HOLODECK_LIGHT            = 0x2F34C;&lt;br /&gt;
integer HOLODECK_TEXTURE            = 0x2F34D;&lt;br /&gt;
integer LOCATE_LIGHT = 0x2F34E;&lt;br /&gt;
integer LOCATE_TEXTURE = 0x2F34F;&lt;br /&gt;
integer HOLODECK_PARTICLE = 0x2F350;&lt;br /&gt;
integer HOLODECK_SOUND = 0x2F351;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector eul = &amp;lt;0.00, 0.00, 0.00&amp;gt;;&lt;br /&gt;
        eul *= DEG_TO_RAD;&lt;br /&gt;
        rotation quat = llEuler2Rot( eul );&lt;br /&gt;
        llSetRot( quat );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sent,integer num,string message,key id)&lt;br /&gt;
    {&lt;br /&gt;
    if (num == RESET_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
        llOwnerSay(&amp;quot;Resetting Holodeck Defaults&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_SOUND)&lt;br /&gt;
    {&lt;br /&gt;
        SOUND_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(SOUND_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            SOUND_TYPE = (integer)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_UUID = (string)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_VOLUME = (float)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            &lt;br /&gt;
            // Sound Change&lt;br /&gt;
            if(SOUND_TYPE == 1) &lt;br /&gt;
            { &lt;br /&gt;
               llPlaySound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 2) &lt;br /&gt;
            { &lt;br /&gt;
               llLoopSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 3) &lt;br /&gt;
            { &lt;br /&gt;
               llTriggerSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
                                                            &lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_TEXTURE)&lt;br /&gt;
    {&lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            &lt;br /&gt;
            //list conversions&lt;br /&gt;
            string LOCATE_TEXTURE_UID = llGetTexture(0);&lt;br /&gt;
            vector LOCATE_TEXTURE_REPEATS = llList2Vector(llGetPrimitiveParams([PRIM_TEXTURE,0]),1);&lt;br /&gt;
            vector LOCATE_TEXTURE_OFFSETS = llGetTextureOffset(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ROTATE = llGetTextureRot(0) * DEG_TO_RAD;&lt;br /&gt;
            vector LOCATE_TEXTURE_COLOR = llGetColor(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ALPHA = llGetAlpha(0);&lt;br /&gt;
                        &lt;br /&gt;
             llSay(0, (string)HOLODECK_GETOBJECTNAME+(string)&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_UID+                          // name&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_REPEATS+                      // repeats&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_OFFSETS+                      // offsets&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ROTATE+                       // rotation&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_COLOR+                      // color&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ALPHA);                     // alpha     &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_LIGHT)&lt;br /&gt;
    {          &lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            list LOCATE_PRIM_POINT_LIGHT =  llGetPrimitiveParams([PRIM_POINT_LIGHT]);&lt;br /&gt;
            list LOCATE_STATUS = ([&amp;quot;FALSE&amp;quot;,&amp;quot;TRUE&amp;quot;]);&lt;br /&gt;
            vector LIGHT_COLOR; &lt;br /&gt;
    &lt;br /&gt;
     // output the notecard to chat&lt;br /&gt;
     llSay(0, &amp;quot;locating Lighting Values for &amp;quot; + (string)HOLODECK_GETOBJECTNAME);&lt;br /&gt;
     llSleep(3);&lt;br /&gt;
     llSay(0, (string)HOLODECK_GETOBJECTNAME +                                                // Object Name&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2String(LOCATE_STATUS ,llList2Integer(LOCATE_PRIM_POINT_LIGHT,0)) + // Light Status&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2Vector(LOCATE_PRIM_POINT_LIGHT,1) +                                // Color&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,2) +                                  // Level&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,3) +                                  // Distance&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,4));                                  // falloff&lt;br /&gt;
     LOCATE_PRIM_POINT_LIGHT = [];   &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_LIGHT)&lt;br /&gt;
    {&lt;br /&gt;
        LIGHT_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            LIGHT_STATUS = (integer)llList2String(LIGHT_VALUES,1);&lt;br /&gt;
            LIGHT_COLOR = (vector)llList2String(LIGHT_VALUES,2);&lt;br /&gt;
            LIGHT_LEVEL = (float)llList2String(LIGHT_VALUES,3);&lt;br /&gt;
            LIGHT_DISTANCE = (float)llList2String(LIGHT_VALUES,4);&lt;br /&gt;
            LIGHT_FALLOFF = (float)llList2String(LIGHT_VALUES,5);&lt;br /&gt;
&lt;br /&gt;
            // Lighting Change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_POINT_LIGHT,&lt;br /&gt;
                LIGHT_STATUS, LIGHT_COLOR, LIGHT_LEVEL, LIGHT_DISTANCE, LIGHT_FALLOFF]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
    else if (num == HOLODECK_TEXTURE)&lt;br /&gt;
    {    &lt;br /&gt;
        TEXTURE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            TEXTURE_UID = llList2String(TEXTURE_VALUES,1);&lt;br /&gt;
            TEXTURE_REPEATS = (vector)llList2String(TEXTURE_VALUES,2);&lt;br /&gt;
            TEXTURE_OFFSETS = (vector)llList2String(TEXTURE_VALUES,3);&lt;br /&gt;
            TEXTURE_ROTATE = ((float)llList2String(TEXTURE_VALUES,4)) * DEG_TO_RAD;&lt;br /&gt;
            TEXTURE_COLOR = (vector)llList2String(TEXTURE_VALUES,5);&lt;br /&gt;
            TEXTURE_ALPHA = (float)llList2String(TEXTURE_VALUES,6);&lt;br /&gt;
            &lt;br /&gt;
            //texture change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_TEXTURE,0,TEXTURE_UID,TEXTURE_REPEATS,TEXTURE_OFFSETS,TEXTURE_ROTATE]);&lt;br /&gt;
            llSetPrimitiveParams([PRIM_COLOR,0,TEXTURE_COLOR,TEXTURE_ALPHA]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else if (num == HOLODECK_PARTICLE)&lt;br /&gt;
    {&lt;br /&gt;
        PARTICLE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(PARTICLE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            PARTICLE_PART_MAX_AGE = (float)llList2String(PARTICLE_VALUES,1);&lt;br /&gt;
            PARTICLE_FLAGS = (integer)llList2String(PARTICLE_VALUES,2);&lt;br /&gt;
            PARTICLE_START_COLOR = (vector)llList2String(PARTICLE_VALUES,3);&lt;br /&gt;
            PARTICLE_END_COLOR = (vector)llList2String(PARTICLE_VALUES,4);&lt;br /&gt;
            PARTICLE_START_SCALE = (vector)llList2String(PARTICLE_VALUES,5);&lt;br /&gt;
            PARTICLE_END_SCALE = (vector)llList2String(PARTICLE_VALUES,6);&lt;br /&gt;
            PARTICLE_SRC_PATTERN = (integer)llList2String(PARTICLE_VALUES,7);&lt;br /&gt;
            PARTICLE_BURST_RATE = (float)llList2String(PARTICLE_VALUES,8);&lt;br /&gt;
            PARTICLE_ACCEL = (vector)llList2String(PARTICLE_VALUES,9);&lt;br /&gt;
            PARTICLE_BURST_PART_COUNT = (integer)llList2String(PARTICLE_VALUES,10);&lt;br /&gt;
            PARTICLE_BURST_RADIUS = (float)llList2String(PARTICLE_VALUES,11);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MIN = (float)llList2String(PARTICLE_VALUES,12);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MAX = (float)llList2String(PARTICLE_VALUES,13);&lt;br /&gt;
            PARTICLE_INNERANGLE = (float)llList2String(PARTICLE_VALUES,14);&lt;br /&gt;
            PARTICLE_OUTERANGLE = (float)llList2String(PARTICLE_VALUES,15);&lt;br /&gt;
            PARTICLE_OMEGA = (vector)llList2String(PARTICLE_VALUES,16);&lt;br /&gt;
            PARTICLE_SRC_MAX_AGE = (float)llList2String(PARTICLE_VALUES,17);&lt;br /&gt;
            PARTICLE_START_ALPHA = (float)llList2String(PARTICLE_VALUES,18);&lt;br /&gt;
            PARTICLE_END_ALPHA = (float)llList2String(PARTICLE_VALUES,19);&lt;br /&gt;
            PARTICLE_SRC_TEXTURE = (string)llList2String(PARTICLE_VALUES,20);&lt;br /&gt;
            llSleep(1.5);&lt;br /&gt;
            // Particle Change&lt;br /&gt;
            llParticleSystem([  &lt;br /&gt;
                        PSYS_PART_MAX_AGE, PARTICLE_PART_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_FLAGS, PARTICLE_FLAGS,&lt;br /&gt;
                        PSYS_PART_START_COLOR, PARTICLE_START_COLOR,&lt;br /&gt;
                        PSYS_PART_END_COLOR, PARTICLE_END_COLOR,&lt;br /&gt;
                        PSYS_PART_START_SCALE, PARTICLE_START_SCALE,&lt;br /&gt;
                        PSYS_PART_END_SCALE, PARTICLE_END_SCALE,&lt;br /&gt;
                        PSYS_SRC_PATTERN, PARTICLE_SRC_PATTERN,&lt;br /&gt;
                        PSYS_SRC_BURST_RATE,PARTICLE_BURST_RATE,&lt;br /&gt;
                        PSYS_SRC_ACCEL,PARTICLE_ACCEL,&lt;br /&gt;
                        PSYS_SRC_BURST_PART_COUNT,PARTICLE_BURST_PART_COUNT,&lt;br /&gt;
                        PSYS_SRC_BURST_RADIUS,PARTICLE_BURST_RADIUS,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MIN,PARTICLE_BURST_SPEED_MIN,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MAX,PARTICLE_BURST_SPEED_MAX,&lt;br /&gt;
                        PSYS_SRC_ANGLE_BEGIN,PARTICLE_INNERANGLE,&lt;br /&gt;
                        PSYS_SRC_ANGLE_END,PARTICLE_OUTERANGLE,&lt;br /&gt;
                        PSYS_SRC_OMEGA,PARTICLE_OMEGA,&lt;br /&gt;
                        PSYS_SRC_MAX_AGE,PARTICLE_SRC_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_START_ALPHA,PARTICLE_START_ALPHA,&lt;br /&gt;
                        PSYS_PART_END_ALPHA,PARTICLE_END_ALPHA,&lt;br /&gt;
                        PSYS_SRC_TEXTURE, PARTICLE_SRC_TEXTURE,&lt;br /&gt;
                        PSYS_SRC_TARGET_KEY,PARTICLE_SRC_TARGET_KEY &lt;br /&gt;
                            ]);                         &lt;br /&gt;
        }            &lt;br /&gt;
    }&lt;br /&gt;
    if (DEBUG) llOwnerSay(&amp;quot;This Script Name &amp;quot; + (string)llGetScriptName()&lt;br /&gt;
        + &amp;quot;In Object Name &amp;quot; + (string)llGetObjectName()&lt;br /&gt;
        + &amp;quot;used &amp;quot; + (string)((16384 - llGetFreeMemory())/1024) + &amp;quot; kBytes&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Door ===&lt;br /&gt;
&lt;br /&gt;
Door Script to be places in one of the prims where you would like a door, this does a hollow effect to give the impression of the door and is controlled with link messages.&lt;br /&gt;
&lt;br /&gt;
Door System.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message( integer sender, integer msg, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == PROTOTYPE_DOOR) {&lt;br /&gt;
            list open = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
            string open2 = llList2String(open, 3);&lt;br /&gt;
            if (llGetSubString(open2,0,2) != &amp;quot;0.0&amp;quot;)&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE,&lt;br /&gt;
                    PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.0,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
            else&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE,&lt;br /&gt;
                    PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.95,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Control Pannel ===&lt;br /&gt;
&lt;br /&gt;
next we create a 0.500x0.500x0.100 box this is used for control panel&lt;br /&gt;
now link this to your holodeck shell linking the shell last becuase we want to keep the root prim intact i normally put this just to the side of the door but you can put this anywhere you like.&lt;br /&gt;
&lt;br /&gt;
Next right click select edit link parts and select the switch now we add the menu functions scripts.&lt;br /&gt;
&lt;br /&gt;
Menu System.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list csv_commands;&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
integer SCENEMENU = -68194;&lt;br /&gt;
key agent;&lt;br /&gt;
key objectowner;&lt;br /&gt;
integer group;&lt;br /&gt;
// Set to TRUE to allow group members to use the dialog menu&lt;br /&gt;
// Set to FALSE to disallow group members from using the dialog menu&lt;br /&gt;
integer ingroup = 0;&lt;br /&gt;
integer DEBUG = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay(&amp;quot;Current chanel: &amp;quot;+(string)P_channel);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(command == llToLower(&amp;quot;PERMS&amp;quot;) || message == llToUpper(&amp;quot;PERMS&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            ingroup = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;ingroup set to &amp;quot; + (string)ingroup);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    } // end listen();&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   &lt;br /&gt;
        group = llDetectedGroup(0); // Is the Agent in the objowners group?&lt;br /&gt;
        agent = llDetectedKey(0); // Agent&#039;s key&lt;br /&gt;
        objectowner = llGetOwner(); // objowners key&lt;br /&gt;
        // is the Agent = the owner OR is the agent in the owners group&lt;br /&gt;
        if ( (objectowner == agent) || ( group &amp;amp;&amp;amp; ingroup )  )  {&lt;br /&gt;
            llMessageLinked(LINK_SET,SCENEMENU,&amp;quot;&amp;quot;,agent);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup Scene Clear&lt;br /&gt;
&lt;br /&gt;
next create a box and label this box *Clear*&lt;br /&gt;
and add the following script this will clear the scenes when you switch.&lt;br /&gt;
&lt;br /&gt;
Clear Label Script.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
float gap = 15.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(0, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now take this box to your Inventry.&lt;br /&gt;
&lt;br /&gt;
now create another box Called *Create* give this box full permissions and take into your inventry&lt;br /&gt;
now right click on your holodeck-&amp;gt;content and drag the *Clear* &amp;amp; *Create* boxes into the root prim.&lt;br /&gt;
wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
internal label script.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Configurable Settings&lt;br /&gt;
float fTimerInterval = 0.25; //Time in seconds between movement &#039;ticks&#039;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192; //Channel used by Base Prim to talk to Component Prims;&lt;br /&gt;
// This must match in both scripts&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Runtime Variables (Dont need to change below here unless making a derivative)&lt;br /&gt;
vector SceneOffset;&lt;br /&gt;
rotation SceneRotation;&lt;br /&gt;
integer SceneMove;&lt;br /&gt;
vector SceneDestPosition;&lt;br /&gt;
rotation SceneDestRotation;&lt;br /&gt;
integer SceneSaved = FALSE;&lt;br /&gt;
integer PROTOTYPE_VERSION = TRUE; // TRUE = Production, FALSE = Basic / NOMOD, NOCOPY NO TRANS Demo Box&lt;br /&gt;
integer PROTOTYPE_MESSAGE = TRUE;&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string first_word(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the first word in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the whole string.&lt;br /&gt;
    if(Token == &amp;quot;&amp;quot;) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, 0, pos - 1);&lt;br /&gt;
    else&lt;br /&gt;
        return In_String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string other_words(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
    //This routine searches for the other-than-first words in a string,&lt;br /&gt;
    // and returns it. If no word boundary found, returns&lt;br /&gt;
    // the an empty string.&lt;br /&gt;
    if( Token == &amp;quot;&amp;quot; ) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, pos + 1, llStringLength(In_String));&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
prototype_move()&lt;br /&gt;
{&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    vector SceneLastPosition = ZERO_VECTOR;&lt;br /&gt;
    while( (i &amp;lt; 5) &amp;amp;&amp;amp; (llGetPos() != SceneDestPosition) )&lt;br /&gt;
    {&lt;br /&gt;
        list lParams = [];&lt;br /&gt;
&lt;br /&gt;
        //If we&#039;re not there....&lt;br /&gt;
        if( llGetPos() != SceneDestPosition )&lt;br /&gt;
        {&lt;br /&gt;
            //We may be stuck on the ground...&lt;br /&gt;
            //Did we move at all compared to last loop?&lt;br /&gt;
            if( llGetPos() == SceneLastPosition )&lt;br /&gt;
            {&lt;br /&gt;
                //Yep, stuck...move straight up 10m (attempt to dislodge)&lt;br /&gt;
                lParams = [ PRIM_POSITION, llGetPos() + &amp;lt;0, 0, 10.0&amp;gt; ];&lt;br /&gt;
                //llSetPos(llGetPos() + &amp;lt;0, 0, 10.0&amp;gt;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //Record our spot for &#039;stuck&#039; detection&lt;br /&gt;
                SceneLastPosition = llGetPos();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //Try to move to destination&lt;br /&gt;
        integer iHops = llAbs(llCeil(llVecDist(llGetPos(), SceneDestPosition) / 10.0));&lt;br /&gt;
        integer x;&lt;br /&gt;
        for( x = 0; x &amp;lt; iHops; x++ ) {&lt;br /&gt;
            lParams += [ PRIM_POSITION, SceneDestPosition ];&lt;br /&gt;
        }&lt;br /&gt;
        llSetPrimitiveParams(lParams);&lt;br /&gt;
        //llSleep(0.1);&lt;br /&gt;
        ++i; // changed i++ too ++i credit goes to Simon Sugita for Speed Tweak :)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Set rotation&lt;br /&gt;
    llSetRot(SceneDestRotation);&lt;br /&gt;
}&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;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Open up the listener&lt;br /&gt;
        llListen(PROTOTYPE_SCRIPTS, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        //Set the channel to what&#039;s specified&lt;br /&gt;
        if( start_param != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_SCRIPTS = start_param;&lt;br /&gt;
            state reset_listeners;&lt;br /&gt;
        }&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;
        string command = llToUpper(first_word(message, &amp;quot; &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        if( command == &amp;quot;RECORD&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            SceneOffset = (llGetPos() - SceneVectorBase) / SceneRotationBase;&lt;br /&gt;
            SceneRotation = llGetRot() / SceneRotationBase;&lt;br /&gt;
            SceneSaved = TRUE;&lt;br /&gt;
            llOwnerSay(&amp;quot;Recorded position.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;MOVE&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
    &lt;br /&gt;
            //Don&#039;t move if we&#039;ve not yet recorded a position&lt;br /&gt;
            if( !SceneSaved ) return;&lt;br /&gt;
&lt;br /&gt;
            //Also ignore commands from bases with a different owner than us&lt;br /&gt;
            //(Anti-hacking measure)&lt;br /&gt;
            if( llGetOwner() != llGetOwnerKey(id) ) return;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            SceneDestPosition = (SceneOffset * SceneRotationBase) + SceneVectorBase;&lt;br /&gt;
            SceneDestRotation = SceneRotation * SceneRotationBase;&lt;br /&gt;
&lt;br /&gt;
            //Turn on our timer to perform the move?&lt;br /&gt;
            if( !SceneMove )&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(fTimerInterval);&lt;br /&gt;
                SceneMove = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;PHANTOM&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, turn phantom off&lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;DONE&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, remove script&lt;br /&gt;
            llRemoveInventory(llGetScriptName());&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;CLEAN&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            //Clean up&lt;br /&gt;
            llDie();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;FLUSH&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        //Turn ourselves off&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
&lt;br /&gt;
        //Do we need to move?&lt;br /&gt;
        if( SceneMove )&lt;br /&gt;
        {&lt;br /&gt;
            //Perform the move and clean up&lt;br /&gt;
            prototype_move();&lt;br /&gt;
            SceneMove = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state reset_listeners&lt;br /&gt;
{&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Package Scripts)&lt;br /&gt;
address script.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
float gap = 10.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
integer i;&lt;br /&gt;
integer iLine;&lt;br /&gt;
string item;&lt;br /&gt;
vector vThisPos;&lt;br /&gt;
rotation rThisRot;&lt;br /&gt;
&lt;br /&gt;
scene_entry()&lt;br /&gt;
{&lt;br /&gt;
    llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
    object = llGetObjectName();&lt;br /&gt;
    llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
    llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
       &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        scene_entry();&lt;br /&gt;
        vThisPos = llGetPos();&lt;br /&gt;
        rThisRot = llGetRot();&lt;br /&gt;
        iLine = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        for(i=0; i &amp;lt; iLine; i++)&lt;br /&gt;
        {&lt;br /&gt;
            item = llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            llSleep (1.00);&lt;br /&gt;
            llRezObject(item, vThisPos + &amp;lt;0.00, 0.00, 1.00&amp;gt;, ZERO_VECTOR, rThisRot, 0);&lt;br /&gt;
            llShout(PROTOTYPE_SCRIPTS, &amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            if (DEBUG) llShout (DEBUG_CHANNEL, &amp;quot;Rezzing &amp;quot; + item);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(DEBUG_CHANNEL, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;POSITION&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Builders Docs ==&lt;br /&gt;
&lt;br /&gt;
.::Prototype::. - Builders Manual&lt;br /&gt;
By Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
Welcome to the world of building with your Prototype System. Anyone wishing to build scenes for the Prototype needs to have a good understanding of building and texturing to succeed. Please read this manual through once fully and then as needed when you start building. This manual is divided into several sections:&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
Building scenes&lt;br /&gt;
Building Shells&lt;br /&gt;
Texture Card&lt;br /&gt;
Scene Creation&lt;br /&gt;
Tips&lt;br /&gt;
Packaging&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
The main thing to remember is any object you want to put in the Prototype scene/shell must be copy/mod at a minimum. The way the Prototype system works is by rezzing copies of an item from its inventory. These objects must be modified, adding a special script to make them work with the system scripts.&lt;br /&gt;
&lt;br /&gt;
There are two ways to build with the Prototype:&lt;br /&gt;
&lt;br /&gt;
# The linked scene&lt;br /&gt;
# The multi-item scene&lt;br /&gt;
&lt;br /&gt;
The linked scene is made from multiple objects and linked; the unlinked scene consists of a number or unlinked objects around the unit.&lt;br /&gt;
&lt;br /&gt;
A scene set will consist of the objects you create and a texture card. These will be explained in greater detail as we move along. The texture card must begin with tex_ or the system will not read them. Feel free to give your scenes a user friendly name, but only with letters, numbers, _ or – in the same name as the current scene we are building for.&lt;br /&gt;
&lt;br /&gt;
=== Building Scenes ===&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
# Create the objects you want in your scene and arrange them as you like&lt;br /&gt;
# Place a label script into each linked object or individual object you have set out in your scene &lt;br /&gt;
# Use /1000 SAVE to save the position and rotation of the current scene&lt;br /&gt;
# If you wish to modify the scene before repacking or move things around more, enter /1000 RESET and then follow step 3 again&lt;br /&gt;
# Next texture the walls, floor, and ceiling; set the repeats, etc. the way you want them&lt;br /&gt;
# Open the example tex_*Clear*, and go from prim to prim, and copy the info from the texture window to the notecard as explained above&lt;br /&gt;
# Name the suffix of the notecards something user friendly&lt;br /&gt;
# Right click on all the objects while holding the Ctrl key and choose edit; then take all the objects into your inventory&lt;br /&gt;
# Next, click on your control panel on the wall and press the *Create* button; this will prepare a package for your scene&lt;br /&gt;
# Now we will want to name the scene: right click this box, click edit, and fill in something friendly for your scene name and description&lt;br /&gt;
# Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts &lt;br /&gt;
# Drag the internal address script to the content tab of your inventory and drag the object from our scene that we took into our inventory earlier, copying this to the content tab; we now have all the requirements for loading scenes &lt;br /&gt;
# Right click on the Prototype floor panel, choose edit, check edit linked parts, then select the red area of the floor panel (inside the red field) and press Contents tab and drag the object package, and tex_package in there&lt;br /&gt;
# Type /1000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
# Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
=== Building Shells ===&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later, and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
# Create the objects you want as your Shell and arrange them as you like&lt;br /&gt;
# Place a external label script into each linked object or individual object you have set out as your prototype shell &lt;br /&gt;
# Use /2000 SAVE to save the position and rotation of the current shell; if you wish to modify the shell before repacking or move things around more enter /2000 RESET and then follow step 3 again&lt;br /&gt;
# Right click on all the object while holding the Ctrl key, edit and take all the objects into your inventory&lt;br /&gt;
# Next click on your control panel on the wall and press the *Create* button, preparing a package for your shell&lt;br /&gt;
# Now we will want to name the shell package: right click this box, edit it, and fill in something friendly for your shell name and description&lt;br /&gt;
# Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts&lt;br /&gt;
# Right click on the Prototype floor panel, go into edit, check edit link parts, then select the blue area of the floor panel (inside the blue field)&lt;br /&gt;
# Next go to the Content tab and drag the object package into it&lt;br /&gt;
# Type /2000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
# Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
=== Texture Card ===&lt;br /&gt;
The Prototype consists of eight wall, four ceiling, and four floor prims. The texture card has one line for each of these inner prim faces. The prims are named for their direction on the SL compass, and the name of each face on the texture card corresponds to these names. The card must begin with tex_xxx where xxx is the name of the scene, which must be the same name as will be given to the object card.&lt;br /&gt;
&lt;br /&gt;
Each line of the texture card has the following information:&lt;br /&gt;
&lt;br /&gt;
wall section#texture key#vector repeats#vector offsets#float rotation#vector color#float alpha&lt;br /&gt;
&lt;br /&gt;
Once it’s completed, it may look like the following:&lt;br /&gt;
&lt;br /&gt;
ene_wall#2eabe96c-2540-e1fa-ce7f-9030c3d958df#&amp;lt;1.5,1,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&lt;br /&gt;
Each of the items in the texture card must be separated by the symbol #&lt;br /&gt;
&lt;br /&gt;
*Wall Section*&lt;br /&gt;
The wall section name corresponds to the name given to each prim in the Prototype. Use the edit linked parts and then point to the prim, make a note of the wall name. Then go to the card and find the same line containing that wall name.&lt;br /&gt;
&lt;br /&gt;
*Texture Key*&lt;br /&gt;
This is the ID of the texture you are using. This texture must have full permissions. Right click on the prim, select texture, locate it in the list, then right click and copy UUID. Next paste this ID into the note card exactly between the ##.&lt;br /&gt;
&lt;br /&gt;
*Vector Repeats*&lt;br /&gt;
These numbers correspond to the horizontal/vertical repeats found in the texture tab in your edit window.  &lt;br /&gt;
&amp;lt;1.5,1,0&amp;gt;&lt;br /&gt;
The first number is horizontal repeats, the second one is vertical, the third is not used, so will always be 0. Please make sure that the numbers are separated with a comma or they will not work.&lt;br /&gt;
&lt;br /&gt;
*Vector Offsets*&lt;br /&gt;
This set of numbers corresponds to the horizontal/vertical offsets also found in the texture tab in the edit window. For most builds you will keep this set at NULL_VECTOR, since you can’t leave these numbers as 0,0,0. If you do need to offset a texture for some reason, you would replace NULL_VECTOR, with &amp;lt;.5,0,0&amp;gt;, again the first number in the set corresponds to the horizontal offset, the second for vertical offset, the third is not to be used, therefore is left at 0.&lt;br /&gt;
&lt;br /&gt;
*Float Rotation*&lt;br /&gt;
If the texture must be rotated for some reason on the prim face, you will enter that number in the float rotation section. In the example above it’s set at 90.0. Because of the location of some of the walls they will need to be set at 90.0 anyway.&lt;br /&gt;
&lt;br /&gt;
*Vector Color*&lt;br /&gt;
If you would like to tint the prim face, you will use this section. For walls that aren’t tinted, leave the numbers at 1,1,1 because this is equivalent to white/clear. 0,0,0 is black. Below are the basic colours, and included with the Prototype package is a full list of colours in SL format.&lt;br /&gt;
&lt;br /&gt;
Red, Green Blue&lt;br /&gt;
Number may go between 0.1 to 0.9 for each of the three colors&lt;br /&gt;
white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
*Float Alpha*&lt;br /&gt;
This corresponds to the amount of transparency, 1.0 being no transparency, 0.0 is full transparency.&lt;br /&gt;
&lt;br /&gt;
NOTE: One final word on textures. Make sure that when you reference a texture ID key, you keep that texture in your inventory.  If you delete it from inventory, after a while it will be deleted from the asset inventory SL keeps and won’t work anymore.&lt;br /&gt;
&lt;br /&gt;
That’s it for the texture note-card. It’s a little confusing in the beginning, but you will get the hang of it in no time. A demo note-card has been provided for you to use in what ever way you want. Just remember when naming the card, to use the tex_ prefix.&lt;br /&gt;
&lt;br /&gt;
=== Scene Creation ===&lt;br /&gt;
Depending on what you plan on using in your Prototype building, your scene will vary. Some people make their own furniture and other items for their scenes for their own use or for sale. Others use free items they have gathered around SL which have copy/mod permissions to build their scenes. The Prototype is perfect for personal homes, clubs, inns and hotels, skyboxes, anywhere you need to rez furniture. The wonderful thing is that you have multiple scenes stored in the Prototype and can change whenever you want, instead of having to keep dragging things from inventory. Or for those of you who don’t want to use all their prims on a home and 5 rooms, why not have one room with five scenes and a nice shell. There are places to purchase copy/mod pose balls for your scenes too.  &lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
Some tips when building items for your scenes:&lt;br /&gt;
&lt;br /&gt;
* Try to link as many prims together as they will load faster than ten smaller objects located around the box&lt;br /&gt;
* When placing objects keep in mind the location of the door&lt;br /&gt;
* When making an object that is an odd shape such as a torus, you may want to create a flat box prim below it, and link to that; it will save headaches later on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Packaging ===&lt;br /&gt;
When you decide to package the item for sale, make sure that you give copy rights to the next owner or they won’t be able to use it. It is also helpful to give full permissions on the texture. Ensure the name you give the object is user friendly, but also only contains letters, numbers _ or -. Don&#039;t forget to add the address script to each completed package.&lt;br /&gt;
&lt;br /&gt;
If you have any questions, please feel free to contact Revolution Perenti, and do join the .::Prototype::. Group you will receive updates of this manual and the scripts as they come out.  If you have any suggestions for this manual please feel free to let me know.&lt;br /&gt;
&lt;br /&gt;
Happy building!&lt;br /&gt;
&lt;br /&gt;
Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Holodeck Commands Quick Overview: ==&lt;br /&gt;
(.::Prototype 1.63::. should be replaced with what you called your root prim)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Commands Quick Guide&lt;br /&gt;
&lt;br /&gt;
// SCENE SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/1000 .::Prototype 1.63::.,CHANNEL,1001 (replace 1001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/1000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/1000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Prims Remaining on sim;&lt;br /&gt;
/1000 SIM&lt;br /&gt;
Prims Remaining on Parcel&lt;br /&gt;
/1000 PARCEL&lt;br /&gt;
Open or Close door;&lt;br /&gt;
/1000 DOOR&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/1000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/1000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/1000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/1000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/1000 EDIT&lt;br /&gt;
load weather type (this is future update and is reserved until beta testing is complete)&lt;br /&gt;
/1000 COMPATIBILITY Blizzard //replace Blizzard with weather type /snow, rain, blizzard, hail, storm, tornado&lt;br /&gt;
&lt;br /&gt;
// SHELL SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/2000 .::Prototype 1.63::.,CHANNEL,2001 (replace 2001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/2000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/2000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/2000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/2000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/2000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/2000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/2000 EDIT&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library|Holodeck}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=1144164</id>
		<title>Dataserver API</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=1144164"/>
		<updated>2011-05-19T22:34:55Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* How It Works */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
=Dataserver Framework=&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
&lt;br /&gt;
A common problem in SL is reading and parsing notecards by script. One application for this is so a script can be distributed as no-mod but still be configurable.&lt;br /&gt;
&lt;br /&gt;
The below framework demonstrates how to setup such an interface with very little work to retool.&lt;br /&gt;
&lt;br /&gt;
The default state reads the notecard and when it is done it activates the configuration state.&lt;br /&gt;
&lt;br /&gt;
===Testimonial===&lt;br /&gt;
&lt;br /&gt;
The most common problem I find is people asking about dataservers, reading from notecards to bypass variables within a notecard so you can release your script as nomod.&lt;br /&gt;
So I setup a simple system that I use time and time again that can be reused in any project.&lt;br /&gt;
The class itself is state based meaning the default state reads the notecard and then starts another state when the notecard is read and ready to use I explain this further below.&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string notecard_name = &amp;quot;configuration&amp;quot;;  // name of notecard goes here&lt;br /&gt;
&lt;br /&gt;
// internals&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer line;&lt;br /&gt;
key queryhandle;                   // to separate Dataserver requests&lt;br /&gt;
key notecarduuid;&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    queryhandle = llGetNotecardLine(notecard_name, line = 0);// request line&lt;br /&gt;
    notecarduuid = llGetInventoryKey(notecard_name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Config data loaded from notecard, with some sane defaults&lt;br /&gt;
integer channel = 1000;&lt;br /&gt;
string email_address = &amp;quot;revolution.perenti@skidzpartz.com&amp;quot;;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)         &lt;br /&gt;
    {&lt;br /&gt;
        // We want to reload channel notecard if it changed&lt;br /&gt;
        if (change &amp;amp; CHANGED_INVENTORY)&lt;br /&gt;
            if(notecarduuid != llGetInventoryKey(notecard_name))&lt;br /&gt;
                init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (query_id == queryhandle)&lt;br /&gt;
        {&lt;br /&gt;
            if (data != EOF)&lt;br /&gt;
            {   // not at the end of the notecard&lt;br /&gt;
                // yay!  Parsing time&lt;br /&gt;
                &lt;br /&gt;
                // pesky whitespace&lt;br /&gt;
                data = llStringTrim(data, STRING_TRIM_HEAD);&lt;br /&gt;
&lt;br /&gt;
                // is it a comment?&lt;br /&gt;
                if (llGetSubString (data, 0, 0) != &amp;quot;#&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    integer s = llSubStringIndex(data, &amp;quot;=&amp;quot;);&lt;br /&gt;
                    if(~s)//does it have an &amp;quot;=&amp;quot; in it?&lt;br /&gt;
                    {&lt;br /&gt;
                        string token = llToLower(llStringTrim(llDeleteSubString(data, s, -1), STRING_TRIM));&lt;br /&gt;
                        data = llStringTrim(llDeleteSubString(data, 0, s), STRING_TRIM);&lt;br /&gt;
&lt;br /&gt;
                        //Insert your token parsers here.&lt;br /&gt;
                        if (token == &amp;quot;email_address&amp;quot;)&lt;br /&gt;
                            email_address = data;&lt;br /&gt;
                        else if (token == &amp;quot;channel&amp;quot;)&lt;br /&gt;
                            channel = (integer)data;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                queryhandle = llGetNotecardLine(notecard_name, ++line);&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Notecard Data: &amp;quot; + data);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Done Reading Notecard&amp;quot;);&lt;br /&gt;
                state configuration ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state configuration&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(channel, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llShout(0, &amp;quot;Channel set to &amp;quot; + (string)channel);&lt;br /&gt;
        llShout(0, &amp;quot;Email set to &amp;quot; + (string)email_address);&lt;br /&gt;
    }   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Notecard==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
# This is the configuration file&lt;br /&gt;
channel = 1000&lt;br /&gt;
email_address = phoenixcms@hotmail.co.uk&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Lines that start with &amp;quot;#&amp;quot; are comments.&lt;br /&gt;
&lt;br /&gt;
==How It Works==&lt;br /&gt;
&lt;br /&gt;
The [[default]] [[state]] reads and parses all the lines in the notecard. As it reads the notecard it overwrites the default values with the values in the notecard. More specifically after each line has been validated and tokenized, the token is checked against supported tokens. If the token is supported the specific parser for the token is called, in the above example it is just a simple convert and copy. &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlesoftware.ca www.dazzlesoftware.ca] Secondlife Open Source Section on Tutorials.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Texture_Menu_Management&amp;diff=998382</id>
		<title>Texture Menu Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Texture_Menu_Management&amp;diff=998382"/>
		<updated>2010-08-12T05:01:33Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* Main Script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
=Texture Menu Management=&lt;br /&gt;
&lt;br /&gt;
(based on our previus script and released here for you as we did a custom edit for second-life community and i thought you may like to use this script as well.)&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
Allows you to have dialog based navigation of textures.&lt;br /&gt;
and browse the image you like to display on your [[prim]] from a dialog with simple and ease of navigation &lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Create a script and copy and paste the script below into your [[prim]].&lt;br /&gt;
and copy textures or photos from your [[inventory]] into the content tab of your [[prim]]&lt;br /&gt;
click your prim containing the script and textures and select a [[texture]] or photo from the menu dialog&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
integer listener;&lt;br /&gt;
integer MENU_CHANNEL = 1000;&lt;br /&gt;
&lt;br /&gt;
// opens menu channel and displays dialog&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(listener);&lt;br /&gt;
    listener = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;Select one object below: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        // reset scripts on rez&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        MENU1 = [];&lt;br /&gt;
        MENU2 = [];&lt;br /&gt;
        // count the textures in the prim to see if we need pages&lt;br /&gt;
        integer c = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
        if (c &amp;lt;= 12)&lt;br /&gt;
        {&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_TEXTURE, i);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {        &lt;br /&gt;
            for (; i &amp;lt; 11; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_TEXTURE, i);&lt;br /&gt;
            if(c &amp;gt; 22)&lt;br /&gt;
                c = 22;&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU2 += llGetInventoryName(INVENTORY_TEXTURE, i); &lt;br /&gt;
            MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
            MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;                          &lt;br /&gt;
        }&lt;br /&gt;
        // display the dialog &lt;br /&gt;
        Dialog(llDetectedKey(0), MENU1);&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 (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);  &lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }        &lt;br /&gt;
            else                    &lt;br /&gt;
            {&lt;br /&gt;
                // display the texture from menu selection &lt;br /&gt;
                llSetTexture(message, ALL_SIDES);&lt;br /&gt;
                &lt;br /&gt;
            }      &lt;br /&gt;
        }&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlemods.com www.dazzlemods.com] Open Source Section on our forum.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Script_Override_Functions&amp;diff=998372</id>
		<title>Script Override Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Script_Override_Functions&amp;diff=998372"/>
		<updated>2010-08-12T05:00:54Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* USAGE: /CHANNEL Object_Name,message,value eg: /1000 Object,channel,1001 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
== Script Override ==&lt;br /&gt;
Well, you like to override strings, integer etc. in chat channel. For example you like to enable debug or change the channel. I find this the best solution and it can be pretty useful API framework for many listens.&lt;br /&gt;
&lt;br /&gt;
==== USAGE: /CHANNEL Object_Name,message,value eg: /1000 Object,channel,1001 ====&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list csv_commands;&lt;br /&gt;
&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&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;
        csv_commands = llCSV2List( llToLower( message ));&lt;br /&gt;
//        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands, 1);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = (integer)llList2String( csv_commands, 2);&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel);&lt;br /&gt;
        }&lt;br /&gt;
        else if(command == &amp;quot;avatar&amp;quot; || message == &amp;quot;AVATAR&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0, &amp;quot;Hello, Avatar!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlemods.com www.dazzlemods.com] Open Source Section on our forum.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;br /&gt;
{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Inventory_Based_Menu&amp;diff=998362</id>
		<title>Inventory Based Menu</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Inventory_Based_Menu&amp;diff=998362"/>
		<updated>2010-08-12T05:00:10Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
Introduction:&lt;br /&gt;
Ok you want to create a dialog based menu system, you want to support more than 12 buttons&lt;br /&gt;
so im going to give you quick overview of basic menu using [[llRezAtRoot]], [[llGetInventoryName]] &amp;amp; [[llGetInventoryNumber]]&lt;br /&gt;
&lt;br /&gt;
USAGE:just drop objects into the prim and rez them from the dialog by touching the prim.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
integer listener;&lt;br /&gt;
integer MENU_CHANNEL = 1000;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(listener);&lt;br /&gt;
    listener = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;Select one object below: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        MENU1 = [];&lt;br /&gt;
        MENU2 = [];&lt;br /&gt;
        integer c = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        if (c &amp;lt;= 12)&lt;br /&gt;
        {&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {        &lt;br /&gt;
            for (; i &amp;lt; 11; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            if(c &amp;gt; 22)&lt;br /&gt;
                c = 22;&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU2 += llGetInventoryName(INVENTORY_OBJECT, i); &lt;br /&gt;
            MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
            MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;                          &lt;br /&gt;
        }&lt;br /&gt;
        Dialog(llDetectedKey(0), MENU1);&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 (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);  &lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }        &lt;br /&gt;
            else                    &lt;br /&gt;
            {&lt;br /&gt;
                // todo add offsets so box sites perfect on rezzer &lt;br /&gt;
                llRezAtRoot(message, llGetPos(), ZERO_VECTOR, llGetRot(), 0);&lt;br /&gt;
            }      &lt;br /&gt;
        }&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlemods.com www.dazzlemods.com] Open Source Section on our forum.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Open_Source_Holodeck&amp;diff=998352</id>
		<title>Open Source Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Open_Source_Holodeck&amp;diff=998352"/>
		<updated>2010-08-12T04:59:10Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* Holodeck Commands Quick Overview: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
What is a Holodeck?&lt;br /&gt;
&lt;br /&gt;
A Holodeck stores Second Life scenes and lets you load them from a menu when ever you want. The old scene is cleared and the new one appears. Scenes can include any prim objects including furniture, pose balls and particle generators.&lt;br /&gt;
&lt;br /&gt;
== Creating a Holodeck ==&lt;br /&gt;
&lt;br /&gt;
=== the Shell ===&lt;br /&gt;
&lt;br /&gt;
The Scripts for the holodeck may look complex but once you have done it correctly everything is very simple to use. Building and setup are similar to methods you would normally use within SecondLife.&lt;br /&gt;
&lt;br /&gt;
The best way to start creating a holodeck would be to build a 20x20x10 shell. This will be your rezzing area for the holodeck scenes.&lt;br /&gt;
&lt;br /&gt;
Your shell should look something similar to the picture below.&lt;br /&gt;
&lt;br /&gt;
[[Image:holodeck shell.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== the floor panel ===&lt;br /&gt;
&lt;br /&gt;
Next we create a small floor panel. In the example we use a 0.500x0.500x0.100 cube. Link the floor panel to your holodeck shell. Make sure that the floor panel is the last object you link to the shell as this becomes the root prim. The floor panel &#039;&#039;&#039;MUST&#039;&#039;&#039; be the root prim in order for the holodeck to function properly.&lt;br /&gt;
&lt;br /&gt;
see example below&lt;br /&gt;
&lt;br /&gt;
[[Image:floor panel.jpg]]&lt;br /&gt;
&lt;br /&gt;
The Scripts&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Holodeck Core.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// User Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//How long to listen for a menu response before shutting down the listener&lt;br /&gt;
float fListenTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//How often (in seconds) to check for change in position when moving&lt;br /&gt;
float fMovingRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
//How long to sit still before exiting active mode&lt;br /&gt;
float fStoppedTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//Minimum amount of time (in seconds) between movement updates&lt;br /&gt;
float fShoutRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
// label script name used for debug and PrototypeSay();&lt;br /&gt;
string label = &amp;quot;internal label&amp;quot;;&lt;br /&gt;
// Channel used by Prototype&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer MENU_CHANNEL;&lt;br /&gt;
integer MENU_HANDLE;&lt;br /&gt;
string PROTOTYPE_CREATOR;&lt;br /&gt;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
integer PROTOTYPE_RESET = -68195;&lt;br /&gt;
integer SHOW_MENU = -68194;&lt;br /&gt;
// Channel used by Prototype to talk to label scripts&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
// Feature Manager&lt;br /&gt;
integer PROTOTYPE_TEXTURE = TRUE;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Security Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
integer PROTOTYPE_ALLOW_IM = FALSE;&lt;br /&gt;
string  PROTOTYPE_EMAIL = &amp;quot;phoenixcms@hotmail.co.uk&amp;quot;;&lt;br /&gt;
string  PROTOTYPE_OWNER;&lt;br /&gt;
vector  Where;&lt;br /&gt;
string  Name;&lt;br /&gt;
string  SLURL;&lt;br /&gt;
integer X;&lt;br /&gt;
integer Y;&lt;br /&gt;
integer Z;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Menu System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Compatibility System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list objectSettings = [];&lt;br /&gt;
integer stride = 3;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
string COMPATIBILITY_NOTECARD = &amp;quot;compatibility&amp;quot;; //[objectname];&amp;lt;position&amp;gt;;&amp;lt;rotation&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DO NOT EDIT BELOW THIS LINE.... NO.. NOT EVEN THEN&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer PrototypeBaseMoving;&lt;br /&gt;
vector PrototypeLastPosition;&lt;br /&gt;
rotation PrototypeLastRotation;&lt;br /&gt;
integer iListenTimeout = 0;&lt;br /&gt;
&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//To avoid flooding the sim with a high rate of movements&lt;br /&gt;
//(and the resulting mass updates it will bring), we used&lt;br /&gt;
// a short throttle to limit ourselves&lt;br /&gt;
prototype_moved()&lt;br /&gt;
{&lt;br /&gt;
    llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ llGetPos(), llGetRot() ], &amp;quot;|&amp;quot;));&lt;br /&gt;
    llResetTime(); //Reset our throttle&lt;br /&gt;
    PrototypeLastPosition = llGetPos();&lt;br /&gt;
    PrototypeLastRotation = llGetRot();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    iListenTimeout = llGetUnixTime() + llFloor(fListenTime);&lt;br /&gt;
    MENU_CHANNEL = llFloor(llFrand(-99999.0 - -100));&lt;br /&gt;
    MENU_HANDLE = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;www.sl-prototype.com: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
    llSetTimerEvent(fShoutRate);&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;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER || CHANGED_INVENTORY)&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry () &lt;br /&gt;
    {&lt;br /&gt;
        // Lets open our listen channel&lt;br /&gt;
        key_listen = llListen(PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;LISTEN ON CHANNEL &amp;quot; +(string)PROTOTYPE_CHANNEL);&lt;br /&gt;
        // Compatibility System Notecard&lt;br /&gt;
        llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        //Record our position&lt;br /&gt;
        PrototypeLastPosition = llGetPos();&lt;br /&gt;
        PrototypeLastRotation = llGetRot();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    dataserver(key queryId, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            objectSettings += llParseString2List(data, [&amp;quot;;&amp;quot;], []);&lt;br /&gt;
            iLine++;&lt;br /&gt;
            llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Done Reading Compatibility Notecard &amp;quot; + COMPATIBILITY_NOTECARD);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number==SHOW_MENU) {&lt;br /&gt;
            MENU1 = [];&lt;br /&gt;
            MENU2 = [];&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
                MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            Dialog(id, MENU1);&lt;br /&gt;
        }&lt;br /&gt;
        if (number==PROTOTYPE_RESET) {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Forgetting positions...&amp;quot;);&lt;br /&gt;
            llPrototypeSay(&amp;quot;RESET&amp;quot;);&lt;br /&gt;
        }&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;
        list compatibility = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        PROTOTYPE_CREATOR = llGetCreator();&lt;br /&gt;
        //&lt;br /&gt;
        if ( command == llToLower(&amp;quot;CHANNEL&amp;quot;) || command == llToUpper(&amp;quot;CHANNEL&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)PROTOTYPE_CHANNEL );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;MESSAGE&amp;quot;) || command == llToUpper(&amp;quot;MESSAGE&amp;quot;))  &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_MESSAGE = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;PROTOTYPE MESSAGE set to &amp;quot; + (string)PROTOTYPE_MESSAGE );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // OPEN / CLOSE DOOR    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;DOOR&amp;quot;) || message == llToUpper(&amp;quot;DOOR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, PROTOTYPE_DOOR, &amp;quot;&amp;quot;,NULL_KEY );&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Setting Door Permissions...&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        // SET COMPATIBILITY&lt;br /&gt;
        if (llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;)&lt;br /&gt;
            || llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            string object = llList2String(compatibility, 1);&lt;br /&gt;
            integer indexInSettings = llListFindList(objectSettings, [object]);&lt;br /&gt;
            if(indexInSettings &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                vector pos = (vector)llList2String(objectSettings, indexInSettings + 1);&lt;br /&gt;
                rotation rot = (rotation)llList2String(objectSettings, indexInSettings + 2);&lt;br /&gt;
                llRezAtRoot(object, pos + llGetPos(), ZERO_VECTOR, rot, 0);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // LOAD MENU SYSTEM    &lt;br /&gt;
        if (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                //Loop through backwards (safety precaution in case of inventory change)&lt;br /&gt;
                if (DEBUG) llDebugSay(&amp;quot;Loading build pieces please wait...&amp;quot;);&lt;br /&gt;
                llRezAtRoot(message, llGetPos() + &amp;lt;0.00, 0.00, 0.30&amp;gt;, ZERO_VECTOR,&lt;br /&gt;
                    llGetRot(), PROTOTYPE_CHANNEL);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // REPOSTION SCENE    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;POSITION&amp;quot;) || message == llToUpper(&amp;quot;POSITION&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Positioning&amp;quot;);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // CLEAR SCENE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;CLEAR&amp;quot;) || message == llToUpper(&amp;quot;CLEAR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;CLEAN&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if( message == llToLower(&amp;quot;HOLODECKDIE&amp;quot;) || message == llToUpper(&amp;quot;HOLODECKDIE&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            if(PROTOTYPE_CREATOR) llDie();&lt;br /&gt;
        }&lt;br /&gt;
        // DISABLE PHANTOM AS WE ARE NOW DONE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;NOPHANTOM&amp;quot;) || message == llToUpper(&amp;quot;NOPHANTOM&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;PHANTOM&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Disabled Phantom&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    moving_start() //StartPrototype&lt;br /&gt;
    {&lt;br /&gt;
        if( !PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            PrototypeBaseMoving = TRUE;&lt;br /&gt;
            llSetTimerEvent(0.0); //Resets the timer if already running&lt;br /&gt;
            llSetTimerEvent(fMovingRate);&lt;br /&gt;
            prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer() &lt;br /&gt;
    {&lt;br /&gt;
        //Were we moving?&lt;br /&gt;
        if( PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            //Did we change position/rotation?&lt;br /&gt;
            if( (llGetRot() != PrototypeLastRotation) || (llGetPos() != PrototypeLastPosition) )&lt;br /&gt;
            {&lt;br /&gt;
                if( llGetTime() &amp;gt; fShoutRate ) {&lt;br /&gt;
                    prototype_moved();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
        // Have we been sitting long enough to consider ourselves stopped?&lt;br /&gt;
            if( llGetTime() &amp;gt; fStoppedTime )&lt;br /&gt;
            PrototypeBaseMoving = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Open listener?&lt;br /&gt;
        if( iListenTimeout != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            //Past our close timeout?&lt;br /&gt;
            if( iListenTimeout &amp;lt;= llGetUnixTime() )&lt;br /&gt;
            {&lt;br /&gt;
                iListenTimeout = 0;&lt;br /&gt;
                llListenRemove(MENU_HANDLE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Stop the timer?&lt;br /&gt;
        if( (iListenTimeout == 0) &amp;amp;&amp;amp; ( !PrototypeBaseMoving ) )&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Stopping Timer&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    } // END TIMER FUNCTION&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        PROTOTYPE_OWNER = llGetOwner();&lt;br /&gt;
        //Name = llGetRegionName();&lt;br /&gt;
        Name = llDumpList2String(llParseString2List(llGetRegionName(),[&amp;quot; &amp;quot;],[]),&amp;quot;_&amp;quot;);&lt;br /&gt;
        Where = llGetPos();&lt;br /&gt;
&lt;br /&gt;
        X = (integer)Where.x;&lt;br /&gt;
        Y = (integer)Where.y;&lt;br /&gt;
        Z = (integer)Where.z;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // I don&#039;t replace any spaces in Name with %20 and so forth.&lt;br /&gt;
&lt;br /&gt;
        SLURL = &amp;quot;http://slurl.com/secondlife/&amp;quot;&lt;br /&gt;
            + Name + &amp;quot;/&amp;quot; + (string)X + &amp;quot;/&amp;quot; + (string)Y + &amp;quot;/&amp;quot; + (string)Z + &amp;quot;/?title=&amp;quot; + Name;&lt;br /&gt;
&lt;br /&gt;
        llEmail(PROTOTYPE_EMAIL, llKey2Name(PROTOTYPE_OWNER),&lt;br /&gt;
            SLURL + &amp;quot;\nRegistered user =&amp;quot; + llKey2Name(PROTOTYPE_OWNER)&lt;br /&gt;
                  + &amp;quot;Registered user key =&amp;quot; + PROTOTYPE_OWNER);&lt;br /&gt;
        if (PROTOTYPE_ALLOW_IM) {&lt;br /&gt;
            llInstantMessage(llGetCreator(), SLURL);&lt;br /&gt;
        }&lt;br /&gt;
        // Reset ourselves&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Texture Engine.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
string TEXTURE_NOTECARD;&lt;br /&gt;
string prefix = &amp;quot;tex_&amp;quot;;&lt;br /&gt;
key TextureQuery;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
integer DEBUG = FALSE; // debug channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
default {&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        TEXTURE_NOTECARD = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + TEXTURE_NOTECARD);&lt;br /&gt;
        TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        list texture = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            TEXTURE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)TEXTURE_CHANNEL);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(llList2String(texture, 0) == &amp;quot;image&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            iLine = 0;&lt;br /&gt;
            TEXTURE_NOTECARD = llList2String(texture, 1);&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////        &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == TextureQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data != EOF &amp;amp;&amp;amp; prefix == &amp;quot;tex_&amp;quot;) {    &lt;br /&gt;
            &lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);&lt;br /&gt;
                llMessageLinked(LINK_SET,0,data,NULL_KEY);&lt;br /&gt;
&lt;br /&gt;
                // increment line count                 &lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                ++iLine;&lt;br /&gt;
                TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Done reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Notecards&lt;br /&gt;
&lt;br /&gt;
*Clear* Notecard for default Clear Scene &lt;br /&gt;
(note the first line of texture notecards is object name so make sure you name all floor panels, roof and walls with unique name and edit the notecard as required add each object line to a new line as required.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
Object_Name#2f78ee38-9aca-f8d1-5306-458beab181f9#&amp;lt;3.0,1.0,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
compatibility notecard leave this blank at current its planned as future feature to allow weather inside the holodeck and was the old rez system from early beta but we left it here to be reused later on.&lt;br /&gt;
&lt;br /&gt;
=== Scripts for the Shell Prims ===&lt;br /&gt;
&lt;br /&gt;
Walls, Floor,Roof texture,particles,sound &amp;amp; locate system&lt;br /&gt;
needs to be added to every object you wish to texture each object needs a unique name too for better control of textures&lt;br /&gt;
System.lsl (updated to 2.0.2)&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Skidz Partz - Open Source Holodeck Version (2.0.1)&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// Debug&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
&lt;br /&gt;
// Sound System&lt;br /&gt;
list SOUND_VALUES;&lt;br /&gt;
integer SOUND_TYPE;&lt;br /&gt;
string SOUND_UUID;&lt;br /&gt;
float SOUND_VOLUME;&lt;br /&gt;
// Texture System&lt;br /&gt;
list TEXTURE_VALUES;&lt;br /&gt;
string HOLODECK_OBJECTNAME;&lt;br /&gt;
string TEXTURE_UID;&lt;br /&gt;
vector TEXTURE_REPEATS;&lt;br /&gt;
vector TEXTURE_OFFSETS;&lt;br /&gt;
float TEXTURE_ROTATE;&lt;br /&gt;
vector TEXTURE_COLOR;&lt;br /&gt;
float TEXTURE_ALPHA;&lt;br /&gt;
&lt;br /&gt;
// Lighting System&lt;br /&gt;
list LIGHT_VALUES;&lt;br /&gt;
integer  LIGHT_STATUS;&lt;br /&gt;
// Color of the light (RGB - each value between 0.0 and 1.0)&lt;br /&gt;
vector LIGHT_COLOR;&lt;br /&gt;
// Intensity of the light (values from 0.0 .. 1.0)&lt;br /&gt;
float  LIGHT_LEVEL;&lt;br /&gt;
// Radius of light cone&lt;br /&gt;
float  LIGHT_DISTANCE;&lt;br /&gt;
// Fall off (distance/intensity decrease) values from 0.0 ..1.0&lt;br /&gt;
float  LIGHT_FALLOFF;&lt;br /&gt;
&lt;br /&gt;
// Particle System&lt;br /&gt;
integer PARTICLE_FLAGS;&lt;br /&gt;
//&lt;br /&gt;
list PARTICLE_VALUES;&lt;br /&gt;
key PARTICLE_SRC_TARGET_KEY = &amp;quot;&amp;quot;;&lt;br /&gt;
string PARTICLE_SRC_TEXTURE = &amp;quot;&amp;quot;;&lt;br /&gt;
float PARTICLE_SRC_MAX_AGE;&lt;br /&gt;
float PARTICLE_PART_MAX_AGE;&lt;br /&gt;
float PARTICLE_BURST_RATE;&lt;br /&gt;
integer PARTICLE_BURST_PART_COUNT;&lt;br /&gt;
float PARTICLE_BURST_RADIUS;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MAX;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MIN;&lt;br /&gt;
float PARTICLE_START_ALPHA;&lt;br /&gt;
float PARTICLE_END_ALPHA;&lt;br /&gt;
float PARTICLE_INNERANGLE;&lt;br /&gt;
float PARTICLE_OUTERANGLE;&lt;br /&gt;
vector PARTICLE_START_COLOR;&lt;br /&gt;
vector PARTICLE_END_COLOR;&lt;br /&gt;
vector PARTICLE_START_SCALE;&lt;br /&gt;
vector PARTICLE_END_SCALE;&lt;br /&gt;
vector PARTICLE_ACCEL;&lt;br /&gt;
vector PARTICLE_OMEGA;&lt;br /&gt;
integer PARTICLE_SRC_PATTERN;&lt;br /&gt;
// Link Messages Channels&lt;br /&gt;
integer RESET_SCRIPTS = 0x2F34B;&lt;br /&gt;
integer HOLODECK_LIGHT            = 0x2F34C;&lt;br /&gt;
integer HOLODECK_TEXTURE            = 0x2F34D;&lt;br /&gt;
integer LOCATE_LIGHT = 0x2F34E;&lt;br /&gt;
integer LOCATE_TEXTURE = 0x2F34F;&lt;br /&gt;
integer HOLODECK_PARTICLE = 0x2F350;&lt;br /&gt;
integer HOLODECK_SOUND = 0x2F351;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector eul = &amp;lt;0.00, 0.00, 0.00&amp;gt;;&lt;br /&gt;
        eul *= DEG_TO_RAD;&lt;br /&gt;
        rotation quat = llEuler2Rot( eul );&lt;br /&gt;
        llSetRot( quat );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sent,integer num,string message,key id)&lt;br /&gt;
    {&lt;br /&gt;
    if (num == RESET_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
        llOwnerSay(&amp;quot;Resetting Holodeck Defaults&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_SOUND)&lt;br /&gt;
    {&lt;br /&gt;
        SOUND_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(SOUND_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            SOUND_TYPE = (integer)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_UUID = (string)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_VOLUME = (float)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            &lt;br /&gt;
            // Sound Change&lt;br /&gt;
            if(SOUND_TYPE == 1) &lt;br /&gt;
            { &lt;br /&gt;
               llPlaySound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 2) &lt;br /&gt;
            { &lt;br /&gt;
               llLoopSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 3) &lt;br /&gt;
            { &lt;br /&gt;
               llTriggerSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
                                                            &lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_TEXTURE)&lt;br /&gt;
    {&lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            &lt;br /&gt;
            //list conversions&lt;br /&gt;
            string LOCATE_TEXTURE_UID = llGetTexture(0);&lt;br /&gt;
            vector LOCATE_TEXTURE_REPEATS = llList2Vector(llGetPrimitiveParams([PRIM_TEXTURE,0]),1);&lt;br /&gt;
            vector LOCATE_TEXTURE_OFFSETS = llGetTextureOffset(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ROTATE = llGetTextureRot(0) * DEG_TO_RAD;&lt;br /&gt;
            vector LOCATE_TEXTURE_COLOR = llGetColor(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ALPHA = llGetAlpha(0);&lt;br /&gt;
                        &lt;br /&gt;
             llSay(0, (string)HOLODECK_GETOBJECTNAME+(string)&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_UID+                          // name&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_REPEATS+                      // repeats&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_OFFSETS+                      // offsets&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ROTATE+                       // rotation&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_COLOR+                      // color&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ALPHA);                     // alpha     &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_LIGHT)&lt;br /&gt;
    {          &lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            list LOCATE_PRIM_POINT_LIGHT =  llGetPrimitiveParams([PRIM_POINT_LIGHT]);&lt;br /&gt;
            list LOCATE_STATUS = ([&amp;quot;FALSE&amp;quot;,&amp;quot;TRUE&amp;quot;]);&lt;br /&gt;
            vector LIGHT_COLOR; &lt;br /&gt;
    &lt;br /&gt;
     // output the notecard to chat&lt;br /&gt;
     llSay(0, &amp;quot;locating Lighting Values for &amp;quot; + (string)HOLODECK_GETOBJECTNAME);&lt;br /&gt;
     llSleep(3);&lt;br /&gt;
     llSay(0, (string)HOLODECK_GETOBJECTNAME +                                                // Object Name&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2String(LOCATE_STATUS ,llList2Integer(LOCATE_PRIM_POINT_LIGHT,0)) + // Light Status&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2Vector(LOCATE_PRIM_POINT_LIGHT,1) +                                // Color&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,2) +                                  // Level&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,3) +                                  // Distance&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,4));                                  // falloff&lt;br /&gt;
     LOCATE_PRIM_POINT_LIGHT = [];   &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_LIGHT)&lt;br /&gt;
    {&lt;br /&gt;
        LIGHT_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            LIGHT_STATUS = (integer)llList2String(LIGHT_VALUES,1);&lt;br /&gt;
            LIGHT_COLOR = (vector)llList2String(LIGHT_VALUES,2);&lt;br /&gt;
            LIGHT_LEVEL = (float)llList2String(LIGHT_VALUES,3);&lt;br /&gt;
            LIGHT_DISTANCE = (float)llList2String(LIGHT_VALUES,4);&lt;br /&gt;
            LIGHT_FALLOFF = (float)llList2String(LIGHT_VALUES,5);&lt;br /&gt;
&lt;br /&gt;
            // Lighting Change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_POINT_LIGHT&lt;br /&gt;
                LIGHT_STATUS, LIGHT_COLOR, LIGHT_LEVEL, LIGHT_DISTANCE, LIGHT_FALLOFF]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
    else if (num == HOLODECK_TEXTURE)&lt;br /&gt;
    {    &lt;br /&gt;
        TEXTURE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            TEXTURE_UID = llList2String(TEXTURE_VALUES,1);&lt;br /&gt;
            TEXTURE_REPEATS = (vector)llList2String(TEXTURE_VALUES,2);&lt;br /&gt;
            TEXTURE_OFFSETS = (vector)llList2String(TEXTURE_VALUES,3);&lt;br /&gt;
            TEXTURE_ROTATE = ((float)llList2String(TEXTURE_VALUES,4)) * DEG_TO_RAD;&lt;br /&gt;
            TEXTURE_COLOR = (vector)llList2String(TEXTURE_VALUES,5);&lt;br /&gt;
            TEXTURE_ALPHA = (float)llList2String(TEXTURE_VALUES,6);&lt;br /&gt;
            &lt;br /&gt;
            //texture change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_TEXTURE,0,TEXTURE_UID,TEXTURE_REPEATS,TEXTURE_OFFSETS,TEXTURE_ROTATE]);&lt;br /&gt;
            llSetPrimitiveParams([PRIM_COLOR,0,TEXTURE_COLOR,TEXTURE_ALPHA]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else if (num == HOLODECK_PARTICLE)&lt;br /&gt;
    {&lt;br /&gt;
        PARTICLE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(PARTICLE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            PARTICLE_PART_MAX_AGE = (float)llList2String(PARTICLE_VALUES,1);&lt;br /&gt;
            PARTICLE_FLAGS = (integer)llList2String(PARTICLE_VALUES,2);&lt;br /&gt;
            PARTICLE_START_COLOR = (vector)llList2String(PARTICLE_VALUES,3);&lt;br /&gt;
            PARTICLE_END_COLOR = (vector)llList2String(PARTICLE_VALUES,4);&lt;br /&gt;
            PARTICLE_START_SCALE = (vector)llList2String(PARTICLE_VALUES,5);&lt;br /&gt;
            PARTICLE_END_SCALE = (vector)llList2String(PARTICLE_VALUES,6);&lt;br /&gt;
            PARTICLE_SRC_PATTERN = (integer)llList2String(PARTICLE_VALUES,7);&lt;br /&gt;
            PARTICLE_BURST_RATE = (float)llList2String(PARTICLE_VALUES,8);&lt;br /&gt;
            PARTICLE_ACCEL = (vector)llList2String(PARTICLE_VALUES,9);&lt;br /&gt;
            PARTICLE_BURST_PART_COUNT = (integer)llList2String(PARTICLE_VALUES,10);&lt;br /&gt;
            PARTICLE_BURST_RADIUS = (float)llList2String(PARTICLE_VALUES,11);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MIN = (float)llList2String(PARTICLE_VALUES,12);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MAX = (float)llList2String(PARTICLE_VALUES,13);&lt;br /&gt;
            PARTICLE_INNERANGLE = (float)llList2String(PARTICLE_VALUES,14);&lt;br /&gt;
            PARTICLE_OUTERANGLE = (float)llList2String(PARTICLE_VALUES,15);&lt;br /&gt;
            PARTICLE_OMEGA = (vector)llList2String(PARTICLE_VALUES,16);&lt;br /&gt;
            PARTICLE_SRC_MAX_AGE = (float)llList2String(PARTICLE_VALUES,17);&lt;br /&gt;
            PARTICLE_START_ALPHA = (float)llList2String(PARTICLE_VALUES,18);&lt;br /&gt;
            PARTICLE_END_ALPHA = (float)llList2String(PARTICLE_VALUES,19);&lt;br /&gt;
            PARTICLE_SRC_TEXTURE = (string)llList2String(PARTICLE_VALUES,20);&lt;br /&gt;
            llSleep(1.5);&lt;br /&gt;
            // Particle Change&lt;br /&gt;
            llParticleSystem([  &lt;br /&gt;
                        PSYS_PART_MAX_AGE, PARTICLE_PART_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_FLAGS, PARTICLE_FLAGS,&lt;br /&gt;
                        PSYS_PART_START_COLOR, PARTICLE_START_COLOR,&lt;br /&gt;
                        PSYS_PART_END_COLOR, PARTICLE_END_COLOR,&lt;br /&gt;
                        PSYS_PART_START_SCALE, PARTICLE_START_SCALE,&lt;br /&gt;
                        PSYS_PART_END_SCALE, PARTICLE_END_SCALE,&lt;br /&gt;
                        PSYS_SRC_PATTERN, PARTICLE_SRC_PATTERN,&lt;br /&gt;
                        PSYS_SRC_BURST_RATE,PARTICLE_BURST_RATE,&lt;br /&gt;
                        PSYS_SRC_ACCEL,PARTICLE_ACCEL,&lt;br /&gt;
                        PSYS_SRC_BURST_PART_COUNT,PARTICLE_BURST_PART_COUNT,&lt;br /&gt;
                        PSYS_SRC_BURST_RADIUS,PARTICLE_BURST_RADIUS,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MIN,PARTICLE_BURST_SPEED_MIN,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MAX,PARTICLE_BURST_SPEED_MAX,&lt;br /&gt;
                        PSYS_SRC_ANGLE_BEGIN,PARTICLE_INNERANGLE,&lt;br /&gt;
                        PSYS_SRC_ANGLE_END,PARTICLE_OUTERANGLE,&lt;br /&gt;
                        PSYS_SRC_OMEGA,PARTICLE_OMEGA,&lt;br /&gt;
                        PSYS_SRC_MAX_AGE,PARTICLE_SRC_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_START_ALPHA,PARTICLE_START_ALPHA,&lt;br /&gt;
                        PSYS_PART_END_ALPHA,PARTICLE_END_ALPHA,&lt;br /&gt;
                        PSYS_SRC_TEXTURE, PARTICLE_SRC_TEXTURE,&lt;br /&gt;
                        PSYS_SRC_TARGET_KEY,PARTICLE_SRC_TARGET_KEY &lt;br /&gt;
                            ]);                         &lt;br /&gt;
        }            &lt;br /&gt;
    }&lt;br /&gt;
    if (DEBUG) llOwnerSay(&amp;quot;This Script Name &amp;quot; + (string)llGetScriptName()&lt;br /&gt;
        + &amp;quot;In Object Name &amp;quot; + (string)llGetObjectName()&lt;br /&gt;
        + &amp;quot;used &amp;quot; + (string)((16384 - llGetFreeMemory())/1024) + &amp;quot; kBytes&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Door ===&lt;br /&gt;
&lt;br /&gt;
Door Script to be places in one of the prims where you would like a door, this does a hollow effect to give the impression of the door and is controlled with link messages.&lt;br /&gt;
&lt;br /&gt;
Door System.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message( integer sender, integer msg, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == PROTOTYPE_DOOR) {&lt;br /&gt;
            list open = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
            string open2 = llList2String(open, 3);&lt;br /&gt;
            if (llGetSubString(open2,0,2) != &amp;quot;0.0&amp;quot;)&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE,&lt;br /&gt;
                    PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.0,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
            else&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE,&lt;br /&gt;
                    PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.95,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Control Pannel ===&lt;br /&gt;
&lt;br /&gt;
next we create a 0.500x0.500x0.100 box this is used for control panel&lt;br /&gt;
now link this to your holodeck shell linking the shell last becuase we want to keep the root prim intact i normally put this just to the side of the door but you can put this anywhere you like.&lt;br /&gt;
&lt;br /&gt;
Next right click select edit link parts and select the switch now we add the menu functions scripts.&lt;br /&gt;
&lt;br /&gt;
Menu System.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list csv_commands;&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
integer SCENEMENU = -68194;&lt;br /&gt;
key agent;&lt;br /&gt;
key objectowner;&lt;br /&gt;
integer group;&lt;br /&gt;
// Set to TRUE to allow group members to use the dialog menu&lt;br /&gt;
// Set to FALSE to disallow group members from using the dialog menu&lt;br /&gt;
integer ingroup = 0;&lt;br /&gt;
integer DEBUG = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay(&amp;quot;Current chanel: &amp;quot;+(string)P_channel);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(command == llToLower(&amp;quot;PERMS&amp;quot;) || message == llToUpper(&amp;quot;PERMS&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            ingroup = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;ingroup set to &amp;quot; + (string)ingroup);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    } // end listen();&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   &lt;br /&gt;
        group = llDetectedGroup(0); // Is the Agent in the objowners group?&lt;br /&gt;
        agent = llDetectedKey(0); // Agent&#039;s key&lt;br /&gt;
        objectowner = llGetOwner(); // objowners key&lt;br /&gt;
        // is the Agent = the owner OR is the agent in the owners group&lt;br /&gt;
        if ( (objectowner == agent) || ( group &amp;amp;&amp;amp; ingroup )  )  {&lt;br /&gt;
            llMessageLinked(LINK_SET,SCENEMENU,&amp;quot;&amp;quot;,agent);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup Scene Clear&lt;br /&gt;
&lt;br /&gt;
next create a box and label this box *Clear*&lt;br /&gt;
and add the following script this will clear the scenes when you switch.&lt;br /&gt;
&lt;br /&gt;
Clear Label Script.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
float gap = 15.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(0, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now take this box to your Inventry.&lt;br /&gt;
&lt;br /&gt;
now create another box Called *Create* give this box full permissions and take into your inventry&lt;br /&gt;
now right click on your holodeck-&amp;gt;content and drag the *Clear* &amp;amp; *Create* boxes into the root prim.&lt;br /&gt;
wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
internal label script.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Configurable Settings&lt;br /&gt;
float fTimerInterval = 0.25; //Time in seconds between movement &#039;ticks&#039;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192; //Channel used by Base Prim to talk to Component Prims;&lt;br /&gt;
// This must match in both scripts&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Runtime Variables (Dont need to change below here unless making a derivative)&lt;br /&gt;
vector SceneOffset;&lt;br /&gt;
rotation SceneRotation;&lt;br /&gt;
integer SceneMove;&lt;br /&gt;
vector SceneDestPosition;&lt;br /&gt;
rotation SceneDestRotation;&lt;br /&gt;
integer SceneSaved = FALSE;&lt;br /&gt;
integer PROTOTYPE_VERSION = TRUE; // TRUE = Production, FALSE = Basic / NOMOD, NOCOPY NO TRANS Demo Box&lt;br /&gt;
integer PROTOTYPE_MESSAGE = TRUE;&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string first_word(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the first word in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the whole string.&lt;br /&gt;
    if(Token == &amp;quot;&amp;quot;) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, 0, pos - 1);&lt;br /&gt;
    else&lt;br /&gt;
        return In_String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string other_words(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
    //This routine searches for the other-than-first words in a string,&lt;br /&gt;
    // and returns it. If no word boundary found, returns&lt;br /&gt;
    // the an empty string.&lt;br /&gt;
    if( Token == &amp;quot;&amp;quot; ) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, pos + 1, llStringLength(In_String));&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
prototype_move()&lt;br /&gt;
{&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    vector SceneLastPosition = ZERO_VECTOR;&lt;br /&gt;
    while( (i &amp;lt; 5) &amp;amp;&amp;amp; (llGetPos() != SceneDestPosition) )&lt;br /&gt;
    {&lt;br /&gt;
        list lParams = [];&lt;br /&gt;
&lt;br /&gt;
        //If we&#039;re not there....&lt;br /&gt;
        if( llGetPos() != SceneDestPosition )&lt;br /&gt;
        {&lt;br /&gt;
            //We may be stuck on the ground...&lt;br /&gt;
            //Did we move at all compared to last loop?&lt;br /&gt;
            if( llGetPos() == SceneLastPosition )&lt;br /&gt;
            {&lt;br /&gt;
                //Yep, stuck...move straight up 10m (attempt to dislodge)&lt;br /&gt;
                lParams = [ PRIM_POSITION, llGetPos() + &amp;lt;0, 0, 10.0&amp;gt; ];&lt;br /&gt;
                //llSetPos(llGetPos() + &amp;lt;0, 0, 10.0&amp;gt;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //Record our spot for &#039;stuck&#039; detection&lt;br /&gt;
                SceneLastPosition = llGetPos();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //Try to move to destination&lt;br /&gt;
        integer iHops = llAbs(llCeil(llVecDist(llGetPos(), SceneDestPosition) / 10.0));&lt;br /&gt;
        integer x;&lt;br /&gt;
        for( x = 0; x &amp;lt; iHops; x++ ) {&lt;br /&gt;
            lParams += [ PRIM_POSITION, SceneDestPosition ];&lt;br /&gt;
        }&lt;br /&gt;
        llSetPrimitiveParams(lParams);&lt;br /&gt;
        //llSleep(0.1);&lt;br /&gt;
        ++i; // changed i++ too ++i credit goes to Simon Sugita for Speed Tweak :)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Set rotation&lt;br /&gt;
    llSetRot(SceneDestRotation);&lt;br /&gt;
}&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;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Open up the listener&lt;br /&gt;
        llListen(PROTOTYPE_SCRIPTS, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        //Set the channel to what&#039;s specified&lt;br /&gt;
        if( start_param != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_SCRIPTS = start_param;&lt;br /&gt;
            state reset_listeners;&lt;br /&gt;
        }&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;
        string command = llToUpper(first_word(message, &amp;quot; &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        if( command == &amp;quot;RECORD&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            SceneOffset = (llGetPos() - SceneVectorBase) / SceneRotationBase;&lt;br /&gt;
            SceneRotation = llGetRot() / SceneRotationBase;&lt;br /&gt;
            SceneSaved = TRUE;&lt;br /&gt;
            llOwnerSay(&amp;quot;Recorded position.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;MOVE&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
    &lt;br /&gt;
            //Don&#039;t move if we&#039;ve not yet recorded a position&lt;br /&gt;
            if( !SceneSaved ) return;&lt;br /&gt;
&lt;br /&gt;
            //Also ignore commands from bases with a different owner than us&lt;br /&gt;
            //(Anti-hacking measure)&lt;br /&gt;
            if( llGetOwner() != llGetOwnerKey(id) ) return;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            SceneDestPosition = (SceneOffset * SceneRotationBase) + SceneVectorBase;&lt;br /&gt;
            SceneDestRotation = SceneRotation * SceneRotationBase;&lt;br /&gt;
&lt;br /&gt;
            //Turn on our timer to perform the move?&lt;br /&gt;
            if( !SceneMove )&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(fTimerInterval);&lt;br /&gt;
                SceneMove = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;PHANTOM&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, turn phantom off&lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;DONE&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, remove script&lt;br /&gt;
            llRemoveInventory(llGetScriptName());&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;CLEAN&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            //Clean up&lt;br /&gt;
            llDie();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;FLUSH&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        //Turn ourselves off&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
&lt;br /&gt;
        //Do we need to move?&lt;br /&gt;
        if( SceneMove )&lt;br /&gt;
        {&lt;br /&gt;
            //Perform the move and clean up&lt;br /&gt;
            prototype_move();&lt;br /&gt;
            SceneMove = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state reset_listeners&lt;br /&gt;
{&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Package Scripts)&lt;br /&gt;
address script.lsl&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
float gap = 10.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
integer i;&lt;br /&gt;
integer iLine;&lt;br /&gt;
string item;&lt;br /&gt;
vector vThisPos;&lt;br /&gt;
rotation rThisRot;&lt;br /&gt;
&lt;br /&gt;
scene_entry()&lt;br /&gt;
{&lt;br /&gt;
    llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
    object = llGetObjectName();&lt;br /&gt;
    llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
    llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
       &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        scene_entry();&lt;br /&gt;
        vThisPos = llGetPos();&lt;br /&gt;
        rThisRot = llGetRot();&lt;br /&gt;
        iLine = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        for(i=0; i &amp;lt; iLine; i++)&lt;br /&gt;
        {&lt;br /&gt;
            item = llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            llSleep (1.00);&lt;br /&gt;
            llRezObject(item, vThisPos + &amp;lt;0.00, 0.00, 1.00&amp;gt;, ZERO_VECTOR, rThisRot, 0);&lt;br /&gt;
            llShout(PROTOTYPE_SCRIPTS, &amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            if (DEBUG) llShout (DEBUG_CHANNEL, &amp;quot;Rezzing &amp;quot; + item);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(DEBUG_CHANNEL, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;POSITION&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Builders Docs ==&lt;br /&gt;
&lt;br /&gt;
.::Prototype::. - Builders Manual&lt;br /&gt;
By Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
Welcome to the world of building with your Prototype System. Anyone wishing to build scenes for the Prototype needs to have a good understanding of building and texturing to succeed. Please read this manual through once fully and then as needed when you start building. This manual is divided into several sections:&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
Building scenes&lt;br /&gt;
Building Shells&lt;br /&gt;
Texture Card&lt;br /&gt;
Scene Creation&lt;br /&gt;
Tips&lt;br /&gt;
Packaging&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
The main thing to remember is any object you want to put in the Prototype scene/shell must be copy/mod at a minimum. The way the Prototype system works is by rezzing copies of an item from its inventory. These objects must be modified, adding a special script to make them work with the system scripts.&lt;br /&gt;
&lt;br /&gt;
There are two ways to build with the Prototype:&lt;br /&gt;
&lt;br /&gt;
# The linked scene&lt;br /&gt;
# The multi-item scene&lt;br /&gt;
&lt;br /&gt;
The linked scene is made from multiple objects and linked; the unlinked scene consists of a number or unlinked objects around the unit.&lt;br /&gt;
&lt;br /&gt;
A scene set will consist of the objects you create and a texture card. These will be explained in greater detail as we move along. The texture card must begin with tex_ or the system will not read them. Feel free to give your scenes a user friendly name, but only with letters, numbers, _ or – in the same name as the current scene we are building for.&lt;br /&gt;
&lt;br /&gt;
=== Building Scenes ===&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
# Create the objects you want in your scene and arrange them as you like&lt;br /&gt;
# Place a label script into each linked object or individual object you have set out in your scene &lt;br /&gt;
# Use /1000 SAVE to save the position and rotation of the current scene&lt;br /&gt;
# If you wish to modify the scene before repacking or move things around more, enter /1000 RESET and then follow step 3 again&lt;br /&gt;
# Next texture the walls, floor, and ceiling; set the repeats, etc. the way you want them&lt;br /&gt;
# Open the example tex_*Clear*, and go from prim to prim, and copy the info from the texture window to the notecard as explained above&lt;br /&gt;
# Name the suffix of the notecards something user friendly&lt;br /&gt;
# Right click on all the objects while holding the Ctrl key and choose edit; then take all the objects into your inventory&lt;br /&gt;
# Next, click on your control panel on the wall and press the *Create* button; this will prepare a package for your scene&lt;br /&gt;
# Now we will want to name the scene: right click this box, click edit, and fill in something friendly for your scene name and description&lt;br /&gt;
# Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts &lt;br /&gt;
# Drag the internal address script to the content tab of your inventory and drag the object from our scene that we took into our inventory earlier, copying this to the content tab; we now have all the requirements for loading scenes &lt;br /&gt;
# Right click on the Prototype floor panel, choose edit, check edit linked parts, then select the red area of the floor panel (inside the red field) and press Contents tab and drag the object package, and tex_package in there&lt;br /&gt;
# Type /1000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
# Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
=== Building Shells ===&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later, and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
# Create the objects you want as your Shell and arrange them as you like&lt;br /&gt;
# Place a external label script into each linked object or individual object you have set out as your prototype shell &lt;br /&gt;
# Use /2000 SAVE to save the position and rotation of the current shell; if you wish to modify the shell before repacking or move things around more enter /2000 RESET and then follow step 3 again&lt;br /&gt;
# Right click on all the object while holding the Ctrl key, edit and take all the objects into your inventory&lt;br /&gt;
# Next click on your control panel on the wall and press the *Create* button, preparing a package for your shell&lt;br /&gt;
# Now we will want to name the shell package: right click this box, edit it, and fill in something friendly for your shell name and description&lt;br /&gt;
# Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts&lt;br /&gt;
# Right click on the Prototype floor panel, go into edit, check edit link parts, then select the blue area of the floor panel (inside the blue field)&lt;br /&gt;
# Next go to the Content tab and drag the object package into it&lt;br /&gt;
# Type /2000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
# Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
=== Texture Card ===&lt;br /&gt;
The Prototype consists of eight wall, four ceiling, and four floor prims. The texture card has one line for each of these inner prim faces. The prims are named for their direction on the SL compass, and the name of each face on the texture card corresponds to these names. The card must begin with tex_xxx where xxx is the name of the scene, which must be the same name as will be given to the object card.&lt;br /&gt;
&lt;br /&gt;
Each line of the texture card has the following information:&lt;br /&gt;
&lt;br /&gt;
wall section#texture key#vector repeats#vector offsets#float rotation#vector color#float alpha&lt;br /&gt;
&lt;br /&gt;
Once it’s completed, it may look like the following:&lt;br /&gt;
&lt;br /&gt;
ene_wall#2eabe96c-2540-e1fa-ce7f-9030c3d958df#&amp;lt;1.5,1,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&lt;br /&gt;
Each of the items in the texture card must be separated by the symbol #&lt;br /&gt;
&lt;br /&gt;
*Wall Section*&lt;br /&gt;
The wall section name corresponds to the name given to each prim in the Prototype. Use the edit linked parts and then point to the prim, make a note of the wall name. Then go to the card and find the same line containing that wall name.&lt;br /&gt;
&lt;br /&gt;
*Texture Key*&lt;br /&gt;
This is the ID of the texture you are using. This texture must have full permissions. Right click on the prim, select texture, locate it in the list, then right click and copy UUID. Next paste this ID into the note card exactly between the ##.&lt;br /&gt;
&lt;br /&gt;
*Vector Repeats*&lt;br /&gt;
These numbers correspond to the horizontal/vertical repeats found in the texture tab in your edit window.  &lt;br /&gt;
&amp;lt;1.5,1,0&amp;gt;&lt;br /&gt;
The first number is horizontal repeats, the second one is vertical, the third is not used, so will always be 0. Please make sure that the numbers are separated with a comma or they will not work.&lt;br /&gt;
&lt;br /&gt;
*Vector Offsets*&lt;br /&gt;
This set of numbers corresponds to the horizontal/vertical offsets also found in the texture tab in the edit window. For most builds you will keep this set at NULL_VECTOR, since you can’t leave these numbers as 0,0,0. If you do need to offset a texture for some reason, you would replace NULL_VECTOR, with &amp;lt;.5,0,0&amp;gt;, again the first number in the set corresponds to the horizontal offset, the second for vertical offset, the third is not to be used, therefore is left at 0.&lt;br /&gt;
&lt;br /&gt;
*Float Rotation*&lt;br /&gt;
If the texture must be rotated for some reason on the prim face, you will enter that number in the float rotation section. In the example above it’s set at 90.0. Because of the location of some of the walls they will need to be set at 90.0 anyway.&lt;br /&gt;
&lt;br /&gt;
*Vector Color*&lt;br /&gt;
If you would like to tint the prim face, you will use this section. For walls that aren’t tinted, leave the numbers at 1,1,1 because this is equivalent to white/clear. 0,0,0 is black. Below are the basic colours, and included with the Prototype package is a full list of colours in SL format.&lt;br /&gt;
&lt;br /&gt;
Red, Green Blue&lt;br /&gt;
Number may go between 0.1 to 0.9 for each of the three colors&lt;br /&gt;
white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
*Float Alpha*&lt;br /&gt;
This corresponds to the amount of transparency, 1.0 being no transparency, 0.0 is full transparency.&lt;br /&gt;
&lt;br /&gt;
NOTE: One final word on textures. Make sure that when you reference a texture ID key, you keep that texture in your inventory.  If you delete it from inventory, after a while it will be deleted from the asset inventory SL keeps and won’t work anymore.&lt;br /&gt;
&lt;br /&gt;
That’s it for the texture note-card. It’s a little confusing in the beginning, but you will get the hang of it in no time. A demo note-card has been provided for you to use in what ever way you want. Just remember when naming the card, to use the tex_ prefix.&lt;br /&gt;
&lt;br /&gt;
=== Scene Creation ===&lt;br /&gt;
Depending on what you plan on using in your Prototype building, your scene will vary. Some people make their own furniture and other items for their scenes for their own use or for sale. Others use free items they have gathered around SL which have copy/mod permissions to build their scenes. The Prototype is perfect for personal homes, clubs, inns and hotels, skyboxes, anywhere you need to rez furniture. The wonderful thing is that you have multiple scenes stored in the Prototype and can change whenever you want, instead of having to keep dragging things from inventory. Or for those of you who don’t want to use all their prims on a home and 5 rooms, why not have one room with five scenes and a nice shell. There are places to purchase copy/mod pose balls for your scenes too.  &lt;br /&gt;
&lt;br /&gt;
=== Tips ===&lt;br /&gt;
Some tips when building items for your scenes:&lt;br /&gt;
&lt;br /&gt;
* Try to link as many prims together as they will load faster than ten smaller objects located around the box&lt;br /&gt;
* When placing objects keep in mind the location of the door&lt;br /&gt;
* When making an object that is an odd shape such as a torus, you may want to create a flat box prim below it, and link to that; it will save headaches later on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Packaging ===&lt;br /&gt;
When you decide to package the item for sale, make sure that you give copy rights to the next owner or they won’t be able to use it. It is also helpful to give full permissions on the texture. Ensure the name you give the object is user friendly, but also only contains letters, numbers _ or -. Don&#039;t forget to add the address script to each completed package.&lt;br /&gt;
&lt;br /&gt;
If you have any questions, please feel free to contact Revolution Perenti, and do join the .::Prototype::. Group you will receive updates of this manual and the scripts as they come out.  If you have any suggestions for this manual please feel free to let me know.&lt;br /&gt;
&lt;br /&gt;
Happy building!&lt;br /&gt;
&lt;br /&gt;
Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Holodeck Commands Quick Overview: ==&lt;br /&gt;
(.::Prototype 1.63::. should be replaced with what you called your root prim)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Commands Quick Guide&lt;br /&gt;
&lt;br /&gt;
// SCENE SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/1000 .::Prototype 1.63::.,CHANNEL,1001 (replace 1001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/1000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/1000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Prims Remaining on sim;&lt;br /&gt;
/1000 SIM&lt;br /&gt;
Prims Remaining on Parcel&lt;br /&gt;
/1000 PARCEL&lt;br /&gt;
Open or Close door;&lt;br /&gt;
/1000 DOOR&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/1000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/1000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/1000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/1000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/1000 EDIT&lt;br /&gt;
load weather type (this is future update and is reserved until beta testing is complete)&lt;br /&gt;
/1000 COMPATIBILITY Blizzard //replace Blizzard with weather type /snow, rain, blizzard, hail, storm, tornado&lt;br /&gt;
&lt;br /&gt;
// SHELL SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/2000 .::Prototype 1.63::.,CHANNEL,2001 (replace 2001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/2000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/2000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/2000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/2000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/2000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/2000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/2000 EDIT&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlemods.com www.dazzlemods.com] Open Source Section on our forum.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library|Holodeck}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=998342</id>
		<title>Dataserver API</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=998342"/>
		<updated>2010-08-12T04:39:22Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: /* How It Works */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
=Dataserver Framework=&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
&lt;br /&gt;
A common problem in SL is reading and parsing notecards by script. One application for this is so a script can be distributed as no-mod but still be configurable.&lt;br /&gt;
&lt;br /&gt;
The below framework demonstrates how to setup such an interface with very little work to retool.&lt;br /&gt;
&lt;br /&gt;
The default state reads the notecard and when it is done it activates the configuration state.&lt;br /&gt;
&lt;br /&gt;
===Testimonial===&lt;br /&gt;
&lt;br /&gt;
The most common problem I find is people asking about dataservers, reading from notecards to bypass variables within a notecard so you can release your script as nomod.&lt;br /&gt;
So I setup a simple system that I use time and time again that can be reused in any project.&lt;br /&gt;
The class itself is state based meaning the default state reads the notecard and then starts another state when the notecard is read and ready to use I explain this further below.&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string notecard_name = &amp;quot;configuration&amp;quot;;  // name of notecard goes here&lt;br /&gt;
&lt;br /&gt;
// internals&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer line;&lt;br /&gt;
key queryhandle;                   // to separate Dataserver requests&lt;br /&gt;
key notecarduuid;&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    queryhandle = llGetNotecardLine(notecard_name, line = 0);// request line&lt;br /&gt;
    notecarduuid = llGetInventoryKey(notecard_name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Config data loaded from notecard, with some sane defaults&lt;br /&gt;
integer channel = 1000;&lt;br /&gt;
string email_address = &amp;quot;revolution.perenti@skidzpartz.com&amp;quot;;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)         &lt;br /&gt;
    {&lt;br /&gt;
        // We want to reload channel notecard if it changed&lt;br /&gt;
        if (change &amp;amp; CHANGED_INVENTORY)&lt;br /&gt;
            if(notecarduuid != llGetInventoryKey(notecard_name))&lt;br /&gt;
                init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (query_id == queryhandle)&lt;br /&gt;
        {&lt;br /&gt;
            if (data != EOF)&lt;br /&gt;
            {   // not at the end of the notecard&lt;br /&gt;
                // yay!  Parsing time&lt;br /&gt;
                &lt;br /&gt;
                // pesky whitespace&lt;br /&gt;
                data = llStringTrim(data, STRING_TRIM_HEAD);&lt;br /&gt;
&lt;br /&gt;
                // is it a comment?&lt;br /&gt;
                if (llGetSubString (data, 0, 0) != &amp;quot;#&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    integer s = llSubStringIndex(data, &amp;quot;=&amp;quot;);&lt;br /&gt;
                    if(~s)//does it have an &amp;quot;=&amp;quot; in it?&lt;br /&gt;
                    {&lt;br /&gt;
                        string token = llToLower(llStringTrim(llDeleteSubString(data, s, -1), STRING_TRIM));&lt;br /&gt;
                        data = llStringTrim(llDeleteSubString(data, 0, s), STRING_TRIM);&lt;br /&gt;
&lt;br /&gt;
                        //Insert your token parsers here.&lt;br /&gt;
                        if (token == &amp;quot;email_address&amp;quot;)&lt;br /&gt;
                            email_address = data;&lt;br /&gt;
                        else if (token == &amp;quot;channel&amp;quot;)&lt;br /&gt;
                            channel = (integer)data;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                queryhandle = llGetNotecardLine(notecard_name, ++line);&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Notecard Data: &amp;quot; + data);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Done Reading Notecard&amp;quot;);&lt;br /&gt;
                state configuration ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state configuration&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(channel, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llShout(0, &amp;quot;Channel set to &amp;quot; + (string)channel);&lt;br /&gt;
        llShout(0, &amp;quot;Email set to &amp;quot; + (string)email_address);&lt;br /&gt;
    }   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Notecard==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
# This is the configuration file&lt;br /&gt;
channel = 1000&lt;br /&gt;
email_address = phoenixcms@hotmail.co.uk&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Lines that start with &amp;quot;#&amp;quot; are comments.&lt;br /&gt;
&lt;br /&gt;
==How It Works==&lt;br /&gt;
&lt;br /&gt;
The [[default]] [[state]] reads and parses all the lines in the notecard. As it reads the notecard it overwrites the default values with the values in the notecard. More specifically after each line has been validated and tokenized, the token is checked against supported tokens. If the token is supported the specific parser for the token is called, in the above example it is just a simple convert and copy. &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz - Open Source&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contact me in-world [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit our free scripts at our LSL scripts [http://www.dazzlemods.com www.dazzlemods.com] Open Source Section on our forum.&lt;br /&gt;
[http://slurl.com/secondlife/Skidz%20Isle/128/128/23 Skidz Isle]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Revolution_Perenti&amp;diff=105073</id>
		<title>User:Revolution Perenti</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Revolution_Perenti&amp;diff=105073"/>
		<updated>2008-10-20T05:07:55Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Who is Revolution Perenti?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Revolution.jpg]]&lt;br /&gt;
&lt;br /&gt;
My name is Revolution Perenti in second life im an Open Source Scripter for Second-Life &lt;br /&gt;
i enjoy programming, helping Residents within second life at [http://slurl.com/secondlife/Help%20Island%20Public/128/128/0 Help Island Public] and [http://slurl.com/secondlife/Skidz%20Isle/128/128/0 Skidz Isle Sandbox]&lt;br /&gt;
 &lt;br /&gt;
----&lt;br /&gt;
Previous Expierence:&lt;br /&gt;
I started c/c++ back in 1996 while working on game engine for a small project , creating the graphics libary, physics, networking &amp;amp; sound libarys for an open source toolkit i was developing.&lt;br /&gt;
i was providing an open source and free alternative allowing people to create the own games with little programming.&lt;br /&gt;
feature game editor, game engine source coder and viewer to play the final product.&lt;br /&gt;
near to the completeion of the project i was looking for a website to show case the game engine.&lt;br /&gt;
and dicovered a few good open source solutions postnuke, PHP-Nuke 6.5 , E107 and few others but i decided to stick with PHP-Nuke because i liked the community and like how simple the CMS was to use.&lt;br /&gt;
I then started learning PHP reading code created by Francisco Burzi and i started security my own site, rewriting and hacking the code. and got into it faily easy have expierence in C++ helped a great deal.&lt;br /&gt;
I came a very active part of the community and well established member of the community by creating add-ons, speed enhancements by rewrite the core code of the CMS, introducing cache of php scripts and database queries.&lt;br /&gt;
and later i was providing offical fixes which also were added to the main release of PHP-Nuke.&lt;br /&gt;
after i had a good understanding of PHP &amp;amp; MYSQL i started looking into java, ruby and use them all now to this day.&lt;br /&gt;
Last year i was hired by Francisco Burzi to create and work on PHP-Nuke i was able to improve the CMS at Developers Level and not based on contributions by the community.&lt;br /&gt;
&lt;br /&gt;
since then im mostly freelancing and scripting for Open Source sometimes I&#039;am hired by big and small companys and i done alot of web work and have prety good track record.&lt;br /&gt;
&lt;br /&gt;
Currently as to this date im working in Second Life by supporting the community in world, creating Tools to help residents build, script and provide help in many Second-Life scripting groups.&lt;br /&gt;
&lt;br /&gt;
I also devloping my own Open Source Social Network as PHP-Nuke project has its limtations and now time to start developing and building my own community with the skills and knowedge that i have learnt over the years and using strict standards in the latest php release using object originated programming using classes and namespaces building the system around a framework of reusable code.&lt;br /&gt;
&lt;br /&gt;
for latests release of Skidz Partz Open Source scripts at [http://slurl.com/secondlife/Snow%20Crash/128/128/23 Skidz Partz - Snow Crash]&lt;br /&gt;
&lt;br /&gt;
or join our group Skidz Partz - Open Source &lt;br /&gt;
&lt;br /&gt;
Thanks to everyone @ [http://lindenlabs.com Linden Labs] for making Second Life Possible&lt;br /&gt;
&lt;br /&gt;
{{visl&lt;br /&gt;
|Mentors=*&lt;br /&gt;
|}}&lt;br /&gt;
{{ISO 639-3/cat-speaking/Volunteers|spa}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=File:Revolution.jpg&amp;diff=105053</id>
		<title>File:Revolution.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=File:Revolution.jpg&amp;diff=105053"/>
		<updated>2008-10-20T03:42:31Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: uploaded a new version of &amp;quot;Image:Revolution.jpg&amp;quot;: Revolution Perenti &amp;amp; EmilyRose Welles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=57976</id>
		<title>Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=57976"/>
		<updated>2008-03-10T15:46:05Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
== What is a Holodeck? ==&lt;br /&gt;
&lt;br /&gt;
A Holodeck is a product used to save different forms of content (either furniture settings or even an entire environment), similar to &#039;Holodecks&#039; used in various sci-fi television shows and movies. For Second Life purposes, a holodeck allows you to rez a large variety of rooms or scenarios in limited space. Some systems even allow the scene to be located far away from its control panel, offering the convenience of large, rez-on-demand structures without tying up a large space in your house.&lt;br /&gt;
&lt;br /&gt;
=== A handful of the known holodeck and panocube products: ===&lt;br /&gt;
(Please add to this list as you come across other holodeck-type products!)&lt;br /&gt;
&lt;br /&gt;
* The &#039;Holodeck&#039; by Loki Clifton&lt;br /&gt;
* &#039;Horizons&#039; by Cheshyr Pontchartrain&lt;br /&gt;
* &#039;HyperCube&#039; by D-VTech&lt;br /&gt;
* &#039;Super Sofa&#039; by LayZeeBones&lt;br /&gt;
* &#039;Holodeck&#039; by Soulmates Creations&lt;br /&gt;
* &#039;Paradise Blanket&#039; by OctoberWerks&lt;br /&gt;
* &#039;HoloRez&#039; by HoloRez Rang&lt;br /&gt;
* &#039;Skyboxer&#039; by Ethereal Fremont&lt;br /&gt;
* &#039;Primitizer&#039; by Revolution Parenti&lt;br /&gt;
* &#039;The Titan&#039; by Jack Hathor&lt;br /&gt;
* &#039;Room Switch&#039; by Fluid Creations&lt;br /&gt;
* &#039;The Green Wonder&#039; by Tina Freund&lt;br /&gt;
* &#039;Holodeck&#039; by Professor Eisenberg (Panocube)&lt;br /&gt;
* &#039;The Virtual Reality Room&#039; by Stephane Zugzwang (Panocube)&lt;br /&gt;
&lt;br /&gt;
A holodeck-panocube consists of photos. The picture changes on every wall, plus the floor and ceiling, making a total immersed &amp;quot;single&amp;quot; image. A regular holodeck will rezz and derezz prims such as different houses with furniture, and might rezz surrounding panocube images in addition.&lt;br /&gt;
&lt;br /&gt;
You can also find information on an Open Source Holodeck type Product here:&lt;br /&gt;
&lt;br /&gt;
What is a Holodeck?&lt;br /&gt;
&lt;br /&gt;
A Holodeck stores Second Life scenes and lets you load them from a menu when ever you want. The old scene is cleared and the new one appears. Scenes can include any prim objects including furniture, pose balls and particle generators. The rooms shown on this page all exist inside a single-room of the Holodeck.&lt;br /&gt;
&lt;br /&gt;
The Scripts for the holodeck may look complex but once you done it correcly everything is very easy to setup and use and just build almost like you normally would within sl&lt;br /&gt;
&lt;br /&gt;
Creating the holodeck, the best way to start would be to create a 20x20x10 shell this would be your rezzing area for the holodeck&lt;br /&gt;
&lt;br /&gt;
once you done this you should have something similar to the picture below&lt;br /&gt;
&lt;br /&gt;
[[Image:holodeck shell.jpg]]&lt;br /&gt;
&lt;br /&gt;
ok next we create a small panel for the floor 0.500x0.500x0.100 and link this to your holodeck shell make sure this is the last object you link to the holodeck shell as this becomes the root prim&lt;br /&gt;
&lt;br /&gt;
see example below&lt;br /&gt;
&lt;br /&gt;
[[Image:floor panel.jpg]]&lt;br /&gt;
&lt;br /&gt;
The Scripts&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Holodeck Core.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// User Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//How long to listen for a menu response before shutting down the listener&lt;br /&gt;
float fListenTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//How often (in seconds) to check for change in position when moving&lt;br /&gt;
float fMovingRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
//How long to sit still before exiting active mode&lt;br /&gt;
float fStoppedTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//Minimum amount of time (in seconds) between movement updates&lt;br /&gt;
float fShoutRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
// label script name used for debug and PrototypeSay();&lt;br /&gt;
string label = &amp;quot;internal label&amp;quot;;&lt;br /&gt;
// Channel used by Prototype&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer MENU_CHANNEL;&lt;br /&gt;
integer MENU_HANDLE;&lt;br /&gt;
string PROTOTYPE_CREATOR;&lt;br /&gt;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
integer PROTOTYPE_RESET = -68195;&lt;br /&gt;
integer SHOW_MENU = -68194;&lt;br /&gt;
// Channel used by Prototype to talk to label scripts&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
// Feature Manager&lt;br /&gt;
integer PROTOTYPE_TEXTURE = TRUE;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Security Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
integer PROTOTYPE_ALLOW_IM = FALSE;&lt;br /&gt;
string  PROTOTYPE_EMAIL = &amp;quot;phoenixcms@hotmail.co.uk&amp;quot;;&lt;br /&gt;
string  PROTOTYPE_OWNER;&lt;br /&gt;
vector  Where;&lt;br /&gt;
string  Name;&lt;br /&gt;
string  SLURL;&lt;br /&gt;
integer X;&lt;br /&gt;
integer Y;&lt;br /&gt;
integer Z;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Menu System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Compatibility System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list objectSettings = [];&lt;br /&gt;
integer stride = 3;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
string COMPATIBILITY_NOTECARD = &amp;quot;compatibility&amp;quot;; //[objectname];&amp;lt;position&amp;gt;;&amp;lt;rotation&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DO NOT EDIT BELOW THIS LINE.... NO.. NOT EVEN THEN&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer PrototypeBaseMoving;&lt;br /&gt;
vector PrototypeLastPosition;&lt;br /&gt;
rotation PrototypeLastRotation;&lt;br /&gt;
integer iListenTimeout = 0;&lt;br /&gt;
&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//To avoid flooding the sim with a high rate of movements&lt;br /&gt;
//(and the resulting mass updates it will bring), we used&lt;br /&gt;
// a short throttle to limit ourselves&lt;br /&gt;
prototype_moved()&lt;br /&gt;
{&lt;br /&gt;
    llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ llGetPos(), llGetRot() ], &amp;quot;|&amp;quot;));&lt;br /&gt;
    llResetTime(); //Reset our throttle&lt;br /&gt;
    PrototypeLastPosition = llGetPos();&lt;br /&gt;
    PrototypeLastRotation = llGetRot();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    iListenTimeout = llGetUnixTime() + llFloor(fListenTime);&lt;br /&gt;
    MENU_CHANNEL = llFloor(llFrand(-99999.0 - -100));&lt;br /&gt;
    MENU_HANDLE = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;www.sl-prototype.com: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
    llSetTimerEvent(fShoutRate);&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;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER || CHANGED_INVENTORY)&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry () &lt;br /&gt;
    {&lt;br /&gt;
        // Lets open our listen channel&lt;br /&gt;
        key_listen = llListen(PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;LISTEN ON CHANNEL &amp;quot; +(string)PROTOTYPE_CHANNEL);&lt;br /&gt;
        // Compatibility System Notecard&lt;br /&gt;
        llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        //Record our position&lt;br /&gt;
        PrototypeLastPosition = llGetPos();&lt;br /&gt;
        PrototypeLastRotation = llGetRot();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    dataserver(key queryId, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            objectSettings += llParseString2List(data, [&amp;quot;;&amp;quot;], []);&lt;br /&gt;
            iLine++;&lt;br /&gt;
            llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Done Reading Compatibility Notecard &amp;quot; + COMPATIBILITY_NOTECARD);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number==SHOW_MENU) {&lt;br /&gt;
            MENU1 = [];&lt;br /&gt;
            MENU2 = [];&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
                MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            Dialog(id, MENU1);&lt;br /&gt;
        }&lt;br /&gt;
        if (number==PROTOTYPE_RESET) {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Forgetting positions...&amp;quot;);&lt;br /&gt;
            llPrototypeSay(&amp;quot;RESET&amp;quot;);&lt;br /&gt;
        }&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;
        list compatibility = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        PROTOTYPE_CREATOR = llGetCreator();&lt;br /&gt;
        //&lt;br /&gt;
        if ( command == llToLower(&amp;quot;CHANNEL&amp;quot;) || command == llToUpper(&amp;quot;CHANNEL&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)PROTOTYPE_CHANNEL );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;MESSAGE&amp;quot;) || command == llToUpper(&amp;quot;MESSAGE&amp;quot;))  &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_MESSAGE = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;PROTOTYPE MESSAGE set to &amp;quot; + (string)PROTOTYPE_MESSAGE );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // OPEN / CLOSE DOOR    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;DOOR&amp;quot;) || message == llToUpper(&amp;quot;DOOR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, PROTOTYPE_DOOR, &amp;quot;&amp;quot;,NULL_KEY );&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Setting Door Permissions...&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        // SET COMPATIBILITY&lt;br /&gt;
        if(llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;) || llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            string object = llList2String(compatibility, 1);&lt;br /&gt;
            integer indexInSettings = llListFindList(objectSettings, [object]);&lt;br /&gt;
            if(indexInSettings &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                vector pos = (vector)llList2String(objectSettings, indexInSettings + 1);&lt;br /&gt;
                rotation rot = (rotation)llList2String(objectSettings, indexInSettings + 2);&lt;br /&gt;
                llRezAtRoot(object, pos + llGetPos(), ZERO_VECTOR, rot, 0);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // LOAD MENU SYSTEM    &lt;br /&gt;
        if (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                //Loop through backwards (safety precaution in case of inventory change)&lt;br /&gt;
                if (DEBUG) llDebugSay(&amp;quot;Loading build pieces please wait...&amp;quot;);&lt;br /&gt;
                llRezAtRoot(message, llGetPos() + &amp;lt;0.00, 0.00, 0.30&amp;gt;, ZERO_VECTOR, llGetRot(), PROTOTYPE_CHANNEL);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // REPOSTION SCENE    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;POSITION&amp;quot;) || message == llToUpper(&amp;quot;POSITION&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Positioning&amp;quot;);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // CLEAR SCENE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;CLEAR&amp;quot;) || message == llToUpper(&amp;quot;CLEAR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;CLEAN&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if( message == llToLower(&amp;quot;HOLODECKDIE&amp;quot;) || message == llToUpper(&amp;quot;HOLODECKDIE&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            if(PROTOTYPE_CREATOR) llDie();&lt;br /&gt;
        }&lt;br /&gt;
        // DISABLE PHANTOM AS WE ARE NOW DONE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;NOPHANTOM&amp;quot;) || message == llToUpper(&amp;quot;NOPHANTOM&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;PHANTOM&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Disabled Phantom&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    moving_start() //StartPrototype&lt;br /&gt;
    {&lt;br /&gt;
        if( !PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            PrototypeBaseMoving = TRUE;&lt;br /&gt;
            llSetTimerEvent(0.0); //Resets the timer if already running&lt;br /&gt;
            llSetTimerEvent(fMovingRate);&lt;br /&gt;
            prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer() &lt;br /&gt;
    {&lt;br /&gt;
        //Were we moving?&lt;br /&gt;
        if( PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            //Did we change position/rotation?&lt;br /&gt;
            if( (llGetRot() != PrototypeLastRotation) || (llGetPos() != PrototypeLastPosition) )&lt;br /&gt;
            {&lt;br /&gt;
                if( llGetTime() &amp;gt; fShoutRate ) {&lt;br /&gt;
                    prototype_moved();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
        // Have we been sitting long enough to consider ourselves stopped?&lt;br /&gt;
            if( llGetTime() &amp;gt; fStoppedTime )&lt;br /&gt;
            PrototypeBaseMoving = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Open listener?&lt;br /&gt;
        if( iListenTimeout != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            //Past our close timeout?&lt;br /&gt;
            if( iListenTimeout &amp;lt;= llGetUnixTime() )&lt;br /&gt;
            {&lt;br /&gt;
                iListenTimeout = 0;&lt;br /&gt;
                llListenRemove(MENU_HANDLE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Stop the timer?&lt;br /&gt;
        if( (iListenTimeout == 0) &amp;amp;&amp;amp; ( !PrototypeBaseMoving ) )&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Stopping Timer&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    } // END TIMER FUNCTION&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        PROTOTYPE_OWNER = llGetOwner();&lt;br /&gt;
        //Name = llGetRegionName();&lt;br /&gt;
        Name = llDumpList2String(llParseString2List(llGetRegionName(),[&amp;quot; &amp;quot;],[]),&amp;quot;_&amp;quot;);&lt;br /&gt;
        Where = llGetPos();&lt;br /&gt;
&lt;br /&gt;
        X = (integer)Where.x;&lt;br /&gt;
        Y = (integer)Where.y;&lt;br /&gt;
        Z = (integer)Where.z;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // I don&#039;t replace any spaces in Name with %20 and so forth.&lt;br /&gt;
&lt;br /&gt;
        SLURL = &amp;quot;http://slurl.com/secondlife/&amp;quot; + Name + &amp;quot;/&amp;quot; + (string)X + &amp;quot;/&amp;quot; + (string)Y + &amp;quot;/&amp;quot; + (string)Z + &amp;quot;/?title=&amp;quot; + Name;&lt;br /&gt;
&lt;br /&gt;
        llEmail(PROTOTYPE_EMAIL, llKey2Name(PROTOTYPE_OWNER), SLURL + &amp;quot;\nRegistered user =&amp;quot; + llKey2Name(PROTOTYPE_OWNER) + &amp;quot;Registered user key =&amp;quot; + PROTOTYPE_OWNER);&lt;br /&gt;
        if(PROTOTYPE_ALLOW_IM) {&lt;br /&gt;
            llInstantMessage(llGetCreator(), SLURL);&lt;br /&gt;
        }&lt;br /&gt;
        // Reset ourselves&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Texture Engine.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
string TEXTURE_NOTECARD;&lt;br /&gt;
string prefix = &amp;quot;tex_&amp;quot;;&lt;br /&gt;
key TextureQuery;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
integer DEBUG = FALSE; // debug channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
default {&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        TEXTURE_NOTECARD = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + TEXTURE_NOTECARD);&lt;br /&gt;
        TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        list texture = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            TEXTURE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)TEXTURE_CHANNEL);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(llList2String(texture, 0) == &amp;quot;image&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            iLine = 0;&lt;br /&gt;
            TEXTURE_NOTECARD = llList2String(texture, 1);&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////        &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == TextureQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data != EOF &amp;amp;&amp;amp; prefix == &amp;quot;tex_&amp;quot;) {    &lt;br /&gt;
            &lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);&lt;br /&gt;
                llMessageLinked(LINK_SET,0,data,NULL_KEY);&lt;br /&gt;
&lt;br /&gt;
                // increment line count                 &lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                ++iLine;&lt;br /&gt;
                TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Done reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Notecards&lt;br /&gt;
&lt;br /&gt;
*Clear* Notecard for default Clear Scene &lt;br /&gt;
(note the first line of texture notecards is object name so make sure you name all floor panels, roof and walls with unique name and edit the notecard as required add each object line to a new line as required.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Object_Name#2f78ee38-9aca-f8d1-5306-458beab181f9#&amp;lt;3.0,1.0,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
compatibility notecard leave this blank at current its planned as future feature to allow weather inside the holodeck and was the old rez system from early beta but we left it here to be reused later on.&lt;br /&gt;
&lt;br /&gt;
Walls, Floor,Roof texture,particles,sound &amp;amp; locate system&lt;br /&gt;
needs to be added to every object you wish to texture each object needs a unique name too for better control of textures&lt;br /&gt;
System.lsl (updated to 2.0.2)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Skidz Partz - Open Source Holodeck Version (2.0.1)&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// Debug&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
&lt;br /&gt;
// Sound System&lt;br /&gt;
list SOUND_VALUES;&lt;br /&gt;
integer SOUND_TYPE;&lt;br /&gt;
string SOUND_UUID;&lt;br /&gt;
float SOUND_VOLUME;&lt;br /&gt;
// Texture System&lt;br /&gt;
list TEXTURE_VALUES;&lt;br /&gt;
string HOLODECK_OBJECTNAME;&lt;br /&gt;
string TEXTURE_UID;&lt;br /&gt;
vector TEXTURE_REPEATS;&lt;br /&gt;
vector TEXTURE_OFFSETS;&lt;br /&gt;
float TEXTURE_ROTATE;&lt;br /&gt;
vector TEXTURE_COLOR;&lt;br /&gt;
float TEXTURE_ALPHA;&lt;br /&gt;
&lt;br /&gt;
// Lighting System&lt;br /&gt;
list LIGHT_VALUES;&lt;br /&gt;
integer  LIGHT_STATUS;&lt;br /&gt;
// Color of the light (RGB - each value between 0.0 and 1.0)&lt;br /&gt;
vector LIGHT_COLOR;&lt;br /&gt;
// Intensity of the light (values from 0.0 .. 1.0)&lt;br /&gt;
float  LIGHT_LEVEL;&lt;br /&gt;
// Radius of light cone&lt;br /&gt;
float  LIGHT_DISTANCE;&lt;br /&gt;
// Fall off (distance/intensity decrease) values from 0.0 ..1.0&lt;br /&gt;
float  LIGHT_FALLOFF;&lt;br /&gt;
&lt;br /&gt;
// Particle System&lt;br /&gt;
integer PARTICLE_FLAGS;&lt;br /&gt;
//&lt;br /&gt;
list PARTICLE_VALUES;&lt;br /&gt;
key PARTICLE_SRC_TARGET_KEY = &amp;quot;&amp;quot;;&lt;br /&gt;
string PARTICLE_SRC_TEXTURE = &amp;quot;&amp;quot;;&lt;br /&gt;
float PARTICLE_SRC_MAX_AGE;&lt;br /&gt;
float PARTICLE_PART_MAX_AGE;&lt;br /&gt;
float PARTICLE_BURST_RATE;&lt;br /&gt;
integer PARTICLE_BURST_PART_COUNT;&lt;br /&gt;
float PARTICLE_BURST_RADIUS;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MAX;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MIN;&lt;br /&gt;
float PARTICLE_START_ALPHA;&lt;br /&gt;
float PARTICLE_END_ALPHA;&lt;br /&gt;
float PARTICLE_INNERANGLE;&lt;br /&gt;
float PARTICLE_OUTERANGLE;&lt;br /&gt;
vector PARTICLE_START_COLOR;&lt;br /&gt;
vector PARTICLE_END_COLOR;&lt;br /&gt;
vector PARTICLE_START_SCALE;&lt;br /&gt;
vector PARTICLE_END_SCALE;&lt;br /&gt;
vector PARTICLE_ACCEL;&lt;br /&gt;
vector PARTICLE_OMEGA;&lt;br /&gt;
integer PARTICLE_SRC_PATTERN;&lt;br /&gt;
// Link Messages Channels&lt;br /&gt;
integer RESET_SCRIPTS = 0x2F34B;&lt;br /&gt;
integer HOLODECK_LIGHT            = 0x2F34C;&lt;br /&gt;
integer HOLODECK_TEXTURE            = 0x2F34D;&lt;br /&gt;
integer LOCATE_LIGHT = 0x2F34E;&lt;br /&gt;
integer LOCATE_TEXTURE = 0x2F34F;&lt;br /&gt;
integer HOLODECK_PARTICLE = 0x2F350;&lt;br /&gt;
integer HOLODECK_SOUND = 0x2F351;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector eul = &amp;lt;0.00, 0.00, 0.00&amp;gt;;&lt;br /&gt;
        eul *= DEG_TO_RAD;&lt;br /&gt;
        rotation quat = llEuler2Rot( eul );&lt;br /&gt;
        llSetRot( quat );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sent,integer num,string message,key id)&lt;br /&gt;
    {&lt;br /&gt;
    if (num == RESET_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
        llOwnerSay(&amp;quot;Resetting Holodeck Defaults&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_SOUND)&lt;br /&gt;
    {&lt;br /&gt;
        SOUND_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(SOUND_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            SOUND_TYPE = (integer)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_UUID = (string)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_VOLUME = (float)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            &lt;br /&gt;
            // Sound Change&lt;br /&gt;
            if(SOUND_TYPE == 1) &lt;br /&gt;
            { &lt;br /&gt;
               llPlaySound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 2) &lt;br /&gt;
            { &lt;br /&gt;
               llLoopSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 3) &lt;br /&gt;
            { &lt;br /&gt;
               llTriggerSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
                                                            &lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_TEXTURE)&lt;br /&gt;
    {&lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            &lt;br /&gt;
            //list conversions&lt;br /&gt;
            string LOCATE_TEXTURE_UID = llGetTexture(0);&lt;br /&gt;
            vector LOCATE_TEXTURE_REPEATS = llList2Vector(llGetPrimitiveParams([PRIM_TEXTURE,0]),1);&lt;br /&gt;
            vector LOCATE_TEXTURE_OFFSETS = llGetTextureOffset(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ROTATE = llGetTextureRot(0) * DEG_TO_RAD;&lt;br /&gt;
            vector LOCATE_TEXTURE_COLOR = llGetColor(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ALPHA = llGetAlpha(0);&lt;br /&gt;
                        &lt;br /&gt;
             llSay(0, (string)HOLODECK_GETOBJECTNAME+(string)&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_UID+                          // name&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_REPEATS+                      // repeats&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_OFFSETS+                      // offsets&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ROTATE+                       // rotation&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_COLOR+                      // color&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ALPHA);                     // alpha     &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_LIGHT)&lt;br /&gt;
    {          &lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            list LOCATE_PRIM_POINT_LIGHT =  llGetPrimitiveParams([PRIM_POINT_LIGHT]);&lt;br /&gt;
            list LOCATE_STATUS = ([&amp;quot;FALSE&amp;quot;,&amp;quot;TRUE&amp;quot;]);&lt;br /&gt;
            vector LIGHT_COLOR; &lt;br /&gt;
    &lt;br /&gt;
     // output the notecard to chat&lt;br /&gt;
     llSay(0, &amp;quot;locating Lighting Values for &amp;quot; + (string)HOLODECK_GETOBJECTNAME);&lt;br /&gt;
     llSleep(3);&lt;br /&gt;
     llSay(0, (string)HOLODECK_GETOBJECTNAME +                                                // Object Name&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2String(LOCATE_STATUS ,llList2Integer(LOCATE_PRIM_POINT_LIGHT,0)) + // Light Status&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2Vector(LOCATE_PRIM_POINT_LIGHT,1) +                                // Color&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,2) +                                  // Level&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,3) +                                  // Distance&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,4));                                  // falloff&lt;br /&gt;
     LOCATE_PRIM_POINT_LIGHT = [];   &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_LIGHT)&lt;br /&gt;
    {&lt;br /&gt;
        LIGHT_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            LIGHT_STATUS = (integer)llList2String(LIGHT_VALUES,1);&lt;br /&gt;
            LIGHT_COLOR = (vector)llList2String(LIGHT_VALUES,2);&lt;br /&gt;
            LIGHT_LEVEL = (float)llList2String(LIGHT_VALUES,3);&lt;br /&gt;
            LIGHT_DISTANCE = (float)llList2String(LIGHT_VALUES,4);&lt;br /&gt;
            LIGHT_FALLOFF = (float)llList2String(LIGHT_VALUES,5);&lt;br /&gt;
&lt;br /&gt;
            // Lighting Change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_POINT_LIGHT, LIGHT_STATUS, LIGHT_COLOR, LIGHT_LEVEL, LIGHT_DISTANCE, LIGHT_FALLOFF]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
    else if (num == HOLODECK_TEXTURE)&lt;br /&gt;
    {    &lt;br /&gt;
        TEXTURE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            TEXTURE_UID = llList2String(TEXTURE_VALUES,1);&lt;br /&gt;
            TEXTURE_REPEATS = (vector)llList2String(TEXTURE_VALUES,2);&lt;br /&gt;
            TEXTURE_OFFSETS = (vector)llList2String(TEXTURE_VALUES,3);&lt;br /&gt;
            TEXTURE_ROTATE = ((float)llList2String(TEXTURE_VALUES,4)) * DEG_TO_RAD;&lt;br /&gt;
            TEXTURE_COLOR = (vector)llList2String(TEXTURE_VALUES,5);&lt;br /&gt;
            TEXTURE_ALPHA = (float)llList2String(TEXTURE_VALUES,6);&lt;br /&gt;
            &lt;br /&gt;
            //texture change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_TEXTURE,0,TEXTURE_UID,TEXTURE_REPEATS,TEXTURE_OFFSETS,TEXTURE_ROTATE]);&lt;br /&gt;
            llSetPrimitiveParams([PRIM_COLOR,0,TEXTURE_COLOR,TEXTURE_ALPHA]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else if (num == HOLODECK_PARTICLE)&lt;br /&gt;
    {&lt;br /&gt;
        PARTICLE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(PARTICLE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            PARTICLE_PART_MAX_AGE = (float)llList2String(PARTICLE_VALUES,1);&lt;br /&gt;
            PARTICLE_FLAGS = (integer)llList2String(PARTICLE_VALUES,2);&lt;br /&gt;
            PARTICLE_START_COLOR = (vector)llList2String(PARTICLE_VALUES,3);&lt;br /&gt;
            PARTICLE_END_COLOR = (vector)llList2String(PARTICLE_VALUES,4);&lt;br /&gt;
            PARTICLE_START_SCALE = (vector)llList2String(PARTICLE_VALUES,5);&lt;br /&gt;
            PARTICLE_END_SCALE = (vector)llList2String(PARTICLE_VALUES,6);&lt;br /&gt;
            PARTICLE_SRC_PATTERN = (integer)llList2String(PARTICLE_VALUES,7);&lt;br /&gt;
            PARTICLE_BURST_RATE = (float)llList2String(PARTICLE_VALUES,8);&lt;br /&gt;
            PARTICLE_ACCEL = (vector)llList2String(PARTICLE_VALUES,9);&lt;br /&gt;
            PARTICLE_BURST_PART_COUNT = (integer)llList2String(PARTICLE_VALUES,10);&lt;br /&gt;
            PARTICLE_BURST_RADIUS = (float)llList2String(PARTICLE_VALUES,11);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MIN = (float)llList2String(PARTICLE_VALUES,12);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MAX = (float)llList2String(PARTICLE_VALUES,13);&lt;br /&gt;
            PARTICLE_INNERANGLE = (float)llList2String(PARTICLE_VALUES,14);&lt;br /&gt;
            PARTICLE_OUTERANGLE = (float)llList2String(PARTICLE_VALUES,15);&lt;br /&gt;
            PARTICLE_OMEGA = (vector)llList2String(PARTICLE_VALUES,16);&lt;br /&gt;
            PARTICLE_SRC_MAX_AGE = (float)llList2String(PARTICLE_VALUES,17);&lt;br /&gt;
            PARTICLE_START_ALPHA = (float)llList2String(PARTICLE_VALUES,18);&lt;br /&gt;
            PARTICLE_END_ALPHA = (float)llList2String(PARTICLE_VALUES,19);&lt;br /&gt;
            PARTICLE_SRC_TEXTURE = (string)llList2String(PARTICLE_VALUES,20);&lt;br /&gt;
            llSleep(1.5);&lt;br /&gt;
            // Particle Change&lt;br /&gt;
            llParticleSystem([  &lt;br /&gt;
                        PSYS_PART_MAX_AGE, PARTICLE_PART_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_FLAGS, PARTICLE_FLAGS,&lt;br /&gt;
                        PSYS_PART_START_COLOR, PARTICLE_START_COLOR,&lt;br /&gt;
                        PSYS_PART_END_COLOR, PARTICLE_END_COLOR,&lt;br /&gt;
                        PSYS_PART_START_SCALE, PARTICLE_START_SCALE,&lt;br /&gt;
                        PSYS_PART_END_SCALE, PARTICLE_END_SCALE,&lt;br /&gt;
                        PSYS_SRC_PATTERN, PARTICLE_SRC_PATTERN,&lt;br /&gt;
                        PSYS_SRC_BURST_RATE,PARTICLE_BURST_RATE,&lt;br /&gt;
                        PSYS_SRC_ACCEL,PARTICLE_ACCEL,&lt;br /&gt;
                        PSYS_SRC_BURST_PART_COUNT,PARTICLE_BURST_PART_COUNT,&lt;br /&gt;
                        PSYS_SRC_BURST_RADIUS,PARTICLE_BURST_RADIUS,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MIN,PARTICLE_BURST_SPEED_MIN,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MAX,PARTICLE_BURST_SPEED_MAX,&lt;br /&gt;
                        PSYS_SRC_ANGLE_BEGIN,PARTICLE_INNERANGLE,&lt;br /&gt;
                        PSYS_SRC_ANGLE_END,PARTICLE_OUTERANGLE,&lt;br /&gt;
                        PSYS_SRC_OMEGA,PARTICLE_OMEGA,&lt;br /&gt;
                        PSYS_SRC_MAX_AGE,PARTICLE_SRC_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_START_ALPHA,PARTICLE_START_ALPHA,&lt;br /&gt;
                        PSYS_PART_END_ALPHA,PARTICLE_END_ALPHA,&lt;br /&gt;
                        PSYS_SRC_TEXTURE, PARTICLE_SRC_TEXTURE,&lt;br /&gt;
                        PSYS_SRC_TARGET_KEY,PARTICLE_SRC_TARGET_KEY &lt;br /&gt;
                            ]);                         &lt;br /&gt;
        }            &lt;br /&gt;
    }&lt;br /&gt;
    if(DEBUG) llOwnerSay(&amp;quot;This Script Name &amp;quot; + (string)llGetScriptName() + &amp;quot;In Object Name &amp;quot; + (string)llGetObjectName() +  &amp;quot;used &amp;quot; + (string)((16384 - llGetFreeMemory())/1024) + &amp;quot; kBytes&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Door Script to be places in one of the prims where you would like a door, this does a hollow effect to give the impression of the door and is controlled with link messages.&lt;br /&gt;
&lt;br /&gt;
Door System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message( integer sender, integer msg, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == PROTOTYPE_DOOR) {&lt;br /&gt;
            list open = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
            string open2 = llList2String(open, 3);&lt;br /&gt;
            if (llGetSubString(open2,0,2) != &amp;quot;0.0&amp;quot;)&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.0,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
            else&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.95,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
next we create a 0.500x0.500x0.100 box this is used for control panel&lt;br /&gt;
now link this to your holodeck shell linking the shell last becuase we want to keep the root prim intact i normally put this just to the side of the door but you can put this anywhere you like.&lt;br /&gt;
&lt;br /&gt;
Next right click select edit link parts and select the switch now we add the menu functions scripts.&lt;br /&gt;
&lt;br /&gt;
Menu System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list csv_commands;&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
integer SCENEMENU = -68194;&lt;br /&gt;
key agent;&lt;br /&gt;
key objectowner;&lt;br /&gt;
integer group;&lt;br /&gt;
// Set to TRUE to allow group members to use the dialog menu&lt;br /&gt;
// Set to FALSE to disallow group members from using the dialog menu&lt;br /&gt;
integer ingroup = 0;&lt;br /&gt;
integer DEBUG = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay(&amp;quot;Current chanel: &amp;quot;+(string)P_channel);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(command == llToLower(&amp;quot;PERMS&amp;quot;) || message == llToUpper(&amp;quot;PERMS&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            ingroup = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;ingroup set to &amp;quot; + (string)ingroup);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    } // end listen();&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   &lt;br /&gt;
        group = llDetectedGroup(0); // Is the Agent in the objowners group?&lt;br /&gt;
        agent = llDetectedKey(0); // Agent&#039;s key&lt;br /&gt;
        objectowner = llGetOwner(); // objowners key&lt;br /&gt;
        // is the Agent = the owner OR is the agent in the owners group&lt;br /&gt;
        if ( (objectowner == agent) || ( group &amp;amp;&amp;amp; ingroup )  )  {&lt;br /&gt;
            llMessageLinked(LINK_SET,SCENEMENU,&amp;quot;&amp;quot;,agent); // id = AviID or llDetectedKey(0) = id or something&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup Scene Clear&lt;br /&gt;
next create a box and label this box *Clear*&lt;br /&gt;
and add the following script this will clear the scenes when you switch.&lt;br /&gt;
&lt;br /&gt;
Clear Label Script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
float gap = 15.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(0, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now take this box to your Inventry.&lt;br /&gt;
&lt;br /&gt;
now create another box Called *Create* give this box full permissions and take into your inventry&lt;br /&gt;
now right click on your holodeck-&amp;gt;content and drag the *Clear* &amp;amp; *Create* boxes into the root prim.&lt;br /&gt;
wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
internal label script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Configurable Settings&lt;br /&gt;
float fTimerInterval = 0.25; //Time in seconds between movement &#039;ticks&#039;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192; //Channel used by Base Prim to talk to Component Prims;&lt;br /&gt;
// This must match in both scripts&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Runtime Variables (Dont need to change below here unless making a derivative)&lt;br /&gt;
vector SceneOffset;&lt;br /&gt;
rotation SceneRotation;&lt;br /&gt;
integer SceneMove;&lt;br /&gt;
vector SceneDestPosition;&lt;br /&gt;
rotation SceneDestRotation;&lt;br /&gt;
integer SceneSaved = FALSE;&lt;br /&gt;
integer PROTOTYPE_VERSION = TRUE; // TRUE = Production, FALSE = Basic / NOMOD, NOCOPY NO TRANS Demo Box&lt;br /&gt;
integer PROTOTYPE_MESSAGE = TRUE;&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string first_word(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the first word in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the whole string.&lt;br /&gt;
    if(Token == &amp;quot;&amp;quot;) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, 0, pos - 1);&lt;br /&gt;
    else&lt;br /&gt;
        return In_String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string other_words(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
    //This routine searches for the other-than-first words in a string,&lt;br /&gt;
    // and returns it. If no word boundary found, returns&lt;br /&gt;
    // the an empty string.&lt;br /&gt;
    if( Token == &amp;quot;&amp;quot; ) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, pos + 1, llStringLength(In_String));&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
prototype_move()&lt;br /&gt;
{&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    vector SceneLastPosition = ZERO_VECTOR;&lt;br /&gt;
    while( (i &amp;lt; 5) &amp;amp;&amp;amp; (llGetPos() != SceneDestPosition) )&lt;br /&gt;
    {&lt;br /&gt;
        list lParams = [];&lt;br /&gt;
&lt;br /&gt;
        //If we&#039;re not there....&lt;br /&gt;
        if( llGetPos() != SceneDestPosition )&lt;br /&gt;
        {&lt;br /&gt;
            //We may be stuck on the ground...&lt;br /&gt;
            //Did we move at all compared to last loop?&lt;br /&gt;
            if( llGetPos() == SceneLastPosition )&lt;br /&gt;
            {&lt;br /&gt;
                //Yep, stuck...move straight up 10m (attempt to dislodge)&lt;br /&gt;
                lParams = [ PRIM_POSITION, llGetPos() + &amp;lt;0, 0, 10.0&amp;gt; ];&lt;br /&gt;
                //llSetPos(llGetPos() + &amp;lt;0, 0, 10.0&amp;gt;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //Record our spot for &#039;stuck&#039; detection&lt;br /&gt;
                SceneLastPosition = llGetPos();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //Try to move to destination&lt;br /&gt;
        integer iHops = llAbs(llCeil(llVecDist(llGetPos(), SceneDestPosition) / 10.0));&lt;br /&gt;
        integer x;&lt;br /&gt;
        for( x = 0; x &amp;lt; iHops; x++ ) {&lt;br /&gt;
            lParams += [ PRIM_POSITION, SceneDestPosition ];&lt;br /&gt;
        }&lt;br /&gt;
        llSetPrimitiveParams(lParams);&lt;br /&gt;
        //llSleep(0.1);&lt;br /&gt;
        ++i; // changed i++ too ++i credit goes to Simon Sugita for Speed Tweak :)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Set rotation&lt;br /&gt;
    llSetRot(SceneDestRotation);&lt;br /&gt;
}&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;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Open up the listener&lt;br /&gt;
        llListen(PROTOTYPE_SCRIPTS, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        //Set the channel to what&#039;s specified&lt;br /&gt;
        if( start_param != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_SCRIPTS = start_param;&lt;br /&gt;
            state reset_listeners;&lt;br /&gt;
        }&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;
        string command = llToUpper(first_word(message, &amp;quot; &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        if( command == &amp;quot;RECORD&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            SceneOffset = (llGetPos() - SceneVectorBase) / SceneRotationBase;&lt;br /&gt;
            SceneRotation = llGetRot() / SceneRotationBase;&lt;br /&gt;
            SceneSaved = TRUE;&lt;br /&gt;
            llOwnerSay(&amp;quot;Recorded position.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;MOVE&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
    &lt;br /&gt;
            //Don&#039;t move if we&#039;ve not yet recorded a position&lt;br /&gt;
            if( !SceneSaved ) return;&lt;br /&gt;
&lt;br /&gt;
            //Also ignore commands from bases with a different owner than us&lt;br /&gt;
            //(Anti-hacking measure)&lt;br /&gt;
            if( llGetOwner() != llGetOwnerKey(id) ) return;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            SceneDestPosition = (SceneOffset * SceneRotationBase) + SceneVectorBase;&lt;br /&gt;
            SceneDestRotation = SceneRotation * SceneRotationBase;&lt;br /&gt;
&lt;br /&gt;
            //Turn on our timer to perform the move?&lt;br /&gt;
            if( !SceneMove )&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(fTimerInterval);&lt;br /&gt;
                SceneMove = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;PHANTOM&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, turn phantom off&lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;DONE&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, remove script&lt;br /&gt;
            llRemoveInventory(llGetScriptName());&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;CLEAN&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            //Clean up&lt;br /&gt;
            llDie();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;FLUSH&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        //Turn ourselves off&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
&lt;br /&gt;
        //Do we need to move?&lt;br /&gt;
        if( SceneMove )&lt;br /&gt;
        {&lt;br /&gt;
            //Perform the move and clean up&lt;br /&gt;
            prototype_move();&lt;br /&gt;
            SceneMove = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state reset_listeners&lt;br /&gt;
{&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Package Scripts)&lt;br /&gt;
address script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
float gap = 10.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
integer i;&lt;br /&gt;
integer iLine;&lt;br /&gt;
string item;&lt;br /&gt;
vector vThisPos;&lt;br /&gt;
rotation rThisRot;&lt;br /&gt;
&lt;br /&gt;
scene_entry()&lt;br /&gt;
{&lt;br /&gt;
    llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
    object = llGetObjectName();&lt;br /&gt;
    llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
    llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
       &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        scene_entry();&lt;br /&gt;
        vThisPos = llGetPos();&lt;br /&gt;
        rThisRot = llGetRot();&lt;br /&gt;
        iLine = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        for(i=0; i &amp;lt; iLine; i++)&lt;br /&gt;
        {&lt;br /&gt;
            item = llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            llSleep (1.00);&lt;br /&gt;
            llRezObject(item, vThisPos + &amp;lt;0.00, 0.00, 1.00&amp;gt;, ZERO_VECTOR, rThisRot, 0);&lt;br /&gt;
            llShout(PROTOTYPE_SCRIPTS, &amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            if (DEBUG) llShout (DEBUG_CHANNEL, &amp;quot;Rezzing &amp;quot; + item);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(DEBUG_CHANNEL, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;POSITION&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Builders Docs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Builders Manual&lt;br /&gt;
By Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
Welcome to the world of building with your Prototype System. Anyone wishing to build scenes for the Prototype needs to have a good understanding of building and texturing to succeed. Please read this manual through once fully and then as needed when you start building. This manual is divided into several sections:&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
Building scenes&lt;br /&gt;
Building Shells&lt;br /&gt;
Texture Card&lt;br /&gt;
Scene Creation&lt;br /&gt;
Tips&lt;br /&gt;
Packaging&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
The main thing to remember is any object you want to put in the Prototype scene/shell must be copy/mod at a minimum. The way the Prototype system works is by rezzing copies of an item from its inventory. These objects must be modified, adding a special script to make them work with the system scripts.&lt;br /&gt;
&lt;br /&gt;
There are two ways to build with the Prototype:&lt;br /&gt;
&lt;br /&gt;
   1. The linked scene&lt;br /&gt;
   2. The multi-item scene&lt;br /&gt;
&lt;br /&gt;
The linked scene is made from multiple objects and linked; the unlinked scene consists of a number or unlinked objects around the unit.&lt;br /&gt;
&lt;br /&gt;
A scene set will consist of the objects you create and a texture card. These will be explained in greater detail as we move along. The texture card must begin with tex_ or the system will not read them. Feel free to give your scenes a user friendly name, but only with letters, numbers, _ or – in the same name as the current scene we are building for.&lt;br /&gt;
&lt;br /&gt;
Building Scenes&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
   1. Create the objects you want in your scene and arrange them as you like&lt;br /&gt;
   2. Place a label script into each linked object or individual object you have set out in your scene &lt;br /&gt;
   3. Use /1000 SAVE to save the position and rotation of the current scene&lt;br /&gt;
   4. If you wish to modify the scene before repacking or move things around more, enter /1000 RESET and then follow step 3 again&lt;br /&gt;
   5. Next texture the walls, floor, and ceiling; set the repeats, etc. the way you want them&lt;br /&gt;
   6. Open the example tex_*Clear*, and go from prim to prim, and copy the info from the texture window to the notecard as explained above&lt;br /&gt;
   7. Name the suffix of the notecards something user friendly&lt;br /&gt;
   8. Right click on all the objects while holding the Ctrl key and choose edit; then take all the objects into your inventory&lt;br /&gt;
   9. Next, click on your control panel on the wall and press the *Create* button; this will prepare a package for your scene&lt;br /&gt;
  10. Now we will want to name the scene: right click this box, click edit, and fill in something friendly for your scene name and description&lt;br /&gt;
  11. Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts &lt;br /&gt;
  12. Drag the internal address script to the content tab of your inventory and drag the object from our scene that we took into our inventory earlier, copying this to the content tab; we now have all the requirements for loading scenes &lt;br /&gt;
  13. Right click on the Prototype floor panel, choose edit, check edit linked parts, then select the red area of the floor panel (inside the red field) and press Contents tab and drag the object package, and tex_package in there&lt;br /&gt;
  14. Type /1000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
  15. Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
Building Shells&lt;br /&gt;
We will go into much more detail of how to build a scene later, and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
   1. Create the objects you want as your Shell and arrange them as you like&lt;br /&gt;
   2. Place a external label script into each linked object or individual object you have set out as your prototype shell &lt;br /&gt;
   3. Use /2000 SAVE to save the position and rotation of the current shell; if you wish to modify the shell before repacking or move things around more enter /2000 RESET and then follow step 3 again&lt;br /&gt;
   4. Right click on all the object while holding the Ctrl key, edit and take all the objects into your inventory&lt;br /&gt;
   5. Next click on your control panel on the wall and press the *Create* button, preparing a package for your shell&lt;br /&gt;
   6. Now we will want to name the shell package: right click this box, edit it, and fill in something friendly for your shell name and description&lt;br /&gt;
   7. Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts&lt;br /&gt;
   8. Right click on the Prototype floor panel, go into edit, check edit link parts, then select the blue area of the floor panel (inside the blue field)&lt;br /&gt;
   9. Next go to the Content tab and drag the object package into it&lt;br /&gt;
  10. Type /2000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
  11. Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
Texture Card&lt;br /&gt;
The Prototype consists of eight wall, four ceiling, and four floor prims. The texture card has one line for each of these inner prim faces. The prims are named for their direction on the SL compass, and the name of each face on the texture card corresponds to these names. The card must begin with tex_xxx where xxx is the name of the scene, which must be the same name as will be given to the object card.&lt;br /&gt;
&lt;br /&gt;
Each line of the texture card has the following information:&lt;br /&gt;
&lt;br /&gt;
wall section#texture key#vector repeats#vector offsets#float rotation#vector color#float alpha&lt;br /&gt;
&lt;br /&gt;
Once it’s completed, it may look like the following:&lt;br /&gt;
&lt;br /&gt;
ene_wall#2eabe96c-2540-e1fa-ce7f-9030c3d958df#&amp;lt;1.5,1,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&lt;br /&gt;
Each of the items in the texture card must be separated by the symbol #&lt;br /&gt;
&lt;br /&gt;
*Wall Section*&lt;br /&gt;
The wall section name corresponds to the name given to each prim in the Prototype. Use the edit linked parts and then point to the prim, make a note of the wall name. Then go to the card and find the same line containing that wall name.&lt;br /&gt;
&lt;br /&gt;
*Texture Key*&lt;br /&gt;
This is the ID of the texture you are using. This texture must have full permissions. Right click on the prim, select texture, locate it in the list, then right click and copy UUID. Next paste this ID into the note card exactly between the ##.&lt;br /&gt;
&lt;br /&gt;
*Vector Repeats*&lt;br /&gt;
These numbers correspond to the horizontal/vertical repeats found in the texture tab in your edit window.  &lt;br /&gt;
&amp;lt;1.5,1,0&amp;gt;&lt;br /&gt;
The first number is horizontal repeats, the second one is vertical, the third is not used, so will always be 0. Please make sure that the numbers are separated with a comma or they will not work.&lt;br /&gt;
&lt;br /&gt;
*Vector Offsets*&lt;br /&gt;
This set of numbers corresponds to the horizontal/vertical offsets also found in the texture tab in the edit window. For most builds you will keep this set at NULL_VECTOR, since you can’t leave these numbers as 0,0,0. If you do need to offset a texture for some reason, you would replace NULL_VECTOR, with &amp;lt;.5,0,0&amp;gt;, again the first number in the set corresponds to the horizontal offset, the second for vertical offset, the third is not to be used, therefore is left at 0.&lt;br /&gt;
&lt;br /&gt;
*Float Rotation*&lt;br /&gt;
If the texture must be rotated for some reason on the prim face, you will enter that number in the float rotation section. In the example above it’s set at 90.0. Because of the location of some of the walls they will need to be set at 90.0 anyway.&lt;br /&gt;
&lt;br /&gt;
*Vector Color*&lt;br /&gt;
If you would like to tint the prim face, you will use this section. For walls that aren’t tinted, leave the numbers at 1,1,1 because this is equivalent to white/clear. 0,0,0 is black. Below are the basic colours, and included with the Prototype package is a full list of colours in SL format.&lt;br /&gt;
&lt;br /&gt;
Red, Green Blue&lt;br /&gt;
Number may go between 0.1 to 0.9 for each of the three colors&lt;br /&gt;
white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
*Float Alpha*&lt;br /&gt;
This corresponds to the amount of transparency, 1.0 being no transparency, 0.0 is full transparency.&lt;br /&gt;
&lt;br /&gt;
NOTE: One final word on textures. Make sure that when you reference a texture ID key, you keep that texture in your inventory.  If you delete it from inventory, after a while it will be deleted from the asset inventory SL keeps and won’t work anymore.&lt;br /&gt;
&lt;br /&gt;
That’s it for the texture note-card. It’s a little confusing in the beginning, but you will get the hang of it in no time. A demo note-card has been provided for you to use in what ever way you want. Just remember when naming the card, to use the tex_ prefix.&lt;br /&gt;
&lt;br /&gt;
Scene Creation&lt;br /&gt;
Depending on what you plan on using in your Prototype building, your scene will vary. Some people make their own furniture and other items for their scenes for their own use or for sale. Others use free items they have gathered around SL which have copy/mod permissions to build their scenes. The Prototype is perfect for personal homes, clubs, inns and hotels, skyboxes, anywhere you need to rez furniture. The wonderful thing is that you have multiple scenes stored in the Prototype and can change whenever you want, instead of having to keep dragging things from inventory. Or for those of you who don’t want to use all their prims on a home and 5 rooms, why not have one room with five scenes and a nice shell. There are places to purchase copy/mod pose balls for your scenes too.  &lt;br /&gt;
&lt;br /&gt;
Tips&lt;br /&gt;
Some tips when building items for your scenes:&lt;br /&gt;
&lt;br /&gt;
    *&lt;br /&gt;
      Try to link as many prims together as they will load faster than ten smaller objects located around the box&lt;br /&gt;
    *&lt;br /&gt;
      When placing objects keep in mind the location of the door&lt;br /&gt;
    *&lt;br /&gt;
      When making an object that is an odd shape such as a torus, you may want to create a flat box prim below it, and link to that; it will save headaches later on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Packaging&lt;br /&gt;
When you decide to package the item for sale, make sure that you give copy rights to the next owner or they won’t be able to use it. It is also helpful to give full permissions on the texture. Ensure the name you give the object is user friendly, but also only contains letters, numbers _ or -. Don&#039;t forget to add the address script to each completed package.&lt;br /&gt;
&lt;br /&gt;
If you have any questions, please feel free to contact Revolution Perenti, and do join the .::Prototype::. Group you will receive updates of this manual and the scripts as they come out.  If you have any suggestions for this manual please feel free to let me know.&lt;br /&gt;
&lt;br /&gt;
Happy building!&lt;br /&gt;
&lt;br /&gt;
Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Holodeck Commands Quick Overview:&lt;br /&gt;
(.::Prototype 1.63::. should be replaced with what you called your root prim)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Commands Quick Guide&lt;br /&gt;
&lt;br /&gt;
// SCENE SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/1000 .::Prototype 1.63::.,CHANNEL,1001 (replace 1001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/1000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/1000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Prims Remaining on sim;&lt;br /&gt;
/1000 SIM&lt;br /&gt;
Prims Remaining on Parcel&lt;br /&gt;
/1000 PARCEL&lt;br /&gt;
Open or Close door;&lt;br /&gt;
/1000 DOOR&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/1000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/1000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/1000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/1000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/1000 EDIT&lt;br /&gt;
load weather type (this is future update and is reserved until beta testing is complete)&lt;br /&gt;
/1000 COMPATIBILITY Blizzard //replace Blizzard with weather type /snow, rain, blizzard, hail, storm, tornado&lt;br /&gt;
&lt;br /&gt;
// SHELL SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/2000 .::Prototype 1.63::.,CHANNEL,2001 (replace 2001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/2000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/2000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/2000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/2000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/2000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/2000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/2000 EDIT&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz Open Source&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system and more advanced this is just the basic idea how to get a holodeck working.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library|Holodeck}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=57975</id>
		<title>Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=57975"/>
		<updated>2008-03-10T15:42:55Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
== What is a Holodeck? ==&lt;br /&gt;
&lt;br /&gt;
A Holodeck is a product used to save different forms of content (either furniture settings or even an entire environment), similar to &#039;Holodecks&#039; used in various sci-fi television shows and movies. For Second Life purposes, a holodeck allows you to rez a large variety of rooms or scenarios in limited space. Some systems even allow the scene to be located far away from its control panel, offering the convenience of large, rez-on-demand structures without tying up a large space in your house.&lt;br /&gt;
&lt;br /&gt;
=== A handful of the known holodeck and panocube products: ===&lt;br /&gt;
(Please add to this list as you come across other holodeck-type products!)&lt;br /&gt;
&lt;br /&gt;
* The &#039;Holodeck&#039; by Loki Clifton&lt;br /&gt;
* &#039;Horizons&#039; by Cheshyr Pontchartrain&lt;br /&gt;
* &#039;HyperCube&#039; by D-VTech&lt;br /&gt;
* &#039;Super Sofa&#039; by LayZeeBones&lt;br /&gt;
* &#039;Holodeck&#039; by Soulmates Creations&lt;br /&gt;
* &#039;Paradise Blanket&#039; by OctoberWerks&lt;br /&gt;
* &#039;HoloRez&#039; by HoloRez Rang&lt;br /&gt;
* &#039;Skyboxer&#039; by Ethereal Fremont&lt;br /&gt;
* &#039;Primitizer&#039; by Revolution Parenti&lt;br /&gt;
* &#039;The Titan&#039; by Jack Hathor&lt;br /&gt;
* &#039;Room Switch&#039; by Fluid Creations&lt;br /&gt;
* &#039;The Green Wonder&#039; by Tina Freund&lt;br /&gt;
* &#039;Holodeck&#039; by Professor Eisenberg (Panocube)&lt;br /&gt;
* &#039;The Virtual Reality Room&#039; by Stephane Zugzwang (Panocube)&lt;br /&gt;
&lt;br /&gt;
A holodeck-panocube consists of photos. The picture changes on every wall, plus the floor and ceiling, making a total immersed &amp;quot;single&amp;quot; image. A regular holodeck will rezz and derezz prims such as different houses with furniture, and might rezz surrounding panocube images in addition.&lt;br /&gt;
&lt;br /&gt;
You can also find information on an Open Source Holodeck type Product here:&lt;br /&gt;
{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
What is a Holodeck?&lt;br /&gt;
&lt;br /&gt;
A Holodeck stores Second Life scenes and lets you load them from a menu when ever you want. The old scene is cleared and the new one appears. Scenes can include any prim objects including furniture, pose balls and particle generators. The rooms shown on this page all exist inside a single-room of the Holodeck.&lt;br /&gt;
&lt;br /&gt;
The Scripts for the holodeck may look complex but once you done it correcly everything is very easy to setup and use and just build almost like you normally would within sl&lt;br /&gt;
&lt;br /&gt;
Creating the holodeck, the best way to start would be to create a 20x20x10 shell this would be your rezzing area for the holodeck&lt;br /&gt;
&lt;br /&gt;
once you done this you should have something similar to the picture below&lt;br /&gt;
&lt;br /&gt;
[[Image:holodeck shell.jpg]]&lt;br /&gt;
&lt;br /&gt;
ok next we create a small panel for the floor 0.500x0.500x0.100 and link this to your holodeck shell make sure this is the last object you link to the holodeck shell as this becomes the root prim&lt;br /&gt;
&lt;br /&gt;
see example below&lt;br /&gt;
&lt;br /&gt;
[[Image:floor panel.jpg]]&lt;br /&gt;
&lt;br /&gt;
The Scripts&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Holodeck Core.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// User Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//How long to listen for a menu response before shutting down the listener&lt;br /&gt;
float fListenTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//How often (in seconds) to check for change in position when moving&lt;br /&gt;
float fMovingRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
//How long to sit still before exiting active mode&lt;br /&gt;
float fStoppedTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//Minimum amount of time (in seconds) between movement updates&lt;br /&gt;
float fShoutRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
// label script name used for debug and PrototypeSay();&lt;br /&gt;
string label = &amp;quot;internal label&amp;quot;;&lt;br /&gt;
// Channel used by Prototype&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer MENU_CHANNEL;&lt;br /&gt;
integer MENU_HANDLE;&lt;br /&gt;
string PROTOTYPE_CREATOR;&lt;br /&gt;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
integer PROTOTYPE_RESET = -68195;&lt;br /&gt;
integer SHOW_MENU = -68194;&lt;br /&gt;
// Channel used by Prototype to talk to label scripts&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
// Feature Manager&lt;br /&gt;
integer PROTOTYPE_TEXTURE = TRUE;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Security Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
integer PROTOTYPE_ALLOW_IM = FALSE;&lt;br /&gt;
string  PROTOTYPE_EMAIL = &amp;quot;phoenixcms@hotmail.co.uk&amp;quot;;&lt;br /&gt;
string  PROTOTYPE_OWNER;&lt;br /&gt;
vector  Where;&lt;br /&gt;
string  Name;&lt;br /&gt;
string  SLURL;&lt;br /&gt;
integer X;&lt;br /&gt;
integer Y;&lt;br /&gt;
integer Z;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Menu System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Compatibility System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list objectSettings = [];&lt;br /&gt;
integer stride = 3;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
string COMPATIBILITY_NOTECARD = &amp;quot;compatibility&amp;quot;; //[objectname];&amp;lt;position&amp;gt;;&amp;lt;rotation&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DO NOT EDIT BELOW THIS LINE.... NO.. NOT EVEN THEN&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer PrototypeBaseMoving;&lt;br /&gt;
vector PrototypeLastPosition;&lt;br /&gt;
rotation PrototypeLastRotation;&lt;br /&gt;
integer iListenTimeout = 0;&lt;br /&gt;
&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//To avoid flooding the sim with a high rate of movements&lt;br /&gt;
//(and the resulting mass updates it will bring), we used&lt;br /&gt;
// a short throttle to limit ourselves&lt;br /&gt;
prototype_moved()&lt;br /&gt;
{&lt;br /&gt;
    llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ llGetPos(), llGetRot() ], &amp;quot;|&amp;quot;));&lt;br /&gt;
    llResetTime(); //Reset our throttle&lt;br /&gt;
    PrototypeLastPosition = llGetPos();&lt;br /&gt;
    PrototypeLastRotation = llGetRot();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    iListenTimeout = llGetUnixTime() + llFloor(fListenTime);&lt;br /&gt;
    MENU_CHANNEL = llFloor(llFrand(-99999.0 - -100));&lt;br /&gt;
    MENU_HANDLE = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;www.sl-prototype.com: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
    llSetTimerEvent(fShoutRate);&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;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER || CHANGED_INVENTORY)&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry () &lt;br /&gt;
    {&lt;br /&gt;
        // Lets open our listen channel&lt;br /&gt;
        key_listen = llListen(PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;LISTEN ON CHANNEL &amp;quot; +(string)PROTOTYPE_CHANNEL);&lt;br /&gt;
        // Compatibility System Notecard&lt;br /&gt;
        llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        //Record our position&lt;br /&gt;
        PrototypeLastPosition = llGetPos();&lt;br /&gt;
        PrototypeLastRotation = llGetRot();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    dataserver(key queryId, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            objectSettings += llParseString2List(data, [&amp;quot;;&amp;quot;], []);&lt;br /&gt;
            iLine++;&lt;br /&gt;
            llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Done Reading Compatibility Notecard &amp;quot; + COMPATIBILITY_NOTECARD);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number==SHOW_MENU) {&lt;br /&gt;
            MENU1 = [];&lt;br /&gt;
            MENU2 = [];&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
                MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            Dialog(id, MENU1);&lt;br /&gt;
        }&lt;br /&gt;
        if (number==PROTOTYPE_RESET) {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Forgetting positions...&amp;quot;);&lt;br /&gt;
            llPrototypeSay(&amp;quot;RESET&amp;quot;);&lt;br /&gt;
        }&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;
        list compatibility = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        PROTOTYPE_CREATOR = llGetCreator();&lt;br /&gt;
        //&lt;br /&gt;
        if ( command == llToLower(&amp;quot;CHANNEL&amp;quot;) || command == llToUpper(&amp;quot;CHANNEL&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)PROTOTYPE_CHANNEL );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;MESSAGE&amp;quot;) || command == llToUpper(&amp;quot;MESSAGE&amp;quot;))  &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_MESSAGE = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;PROTOTYPE MESSAGE set to &amp;quot; + (string)PROTOTYPE_MESSAGE );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // OPEN / CLOSE DOOR    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;DOOR&amp;quot;) || message == llToUpper(&amp;quot;DOOR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, PROTOTYPE_DOOR, &amp;quot;&amp;quot;,NULL_KEY );&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Setting Door Permissions...&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        // SET COMPATIBILITY&lt;br /&gt;
        if(llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;) || llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            string object = llList2String(compatibility, 1);&lt;br /&gt;
            integer indexInSettings = llListFindList(objectSettings, [object]);&lt;br /&gt;
            if(indexInSettings &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                vector pos = (vector)llList2String(objectSettings, indexInSettings + 1);&lt;br /&gt;
                rotation rot = (rotation)llList2String(objectSettings, indexInSettings + 2);&lt;br /&gt;
                llRezAtRoot(object, pos + llGetPos(), ZERO_VECTOR, rot, 0);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // LOAD MENU SYSTEM    &lt;br /&gt;
        if (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                //Loop through backwards (safety precaution in case of inventory change)&lt;br /&gt;
                if (DEBUG) llDebugSay(&amp;quot;Loading build pieces please wait...&amp;quot;);&lt;br /&gt;
                llRezAtRoot(message, llGetPos() + &amp;lt;0.00, 0.00, 0.30&amp;gt;, ZERO_VECTOR, llGetRot(), PROTOTYPE_CHANNEL);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // REPOSTION SCENE    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;POSITION&amp;quot;) || message == llToUpper(&amp;quot;POSITION&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Positioning&amp;quot;);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // CLEAR SCENE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;CLEAR&amp;quot;) || message == llToUpper(&amp;quot;CLEAR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;CLEAN&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if( message == llToLower(&amp;quot;HOLODECKDIE&amp;quot;) || message == llToUpper(&amp;quot;HOLODECKDIE&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            if(PROTOTYPE_CREATOR) llDie();&lt;br /&gt;
        }&lt;br /&gt;
        // DISABLE PHANTOM AS WE ARE NOW DONE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;NOPHANTOM&amp;quot;) || message == llToUpper(&amp;quot;NOPHANTOM&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;PHANTOM&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Disabled Phantom&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    moving_start() //StartPrototype&lt;br /&gt;
    {&lt;br /&gt;
        if( !PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            PrototypeBaseMoving = TRUE;&lt;br /&gt;
            llSetTimerEvent(0.0); //Resets the timer if already running&lt;br /&gt;
            llSetTimerEvent(fMovingRate);&lt;br /&gt;
            prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer() &lt;br /&gt;
    {&lt;br /&gt;
        //Were we moving?&lt;br /&gt;
        if( PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            //Did we change position/rotation?&lt;br /&gt;
            if( (llGetRot() != PrototypeLastRotation) || (llGetPos() != PrototypeLastPosition) )&lt;br /&gt;
            {&lt;br /&gt;
                if( llGetTime() &amp;gt; fShoutRate ) {&lt;br /&gt;
                    prototype_moved();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
        // Have we been sitting long enough to consider ourselves stopped?&lt;br /&gt;
            if( llGetTime() &amp;gt; fStoppedTime )&lt;br /&gt;
            PrototypeBaseMoving = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Open listener?&lt;br /&gt;
        if( iListenTimeout != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            //Past our close timeout?&lt;br /&gt;
            if( iListenTimeout &amp;lt;= llGetUnixTime() )&lt;br /&gt;
            {&lt;br /&gt;
                iListenTimeout = 0;&lt;br /&gt;
                llListenRemove(MENU_HANDLE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Stop the timer?&lt;br /&gt;
        if( (iListenTimeout == 0) &amp;amp;&amp;amp; ( !PrototypeBaseMoving ) )&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Stopping Timer&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    } // END TIMER FUNCTION&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        PROTOTYPE_OWNER = llGetOwner();&lt;br /&gt;
        //Name = llGetRegionName();&lt;br /&gt;
        Name = llDumpList2String(llParseString2List(llGetRegionName(),[&amp;quot; &amp;quot;],[]),&amp;quot;_&amp;quot;);&lt;br /&gt;
        Where = llGetPos();&lt;br /&gt;
&lt;br /&gt;
        X = (integer)Where.x;&lt;br /&gt;
        Y = (integer)Where.y;&lt;br /&gt;
        Z = (integer)Where.z;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // I don&#039;t replace any spaces in Name with %20 and so forth.&lt;br /&gt;
&lt;br /&gt;
        SLURL = &amp;quot;http://slurl.com/secondlife/&amp;quot; + Name + &amp;quot;/&amp;quot; + (string)X + &amp;quot;/&amp;quot; + (string)Y + &amp;quot;/&amp;quot; + (string)Z + &amp;quot;/?title=&amp;quot; + Name;&lt;br /&gt;
&lt;br /&gt;
        llEmail(PROTOTYPE_EMAIL, llKey2Name(PROTOTYPE_OWNER), SLURL + &amp;quot;\nRegistered user =&amp;quot; + llKey2Name(PROTOTYPE_OWNER) + &amp;quot;Registered user key =&amp;quot; + PROTOTYPE_OWNER);&lt;br /&gt;
        if(PROTOTYPE_ALLOW_IM) {&lt;br /&gt;
            llInstantMessage(llGetCreator(), SLURL);&lt;br /&gt;
        }&lt;br /&gt;
        // Reset ourselves&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Texture Engine.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
string TEXTURE_NOTECARD;&lt;br /&gt;
string prefix = &amp;quot;tex_&amp;quot;;&lt;br /&gt;
key TextureQuery;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
integer DEBUG = FALSE; // debug channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
default {&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        TEXTURE_NOTECARD = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + TEXTURE_NOTECARD);&lt;br /&gt;
        TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        list texture = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            TEXTURE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)TEXTURE_CHANNEL);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(llList2String(texture, 0) == &amp;quot;image&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            iLine = 0;&lt;br /&gt;
            TEXTURE_NOTECARD = llList2String(texture, 1);&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////        &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == TextureQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data != EOF &amp;amp;&amp;amp; prefix == &amp;quot;tex_&amp;quot;) {    &lt;br /&gt;
            &lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);&lt;br /&gt;
                llMessageLinked(LINK_SET,0,data,NULL_KEY);&lt;br /&gt;
&lt;br /&gt;
                // increment line count                 &lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                ++iLine;&lt;br /&gt;
                TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Done reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Notecards&lt;br /&gt;
&lt;br /&gt;
*Clear* Notecard for default Clear Scene &lt;br /&gt;
(note the first line of texture notecards is object name so make sure you name all floor panels, roof and walls with unique name and edit the notecard as required add each object line to a new line as required.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Object_Name#2f78ee38-9aca-f8d1-5306-458beab181f9#&amp;lt;3.0,1.0,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
compatibility notecard leave this blank at current its planned as future feature to allow weather inside the holodeck and was the old rez system from early beta but we left it here to be reused later on.&lt;br /&gt;
&lt;br /&gt;
Walls, Floor,Roof texture,particles,sound &amp;amp; locate system&lt;br /&gt;
needs to be added to every object you wish to texture each object needs a unique name too for better control of textures&lt;br /&gt;
System.lsl (updated to 2.0.2)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Skidz Partz - Open Source Holodeck Version (2.0.1)&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// Debug&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
&lt;br /&gt;
// Sound System&lt;br /&gt;
list SOUND_VALUES;&lt;br /&gt;
integer SOUND_TYPE;&lt;br /&gt;
string SOUND_UUID;&lt;br /&gt;
float SOUND_VOLUME;&lt;br /&gt;
// Texture System&lt;br /&gt;
list TEXTURE_VALUES;&lt;br /&gt;
string HOLODECK_OBJECTNAME;&lt;br /&gt;
string TEXTURE_UID;&lt;br /&gt;
vector TEXTURE_REPEATS;&lt;br /&gt;
vector TEXTURE_OFFSETS;&lt;br /&gt;
float TEXTURE_ROTATE;&lt;br /&gt;
vector TEXTURE_COLOR;&lt;br /&gt;
float TEXTURE_ALPHA;&lt;br /&gt;
&lt;br /&gt;
// Lighting System&lt;br /&gt;
list LIGHT_VALUES;&lt;br /&gt;
integer  LIGHT_STATUS;&lt;br /&gt;
// Color of the light (RGB - each value between 0.0 and 1.0)&lt;br /&gt;
vector LIGHT_COLOR;&lt;br /&gt;
// Intensity of the light (values from 0.0 .. 1.0)&lt;br /&gt;
float  LIGHT_LEVEL;&lt;br /&gt;
// Radius of light cone&lt;br /&gt;
float  LIGHT_DISTANCE;&lt;br /&gt;
// Fall off (distance/intensity decrease) values from 0.0 ..1.0&lt;br /&gt;
float  LIGHT_FALLOFF;&lt;br /&gt;
&lt;br /&gt;
// Particle System&lt;br /&gt;
integer PARTICLE_FLAGS;&lt;br /&gt;
//&lt;br /&gt;
list PARTICLE_VALUES;&lt;br /&gt;
key PARTICLE_SRC_TARGET_KEY = &amp;quot;&amp;quot;;&lt;br /&gt;
string PARTICLE_SRC_TEXTURE = &amp;quot;&amp;quot;;&lt;br /&gt;
float PARTICLE_SRC_MAX_AGE;&lt;br /&gt;
float PARTICLE_PART_MAX_AGE;&lt;br /&gt;
float PARTICLE_BURST_RATE;&lt;br /&gt;
integer PARTICLE_BURST_PART_COUNT;&lt;br /&gt;
float PARTICLE_BURST_RADIUS;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MAX;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MIN;&lt;br /&gt;
float PARTICLE_START_ALPHA;&lt;br /&gt;
float PARTICLE_END_ALPHA;&lt;br /&gt;
float PARTICLE_INNERANGLE;&lt;br /&gt;
float PARTICLE_OUTERANGLE;&lt;br /&gt;
vector PARTICLE_START_COLOR;&lt;br /&gt;
vector PARTICLE_END_COLOR;&lt;br /&gt;
vector PARTICLE_START_SCALE;&lt;br /&gt;
vector PARTICLE_END_SCALE;&lt;br /&gt;
vector PARTICLE_ACCEL;&lt;br /&gt;
vector PARTICLE_OMEGA;&lt;br /&gt;
integer PARTICLE_SRC_PATTERN;&lt;br /&gt;
// Link Messages Channels&lt;br /&gt;
integer RESET_SCRIPTS = 0x2F34B;&lt;br /&gt;
integer HOLODECK_LIGHT            = 0x2F34C;&lt;br /&gt;
integer HOLODECK_TEXTURE            = 0x2F34D;&lt;br /&gt;
integer LOCATE_LIGHT = 0x2F34E;&lt;br /&gt;
integer LOCATE_TEXTURE = 0x2F34F;&lt;br /&gt;
integer HOLODECK_PARTICLE = 0x2F350;&lt;br /&gt;
integer HOLODECK_SOUND = 0x2F351;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector eul = &amp;lt;0.00, 0.00, 0.00&amp;gt;;&lt;br /&gt;
        eul *= DEG_TO_RAD;&lt;br /&gt;
        rotation quat = llEuler2Rot( eul );&lt;br /&gt;
        llSetRot( quat );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sent,integer num,string message,key id)&lt;br /&gt;
    {&lt;br /&gt;
    if (num == RESET_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
        llOwnerSay(&amp;quot;Resetting Holodeck Defaults&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_SOUND)&lt;br /&gt;
    {&lt;br /&gt;
        SOUND_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(SOUND_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            SOUND_TYPE = (integer)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_UUID = (string)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_VOLUME = (float)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            &lt;br /&gt;
            // Sound Change&lt;br /&gt;
            if(SOUND_TYPE == 1) &lt;br /&gt;
            { &lt;br /&gt;
               llPlaySound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 2) &lt;br /&gt;
            { &lt;br /&gt;
               llLoopSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 3) &lt;br /&gt;
            { &lt;br /&gt;
               llTriggerSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
                                                            &lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_TEXTURE)&lt;br /&gt;
    {&lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            &lt;br /&gt;
            //list conversions&lt;br /&gt;
            string LOCATE_TEXTURE_UID = llGetTexture(0);&lt;br /&gt;
            vector LOCATE_TEXTURE_REPEATS = llList2Vector(llGetPrimitiveParams([PRIM_TEXTURE,0]),1);&lt;br /&gt;
            vector LOCATE_TEXTURE_OFFSETS = llGetTextureOffset(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ROTATE = llGetTextureRot(0) * DEG_TO_RAD;&lt;br /&gt;
            vector LOCATE_TEXTURE_COLOR = llGetColor(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ALPHA = llGetAlpha(0);&lt;br /&gt;
                        &lt;br /&gt;
             llSay(0, (string)HOLODECK_GETOBJECTNAME+(string)&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_UID+                          // name&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_REPEATS+                      // repeats&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_OFFSETS+                      // offsets&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ROTATE+                       // rotation&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_COLOR+                      // color&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ALPHA);                     // alpha     &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_LIGHT)&lt;br /&gt;
    {          &lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            list LOCATE_PRIM_POINT_LIGHT =  llGetPrimitiveParams([PRIM_POINT_LIGHT]);&lt;br /&gt;
            list LOCATE_STATUS = ([&amp;quot;FALSE&amp;quot;,&amp;quot;TRUE&amp;quot;]);&lt;br /&gt;
            vector LIGHT_COLOR; &lt;br /&gt;
    &lt;br /&gt;
     // output the notecard to chat&lt;br /&gt;
     llSay(0, &amp;quot;locating Lighting Values for &amp;quot; + (string)HOLODECK_GETOBJECTNAME);&lt;br /&gt;
     llSleep(3);&lt;br /&gt;
     llSay(0, (string)HOLODECK_GETOBJECTNAME +                                                // Object Name&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2String(LOCATE_STATUS ,llList2Integer(LOCATE_PRIM_POINT_LIGHT,0)) + // Light Status&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2Vector(LOCATE_PRIM_POINT_LIGHT,1) +                                // Color&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,2) +                                  // Level&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,3) +                                  // Distance&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,4));                                  // falloff&lt;br /&gt;
     LOCATE_PRIM_POINT_LIGHT = [];   &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_LIGHT)&lt;br /&gt;
    {&lt;br /&gt;
        LIGHT_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            LIGHT_STATUS = (integer)llList2String(LIGHT_VALUES,1);&lt;br /&gt;
            LIGHT_COLOR = (vector)llList2String(LIGHT_VALUES,2);&lt;br /&gt;
            LIGHT_LEVEL = (float)llList2String(LIGHT_VALUES,3);&lt;br /&gt;
            LIGHT_DISTANCE = (float)llList2String(LIGHT_VALUES,4);&lt;br /&gt;
            LIGHT_FALLOFF = (float)llList2String(LIGHT_VALUES,5);&lt;br /&gt;
&lt;br /&gt;
            // Lighting Change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_POINT_LIGHT, LIGHT_STATUS, LIGHT_COLOR, LIGHT_LEVEL, LIGHT_DISTANCE, LIGHT_FALLOFF]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
    else if (num == HOLODECK_TEXTURE)&lt;br /&gt;
    {    &lt;br /&gt;
        TEXTURE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            TEXTURE_UID = llList2String(TEXTURE_VALUES,1);&lt;br /&gt;
            TEXTURE_REPEATS = (vector)llList2String(TEXTURE_VALUES,2);&lt;br /&gt;
            TEXTURE_OFFSETS = (vector)llList2String(TEXTURE_VALUES,3);&lt;br /&gt;
            TEXTURE_ROTATE = ((float)llList2String(TEXTURE_VALUES,4)) * DEG_TO_RAD;&lt;br /&gt;
            TEXTURE_COLOR = (vector)llList2String(TEXTURE_VALUES,5);&lt;br /&gt;
            TEXTURE_ALPHA = (float)llList2String(TEXTURE_VALUES,6);&lt;br /&gt;
            &lt;br /&gt;
            //texture change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_TEXTURE,0,TEXTURE_UID,TEXTURE_REPEATS,TEXTURE_OFFSETS,TEXTURE_ROTATE]);&lt;br /&gt;
            llSetPrimitiveParams([PRIM_COLOR,0,TEXTURE_COLOR,TEXTURE_ALPHA]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else if (num == HOLODECK_PARTICLE)&lt;br /&gt;
    {&lt;br /&gt;
        PARTICLE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(PARTICLE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            PARTICLE_PART_MAX_AGE = (float)llList2String(PARTICLE_VALUES,1);&lt;br /&gt;
            PARTICLE_FLAGS = (integer)llList2String(PARTICLE_VALUES,2);&lt;br /&gt;
            PARTICLE_START_COLOR = (vector)llList2String(PARTICLE_VALUES,3);&lt;br /&gt;
            PARTICLE_END_COLOR = (vector)llList2String(PARTICLE_VALUES,4);&lt;br /&gt;
            PARTICLE_START_SCALE = (vector)llList2String(PARTICLE_VALUES,5);&lt;br /&gt;
            PARTICLE_END_SCALE = (vector)llList2String(PARTICLE_VALUES,6);&lt;br /&gt;
            PARTICLE_SRC_PATTERN = (integer)llList2String(PARTICLE_VALUES,7);&lt;br /&gt;
            PARTICLE_BURST_RATE = (float)llList2String(PARTICLE_VALUES,8);&lt;br /&gt;
            PARTICLE_ACCEL = (vector)llList2String(PARTICLE_VALUES,9);&lt;br /&gt;
            PARTICLE_BURST_PART_COUNT = (integer)llList2String(PARTICLE_VALUES,10);&lt;br /&gt;
            PARTICLE_BURST_RADIUS = (float)llList2String(PARTICLE_VALUES,11);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MIN = (float)llList2String(PARTICLE_VALUES,12);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MAX = (float)llList2String(PARTICLE_VALUES,13);&lt;br /&gt;
            PARTICLE_INNERANGLE = (float)llList2String(PARTICLE_VALUES,14);&lt;br /&gt;
            PARTICLE_OUTERANGLE = (float)llList2String(PARTICLE_VALUES,15);&lt;br /&gt;
            PARTICLE_OMEGA = (vector)llList2String(PARTICLE_VALUES,16);&lt;br /&gt;
            PARTICLE_SRC_MAX_AGE = (float)llList2String(PARTICLE_VALUES,17);&lt;br /&gt;
            PARTICLE_START_ALPHA = (float)llList2String(PARTICLE_VALUES,18);&lt;br /&gt;
            PARTICLE_END_ALPHA = (float)llList2String(PARTICLE_VALUES,19);&lt;br /&gt;
            PARTICLE_SRC_TEXTURE = (string)llList2String(PARTICLE_VALUES,20);&lt;br /&gt;
            llSleep(1.5);&lt;br /&gt;
            // Particle Change&lt;br /&gt;
            llParticleSystem([  &lt;br /&gt;
                        PSYS_PART_MAX_AGE, PARTICLE_PART_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_FLAGS, PARTICLE_FLAGS,&lt;br /&gt;
                        PSYS_PART_START_COLOR, PARTICLE_START_COLOR,&lt;br /&gt;
                        PSYS_PART_END_COLOR, PARTICLE_END_COLOR,&lt;br /&gt;
                        PSYS_PART_START_SCALE, PARTICLE_START_SCALE,&lt;br /&gt;
                        PSYS_PART_END_SCALE, PARTICLE_END_SCALE,&lt;br /&gt;
                        PSYS_SRC_PATTERN, PARTICLE_SRC_PATTERN,&lt;br /&gt;
                        PSYS_SRC_BURST_RATE,PARTICLE_BURST_RATE,&lt;br /&gt;
                        PSYS_SRC_ACCEL,PARTICLE_ACCEL,&lt;br /&gt;
                        PSYS_SRC_BURST_PART_COUNT,PARTICLE_BURST_PART_COUNT,&lt;br /&gt;
                        PSYS_SRC_BURST_RADIUS,PARTICLE_BURST_RADIUS,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MIN,PARTICLE_BURST_SPEED_MIN,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MAX,PARTICLE_BURST_SPEED_MAX,&lt;br /&gt;
                        PSYS_SRC_ANGLE_BEGIN,PARTICLE_INNERANGLE,&lt;br /&gt;
                        PSYS_SRC_ANGLE_END,PARTICLE_OUTERANGLE,&lt;br /&gt;
                        PSYS_SRC_OMEGA,PARTICLE_OMEGA,&lt;br /&gt;
                        PSYS_SRC_MAX_AGE,PARTICLE_SRC_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_START_ALPHA,PARTICLE_START_ALPHA,&lt;br /&gt;
                        PSYS_PART_END_ALPHA,PARTICLE_END_ALPHA,&lt;br /&gt;
                        PSYS_SRC_TEXTURE, PARTICLE_SRC_TEXTURE,&lt;br /&gt;
                        PSYS_SRC_TARGET_KEY,PARTICLE_SRC_TARGET_KEY &lt;br /&gt;
                            ]);                         &lt;br /&gt;
        }            &lt;br /&gt;
    }&lt;br /&gt;
    if(DEBUG) llOwnerSay(&amp;quot;This Script Name &amp;quot; + (string)llGetScriptName() + &amp;quot;In Object Name &amp;quot; + (string)llGetObjectName() +  &amp;quot;used &amp;quot; + (string)((16384 - llGetFreeMemory())/1024) + &amp;quot; kBytes&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Door Script to be places in one of the prims where you would like a door, this does a hollow effect to give the impression of the door and is controlled with link messages.&lt;br /&gt;
&lt;br /&gt;
Door System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message( integer sender, integer msg, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == PROTOTYPE_DOOR) {&lt;br /&gt;
            list open = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
            string open2 = llList2String(open, 3);&lt;br /&gt;
            if (llGetSubString(open2,0,2) != &amp;quot;0.0&amp;quot;)&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.0,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
            else&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.95,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
next we create a 0.500x0.500x0.100 box this is used for control panel&lt;br /&gt;
now link this to your holodeck shell linking the shell last becuase we want to keep the root prim intact i normally put this just to the side of the door but you can put this anywhere you like.&lt;br /&gt;
&lt;br /&gt;
Next right click select edit link parts and select the switch now we add the menu functions scripts.&lt;br /&gt;
&lt;br /&gt;
Menu System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list csv_commands;&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
integer SCENEMENU = -68194;&lt;br /&gt;
key agent;&lt;br /&gt;
key objectowner;&lt;br /&gt;
integer group;&lt;br /&gt;
// Set to TRUE to allow group members to use the dialog menu&lt;br /&gt;
// Set to FALSE to disallow group members from using the dialog menu&lt;br /&gt;
integer ingroup = 0;&lt;br /&gt;
integer DEBUG = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay(&amp;quot;Current chanel: &amp;quot;+(string)P_channel);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(command == llToLower(&amp;quot;PERMS&amp;quot;) || message == llToUpper(&amp;quot;PERMS&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            ingroup = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;ingroup set to &amp;quot; + (string)ingroup);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    } // end listen();&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   &lt;br /&gt;
        group = llDetectedGroup(0); // Is the Agent in the objowners group?&lt;br /&gt;
        agent = llDetectedKey(0); // Agent&#039;s key&lt;br /&gt;
        objectowner = llGetOwner(); // objowners key&lt;br /&gt;
        // is the Agent = the owner OR is the agent in the owners group&lt;br /&gt;
        if ( (objectowner == agent) || ( group &amp;amp;&amp;amp; ingroup )  )  {&lt;br /&gt;
            llMessageLinked(LINK_SET,SCENEMENU,&amp;quot;&amp;quot;,agent); // id = AviID or llDetectedKey(0) = id or something&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup Scene Clear&lt;br /&gt;
next create a box and label this box *Clear*&lt;br /&gt;
and add the following script this will clear the scenes when you switch.&lt;br /&gt;
&lt;br /&gt;
Clear Label Script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
float gap = 15.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(0, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now take this box to your Inventry.&lt;br /&gt;
&lt;br /&gt;
now create another box Called *Create* give this box full permissions and take into your inventry&lt;br /&gt;
now right click on your holodeck-&amp;gt;content and drag the *Clear* &amp;amp; *Create* boxes into the root prim.&lt;br /&gt;
wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
internal label script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Configurable Settings&lt;br /&gt;
float fTimerInterval = 0.25; //Time in seconds between movement &#039;ticks&#039;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192; //Channel used by Base Prim to talk to Component Prims;&lt;br /&gt;
// This must match in both scripts&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Runtime Variables (Dont need to change below here unless making a derivative)&lt;br /&gt;
vector SceneOffset;&lt;br /&gt;
rotation SceneRotation;&lt;br /&gt;
integer SceneMove;&lt;br /&gt;
vector SceneDestPosition;&lt;br /&gt;
rotation SceneDestRotation;&lt;br /&gt;
integer SceneSaved = FALSE;&lt;br /&gt;
integer PROTOTYPE_VERSION = TRUE; // TRUE = Production, FALSE = Basic / NOMOD, NOCOPY NO TRANS Demo Box&lt;br /&gt;
integer PROTOTYPE_MESSAGE = TRUE;&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string first_word(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the first word in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the whole string.&lt;br /&gt;
    if(Token == &amp;quot;&amp;quot;) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, 0, pos - 1);&lt;br /&gt;
    else&lt;br /&gt;
        return In_String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string other_words(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
    //This routine searches for the other-than-first words in a string,&lt;br /&gt;
    // and returns it. If no word boundary found, returns&lt;br /&gt;
    // the an empty string.&lt;br /&gt;
    if( Token == &amp;quot;&amp;quot; ) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, pos + 1, llStringLength(In_String));&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
prototype_move()&lt;br /&gt;
{&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    vector SceneLastPosition = ZERO_VECTOR;&lt;br /&gt;
    while( (i &amp;lt; 5) &amp;amp;&amp;amp; (llGetPos() != SceneDestPosition) )&lt;br /&gt;
    {&lt;br /&gt;
        list lParams = [];&lt;br /&gt;
&lt;br /&gt;
        //If we&#039;re not there....&lt;br /&gt;
        if( llGetPos() != SceneDestPosition )&lt;br /&gt;
        {&lt;br /&gt;
            //We may be stuck on the ground...&lt;br /&gt;
            //Did we move at all compared to last loop?&lt;br /&gt;
            if( llGetPos() == SceneLastPosition )&lt;br /&gt;
            {&lt;br /&gt;
                //Yep, stuck...move straight up 10m (attempt to dislodge)&lt;br /&gt;
                lParams = [ PRIM_POSITION, llGetPos() + &amp;lt;0, 0, 10.0&amp;gt; ];&lt;br /&gt;
                //llSetPos(llGetPos() + &amp;lt;0, 0, 10.0&amp;gt;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //Record our spot for &#039;stuck&#039; detection&lt;br /&gt;
                SceneLastPosition = llGetPos();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //Try to move to destination&lt;br /&gt;
        integer iHops = llAbs(llCeil(llVecDist(llGetPos(), SceneDestPosition) / 10.0));&lt;br /&gt;
        integer x;&lt;br /&gt;
        for( x = 0; x &amp;lt; iHops; x++ ) {&lt;br /&gt;
            lParams += [ PRIM_POSITION, SceneDestPosition ];&lt;br /&gt;
        }&lt;br /&gt;
        llSetPrimitiveParams(lParams);&lt;br /&gt;
        //llSleep(0.1);&lt;br /&gt;
        ++i; // changed i++ too ++i credit goes to Simon Sugita for Speed Tweak :)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Set rotation&lt;br /&gt;
    llSetRot(SceneDestRotation);&lt;br /&gt;
}&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;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Open up the listener&lt;br /&gt;
        llListen(PROTOTYPE_SCRIPTS, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        //Set the channel to what&#039;s specified&lt;br /&gt;
        if( start_param != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_SCRIPTS = start_param;&lt;br /&gt;
            state reset_listeners;&lt;br /&gt;
        }&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;
        string command = llToUpper(first_word(message, &amp;quot; &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        if( command == &amp;quot;RECORD&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            SceneOffset = (llGetPos() - SceneVectorBase) / SceneRotationBase;&lt;br /&gt;
            SceneRotation = llGetRot() / SceneRotationBase;&lt;br /&gt;
            SceneSaved = TRUE;&lt;br /&gt;
            llOwnerSay(&amp;quot;Recorded position.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;MOVE&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
    &lt;br /&gt;
            //Don&#039;t move if we&#039;ve not yet recorded a position&lt;br /&gt;
            if( !SceneSaved ) return;&lt;br /&gt;
&lt;br /&gt;
            //Also ignore commands from bases with a different owner than us&lt;br /&gt;
            //(Anti-hacking measure)&lt;br /&gt;
            if( llGetOwner() != llGetOwnerKey(id) ) return;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            SceneDestPosition = (SceneOffset * SceneRotationBase) + SceneVectorBase;&lt;br /&gt;
            SceneDestRotation = SceneRotation * SceneRotationBase;&lt;br /&gt;
&lt;br /&gt;
            //Turn on our timer to perform the move?&lt;br /&gt;
            if( !SceneMove )&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(fTimerInterval);&lt;br /&gt;
                SceneMove = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;PHANTOM&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, turn phantom off&lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;DONE&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, remove script&lt;br /&gt;
            llRemoveInventory(llGetScriptName());&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;CLEAN&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            //Clean up&lt;br /&gt;
            llDie();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;FLUSH&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        //Turn ourselves off&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
&lt;br /&gt;
        //Do we need to move?&lt;br /&gt;
        if( SceneMove )&lt;br /&gt;
        {&lt;br /&gt;
            //Perform the move and clean up&lt;br /&gt;
            prototype_move();&lt;br /&gt;
            SceneMove = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state reset_listeners&lt;br /&gt;
{&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Package Scripts)&lt;br /&gt;
address script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
float gap = 10.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
integer i;&lt;br /&gt;
integer iLine;&lt;br /&gt;
string item;&lt;br /&gt;
vector vThisPos;&lt;br /&gt;
rotation rThisRot;&lt;br /&gt;
&lt;br /&gt;
scene_entry()&lt;br /&gt;
{&lt;br /&gt;
    llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
    object = llGetObjectName();&lt;br /&gt;
    llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
    llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
       &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        scene_entry();&lt;br /&gt;
        vThisPos = llGetPos();&lt;br /&gt;
        rThisRot = llGetRot();&lt;br /&gt;
        iLine = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        for(i=0; i &amp;lt; iLine; i++)&lt;br /&gt;
        {&lt;br /&gt;
            item = llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            llSleep (1.00);&lt;br /&gt;
            llRezObject(item, vThisPos + &amp;lt;0.00, 0.00, 1.00&amp;gt;, ZERO_VECTOR, rThisRot, 0);&lt;br /&gt;
            llShout(PROTOTYPE_SCRIPTS, &amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            if (DEBUG) llShout (DEBUG_CHANNEL, &amp;quot;Rezzing &amp;quot; + item);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(DEBUG_CHANNEL, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;POSITION&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Builders Docs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Builders Manual&lt;br /&gt;
By Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
Welcome to the world of building with your Prototype System. Anyone wishing to build scenes for the Prototype needs to have a good understanding of building and texturing to succeed. Please read this manual through once fully and then as needed when you start building. This manual is divided into several sections:&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
Building scenes&lt;br /&gt;
Building Shells&lt;br /&gt;
Texture Card&lt;br /&gt;
Scene Creation&lt;br /&gt;
Tips&lt;br /&gt;
Packaging&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
The main thing to remember is any object you want to put in the Prototype scene/shell must be copy/mod at a minimum. The way the Prototype system works is by rezzing copies of an item from its inventory. These objects must be modified, adding a special script to make them work with the system scripts.&lt;br /&gt;
&lt;br /&gt;
There are two ways to build with the Prototype:&lt;br /&gt;
&lt;br /&gt;
   1. The linked scene&lt;br /&gt;
   2. The multi-item scene&lt;br /&gt;
&lt;br /&gt;
The linked scene is made from multiple objects and linked; the unlinked scene consists of a number or unlinked objects around the unit.&lt;br /&gt;
&lt;br /&gt;
A scene set will consist of the objects you create and a texture card. These will be explained in greater detail as we move along. The texture card must begin with tex_ or the system will not read them. Feel free to give your scenes a user friendly name, but only with letters, numbers, _ or – in the same name as the current scene we are building for.&lt;br /&gt;
&lt;br /&gt;
Building Scenes&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
   1. Create the objects you want in your scene and arrange them as you like&lt;br /&gt;
   2. Place a label script into each linked object or individual object you have set out in your scene &lt;br /&gt;
   3. Use /1000 SAVE to save the position and rotation of the current scene&lt;br /&gt;
   4. If you wish to modify the scene before repacking or move things around more, enter /1000 RESET and then follow step 3 again&lt;br /&gt;
   5. Next texture the walls, floor, and ceiling; set the repeats, etc. the way you want them&lt;br /&gt;
   6. Open the example tex_*Clear*, and go from prim to prim, and copy the info from the texture window to the notecard as explained above&lt;br /&gt;
   7. Name the suffix of the notecards something user friendly&lt;br /&gt;
   8. Right click on all the objects while holding the Ctrl key and choose edit; then take all the objects into your inventory&lt;br /&gt;
   9. Next, click on your control panel on the wall and press the *Create* button; this will prepare a package for your scene&lt;br /&gt;
  10. Now we will want to name the scene: right click this box, click edit, and fill in something friendly for your scene name and description&lt;br /&gt;
  11. Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts &lt;br /&gt;
  12. Drag the internal address script to the content tab of your inventory and drag the object from our scene that we took into our inventory earlier, copying this to the content tab; we now have all the requirements for loading scenes &lt;br /&gt;
  13. Right click on the Prototype floor panel, choose edit, check edit linked parts, then select the red area of the floor panel (inside the red field) and press Contents tab and drag the object package, and tex_package in there&lt;br /&gt;
  14. Type /1000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
  15. Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
Building Shells&lt;br /&gt;
We will go into much more detail of how to build a scene later, and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
   1. Create the objects you want as your Shell and arrange them as you like&lt;br /&gt;
   2. Place a external label script into each linked object or individual object you have set out as your prototype shell &lt;br /&gt;
   3. Use /2000 SAVE to save the position and rotation of the current shell; if you wish to modify the shell before repacking or move things around more enter /2000 RESET and then follow step 3 again&lt;br /&gt;
   4. Right click on all the object while holding the Ctrl key, edit and take all the objects into your inventory&lt;br /&gt;
   5. Next click on your control panel on the wall and press the *Create* button, preparing a package for your shell&lt;br /&gt;
   6. Now we will want to name the shell package: right click this box, edit it, and fill in something friendly for your shell name and description&lt;br /&gt;
   7. Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts&lt;br /&gt;
   8. Right click on the Prototype floor panel, go into edit, check edit link parts, then select the blue area of the floor panel (inside the blue field)&lt;br /&gt;
   9. Next go to the Content tab and drag the object package into it&lt;br /&gt;
  10. Type /2000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
  11. Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
Texture Card&lt;br /&gt;
The Prototype consists of eight wall, four ceiling, and four floor prims. The texture card has one line for each of these inner prim faces. The prims are named for their direction on the SL compass, and the name of each face on the texture card corresponds to these names. The card must begin with tex_xxx where xxx is the name of the scene, which must be the same name as will be given to the object card.&lt;br /&gt;
&lt;br /&gt;
Each line of the texture card has the following information:&lt;br /&gt;
&lt;br /&gt;
wall section#texture key#vector repeats#vector offsets#float rotation#vector color#float alpha&lt;br /&gt;
&lt;br /&gt;
Once it’s completed, it may look like the following:&lt;br /&gt;
&lt;br /&gt;
ene_wall#2eabe96c-2540-e1fa-ce7f-9030c3d958df#&amp;lt;1.5,1,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&lt;br /&gt;
Each of the items in the texture card must be separated by the symbol #&lt;br /&gt;
&lt;br /&gt;
*Wall Section*&lt;br /&gt;
The wall section name corresponds to the name given to each prim in the Prototype. Use the edit linked parts and then point to the prim, make a note of the wall name. Then go to the card and find the same line containing that wall name.&lt;br /&gt;
&lt;br /&gt;
*Texture Key*&lt;br /&gt;
This is the ID of the texture you are using. This texture must have full permissions. Right click on the prim, select texture, locate it in the list, then right click and copy UUID. Next paste this ID into the note card exactly between the ##.&lt;br /&gt;
&lt;br /&gt;
*Vector Repeats*&lt;br /&gt;
These numbers correspond to the horizontal/vertical repeats found in the texture tab in your edit window.  &lt;br /&gt;
&amp;lt;1.5,1,0&amp;gt;&lt;br /&gt;
The first number is horizontal repeats, the second one is vertical, the third is not used, so will always be 0. Please make sure that the numbers are separated with a comma or they will not work.&lt;br /&gt;
&lt;br /&gt;
*Vector Offsets*&lt;br /&gt;
This set of numbers corresponds to the horizontal/vertical offsets also found in the texture tab in the edit window. For most builds you will keep this set at NULL_VECTOR, since you can’t leave these numbers as 0,0,0. If you do need to offset a texture for some reason, you would replace NULL_VECTOR, with &amp;lt;.5,0,0&amp;gt;, again the first number in the set corresponds to the horizontal offset, the second for vertical offset, the third is not to be used, therefore is left at 0.&lt;br /&gt;
&lt;br /&gt;
*Float Rotation*&lt;br /&gt;
If the texture must be rotated for some reason on the prim face, you will enter that number in the float rotation section. In the example above it’s set at 90.0. Because of the location of some of the walls they will need to be set at 90.0 anyway.&lt;br /&gt;
&lt;br /&gt;
*Vector Color*&lt;br /&gt;
If you would like to tint the prim face, you will use this section. For walls that aren’t tinted, leave the numbers at 1,1,1 because this is equivalent to white/clear. 0,0,0 is black. Below are the basic colours, and included with the Prototype package is a full list of colours in SL format.&lt;br /&gt;
&lt;br /&gt;
Red, Green Blue&lt;br /&gt;
Number may go between 0.1 to 0.9 for each of the three colors&lt;br /&gt;
white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
*Float Alpha*&lt;br /&gt;
This corresponds to the amount of transparency, 1.0 being no transparency, 0.0 is full transparency.&lt;br /&gt;
&lt;br /&gt;
NOTE: One final word on textures. Make sure that when you reference a texture ID key, you keep that texture in your inventory.  If you delete it from inventory, after a while it will be deleted from the asset inventory SL keeps and won’t work anymore.&lt;br /&gt;
&lt;br /&gt;
That’s it for the texture note-card. It’s a little confusing in the beginning, but you will get the hang of it in no time. A demo note-card has been provided for you to use in what ever way you want. Just remember when naming the card, to use the tex_ prefix.&lt;br /&gt;
&lt;br /&gt;
Scene Creation&lt;br /&gt;
Depending on what you plan on using in your Prototype building, your scene will vary. Some people make their own furniture and other items for their scenes for their own use or for sale. Others use free items they have gathered around SL which have copy/mod permissions to build their scenes. The Prototype is perfect for personal homes, clubs, inns and hotels, skyboxes, anywhere you need to rez furniture. The wonderful thing is that you have multiple scenes stored in the Prototype and can change whenever you want, instead of having to keep dragging things from inventory. Or for those of you who don’t want to use all their prims on a home and 5 rooms, why not have one room with five scenes and a nice shell. There are places to purchase copy/mod pose balls for your scenes too.  &lt;br /&gt;
&lt;br /&gt;
Tips&lt;br /&gt;
Some tips when building items for your scenes:&lt;br /&gt;
&lt;br /&gt;
    *&lt;br /&gt;
      Try to link as many prims together as they will load faster than ten smaller objects located around the box&lt;br /&gt;
    *&lt;br /&gt;
      When placing objects keep in mind the location of the door&lt;br /&gt;
    *&lt;br /&gt;
      When making an object that is an odd shape such as a torus, you may want to create a flat box prim below it, and link to that; it will save headaches later on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Packaging&lt;br /&gt;
When you decide to package the item for sale, make sure that you give copy rights to the next owner or they won’t be able to use it. It is also helpful to give full permissions on the texture. Ensure the name you give the object is user friendly, but also only contains letters, numbers _ or -. Don&#039;t forget to add the address script to each completed package.&lt;br /&gt;
&lt;br /&gt;
If you have any questions, please feel free to contact Revolution Perenti, and do join the .::Prototype::. Group you will receive updates of this manual and the scripts as they come out.  If you have any suggestions for this manual please feel free to let me know.&lt;br /&gt;
&lt;br /&gt;
Happy building!&lt;br /&gt;
&lt;br /&gt;
Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Holodeck Commands Quick Overview:&lt;br /&gt;
(.::Prototype 1.63::. should be replaced with what you called your root prim)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Commands Quick Guide&lt;br /&gt;
&lt;br /&gt;
// SCENE SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/1000 .::Prototype 1.63::.,CHANNEL,1001 (replace 1001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/1000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/1000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Prims Remaining on sim;&lt;br /&gt;
/1000 SIM&lt;br /&gt;
Prims Remaining on Parcel&lt;br /&gt;
/1000 PARCEL&lt;br /&gt;
Open or Close door;&lt;br /&gt;
/1000 DOOR&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/1000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/1000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/1000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/1000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/1000 EDIT&lt;br /&gt;
load weather type (this is future update and is reserved until beta testing is complete)&lt;br /&gt;
/1000 COMPATIBILITY Blizzard //replace Blizzard with weather type /snow, rain, blizzard, hail, storm, tornado&lt;br /&gt;
&lt;br /&gt;
// SHELL SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/2000 .::Prototype 1.63::.,CHANNEL,2001 (replace 2001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/2000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/2000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/2000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/2000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/2000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/2000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/2000 EDIT&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for Skidz Partz Open Source&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system and more advanced this is just the basic idea how to get a holodeck working.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library|Holodeck}}&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library|Holodeck}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=31955</id>
		<title>Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=31955"/>
		<updated>2007-09-18T08:17:52Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
What is a Holodeck?&lt;br /&gt;
&lt;br /&gt;
A Holodeck stores Second Life scenes and lets you load them from a menu when ever you want. The old scene is cleared and the new one appears. Scenes can include any prim objects including furniture, pose balls and particle generators. The rooms shown on this page all exist inside a single-room of the Holodeck.&lt;br /&gt;
&lt;br /&gt;
The Scripts for the holodeck may look complex but once you done it correcly everything is very easy to setup and use and just build almost like you normally would within sl&lt;br /&gt;
&lt;br /&gt;
Creating the holodeck, the best way to start would be to create a 20x20x10 shell this would be your rezzing area for the holodeck&lt;br /&gt;
&lt;br /&gt;
once you done this you should have something similar to the picture below&lt;br /&gt;
&lt;br /&gt;
[[Image:holodeck shell.jpg]]&lt;br /&gt;
&lt;br /&gt;
ok next we create a small panel for the floor 0.500x0.500x0.100 and link this to your holodeck shell make sure this is the last object you link to the holodeck shell as this becomes the root prim&lt;br /&gt;
&lt;br /&gt;
see example below&lt;br /&gt;
&lt;br /&gt;
[[Image:floor panel.jpg]]&lt;br /&gt;
&lt;br /&gt;
The Scripts&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Holodeck Core.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// User Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//How long to listen for a menu response before shutting down the listener&lt;br /&gt;
float fListenTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//How often (in seconds) to check for change in position when moving&lt;br /&gt;
float fMovingRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
//How long to sit still before exiting active mode&lt;br /&gt;
float fStoppedTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//Minimum amount of time (in seconds) between movement updates&lt;br /&gt;
float fShoutRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
// label script name used for debug and PrototypeSay();&lt;br /&gt;
string label = &amp;quot;internal label&amp;quot;;&lt;br /&gt;
// Channel used by Prototype&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer MENU_CHANNEL;&lt;br /&gt;
integer MENU_HANDLE;&lt;br /&gt;
string PROTOTYPE_CREATOR;&lt;br /&gt;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
integer PROTOTYPE_RESET = -68195;&lt;br /&gt;
integer SHOW_MENU = -68194;&lt;br /&gt;
// Channel used by Prototype to talk to label scripts&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
// Feature Manager&lt;br /&gt;
integer PROTOTYPE_TEXTURE = TRUE;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Security Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
integer PROTOTYPE_ALLOW_IM = FALSE;&lt;br /&gt;
string  PROTOTYPE_EMAIL = &amp;quot;phoenixcms@hotmail.co.uk&amp;quot;;&lt;br /&gt;
string  PROTOTYPE_OWNER;&lt;br /&gt;
vector  Where;&lt;br /&gt;
string  Name;&lt;br /&gt;
string  SLURL;&lt;br /&gt;
integer X;&lt;br /&gt;
integer Y;&lt;br /&gt;
integer Z;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Menu System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Compatibility System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list objectSettings = [];&lt;br /&gt;
integer stride = 3;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
string COMPATIBILITY_NOTECARD = &amp;quot;compatibility&amp;quot;; //[objectname];&amp;lt;position&amp;gt;;&amp;lt;rotation&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DO NOT EDIT BELOW THIS LINE.... NO.. NOT EVEN THEN&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer PrototypeBaseMoving;&lt;br /&gt;
vector PrototypeLastPosition;&lt;br /&gt;
rotation PrototypeLastRotation;&lt;br /&gt;
integer iListenTimeout = 0;&lt;br /&gt;
&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//To avoid flooding the sim with a high rate of movements&lt;br /&gt;
//(and the resulting mass updates it will bring), we used&lt;br /&gt;
// a short throttle to limit ourselves&lt;br /&gt;
prototype_moved()&lt;br /&gt;
{&lt;br /&gt;
    llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ llGetPos(), llGetRot() ], &amp;quot;|&amp;quot;));&lt;br /&gt;
    llResetTime(); //Reset our throttle&lt;br /&gt;
    PrototypeLastPosition = llGetPos();&lt;br /&gt;
    PrototypeLastRotation = llGetRot();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    iListenTimeout = llGetUnixTime() + llFloor(fListenTime);&lt;br /&gt;
    MENU_CHANNEL = llFloor(llFrand(-99999.0 - -100));&lt;br /&gt;
    MENU_HANDLE = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;www.sl-prototype.com: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
    llSetTimerEvent(fShoutRate);&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;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER || CHANGED_INVENTORY)&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry () &lt;br /&gt;
    {&lt;br /&gt;
        // Lets open our listen channel&lt;br /&gt;
        key_listen = llListen(PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;LISTEN ON CHANNEL &amp;quot; +(string)PROTOTYPE_CHANNEL);&lt;br /&gt;
        // Compatibility System Notecard&lt;br /&gt;
        llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        //Record our position&lt;br /&gt;
        PrototypeLastPosition = llGetPos();&lt;br /&gt;
        PrototypeLastRotation = llGetRot();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    dataserver(key queryId, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            objectSettings += llParseString2List(data, [&amp;quot;;&amp;quot;], []);&lt;br /&gt;
            iLine++;&lt;br /&gt;
            llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Done Reading Compatibility Notecard &amp;quot; + COMPATIBILITY_NOTECARD);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number==SHOW_MENU) {&lt;br /&gt;
            MENU1 = [];&lt;br /&gt;
            MENU2 = [];&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
                MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            Dialog(id, MENU1);&lt;br /&gt;
        }&lt;br /&gt;
        if (number==PROTOTYPE_RESET) {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Forgetting positions...&amp;quot;);&lt;br /&gt;
            llPrototypeSay(&amp;quot;RESET&amp;quot;);&lt;br /&gt;
        }&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;
        list compatibility = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        PROTOTYPE_CREATOR = llGetCreator();&lt;br /&gt;
        //&lt;br /&gt;
        if ( command == llToLower(&amp;quot;CHANNEL&amp;quot;) || command == llToUpper(&amp;quot;CHANNEL&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)PROTOTYPE_CHANNEL );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;MESSAGE&amp;quot;) || command == llToUpper(&amp;quot;MESSAGE&amp;quot;))  &lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_MESSAGE = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llOwnerSay ( &amp;quot;PROTOTYPE MESSAGE set to &amp;quot; + (string)PROTOTYPE_MESSAGE );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // OPEN / CLOSE DOOR    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;DOOR&amp;quot;) || message == llToUpper(&amp;quot;DOOR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, PROTOTYPE_DOOR, &amp;quot;&amp;quot;,NULL_KEY );&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Setting Door Permissions...&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        // SET COMPATIBILITY&lt;br /&gt;
        if(llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;) || llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            string object = llList2String(compatibility, 1);&lt;br /&gt;
            integer indexInSettings = llListFindList(objectSettings, [object]);&lt;br /&gt;
            if(indexInSettings &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                vector pos = (vector)llList2String(objectSettings, indexInSettings + 1);&lt;br /&gt;
                rotation rot = (rotation)llList2String(objectSettings, indexInSettings + 2);&lt;br /&gt;
                llRezAtRoot(object, pos + llGetPos(), ZERO_VECTOR, rot, 0);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // LOAD MENU SYSTEM    &lt;br /&gt;
        if (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                //Loop through backwards (safety precaution in case of inventory change)&lt;br /&gt;
                if (DEBUG) llDebugSay(&amp;quot;Loading build pieces please wait...&amp;quot;);&lt;br /&gt;
                llRezAtRoot(message, llGetPos() + &amp;lt;0.00, 0.00, 0.30&amp;gt;, ZERO_VECTOR, llGetRot(), PROTOTYPE_CHANNEL);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // REPOSTION SCENE    &lt;br /&gt;
        if ( message == llToLower(&amp;quot;POSITION&amp;quot;) || message == llToUpper(&amp;quot;POSITION&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Positioning&amp;quot;);&lt;br /&gt;
            vector vThisPos = llGetPos();&lt;br /&gt;
            rotation rThisRot = llGetRot();&lt;br /&gt;
            llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // CLEAR SCENE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;CLEAR&amp;quot;) || message == llToUpper(&amp;quot;CLEAR&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;CLEAN&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if( message == llToLower(&amp;quot;HOLODECKDIE&amp;quot;) || message == llToUpper(&amp;quot;HOLODECKDIE&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            if(PROTOTYPE_CREATOR) llDie();&lt;br /&gt;
        }&lt;br /&gt;
        // DISABLE PHANTOM AS WE ARE NOW DONE&lt;br /&gt;
        if ( message == llToLower(&amp;quot;NOPHANTOM&amp;quot;) || message == llToUpper(&amp;quot;NOPHANTOM&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            llPrototypeSay(&amp;quot;PHANTOM&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Disabled Phantom&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    moving_start() //StartPrototype&lt;br /&gt;
    {&lt;br /&gt;
        if( !PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            PrototypeBaseMoving = TRUE;&lt;br /&gt;
            llSetTimerEvent(0.0); //Resets the timer if already running&lt;br /&gt;
            llSetTimerEvent(fMovingRate);&lt;br /&gt;
            prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer() &lt;br /&gt;
    {&lt;br /&gt;
        //Were we moving?&lt;br /&gt;
        if( PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
            //Did we change position/rotation?&lt;br /&gt;
            if( (llGetRot() != PrototypeLastRotation) || (llGetPos() != PrototypeLastPosition) )&lt;br /&gt;
            {&lt;br /&gt;
                if( llGetTime() &amp;gt; fShoutRate ) {&lt;br /&gt;
                    prototype_moved();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
        // Have we been sitting long enough to consider ourselves stopped?&lt;br /&gt;
            if( llGetTime() &amp;gt; fStoppedTime )&lt;br /&gt;
            PrototypeBaseMoving = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Open listener?&lt;br /&gt;
        if( iListenTimeout != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            //Past our close timeout?&lt;br /&gt;
            if( iListenTimeout &amp;lt;= llGetUnixTime() )&lt;br /&gt;
            {&lt;br /&gt;
                iListenTimeout = 0;&lt;br /&gt;
                llListenRemove(MENU_HANDLE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Stop the timer?&lt;br /&gt;
        if( (iListenTimeout == 0) &amp;amp;&amp;amp; ( !PrototypeBaseMoving ) )&lt;br /&gt;
        {&lt;br /&gt;
            if (DEBUG) llDebugSay(&amp;quot;Stopping Timer&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    } // END TIMER FUNCTION&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        PROTOTYPE_OWNER = llGetOwner();&lt;br /&gt;
        //Name = llGetRegionName();&lt;br /&gt;
        Name = llDumpList2String(llParseString2List(llGetRegionName(),[&amp;quot; &amp;quot;],[]),&amp;quot;_&amp;quot;);&lt;br /&gt;
        Where = llGetPos();&lt;br /&gt;
&lt;br /&gt;
        X = (integer)Where.x;&lt;br /&gt;
        Y = (integer)Where.y;&lt;br /&gt;
        Z = (integer)Where.z;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // I don&#039;t replace any spaces in Name with %20 and so forth.&lt;br /&gt;
&lt;br /&gt;
        SLURL = &amp;quot;http://slurl.com/secondlife/&amp;quot; + Name + &amp;quot;/&amp;quot; + (string)X + &amp;quot;/&amp;quot; + (string)Y + &amp;quot;/&amp;quot; + (string)Z + &amp;quot;/?title=&amp;quot; + Name;&lt;br /&gt;
&lt;br /&gt;
        llEmail(PROTOTYPE_EMAIL, llKey2Name(PROTOTYPE_OWNER), SLURL + &amp;quot;\nRegistered user =&amp;quot; + llKey2Name(PROTOTYPE_OWNER) + &amp;quot;Registered user key =&amp;quot; + PROTOTYPE_OWNER);&lt;br /&gt;
        if(PROTOTYPE_ALLOW_IM) {&lt;br /&gt;
            llInstantMessage(llGetCreator(), SLURL);&lt;br /&gt;
        }&lt;br /&gt;
        // Reset ourselves&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Texture Engine.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
string TEXTURE_NOTECARD;&lt;br /&gt;
string prefix = &amp;quot;tex_&amp;quot;;&lt;br /&gt;
key TextureQuery;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
integer DEBUG = FALSE; // debug channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
default {&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        TEXTURE_NOTECARD = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + TEXTURE_NOTECARD);&lt;br /&gt;
        TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        list texture = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            TEXTURE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)TEXTURE_CHANNEL);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(llList2String(texture, 0) == &amp;quot;image&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            iLine = 0;&lt;br /&gt;
            TEXTURE_NOTECARD = llList2String(texture, 1);&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////        &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == TextureQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data != EOF &amp;amp;&amp;amp; prefix == &amp;quot;tex_&amp;quot;) {    &lt;br /&gt;
            &lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);&lt;br /&gt;
                llMessageLinked(LINK_SET,0,data,NULL_KEY);&lt;br /&gt;
&lt;br /&gt;
                // increment line count                 &lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                ++iLine;&lt;br /&gt;
                TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Done reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Notecards&lt;br /&gt;
&lt;br /&gt;
*Clear* Notecard for default Clear Scene &lt;br /&gt;
(note the first line of texture notecards is object name so make sure you name all floor panels, roof and walls with unique name and edit the notecard as required add each object line to a new line as required.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Object_Name#2f78ee38-9aca-f8d1-5306-458beab181f9#&amp;lt;3.0,1.0,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
compatibility notecard leave this blank at current its planned as future feature to allow weather inside the holodeck and was the old rez system from early beta but we left it here to be reused later on.&lt;br /&gt;
&lt;br /&gt;
Walls, Floor,Roof texture,particles,sound &amp;amp; locate system&lt;br /&gt;
needs to be added to every object you wish to texture each object needs a unique name too for better control of textures&lt;br /&gt;
System.lsl (updated to 2.0.2)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Skidz Partz - Open Source Holodeck Version (2.0.1)&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// Debug&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
&lt;br /&gt;
// Sound System&lt;br /&gt;
list SOUND_VALUES;&lt;br /&gt;
integer SOUND_TYPE;&lt;br /&gt;
string SOUND_UUID;&lt;br /&gt;
float SOUND_VOLUME;&lt;br /&gt;
// Texture System&lt;br /&gt;
list TEXTURE_VALUES;&lt;br /&gt;
string HOLODECK_OBJECTNAME;&lt;br /&gt;
string TEXTURE_UID;&lt;br /&gt;
vector TEXTURE_REPEATS;&lt;br /&gt;
vector TEXTURE_OFFSETS;&lt;br /&gt;
float TEXTURE_ROTATE;&lt;br /&gt;
vector TEXTURE_COLOR;&lt;br /&gt;
float TEXTURE_ALPHA;&lt;br /&gt;
&lt;br /&gt;
// Lighting System&lt;br /&gt;
list LIGHT_VALUES;&lt;br /&gt;
integer  LIGHT_STATUS;&lt;br /&gt;
// Color of the light (RGB - each value between 0.0 and 1.0)&lt;br /&gt;
vector LIGHT_COLOR;&lt;br /&gt;
// Intensity of the light (values from 0.0 .. 1.0)&lt;br /&gt;
float  LIGHT_LEVEL;&lt;br /&gt;
// Radius of light cone&lt;br /&gt;
float  LIGHT_DISTANCE;&lt;br /&gt;
// Fall off (distance/intensity decrease) values from 0.0 ..1.0&lt;br /&gt;
float  LIGHT_FALLOFF;&lt;br /&gt;
&lt;br /&gt;
// Particle System&lt;br /&gt;
integer PARTICLE_FLAGS;&lt;br /&gt;
//&lt;br /&gt;
list PARTICLE_VALUES;&lt;br /&gt;
key PARTICLE_SRC_TARGET_KEY = &amp;quot;&amp;quot;;&lt;br /&gt;
string PARTICLE_SRC_TEXTURE = &amp;quot;&amp;quot;;&lt;br /&gt;
float PARTICLE_SRC_MAX_AGE;&lt;br /&gt;
float PARTICLE_PART_MAX_AGE;&lt;br /&gt;
float PARTICLE_BURST_RATE;&lt;br /&gt;
integer PARTICLE_BURST_PART_COUNT;&lt;br /&gt;
float PARTICLE_BURST_RADIUS;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MAX;&lt;br /&gt;
float PARTICLE_BURST_SPEED_MIN;&lt;br /&gt;
float PARTICLE_START_ALPHA;&lt;br /&gt;
float PARTICLE_END_ALPHA;&lt;br /&gt;
float PARTICLE_INNERANGLE;&lt;br /&gt;
float PARTICLE_OUTERANGLE;&lt;br /&gt;
vector PARTICLE_START_COLOR;&lt;br /&gt;
vector PARTICLE_END_COLOR;&lt;br /&gt;
vector PARTICLE_START_SCALE;&lt;br /&gt;
vector PARTICLE_END_SCALE;&lt;br /&gt;
vector PARTICLE_ACCEL;&lt;br /&gt;
vector PARTICLE_OMEGA;&lt;br /&gt;
integer PARTICLE_SRC_PATTERN;&lt;br /&gt;
// Link Messages Channels&lt;br /&gt;
integer RESET_SCRIPTS = 0x2F34B;&lt;br /&gt;
integer HOLODECK_LIGHT            = 0x2F34C;&lt;br /&gt;
integer HOLODECK_TEXTURE            = 0x2F34D;&lt;br /&gt;
integer LOCATE_LIGHT = 0x2F34E;&lt;br /&gt;
integer LOCATE_TEXTURE = 0x2F34F;&lt;br /&gt;
integer HOLODECK_PARTICLE = 0x2F350;&lt;br /&gt;
integer HOLODECK_SOUND = 0x2F351;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector eul = &amp;lt;0.00, 0.00, 0.00&amp;gt;;&lt;br /&gt;
        eul *= DEG_TO_RAD;&lt;br /&gt;
        rotation quat = llEuler2Rot( eul );&lt;br /&gt;
        llSetRot( quat );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sent,integer num,string message,key id)&lt;br /&gt;
    {&lt;br /&gt;
    if (num == RESET_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
        llOwnerSay(&amp;quot;Resetting Holodeck Defaults&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_SOUND)&lt;br /&gt;
    {&lt;br /&gt;
        SOUND_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(SOUND_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            SOUND_TYPE = (integer)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_UUID = (string)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            SOUND_VOLUME = (float)llList2String(SOUND_VALUES,1);&lt;br /&gt;
            &lt;br /&gt;
            // Sound Change&lt;br /&gt;
            if(SOUND_TYPE == 1) &lt;br /&gt;
            { &lt;br /&gt;
               llPlaySound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 2) &lt;br /&gt;
            { &lt;br /&gt;
               llLoopSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            else if(SOUND_TYPE == 3) &lt;br /&gt;
            { &lt;br /&gt;
               llTriggerSound(SOUND_UUID, SOUND_VOLUME);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
                                                            &lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_TEXTURE)&lt;br /&gt;
    {&lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            &lt;br /&gt;
            //list conversions&lt;br /&gt;
            string LOCATE_TEXTURE_UID = llGetTexture(0);&lt;br /&gt;
            vector LOCATE_TEXTURE_REPEATS = llList2Vector(llGetPrimitiveParams([PRIM_TEXTURE,0]),1);&lt;br /&gt;
            vector LOCATE_TEXTURE_OFFSETS = llGetTextureOffset(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ROTATE = llGetTextureRot(0) * DEG_TO_RAD;&lt;br /&gt;
            vector LOCATE_TEXTURE_COLOR = llGetColor(0);&lt;br /&gt;
            float LOCATE_TEXTURE_ALPHA = llGetAlpha(0);&lt;br /&gt;
                        &lt;br /&gt;
             llSay(0, (string)HOLODECK_GETOBJECTNAME+(string)&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_UID+                          // name&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_REPEATS+                      // repeats&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_OFFSETS+                      // offsets&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ROTATE+                       // rotation&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_COLOR+                      // color&lt;br /&gt;
                &amp;quot;#&amp;quot;+(string)LOCATE_TEXTURE_ALPHA);                     // alpha     &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == LOCATE_LIGHT)&lt;br /&gt;
    {          &lt;br /&gt;
            // list conversions&lt;br /&gt;
            string HOLODECK_GETOBJECTNAME = llGetObjectName();&lt;br /&gt;
            list LOCATE_PRIM_POINT_LIGHT =  llGetPrimitiveParams([PRIM_POINT_LIGHT]);&lt;br /&gt;
            list LOCATE_STATUS = ([&amp;quot;FALSE&amp;quot;,&amp;quot;TRUE&amp;quot;]);&lt;br /&gt;
            vector LIGHT_COLOR; &lt;br /&gt;
    &lt;br /&gt;
     // output the notecard to chat&lt;br /&gt;
     llSay(0, &amp;quot;locating Lighting Values for &amp;quot; + (string)HOLODECK_GETOBJECTNAME);&lt;br /&gt;
     llSleep(3);&lt;br /&gt;
     llSay(0, (string)HOLODECK_GETOBJECTNAME +                                                // Object Name&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2String(LOCATE_STATUS ,llList2Integer(LOCATE_PRIM_POINT_LIGHT,0)) + // Light Status&lt;br /&gt;
       &amp;quot;#&amp;quot; +(string)llList2Vector(LOCATE_PRIM_POINT_LIGHT,1) +                                // Color&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,2) +                                  // Level&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,3) +                                  // Distance&lt;br /&gt;
       &amp;quot;#&amp;quot;+(string)llList2Float(LOCATE_PRIM_POINT_LIGHT,4));                                  // falloff&lt;br /&gt;
     LOCATE_PRIM_POINT_LIGHT = [];   &lt;br /&gt;
    }&lt;br /&gt;
    else if (num == HOLODECK_LIGHT)&lt;br /&gt;
    {&lt;br /&gt;
        LIGHT_VALUES = llParseString2List(message, [&amp;quot;#&amp;quot;], []);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            LIGHT_STATUS = (integer)llList2String(LIGHT_VALUES,1);&lt;br /&gt;
            LIGHT_COLOR = (vector)llList2String(LIGHT_VALUES,2);&lt;br /&gt;
            LIGHT_LEVEL = (float)llList2String(LIGHT_VALUES,3);&lt;br /&gt;
            LIGHT_DISTANCE = (float)llList2String(LIGHT_VALUES,4);&lt;br /&gt;
            LIGHT_FALLOFF = (float)llList2String(LIGHT_VALUES,5);&lt;br /&gt;
&lt;br /&gt;
            // Lighting Change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_POINT_LIGHT, LIGHT_STATUS, LIGHT_COLOR, LIGHT_LEVEL, LIGHT_DISTANCE, LIGHT_FALLOFF]);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
    else if (num == HOLODECK_TEXTURE)&lt;br /&gt;
    {    &lt;br /&gt;
        TEXTURE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(TEXTURE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            TEXTURE_UID = llList2String(TEXTURE_VALUES,1);&lt;br /&gt;
            TEXTURE_REPEATS = (vector)llList2String(TEXTURE_VALUES,2);&lt;br /&gt;
            TEXTURE_OFFSETS = (vector)llList2String(TEXTURE_VALUES,3);&lt;br /&gt;
            TEXTURE_ROTATE = ((float)llList2String(TEXTURE_VALUES,4)) * DEG_TO_RAD;&lt;br /&gt;
            TEXTURE_COLOR = (vector)llList2String(TEXTURE_VALUES,5);&lt;br /&gt;
            TEXTURE_ALPHA = (float)llList2String(TEXTURE_VALUES,6);&lt;br /&gt;
            &lt;br /&gt;
            //texture change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_TEXTURE,0,TEXTURE_UID,TEXTURE_REPEATS,TEXTURE_OFFSETS,TEXTURE_ROTATE]);&lt;br /&gt;
            llSetPrimitiveParams([PRIM_COLOR,0,TEXTURE_COLOR,TEXTURE_ALPHA]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else if (num == HOLODECK_PARTICLE)&lt;br /&gt;
    {&lt;br /&gt;
        PARTICLE_VALUES = llParseString2List(message,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        HOLODECK_OBJECTNAME = llList2String(PARTICLE_VALUES,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (HOLODECK_OBJECTNAME == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            PARTICLE_PART_MAX_AGE = (float)llList2String(PARTICLE_VALUES,1);&lt;br /&gt;
            PARTICLE_FLAGS = (integer)llList2String(PARTICLE_VALUES,2);&lt;br /&gt;
            PARTICLE_START_COLOR = (vector)llList2String(PARTICLE_VALUES,3);&lt;br /&gt;
            PARTICLE_END_COLOR = (vector)llList2String(PARTICLE_VALUES,4);&lt;br /&gt;
            PARTICLE_START_SCALE = (vector)llList2String(PARTICLE_VALUES,5);&lt;br /&gt;
            PARTICLE_END_SCALE = (vector)llList2String(PARTICLE_VALUES,6);&lt;br /&gt;
            PARTICLE_SRC_PATTERN = (integer)llList2String(PARTICLE_VALUES,7);&lt;br /&gt;
            PARTICLE_BURST_RATE = (float)llList2String(PARTICLE_VALUES,8);&lt;br /&gt;
            PARTICLE_ACCEL = (vector)llList2String(PARTICLE_VALUES,9);&lt;br /&gt;
            PARTICLE_BURST_PART_COUNT = (integer)llList2String(PARTICLE_VALUES,10);&lt;br /&gt;
            PARTICLE_BURST_RADIUS = (float)llList2String(PARTICLE_VALUES,11);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MIN = (float)llList2String(PARTICLE_VALUES,12);&lt;br /&gt;
            PARTICLE_BURST_SPEED_MAX = (float)llList2String(PARTICLE_VALUES,13);&lt;br /&gt;
            PARTICLE_INNERANGLE = (float)llList2String(PARTICLE_VALUES,14);&lt;br /&gt;
            PARTICLE_OUTERANGLE = (float)llList2String(PARTICLE_VALUES,15);&lt;br /&gt;
            PARTICLE_OMEGA = (vector)llList2String(PARTICLE_VALUES,16);&lt;br /&gt;
            PARTICLE_SRC_MAX_AGE = (float)llList2String(PARTICLE_VALUES,17);&lt;br /&gt;
            PARTICLE_START_ALPHA = (float)llList2String(PARTICLE_VALUES,18);&lt;br /&gt;
            PARTICLE_END_ALPHA = (float)llList2String(PARTICLE_VALUES,19);&lt;br /&gt;
            PARTICLE_SRC_TEXTURE = (string)llList2String(PARTICLE_VALUES,20);&lt;br /&gt;
            llSleep(1.5);&lt;br /&gt;
            // Particle Change&lt;br /&gt;
            llParticleSystem([  &lt;br /&gt;
                        PSYS_PART_MAX_AGE, PARTICLE_PART_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_FLAGS, PARTICLE_FLAGS,&lt;br /&gt;
                        PSYS_PART_START_COLOR, PARTICLE_START_COLOR,&lt;br /&gt;
                        PSYS_PART_END_COLOR, PARTICLE_END_COLOR,&lt;br /&gt;
                        PSYS_PART_START_SCALE, PARTICLE_START_SCALE,&lt;br /&gt;
                        PSYS_PART_END_SCALE, PARTICLE_END_SCALE,&lt;br /&gt;
                        PSYS_SRC_PATTERN, PARTICLE_SRC_PATTERN,&lt;br /&gt;
                        PSYS_SRC_BURST_RATE,PARTICLE_BURST_RATE,&lt;br /&gt;
                        PSYS_SRC_ACCEL,PARTICLE_ACCEL,&lt;br /&gt;
                        PSYS_SRC_BURST_PART_COUNT,PARTICLE_BURST_PART_COUNT,&lt;br /&gt;
                        PSYS_SRC_BURST_RADIUS,PARTICLE_BURST_RADIUS,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MIN,PARTICLE_BURST_SPEED_MIN,&lt;br /&gt;
                        PSYS_SRC_BURST_SPEED_MAX,PARTICLE_BURST_SPEED_MAX,&lt;br /&gt;
                        PSYS_SRC_ANGLE_BEGIN,PARTICLE_INNERANGLE,&lt;br /&gt;
                        PSYS_SRC_ANGLE_END,PARTICLE_OUTERANGLE,&lt;br /&gt;
                        PSYS_SRC_OMEGA,PARTICLE_OMEGA,&lt;br /&gt;
                        PSYS_SRC_MAX_AGE,PARTICLE_SRC_MAX_AGE,&lt;br /&gt;
                        PSYS_PART_START_ALPHA,PARTICLE_START_ALPHA,&lt;br /&gt;
                        PSYS_PART_END_ALPHA,PARTICLE_END_ALPHA,&lt;br /&gt;
                        PSYS_SRC_TEXTURE, PARTICLE_SRC_TEXTURE,&lt;br /&gt;
                        PSYS_SRC_TARGET_KEY,PARTICLE_SRC_TARGET_KEY &lt;br /&gt;
                            ]);                         &lt;br /&gt;
        }            &lt;br /&gt;
    }&lt;br /&gt;
    if(DEBUG) llOwnerSay(&amp;quot;This Script Name &amp;quot; + (string)llGetScriptName() + &amp;quot;In Object Name &amp;quot; + (string)llGetObjectName() +  &amp;quot;used &amp;quot; + (string)((16384 - llGetFreeMemory())/1024) + &amp;quot; kBytes&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Door Script to be places in one of the prims where you would like a door, this does a hollow effect to give the impression of the door and is controlled with link messages.&lt;br /&gt;
&lt;br /&gt;
Door System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message( integer sender, integer msg, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == PROTOTYPE_DOOR) {&lt;br /&gt;
            list open = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
            string open2 = llList2String(open, 3);&lt;br /&gt;
            if (llGetSubString(open2,0,2) != &amp;quot;0.0&amp;quot;)&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.0,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
            else&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.95,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
next we create a 0.500x0.500x0.100 box this is used for control panel&lt;br /&gt;
now link this to your holodeck shell linking the shell last becuase we want to keep the root prim intact i normally put this just to the side of the door but you can put this anywhere you like.&lt;br /&gt;
&lt;br /&gt;
Next right click select edit link parts and select the switch now we add the menu functions scripts.&lt;br /&gt;
&lt;br /&gt;
Menu System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list csv_commands;&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
integer SCENEMENU = -68194;&lt;br /&gt;
key agent;&lt;br /&gt;
key objectowner;&lt;br /&gt;
integer group;&lt;br /&gt;
// Set to TRUE to allow group members to use the dialog menu&lt;br /&gt;
// Set to FALSE to disallow group members from using the dialog menu&lt;br /&gt;
integer ingroup = 0;&lt;br /&gt;
integer DEBUG = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay(&amp;quot;Current chanel: &amp;quot;+(string)P_channel);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(command == llToLower(&amp;quot;PERMS&amp;quot;) || message == llToUpper(&amp;quot;PERMS&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            ingroup = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;ingroup set to &amp;quot; + (string)ingroup);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
        {&lt;br /&gt;
            DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    } // end listen();&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   &lt;br /&gt;
        group = llDetectedGroup(0); // Is the Agent in the objowners group?&lt;br /&gt;
        agent = llDetectedKey(0); // Agent&#039;s key&lt;br /&gt;
        objectowner = llGetOwner(); // objowners key&lt;br /&gt;
        // is the Agent = the owner OR is the agent in the owners group&lt;br /&gt;
        if ( (objectowner == agent) || ( group &amp;amp;&amp;amp; ingroup )  )  {&lt;br /&gt;
            llMessageLinked(LINK_SET,SCENEMENU,&amp;quot;&amp;quot;,agent); // id = AviID or llDetectedKey(0) = id or something&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup Scene Clear&lt;br /&gt;
next create a box and label this box *Clear*&lt;br /&gt;
and add the following script this will clear the scenes when you switch.&lt;br /&gt;
&lt;br /&gt;
Clear Label Script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
float gap = 15.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(0, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now take this box to your Inventry.&lt;br /&gt;
&lt;br /&gt;
now create another box Called *Create* give this box full permissions and take into your inventry&lt;br /&gt;
now right click on your holodeck-&amp;gt;content and drag the *Clear* &amp;amp; *Create* boxes into the root prim.&lt;br /&gt;
wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
internal label script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Configurable Settings&lt;br /&gt;
float fTimerInterval = 0.25; //Time in seconds between movement &#039;ticks&#039;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192; //Channel used by Base Prim to talk to Component Prims;&lt;br /&gt;
// This must match in both scripts&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Runtime Variables (Dont need to change below here unless making a derivative)&lt;br /&gt;
vector SceneOffset;&lt;br /&gt;
rotation SceneRotation;&lt;br /&gt;
integer SceneMove;&lt;br /&gt;
vector SceneDestPosition;&lt;br /&gt;
rotation SceneDestRotation;&lt;br /&gt;
integer SceneSaved = FALSE;&lt;br /&gt;
integer PROTOTYPE_VERSION = TRUE; // TRUE = Production, FALSE = Basic / NOMOD, NOCOPY NO TRANS Demo Box&lt;br /&gt;
integer PROTOTYPE_MESSAGE = TRUE;&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string first_word(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the first word in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the whole string.&lt;br /&gt;
    if(Token == &amp;quot;&amp;quot;) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, 0, pos - 1);&lt;br /&gt;
    else&lt;br /&gt;
        return In_String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string other_words(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
    //This routine searches for the other-than-first words in a string,&lt;br /&gt;
    // and returns it. If no word boundary found, returns&lt;br /&gt;
    // the an empty string.&lt;br /&gt;
    if( Token == &amp;quot;&amp;quot; ) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
    //Found it?&lt;br /&gt;
    if( pos &amp;gt;= 1 )&lt;br /&gt;
        return llGetSubString(In_String, pos + 1, llStringLength(In_String));&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
prototype_move()&lt;br /&gt;
{&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    vector SceneLastPosition = ZERO_VECTOR;&lt;br /&gt;
    while( (i &amp;lt; 5) &amp;amp;&amp;amp; (llGetPos() != SceneDestPosition) )&lt;br /&gt;
    {&lt;br /&gt;
        list lParams = [];&lt;br /&gt;
&lt;br /&gt;
        //If we&#039;re not there....&lt;br /&gt;
        if( llGetPos() != SceneDestPosition )&lt;br /&gt;
        {&lt;br /&gt;
            //We may be stuck on the ground...&lt;br /&gt;
            //Did we move at all compared to last loop?&lt;br /&gt;
            if( llGetPos() == SceneLastPosition )&lt;br /&gt;
            {&lt;br /&gt;
                //Yep, stuck...move straight up 10m (attempt to dislodge)&lt;br /&gt;
                lParams = [ PRIM_POSITION, llGetPos() + &amp;lt;0, 0, 10.0&amp;gt; ];&lt;br /&gt;
                //llSetPos(llGetPos() + &amp;lt;0, 0, 10.0&amp;gt;);&lt;br /&gt;
            } else {&lt;br /&gt;
                //Record our spot for &#039;stuck&#039; detection&lt;br /&gt;
                SceneLastPosition = llGetPos();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //Try to move to destination&lt;br /&gt;
        integer iHops = llAbs(llCeil(llVecDist(llGetPos(), SceneDestPosition) / 10.0));&lt;br /&gt;
        integer x;&lt;br /&gt;
        for( x = 0; x &amp;lt; iHops; x++ ) {&lt;br /&gt;
            lParams += [ PRIM_POSITION, SceneDestPosition ];&lt;br /&gt;
        }&lt;br /&gt;
        llSetPrimitiveParams(lParams);&lt;br /&gt;
        //llSleep(0.1);&lt;br /&gt;
        ++i; // changed i++ too ++i credit goes to Simon Sugita for Speed Tweak :)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Set rotation&lt;br /&gt;
    llSetRot(SceneDestRotation);&lt;br /&gt;
}&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;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //Open up the listener&lt;br /&gt;
        llListen(PROTOTYPE_SCRIPTS, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        //Set the channel to what&#039;s specified&lt;br /&gt;
        if( start_param != 0 )&lt;br /&gt;
        {&lt;br /&gt;
            PROTOTYPE_SCRIPTS = start_param;&lt;br /&gt;
            state reset_listeners;&lt;br /&gt;
        }&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;
        string command = llToUpper(first_word(message, &amp;quot; &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        if( command == &amp;quot;RECORD&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            SceneOffset = (llGetPos() - SceneVectorBase) / SceneRotationBase;&lt;br /&gt;
            SceneRotation = llGetRot() / SceneRotationBase;&lt;br /&gt;
            SceneSaved = TRUE;&lt;br /&gt;
            llOwnerSay(&amp;quot;Recorded position.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;MOVE&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
    &lt;br /&gt;
            //Don&#039;t move if we&#039;ve not yet recorded a position&lt;br /&gt;
            if( !SceneSaved ) return;&lt;br /&gt;
&lt;br /&gt;
            //Also ignore commands from bases with a different owner than us&lt;br /&gt;
            //(Anti-hacking measure)&lt;br /&gt;
            if( llGetOwner() != llGetOwnerKey(id) ) return;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
            list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
            vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
            rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
            //Calculate our destination position&lt;br /&gt;
            SceneDestPosition = (SceneOffset * SceneRotationBase) + SceneVectorBase;&lt;br /&gt;
            SceneDestRotation = SceneRotation * SceneRotationBase;&lt;br /&gt;
&lt;br /&gt;
            //Turn on our timer to perform the move?&lt;br /&gt;
            if( !SceneMove )&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(fTimerInterval);&lt;br /&gt;
                SceneMove = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            // lets set objects phantom &lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;PHANTOM&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, turn phantom off&lt;br /&gt;
            llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;DONE&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            //We are done, remove script&lt;br /&gt;
            llRemoveInventory(llGetScriptName());&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;CLEAN&amp;quot; )&lt;br /&gt;
        {&lt;br /&gt;
            //Clean up&lt;br /&gt;
            llDie();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
        if( command == &amp;quot;FLUSH&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        //Turn ourselves off&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
&lt;br /&gt;
        //Do we need to move?&lt;br /&gt;
        if( SceneMove )&lt;br /&gt;
        {&lt;br /&gt;
            //Perform the move and clean up&lt;br /&gt;
            prototype_move();&lt;br /&gt;
            SceneMove = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state reset_listeners&lt;br /&gt;
{&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Package Scripts)&lt;br /&gt;
address script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
float gap = 10.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
integer i;&lt;br /&gt;
integer iLine;&lt;br /&gt;
string item;&lt;br /&gt;
vector vThisPos;&lt;br /&gt;
rotation rThisRot;&lt;br /&gt;
&lt;br /&gt;
scene_entry()&lt;br /&gt;
{&lt;br /&gt;
    llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
    object = llGetObjectName();&lt;br /&gt;
    llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
    llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
       &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        scene_entry();&lt;br /&gt;
        vThisPos = llGetPos();&lt;br /&gt;
        rThisRot = llGetRot();&lt;br /&gt;
        iLine = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        for(i=0; i &amp;lt; iLine; i++)&lt;br /&gt;
        {&lt;br /&gt;
            item = llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
            llSleep (1.00);&lt;br /&gt;
            llRezObject(item, vThisPos + &amp;lt;0.00, 0.00, 1.00&amp;gt;, ZERO_VECTOR, rThisRot, 0);&lt;br /&gt;
            llShout(PROTOTYPE_SCRIPTS, &amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
            if (DEBUG) llShout (DEBUG_CHANNEL, &amp;quot;Rezzing &amp;quot; + item);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(DEBUG_CHANNEL, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;POSITION&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Builders Docs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Builders Manual&lt;br /&gt;
By Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
Welcome to the world of building with your Prototype System. Anyone wishing to build scenes for the Prototype needs to have a good understanding of building and texturing to succeed. Please read this manual through once fully and then as needed when you start building. This manual is divided into several sections:&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
Building scenes&lt;br /&gt;
Building Shells&lt;br /&gt;
Texture Card&lt;br /&gt;
Scene Creation&lt;br /&gt;
Tips&lt;br /&gt;
Packaging&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
The main thing to remember is any object you want to put in the Prototype scene/shell must be copy/mod at a minimum. The way the Prototype system works is by rezzing copies of an item from its inventory. These objects must be modified, adding a special script to make them work with the system scripts.&lt;br /&gt;
&lt;br /&gt;
There are two ways to build with the Prototype:&lt;br /&gt;
&lt;br /&gt;
   1. The linked scene&lt;br /&gt;
   2. The multi-item scene&lt;br /&gt;
&lt;br /&gt;
The linked scene is made from multiple objects and linked; the unlinked scene consists of a number or unlinked objects around the unit.&lt;br /&gt;
&lt;br /&gt;
A scene set will consist of the objects you create and a texture card. These will be explained in greater detail as we move along. The texture card must begin with tex_ or the system will not read them. Feel free to give your scenes a user friendly name, but only with letters, numbers, _ or – in the same name as the current scene we are building for.&lt;br /&gt;
&lt;br /&gt;
Building Scenes&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
   1. Create the objects you want in your scene and arrange them as you like&lt;br /&gt;
   2. Place a label script into each linked object or individual object you have set out in your scene &lt;br /&gt;
   3. Use /1000 SAVE to save the position and rotation of the current scene&lt;br /&gt;
   4. If you wish to modify the scene before repacking or move things around more, enter /1000 RESET and then follow step 3 again&lt;br /&gt;
   5. Next texture the walls, floor, and ceiling; set the repeats, etc. the way you want them&lt;br /&gt;
   6. Open the example tex_*Clear*, and go from prim to prim, and copy the info from the texture window to the notecard as explained above&lt;br /&gt;
   7. Name the suffix of the notecards something user friendly&lt;br /&gt;
   8. Right click on all the objects while holding the Ctrl key and choose edit; then take all the objects into your inventory&lt;br /&gt;
   9. Next, click on your control panel on the wall and press the *Create* button; this will prepare a package for your scene&lt;br /&gt;
  10. Now we will want to name the scene: right click this box, click edit, and fill in something friendly for your scene name and description&lt;br /&gt;
  11. Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts &lt;br /&gt;
  12. Drag the internal address script to the content tab of your inventory and drag the object from our scene that we took into our inventory earlier, copying this to the content tab; we now have all the requirements for loading scenes &lt;br /&gt;
  13. Right click on the Prototype floor panel, choose edit, check edit linked parts, then select the red area of the floor panel (inside the red field) and press Contents tab and drag the object package, and tex_package in there&lt;br /&gt;
  14. Type /1000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
  15. Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
Building Shells&lt;br /&gt;
We will go into much more detail of how to build a scene later, and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
   1. Create the objects you want as your Shell and arrange them as you like&lt;br /&gt;
   2. Place a external label script into each linked object or individual object you have set out as your prototype shell &lt;br /&gt;
   3. Use /2000 SAVE to save the position and rotation of the current shell; if you wish to modify the shell before repacking or move things around more enter /2000 RESET and then follow step 3 again&lt;br /&gt;
   4. Right click on all the object while holding the Ctrl key, edit and take all the objects into your inventory&lt;br /&gt;
   5. Next click on your control panel on the wall and press the *Create* button, preparing a package for your shell&lt;br /&gt;
   6. Now we will want to name the shell package: right click this box, edit it, and fill in something friendly for your shell name and description&lt;br /&gt;
   7. Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts&lt;br /&gt;
   8. Right click on the Prototype floor panel, go into edit, check edit link parts, then select the blue area of the floor panel (inside the blue field)&lt;br /&gt;
   9. Next go to the Content tab and drag the object package into it&lt;br /&gt;
  10. Type /2000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
  11. Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
Texture Card&lt;br /&gt;
The Prototype consists of eight wall, four ceiling, and four floor prims. The texture card has one line for each of these inner prim faces. The prims are named for their direction on the SL compass, and the name of each face on the texture card corresponds to these names. The card must begin with tex_xxx where xxx is the name of the scene, which must be the same name as will be given to the object card.&lt;br /&gt;
&lt;br /&gt;
Each line of the texture card has the following information:&lt;br /&gt;
&lt;br /&gt;
wall section#texture key#vector repeats#vector offsets#float rotation#vector color#float alpha&lt;br /&gt;
&lt;br /&gt;
Once it’s completed, it may look like the following:&lt;br /&gt;
&lt;br /&gt;
ene_wall#2eabe96c-2540-e1fa-ce7f-9030c3d958df#&amp;lt;1.5,1,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&lt;br /&gt;
Each of the items in the texture card must be separated by the symbol #&lt;br /&gt;
&lt;br /&gt;
*Wall Section*&lt;br /&gt;
The wall section name corresponds to the name given to each prim in the Prototype. Use the edit linked parts and then point to the prim, make a note of the wall name. Then go to the card and find the same line containing that wall name.&lt;br /&gt;
&lt;br /&gt;
*Texture Key*&lt;br /&gt;
This is the ID of the texture you are using. This texture must have full permissions. Right click on the prim, select texture, locate it in the list, then right click and copy UUID. Next paste this ID into the note card exactly between the ##.&lt;br /&gt;
&lt;br /&gt;
*Vector Repeats*&lt;br /&gt;
These numbers correspond to the horizontal/vertical repeats found in the texture tab in your edit window.  &lt;br /&gt;
&amp;lt;1.5,1,0&amp;gt;&lt;br /&gt;
The first number is horizontal repeats, the second one is vertical, the third is not used, so will always be 0. Please make sure that the numbers are separated with a comma or they will not work.&lt;br /&gt;
&lt;br /&gt;
*Vector Offsets*&lt;br /&gt;
This set of numbers corresponds to the horizontal/vertical offsets also found in the texture tab in the edit window. For most builds you will keep this set at NULL_VECTOR, since you can’t leave these numbers as 0,0,0. If you do need to offset a texture for some reason, you would replace NULL_VECTOR, with &amp;lt;.5,0,0&amp;gt;, again the first number in the set corresponds to the horizontal offset, the second for vertical offset, the third is not to be used, therefore is left at 0.&lt;br /&gt;
&lt;br /&gt;
*Float Rotation*&lt;br /&gt;
If the texture must be rotated for some reason on the prim face, you will enter that number in the float rotation section. In the example above it’s set at 90.0. Because of the location of some of the walls they will need to be set at 90.0 anyway.&lt;br /&gt;
&lt;br /&gt;
*Vector Color*&lt;br /&gt;
If you would like to tint the prim face, you will use this section. For walls that aren’t tinted, leave the numbers at 1,1,1 because this is equivalent to white/clear. 0,0,0 is black. Below are the basic colours, and included with the Prototype package is a full list of colours in SL format.&lt;br /&gt;
&lt;br /&gt;
Red, Green Blue&lt;br /&gt;
Number may go between 0.1 to 0.9 for each of the three colors&lt;br /&gt;
white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
*Float Alpha*&lt;br /&gt;
This corresponds to the amount of transparency, 1.0 being no transparency, 0.0 is full transparency.&lt;br /&gt;
&lt;br /&gt;
NOTE: One final word on textures. Make sure that when you reference a texture ID key, you keep that texture in your inventory.  If you delete it from inventory, after a while it will be deleted from the asset inventory SL keeps and won’t work anymore.&lt;br /&gt;
&lt;br /&gt;
That’s it for the texture note-card. It’s a little confusing in the beginning, but you will get the hang of it in no time. A demo note-card has been provided for you to use in what ever way you want. Just remember when naming the card, to use the tex_ prefix.&lt;br /&gt;
&lt;br /&gt;
Scene Creation&lt;br /&gt;
Depending on what you plan on using in your Prototype building, your scene will vary. Some people make their own furniture and other items for their scenes for their own use or for sale. Others use free items they have gathered around SL which have copy/mod permissions to build their scenes. The Prototype is perfect for personal homes, clubs, inns and hotels, skyboxes, anywhere you need to rez furniture. The wonderful thing is that you have multiple scenes stored in the Prototype and can change whenever you want, instead of having to keep dragging things from inventory. Or for those of you who don’t want to use all their prims on a home and 5 rooms, why not have one room with five scenes and a nice shell. There are places to purchase copy/mod pose balls for your scenes too.  &lt;br /&gt;
&lt;br /&gt;
Tips&lt;br /&gt;
Some tips when building items for your scenes:&lt;br /&gt;
&lt;br /&gt;
    *&lt;br /&gt;
      Try to link as many prims together as they will load faster than ten smaller objects located around the box&lt;br /&gt;
    *&lt;br /&gt;
      When placing objects keep in mind the location of the door&lt;br /&gt;
    *&lt;br /&gt;
      When making an object that is an odd shape such as a torus, you may want to create a flat box prim below it, and link to that; it will save headaches later on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Packaging&lt;br /&gt;
When you decide to package the item for sale, make sure that you give copy rights to the next owner or they won’t be able to use it. It is also helpful to give full permissions on the texture. Ensure the name you give the object is user friendly, but also only contains letters, numbers _ or -. Don&#039;t forget to add the address script to each completed package.&lt;br /&gt;
&lt;br /&gt;
If you have any questions, please feel free to contact Revolution Perenti, and do join the .::Prototype::. Group you will receive updates of this manual and the scripts as they come out.  If you have any suggestions for this manual please feel free to let me know.&lt;br /&gt;
&lt;br /&gt;
Happy building!&lt;br /&gt;
&lt;br /&gt;
Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Holodeck Commands Quick Overview:&lt;br /&gt;
(.::Prototype 1.63::. should be replaced with what you called your root prim)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Commands Quick Guide&lt;br /&gt;
&lt;br /&gt;
// SCENE SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/1000 .::Prototype 1.63::.,CHANNEL,1001 (replace 1001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/1000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/1000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Prims Remaining on sim;&lt;br /&gt;
/1000 SIM&lt;br /&gt;
Prims Remaining on Parcel&lt;br /&gt;
/1000 PARCEL&lt;br /&gt;
Open or Close door;&lt;br /&gt;
/1000 DOOR&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/1000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/1000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/1000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/1000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/1000 EDIT&lt;br /&gt;
load weather type (this is future update and is reserved until beta testing is complete)&lt;br /&gt;
/1000 COMPATIBILITY Blizzard //replace Blizzard with weather type /snow, rain, blizzard, hail, storm, tornado&lt;br /&gt;
&lt;br /&gt;
// SHELL SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/2000 .::Prototype 1.63::.,CHANNEL,2001 (replace 2001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/2000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/2000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/2000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/2000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/2000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/2000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/2000 EDIT&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system and more advanced this is just the basic idear how to get a holodeck working.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:sort|Open Source Holodeck}}{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Compiling_the_viewer_libraries_(MSVS_2003)&amp;diff=30504</id>
		<title>Compiling the viewer libraries (MSVS 2003)</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Compiling_the_viewer_libraries_(MSVS_2003)&amp;diff=30504"/>
		<updated>2007-09-06T00:27:20Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{CompileNav}}&lt;br /&gt;
&lt;br /&gt;
This page supplements [[Compiling the viewer (MSVS2003)]].&lt;br /&gt;
&lt;br /&gt;
In the source directory, there are several empty placeholder folders for libraries which the Second Life viewer relies upon. This section describes how to acquire the code, and how to install it. It is a good idea to install in order, as some libraries will rely on previous installs (ie, libcurl needs openssl and zlib).&lt;br /&gt;
&lt;br /&gt;
===== Boost =====&lt;br /&gt;
* Download &amp;amp; extract [http://sourceforge.net/project/showfiles.php?group_id=7586&amp;amp;package_id=8041 Boost] source for win32.&lt;br /&gt;
* Copy the &amp;quot;boost_X_XX_X\boost&amp;quot; folder to &amp;quot;libraries\include\&amp;quot;.&lt;br /&gt;
* Run &amp;quot;Run &amp;quot;boost_X_XX_X\tools\jam\build_dist.bat&amp;quot;.&lt;br /&gt;
* Copy &amp;quot;boost_X_XX_X\tools\jam\src\bin.ntx86\bjam.exe&amp;quot; to &amp;quot;boost_X_XX_X\&amp;quot;.&lt;br /&gt;
* Using the command prompt, build the static libraries:&lt;br /&gt;
** cd boost_X_XX_X&lt;br /&gt;
** set PYTHON_ROOT=C:\Python23&lt;br /&gt;
** set PYTHON_VERSION=2.3&lt;br /&gt;
** bjam --toolset=msvc-7.1 stage&lt;br /&gt;
* copy &amp;quot;boost_X_XX_X\stage\lib\libboost_python-vc71-mt.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_release\&amp;quot;&lt;br /&gt;
* copy &amp;quot;boost_X_XX_X\stage\lib\libboost_python-vc71-mt-gd.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_debug\libboost_python-vc71-mt.lib&amp;quot;&lt;br /&gt;
* copy &amp;quot;boost_X_XX_X\stage\lib\libboost_regex-vc71-mt-s.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_release\&amp;quot;&lt;br /&gt;
* copy &amp;quot;boost_X_XX_X\stage\lib\libboost_regex-vc71-mt-sgd.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_debug\libboost_regex-vc71-mt-s.lib&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Expat =====&lt;br /&gt;
* Download and run [http://sourceforge.net/project/showfiles.php?group_id=10127 Expat Win32 Binary]&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\Source\lib\expat.h&amp;quot; to &amp;quot;libraries\include\expat\&amp;quot;.&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\Source\lib\expat_external.h&amp;quot; to &amp;quot;libraries\include\expat\&amp;quot;.&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\StaticLibs\libexpatMT.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release\&amp;quot;.&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\StaticLibs\libexpatMT.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== ZLib =====&lt;br /&gt;
* Download &amp;amp; extract [http://www.zlib.net/ Zlib]&lt;br /&gt;
* copy &amp;quot;zlibXXX\zlib.h&amp;quot; to &amp;quot;libraries\include\zlib\&amp;quot;.&lt;br /&gt;
* copy &amp;quot;zlibXXX\zconf.h&amp;quot; to &amp;quot;libraries\include\zlib\&amp;quot;.&lt;br /&gt;
* Using the command prompt, build the static libraries:&lt;br /&gt;
** &amp;quot;C:\Program Files\Microsoft Visual Studio .net 2003\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
** cd %ZLIB_FOLDER%&lt;br /&gt;
** nmake -f win32/Makefile.msc&lt;br /&gt;
* copy &amp;quot;zlibXXX\zlib.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release\&amp;quot;.&lt;br /&gt;
* copy &amp;quot;zlibXXX\zlib.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== Apache Portable Runtime =====&lt;br /&gt;
* Take out XML dependancies, move expat headers!!!!&lt;br /&gt;
* Download &amp;amp; extract [http://apr.apache.org/download.cgi apr, apr-util, and apr-iconv].&lt;br /&gt;
* For simplicity  place all three in a parallel directory structure, and rename the directories:&lt;br /&gt;
** C:\work\apr\&lt;br /&gt;
** C:\work\apr-iconv\&lt;br /&gt;
** C:\work\apr-util\&lt;br /&gt;
* Open the &amp;quot;\apr-util\aprutil.dsw&amp;quot; project in VS2003.&lt;br /&gt;
* For the apr, apr-util &amp;amp; apr-iconv projects, change the Runtime Library from Multi-threaded DLL to Multi-threaded:&lt;br /&gt;
** Right click each project in the Solution Explorer, choose properties.&lt;br /&gt;
** In the C/C++ folder, choose Code Generation.&lt;br /&gt;
** Change the Runtime Library to Muli-threaded.&lt;br /&gt;
** Repeat for both debug and release.&lt;br /&gt;
* Remove the apr-util&#039;s dependency on xml:&lt;br /&gt;
** Right click the apr-util project, and choose dependencies.&lt;br /&gt;
** Uncheck xml.&lt;br /&gt;
** Right click the xml project in the Solution Explorer.&lt;br /&gt;
** Choose Remove.&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\Source\lib\expat.h&amp;quot; to &amp;quot;apr\apr-util\xml&amp;quot;.&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\Source\lib\expat_external.h&amp;quot; to &amp;quot;apr\apr-util\xml\&amp;quot;.&lt;br /&gt;
* Build Solution for Debug, and build solution for release.&lt;br /&gt;
* copy &amp;quot;\apr-util\LibR\aprutil-1.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr-util\LibR\aprutil_src.pdb&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr\LibR\apr-1.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr\LibR\apr_src.pdb&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr-util\LibD\aprutil-1.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr-util\LibD\aprutil_src.pdb&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr\LibD\apr-1.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr\LibD\apr_src.pdb&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
* copy header files:&lt;br /&gt;
** copy the contents of &amp;quot;apr\include&amp;quot; to &amp;quot;libraries\i686-win32\include\apr-1&amp;quot;. &lt;br /&gt;
** in &amp;quot;libraries\i686-win32\include\apr-1\arch\&amp;quot; only the &amp;quot;win32&amp;quot; dir and &amp;quot;apr_private_common.h&amp;quot; are required.&lt;br /&gt;
** copy the contents of &amp;quot;apr-util\include&amp;quot; to &amp;quot;libraries\i686-win32\include\apr-1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== Freetype =====&lt;br /&gt;
* Download and run [http://gnuwin32.sourceforge.net/packages/freetype.htm FreeType for Windows].&lt;br /&gt;
* copy the contents of &amp;quot;GnuWin32\include\freetype2\freetype&amp;quot; into &amp;quot;\libraries\include\freetype&amp;quot;&lt;br /&gt;
* copy &amp;quot;GnuWin32\lib\freetype.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;. &lt;br /&gt;
* copy &amp;quot;GnuWin32\lib\freetype.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
* copy &amp;quot;GnuWin32\include\ft2build.h&amp;quot; to &amp;quot;libraries\include&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL =====&lt;br /&gt;
* Download and extract: http://www.openssl.org/source/&lt;br /&gt;
* Using the command prompt, build the static libraries:&lt;br /&gt;
** cd %PATH%&lt;br /&gt;
** perl Configure VC-WIN32&lt;br /&gt;
** ms\do_masm&lt;br /&gt;
* Edit openssl-X.X.Xy\ms\nt.mak&lt;br /&gt;
** Change /MD to /MT in CFLAGS&lt;br /&gt;
* back in the command prompt:&lt;br /&gt;
** &amp;quot;C:\Program Files\Microsoft Visual Studio .net 2003\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
** nmake -f ms\nt.mak&lt;br /&gt;
** copy all the &amp;quot;.lib&amp;quot; files from &amp;quot;openssl-X.X.Xy\out32&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== cURL =====&lt;br /&gt;
* Download &amp;amp; extract the [http://curl.haxx.se/download.html curl source].&lt;br /&gt;
* Edit &amp;quot;curl-X.XX.X\lib\Makefile.vc6&amp;quot;&lt;br /&gt;
** Change OPENSSL_PATH to ../../../openssl-&amp;lt;version&amp;gt;&lt;br /&gt;
** Change the ZLIB_PATH to ../../../zlib-&amp;lt;version&amp;gt;/src&lt;br /&gt;
** Change RTLIB to /MT&lt;br /&gt;
** Change RTLIBD to /MTd &lt;br /&gt;
* Using the command prompt, build the static libraries:&lt;br /&gt;
** &amp;quot;C:\Program Files\Microsoft Visual Studio .net 2003\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
** cd %PATH%\lib\&lt;br /&gt;
** nmake /f Makefile.vc6 CFG=release-ssl-zlib&lt;br /&gt;
** Copy &amp;quot;curl-X.XX.X\lib\release-ssl-zlib\libcurl.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;&lt;br /&gt;
** Copy &amp;quot;curl-X.XX.X\lib\release-ssl-zlib\libcurl.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
** Copy all the header files in &amp;quot;curl-X.XX.X\include\curl&amp;quot; to &amp;quot;libraries\include\curl&amp;quot; &lt;br /&gt;
&lt;br /&gt;
===== XMLRPC-epi =====&lt;br /&gt;
&lt;br /&gt;
**Download and Extract [http://xmlrpc-epi.sourceforge.net/ xmlrpc-epi].&lt;br /&gt;
**Get the patch 1 &amp;amp; 3 from [[Patch_xmlrpc-epi]]&lt;br /&gt;
*Using cygwin:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ tar xvzf xmlrpc-epi-0.51&lt;br /&gt;
$ cd xmlrpc-epi-0.51&lt;br /&gt;
$ patch -p1 &amp;lt; ../remove_iconv.patch&lt;br /&gt;
$ patch -p1 &amp;lt; ../excise_expat.patch&lt;br /&gt;
$ rm -rf expat&lt;br /&gt;
$ mkdir expat&lt;br /&gt;
$ cp $FOO expat&lt;br /&gt;
    Where $FOO is either&lt;br /&gt;
        /tmp/expat/include/* -- if you built expat recently&lt;br /&gt;
    or  ../../expat-1.95.8/src/lib/expat*.h -- if you haven&#039;t&lt;br /&gt;
    in this later case you&#039;ll need to have CVS gotten the expat&lt;br /&gt;
    lib, and expanded it&#039;s src.tar.gz file there&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Copy over the Visual Studio files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp ../src/xmlrpcepi.* .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Open the xmlrpcepi.sln file and build&lt;br /&gt;
&lt;br /&gt;
===== Vorbis &amp;amp; Ogg =====&lt;br /&gt;
* Download &amp;amp; extract [http://www.xiph.org/downloads/ libvorbis].&lt;br /&gt;
* Download &amp;amp; extract [http://www.xiph.org/downloads/ libogg].&lt;br /&gt;
* Build &amp;amp; copy libogg first:&lt;br /&gt;
** Open &amp;quot;libogg-X.X.X\win32\ogg_static.dsp&amp;quot; in visual studio.&lt;br /&gt;
** Build both debug and release solutions.&lt;br /&gt;
** Copy &amp;quot;libogg-X.X.X\include\ogg&amp;quot; into &amp;quot;libvorbis-X.X.X\include&amp;quot;&lt;br /&gt;
** Copy &amp;quot;libogg-X.X.X\include\ogg\ogg.h&amp;quot; to &amp;quot;libraries\include\ogg&amp;quot;&lt;br /&gt;
** Copy &amp;quot;libogg-X.X.X\include\ogg\os_types.h&amp;quot; to &amp;quot;libraries\include\ogg&amp;quot;&lt;br /&gt;
** Copy &amp;quot;libogg-X.X.X\win32\Static_Release\ogg_static.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
** Copy &amp;quot;libogg-X.X.X\win32\Static_Debug\ogg_static_d.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\ogg_static.lib&amp;quot;&lt;br /&gt;
* Build &amp;amp; copy libvorbis:&lt;br /&gt;
** Build release &amp;amp; debug &amp;quot;libvorbis-X.X.X\win32\vorbis_static.dsp&amp;quot;&lt;br /&gt;
** Build release &amp;amp; debug &amp;quot;libvorbis-X.X.X\win32\vorbisfile_static.dsp&amp;quot;&lt;br /&gt;
** Build release &amp;amp; debug &amp;quot;libvorbis-X.X.X\win32\vorbisenc_static.dsp&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-X.X.X\include\vorbis\codec.h&amp;quot; to &amp;quot;libraries\include\vorbis&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-X.X.X\include\vorbis\vorbisfile.h&amp;quot; to &amp;quot;libraries\include\vorbis&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-X.X.X\include\vorbis\vorbisenc.h&amp;quot; to &amp;quot;libraries\include\vorbis&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\Vorbis_Static_Release\vorbis_static.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\VorbisEnc_Static_Release\vorbisenc_static.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\VorbisFile_Static_Release\vorbisfile_static.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\Vorbis_Static_Debug\vorbis_static_d.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\vorbis_static.lib&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\VorbisEnc_Static_Debug\vorbisenc_static_d.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\vorbisenc_static.lib&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\VorbisFile_Static_Debug\vorbisfile_static_d.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\vorbisfile_static.lib&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== JPEGlib =====&lt;br /&gt;
* Download &amp;amp; extract [http://www.ijg.org/ jpeglib] - download the file &#039;jpegsrc.v6b.tar.gz&#039;.&lt;br /&gt;
* Copy &amp;quot;jpegsr6\jpeg-6b\makefile.vc&amp;quot; to the file &amp;quot;jpegsr6\jpeg-6b\Makefile&amp;quot;&lt;br /&gt;
* Copy &amp;quot;jpegsr6\jpeg-6b\jconfig.vc&amp;quot; to &amp;quot;jpegsr6\jpeg-6b\jconfig.h&amp;quot;&lt;br /&gt;
* At the command prompt:&lt;br /&gt;
** &amp;quot;C:\Program Files\Microsoft Visual Studio .net 2003\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
** cd %ZLIB_FOLDER%&lt;br /&gt;
** nmake -f Makefile&lt;br /&gt;
* copy &amp;quot;jconfig.h&amp;quot;, &amp;quot;jerror.h&amp;quot;, &amp;quot;jmorecfg.h&amp;quot;, &amp;quot;jpeglib.h&amp;quot;, and &amp;quot;jinclude.h&amp;quot; from * to &amp;quot;libraries\include\jpeglib&amp;quot;&lt;br /&gt;
* copy &amp;quot;jpegsr6\jpeg-6b\libjpeg.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
* copy &amp;quot;jpegsr6\jpeg-6b\libjpeg.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;&lt;br /&gt;
* [[Patch jpeglib]]&lt;br /&gt;
&lt;br /&gt;
===== OpenJPEG =====&lt;br /&gt;
* Download and extract [http://www.openjpeg.org/index.php?menu=download openjpeg for win32].&lt;br /&gt;
* Copy &amp;quot;openjpeg10_win32\openjpeg.h&amp;quot; to &amp;quot;&amp;quot;\libraries\include\openjpeg&amp;quot;&lt;br /&gt;
* Copy &amp;quot;openjpeg10_win32\LibOpenJPEG.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_release&amp;quot;.&lt;br /&gt;
* Copy &amp;quot;openjpeg10_win32\LibOpenJPEG.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== TUT =====&lt;br /&gt;
* Download and extract [http://tut-framework.sourceforge.net/download/ tut]&lt;br /&gt;
* [[Patch TUT]] to add test skipping.&lt;br /&gt;
* Copy &amp;quot;tut.h&amp;quot;, &amp;quot;tut_reporter.h&amp;quot;, and &amp;quot;tut_restartable.h&amp;quot; to &amp;quot;libraries\include\tut&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== LLMozLib =====&lt;br /&gt;
These instructions describe how to build the Windows version of LLMozLib for use within the Second Life client. They have been tested using Microsoft Visual Studio 7.1 - apparently, things do work with other versions of the Microsoft compiler but they have not been tried or tested.&lt;br /&gt;
&lt;br /&gt;
LLMozLib currently uses code from the 1.8.0 branch of the Mozilla codebase - similar to what is used in Firefox 1.5. At some point in the future we will switch to the 1.8.1 branch - the one used to build Firefox 2.0.&lt;br /&gt;
&lt;br /&gt;
Get our snapshot llmozlib from the [[source downloads]] page. &lt;br /&gt;
&lt;br /&gt;
The steps required to generate LLMozLib and associated run-time files are:&lt;br /&gt;
&lt;br /&gt;
* Set up your environment for building the Mozilla source code. (these instructions are specific to the Mozilla branch we are using - building the trunk is different)&lt;br /&gt;
&lt;br /&gt;
 http://developer.mozilla.org/en/docs/Windows_Build_Prerequisites_on_the_1.7_and_1.8_Branches&lt;br /&gt;
&lt;br /&gt;
* Checkout the Mozilla source code from their CVS repository. Let&#039;s assume you are using the &amp;lt;code&amp;gt;c:\mozilla&amp;lt;/code&amp;gt; directory to build in.&lt;br /&gt;
  c:&lt;br /&gt;
  cd \&lt;br /&gt;
  export CVSROOT=:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot&lt;br /&gt;
  cvs login (the password is &#039;anonymous&#039;)&lt;br /&gt;
  cvs checkout -r FIREFOX_1_5_0_9_RELEASE mozilla/client.mk&lt;br /&gt;
  cd c:\mozilla&lt;br /&gt;
  make -f client.mk checkout MOZ_CO_PROJECT=xulrunner&lt;br /&gt;
&lt;br /&gt;
:Note: the CVS tag will change as Mozilla release updates. Version 1.5.0.9 is current as of writing.&lt;br /&gt;
&lt;br /&gt;
* Apply a patch which enables certain features that are required for the Second Life client.&lt;br /&gt;
&lt;br /&gt;
:The patch can be found in the llmozlib &amp;lt;code&amp;gt;build_mozilla&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
:Copy the patch into the directory where you are building Mozilla and apply the patch:&lt;br /&gt;
&lt;br /&gt;
 patch -p0 &amp;lt; linden_updates.patch&lt;br /&gt;
&lt;br /&gt;
* Build optimized (release) and debug versions of a XULRunner configuration of the Mozilla codebase.&lt;br /&gt;
&lt;br /&gt;
:The &amp;lt;code&amp;gt;build_mozilla&amp;lt;/code&amp;gt; directory contains 2 Mozilla configuration files - one for a debug build and one for an optimized build.&lt;br /&gt;
&lt;br /&gt;
:Copy both files into the directory where you are building Mozilla and then:&lt;br /&gt;
&lt;br /&gt;
 copy .mozconfig.debug .mozconfig&lt;br /&gt;
 make -f client.mk build&lt;br /&gt;
&lt;br /&gt;
 copy .mozconfig.optimized .mozconfig&lt;br /&gt;
 make -f client.mk build&lt;br /&gt;
&lt;br /&gt;
* Copy a subset of the header files and libraries you built into the LLMozLib tree&lt;br /&gt;
&lt;br /&gt;
:There is a batch file in the LLMozLib directory to help you.&lt;br /&gt;
&lt;br /&gt;
:You may need to edit the paths at the top if your Mozilla source directory is different.&lt;br /&gt;
&lt;br /&gt;
 copy_products_windows.bat&lt;br /&gt;
&lt;br /&gt;
* Build LLMozLib using Microsoft Visual Studio 7.1&lt;br /&gt;
&lt;br /&gt;
:Open the LLMozLib solution file &amp;lt;code&amp;gt;llmozlib.sln&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Build the Debug and Release configurations in the normal fashion.&lt;br /&gt;
&lt;br /&gt;
* Copy the LLMozLib files to the Second Life client branch&lt;br /&gt;
&lt;br /&gt;
:There is a batch file in the LLMozLib directory to help you.&lt;br /&gt;
&lt;br /&gt;
:You may need to edit the paths at the top if your Second Life client directory is different.&lt;br /&gt;
&lt;br /&gt;
 copy_llmozlib_to_branch.bat&lt;br /&gt;
&lt;br /&gt;
* That completes the LLMozLib build - the files that are copied (relative to the Second Life client directory) are:&lt;br /&gt;
&lt;br /&gt;
 Header file (llmozlib.h) in libraries\include\&lt;br /&gt;
&lt;br /&gt;
 Static library (llmozlib.lib) (debug) in libraries\i686-win32\lib_debug\&lt;br /&gt;
 Static library (llmozlib.lib) (release) in libraries\i686-win32\lib_release\&lt;br /&gt;
&lt;br /&gt;
 Runtime DLLs (debug) in libraries\i686-win32\lib_debug\&lt;br /&gt;
 Runtime DLLs (release) in libraries\i686-win32\lib_release\&lt;br /&gt;
&lt;br /&gt;
 Runtime misc files (debug) in indra\newview\app_settings\mozilla_debug\&lt;br /&gt;
 Runtime misc files (release) in indra\newview\app_settings\mozilla_release\&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Compiling_the_viewer_libraries_(MSVS_2003)&amp;diff=30487</id>
		<title>Compiling the viewer libraries (MSVS 2003)</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Compiling_the_viewer_libraries_(MSVS_2003)&amp;diff=30487"/>
		<updated>2007-09-05T22:07:48Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{CompileNav}}&lt;br /&gt;
&lt;br /&gt;
This page supplements [[Compiling the viewer (MSVS2003)]].&lt;br /&gt;
&lt;br /&gt;
In the source directory, there are several empty placeholder folders for libraries which the Second Life viewer relies upon. This section describes how to acquire the code, and how to install it. It is a good idea to install in order, as some libraries will rely on previous installs (ie, libcurl needs openssl and zlib).&lt;br /&gt;
&lt;br /&gt;
===== Boost =====&lt;br /&gt;
* Download &amp;amp; extract [http://sourceforge.net/project/showfiles.php?group_id=7586&amp;amp;package_id=8041 Boost] source for win32.&lt;br /&gt;
* Copy the &amp;quot;boost_X_XX_X\boost&amp;quot; folder to &amp;quot;libraries\include\&amp;quot;.&lt;br /&gt;
* Run &amp;quot;Run &amp;quot;boost_X_XX_X\tools\jam\build_dist.bat&amp;quot;.&lt;br /&gt;
* Copy &amp;quot;boost_X_XX_X\tools\jam\src\bin.ntx86\bjam.exe&amp;quot; to &amp;quot;boost_X_XX_X\&amp;quot;.&lt;br /&gt;
* Using the command prompt, build the static libraries:&lt;br /&gt;
** cd boost_X_XX_X&lt;br /&gt;
** set PYTHON_ROOT=C:\Python23&lt;br /&gt;
** set PYTHON_VERSION=2.3&lt;br /&gt;
** bjam stage&lt;br /&gt;
* copy &amp;quot;boost_X_XX_X\stage\lib\libboost_python-vc71-mt.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_release\&amp;quot;&lt;br /&gt;
* copy &amp;quot;boost_X_XX_X\stage\lib\libboost_python-vc71-mt-gd.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_debug\libboost_python-vc71-mt.lib&amp;quot;&lt;br /&gt;
* copy &amp;quot;boost_X_XX_X\stage\lib\libboost_regex-vc71-mt-s.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_release\&amp;quot;&lt;br /&gt;
* copy &amp;quot;boost_X_XX_X\stage\lib\libboost_regex-vc71-mt-sgd.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_debug\libboost_regex-vc71-mt-s.lib&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Expat =====&lt;br /&gt;
* Download and run [http://sourceforge.net/project/showfiles.php?group_id=10127 Expat Win32 Binary]&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\Source\lib\expat.h&amp;quot; to &amp;quot;libraries\include\expat\&amp;quot;.&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\Source\lib\expat_external.h&amp;quot; to &amp;quot;libraries\include\expat\&amp;quot;.&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\StaticLibs\libexpatMT.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release\&amp;quot;.&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\StaticLibs\libexpatMT.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== ZLib =====&lt;br /&gt;
* Download &amp;amp; extract [http://www.zlib.net/ Zlib]&lt;br /&gt;
* copy &amp;quot;zlibXXX\zlib.h&amp;quot; to &amp;quot;libraries\include\zlib\&amp;quot;.&lt;br /&gt;
* copy &amp;quot;zlibXXX\zconf.h&amp;quot; to &amp;quot;libraries\include\zlib\&amp;quot;.&lt;br /&gt;
* Using the command prompt, build the static libraries:&lt;br /&gt;
** &amp;quot;C:\Program Files\Microsoft Visual Studio .net 2003\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
** cd %ZLIB_FOLDER%&lt;br /&gt;
** nmake -f win32/Makefile.msc&lt;br /&gt;
* copy &amp;quot;zlibXXX\zlib.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release\&amp;quot;.&lt;br /&gt;
* copy &amp;quot;zlibXXX\zlib.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== Apache Portable Runtime =====&lt;br /&gt;
* Take out XML dependancies, move expat headers!!!!&lt;br /&gt;
* Download &amp;amp; extract [http://apr.apache.org/download.cgi apr, apr-util, and apr-iconv].&lt;br /&gt;
* For simplicity  place all three in a parallel directory structure, and rename the directories:&lt;br /&gt;
** C:\work\apr\&lt;br /&gt;
** C:\work\apr-iconv\&lt;br /&gt;
** C:\work\apr-util\&lt;br /&gt;
* Open the &amp;quot;\apr-util\aprutil.dsw&amp;quot; project in VS2003.&lt;br /&gt;
* For the apr, apr-util &amp;amp; apr-iconv projects, change the Runtime Library from Multi-threaded DLL to Multi-threaded:&lt;br /&gt;
** Right click each project in the Solution Explorer, choose properties.&lt;br /&gt;
** In the C/C++ folder, choose Code Generation.&lt;br /&gt;
** Change the Runtime Library to Muli-threaded.&lt;br /&gt;
** Repeat for both debug and release.&lt;br /&gt;
* Remove the apr-util&#039;s dependency on xml:&lt;br /&gt;
** Right click the apr-util project, and choose dependencies.&lt;br /&gt;
** Uncheck xml.&lt;br /&gt;
** Right click the xml project in the Solution Explorer.&lt;br /&gt;
** Choose Remove.&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\Source\lib\expat.h&amp;quot; to &amp;quot;apr\apr-util\xml&amp;quot;.&lt;br /&gt;
* copy &amp;quot;Expat-X.X.X\Source\lib\expat_external.h&amp;quot; to &amp;quot;apr\apr-util\xml\&amp;quot;.&lt;br /&gt;
* Build Solution for Debug, and build solution for release.&lt;br /&gt;
* copy &amp;quot;\apr-util\LibR\aprutil-1.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr-util\LibR\aprutil_src.pdb&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr\LibR\apr-1.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr\LibR\apr_src.pdb&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr-util\LibD\aprutil-1.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr-util\LibD\aprutil_src.pdb&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr\LibD\apr-1.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
* copy &amp;quot;\apr\LibD\apr_src.pdb&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
* copy header files:&lt;br /&gt;
** copy the contents of &amp;quot;apr\include&amp;quot; to &amp;quot;libraries\i686-win32\include\apr-1&amp;quot;. &lt;br /&gt;
** in &amp;quot;libraries\i686-win32\include\apr-1\arch\&amp;quot; only the &amp;quot;win32&amp;quot; dir and &amp;quot;apr_private_common.h&amp;quot; are required.&lt;br /&gt;
** copy the contents of &amp;quot;apr-util\include&amp;quot; to &amp;quot;libraries\i686-win32\include\apr-1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== Freetype =====&lt;br /&gt;
* Download and run [http://gnuwin32.sourceforge.net/packages/freetype.htm FreeType for Windows].&lt;br /&gt;
* copy the contents of &amp;quot;GnuWin32\include\freetype2\freetype&amp;quot; into &amp;quot;\libraries\include\freetype&amp;quot;&lt;br /&gt;
* copy &amp;quot;GnuWin32\lib\freetype.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;. &lt;br /&gt;
* copy &amp;quot;GnuWin32\lib\freetype.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
* copy &amp;quot;GnuWin32\include\ft2build.h&amp;quot; to &amp;quot;libraries\include&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== OpenSSL =====&lt;br /&gt;
* Download and extract: http://www.openssl.org/source/&lt;br /&gt;
* Using the command prompt, build the static libraries:&lt;br /&gt;
** cd %PATH%&lt;br /&gt;
** perl Configure VC-WIN32&lt;br /&gt;
** ms\do_masm&lt;br /&gt;
* Edit openssl-X.X.Xy\ms\nt.mak&lt;br /&gt;
** Change /MD to /MT in CFLAGS&lt;br /&gt;
* back in the command prompt:&lt;br /&gt;
** &amp;quot;C:\Program Files\Microsoft Visual Studio .net 2003\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
** nmake -f ms\nt.mak&lt;br /&gt;
** copy all the &amp;quot;.lib&amp;quot; files from &amp;quot;openssl-X.X.Xy\out32&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== cURL =====&lt;br /&gt;
* Download &amp;amp; extract the [http://curl.haxx.se/download.html curl source].&lt;br /&gt;
* Edit &amp;quot;curl-X.XX.X\lib\Makefile.vc6&amp;quot;&lt;br /&gt;
** Change OPENSSL_PATH to ../../../openssl-&amp;lt;version&amp;gt;&lt;br /&gt;
** Change the ZLIB_PATH to ../../../zlib-&amp;lt;version&amp;gt;/src&lt;br /&gt;
** Change RTLIB to /MT&lt;br /&gt;
** Change RTLIBD to /MTd &lt;br /&gt;
* Using the command prompt, build the static libraries:&lt;br /&gt;
** &amp;quot;C:\Program Files\Microsoft Visual Studio .net 2003\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
** cd %PATH%\lib\&lt;br /&gt;
** nmake /f Makefile.vc6 CFG=release-ssl-zlib&lt;br /&gt;
** Copy &amp;quot;curl-X.XX.X\lib\release-ssl-zlib\libcurl.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;&lt;br /&gt;
** Copy &amp;quot;curl-X.XX.X\lib\release-ssl-zlib\libcurl.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
** Copy all the header files in &amp;quot;curl-X.XX.X\include\curl&amp;quot; to &amp;quot;libraries\include\curl&amp;quot; &lt;br /&gt;
&lt;br /&gt;
===== XMLRPC-epi =====&lt;br /&gt;
&lt;br /&gt;
**Download and Extract [http://xmlrpc-epi.sourceforge.net/ xmlrpc-epi].&lt;br /&gt;
**Get the patch 1 &amp;amp; 3 from [[Patch_xmlrpc-epi]]&lt;br /&gt;
*Using cygwin:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ tar xvzf xmlrpc-epi-0.51&lt;br /&gt;
$ cd xmlrpc-epi-0.51&lt;br /&gt;
$ patch -p1 &amp;lt; ../remove_iconv.patch&lt;br /&gt;
$ patch -p1 &amp;lt; ../excise_expat.patch&lt;br /&gt;
$ rm -rf expat&lt;br /&gt;
$ mkdir expat&lt;br /&gt;
$ cp $FOO expat&lt;br /&gt;
    Where $FOO is either&lt;br /&gt;
        /tmp/expat/include/* -- if you built expat recently&lt;br /&gt;
    or  ../../expat-1.95.8/src/lib/expat*.h -- if you haven&#039;t&lt;br /&gt;
    in this later case you&#039;ll need to have CVS gotten the expat&lt;br /&gt;
    lib, and expanded it&#039;s src.tar.gz file there&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Copy over the Visual Studio files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp ../src/xmlrpcepi.* .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Open the xmlrpcepi.sln file and build&lt;br /&gt;
&lt;br /&gt;
===== Vorbis &amp;amp; Ogg =====&lt;br /&gt;
* Download &amp;amp; extract [http://www.xiph.org/downloads/ libvorbis].&lt;br /&gt;
* Download &amp;amp; extract [http://www.xiph.org/downloads/ libogg].&lt;br /&gt;
* Build &amp;amp; copy libogg first:&lt;br /&gt;
** Open &amp;quot;libogg-X.X.X\win32\ogg_static.dsp&amp;quot; in visual studio.&lt;br /&gt;
** Build both debug and release solutions.&lt;br /&gt;
** Copy &amp;quot;libogg-X.X.X\include\ogg&amp;quot; into &amp;quot;libvorbis-X.X.X\include&amp;quot;&lt;br /&gt;
** Copy &amp;quot;libogg-X.X.X\include\ogg\ogg.h&amp;quot; to &amp;quot;libraries\include\ogg&amp;quot;&lt;br /&gt;
** Copy &amp;quot;libogg-X.X.X\include\ogg\os_types.h&amp;quot; to &amp;quot;libraries\include\ogg&amp;quot;&lt;br /&gt;
** Copy &amp;quot;libogg-X.X.X\win32\Static_Release\ogg_static.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
** Copy &amp;quot;libogg-X.X.X\win32\Static_Debug\ogg_static_d.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\ogg_static.lib&amp;quot;&lt;br /&gt;
* Build &amp;amp; copy libvorbis:&lt;br /&gt;
** Build release &amp;amp; debug &amp;quot;libvorbis-X.X.X\win32\vorbis_static.dsp&amp;quot;&lt;br /&gt;
** Build release &amp;amp; debug &amp;quot;libvorbis-X.X.X\win32\vorbisfile_static.dsp&amp;quot;&lt;br /&gt;
** Build release &amp;amp; debug &amp;quot;libvorbis-X.X.X\win32\vorbisenc_static.dsp&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-X.X.X\include\vorbis\codec.h&amp;quot; to &amp;quot;libraries\include\vorbis&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-X.X.X\include\vorbis\vorbisfile.h&amp;quot; to &amp;quot;libraries\include\vorbis&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-X.X.X\include\vorbis\vorbisenc.h&amp;quot; to &amp;quot;libraries\include\vorbis&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\Vorbis_Static_Release\vorbis_static.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\VorbisEnc_Static_Release\vorbisenc_static.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\VorbisFile_Static_Release\vorbisfile_static.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\Vorbis_Static_Debug\vorbis_static_d.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\vorbis_static.lib&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\VorbisEnc_Static_Debug\vorbisenc_static_d.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\vorbisenc_static.lib&amp;quot;&lt;br /&gt;
** copy &amp;quot;libvorbis-1.1.2\win32\VorbisFile_Static_Debug\vorbisfile_static_d.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug\vorbisfile_static.lib&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== JPEGlib =====&lt;br /&gt;
* Download &amp;amp; extract [http://www.ijg.org/ jpeglib] - download the file &#039;jpegsrc.v6b.tar.gz&#039;.&lt;br /&gt;
* Copy &amp;quot;jpegsr6\jpeg-6b\makefile.vc&amp;quot; to the file &amp;quot;jpegsr6\jpeg-6b\Makefile&amp;quot;&lt;br /&gt;
* Copy &amp;quot;jpegsr6\jpeg-6b\jconfig.vc&amp;quot; to &amp;quot;jpegsr6\jpeg-6b\jconfig.h&amp;quot;&lt;br /&gt;
* At the command prompt:&lt;br /&gt;
** &amp;quot;C:\Program Files\Microsoft Visual Studio .net 2003\Common7\Tools\vsvars32.bat&amp;quot;&lt;br /&gt;
** cd %ZLIB_FOLDER%&lt;br /&gt;
** nmake -f Makefile&lt;br /&gt;
* copy &amp;quot;jconfig.h&amp;quot;, &amp;quot;jerror.h&amp;quot;, &amp;quot;jmorecfg.h&amp;quot;, &amp;quot;jpeglib.h&amp;quot;, and &amp;quot;jinclude.h&amp;quot; from * to &amp;quot;libraries\include\jpeglib&amp;quot;&lt;br /&gt;
* copy &amp;quot;jpegsr6\jpeg-6b\libjpeg.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_release&amp;quot;&lt;br /&gt;
* copy &amp;quot;jpegsr6\jpeg-6b\libjpeg.lib&amp;quot; to &amp;quot;libraries\i686-win32\lib_debug&amp;quot;&lt;br /&gt;
* [[Patch jpeglib]]&lt;br /&gt;
&lt;br /&gt;
===== OpenJPEG =====&lt;br /&gt;
* Download and extract [http://www.openjpeg.org/index.php?menu=download openjpeg for win32].&lt;br /&gt;
* Copy &amp;quot;openjpeg10_win32\openjpeg.h&amp;quot; to &amp;quot;&amp;quot;\libraries\include\openjpeg&amp;quot;&lt;br /&gt;
* Copy &amp;quot;openjpeg10_win32\LibOpenJPEG.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_release&amp;quot;.&lt;br /&gt;
* Copy &amp;quot;openjpeg10_win32\LibOpenJPEG.lib&amp;quot; to &amp;quot;\libraries\i686-win32\lib_debug&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== TUT =====&lt;br /&gt;
* Download and extract [http://tut-framework.sourceforge.net/download/ tut]&lt;br /&gt;
* [[Patch TUT]] to add test skipping.&lt;br /&gt;
* Copy &amp;quot;tut.h&amp;quot;, &amp;quot;tut_reporter.h&amp;quot;, and &amp;quot;tut_restartable.h&amp;quot; to &amp;quot;libraries\include\tut&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== LLMozLib =====&lt;br /&gt;
These instructions describe how to build the Windows version of LLMozLib for use within the Second Life client. They have been tested using Microsoft Visual Studio 7.1 - apparently, things do work with other versions of the Microsoft compiler but they have not been tried or tested.&lt;br /&gt;
&lt;br /&gt;
LLMozLib currently uses code from the 1.8.0 branch of the Mozilla codebase - similar to what is used in Firefox 1.5. At some point in the future we will switch to the 1.8.1 branch - the one used to build Firefox 2.0.&lt;br /&gt;
&lt;br /&gt;
Get our snapshot llmozlib from the [[source downloads]] page. &lt;br /&gt;
&lt;br /&gt;
The steps required to generate LLMozLib and associated run-time files are:&lt;br /&gt;
&lt;br /&gt;
* Set up your environment for building the Mozilla source code. (these instructions are specific to the Mozilla branch we are using - building the trunk is different)&lt;br /&gt;
&lt;br /&gt;
 http://developer.mozilla.org/en/docs/Windows_Build_Prerequisites_on_the_1.7_and_1.8_Branches&lt;br /&gt;
&lt;br /&gt;
* Checkout the Mozilla source code from their CVS repository. Let&#039;s assume you are using the &amp;lt;code&amp;gt;c:\mozilla&amp;lt;/code&amp;gt; directory to build in.&lt;br /&gt;
  c:&lt;br /&gt;
  cd \&lt;br /&gt;
  export CVSROOT=:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot&lt;br /&gt;
  cvs login (the password is &#039;anonymous&#039;)&lt;br /&gt;
  cvs checkout -r FIREFOX_1_5_0_9_RELEASE mozilla/client.mk&lt;br /&gt;
  cd c:\mozilla&lt;br /&gt;
  make -f client.mk checkout MOZ_CO_PROJECT=xulrunner&lt;br /&gt;
&lt;br /&gt;
:Note: the CVS tag will change as Mozilla release updates. Version 1.5.0.9 is current as of writing.&lt;br /&gt;
&lt;br /&gt;
* Apply a patch which enables certain features that are required for the Second Life client.&lt;br /&gt;
&lt;br /&gt;
:The patch can be found in the llmozlib &amp;lt;code&amp;gt;build_mozilla&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
:Copy the patch into the directory where you are building Mozilla and apply the patch:&lt;br /&gt;
&lt;br /&gt;
 patch -p0 &amp;lt; linden_updates.patch&lt;br /&gt;
&lt;br /&gt;
* Build optimized (release) and debug versions of a XULRunner configuration of the Mozilla codebase.&lt;br /&gt;
&lt;br /&gt;
:The &amp;lt;code&amp;gt;build_mozilla&amp;lt;/code&amp;gt; directory contains 2 Mozilla configuration files - one for a debug build and one for an optimized build.&lt;br /&gt;
&lt;br /&gt;
:Copy both files into the directory where you are building Mozilla and then:&lt;br /&gt;
&lt;br /&gt;
 copy .mozconfig.debug .mozconfig&lt;br /&gt;
 make -f client.mk build&lt;br /&gt;
&lt;br /&gt;
 copy .mozconfig.optimized .mozconfig&lt;br /&gt;
 make -f client.mk build&lt;br /&gt;
&lt;br /&gt;
* Copy a subset of the header files and libraries you built into the LLMozLib tree&lt;br /&gt;
&lt;br /&gt;
:There is a batch file in the LLMozLib directory to help you.&lt;br /&gt;
&lt;br /&gt;
:You may need to edit the paths at the top if your Mozilla source directory is different.&lt;br /&gt;
&lt;br /&gt;
 copy_products_windows.bat&lt;br /&gt;
&lt;br /&gt;
* Build LLMozLib using Microsoft Visual Studio 7.1&lt;br /&gt;
&lt;br /&gt;
:Open the LLMozLib solution file &amp;lt;code&amp;gt;llmozlib.sln&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Build the Debug and Release configurations in the normal fashion.&lt;br /&gt;
&lt;br /&gt;
* Copy the LLMozLib files to the Second Life client branch&lt;br /&gt;
&lt;br /&gt;
:There is a batch file in the LLMozLib directory to help you.&lt;br /&gt;
&lt;br /&gt;
:You may need to edit the paths at the top if your Second Life client directory is different.&lt;br /&gt;
&lt;br /&gt;
 copy_llmozlib_to_branch.bat&lt;br /&gt;
&lt;br /&gt;
* That completes the LLMozLib build - the files that are copied (relative to the Second Life client directory) are:&lt;br /&gt;
&lt;br /&gt;
 Header file (llmozlib.h) in libraries\include\&lt;br /&gt;
&lt;br /&gt;
 Static library (llmozlib.lib) (debug) in libraries\i686-win32\lib_debug\&lt;br /&gt;
 Static library (llmozlib.lib) (release) in libraries\i686-win32\lib_release\&lt;br /&gt;
&lt;br /&gt;
 Runtime DLLs (debug) in libraries\i686-win32\lib_debug\&lt;br /&gt;
 Runtime DLLs (release) in libraries\i686-win32\lib_release\&lt;br /&gt;
&lt;br /&gt;
 Runtime misc files (debug) in indra\newview\app_settings\mozilla_debug\&lt;br /&gt;
 Runtime misc files (release) in indra\newview\app_settings\mozilla_release\&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=30306</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=30306"/>
		<updated>2007-09-04T02:33:46Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &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;
||[[Bullet (script)|Bullet]]&lt;br /&gt;
||[[User:Davida Gallant|Davida Gallant]]&lt;br /&gt;
||Self-explanatory. Works well with [[Self-Destruction|self-destruction]] script.&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;
||[[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;
||[[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;
|-&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 there attachments. (ToS compliant)&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;
||[[Merge Sort]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Implements a Merge Sort in LSL, however this code is slower 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;
||[[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.1]]&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;
||[[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;
|| [[Self-Destruction]]&lt;br /&gt;
|| [[User:Davada Gallant|Davada Gallant]]&lt;br /&gt;
|| Makes an object disappear after a certain amount of time.&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;
|| [[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;
||[[Key Pad Door|Tdub&#039;s 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;
||[[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|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;
||[[Open Source Holodeck]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Open Source Home Rezzing System.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog Message]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Shout messages over a dialog.&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;
||[[Script Overide 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;
||[[Dataserver API]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Dataserver Framework for Notecards.&lt;br /&gt;
|-&lt;br /&gt;
||[[Texture Menu Management]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Dialog Menu based Texture Selection.&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>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Texture_Menu_Management&amp;diff=30304</id>
		<title>Texture Menu Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Texture_Menu_Management&amp;diff=30304"/>
		<updated>2007-09-04T02:30:00Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: New page: {{LSL Header}} {{RightToc}} =Texture Menu Management=  (based on our previus script and released here for you as we did a custom edit for second-life community and i thought you may like t...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
=Texture Menu Management=&lt;br /&gt;
&lt;br /&gt;
(based on our previus script and released here for you as we did a custom edit for second-life community and i thought you may like to use this script as well.)&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
Allows you to have dialog based navigation of textures.&lt;br /&gt;
and browse the image you like to display on your [[prim]] from a dialog with simple and ease of navigation &lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Create a script and copy and paste the script below into your [[prim]].&lt;br /&gt;
and copy textures or photos from your [[inventory]] into the content tab of your [[prim]]&lt;br /&gt;
click your prim containing the script and textures and select a [[texture]] or photo from the menu dialog&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
integer listener;&lt;br /&gt;
integer MENU_CHANNEL = 1000;&lt;br /&gt;
&lt;br /&gt;
// opens menu channel and displays dialog&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(listener);&lt;br /&gt;
    listener = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;Select one object below: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        // reset scripts on rez&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        MENU1 = [];&lt;br /&gt;
        MENU2 = [];&lt;br /&gt;
        // count the textures in the prim to see if we need pages&lt;br /&gt;
        integer c = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
        if (c &amp;lt;= 12)&lt;br /&gt;
        {&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_TEXTURE, i);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {        &lt;br /&gt;
            for (; i &amp;lt; 11; ++i)&lt;br /&gt;
                MENU1 += llGetInventoryName(INVENTORY_TEXTURE, i);&lt;br /&gt;
            if(c &amp;gt; 22)&lt;br /&gt;
                c = 22;&lt;br /&gt;
            for (; i &amp;lt; c; ++i)&lt;br /&gt;
                MENU2 += llGetInventoryName(INVENTORY_TEXTURE, i); &lt;br /&gt;
            MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
            MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;                          &lt;br /&gt;
        }&lt;br /&gt;
        // display the dialog &lt;br /&gt;
        Dialog(llDetectedKey(0), MENU1);&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 (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);  &lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }        &lt;br /&gt;
            else                    &lt;br /&gt;
            {&lt;br /&gt;
                // display the texture from menu selection &lt;br /&gt;
                llSetTexture(message, ALL_SIDES);&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;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contact me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Revolution_Perenti&amp;diff=30300</id>
		<title>User talk:Revolution Perenti</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Revolution_Perenti&amp;diff=30300"/>
		<updated>2007-09-04T01:58:05Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Talk}}&lt;br /&gt;
&lt;br /&gt;
== The Teen Grid ==&lt;br /&gt;
&lt;br /&gt;
That Doesn&#039;t leave much of a Way for TGers to contact you....&lt;br /&gt;
&lt;br /&gt;
== Scripting ==&lt;br /&gt;
&lt;br /&gt;
The LSL Portal is a technical resource, which means that all script content needs to be well polished. Unpolished scripts degrade the quality of the wiki. When posting scripts, you must make sure that they function; they must be clean and uniform too. Incomplete and dysfunctional scripts should not be posted. Ugly scripts should be beautified. To put it this way, your whitespace habits are atrocious and every script you have posted to the Library had flaws and some didn&#039;t even function properly. I don&#039;t want to drive you off, I want to encourage you to do better. -- [[User:Strife Onizuka|Strife Onizuka]] 15:37, 3 September 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
thanks for the advise, i will revist these about to update the holodeck code too so i will revist them all in a day or so :)&lt;br /&gt;
&lt;br /&gt;
Rev&lt;br /&gt;
:The holodeck code I can&#039;t really say if there is anything wrong fundamentally with it; I haven&#039;t studied it in depth but nothing jumped out at me. Besides the whitespacing I did I changed very little of it. There are small things but they come down more to style and inexperience with LSL. LSL does not have an optimizing compiler so using llToLower and llToUpper on constants is not optimal. Unless you need the result of a ++ or -- operation you really should use the &amp;quot;++c&amp;quot; form instead of &amp;quot;c++&amp;quot;, it&#039;s faster. The way people use ++ and --, there are very few situations where the &amp;quot;c++&amp;quot; form should be used. (i added the talk header because it shows how to sign comments) -- [[User:Strife Onizuka|Strife Onizuka]] 18:53, 3 September 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
with the holodeck i totally rewrote the script now and that has been changed back to c++ rather then old style coding ways.&lt;br /&gt;
but thanks for the responce, i will pop you the latest 1.70 code release in world and see what you think :)&lt;br /&gt;
&lt;br /&gt;
i will try get better at this wilki im never been good at the docs side of things&lt;br /&gt;
&lt;br /&gt;
Rev :)&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=30297</id>
		<title>Dataserver API</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=30297"/>
		<updated>2007-09-04T01:33:28Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
=Dataserver Framework=&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
&lt;br /&gt;
A common problem in SL is reading and parsing notecards by script. One application for this is so a script can be distributed as no-mod but still be configurable.&lt;br /&gt;
&lt;br /&gt;
The below framework demonstrates how to setup such an interface with very little work to retool.&lt;br /&gt;
&lt;br /&gt;
The default state reads the notecard and when it is done it activates the configuration state.&lt;br /&gt;
&lt;br /&gt;
===Testimonial===&lt;br /&gt;
&lt;br /&gt;
The most common problem I find is people asking about dataservers, reading from notecards to bypass variables within a notecard so you can release your script as nomod.&lt;br /&gt;
So I setup a simple system that I use time and time again that can be reused in any project.&lt;br /&gt;
The class itself is state based meaning the default state reads the notecard and then starts another state when the notecard is read and ready to use I explain this further below.&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string notecard_name = &amp;quot;configuration&amp;quot;;  // name of notecard goes here&lt;br /&gt;
&lt;br /&gt;
// internals&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer line;&lt;br /&gt;
key queryhandle;                   // to separate Dataserver requests&lt;br /&gt;
key notecarduuid;&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    queryhandle = llGetNotecardLine(notecard_name, line = 0);// request line&lt;br /&gt;
    notecarduuid = llGetInventoryKey(notecard_name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Config data loaded from notecard, with some sane defaults&lt;br /&gt;
integer channel = 1000;&lt;br /&gt;
string email_address = &amp;quot;revolution.perenti@skidzpartz.com&amp;quot;;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)         &lt;br /&gt;
    {&lt;br /&gt;
        // We want to reload channel notecard if it changed&lt;br /&gt;
        if (change &amp;amp; CHANGED_INVENTORY)&lt;br /&gt;
            if(notecarduuid != llGetInventoryKey(notecard_name))&lt;br /&gt;
                init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (query_id == queryhandle)&lt;br /&gt;
        {&lt;br /&gt;
            if (data != EOF)&lt;br /&gt;
            {   // not at the end of the notecard&lt;br /&gt;
                // yay!  Parsing time&lt;br /&gt;
                &lt;br /&gt;
                // pesky whitespace&lt;br /&gt;
                data = llStringTrim(data, STRING_TRIM_HEAD);&lt;br /&gt;
&lt;br /&gt;
                // is it a comment?&lt;br /&gt;
                if (llGetSubString (data, 0, 0) != &amp;quot;#&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    integer s = llSubStringIndex(data, &amp;quot;=&amp;quot;);&lt;br /&gt;
                    if(~s)//does it have an &amp;quot;=&amp;quot; in it?&lt;br /&gt;
                    {&lt;br /&gt;
                        string token = llToLower(llStringTrim(llDeleteSubString(data, s, -1), STRING_TRIM));&lt;br /&gt;
                        data = llStringTrim(llDeleteSubString(data, 0, s), STRING_TRIM);&lt;br /&gt;
&lt;br /&gt;
                        //Insert your token parsers here.&lt;br /&gt;
                        if (token == &amp;quot;email_address&amp;quot;)&lt;br /&gt;
                            email_address = data;&lt;br /&gt;
                        else if (token == &amp;quot;channel&amp;quot;)&lt;br /&gt;
                            channel = (integer)data;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                queryhandle = llGetNotecardLine(notecard_name, ++line);&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Notecard Data: &amp;quot; + data);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Done Reading Notecard&amp;quot;);&lt;br /&gt;
                state configuration ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state configuration&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(channel, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llShout(0, &amp;quot;Channel set to &amp;quot; + (string)channel);&lt;br /&gt;
        llShout(0, &amp;quot;Email set to &amp;quot; + (string)email_address);&lt;br /&gt;
    }   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Notecard==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# This is the configuration file&lt;br /&gt;
channel = 1000&lt;br /&gt;
email_address = phoenixcms@hotmail.co.uk&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Lines that start with &amp;quot;#&amp;quot; are comments.&lt;br /&gt;
&lt;br /&gt;
==How It Works==&lt;br /&gt;
&lt;br /&gt;
The [[default]] [[state]] reads and parses all the lines in the notecard. As it reads the notecard it overwrites the default values with the values in the notecard. More specifically after each line has been validated and tokenized, the token is checked against supported tokens. If the token is supported the specific parser for the token is called, in the above example it is just a simple convert and copy. &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contact me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Revolution_Perenti&amp;diff=30296</id>
		<title>User talk:Revolution Perenti</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Revolution_Perenti&amp;diff=30296"/>
		<updated>2007-09-04T01:24:09Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== The Teen Grid ==&lt;br /&gt;
&lt;br /&gt;
That Doesn&#039;t leave much of a Way for TGers to contact you....&lt;br /&gt;
&lt;br /&gt;
== Scripting ==&lt;br /&gt;
&lt;br /&gt;
The LSL Portal is a technical resource, which means that all script content needs to be well polished. Unpolished scripts degrade the quality of the wiki. When posting scripts, you must make sure that they function; they must be clean and uniform too. Incomplete and dysfunctional scripts should not be posted. Ugly scripts should be beautified. To put it this way, your whitespace habits are atrocious and every script you have posted to the Library had flaws and some didn&#039;t even function properly. I don&#039;t want to drive you off, I want to encourage you to do better. -- [[User:Strife Onizuka|Strife Onizuka]] 15:37, 3 September 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
thanks for the advise, i will revist these about to update the holodeck code too so i will revist them all in a day or so :)&lt;br /&gt;
&lt;br /&gt;
Rev&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=30239</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=30239"/>
		<updated>2007-09-03T13:08:08Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &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;
||[[Bullet (script)|Bullet]]&lt;br /&gt;
||[[User:Davida Gallant|Davida Gallant]]&lt;br /&gt;
||Self-explanatory. Works well with [[Self-Destruction|self-destruction]] script.&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;
||[[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;
||[[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;
|-&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 there attachments. (ToS compliant)&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;
||[[Merge Sort]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Implements a Merge Sort in LSL, however this code is slower 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;
||[[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.1]]&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;
||[[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;
|| [[Self-Destruction]]&lt;br /&gt;
|| [[User:Davada Gallant|Davada Gallant]]&lt;br /&gt;
|| Makes an object disappear after a certain amount of time.&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;
|| [[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;
||[[Key Pad Door|Tdub&#039;s 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;
||[[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|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;
||[[Open Source Holodeck]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Open Source Home Rezzing System.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog Message]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Shout messages over a dialog.&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;
||[[Script Overide 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;
||[[Dataserver API]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Dataserver Framework for Notecards.&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>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=30238</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=30238"/>
		<updated>2007-09-03T13:07:41Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &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;
||[[Bullet (script)|Bullet]]&lt;br /&gt;
||[[User:Davida Gallant|Davida Gallant]]&lt;br /&gt;
||Self-explanatory. Works well with [[Self-Destruction|self-destruction]] script.&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;
||[[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;
||[[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;
|-&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 there attachments. (ToS compliant)&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;
||[[Merge Sort]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Implements a Merge Sort in LSL, however this code is slower 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;
||[[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.1]]&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;
||[[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;
|| [[Self-Destruction]]&lt;br /&gt;
|| [[User:Davada Gallant|Davada Gallant]]&lt;br /&gt;
|| Makes an object disappear after a certain amount of time.&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;
|| [[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;
||[[Key Pad Door|Tdub&#039;s 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;
||[[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|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;
||[[Open Source Holodeck]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Open Source Home Rezzing System.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog Message]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Shout messages over a dialog.&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;
||[[Script Overide 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;
||[[Script Dataserver API]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Dataserver Framework for Notecards.&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>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=30237</id>
		<title>Dataserver API</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=30237"/>
		<updated>2007-09-03T13:04:35Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: New page: {{LSL Header}}  Dataserver Framework  ----  Introduction: the most common problem i find is people asking about dataservers, reading from notecards to bypass variables within a notecard so...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
Dataserver Framework&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Introduction:&lt;br /&gt;
the most common problem i find is people asking about dataservers, reading from notecards to bypass variables within a notecard so you can release your script as nomod.&lt;br /&gt;
so i setup a simple system that i use time and time again that can be reused in any project.&lt;br /&gt;
the class itself is state based meaning the default state reads the notecard and then starts another state when the notecard is read and ready to use i explain this further below.&lt;br /&gt;
&lt;br /&gt;
Main Script:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string notecard_name = &amp;quot;configuration&amp;quot;;  // name of notecard goes here&lt;br /&gt;
&lt;br /&gt;
key queryhandle;                   // to seperate Dataserver requests&lt;br /&gt;
&lt;br /&gt;
// UPDATES&lt;br /&gt;
integer line ;&lt;br /&gt;
&lt;br /&gt;
// Config data loaded from notecard, with some sane defaults&lt;br /&gt;
integer channel = 1000;&lt;br /&gt;
string email_address = &amp;quot;revolution.perenti@skidzpartz.com&amp;quot;;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)         &lt;br /&gt;
    {&lt;br /&gt;
        // We want to reload channel notecard if it changed&lt;br /&gt;
        if (change &amp;amp; CHANGED_INVENTORY)&lt;br /&gt;
        {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
         &lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        queryhandle = llGetNotecardLine(notecard_name, line);// request line&lt;br /&gt;
        line++ ;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
        if (query_id == queryhandle) {&lt;br /&gt;
            // I&#039;ve written this token parser so many times in so many languages...&lt;br /&gt;
            if (data != EOF) {    // not at the end of the notecard&lt;br /&gt;
                // yay!  Parsing time&lt;br /&gt;
                // first, is it a comment? or an empty line?&lt;br /&gt;
                if (llGetSubString (data, 0, 0) != &amp;quot;#&amp;quot; &amp;amp;&amp;amp; llStringLength (data) &amp;gt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                    list parsed = llParseString2List (data, [&amp;quot;=&amp;quot;], [&amp;quot;&amp;quot;]) ;&lt;br /&gt;
                    string token = llToLower (llStringTrim (llList2String (parsed, 0), STRING_TRIM)) ;&lt;br /&gt;
                    if (token == &amp;quot;email_address&amp;quot;)&lt;br /&gt;
                        email_address = llStringTrim (llList2String (parsed, 1), STRING_TRIM) ;&lt;br /&gt;
                    if (token == &amp;quot;channel&amp;quot;)&lt;br /&gt;
                        channel = (integer)llStringTrim (llList2String (parsed, 1), STRING_TRIM) ;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                queryhandle = llGetNotecardLine(notecard_name, line);&lt;br /&gt;
                line++;&lt;br /&gt;
            } else {&lt;br /&gt;
                if (email_address == &amp;quot;&amp;quot;)&lt;br /&gt;
                    llOwnerSay (&amp;quot;NOTICE!  No email_address specified.  You will NOT receive purchase emails or status updates!&amp;quot;) ;&lt;br /&gt;
state configuration ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state configuration&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
            state_entry()&lt;br /&gt;
            {&lt;br /&gt;
            llListen(channel, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llShout(0, &amp;quot;Channel set to &amp;quot; + (string)channel);&lt;br /&gt;
            llShout(0, &amp;quot;Email set to &amp;quot; + (string)email_address);&lt;br /&gt;
            }   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOECARD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# This is the configuration file&lt;br /&gt;
channel = 1000&lt;br /&gt;
email_address = phoenixcms@hotmail.co.uk&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
USAGE: Ok lets explain how this works&lt;br /&gt;
well the default state basailly reads all the lines for the notecard parces the lines into the notecard and we setup varables in the dataserver so we know if we want to overide a default value.&lt;br /&gt;
&lt;br /&gt;
the dataserver consists over tokens for example &amp;lt;pre&amp;gt;if (token == &amp;quot;email_address&amp;quot;)&amp;lt;/pre&amp;gt; this means in the noecard there will be a value called email_address like our notecard above then followed by the read like &amp;lt;pre&amp;gt;email_address = llStringTrim (llList2String (parsed, 1), STRING_TRIM) ;&amp;lt;/pre&amp;gt; as the notecard is string based there are ways to get this back into other values also very common usage within secondlife. being a string inside a notecard and you want the value as a float, vector, integer etc all you need todo is add (integer) after the command = for example &amp;lt;pre&amp;gt;menu_timer = (integer)llStringTrim (llList2String (parsed, 1), STRING_TRIM) ;&amp;lt;/pre&amp;gt; this will convert the string into an integer.&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:sort|Script Overide Functions}}{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlStringTrim&amp;diff=30041</id>
		<title>LlStringTrim</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlStringTrim&amp;diff=30041"/>
		<updated>2007-09-01T17:33:55Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#vardefine:type|function}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|func_id=330|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llStringTrim&lt;br /&gt;
|return_type=string&lt;br /&gt;
|p1_type=string|p1_name=src|p1_desc&lt;br /&gt;
|p2_type=integer|p2_name=type|p2_desc=STRING_TRIM* flag(s)&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is &#039;&#039;&#039;src&#039;&#039;&#039; with leading and/or trailing white space (spaces, tabs, and line feeds) trimmed from it.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants=&lt;br /&gt;
{{{!}}{{Prettytable}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;{{!}}Constant&lt;br /&gt;
!Description&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}[[STRING_TRIM_HEAD]]&lt;br /&gt;
{{!}}{{LSL Hex|0x01|}}&lt;br /&gt;
{{!}}Trims spaces off the beginning.&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}[[STRING_TRIM_TAIL]]&lt;br /&gt;
{{!}}{{LSL Hex|0x02|}}&lt;br /&gt;
{{!}}Trims spaces off the end&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}[[STRING_TRIM]]&lt;br /&gt;
{{!}}{{LSL Hex|0x03|}}&lt;br /&gt;
{{!}}Trims spaces off the beginning and end.&lt;br /&gt;
{{!}}}&lt;br /&gt;
|examples=&amp;lt;pre&amp;gt;&lt;br /&gt;
integer channel;                        // will be set by notecard&lt;br /&gt;
string NOTECARD_NAME = &amp;quot;configuration&amp;quot;;  // name of notecard goes here&lt;br /&gt;
&lt;br /&gt;
key KQuery;                   // to seperate Dataserver requests&lt;br /&gt;
&lt;br /&gt;
// UPDATES&lt;br /&gt;
integer line;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)         &lt;br /&gt;
    {&lt;br /&gt;
        // We want to reload channel notecard if it changed&lt;br /&gt;
        if (change &amp;amp; CHANGED_INVENTORY)&lt;br /&gt;
        {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
         &lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        KQuery = llGetNotecardLine(NOTECARD_NAME, line);// request line&lt;br /&gt;
        line++ ;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
        if (query_id == KQuery) {&lt;br /&gt;
            if (data != EOF) {    // not at the end of the notecard&lt;br /&gt;
                // yay!  Parsing time&lt;br /&gt;
                // first, is it a comment? or an empty line?&lt;br /&gt;
                if (llGetSubString (data, 0, 0) != &amp;quot;#&amp;quot; &amp;amp;&amp;amp; llStringLength (data) &amp;gt; 0)&lt;br /&gt;
                {&lt;br /&gt;
                    list parsed = llParseString2List (data, [&amp;quot;=&amp;quot;], [&amp;quot;&amp;quot;]) ;&lt;br /&gt;
                    string token = llToLower (llStringTrim (llList2String (parsed, 0), STRING_TRIM)) ;&lt;br /&gt;
                    if (token == &amp;quot;command_channel&amp;quot;)&lt;br /&gt;
                        channel = (integer)llStringTrim (llList2String (parsed, 1), STRING_TRIM) ;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                KQuery = llGetNotecardLine(NOTECARD_NAME, line);&lt;br /&gt;
                line++;&lt;br /&gt;
            } else {&lt;br /&gt;
                llOwnerSay (&amp;quot;Done Reading Notecard: &amp;quot; + (string)NOTECARD_NAME) ;&lt;br /&gt;
state configuration ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state configuration&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
            state_entry()&lt;br /&gt;
            {&lt;br /&gt;
            llListen(channel, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llShout(0, &amp;quot;Channel set to &amp;quot; + (string)channel);&lt;br /&gt;
            }   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Submitted by [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=This function is available in 1.13.4 onwards...&lt;br /&gt;
&lt;br /&gt;
The following examples will make the same result.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string src = &amp;quot;   Dah    &amp;quot;;&lt;br /&gt;
st = llStringTrim(src, STRING_TRIM_HEAD);&lt;br /&gt;
st = llStringTrim(st , STRING_TRIM_TAIL);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
string src = &amp;quot;   Dah    &amp;quot;;&lt;br /&gt;
st = llStringTrim(src, STRING_TRIM);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is because &amp;lt;code&amp;gt;(STRING_TRIM_HEAD {{!}} STRING_TRIM_TAIL) == STRING_TRIM&amp;lt;/code&amp;gt;.&lt;br /&gt;
|deprecated&lt;br /&gt;
|cat1=String&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Cory_Bjornson&amp;diff=29168</id>
		<title>User talk:Cory Bjornson</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Cory_Bjornson&amp;diff=29168"/>
		<updated>2007-08-24T04:32:38Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: New page: what forms of contact are you looking for, upcoming i have scripts for teen grid thats allows you to get all my files for free via my update server, well i hope it works but then im going ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;what forms of contact are you looking for, upcoming i have scripts for teen grid thats allows you to get all my files for free via my update server, well i hope it works but then im going to need teens to try out soon, as i have alot new releases coming up soon once i finlised everything.&lt;br /&gt;
but you can contact me via email @ Revolution.Perenti@skidzpartz.com&lt;br /&gt;
&lt;br /&gt;
Thanks Rev :)&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=29055</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=29055"/>
		<updated>2007-08-22T10:54:29Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &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;
||[[Bullet (script)|Bullet]]&lt;br /&gt;
||[[User:Davida Gallant|Davida Gallant]]&lt;br /&gt;
||Self-explanatory. Works well with [[Self-Destruction|self-destruction]] script.&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;
||[[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 headder and won&#039;t echo.&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;
|-&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 there attachments. (ToS compliant)&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.1]]&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;
||[[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;
|| [[Self-Destruction]]&lt;br /&gt;
|| [[User:Davada Gallant|Davada Gallant]]&lt;br /&gt;
|| Makes an object disappear after a certain amount of time.&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;
|| [[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;
||[[Key Pad Door|Tdub&#039;s 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;
||[[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|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;
||[[Open Source Holodeck]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Open Source Home Rezzing System.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog Message]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Shout messages over a dialog.&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;
||[[Script Overide 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;
----&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>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Script_Override_Functions&amp;diff=29054</id>
		<title>Script Override Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Script_Override_Functions&amp;diff=29054"/>
		<updated>2007-08-22T10:52:48Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: New page: {{LSL Header}}  well you like to overide strings ,integer etc in chat channel  for example you like to enable debug or change the channel i find this the best solution and can be prety use...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
well you like to overide strings ,integer etc in chat channel &lt;br /&gt;
for example you like to enable debug or change the channel i find this the best solution and can be prety usefull API framework for many listens.&lt;br /&gt;
&lt;br /&gt;
USAGE: /CHANNEL Object_Name,message,value eg: /1000 Object,channel,1001&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&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;
    csv_commands = llCSV2List( llToLower ( (string)message ));&lt;br /&gt;
    string said_name = llList2String( (list)csv_commands, 0);        &lt;br /&gt;
    string command = llList2String( (list)csv_commands,1 );&lt;br /&gt;
    if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( (list)csv_commands,2 );&lt;br /&gt;
            llListenRemove( (integer)key_listen );&lt;br /&gt;
            key_listen = llListen((integer)P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    if(command == llToLower(&amp;quot;AVATAR&amp;quot;) || message == llToUpper(&amp;quot;AVATAR&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
    llSay(0, &amp;quot;hello avatar&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:sort|Script Overide Functions}}{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=29051</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=29051"/>
		<updated>2007-08-22T06:19:24Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &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;
||[[Bullet (script)|Bullet]]&lt;br /&gt;
||[[User:Davida Gallant|Davida Gallant]]&lt;br /&gt;
||Self-explanatory. Works well with [[Self-Destruction|self-destruction]] script.&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;
||[[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 headder and won&#039;t echo.&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;
|-&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 there attachments. (ToS compliant)&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.1]]&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;
||[[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;
|| [[Self-Destruction]]&lt;br /&gt;
|| [[User:Davada Gallant|Davada Gallant]]&lt;br /&gt;
|| Makes an object disappear after a certain amount of time.&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;
|| [[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;
||[[Key Pad Door|Tdub&#039;s 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;
||[[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|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;
||[[Open Source Holodeck]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Open Source Home Rezzing System.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog Message]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Shout messages over a dialog.&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;
----&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>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Inventory_Menu&amp;diff=29050</id>
		<title>Inventory Menu</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Inventory_Menu&amp;diff=29050"/>
		<updated>2007-08-22T06:18:32Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: New page: {{LSL Header}}  Introduction: Ok you want to create a dialog based menu system, you want to support more then 12 buttons so im going to give you quick overview of basic menu using [[llRezA...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
Introduction:&lt;br /&gt;
Ok you want to create a dialog based menu system, you want to support more then 12 buttons&lt;br /&gt;
so im going to give you quick overview of basic menu using [[llRezAtRoot]], [[llGetInventoryName]] &amp;amp; [[llGetInventoryNumber]]&lt;br /&gt;
&lt;br /&gt;
USAGE:just drop objects into the prim and rez them from the dialog by touching the prim.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
integer MENU_CHANNEL = 1000;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    listener = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;Select one object below: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        MENU1 = [];&lt;br /&gt;
        MENU2 = [];&lt;br /&gt;
        if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
        {        &lt;br /&gt;
            for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {        &lt;br /&gt;
            for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)]; &lt;br /&gt;
            MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
            MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;                          &lt;br /&gt;
        } &lt;br /&gt;
        id = llDetectedKey(0);&lt;br /&gt;
        Dialog(id, MENU1);&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 (channel == MENU_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            llListenRemove(listener);  &lt;br /&gt;
            if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU2);&lt;br /&gt;
            }&lt;br /&gt;
            else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                Dialog(id, MENU1);&lt;br /&gt;
            }        &lt;br /&gt;
            else                    &lt;br /&gt;
            {&lt;br /&gt;
            // todo add offsets so box sites perfect on rezzer &lt;br /&gt;
             llRezAtRoot(message, llGetPos(), ZERO_VECTOR, llGetRot(), 0);&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;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:sort|Dialog Message}}{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=29049</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=29049"/>
		<updated>2007-08-22T06:07:34Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &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;
||[[Bullet (script)|Bullet]]&lt;br /&gt;
||[[User:Davida Gallant|Davida Gallant]]&lt;br /&gt;
||Self-explanatory. Works well with [[Self-Destruction|self-destruction]] script.&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;
||[[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 headder and won&#039;t echo.&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;
|-&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 there attachments. (ToS compliant)&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.1]]&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;
||[[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;
|| [[Self-Destruction]]&lt;br /&gt;
|| [[User:Davada Gallant|Davada Gallant]]&lt;br /&gt;
|| Makes an object disappear after a certain amount of time.&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;
|| [[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;
||[[Key Pad Door|Tdub&#039;s 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;
||[[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|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;
||[[Open Source Holodeck]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Open Source Home Rezzing System.&lt;br /&gt;
|-&lt;br /&gt;
||[[Dialog Message]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Shout messages over a dialog.&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>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dialog_Message&amp;diff=29048</id>
		<title>Dialog Message</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dialog_Message&amp;diff=29048"/>
		<updated>2007-08-22T06:03:10Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
just a simple script thats lets you say messages over a dialog instead of using llSay or llShout &lt;br /&gt;
so it lets everyone see.&lt;br /&gt;
&lt;br /&gt;
USAGE: /channel dialog &amp;quot;message&amp;quot; (without quotes)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer channel = 1000;&lt;br /&gt;
&lt;br /&gt;
integer llDialogMsg(string msg,string command)&lt;br /&gt;
{&lt;br /&gt;
    return llSubStringIndex(msg,command) == 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key uuid;&lt;br /&gt;
list names;&lt;br /&gt;
list keys;&lt;br /&gt;
integer handle;&lt;br /&gt;
integer gPos = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
    llListen(channel,&amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
    llResetScript();&lt;br /&gt;
    }  &lt;br /&gt;
        &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    { &lt;br /&gt;
        names = [];&lt;br /&gt;
        gPos = 0;&lt;br /&gt;
        integer i;&lt;br /&gt;
&lt;br /&gt;
       &lt;br /&gt;
        for (i = 0; i &amp;lt; num_detected; i++)&lt;br /&gt;
        {&lt;br /&gt;
            names = names + llDetectedKey(i);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
     }&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        listen(integer channel, string name, key id, string command)&lt;br /&gt;
        {&lt;br /&gt;
         string key0 = llList2String(keys, 0);&lt;br /&gt;
         string name0 = llList2String(names, 0);&lt;br /&gt;
         string name1 = llList2String(names, 1);&lt;br /&gt;
         string name2 = llList2String(names, 2);&lt;br /&gt;
         string name3 = llList2String(names, 3);&lt;br /&gt;
         string name4 = llList2String(names, 4);&lt;br /&gt;
         string name5 = llList2String(names, 5);&lt;br /&gt;
         string name6 = llList2String(names, 6);&lt;br /&gt;
         string name7 = llList2String(names, 7);&lt;br /&gt;
         string name8 = llList2String(names, 8); &lt;br /&gt;
         string name9 = llList2String(names, 9);&lt;br /&gt;
         string name10 = llList2String(names, 10);&lt;br /&gt;
         string name11 = llList2String(names, 11);&lt;br /&gt;
         string name12 = llList2String(names, 12);&lt;br /&gt;
         string name13 = llList2String(names, 13);&lt;br /&gt;
         string name14 = llList2String(names, 14);&lt;br /&gt;
         string name15 = llList2String(names, 15);&lt;br /&gt;
         string name16 = llList2String(names, 16);&lt;br /&gt;
         string name17 = llList2String(names, 17);&lt;br /&gt;
         string name18 = llList2String(names, 18);&lt;br /&gt;
         string name19 = llList2String(names, 19);&lt;br /&gt;
         string name20 = llList2String(names, 20);&lt;br /&gt;
         string name21 = llList2String(names, 21);&lt;br /&gt;
         string name22 = llList2String(names, 22);&lt;br /&gt;
         string name23 = llList2String(names, 23);&lt;br /&gt;
         string name24 = llList2String(names, 24);&lt;br /&gt;
         string name25 = llList2String(names, 25);&lt;br /&gt;
         string name26 = llList2String(names, 26);&lt;br /&gt;
         string name27 = llList2String(names, 27);&lt;br /&gt;
         string name28 = llList2String(names, 28);&lt;br /&gt;
         string name29 = llList2String(names, 29);&lt;br /&gt;
         string name30 = llList2String(names, 30);&lt;br /&gt;
         uuid=llGetOwner();&lt;br /&gt;
    if (llDialogMsg(command,&amp;quot;dialog&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        string name = llGetSubString(command,7,-1);&lt;br /&gt;
        if (name == &amp;quot;dialog&amp;quot;)&lt;br /&gt;
            {}&lt;br /&gt;
        else&lt;br /&gt;
            llDialog(uuid,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name0,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name1,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name2,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name3,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name4,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name5,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name6,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name7,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name8,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name9,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name10,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name11,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name12,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name13,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name14,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name15,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name16,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name17,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name18,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name19,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name20,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name21,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name22,name,[&amp;quot;OK&amp;quot;],channel );            &lt;br /&gt;
            llDialog(name23,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name24,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name25,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name26,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name27,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name28,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name29,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name30,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llListenRemove(handle);&lt;br /&gt;
            llSleep(1);&lt;br /&gt;
    }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enjoy :)&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:sort|Dialog Message}}{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dialog_Message&amp;diff=29047</id>
		<title>Dialog Message</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dialog_Message&amp;diff=29047"/>
		<updated>2007-08-22T06:02:40Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: New page: {{LSL Header}}  just a simple script thats lets you say messages over a dialog instead of using llSay or llShout  so it lets everyone see.  USAGE: /channel dialog &amp;quot;message&amp;quot; (without quotes...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
just a simple script thats lets you say messages over a dialog instead of using llSay or llShout &lt;br /&gt;
so it lets everyone see.&lt;br /&gt;
&lt;br /&gt;
USAGE: /channel dialog &amp;quot;message&amp;quot; (without quotes)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer channel = 1000;&lt;br /&gt;
&lt;br /&gt;
integer llDialogMsg(string msg,string command)&lt;br /&gt;
{&lt;br /&gt;
    return llSubStringIndex(msg,command) == 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key uuid;&lt;br /&gt;
list names;&lt;br /&gt;
list keys;&lt;br /&gt;
integer handle;&lt;br /&gt;
integer gPos = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
    llListen(channel,&amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
    llResetScript();&lt;br /&gt;
    }  &lt;br /&gt;
        &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    { &lt;br /&gt;
        names = [];&lt;br /&gt;
        gPos = 0;&lt;br /&gt;
        integer i;&lt;br /&gt;
&lt;br /&gt;
       &lt;br /&gt;
        for (i = 0; i &amp;lt; num_detected; i++)&lt;br /&gt;
        {&lt;br /&gt;
            names = names + llDetectedKey(i);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
     }&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        listen(integer channel, string name, key id, string command)&lt;br /&gt;
        {&lt;br /&gt;
         string key0 = llList2String(keys, 0);&lt;br /&gt;
         string name0 = llList2String(names, 0);&lt;br /&gt;
         string name1 = llList2String(names, 1);&lt;br /&gt;
         string name2 = llList2String(names, 2);&lt;br /&gt;
         string name3 = llList2String(names, 3);&lt;br /&gt;
         string name4 = llList2String(names, 4);&lt;br /&gt;
         string name5 = llList2String(names, 5);&lt;br /&gt;
         string name6 = llList2String(names, 6);&lt;br /&gt;
         string name7 = llList2String(names, 7);&lt;br /&gt;
         string name8 = llList2String(names, 8); &lt;br /&gt;
         string name9 = llList2String(names, 9);&lt;br /&gt;
         string name10 = llList2String(names, 10);&lt;br /&gt;
         string name11 = llList2String(names, 11);&lt;br /&gt;
         string name12 = llList2String(names, 12);&lt;br /&gt;
         string name13 = llList2String(names, 13);&lt;br /&gt;
         string name14 = llList2String(names, 14);&lt;br /&gt;
         string name15 = llList2String(names, 15);&lt;br /&gt;
         string name16 = llList2String(names, 16);&lt;br /&gt;
         string name17 = llList2String(names, 17);&lt;br /&gt;
         string name18 = llList2String(names, 18);&lt;br /&gt;
         string name19 = llList2String(names, 19);&lt;br /&gt;
         string name20 = llList2String(names, 20);&lt;br /&gt;
         string name21 = llList2String(names, 21);&lt;br /&gt;
         string name22 = llList2String(names, 22);&lt;br /&gt;
         string name23 = llList2String(names, 23);&lt;br /&gt;
         string name24 = llList2String(names, 24);&lt;br /&gt;
         string name25 = llList2String(names, 25);&lt;br /&gt;
         string name26 = llList2String(names, 26);&lt;br /&gt;
         string name27 = llList2String(names, 27);&lt;br /&gt;
         string name28 = llList2String(names, 28);&lt;br /&gt;
         string name29 = llList2String(names, 29);&lt;br /&gt;
         string name30 = llList2String(names, 30);&lt;br /&gt;
         uuid=llGetOwner();&lt;br /&gt;
    if (llDialogMsg(command,&amp;quot;dialog&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        string name = llGetSubString(command,7,-1);&lt;br /&gt;
        if (name == &amp;quot;dialog&amp;quot;)&lt;br /&gt;
            {}&lt;br /&gt;
        else&lt;br /&gt;
            llDialog(uuid,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name0,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name1,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name2,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name3,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name4,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name5,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name6,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name7,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name8,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name9,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name10,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name11,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name12,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name13,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name14,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name15,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name16,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name17,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name18,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name19,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name20,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name21,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name22,name,[&amp;quot;OK&amp;quot;],channel );            &lt;br /&gt;
            llDialog(name23,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name24,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name25,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name26,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name27,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name28,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name29,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llDialog(name30,name,[&amp;quot;OK&amp;quot;],channel );&lt;br /&gt;
            llListenRemove(handle);&lt;br /&gt;
            llSleep(1);&lt;br /&gt;
    }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enjoy :)&lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:sort|Open Source Holodeck}}{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=28533</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=28533"/>
		<updated>2007-08-17T04:59:07Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &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;
||[[Bullet (script)|Bullet]]&lt;br /&gt;
||[[User:Davida Gallant|Davida Gallant]]&lt;br /&gt;
||Self-explanatory. Works well with [[Self-Destruction|self-destruction]] script.&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;
||[[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 headder and won&#039;t echo.&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;
|-&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 there attachments. (ToS compliant)&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;
|| [[Self-Destruction]]&lt;br /&gt;
|| [[User:Davada Gallant|Davada Gallant]]&lt;br /&gt;
|| Makes an object disappear after a certain amount of time.&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;
|| [[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;
||[[Key Pad Door|Tdub&#039;s 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;
||[[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|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;
||[[Open Source Holodeck]]&lt;br /&gt;
||[[User:Revolution Perenti|Revolution Perenti]]&lt;br /&gt;
||Open Source Home Rezzing System.&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>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=File:Floor_panel.jpg&amp;diff=28532</id>
		<title>File:Floor panel.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=File:Floor_panel.jpg&amp;diff=28532"/>
		<updated>2007-08-17T04:53:50Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=File:Holodeck_shell.jpg&amp;diff=28531</id>
		<title>File:Holodeck shell.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=File:Holodeck_shell.jpg&amp;diff=28531"/>
		<updated>2007-08-17T04:53:34Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=28529</id>
		<title>Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=28529"/>
		<updated>2007-08-17T04:48:53Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
What is a Holodeck?&lt;br /&gt;
&lt;br /&gt;
A Holodeck stores Second Life scenes and lets you load them from a menu when ever you want. The old scene is cleared and the new one appears. Scenes can include any prim objects including furniture, pose balls and particle generators. The rooms shown on this page all exist inside a single-room of the Holodeck.&lt;br /&gt;
&lt;br /&gt;
The Scripts for the holodeck may look complex but once you done it correcly everything is very easy to setup and use and just build almost like you normally would within sl&lt;br /&gt;
&lt;br /&gt;
Creating the holodeck, the best way to start would be to create a 20x20x10 shell this would be your rezzing area for the holodeck&lt;br /&gt;
&lt;br /&gt;
once you done this you should have something similar to the picture below&lt;br /&gt;
&lt;br /&gt;
[[Image:holodeck shell.jpg]]&lt;br /&gt;
&lt;br /&gt;
ok next we create a small panel for the floor 0.500x0.500x0.100 and link this to your holodeck shell make sure this is the last object you link to the holodeck shell as this becomes the root prim&lt;br /&gt;
&lt;br /&gt;
see example below&lt;br /&gt;
&lt;br /&gt;
[[Image:floor panel.jpg]]&lt;br /&gt;
&lt;br /&gt;
The Scripts&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Holodeck Core.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// User Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//How long to listen for a menu response before shutting down the listener&lt;br /&gt;
float fListenTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//How often (in seconds) to check for change in position when moving&lt;br /&gt;
float fMovingRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
//How long to sit still before exiting active mode&lt;br /&gt;
float fStoppedTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//Minimum amount of time (in seconds) between movement updates&lt;br /&gt;
float fShoutRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
// label script name used for debug and PrototypeSay();&lt;br /&gt;
string label = &amp;quot;internal label&amp;quot;;&lt;br /&gt;
// Channel used by Prototype&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer MENU_CHANNEL;&lt;br /&gt;
integer MENU_HANDLE;&lt;br /&gt;
string PROTOTYPE_CREATOR;&lt;br /&gt;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
integer PROTOTYPE_RESET = -68195;&lt;br /&gt;
integer SHOW_MENU = -68194;&lt;br /&gt;
// Channel used by Prototype to talk to label scripts&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
// Feature Manager&lt;br /&gt;
integer PROTOTYPE_TEXTURE = TRUE;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Security Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
integer PROTOTYPE_ALLOW_IM = FALSE;&lt;br /&gt;
string  PROTOTYPE_EMAIL = &amp;quot;phoenixcms@hotmail.co.uk&amp;quot;;&lt;br /&gt;
string  PROTOTYPE_OWNER;&lt;br /&gt;
vector  Where;&lt;br /&gt;
string  Name;&lt;br /&gt;
string  SLURL;&lt;br /&gt;
integer X;&lt;br /&gt;
integer Y;&lt;br /&gt;
integer Z;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Menu System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Compatibility System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list objectSettings = [];&lt;br /&gt;
integer stride = 3;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
string COMPATIBILITY_NOTECARD = &amp;quot;compatibility&amp;quot;; //[objectname];&amp;lt;position&amp;gt;;&amp;lt;rotation&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DO NOT EDIT BELOW THIS LINE.... NO.. NOT EVEN THEN&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer PrototypeBaseMoving;&lt;br /&gt;
vector PrototypeLastPosition;&lt;br /&gt;
rotation PrototypeLastRotation;&lt;br /&gt;
integer iListenTimeout = 0;&lt;br /&gt;
&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//To avoid flooding the sim with a high rate of movements&lt;br /&gt;
//(and the resulting mass updates it will bring), we used&lt;br /&gt;
// a short throttle to limit ourselves&lt;br /&gt;
prototype_moved()&lt;br /&gt;
{&lt;br /&gt;
    llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ llGetPos(), llGetRot() ], &amp;quot;|&amp;quot;));&lt;br /&gt;
    llResetTime(); //Reset our throttle&lt;br /&gt;
    PrototypeLastPosition = llGetPos();&lt;br /&gt;
    PrototypeLastRotation = llGetRot();&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    iListenTimeout = llGetUnixTime() + llFloor(fListenTime);&lt;br /&gt;
    MENU_CHANNEL = llFloor(llFrand(-99999.0 - -100));&lt;br /&gt;
    MENU_HANDLE = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;www.sl-prototype.com: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
    llSetTimerEvent(fShoutRate);&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;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER || CHANGED_INVENTORY)&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry () &lt;br /&gt;
    {&lt;br /&gt;
        // Lets open our listen channel&lt;br /&gt;
        key_listen = llListen(PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;LISTEN ON CHANNEL &amp;quot; +(string)PROTOTYPE_CHANNEL);&lt;br /&gt;
        // Compatibility System Notecard&lt;br /&gt;
        llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        //Record our position&lt;br /&gt;
        PrototypeLastPosition = llGetPos();&lt;br /&gt;
        PrototypeLastRotation = llGetRot();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    dataserver(key queryId, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            objectSettings += llParseString2List(data, [&amp;quot;;&amp;quot;], []);&lt;br /&gt;
            iLine++;&lt;br /&gt;
            llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Done Reading Compatibility Notecard &amp;quot; + COMPATIBILITY_NOTECARD);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number==SHOW_MENU) {&lt;br /&gt;
            MENU1 = [];&lt;br /&gt;
            MENU2 = [];&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
                MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            Dialog(id, MENU1);&lt;br /&gt;
        }&lt;br /&gt;
        if (number==PROTOTYPE_RESET) {&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Forgetting positions...&amp;quot;);&lt;br /&gt;
        llPrototypeSay(&amp;quot;RESET&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
        }&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;
    list compatibility = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
    csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
    string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
    string command = llList2String( csv_commands,1 );&lt;br /&gt;
    PROTOTYPE_CREATOR = llGetCreator();&lt;br /&gt;
    //&lt;br /&gt;
    if ( command == llToLower(&amp;quot;CHANNEL&amp;quot;) || command == llToUpper(&amp;quot;CHANNEL&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        PROTOTYPE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        llListenRemove( key_listen );&lt;br /&gt;
        key_listen = llListen( PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)PROTOTYPE_CHANNEL );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == llToLower(&amp;quot;MESSAGE&amp;quot;) || command == llToUpper(&amp;quot;MESSAGE&amp;quot;))  &lt;br /&gt;
    {&lt;br /&gt;
        PROTOTYPE_MESSAGE = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        llOwnerSay ( &amp;quot;PROTOTYPE MESSAGE set to &amp;quot; + (string)PROTOTYPE_MESSAGE );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    // OPEN / CLOSE DOOR    &lt;br /&gt;
    if ( message == llToLower(&amp;quot;DOOR&amp;quot;) || message == llToUpper(&amp;quot;DOOR&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_SET, PROTOTYPE_DOOR, &amp;quot;&amp;quot;,NULL_KEY );&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Setting Door Permissions...&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    // SET COMPATIBILITY&lt;br /&gt;
    if(llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;) || llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        string object = llList2String(compatibility, 1);&lt;br /&gt;
        integer indexInSettings = llListFindList(objectSettings, [object]);&lt;br /&gt;
    if(indexInSettings &amp;gt;= 0)&lt;br /&gt;
    {&lt;br /&gt;
        vector pos = (vector)llList2String(objectSettings, indexInSettings + 1);&lt;br /&gt;
        rotation rot = (rotation)llList2String(objectSettings, indexInSettings + 2);&lt;br /&gt;
        llRezAtRoot(object, pos + llGetPos(), ZERO_VECTOR, rot, 0);&lt;br /&gt;
    }&lt;br /&gt;
    }&lt;br /&gt;
// LOAD MENU SYSTEM    &lt;br /&gt;
if (channel == MENU_CHANNEL)&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listener);&lt;br /&gt;
        vector vThisPos = llGetPos();&lt;br /&gt;
        rotation rThisRot = llGetRot();&lt;br /&gt;
    if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        Dialog(id, MENU2);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        Dialog(id, MENU1);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Loop through backwards (safety precaution in case of inventory change)&lt;br /&gt;
    if (DEBUG) llDebugSay(&amp;quot;Loading build pieces please wait...&amp;quot;);&lt;br /&gt;
        llRezAtRoot(message, llGetPos() + &amp;lt;0.00, 0.00, 0.30&amp;gt;, ZERO_VECTOR, llGetRot(), PROTOTYPE_CHANNEL);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // REPOSTION SCENE    &lt;br /&gt;
    if ( message == llToLower(&amp;quot;POSITION&amp;quot;) || message == llToUpper(&amp;quot;POSITION&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
    if (DEBUG) llDebugSay(&amp;quot;Positioning&amp;quot;);&lt;br /&gt;
        vector vThisPos = llGetPos();&lt;br /&gt;
        rotation rThisRot = llGetRot();&lt;br /&gt;
        llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    // CLEAR SCENE&lt;br /&gt;
    if ( message == llToLower(&amp;quot;CLEAR&amp;quot;) || message == llToUpper(&amp;quot;CLEAR&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        llPrototypeSay(&amp;quot;CLEAN&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if( message == llToLower(&amp;quot;HOLODECKDIE&amp;quot;) || message == llToUpper(&amp;quot;HOLODECKDIE&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
    if(PROTOTYPE_CREATOR) llDie();&lt;br /&gt;
    }&lt;br /&gt;
    // DISABLE PHANTOM AS WE ARE NOW DONE&lt;br /&gt;
    if ( message == llToLower(&amp;quot;NOPHANTOM&amp;quot;) || message == llToUpper(&amp;quot;NOPHANTOM&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        llPrototypeSay(&amp;quot;PHANTOM&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Disabled Phantom&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    moving_start() //StartPrototype&lt;br /&gt;
    {&lt;br /&gt;
        if( !PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
        PrototypeBaseMoving = TRUE;&lt;br /&gt;
        llSetTimerEvent(0.0); //Resets the timer if already running&lt;br /&gt;
        llSetTimerEvent(fMovingRate);&lt;br /&gt;
        prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer() &lt;br /&gt;
    {&lt;br /&gt;
        //Were we moving?&lt;br /&gt;
        if( PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
        //Did we change position/rotation?&lt;br /&gt;
        if( (llGetRot() != PrototypeLastRotation) || (llGetPos() != PrototypeLastPosition) )&lt;br /&gt;
        {&lt;br /&gt;
        if( llGetTime() &amp;gt; fShoutRate ) {&lt;br /&gt;
        prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
        }&lt;br /&gt;
        } else {&lt;br /&gt;
        // Have we been sitting long enough to consider ourselves stopped?&lt;br /&gt;
        if( llGetTime() &amp;gt; fStoppedTime )&lt;br /&gt;
        PrototypeBaseMoving = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Open listener?&lt;br /&gt;
        if( iListenTimeout != 0 )&lt;br /&gt;
        {&lt;br /&gt;
        //Past our close timeout?&lt;br /&gt;
        if( iListenTimeout &amp;lt;= llGetUnixTime() )&lt;br /&gt;
        {&lt;br /&gt;
        iListenTimeout = 0;&lt;br /&gt;
        llListenRemove(MENU_HANDLE);&lt;br /&gt;
        }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Stop the timer?&lt;br /&gt;
        if( (iListenTimeout == 0) &amp;amp;&amp;amp; ( !PrototypeBaseMoving ) )&lt;br /&gt;
        {&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Stopping Timer&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    } // END TIMER FUNCTION&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        PROTOTYPE_OWNER = llGetOwner();&lt;br /&gt;
        //Name = llGetRegionName();&lt;br /&gt;
        Name = llDumpList2String(llParseString2List(llGetRegionName(),[&amp;quot; &amp;quot;],[]),&amp;quot;_&amp;quot;);&lt;br /&gt;
        Where = llGetPos();&lt;br /&gt;
&lt;br /&gt;
        X = (integer)Where.x;&lt;br /&gt;
        Y = (integer)Where.y;&lt;br /&gt;
        Z = (integer)Where.z;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // I don&#039;t replace any spaces in Name with %20 and so forth.&lt;br /&gt;
&lt;br /&gt;
        SLURL = &amp;quot;http://slurl.com/secondlife/&amp;quot; + Name + &amp;quot;/&amp;quot; + (string)X + &amp;quot;/&amp;quot; + (string)Y + &amp;quot;/&amp;quot; + (string)Z + &amp;quot;/?title=&amp;quot; + Name;&lt;br /&gt;
&lt;br /&gt;
        llEmail(PROTOTYPE_EMAIL, llKey2Name(PROTOTYPE_OWNER), SLURL + &amp;quot;\nRegistered user =&amp;quot; + llKey2Name(PROTOTYPE_OWNER) + &amp;quot;Registered user key =&amp;quot; + PROTOTYPE_OWNER);&lt;br /&gt;
        if(PROTOTYPE_ALLOW_IM) {&lt;br /&gt;
        llInstantMessage(llGetCreator(), SLURL);&lt;br /&gt;
        }&lt;br /&gt;
        // Reset ourselves&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Texture Engine.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
string TEXTURE_NOTECARD;&lt;br /&gt;
string prefix = &amp;quot;tex_&amp;quot;;&lt;br /&gt;
key TextureQuery;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
integer DEBUG = FALSE; // debug channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
default {&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
       key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
       TEXTURE_NOTECARD = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
       if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + TEXTURE_NOTECARD);&lt;br /&gt;
       TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        list texture = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            TEXTURE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)TEXTURE_CHANNEL);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(llList2String(texture, 0) == &amp;quot;image&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            iLine = 0;&lt;br /&gt;
            TEXTURE_NOTECARD = llList2String(texture, 1);&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////        &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == TextureQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data != EOF &amp;amp;&amp;amp; prefix == &amp;quot;tex_&amp;quot;) {    &lt;br /&gt;
            &lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);&lt;br /&gt;
                llMessageLinked(LINK_SET,0,data,NULL_KEY);&lt;br /&gt;
&lt;br /&gt;
                // increment line count                 &lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                iLine++;&lt;br /&gt;
                TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Done reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Notecards&lt;br /&gt;
&lt;br /&gt;
*Clear* Notecard for default Clear Scene &lt;br /&gt;
(note the first line of texture notecards is object name so make sure you name all floor panels, roof and walls with unique name and edit the notecard as required add each object line to a new line as required.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Object_Name#2f78ee38-9aca-f8d1-5306-458beab181f9#&amp;lt;3.0,1.0,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
compatibility notecard leave this blank at current its planned as future feature to allow weather inside the holodeck and was the old rezz system from early beta but we left it here to be reused later on.&lt;br /&gt;
&lt;br /&gt;
Walls, Floor,Roof texture system&lt;br /&gt;
needs to be added to every object you wish to texture each object needs a unique name too for better control of textures&lt;br /&gt;
Texture System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list tex_vals;&lt;br /&gt;
string objname;&lt;br /&gt;
string tex_id;&lt;br /&gt;
vector repeats;&lt;br /&gt;
vector offsets;&lt;br /&gt;
float rot_val;&lt;br /&gt;
vector color;&lt;br /&gt;
float alpha;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector eul = &amp;lt;0.00, 0.00, 0.00&amp;gt;;&lt;br /&gt;
        eul *= DEG_TO_RAD;&lt;br /&gt;
        rotation quat = llEuler2Rot( eul );&lt;br /&gt;
        llSetRot( quat );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sent,integer num,string str,key id)&lt;br /&gt;
    {&lt;br /&gt;
        tex_vals = llParseString2List(str,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        objname = llList2String(tex_vals,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (objname == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            tex_id = llList2String(tex_vals,1);&lt;br /&gt;
            repeats = (vector)llList2String(tex_vals,2);&lt;br /&gt;
            offsets = (vector)llList2String(tex_vals,3);&lt;br /&gt;
            rot_val = ((float)llList2String(tex_vals,4)) * DEG_TO_RAD;&lt;br /&gt;
            color = (vector)llList2String(tex_vals,5);&lt;br /&gt;
            alpha = (float)llList2String(tex_vals,6);&lt;br /&gt;
            &lt;br /&gt;
            //texture change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_TEXTURE,0,tex_id,repeats,offsets,rot_val]);&lt;br /&gt;
            llSetPrimitiveParams([PRIM_COLOR,0,color,alpha]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Door Script to be places in one of the prims where you would like a door, this does a hollow effect to give the impression of the door and is controlled with link messages.&lt;br /&gt;
&lt;br /&gt;
Door System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message( integer sender, integer msg, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == PROTOTYPE_DOOR) {&lt;br /&gt;
            list open = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
            string open2 = llList2String(open, 3);&lt;br /&gt;
            if (llGetSubString(open2,0,2) != &amp;quot;0.0&amp;quot;)&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.0,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
            else&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.95,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
next we create a 0.500x0.500x0.100 box this is used for control panel&lt;br /&gt;
now link this to your holodeck shell linking the shell last becuase we want to keep the root prim intact i normally put this just to the side of the door but you can put this anywhere you like.&lt;br /&gt;
&lt;br /&gt;
Next right click select edit link parts and select the switch now we add the menu functions scripts.&lt;br /&gt;
&lt;br /&gt;
Menu System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list csv_commands;&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
integer SCENEMENU = -68194;&lt;br /&gt;
key agent;&lt;br /&gt;
key objectowner;&lt;br /&gt;
integer group;&lt;br /&gt;
// Set to TRUE to allow group members to use the dialog menu&lt;br /&gt;
// Set to FALSE to disallow group members from using the dialog menu&lt;br /&gt;
integer ingroup = 0;&lt;br /&gt;
integer DEBUG = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay(&amp;quot;Current chanel: &amp;quot;+(string)P_channel);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
    csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
    string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
    string command = llList2String( csv_commands,1 );&lt;br /&gt;
    if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    if(command == llToLower(&amp;quot;PERMS&amp;quot;) || message == llToUpper(&amp;quot;PERMS&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
    ingroup = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay ( &amp;quot;ingroup set to &amp;quot; + (string)ingroup);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
} // end listen();&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   &lt;br /&gt;
       group = llDetectedGroup(0); // Is the Agent in the objowners group?&lt;br /&gt;
       agent = llDetectedKey(0); // Agent&#039;s key&lt;br /&gt;
       objectowner = llGetOwner(); // objowners key&lt;br /&gt;
       // is the Agent = the owner OR is the agent in the owners group&lt;br /&gt;
       if ( (objectowner == agent) || ( group &amp;amp;&amp;amp; ingroup )  )  {&lt;br /&gt;
       llMessageLinked(LINK_SET,SCENEMENU,&amp;quot;&amp;quot;,agent); // id = AviID or llDetectedKey(0) = id or something&lt;br /&gt;
       }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup Scene Clear&lt;br /&gt;
next create a box and label this box *Clear*&lt;br /&gt;
and add the following script this will clear the scenes when you switch.&lt;br /&gt;
Clear Label Script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
float gap = 15.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(0, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now take this box to your Inventry.&lt;br /&gt;
&lt;br /&gt;
now create another box Called *Create* give this box full permissions and take into your inventry&lt;br /&gt;
now right click on your holodeck-&amp;gt;content and drag the *Clear* &amp;amp; *Create* boxes into the root prim.&lt;br /&gt;
wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
internal label script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Configurable Settings&lt;br /&gt;
float fTimerInterval = 0.25; //Time in seconds between movement &#039;ticks&#039;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192; //Channel used by Base Prim to talk to Component Prims;&lt;br /&gt;
// This must match in both scripts&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Runtime Variables (Dont need to change below here unless making a derivative)&lt;br /&gt;
vector SceneOffset;&lt;br /&gt;
rotation SceneRotation;&lt;br /&gt;
integer SceneMove;&lt;br /&gt;
vector SceneDestPosition;&lt;br /&gt;
rotation SceneDestRotation;&lt;br /&gt;
integer SceneSaved = FALSE;&lt;br /&gt;
integer PROTOTYPE_VERSION = TRUE; // TRUE = Production, FALSE = Basic / NOMOD, NOCOPY NO TRANS Demo Box&lt;br /&gt;
integer PROTOTYPE_MESSAGE = TRUE;&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string first_word(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the first word in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the whole string.&lt;br /&gt;
if(Token == &amp;quot;&amp;quot;) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
//Found it?&lt;br /&gt;
if( pos &amp;gt;= 1 )&lt;br /&gt;
return llGetSubString(In_String, 0, pos - 1);&lt;br /&gt;
else&lt;br /&gt;
return In_String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string other_words(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the other-than-first words in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the an empty string.&lt;br /&gt;
if( Token == &amp;quot;&amp;quot; ) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
//Found it?&lt;br /&gt;
if( pos &amp;gt;= 1 )&lt;br /&gt;
return llGetSubString(In_String, pos + 1, llStringLength(In_String));&lt;br /&gt;
else&lt;br /&gt;
return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
prototype_move()&lt;br /&gt;
{&lt;br /&gt;
integer i = 0;&lt;br /&gt;
vector SceneLastPosition = ZERO_VECTOR;&lt;br /&gt;
while( (i &amp;lt; 5) &amp;amp;&amp;amp; (llGetPos() != SceneDestPosition) )&lt;br /&gt;
{&lt;br /&gt;
list lParams = [];&lt;br /&gt;
&lt;br /&gt;
//If we&#039;re not there....&lt;br /&gt;
if( llGetPos() != SceneDestPosition )&lt;br /&gt;
{&lt;br /&gt;
//We may be stuck on the ground...&lt;br /&gt;
//Did we move at all compared to last loop?&lt;br /&gt;
if( llGetPos() == SceneLastPosition )&lt;br /&gt;
{&lt;br /&gt;
//Yep, stuck...move straight up 10m (attempt to dislodge)&lt;br /&gt;
lParams = [ PRIM_POSITION, llGetPos() + &amp;lt;0, 0, 10.0&amp;gt; ];&lt;br /&gt;
//llSetPos(llGetPos() + &amp;lt;0, 0, 10.0&amp;gt;);&lt;br /&gt;
} else {&lt;br /&gt;
//Record our spot for &#039;stuck&#039; detection&lt;br /&gt;
SceneLastPosition = llGetPos();&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Try to move to destination&lt;br /&gt;
integer iHops = llAbs(llCeil(llVecDist(llGetPos(), SceneDestPosition) / 10.0));&lt;br /&gt;
integer x;&lt;br /&gt;
for( x = 0; x &amp;lt; iHops; x++ ) {&lt;br /&gt;
lParams += [ PRIM_POSITION, SceneDestPosition ];&lt;br /&gt;
}&lt;br /&gt;
llSetPrimitiveParams(lParams);&lt;br /&gt;
//llSleep(0.1);&lt;br /&gt;
++i; // changed i++ too ++i credit goes to Simon Sugita for Speed Tweak :)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Set rotation&lt;br /&gt;
llSetRot(SceneDestRotation);&lt;br /&gt;
}&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;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
//Open up the listener&lt;br /&gt;
llListen(PROTOTYPE_SCRIPTS, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        //Set the channel to what&#039;s specified&lt;br /&gt;
    if( start_param != 0 )&lt;br /&gt;
    {&lt;br /&gt;
        PROTOTYPE_SCRIPTS = start_param;&lt;br /&gt;
        state reset_listeners;&lt;br /&gt;
    }&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;
string command = llToUpper(first_word(message, &amp;quot; &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if( command == &amp;quot;RECORD&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
SceneOffset = (llGetPos() - SceneVectorBase) / SceneRotationBase;&lt;br /&gt;
SceneRotation = llGetRot() / SceneRotationBase;&lt;br /&gt;
SceneSaved = TRUE;&lt;br /&gt;
llOwnerSay(&amp;quot;Recorded position.&amp;quot;);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;MOVE&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
// lets set objects phantom &lt;br /&gt;
llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
    &lt;br /&gt;
//Don&#039;t move if we&#039;ve not yet recorded a position&lt;br /&gt;
if( !SceneSaved ) return;&lt;br /&gt;
&lt;br /&gt;
//Also ignore commands from bases with a different owner than us&lt;br /&gt;
//(Anti-hacking measure)&lt;br /&gt;
if( llGetOwner() != llGetOwnerKey(id) ) return;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Calculate our destination position&lt;br /&gt;
message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
//Calculate our destination position&lt;br /&gt;
SceneDestPosition = (SceneOffset * SceneRotationBase) + SceneVectorBase;&lt;br /&gt;
SceneDestRotation = SceneRotation * SceneRotationBase;&lt;br /&gt;
&lt;br /&gt;
//Turn on our timer to perform the move?&lt;br /&gt;
if( !SceneMove )&lt;br /&gt;
{&lt;br /&gt;
llSetTimerEvent(fTimerInterval);&lt;br /&gt;
SceneMove = TRUE;&lt;br /&gt;
}&lt;br /&gt;
// lets set objects phantom &lt;br /&gt;
llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;PHANTOM&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
//We are done, turn phantom off&lt;br /&gt;
llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;DONE&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
//We are done, remove script&lt;br /&gt;
llRemoveInventory(llGetScriptName());&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;CLEAN&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
//Clean up&lt;br /&gt;
llDie();&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;FLUSH&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
llResetScript();&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
timer()&lt;br /&gt;
{&lt;br /&gt;
//Turn ourselves off&lt;br /&gt;
llSetTimerEvent(0.0);&lt;br /&gt;
&lt;br /&gt;
//Do we need to move?&lt;br /&gt;
if( SceneMove )&lt;br /&gt;
{&lt;br /&gt;
//Perform the move and clean up&lt;br /&gt;
prototype_move();&lt;br /&gt;
SceneMove = FALSE;&lt;br /&gt;
}&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state reset_listeners&lt;br /&gt;
{&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
state default;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Package Scripts)&lt;br /&gt;
address script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
float gap = 10.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
integer i;&lt;br /&gt;
integer iLine;&lt;br /&gt;
string item;&lt;br /&gt;
vector vThisPos;&lt;br /&gt;
rotation rThisRot;&lt;br /&gt;
&lt;br /&gt;
scene_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
       &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        scene_entry();&lt;br /&gt;
        vThisPos = llGetPos();&lt;br /&gt;
        rThisRot = llGetRot();&lt;br /&gt;
        iLine = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        for(i=0; i &amp;lt; iLine; i++)&lt;br /&gt;
        {&lt;br /&gt;
        item = llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
        llSleep (1.00);&lt;br /&gt;
        llRezObject(item, vThisPos + &amp;lt;0.00, 0.00, 1.00&amp;gt;, ZERO_VECTOR, rThisRot, 0);&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS, &amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
        if (DEBUG) llShout (DEBUG_CHANNEL, &amp;quot;Rezzing &amp;quot; + item);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(DEBUG_CHANNEL, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;POSITION&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Builders Docs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Builders Manual&lt;br /&gt;
By Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
Welcome to the world of building with your Prototype System. Anyone wishing to build scenes for the Prototype needs to have a good understanding of building and texturing to succeed. Please read this manual through once fully and then as needed when you start building. This manual is divided into several sections:&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
Building scenes&lt;br /&gt;
Building Shells&lt;br /&gt;
Texture Card&lt;br /&gt;
Scene Creation&lt;br /&gt;
Tips&lt;br /&gt;
Packaging&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
The main thing to remember is any object you want to put in the Prototype scene/shell must be copy/mod at a minimum. The way the Prototype system works is by rezzing copies of an item from its inventory. These objects must be modified, adding a special script to make them work with the system scripts.&lt;br /&gt;
&lt;br /&gt;
There are two ways to build with the Prototype:&lt;br /&gt;
&lt;br /&gt;
   1. The linked scene&lt;br /&gt;
   2. The multi-item scene&lt;br /&gt;
&lt;br /&gt;
The linked scene is made from multiple objects and linked; the unlinked scene consists of a number or unlinked objects around the unit.&lt;br /&gt;
&lt;br /&gt;
A scene set will consist of the objects you create and a texture card. These will be explained in greater detail as we move along. The texture card must begin with tex_ or the system will not read them. Feel free to give your scenes a user friendly name, but only with letters, numbers, _ or – in the same name as the current scene we are building for.&lt;br /&gt;
&lt;br /&gt;
Building Scenes&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
   1. Create the objects you want in your scene and arrange them as you like&lt;br /&gt;
   2. Place a label script into each linked object or individual object you have set out in your scene &lt;br /&gt;
   3. Use /1000 SAVE to save the position and rotation of the current scene&lt;br /&gt;
   4. If you wish to modify the scene before repacking or move things around more, enter /1000 RESET and then follow step 3 again&lt;br /&gt;
   5. Next texture the walls, floor, and ceiling; set the repeats, etc. the way you want them&lt;br /&gt;
   6. Open the example tex_*Clear*, and go from prim to prim, and copy the info from the texture window to the notecard as explained above&lt;br /&gt;
   7. Name the suffix of the notecards something user friendly&lt;br /&gt;
   8. Right click on all the objects while holding the Ctrl key and choose edit; then take all the objects into your inventory&lt;br /&gt;
   9. Next, click on your control panel on the wall and press the *Create* button; this will prepare a package for your scene&lt;br /&gt;
  10. Now we will want to name the scene: right click this box, click edit, and fill in something friendly for your scene name and description&lt;br /&gt;
  11. Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts &lt;br /&gt;
  12. Drag the internal address script to the content tab of your inventory and drag the object from our scene that we took into our inventory earlier, copying this to the content tab; we now have all the requirements for loading scenes &lt;br /&gt;
  13. Right click on the Prototype floor panel, choose edit, check edit linked parts, then select the red area of the floor panel (inside the red field) and press Contents tab and drag the object package, and tex_package in there&lt;br /&gt;
  14. Type /1000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
  15. Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
Building Shells&lt;br /&gt;
We will go into much more detail of how to build a scene later, and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
   1. Create the objects you want as your Shell and arrange them as you like&lt;br /&gt;
   2. Place a external label script into each linked object or individual object you have set out as your prototype shell &lt;br /&gt;
   3. Use /2000 SAVE to save the position and rotation of the current shell; if you wish to modify the shell before repacking or move things around more enter /2000 RESET and then follow step 3 again&lt;br /&gt;
   4. Right click on all the object while holding the Ctrl key, edit and take all the objects into your inventory&lt;br /&gt;
   5. Next click on your control panel on the wall and press the *Create* button, preparing a package for your shell&lt;br /&gt;
   6. Now we will want to name the shell package: right click this box, edit it, and fill in something friendly for your shell name and description&lt;br /&gt;
   7. Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts&lt;br /&gt;
   8. Right click on the Prototype floor panel, go into edit, check edit link parts, then select the blue area of the floor panel (inside the blue field)&lt;br /&gt;
   9. Next go to the Content tab and drag the object package into it&lt;br /&gt;
  10. Type /2000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
  11. Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
Texture Card&lt;br /&gt;
The Prototype consists of eight wall, four ceiling, and four floor prims. The texture card has one line for each of these inner prim faces. The prims are named for their direction on the SL compass, and the name of each face on the texture card corresponds to these names. The card must begin with tex_xxx where xxx is the name of the scene, which must be the same name as will be given to the object card.&lt;br /&gt;
&lt;br /&gt;
Each line of the texture card has the following information:&lt;br /&gt;
&lt;br /&gt;
wall section#texture key#vector repeats#vector offsets#float rotation#vector color#float alpha&lt;br /&gt;
&lt;br /&gt;
Once it’s completed, it may look like the following:&lt;br /&gt;
&lt;br /&gt;
ene_wall#2eabe96c-2540-e1fa-ce7f-9030c3d958df#&amp;lt;1.5,1,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&lt;br /&gt;
Each of the items in the texture card must be separated by the symbol #&lt;br /&gt;
&lt;br /&gt;
*Wall Section*&lt;br /&gt;
The wall section name corresponds to the name given to each prim in the Prototype. Use the edit linked parts and then point to the prim, make a note of the wall name. Then go to the card and find the same line containing that wall name.&lt;br /&gt;
&lt;br /&gt;
*Texture Key*&lt;br /&gt;
This is the ID of the texture you are using. This texture must have full permissions. Right click on the prim, select texture, locate it in the list, then right click and copy UUID. Next paste this ID into the note card exactly between the ##.&lt;br /&gt;
&lt;br /&gt;
*Vector Repeats*&lt;br /&gt;
These numbers correspond to the horizontal/vertical repeats found in the texture tab in your edit window.  &lt;br /&gt;
&amp;lt;1.5,1,0&amp;gt;&lt;br /&gt;
The first number is horizontal repeats, the second one is vertical, the third is not used, so will always be 0. Please make sure that the numbers are separated with a comma or they will not work.&lt;br /&gt;
&lt;br /&gt;
*Vector Offsets*&lt;br /&gt;
This set of numbers corresponds to the horizontal/vertical offsets also found in the texture tab in the edit window. For most builds you will keep this set at NULL_VECTOR, since you can’t leave these numbers as 0,0,0. If you do need to offset a texture for some reason, you would replace NULL_VECTOR, with &amp;lt;.5,0,0&amp;gt;, again the first number in the set corresponds to the horizontal offset, the second for vertical offset, the third is not to be used, therefore is left at 0.&lt;br /&gt;
&lt;br /&gt;
*Float Rotation*&lt;br /&gt;
If the texture must be rotated for some reason on the prim face, you will enter that number in the float rotation section. In the example above it’s set at 90.0. Because of the location of some of the walls they will need to be set at 90.0 anyway.&lt;br /&gt;
&lt;br /&gt;
*Vector Color*&lt;br /&gt;
If you would like to tint the prim face, you will use this section. For walls that aren’t tinted, leave the numbers at 1,1,1 because this is equivalent to white/clear. 0,0,0 is black. Below are the basic colours, and included with the Prototype package is a full list of colours in SL format.&lt;br /&gt;
&lt;br /&gt;
Red, Green Blue&lt;br /&gt;
Number may go between 0.1 to 0.9 for each of the three colors&lt;br /&gt;
white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
*Float Alpha*&lt;br /&gt;
This corresponds to the amount of transparency, 1.0 being no transparency, 0.0 is full transparency.&lt;br /&gt;
&lt;br /&gt;
NOTE: One final word on textures. Make sure that when you reference a texture ID key, you keep that texture in your inventory.  If you delete it from inventory, after a while it will be deleted from the asset inventory SL keeps and won’t work anymore.&lt;br /&gt;
&lt;br /&gt;
That’s it for the texture note-card. It’s a little confusing in the beginning, but you will get the hang of it in no time. A demo note-card has been provided for you to use in what ever way you want. Just remember when naming the card, to use the tex_ prefix.&lt;br /&gt;
&lt;br /&gt;
Scene Creation&lt;br /&gt;
Depending on what you plan on using in your Prototype building, your scene will vary. Some people make their own furniture and other items for their scenes for their own use or for sale. Others use free items they have gathered around SL which have copy/mod permissions to build their scenes. The Prototype is perfect for personal homes, clubs, inns and hotels, skyboxes, anywhere you need to rez furniture. The wonderful thing is that you have multiple scenes stored in the Prototype and can change whenever you want, instead of having to keep dragging things from inventory. Or for those of you who don’t want to use all their prims on a home and 5 rooms, why not have one room with five scenes and a nice shell. There are places to purchase copy/mod pose balls for your scenes too.  &lt;br /&gt;
&lt;br /&gt;
Tips&lt;br /&gt;
Some tips when building items for your scenes:&lt;br /&gt;
&lt;br /&gt;
    *&lt;br /&gt;
      Try to link as many prims together as they will load faster than ten smaller objects located around the box&lt;br /&gt;
    *&lt;br /&gt;
      When placing objects keep in mind the location of the door&lt;br /&gt;
    *&lt;br /&gt;
      When making an object that is an odd shape such as a torus, you may want to create a flat box prim below it, and link to that; it will save headaches later on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Packaging&lt;br /&gt;
When you decide to package the item for sale, make sure that you give copy rights to the next owner or they won’t be able to use it. It is also helpful to give full permissions on the texture. Ensure the name you give the object is user friendly, but also only contains letters, numbers _ or -. Don&#039;t forget to add the address script to each completed package.&lt;br /&gt;
&lt;br /&gt;
If you have any questions, please feel free to contact Revolution Perenti, and do join the .::Prototype::. Group you will receive updates of this manual and the scripts as they come out.  If you have any suggestions for this manual please feel free to let me know.&lt;br /&gt;
&lt;br /&gt;
Happy building!&lt;br /&gt;
&lt;br /&gt;
Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Holodeck Commands Quick Overview:&lt;br /&gt;
(.::Prototype 1.63::. should be replaced with what you called your root prim)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Commands Quick Guide&lt;br /&gt;
&lt;br /&gt;
// SCENE SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/1000 .::Prototype 1.63::.,CHANNEL,1001 (replace 1001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/1000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/1000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Prims Remaining on sim;&lt;br /&gt;
/1000 SIM&lt;br /&gt;
Prims Remaining on Parcel&lt;br /&gt;
/1000 PARCEL&lt;br /&gt;
Open or Close door;&lt;br /&gt;
/1000 DOOR&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/1000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/1000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/1000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/1000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/1000 EDIT&lt;br /&gt;
load weather type (this is future update and is reserved until beta testing is complete)&lt;br /&gt;
/1000 COMPATIBILITY Blizzard //replace Blizzard with weather type /snow, rain, blizzard, hail, storm, tornado&lt;br /&gt;
&lt;br /&gt;
// SHELL SYSTEM&lt;br /&gt;
changing channels;&lt;br /&gt;
/2000 .::Prototype 1.63::.,CHANNEL,2001 (replace 2001 with channel of your choice from 0 - 9999&lt;br /&gt;
enable debug mode;&lt;br /&gt;
/2000 .::Prototype 1.63::.,DEBUG,1 //1 = TRUE, 0= FALSE&lt;br /&gt;
change message type;&lt;br /&gt;
/2000 .::Prototype 1.63::.,MESSAGE,1 // 1 = enables llRegionSay(); 0 = llShout();&lt;br /&gt;
Save Current Scene;&lt;br /&gt;
/2000 SAVE&lt;br /&gt;
Forget positions;&lt;br /&gt;
/2000 RESET&lt;br /&gt;
reposition scene&lt;br /&gt;
/2000 POSITION&lt;br /&gt;
clear all objects in current scene;&lt;br /&gt;
/2000 CLEAR&lt;br /&gt;
remove label scripts&lt;br /&gt;
/2000 EDIT&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system and more advanced this is just the basic idear how to get a holodeck working.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:sort|Open Source Holodeck}}{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=28528</id>
		<title>Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=28528"/>
		<updated>2007-08-17T04:44:29Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
What is a Holodeck?&lt;br /&gt;
&lt;br /&gt;
A Holodeck stores Second Life scenes and lets you load them from a menu when ever you want. The old scene is cleared and the new one appears. Scenes can include any prim objects including furniture, pose balls and particle generators. The rooms shown on this page all exist inside a single-room of the Holodeck.&lt;br /&gt;
&lt;br /&gt;
The Scripts for the holodeck may look complex but once you done it correcly everything is very easy to setup and use and just build almost like you normally would within sl&lt;br /&gt;
&lt;br /&gt;
Creating the holodeck, the best way to start would be to create a 20x20x10 shell this would be your rezzing area for the holodeck&lt;br /&gt;
&lt;br /&gt;
once you done this you should have something similar to the picture below&lt;br /&gt;
&lt;br /&gt;
[[Image:holodeck shell.jpg]]&lt;br /&gt;
&lt;br /&gt;
ok next we create a small panel for the floor 0.500x0.500x0.100 and link this to your holodeck shell make sure this is the last object you link to the holodeck shell as this becomes the root prim&lt;br /&gt;
&lt;br /&gt;
see example below&lt;br /&gt;
&lt;br /&gt;
[[Image:floor panel.jpg]]&lt;br /&gt;
&lt;br /&gt;
The Scripts&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Holodeck Core.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// User Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//How long to listen for a menu response before shutting down the listener&lt;br /&gt;
float fListenTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//How often (in seconds) to check for change in position when moving&lt;br /&gt;
float fMovingRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
//How long to sit still before exiting active mode&lt;br /&gt;
float fStoppedTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//Minimum amount of time (in seconds) between movement updates&lt;br /&gt;
float fShoutRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
// label script name used for debug and PrototypeSay();&lt;br /&gt;
string label = &amp;quot;internal label&amp;quot;;&lt;br /&gt;
// Channel used by Prototype&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer MENU_CHANNEL;&lt;br /&gt;
integer MENU_HANDLE;&lt;br /&gt;
string PROTOTYPE_CREATOR;&lt;br /&gt;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
integer PROTOTYPE_RESET = -68195;&lt;br /&gt;
integer SHOW_MENU = -68194;&lt;br /&gt;
// Channel used by Prototype to talk to label scripts&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
// Feature Manager&lt;br /&gt;
integer PROTOTYPE_TEXTURE = TRUE;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Security Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
integer PROTOTYPE_ALLOW_IM = FALSE;&lt;br /&gt;
string  PROTOTYPE_EMAIL = &amp;quot;phoenixcms@hotmail.co.uk&amp;quot;;&lt;br /&gt;
string  PROTOTYPE_OWNER;&lt;br /&gt;
vector  Where;&lt;br /&gt;
string  Name;&lt;br /&gt;
string  SLURL;&lt;br /&gt;
integer X;&lt;br /&gt;
integer Y;&lt;br /&gt;
integer Z;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Menu System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Compatibility System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list objectSettings = [];&lt;br /&gt;
integer stride = 3;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
string COMPATIBILITY_NOTECARD = &amp;quot;compatibility&amp;quot;; //[objectname];&amp;lt;position&amp;gt;;&amp;lt;rotation&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DO NOT EDIT BELOW THIS LINE.... NO.. NOT EVEN THEN&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer PrototypeBaseMoving;&lt;br /&gt;
vector PrototypeLastPosition;&lt;br /&gt;
rotation PrototypeLastRotation;&lt;br /&gt;
integer iListenTimeout = 0;&lt;br /&gt;
&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//To avoid flooding the sim with a high rate of movements&lt;br /&gt;
//(and the resulting mass updates it will bring), we used&lt;br /&gt;
// a short throttle to limit ourselves&lt;br /&gt;
prototype_moved()&lt;br /&gt;
{&lt;br /&gt;
    llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ llGetPos(), llGetRot() ], &amp;quot;|&amp;quot;));&lt;br /&gt;
    llResetTime(); //Reset our throttle&lt;br /&gt;
    PrototypeLastPosition = llGetPos();&lt;br /&gt;
    PrototypeLastRotation = llGetRot();&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    iListenTimeout = llGetUnixTime() + llFloor(fListenTime);&lt;br /&gt;
    MENU_CHANNEL = llFloor(llFrand(-99999.0 - -100));&lt;br /&gt;
    MENU_HANDLE = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;www.sl-prototype.com: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
    llSetTimerEvent(fShoutRate);&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;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER || CHANGED_INVENTORY)&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry () &lt;br /&gt;
    {&lt;br /&gt;
        // Lets open our listen channel&lt;br /&gt;
        key_listen = llListen(PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;LISTEN ON CHANNEL &amp;quot; +(string)PROTOTYPE_CHANNEL);&lt;br /&gt;
        // Compatibility System Notecard&lt;br /&gt;
        llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        //Record our position&lt;br /&gt;
        PrototypeLastPosition = llGetPos();&lt;br /&gt;
        PrototypeLastRotation = llGetRot();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    dataserver(key queryId, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            objectSettings += llParseString2List(data, [&amp;quot;;&amp;quot;], []);&lt;br /&gt;
            iLine++;&lt;br /&gt;
            llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Done Reading Compatibility Notecard &amp;quot; + COMPATIBILITY_NOTECARD);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number==SHOW_MENU) {&lt;br /&gt;
            MENU1 = [];&lt;br /&gt;
            MENU2 = [];&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
                MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            Dialog(id, MENU1);&lt;br /&gt;
        }&lt;br /&gt;
        if (number==PROTOTYPE_RESET) {&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Forgetting positions...&amp;quot;);&lt;br /&gt;
        llPrototypeSay(&amp;quot;RESET&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
        }&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;
    list compatibility = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
    csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
    string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
    string command = llList2String( csv_commands,1 );&lt;br /&gt;
    PROTOTYPE_CREATOR = llGetCreator();&lt;br /&gt;
    //&lt;br /&gt;
    if ( command == llToLower(&amp;quot;CHANNEL&amp;quot;) || command == llToUpper(&amp;quot;CHANNEL&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        PROTOTYPE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        llListenRemove( key_listen );&lt;br /&gt;
        key_listen = llListen( PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)PROTOTYPE_CHANNEL );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == llToLower(&amp;quot;MESSAGE&amp;quot;) || command == llToUpper(&amp;quot;MESSAGE&amp;quot;))  &lt;br /&gt;
    {&lt;br /&gt;
        PROTOTYPE_MESSAGE = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        llOwnerSay ( &amp;quot;PROTOTYPE MESSAGE set to &amp;quot; + (string)PROTOTYPE_MESSAGE );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    // OPEN / CLOSE DOOR    &lt;br /&gt;
    if ( message == llToLower(&amp;quot;DOOR&amp;quot;) || message == llToUpper(&amp;quot;DOOR&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_SET, PROTOTYPE_DOOR, &amp;quot;&amp;quot;,NULL_KEY );&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Setting Door Permissions...&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    // SET COMPATIBILITY&lt;br /&gt;
    if(llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;) || llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        string object = llList2String(compatibility, 1);&lt;br /&gt;
        integer indexInSettings = llListFindList(objectSettings, [object]);&lt;br /&gt;
    if(indexInSettings &amp;gt;= 0)&lt;br /&gt;
    {&lt;br /&gt;
        vector pos = (vector)llList2String(objectSettings, indexInSettings + 1);&lt;br /&gt;
        rotation rot = (rotation)llList2String(objectSettings, indexInSettings + 2);&lt;br /&gt;
        llRezAtRoot(object, pos + llGetPos(), ZERO_VECTOR, rot, 0);&lt;br /&gt;
    }&lt;br /&gt;
    }&lt;br /&gt;
// LOAD MENU SYSTEM    &lt;br /&gt;
if (channel == MENU_CHANNEL)&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listener);&lt;br /&gt;
        vector vThisPos = llGetPos();&lt;br /&gt;
        rotation rThisRot = llGetRot();&lt;br /&gt;
    if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        Dialog(id, MENU2);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        Dialog(id, MENU1);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Loop through backwards (safety precaution in case of inventory change)&lt;br /&gt;
    if (DEBUG) llDebugSay(&amp;quot;Loading build pieces please wait...&amp;quot;);&lt;br /&gt;
        llRezAtRoot(message, llGetPos() + &amp;lt;0.00, 0.00, 0.30&amp;gt;, ZERO_VECTOR, llGetRot(), PROTOTYPE_CHANNEL);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // REPOSTION SCENE    &lt;br /&gt;
    if ( message == llToLower(&amp;quot;POSITION&amp;quot;) || message == llToUpper(&amp;quot;POSITION&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
    if (DEBUG) llDebugSay(&amp;quot;Positioning&amp;quot;);&lt;br /&gt;
        vector vThisPos = llGetPos();&lt;br /&gt;
        rotation rThisRot = llGetRot();&lt;br /&gt;
        llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    // CLEAR SCENE&lt;br /&gt;
    if ( message == llToLower(&amp;quot;CLEAR&amp;quot;) || message == llToUpper(&amp;quot;CLEAR&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        llPrototypeSay(&amp;quot;CLEAN&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if( message == llToLower(&amp;quot;HOLODECKDIE&amp;quot;) || message == llToUpper(&amp;quot;HOLODECKDIE&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
    if(PROTOTYPE_CREATOR) llDie();&lt;br /&gt;
    }&lt;br /&gt;
    // DISABLE PHANTOM AS WE ARE NOW DONE&lt;br /&gt;
    if ( message == llToLower(&amp;quot;NOPHANTOM&amp;quot;) || message == llToUpper(&amp;quot;NOPHANTOM&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        llPrototypeSay(&amp;quot;PHANTOM&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Disabled Phantom&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    moving_start() //StartPrototype&lt;br /&gt;
    {&lt;br /&gt;
        if( !PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
        PrototypeBaseMoving = TRUE;&lt;br /&gt;
        llSetTimerEvent(0.0); //Resets the timer if already running&lt;br /&gt;
        llSetTimerEvent(fMovingRate);&lt;br /&gt;
        prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer() &lt;br /&gt;
    {&lt;br /&gt;
        //Were we moving?&lt;br /&gt;
        if( PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
        //Did we change position/rotation?&lt;br /&gt;
        if( (llGetRot() != PrototypeLastRotation) || (llGetPos() != PrototypeLastPosition) )&lt;br /&gt;
        {&lt;br /&gt;
        if( llGetTime() &amp;gt; fShoutRate ) {&lt;br /&gt;
        prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
        }&lt;br /&gt;
        } else {&lt;br /&gt;
        // Have we been sitting long enough to consider ourselves stopped?&lt;br /&gt;
        if( llGetTime() &amp;gt; fStoppedTime )&lt;br /&gt;
        PrototypeBaseMoving = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Open listener?&lt;br /&gt;
        if( iListenTimeout != 0 )&lt;br /&gt;
        {&lt;br /&gt;
        //Past our close timeout?&lt;br /&gt;
        if( iListenTimeout &amp;lt;= llGetUnixTime() )&lt;br /&gt;
        {&lt;br /&gt;
        iListenTimeout = 0;&lt;br /&gt;
        llListenRemove(MENU_HANDLE);&lt;br /&gt;
        }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Stop the timer?&lt;br /&gt;
        if( (iListenTimeout == 0) &amp;amp;&amp;amp; ( !PrototypeBaseMoving ) )&lt;br /&gt;
        {&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Stopping Timer&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    } // END TIMER FUNCTION&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        PROTOTYPE_OWNER = llGetOwner();&lt;br /&gt;
        //Name = llGetRegionName();&lt;br /&gt;
        Name = llDumpList2String(llParseString2List(llGetRegionName(),[&amp;quot; &amp;quot;],[]),&amp;quot;_&amp;quot;);&lt;br /&gt;
        Where = llGetPos();&lt;br /&gt;
&lt;br /&gt;
        X = (integer)Where.x;&lt;br /&gt;
        Y = (integer)Where.y;&lt;br /&gt;
        Z = (integer)Where.z;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // I don&#039;t replace any spaces in Name with %20 and so forth.&lt;br /&gt;
&lt;br /&gt;
        SLURL = &amp;quot;http://slurl.com/secondlife/&amp;quot; + Name + &amp;quot;/&amp;quot; + (string)X + &amp;quot;/&amp;quot; + (string)Y + &amp;quot;/&amp;quot; + (string)Z + &amp;quot;/?title=&amp;quot; + Name;&lt;br /&gt;
&lt;br /&gt;
        llEmail(PROTOTYPE_EMAIL, llKey2Name(PROTOTYPE_OWNER), SLURL + &amp;quot;\nRegistered user =&amp;quot; + llKey2Name(PROTOTYPE_OWNER) + &amp;quot;Registered user key =&amp;quot; + PROTOTYPE_OWNER);&lt;br /&gt;
        if(PROTOTYPE_ALLOW_IM) {&lt;br /&gt;
        llInstantMessage(llGetCreator(), SLURL);&lt;br /&gt;
        }&lt;br /&gt;
        // Reset ourselves&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Texture Engine.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
string TEXTURE_NOTECARD;&lt;br /&gt;
string prefix = &amp;quot;tex_&amp;quot;;&lt;br /&gt;
key TextureQuery;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
integer DEBUG = FALSE; // debug channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
default {&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
       key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
       TEXTURE_NOTECARD = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
       if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + TEXTURE_NOTECARD);&lt;br /&gt;
       TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        list texture = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            TEXTURE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)TEXTURE_CHANNEL);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(llList2String(texture, 0) == &amp;quot;image&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            iLine = 0;&lt;br /&gt;
            TEXTURE_NOTECARD = llList2String(texture, 1);&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////        &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == TextureQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data != EOF &amp;amp;&amp;amp; prefix == &amp;quot;tex_&amp;quot;) {    &lt;br /&gt;
            &lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);&lt;br /&gt;
                llMessageLinked(LINK_SET,0,data,NULL_KEY);&lt;br /&gt;
&lt;br /&gt;
                // increment line count                 &lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                iLine++;&lt;br /&gt;
                TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Done reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Notecards&lt;br /&gt;
&lt;br /&gt;
*Clear* Notecard for default Clear Scene &lt;br /&gt;
(note the first line of texture notecards is object name so make sure you name all floor panels, roof and walls with unique name and edit the notecard as required add each object line to a new line as required.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Object_Name#2f78ee38-9aca-f8d1-5306-458beab181f9#&amp;lt;3.0,1.0,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
compatibility notecard leave this blank at current its planned as future feature to allow weather inside the holodeck and was the old rezz system from early beta but we left it here to be reused later on.&lt;br /&gt;
&lt;br /&gt;
Walls, Floor,Roof texture system&lt;br /&gt;
needs to be added to every object you wish to texture each object needs a unique name too for better control of textures&lt;br /&gt;
Texture System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list tex_vals;&lt;br /&gt;
string objname;&lt;br /&gt;
string tex_id;&lt;br /&gt;
vector repeats;&lt;br /&gt;
vector offsets;&lt;br /&gt;
float rot_val;&lt;br /&gt;
vector color;&lt;br /&gt;
float alpha;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector eul = &amp;lt;0.00, 0.00, 0.00&amp;gt;;&lt;br /&gt;
        eul *= DEG_TO_RAD;&lt;br /&gt;
        rotation quat = llEuler2Rot( eul );&lt;br /&gt;
        llSetRot( quat );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sent,integer num,string str,key id)&lt;br /&gt;
    {&lt;br /&gt;
        tex_vals = llParseString2List(str,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        objname = llList2String(tex_vals,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (objname == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            tex_id = llList2String(tex_vals,1);&lt;br /&gt;
            repeats = (vector)llList2String(tex_vals,2);&lt;br /&gt;
            offsets = (vector)llList2String(tex_vals,3);&lt;br /&gt;
            rot_val = ((float)llList2String(tex_vals,4)) * DEG_TO_RAD;&lt;br /&gt;
            color = (vector)llList2String(tex_vals,5);&lt;br /&gt;
            alpha = (float)llList2String(tex_vals,6);&lt;br /&gt;
            &lt;br /&gt;
            //texture change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_TEXTURE,0,tex_id,repeats,offsets,rot_val]);&lt;br /&gt;
            llSetPrimitiveParams([PRIM_COLOR,0,color,alpha]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Door Script to be places in one of the prims where you would like a door, this does a hollow effect to give the impression of the door and is controlled with link messages.&lt;br /&gt;
&lt;br /&gt;
Door System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message( integer sender, integer msg, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == PROTOTYPE_DOOR) {&lt;br /&gt;
            list open = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
            string open2 = llList2String(open, 3);&lt;br /&gt;
            if (llGetSubString(open2,0,2) != &amp;quot;0.0&amp;quot;)&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.0,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
            else&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.95,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
next we create a 0.500x0.500x0.100 box this is used for control panel&lt;br /&gt;
now link this to your holodeck shell linking the shell last becuase we want to keep the root prim intact i normally put this just to the side of the door but you can put this anywhere you like.&lt;br /&gt;
&lt;br /&gt;
Next right click select edit link parts and select the switch now we add the menu functions scripts.&lt;br /&gt;
&lt;br /&gt;
Menu System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list csv_commands;&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
integer SCENEMENU = -68194;&lt;br /&gt;
key agent;&lt;br /&gt;
key objectowner;&lt;br /&gt;
integer group;&lt;br /&gt;
// Set to TRUE to allow group members to use the dialog menu&lt;br /&gt;
// Set to FALSE to disallow group members from using the dialog menu&lt;br /&gt;
integer ingroup = 0;&lt;br /&gt;
integer DEBUG = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay(&amp;quot;Current chanel: &amp;quot;+(string)P_channel);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
    csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
    string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
    string command = llList2String( csv_commands,1 );&lt;br /&gt;
    if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    if(command == llToLower(&amp;quot;PERMS&amp;quot;) || message == llToUpper(&amp;quot;PERMS&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
    ingroup = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay ( &amp;quot;ingroup set to &amp;quot; + (string)ingroup);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
} // end listen();&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   &lt;br /&gt;
       group = llDetectedGroup(0); // Is the Agent in the objowners group?&lt;br /&gt;
       agent = llDetectedKey(0); // Agent&#039;s key&lt;br /&gt;
       objectowner = llGetOwner(); // objowners key&lt;br /&gt;
       // is the Agent = the owner OR is the agent in the owners group&lt;br /&gt;
       if ( (objectowner == agent) || ( group &amp;amp;&amp;amp; ingroup )  )  {&lt;br /&gt;
       llMessageLinked(LINK_SET,SCENEMENU,&amp;quot;&amp;quot;,agent); // id = AviID or llDetectedKey(0) = id or something&lt;br /&gt;
       }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup Scene Clear&lt;br /&gt;
next create a box and label this box *Clear*&lt;br /&gt;
and add the following script this will clear the scenes when you switch.&lt;br /&gt;
Clear Label Script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
float gap = 15.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(0, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now take this box to your Inventry.&lt;br /&gt;
&lt;br /&gt;
now create another box Called *Create* give this box full permissions and take into your inventry&lt;br /&gt;
now right click on your holodeck-&amp;gt;content and drag the *Clear* &amp;amp; *Create* boxes into the root prim.&lt;br /&gt;
wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
internal label script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Configurable Settings&lt;br /&gt;
float fTimerInterval = 0.25; //Time in seconds between movement &#039;ticks&#039;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192; //Channel used by Base Prim to talk to Component Prims;&lt;br /&gt;
// This must match in both scripts&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Runtime Variables (Dont need to change below here unless making a derivative)&lt;br /&gt;
vector SceneOffset;&lt;br /&gt;
rotation SceneRotation;&lt;br /&gt;
integer SceneMove;&lt;br /&gt;
vector SceneDestPosition;&lt;br /&gt;
rotation SceneDestRotation;&lt;br /&gt;
integer SceneSaved = FALSE;&lt;br /&gt;
integer PROTOTYPE_VERSION = TRUE; // TRUE = Production, FALSE = Basic / NOMOD, NOCOPY NO TRANS Demo Box&lt;br /&gt;
integer PROTOTYPE_MESSAGE = TRUE;&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string first_word(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the first word in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the whole string.&lt;br /&gt;
if(Token == &amp;quot;&amp;quot;) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
//Found it?&lt;br /&gt;
if( pos &amp;gt;= 1 )&lt;br /&gt;
return llGetSubString(In_String, 0, pos - 1);&lt;br /&gt;
else&lt;br /&gt;
return In_String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string other_words(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the other-than-first words in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the an empty string.&lt;br /&gt;
if( Token == &amp;quot;&amp;quot; ) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
//Found it?&lt;br /&gt;
if( pos &amp;gt;= 1 )&lt;br /&gt;
return llGetSubString(In_String, pos + 1, llStringLength(In_String));&lt;br /&gt;
else&lt;br /&gt;
return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
prototype_move()&lt;br /&gt;
{&lt;br /&gt;
integer i = 0;&lt;br /&gt;
vector SceneLastPosition = ZERO_VECTOR;&lt;br /&gt;
while( (i &amp;lt; 5) &amp;amp;&amp;amp; (llGetPos() != SceneDestPosition) )&lt;br /&gt;
{&lt;br /&gt;
list lParams = [];&lt;br /&gt;
&lt;br /&gt;
//If we&#039;re not there....&lt;br /&gt;
if( llGetPos() != SceneDestPosition )&lt;br /&gt;
{&lt;br /&gt;
//We may be stuck on the ground...&lt;br /&gt;
//Did we move at all compared to last loop?&lt;br /&gt;
if( llGetPos() == SceneLastPosition )&lt;br /&gt;
{&lt;br /&gt;
//Yep, stuck...move straight up 10m (attempt to dislodge)&lt;br /&gt;
lParams = [ PRIM_POSITION, llGetPos() + &amp;lt;0, 0, 10.0&amp;gt; ];&lt;br /&gt;
//llSetPos(llGetPos() + &amp;lt;0, 0, 10.0&amp;gt;);&lt;br /&gt;
} else {&lt;br /&gt;
//Record our spot for &#039;stuck&#039; detection&lt;br /&gt;
SceneLastPosition = llGetPos();&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Try to move to destination&lt;br /&gt;
integer iHops = llAbs(llCeil(llVecDist(llGetPos(), SceneDestPosition) / 10.0));&lt;br /&gt;
integer x;&lt;br /&gt;
for( x = 0; x &amp;lt; iHops; x++ ) {&lt;br /&gt;
lParams += [ PRIM_POSITION, SceneDestPosition ];&lt;br /&gt;
}&lt;br /&gt;
llSetPrimitiveParams(lParams);&lt;br /&gt;
//llSleep(0.1);&lt;br /&gt;
++i; // changed i++ too ++i credit goes to Simon Sugita for Speed Tweak :)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Set rotation&lt;br /&gt;
llSetRot(SceneDestRotation);&lt;br /&gt;
}&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;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
//Open up the listener&lt;br /&gt;
llListen(PROTOTYPE_SCRIPTS, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        //Set the channel to what&#039;s specified&lt;br /&gt;
    if( start_param != 0 )&lt;br /&gt;
    {&lt;br /&gt;
        PROTOTYPE_SCRIPTS = start_param;&lt;br /&gt;
        state reset_listeners;&lt;br /&gt;
    }&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;
string command = llToUpper(first_word(message, &amp;quot; &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if( command == &amp;quot;RECORD&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
SceneOffset = (llGetPos() - SceneVectorBase) / SceneRotationBase;&lt;br /&gt;
SceneRotation = llGetRot() / SceneRotationBase;&lt;br /&gt;
SceneSaved = TRUE;&lt;br /&gt;
llOwnerSay(&amp;quot;Recorded position.&amp;quot;);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;MOVE&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
// lets set objects phantom &lt;br /&gt;
llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
    &lt;br /&gt;
//Don&#039;t move if we&#039;ve not yet recorded a position&lt;br /&gt;
if( !SceneSaved ) return;&lt;br /&gt;
&lt;br /&gt;
//Also ignore commands from bases with a different owner than us&lt;br /&gt;
//(Anti-hacking measure)&lt;br /&gt;
if( llGetOwner() != llGetOwnerKey(id) ) return;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Calculate our destination position&lt;br /&gt;
message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
//Calculate our destination position&lt;br /&gt;
SceneDestPosition = (SceneOffset * SceneRotationBase) + SceneVectorBase;&lt;br /&gt;
SceneDestRotation = SceneRotation * SceneRotationBase;&lt;br /&gt;
&lt;br /&gt;
//Turn on our timer to perform the move?&lt;br /&gt;
if( !SceneMove )&lt;br /&gt;
{&lt;br /&gt;
llSetTimerEvent(fTimerInterval);&lt;br /&gt;
SceneMove = TRUE;&lt;br /&gt;
}&lt;br /&gt;
// lets set objects phantom &lt;br /&gt;
llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;PHANTOM&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
//We are done, turn phantom off&lt;br /&gt;
llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;DONE&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
//We are done, remove script&lt;br /&gt;
llRemoveInventory(llGetScriptName());&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;CLEAN&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
//Clean up&lt;br /&gt;
llDie();&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;FLUSH&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
llResetScript();&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
timer()&lt;br /&gt;
{&lt;br /&gt;
//Turn ourselves off&lt;br /&gt;
llSetTimerEvent(0.0);&lt;br /&gt;
&lt;br /&gt;
//Do we need to move?&lt;br /&gt;
if( SceneMove )&lt;br /&gt;
{&lt;br /&gt;
//Perform the move and clean up&lt;br /&gt;
prototype_move();&lt;br /&gt;
SceneMove = FALSE;&lt;br /&gt;
}&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state reset_listeners&lt;br /&gt;
{&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
state default;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Package Scripts)&lt;br /&gt;
address script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
float gap = 10.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
integer i;&lt;br /&gt;
integer iLine;&lt;br /&gt;
string item;&lt;br /&gt;
vector vThisPos;&lt;br /&gt;
rotation rThisRot;&lt;br /&gt;
&lt;br /&gt;
scene_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
       &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        scene_entry();&lt;br /&gt;
        vThisPos = llGetPos();&lt;br /&gt;
        rThisRot = llGetRot();&lt;br /&gt;
        iLine = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        for(i=0; i &amp;lt; iLine; i++)&lt;br /&gt;
        {&lt;br /&gt;
        item = llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
        llSleep (1.00);&lt;br /&gt;
        llRezObject(item, vThisPos + &amp;lt;0.00, 0.00, 1.00&amp;gt;, ZERO_VECTOR, rThisRot, 0);&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS, &amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
        if (DEBUG) llShout (DEBUG_CHANNEL, &amp;quot;Rezzing &amp;quot; + item);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(DEBUG_CHANNEL, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;POSITION&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Builders Docs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.::Prototype::. - Builders Manual&lt;br /&gt;
By Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
Welcome to the world of building with your Prototype System. Anyone wishing to build scenes for the Prototype needs to have a good understanding of building and texturing to succeed. Please read this manual through once fully and then as needed when you start building. This manual is divided into several sections:&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
Building scenes&lt;br /&gt;
Building Shells&lt;br /&gt;
Texture Card&lt;br /&gt;
Scene Creation&lt;br /&gt;
Tips&lt;br /&gt;
Packaging&lt;br /&gt;
&lt;br /&gt;
Introduction&lt;br /&gt;
The main thing to remember is any object you want to put in the Prototype scene/shell must be copy/mod at a minimum. The way the Prototype system works is by rezzing copies of an item from its inventory. These objects must be modified, adding a special script to make them work with the system scripts.&lt;br /&gt;
&lt;br /&gt;
There are two ways to build with the Prototype:&lt;br /&gt;
&lt;br /&gt;
   1. The linked scene&lt;br /&gt;
   2. The multi-item scene&lt;br /&gt;
&lt;br /&gt;
The linked scene is made from multiple objects and linked; the unlinked scene consists of a number or unlinked objects around the unit.&lt;br /&gt;
&lt;br /&gt;
A scene set will consist of the objects you create and a texture card. These will be explained in greater detail as we move along. The texture card must begin with tex_ or the system will not read them. Feel free to give your scenes a user friendly name, but only with letters, numbers, _ or – in the same name as the current scene we are building for.&lt;br /&gt;
&lt;br /&gt;
Building Scenes&lt;br /&gt;
&lt;br /&gt;
We will go into much more detail of how to build a scene later and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
   1. Create the objects you want in your scene and arrange them as you like&lt;br /&gt;
   2. Place a label script into each linked object or individual object you have set out in your scene &lt;br /&gt;
   3. Use /1000 SAVE to save the position and rotation of the current scene&lt;br /&gt;
   4. If you wish to modify the scene before repacking or move things around more, enter /1000 RESET and then follow step 3 again&lt;br /&gt;
   5. Next texture the walls, floor, and ceiling; set the repeats, etc. the way you want them&lt;br /&gt;
   6. Open the example tex_*Clear*, and go from prim to prim, and copy the info from the texture window to the notecard as explained above&lt;br /&gt;
   7. Name the suffix of the notecards something user friendly&lt;br /&gt;
   8. Right click on all the objects while holding the Ctrl key and choose edit; then take all the objects into your inventory&lt;br /&gt;
   9. Next, click on your control panel on the wall and press the *Create* button; this will prepare a package for your scene&lt;br /&gt;
  10. Now we will want to name the scene: right click this box, click edit, and fill in something friendly for your scene name and description&lt;br /&gt;
  11. Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts &lt;br /&gt;
  12. Drag the internal address script to the content tab of your inventory and drag the object from our scene that we took into our inventory earlier, copying this to the content tab; we now have all the requirements for loading scenes &lt;br /&gt;
  13. Right click on the Prototype floor panel, choose edit, check edit linked parts, then select the red area of the floor panel (inside the red field) and press Contents tab and drag the object package, and tex_package in there&lt;br /&gt;
  14. Type /1000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
  15. Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
Building Shells&lt;br /&gt;
We will go into much more detail of how to build a scene later, and how to use the cards, but I will outline the basic procedure here:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
   1. Create the objects you want as your Shell and arrange them as you like&lt;br /&gt;
   2. Place a external label script into each linked object or individual object you have set out as your prototype shell &lt;br /&gt;
   3. Use /2000 SAVE to save the position and rotation of the current shell; if you wish to modify the shell before repacking or move things around more enter /2000 RESET and then follow step 3 again&lt;br /&gt;
   4. Right click on all the object while holding the Ctrl key, edit and take all the objects into your inventory&lt;br /&gt;
   5. Next click on your control panel on the wall and press the *Create* button, preparing a package for your shell&lt;br /&gt;
   6. Now we will want to name the shell package: right click this box, edit it, and fill in something friendly for your shell name and description&lt;br /&gt;
   7. Finally, add an address script to this object by right clicking on the package box and going to the content tab (or just press content tab if you&#039;re still in edit mode,) then browse your inventory for our product .::Skidz Partz - Prototype::. and look for a box called address scripts; drag this to the floor, right click it and choose Open, click Copy to Inventory giving you a folder called package scripts&lt;br /&gt;
   8. Right click on the Prototype floor panel, go into edit, check edit link parts, then select the blue area of the floor panel (inside the blue field)&lt;br /&gt;
   9. Next go to the Content tab and drag the object package into it&lt;br /&gt;
  10. Type /2000 RESET and now wait for the menu to update with your scene (this can take up to one minute depending on how many scenes you have saved)&lt;br /&gt;
  11. Your new scene should now be in the menu&lt;br /&gt;
&lt;br /&gt;
Texture Card&lt;br /&gt;
The Prototype consists of eight wall, four ceiling, and four floor prims. The texture card has one line for each of these inner prim faces. The prims are named for their direction on the SL compass, and the name of each face on the texture card corresponds to these names. The card must begin with tex_xxx where xxx is the name of the scene, which must be the same name as will be given to the object card.&lt;br /&gt;
&lt;br /&gt;
Each line of the texture card has the following information:&lt;br /&gt;
&lt;br /&gt;
wall section#texture key#vector repeats#vector offsets#float rotation#vector color#float alpha&lt;br /&gt;
&lt;br /&gt;
Once it’s completed, it may look like the following:&lt;br /&gt;
&lt;br /&gt;
ene_wall#2eabe96c-2540-e1fa-ce7f-9030c3d958df#&amp;lt;1.5,1,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&lt;br /&gt;
Each of the items in the texture card must be separated by the symbol #&lt;br /&gt;
&lt;br /&gt;
*Wall Section*&lt;br /&gt;
The wall section name corresponds to the name given to each prim in the Prototype. Use the edit linked parts and then point to the prim, make a note of the wall name. Then go to the card and find the same line containing that wall name.&lt;br /&gt;
&lt;br /&gt;
*Texture Key*&lt;br /&gt;
This is the ID of the texture you are using. This texture must have full permissions. Right click on the prim, select texture, locate it in the list, then right click and copy UUID. Next paste this ID into the note card exactly between the ##.&lt;br /&gt;
&lt;br /&gt;
*Vector Repeats*&lt;br /&gt;
These numbers correspond to the horizontal/vertical repeats found in the texture tab in your edit window.  &lt;br /&gt;
&amp;lt;1.5,1,0&amp;gt;&lt;br /&gt;
The first number is horizontal repeats, the second one is vertical, the third is not used, so will always be 0. Please make sure that the numbers are separated with a comma or they will not work.&lt;br /&gt;
&lt;br /&gt;
*Vector Offsets*&lt;br /&gt;
This set of numbers corresponds to the horizontal/vertical offsets also found in the texture tab in the edit window. For most builds you will keep this set at NULL_VECTOR, since you can’t leave these numbers as 0,0,0. If you do need to offset a texture for some reason, you would replace NULL_VECTOR, with &amp;lt;.5,0,0&amp;gt;, again the first number in the set corresponds to the horizontal offset, the second for vertical offset, the third is not to be used, therefore is left at 0.&lt;br /&gt;
&lt;br /&gt;
*Float Rotation*&lt;br /&gt;
If the texture must be rotated for some reason on the prim face, you will enter that number in the float rotation section. In the example above it’s set at 90.0. Because of the location of some of the walls they will need to be set at 90.0 anyway.&lt;br /&gt;
&lt;br /&gt;
*Vector Color*&lt;br /&gt;
If you would like to tint the prim face, you will use this section. For walls that aren’t tinted, leave the numbers at 1,1,1 because this is equivalent to white/clear. 0,0,0 is black. Below are the basic colours, and included with the Prototype package is a full list of colours in SL format.&lt;br /&gt;
&lt;br /&gt;
Red, Green Blue&lt;br /&gt;
Number may go between 0.1 to 0.9 for each of the three colors&lt;br /&gt;
white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
*Float Alpha*&lt;br /&gt;
This corresponds to the amount of transparency, 1.0 being no transparency, 0.0 is full transparency.&lt;br /&gt;
&lt;br /&gt;
NOTE: One final word on textures. Make sure that when you reference a texture ID key, you keep that texture in your inventory.  If you delete it from inventory, after a while it will be deleted from the asset inventory SL keeps and won’t work anymore.&lt;br /&gt;
&lt;br /&gt;
That’s it for the texture note-card. It’s a little confusing in the beginning, but you will get the hang of it in no time. A demo note-card has been provided for you to use in what ever way you want. Just remember when naming the card, to use the tex_ prefix.&lt;br /&gt;
&lt;br /&gt;
Scene Creation&lt;br /&gt;
Depending on what you plan on using in your Prototype building, your scene will vary. Some people make their own furniture and other items for their scenes for their own use or for sale. Others use free items they have gathered around SL which have copy/mod permissions to build their scenes. The Prototype is perfect for personal homes, clubs, inns and hotels, skyboxes, anywhere you need to rez furniture. The wonderful thing is that you have multiple scenes stored in the Prototype and can change whenever you want, instead of having to keep dragging things from inventory. Or for those of you who don’t want to use all their prims on a home and 5 rooms, why not have one room with five scenes and a nice shell. There are places to purchase copy/mod pose balls for your scenes too.  &lt;br /&gt;
&lt;br /&gt;
Tips&lt;br /&gt;
Some tips when building items for your scenes:&lt;br /&gt;
&lt;br /&gt;
    *&lt;br /&gt;
      Try to link as many prims together as they will load faster than ten smaller objects located around the box&lt;br /&gt;
    *&lt;br /&gt;
      When placing objects keep in mind the location of the door&lt;br /&gt;
    *&lt;br /&gt;
      When making an object that is an odd shape such as a torus, you may want to create a flat box prim below it, and link to that; it will save headaches later on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Packaging&lt;br /&gt;
When you decide to package the item for sale, make sure that you give copy rights to the next owner or they won’t be able to use it. It is also helpful to give full permissions on the texture. Ensure the name you give the object is user friendly, but also only contains letters, numbers _ or -. Don&#039;t forget to add the address script to each completed package.&lt;br /&gt;
&lt;br /&gt;
If you have any questions, please feel free to contact Revolution Perenti, and do join the .::Prototype::. Group you will receive updates of this manual and the scripts as they come out.  If you have any suggestions for this manual please feel free to let me know.&lt;br /&gt;
&lt;br /&gt;
Happy building!&lt;br /&gt;
&lt;br /&gt;
Revolution Perenti&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system and more advanced this is just the basic idear how to get a holodeck working.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:sort|Open Source Holodeck}}{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=28527</id>
		<title>Holodeck</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Holodeck&amp;diff=28527"/>
		<updated>2007-08-17T04:42:29Z</updated>

		<summary type="html">&lt;p&gt;Revolution Perenti: New page: {{LSL Header}}  What is a Holodeck?  A Holodeck stores Second Life scenes and lets you load them from a menu when ever you want. The old scene is cleared and the new one appears. Scenes ca...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
What is a Holodeck?&lt;br /&gt;
&lt;br /&gt;
A Holodeck stores Second Life scenes and lets you load them from a menu when ever you want. The old scene is cleared and the new one appears. Scenes can include any prim objects including furniture, pose balls and particle generators. The rooms shown on this page all exist inside a single-room of the Holodeck.&lt;br /&gt;
&lt;br /&gt;
The Scripts for the holodeck may look complex but once you done it correcly everything is very easy to setup and use and just build almost like you normally would within sl&lt;br /&gt;
&lt;br /&gt;
Creating the holodeck, the best way to start would be to create a 20x20x10 shell this would be your rezzing area for the holodeck&lt;br /&gt;
&lt;br /&gt;
once you done this you should have something similar to the picture below&lt;br /&gt;
&lt;br /&gt;
[[Image:holodeck shell.jpg]]&lt;br /&gt;
&lt;br /&gt;
ok next we create a small panel for the floor 0.500x0.500x0.100 and link this to your holodeck shell make sure this is the last object you link to the holodeck shell as this becomes the root prim&lt;br /&gt;
&lt;br /&gt;
see example below&lt;br /&gt;
&lt;br /&gt;
[[Image:floor panel.jpg]]&lt;br /&gt;
&lt;br /&gt;
The Scripts&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Holodeck Core.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
// User Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//How long to listen for a menu response before shutting down the listener&lt;br /&gt;
float fListenTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//How often (in seconds) to check for change in position when moving&lt;br /&gt;
float fMovingRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
//How long to sit still before exiting active mode&lt;br /&gt;
float fStoppedTime = 30.0;&lt;br /&gt;
&lt;br /&gt;
//Minimum amount of time (in seconds) between movement updates&lt;br /&gt;
float fShoutRate = 0.25;&lt;br /&gt;
&lt;br /&gt;
// label script name used for debug and PrototypeSay();&lt;br /&gt;
string label = &amp;quot;internal label&amp;quot;;&lt;br /&gt;
// Channel used by Prototype&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer MENU_CHANNEL;&lt;br /&gt;
integer MENU_HANDLE;&lt;br /&gt;
string PROTOTYPE_CREATOR;&lt;br /&gt;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
integer PROTOTYPE_RESET = -68195;&lt;br /&gt;
integer SHOW_MENU = -68194;&lt;br /&gt;
// Channel used by Prototype to talk to label scripts&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
// Feature Manager&lt;br /&gt;
integer PROTOTYPE_TEXTURE = TRUE;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Security Variables&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
integer PROTOTYPE_ALLOW_IM = FALSE;&lt;br /&gt;
string  PROTOTYPE_EMAIL = &amp;quot;phoenixcms@hotmail.co.uk&amp;quot;;&lt;br /&gt;
string  PROTOTYPE_OWNER;&lt;br /&gt;
vector  Where;&lt;br /&gt;
string  Name;&lt;br /&gt;
string  SLURL;&lt;br /&gt;
integer X;&lt;br /&gt;
integer Y;&lt;br /&gt;
integer Z;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Menu System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list MENU1 = [];&lt;br /&gt;
list MENU2 = [];&lt;br /&gt;
list BUFFER = [];&lt;br /&gt;
key id;&lt;br /&gt;
integer listener;&lt;br /&gt;
integer i;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Compatibility System Variables&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////// &lt;br /&gt;
list objectSettings = [];&lt;br /&gt;
integer stride = 3;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
string COMPATIBILITY_NOTECARD = &amp;quot;compatibility&amp;quot;; //[objectname];&amp;lt;position&amp;gt;;&amp;lt;rotation&amp;gt;&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DO NOT EDIT BELOW THIS LINE.... NO.. NOT EVEN THEN&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer PrototypeBaseMoving;&lt;br /&gt;
vector PrototypeLastPosition;&lt;br /&gt;
rotation PrototypeLastRotation;&lt;br /&gt;
integer iListenTimeout = 0;&lt;br /&gt;
&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//To avoid flooding the sim with a high rate of movements&lt;br /&gt;
//(and the resulting mass updates it will bring), we used&lt;br /&gt;
// a short throttle to limit ourselves&lt;br /&gt;
prototype_moved()&lt;br /&gt;
{&lt;br /&gt;
    llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ llGetPos(), llGetRot() ], &amp;quot;|&amp;quot;));&lt;br /&gt;
    llResetTime(); //Reset our throttle&lt;br /&gt;
    PrototypeLastPosition = llGetPos();&lt;br /&gt;
    PrototypeLastRotation = llGetRot();&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Dialog(key id, list menu)&lt;br /&gt;
{&lt;br /&gt;
    iListenTimeout = llGetUnixTime() + llFloor(fListenTime);&lt;br /&gt;
    MENU_CHANNEL = llFloor(llFrand(-99999.0 - -100));&lt;br /&gt;
    MENU_HANDLE = llListen(MENU_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(id, &amp;quot;www.sl-prototype.com: &amp;quot;, menu, MENU_CHANNEL);&lt;br /&gt;
    llSetTimerEvent(fShoutRate);&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;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER || CHANGED_INVENTORY)&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    state_entry () &lt;br /&gt;
    {&lt;br /&gt;
        // Lets open our listen channel&lt;br /&gt;
        key_listen = llListen(PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG) llDebugSay(&amp;quot;LISTEN ON CHANNEL &amp;quot; +(string)PROTOTYPE_CHANNEL);&lt;br /&gt;
        // Compatibility System Notecard&lt;br /&gt;
        llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        //Record our position&lt;br /&gt;
        PrototypeLastPosition = llGetPos();&lt;br /&gt;
        PrototypeLastRotation = llGetRot();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    dataserver(key queryId, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            objectSettings += llParseString2List(data, [&amp;quot;;&amp;quot;], []);&lt;br /&gt;
            iLine++;&lt;br /&gt;
            llGetNotecardLine(COMPATIBILITY_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Done Reading Compatibility Notecard &amp;quot; + COMPATIBILITY_NOTECARD);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number==SHOW_MENU) {&lt;br /&gt;
            MENU1 = [];&lt;br /&gt;
            MENU2 = [];&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_OBJECT) &amp;lt;= 11)&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                for (i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
                MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                for (i = 10; i &amp;lt; llGetInventoryNumber(INVENTORY_OBJECT); i++)&lt;br /&gt;
                MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];&lt;br /&gt;
                MENU1 += &amp;quot;&amp;gt;&amp;gt;&amp;quot;;&lt;br /&gt;
                MENU2 += &amp;quot;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            Dialog(id, MENU1);&lt;br /&gt;
        }&lt;br /&gt;
        if (number==PROTOTYPE_RESET) {&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Forgetting positions...&amp;quot;);&lt;br /&gt;
        llPrototypeSay(&amp;quot;RESET&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
        }&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;
    list compatibility = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
    csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
    string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
    string command = llList2String( csv_commands,1 );&lt;br /&gt;
    PROTOTYPE_CREATOR = llGetCreator();&lt;br /&gt;
    //&lt;br /&gt;
    if ( command == llToLower(&amp;quot;CHANNEL&amp;quot;) || command == llToUpper(&amp;quot;CHANNEL&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        PROTOTYPE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        llListenRemove( key_listen );&lt;br /&gt;
        key_listen = llListen( PROTOTYPE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)PROTOTYPE_CHANNEL );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == llToLower(&amp;quot;MESSAGE&amp;quot;) || command == llToUpper(&amp;quot;MESSAGE&amp;quot;))  &lt;br /&gt;
    {&lt;br /&gt;
        PROTOTYPE_MESSAGE = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        llOwnerSay ( &amp;quot;PROTOTYPE MESSAGE set to &amp;quot; + (string)PROTOTYPE_MESSAGE );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    // OPEN / CLOSE DOOR    &lt;br /&gt;
    if ( message == llToLower(&amp;quot;DOOR&amp;quot;) || message == llToUpper(&amp;quot;DOOR&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_SET, PROTOTYPE_DOOR, &amp;quot;&amp;quot;,NULL_KEY );&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Setting Door Permissions...&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    // SET COMPATIBILITY&lt;br /&gt;
    if(llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;) || llList2String(compatibility, 0) == llToLower(&amp;quot;COMPATIBILITY&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        string object = llList2String(compatibility, 1);&lt;br /&gt;
        integer indexInSettings = llListFindList(objectSettings, [object]);&lt;br /&gt;
    if(indexInSettings &amp;gt;= 0)&lt;br /&gt;
    {&lt;br /&gt;
        vector pos = (vector)llList2String(objectSettings, indexInSettings + 1);&lt;br /&gt;
        rotation rot = (rotation)llList2String(objectSettings, indexInSettings + 2);&lt;br /&gt;
        llRezAtRoot(object, pos + llGetPos(), ZERO_VECTOR, rot, 0);&lt;br /&gt;
    }&lt;br /&gt;
    }&lt;br /&gt;
// LOAD MENU SYSTEM    &lt;br /&gt;
if (channel == MENU_CHANNEL)&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listener);&lt;br /&gt;
        vector vThisPos = llGetPos();&lt;br /&gt;
        rotation rThisRot = llGetRot();&lt;br /&gt;
    if (message == &amp;quot;&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        Dialog(id, MENU2);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;lt;&amp;lt;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        Dialog(id, MENU1);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //Loop through backwards (safety precaution in case of inventory change)&lt;br /&gt;
    if (DEBUG) llDebugSay(&amp;quot;Loading build pieces please wait...&amp;quot;);&lt;br /&gt;
        llRezAtRoot(message, llGetPos() + &amp;lt;0.00, 0.00, 0.30&amp;gt;, ZERO_VECTOR, llGetRot(), PROTOTYPE_CHANNEL);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // REPOSTION SCENE    &lt;br /&gt;
    if ( message == llToLower(&amp;quot;POSITION&amp;quot;) || message == llToUpper(&amp;quot;POSITION&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
    if (DEBUG) llDebugSay(&amp;quot;Positioning&amp;quot;);&lt;br /&gt;
        vector vThisPos = llGetPos();&lt;br /&gt;
        rotation rThisRot = llGetRot();&lt;br /&gt;
        llPrototypeSay(&amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    // CLEAR SCENE&lt;br /&gt;
    if ( message == llToLower(&amp;quot;CLEAR&amp;quot;) || message == llToUpper(&amp;quot;CLEAR&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        llPrototypeSay(&amp;quot;CLEAN&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if( message == llToLower(&amp;quot;HOLODECKDIE&amp;quot;) || message == llToUpper(&amp;quot;HOLODECKDIE&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
    if(PROTOTYPE_CREATOR) llDie();&lt;br /&gt;
    }&lt;br /&gt;
    // DISABLE PHANTOM AS WE ARE NOW DONE&lt;br /&gt;
    if ( message == llToLower(&amp;quot;NOPHANTOM&amp;quot;) || message == llToUpper(&amp;quot;NOPHANTOM&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        llPrototypeSay(&amp;quot;PHANTOM&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Disabled Phantom&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    moving_start() //StartPrototype&lt;br /&gt;
    {&lt;br /&gt;
        if( !PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
        PrototypeBaseMoving = TRUE;&lt;br /&gt;
        llSetTimerEvent(0.0); //Resets the timer if already running&lt;br /&gt;
        llSetTimerEvent(fMovingRate);&lt;br /&gt;
        prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    timer() &lt;br /&gt;
    {&lt;br /&gt;
        //Were we moving?&lt;br /&gt;
        if( PrototypeBaseMoving )&lt;br /&gt;
        {&lt;br /&gt;
        //Did we change position/rotation?&lt;br /&gt;
        if( (llGetRot() != PrototypeLastRotation) || (llGetPos() != PrototypeLastPosition) )&lt;br /&gt;
        {&lt;br /&gt;
        if( llGetTime() &amp;gt; fShoutRate ) {&lt;br /&gt;
        prototype_moved();&lt;br /&gt;
        }&lt;br /&gt;
        }&lt;br /&gt;
        } else {&lt;br /&gt;
        // Have we been sitting long enough to consider ourselves stopped?&lt;br /&gt;
        if( llGetTime() &amp;gt; fStoppedTime )&lt;br /&gt;
        PrototypeBaseMoving = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Open listener?&lt;br /&gt;
        if( iListenTimeout != 0 )&lt;br /&gt;
        {&lt;br /&gt;
        //Past our close timeout?&lt;br /&gt;
        if( iListenTimeout &amp;lt;= llGetUnixTime() )&lt;br /&gt;
        {&lt;br /&gt;
        iListenTimeout = 0;&lt;br /&gt;
        llListenRemove(MENU_HANDLE);&lt;br /&gt;
        }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Stop the timer?&lt;br /&gt;
        if( (iListenTimeout == 0) &amp;amp;&amp;amp; ( !PrototypeBaseMoving ) )&lt;br /&gt;
        {&lt;br /&gt;
        if (DEBUG) llDebugSay(&amp;quot;Stopping Timer&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    } // END TIMER FUNCTION&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        PROTOTYPE_OWNER = llGetOwner();&lt;br /&gt;
        //Name = llGetRegionName();&lt;br /&gt;
        Name = llDumpList2String(llParseString2List(llGetRegionName(),[&amp;quot; &amp;quot;],[]),&amp;quot;_&amp;quot;);&lt;br /&gt;
        Where = llGetPos();&lt;br /&gt;
&lt;br /&gt;
        X = (integer)Where.x;&lt;br /&gt;
        Y = (integer)Where.y;&lt;br /&gt;
        Z = (integer)Where.z;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // I don&#039;t replace any spaces in Name with %20 and so forth.&lt;br /&gt;
&lt;br /&gt;
        SLURL = &amp;quot;http://slurl.com/secondlife/&amp;quot; + Name + &amp;quot;/&amp;quot; + (string)X + &amp;quot;/&amp;quot; + (string)Y + &amp;quot;/&amp;quot; + (string)Z + &amp;quot;/?title=&amp;quot; + Name;&lt;br /&gt;
&lt;br /&gt;
        llEmail(PROTOTYPE_EMAIL, llKey2Name(PROTOTYPE_OWNER), SLURL + &amp;quot;\nRegistered user =&amp;quot; + llKey2Name(PROTOTYPE_OWNER) + &amp;quot;Registered user key =&amp;quot; + PROTOTYPE_OWNER);&lt;br /&gt;
        if(PROTOTYPE_ALLOW_IM) {&lt;br /&gt;
        llInstantMessage(llGetCreator(), SLURL);&lt;br /&gt;
        }&lt;br /&gt;
        // Reset ourselves&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Texture Engine.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
string TEXTURE_NOTECARD;&lt;br /&gt;
string prefix = &amp;quot;tex_&amp;quot;;&lt;br /&gt;
key TextureQuery;&lt;br /&gt;
list csv_commands ;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
integer DEBUG = FALSE; // debug channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
&lt;br /&gt;
llDebugSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG) llSay(DEBUG_CHANNEL,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llOwnerSay(message);&lt;br /&gt;
}&lt;br /&gt;
default {&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
       key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
       TEXTURE_NOTECARD = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
       if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + TEXTURE_NOTECARD);&lt;br /&gt;
       TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
        string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
        string command = llList2String( csv_commands,1 );&lt;br /&gt;
        list texture = llParseString2List(message, [&amp;quot; &amp;quot;], [&amp;quot;&amp;quot;]);&lt;br /&gt;
        if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            TEXTURE_CHANNEL = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen(TEXTURE_CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)TEXTURE_CHANNEL);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if(llList2String(texture, 0) == &amp;quot;image&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            iLine = 0;&lt;br /&gt;
            TEXTURE_NOTECARD = llList2String(texture, 1);&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////        &lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == TextureQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data != EOF &amp;amp;&amp;amp; prefix == &amp;quot;tex_&amp;quot;) {    &lt;br /&gt;
            &lt;br /&gt;
                if(DEBUG) llDebugSay(&amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);&lt;br /&gt;
                llMessageLinked(LINK_SET,0,data,NULL_KEY);&lt;br /&gt;
&lt;br /&gt;
                // increment line count                 &lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                iLine++;&lt;br /&gt;
                TextureQuery = llGetNotecardLine(prefix + TEXTURE_NOTECARD, iLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
            if(DEBUG) llDebugSay(&amp;quot;Done reading Texture notecard &amp;quot; + prefix + TEXTURE_NOTECARD);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example Notecards&lt;br /&gt;
&lt;br /&gt;
*Clear* Notecard for default Clear Scene &lt;br /&gt;
(note the first line of texture notecards is object name so make sure you name all floor panels, roof and walls with unique name and edit the notecard as required add each object line to a new line as required.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Object_Name#2f78ee38-9aca-f8d1-5306-458beab181f9#&amp;lt;3.0,1.0,0&amp;gt;#NULL_VECTOR#90.00#&amp;lt;1,1,1&amp;gt;#1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
compatibility notecard leave this blank at current its planned as future feature to allow weather inside the holodeck and was the old rezz system from early beta but we left it here to be reused later on.&lt;br /&gt;
&lt;br /&gt;
Walls, Floor,Roof texture system&lt;br /&gt;
needs to be added to every object you wish to texture each object needs a unique name too for better control of textures&lt;br /&gt;
Texture System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list tex_vals;&lt;br /&gt;
string objname;&lt;br /&gt;
string tex_id;&lt;br /&gt;
vector repeats;&lt;br /&gt;
vector offsets;&lt;br /&gt;
float rot_val;&lt;br /&gt;
vector color;&lt;br /&gt;
float alpha;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector eul = &amp;lt;0.00, 0.00, 0.00&amp;gt;;&lt;br /&gt;
        eul *= DEG_TO_RAD;&lt;br /&gt;
        rotation quat = llEuler2Rot( eul );&lt;br /&gt;
        llSetRot( quat );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sent,integer num,string str,key id)&lt;br /&gt;
    {&lt;br /&gt;
        tex_vals = llParseString2List(str,[&amp;quot;#&amp;quot;],[]);&lt;br /&gt;
        objname = llList2String(tex_vals,0);&lt;br /&gt;
        string self = llGetObjectName();&lt;br /&gt;
        if (objname == self)&lt;br /&gt;
        {&lt;br /&gt;
            //list conversions&lt;br /&gt;
            tex_id = llList2String(tex_vals,1);&lt;br /&gt;
            repeats = (vector)llList2String(tex_vals,2);&lt;br /&gt;
            offsets = (vector)llList2String(tex_vals,3);&lt;br /&gt;
            rot_val = ((float)llList2String(tex_vals,4)) * DEG_TO_RAD;&lt;br /&gt;
            color = (vector)llList2String(tex_vals,5);&lt;br /&gt;
            alpha = (float)llList2String(tex_vals,6);&lt;br /&gt;
            &lt;br /&gt;
            //texture change&lt;br /&gt;
            llSetPrimitiveParams([PRIM_TEXTURE,0,tex_id,repeats,offsets,rot_val]);&lt;br /&gt;
            llSetPrimitiveParams([PRIM_COLOR,0,color,alpha]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Door Script to be places in one of the prims where you would like a door, this does a hollow effect to give the impression of the door and is controlled with link messages.&lt;br /&gt;
&lt;br /&gt;
Door System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
integer PROTOTYPE_DOOR = -68196;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message( integer sender, integer msg, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == PROTOTYPE_DOOR) {&lt;br /&gt;
            list open = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
            string open2 = llList2String(open, 3);&lt;br /&gt;
            if (llGetSubString(open2,0,2) != &amp;quot;0.0&amp;quot;)&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.0,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
            else&lt;br /&gt;
                llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX,0,&amp;lt;0.0,1.0,0.0&amp;gt;,0.95,ZERO_VECTOR,&amp;lt;1.0,1.0,0.0&amp;gt;,ZERO_VECTOR]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
next we create a 0.500x0.500x0.100 box this is used for control panel&lt;br /&gt;
now link this to your holodeck shell linking the shell last becuase we want to keep the root prim intact i normally put this just to the side of the door but you can put this anywhere you like.&lt;br /&gt;
&lt;br /&gt;
Next right click select edit link parts and select the switch now we add the menu functions scripts.&lt;br /&gt;
&lt;br /&gt;
Menu System.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// .::Prototype::.&lt;br /&gt;
//&lt;br /&gt;
// An Open Source holodeck for Second Life by Revolution Perenti &amp;amp; Skidz Partz&lt;br /&gt;
//&lt;br /&gt;
// This file is free software; you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with this program; 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;
list csv_commands;&lt;br /&gt;
integer P_channel = 1000; // channel&lt;br /&gt;
integer key_listen;  // listen key&lt;br /&gt;
integer SCENEMENU = -68194;&lt;br /&gt;
key agent;&lt;br /&gt;
key objectowner;&lt;br /&gt;
integer group;&lt;br /&gt;
// Set to TRUE to allow group members to use the dialog menu&lt;br /&gt;
// Set to FALSE to disallow group members from using the dialog menu&lt;br /&gt;
integer ingroup = 0;&lt;br /&gt;
integer DEBUG = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        key_listen = llListen(P_channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay(&amp;quot;Current chanel: &amp;quot;+(string)P_channel);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message) &lt;br /&gt;
    {&lt;br /&gt;
    csv_commands = llCSV2List( llToLower ( message ));&lt;br /&gt;
    string said_name = llList2String( csv_commands, 0);        &lt;br /&gt;
    string command = llList2String( csv_commands,1 );&lt;br /&gt;
    if ( command == &amp;quot;channel&amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            P_channel = llList2Integer ( csv_commands,2 );&lt;br /&gt;
            llListenRemove( key_listen );&lt;br /&gt;
            key_listen = llListen( P_channel, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            if(DEBUG == 1) llOwnerSay ( &amp;quot;Listen Channel set to &amp;quot; + (string)P_channel );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    if(command == llToLower(&amp;quot;PERMS&amp;quot;) || message == llToUpper(&amp;quot;PERMS&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
    ingroup = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay ( &amp;quot;ingroup set to &amp;quot; + (string)ingroup);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == llToLower(&amp;quot;DEBUG&amp;quot;) || command == llToUpper(&amp;quot;DEBUG&amp;quot;)) &lt;br /&gt;
    {&lt;br /&gt;
        DEBUG = llList2Integer ( csv_commands,2 );&lt;br /&gt;
        if(DEBUG == 1) llOwnerSay ( &amp;quot;DEBUG set to &amp;quot; + (string)DEBUG );&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
} // end listen();&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   &lt;br /&gt;
       group = llDetectedGroup(0); // Is the Agent in the objowners group?&lt;br /&gt;
       agent = llDetectedKey(0); // Agent&#039;s key&lt;br /&gt;
       objectowner = llGetOwner(); // objowners key&lt;br /&gt;
       // is the Agent = the owner OR is the agent in the owners group&lt;br /&gt;
       if ( (objectowner == agent) || ( group &amp;amp;&amp;amp; ingroup )  )  {&lt;br /&gt;
       llMessageLinked(LINK_SET,SCENEMENU,&amp;quot;&amp;quot;,agent); // id = AviID or llDetectedKey(0) = id or something&lt;br /&gt;
       }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup Scene Clear&lt;br /&gt;
next create a box and label this box *Clear*&lt;br /&gt;
and add the following script this will clear the scenes when you switch.&lt;br /&gt;
Clear Label Script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
float gap = 15.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(0, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now take this box to your Inventry.&lt;br /&gt;
&lt;br /&gt;
now create another box Called *Create* give this box full permissions and take into your inventry&lt;br /&gt;
now right click on your holodeck-&amp;gt;content and drag the *Clear* &amp;amp; *Create* boxes into the root prim.&lt;br /&gt;
wait a few seconds as these should now appear on your menu control panel.&lt;br /&gt;
&lt;br /&gt;
internal label script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Configurable Settings&lt;br /&gt;
float fTimerInterval = 0.25; //Time in seconds between movement &#039;ticks&#039;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192; //Channel used by Base Prim to talk to Component Prims;&lt;br /&gt;
// This must match in both scripts&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Runtime Variables (Dont need to change below here unless making a derivative)&lt;br /&gt;
vector SceneOffset;&lt;br /&gt;
rotation SceneRotation;&lt;br /&gt;
integer SceneMove;&lt;br /&gt;
vector SceneDestPosition;&lt;br /&gt;
rotation SceneDestRotation;&lt;br /&gt;
integer SceneSaved = FALSE;&lt;br /&gt;
integer PROTOTYPE_VERSION = TRUE; // TRUE = Production, FALSE = Basic / NOMOD, NOCOPY NO TRANS Demo Box&lt;br /&gt;
integer PROTOTYPE_MESSAGE = TRUE;&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string first_word(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the first word in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the whole string.&lt;br /&gt;
if(Token == &amp;quot;&amp;quot;) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
//Found it?&lt;br /&gt;
if( pos &amp;gt;= 1 )&lt;br /&gt;
return llGetSubString(In_String, 0, pos - 1);&lt;br /&gt;
else&lt;br /&gt;
return In_String;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
string other_words(string In_String, string Token)&lt;br /&gt;
{&lt;br /&gt;
//This routine searches for the other-than-first words in a string,&lt;br /&gt;
// and returns it. If no word boundary found, returns&lt;br /&gt;
// the an empty string.&lt;br /&gt;
if( Token == &amp;quot;&amp;quot; ) Token = &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
integer pos = llSubStringIndex(In_String, Token);&lt;br /&gt;
&lt;br /&gt;
//Found it?&lt;br /&gt;
if( pos &amp;gt;= 1 )&lt;br /&gt;
return llGetSubString(In_String, pos + 1, llStringLength(In_String));&lt;br /&gt;
else&lt;br /&gt;
return &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
llPrototypeSay( string message ) &lt;br /&gt;
{&lt;br /&gt;
    if (PROTOTYPE_MESSAGE) llRegionSay(PROTOTYPE_SCRIPTS,message);   &lt;br /&gt;
    else&lt;br /&gt;
    llShout(PROTOTYPE_SCRIPTS,message);&lt;br /&gt;
}&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
prototype_move()&lt;br /&gt;
{&lt;br /&gt;
integer i = 0;&lt;br /&gt;
vector SceneLastPosition = ZERO_VECTOR;&lt;br /&gt;
while( (i &amp;lt; 5) &amp;amp;&amp;amp; (llGetPos() != SceneDestPosition) )&lt;br /&gt;
{&lt;br /&gt;
list lParams = [];&lt;br /&gt;
&lt;br /&gt;
//If we&#039;re not there....&lt;br /&gt;
if( llGetPos() != SceneDestPosition )&lt;br /&gt;
{&lt;br /&gt;
//We may be stuck on the ground...&lt;br /&gt;
//Did we move at all compared to last loop?&lt;br /&gt;
if( llGetPos() == SceneLastPosition )&lt;br /&gt;
{&lt;br /&gt;
//Yep, stuck...move straight up 10m (attempt to dislodge)&lt;br /&gt;
lParams = [ PRIM_POSITION, llGetPos() + &amp;lt;0, 0, 10.0&amp;gt; ];&lt;br /&gt;
//llSetPos(llGetPos() + &amp;lt;0, 0, 10.0&amp;gt;);&lt;br /&gt;
} else {&lt;br /&gt;
//Record our spot for &#039;stuck&#039; detection&lt;br /&gt;
SceneLastPosition = llGetPos();&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Try to move to destination&lt;br /&gt;
integer iHops = llAbs(llCeil(llVecDist(llGetPos(), SceneDestPosition) / 10.0));&lt;br /&gt;
integer x;&lt;br /&gt;
for( x = 0; x &amp;lt; iHops; x++ ) {&lt;br /&gt;
lParams += [ PRIM_POSITION, SceneDestPosition ];&lt;br /&gt;
}&lt;br /&gt;
llSetPrimitiveParams(lParams);&lt;br /&gt;
//llSleep(0.1);&lt;br /&gt;
++i; // changed i++ too ++i credit goes to Simon Sugita for Speed Tweak :)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Set rotation&lt;br /&gt;
llSetRot(SceneDestRotation);&lt;br /&gt;
}&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;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
//Open up the listener&lt;br /&gt;
llListen(PROTOTYPE_SCRIPTS, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        //Set the channel to what&#039;s specified&lt;br /&gt;
    if( start_param != 0 )&lt;br /&gt;
    {&lt;br /&gt;
        PROTOTYPE_SCRIPTS = start_param;&lt;br /&gt;
        state reset_listeners;&lt;br /&gt;
    }&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;
string command = llToUpper(first_word(message, &amp;quot; &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if( command == &amp;quot;RECORD&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
SceneOffset = (llGetPos() - SceneVectorBase) / SceneRotationBase;&lt;br /&gt;
SceneRotation = llGetRot() / SceneRotationBase;&lt;br /&gt;
SceneSaved = TRUE;&lt;br /&gt;
llOwnerSay(&amp;quot;Recorded position.&amp;quot;);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;MOVE&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
// lets set objects phantom &lt;br /&gt;
llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
    &lt;br /&gt;
//Don&#039;t move if we&#039;ve not yet recorded a position&lt;br /&gt;
if( !SceneSaved ) return;&lt;br /&gt;
&lt;br /&gt;
//Also ignore commands from bases with a different owner than us&lt;br /&gt;
//(Anti-hacking measure)&lt;br /&gt;
if( llGetOwner() != llGetOwnerKey(id) ) return;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Calculate our destination position&lt;br /&gt;
message = other_words(message, &amp;quot; &amp;quot;);&lt;br /&gt;
list lParams = llParseString2List(message, [ &amp;quot;|&amp;quot; ], []);&lt;br /&gt;
vector SceneVectorBase = (vector)llList2String(lParams, 0);&lt;br /&gt;
rotation SceneRotationBase = (rotation)llList2String(lParams, 1);&lt;br /&gt;
&lt;br /&gt;
//Calculate our destination position&lt;br /&gt;
SceneDestPosition = (SceneOffset * SceneRotationBase) + SceneVectorBase;&lt;br /&gt;
SceneDestRotation = SceneRotation * SceneRotationBase;&lt;br /&gt;
&lt;br /&gt;
//Turn on our timer to perform the move?&lt;br /&gt;
if( !SceneMove )&lt;br /&gt;
{&lt;br /&gt;
llSetTimerEvent(fTimerInterval);&lt;br /&gt;
SceneMove = TRUE;&lt;br /&gt;
}&lt;br /&gt;
// lets set objects phantom &lt;br /&gt;
llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;PHANTOM&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
//We are done, turn phantom off&lt;br /&gt;
llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;DONE&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
//We are done, remove script&lt;br /&gt;
llRemoveInventory(llGetScriptName());&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;CLEAN&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
//Clean up&lt;br /&gt;
llDie();&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
if( command == &amp;quot;FLUSH&amp;quot; &amp;amp;&amp;amp; PROTOTYPE_VERSION)&lt;br /&gt;
{&lt;br /&gt;
llResetScript();&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
timer()&lt;br /&gt;
{&lt;br /&gt;
//Turn ourselves off&lt;br /&gt;
llSetTimerEvent(0.0);&lt;br /&gt;
&lt;br /&gt;
//Do we need to move?&lt;br /&gt;
if( SceneMove )&lt;br /&gt;
{&lt;br /&gt;
//Perform the move and clean up&lt;br /&gt;
prototype_move();&lt;br /&gt;
SceneMove = FALSE;&lt;br /&gt;
}&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state reset_listeners&lt;br /&gt;
{&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
state default;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Package Scripts)&lt;br /&gt;
address script.lsl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer PROTOTYPE_CHANNEL = 1000;&lt;br /&gt;
integer TEXTURE_CHANNEL = -68193;&lt;br /&gt;
integer PROTOTYPE_SCRIPTS = -68192;&lt;br /&gt;
integer PROTOTYPE_MESSAGE = FALSE;&lt;br /&gt;
float gap = 10.0;&lt;br /&gt;
float counter = 0.0;&lt;br /&gt;
string object;&lt;br /&gt;
string ALPHA_TEXTURE = &amp;quot;bd7d7770-39c2-d4c8-e371-0342ecf20921&amp;quot;;&lt;br /&gt;
integer i;&lt;br /&gt;
integer iLine;&lt;br /&gt;
string item;&lt;br /&gt;
vector vThisPos;&lt;br /&gt;
rotation rThisRot;&lt;br /&gt;
&lt;br /&gt;
scene_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;CLEAR&amp;quot;);&lt;br /&gt;
        object = llGetObjectName();&lt;br /&gt;
        llShout(TEXTURE_CHANNEL, &amp;quot;image &amp;quot; + object);&lt;br /&gt;
        llSetTexture(ALPHA_TEXTURE,ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
       &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        scene_entry();&lt;br /&gt;
        vThisPos = llGetPos();&lt;br /&gt;
        rThisRot = llGetRot();&lt;br /&gt;
        iLine = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
        for(i=0; i &amp;lt; iLine; i++)&lt;br /&gt;
        {&lt;br /&gt;
        item = llGetInventoryName(INVENTORY_OBJECT, i);&lt;br /&gt;
        llSleep (1.00);&lt;br /&gt;
        llRezObject(item, vThisPos + &amp;lt;0.00, 0.00, 1.00&amp;gt;, ZERO_VECTOR, rThisRot, 0);&lt;br /&gt;
        llShout(PROTOTYPE_SCRIPTS, &amp;quot;MOVE &amp;quot; + llDumpList2String([ vThisPos, rThisRot ], &amp;quot;|&amp;quot;));&lt;br /&gt;
        if (DEBUG) llShout (DEBUG_CHANNEL, &amp;quot;Rezzing &amp;quot; + item);&lt;br /&gt;
        }&lt;br /&gt;
        llSetTimerEvent(gap);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        counter = counter + gap; &lt;br /&gt;
        if (DEBUG) llSay(DEBUG_CHANNEL, (string)counter+&amp;quot; seconds have passed i will now terminate&amp;quot;);&lt;br /&gt;
        llShout(PROTOTYPE_CHANNEL, &amp;quot;POSITION&amp;quot;);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Builders Docs&lt;br /&gt;
[[Media:Builders Manual.txt]]&lt;br /&gt;
 &lt;br /&gt;
if you have any problems getting this script to work either contect me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system and more advanced this is just the basic idear how to get a holodeck working.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:sort|Open Source Holodeck}}{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Revolution Perenti</name></author>
	</entry>
</feed>