<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Madpeter+Zond</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Madpeter+Zond"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Madpeter_Zond"/>
	<updated>2026-06-04T12:23:10Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Second_Life_bot_software_comparison&amp;diff=1181487</id>
		<title>Second Life bot software comparison</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Second_Life_bot_software_comparison&amp;diff=1181487"/>
		<updated>2013-09-10T00:32:53Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: layout fixs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Second Life bots can perform the various operations (not available by LSL):&lt;br /&gt;
* Send direct group invitations (including closed groups)&lt;br /&gt;
* Automatically monitor the group chats, kick spammers, perform antispam checks&lt;br /&gt;
* Send automatic group notices and IMs&lt;br /&gt;
* Act as mannequin or model bot&lt;br /&gt;
* Serve as a secretary or support robot by using autoresponder AI or remote chat assistant.&lt;br /&gt;
* Be a non-personal character (NPC) in a roleplaying game.&lt;br /&gt;
&lt;br /&gt;
== Classification ==&lt;br /&gt;
&lt;br /&gt;
Every Second Life bot requires a special software running. This software can be run either on user&#039;s PC or hosted with Second Life bot hosting provider.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: left; width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
== A. Hosting bot with provider ==&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
* You don&#039;t care about PC consuming power around the clock.&lt;br /&gt;
* You don&#039;t have to choose, probably buy and update the bot software.&lt;br /&gt;
* Bot does not depends on your internet connection.&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
* You have to pay a subscription fee (usually weekly)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
== B. Running bot on your own PC ==&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
* You can launch the bot when you need it&lt;br /&gt;
* Usually no subscription fee (however, you may need to buy the software)&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
* You have to keep your PC running all the time&lt;br /&gt;
* Bot hosting providers usually offer more features than standalone programs&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comparison ==&lt;br /&gt;
&lt;br /&gt;
(Sorted naturally, new records are appended at the end)&lt;br /&gt;
&lt;br /&gt;
{| width=100% border=1 cellspacing=0 cellpadding=4&lt;br /&gt;
|- bgcolor=&amp;quot;#DDDDDD&amp;quot;&lt;br /&gt;
! width=20% | &lt;br /&gt;
! width=20% | SmartBots&lt;br /&gt;
! width=20% | PikkuBot&lt;br /&gt;
! width=20% | Corrade&lt;br /&gt;
! width=20% | SecondBot&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Hosting type&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Server hosting&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || no&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Downloadable program&lt;br /&gt;
| no || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Source-Code Available&lt;br /&gt;
| no || no || &#039;&#039;&#039;yes&#039;&#039;&#039; || no &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Purpose&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Used as:&lt;br /&gt;
| &#039;&#039;&#039;Multi-functional Bot&#039;&#039;&#039; || &#039;&#039;&#039;Multi-functional Bot&#039;&#039;&#039; || &amp;lt;br&amp;gt;Group Inviter&amp;lt;br&amp;gt; || &#039;&#039;&#039;Multi-functional Bot&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Features&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Bot controlling approach&lt;br /&gt;
| web pages&amp;lt;br&amp;gt;in-world HUD&amp;lt;br&amp;gt;http API || chat commands || instant-messaging || instant-messaging&amp;lt;br/&amp;gt;http AI&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Group Inviter &amp;lt;ref&amp;gt;See [[Group inviters comparison]] for more info&amp;lt;/ref&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Chat moderator&lt;br /&gt;
| &#039;&#039;&#039;yes, web interface&#039;&#039;&#039; || &#039;&#039;&#039;yes, bot commands&#039;&#039;&#039; || no || no&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Automatic chat antispam&lt;br /&gt;
| &#039;&#039;&#039;yes, using free device&#039;&#039;&#039; || no || no || no&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Group notices and IMs&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || no || &#039;&#039;&#039;yes&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Scheduled notices and IMs&lt;br /&gt;
| &#039;&#039;&#039;yes, web interface&#039;&#039;&#039; || no || no || &#039;&#039;&#039;yes groups only&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Add-ons&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Add-ons for other services&lt;br /&gt;
| SHX devices&amp;lt;br&amp;gt;HippoRent&amp;lt;br&amp;gt;Casper (Vend and others)&amp;lt;br&amp;gt;AlikaRent&amp;lt;br&amp;gt;IntelliAd || not announced || developers welcome :-) || StreamAdmin&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Devices and tools&lt;br /&gt;
| [https://marketplace.secondlife.com/stores/11457 Available at SL Marketplace] || [http://www.pikkubot.de/dokuwiki/doku.php?id=pikkushop Pikku-Shop] || [http://was.fm/secondlife:scripted_agents:corrade Wizardry and Steamworks - Corrade] || None yet&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Prices&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Setup fee&lt;br /&gt;
| &#039;&#039;&#039;free&#039;&#039;&#039; || L$6,000 (premium license)&amp;lt;br&amp;gt;L$6,000 (light license) || &#039;&#039;&#039;free (donations)&#039;&#039;&#039; || &#039;&#039;&#039;free&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Bot hosting subscription&lt;br /&gt;
| L$479/week - fully-functional bot&amp;lt;br&amp;gt;L$179/week - model bot || L$504/week || &#039;&#039;&#039;free (donations)&#039;&#039;&#039; || &#039;&#039;&#039;Not supported yet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Programming&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | LSL API&amp;lt;ref&amp;gt;The LSL library which allows to utilize bot&#039;s functionality from your LSL scripts&amp;lt;/ref&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;[http://www.smartbots2life.com/docs/AdminBot AdminBot LSL Library]&#039;&#039;&#039;:&amp;lt;br&amp;gt;invite to group&amp;lt;br&amp;gt;group chat talk&amp;lt;br&amp;gt;group chat listen&amp;lt;br&amp;gt;eject group members || no || invite to group  || &#039;&#039;&#039;[http://secondbot.net/index.php?module=docs Full command control via scripts]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Bot chat API&lt;br /&gt;
| no || &#039;&#039;&#039;yes&#039;&#039;&#039; || no || &#039;&#039;&#039;yes&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | HTTP API&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || no || no || &#039;&#039;&#039;yes&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Other languages&lt;br /&gt;
| [http://www.smartbots2life.com/docs/SBSL Simple Bot Scripting Language] || no || no || no&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | URL&lt;br /&gt;
| [http://www.smartbots2life.com/ SmartBots: Second Life bot hosting] || [http://www.pikkubots.de/ PikkuBots website] || [http://was.fm/secondlife:scripted_agents:corrade Wizardry and Steamworks - Corrade] || [http://secondbot.net/ SecondBot website]&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | SLURL&lt;br /&gt;
| [http://slurl.com/secondlife/DuoLife/200/99/32] || [http://slurl.com/secondlife/San/198/140/58] || --- || ---&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Other&lt;br /&gt;
| SmartBost is a publicly trading company, listed as [http://slcapex.com/symbol/BOTS BOTS] at SLCAPEX || --- || The source-code is released under the GNU GPLv3 license. For hosting, please contact [[Kira Komarov]] in-world. Free hosting may be available (within reason and at the mercy of resources). || --- &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
For more info on bots, visit the following pages:&lt;br /&gt;
* [[Group inviters comparison]] - the comparison table of the group inviter services&lt;br /&gt;
* [http://www.smartbots2life.com/docs/SmartBots_Documentation SmartBots services] - the general information about Second life bots and related services: group inviter, chat managing and group notices&lt;br /&gt;
&lt;br /&gt;
[[Category: SL Bots]]&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Second_Life_bot_software_comparison&amp;diff=1181486</id>
		<title>Second Life bot software comparison</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Second_Life_bot_software_comparison&amp;diff=1181486"/>
		<updated>2013-09-10T00:30:24Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: added secondbot to the list of bot software&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Second Life bots can perform the various operations (not available by LSL):&lt;br /&gt;
* Send direct group invitations (including closed groups)&lt;br /&gt;
* Automatically monitor the group chats, kick spammers, perform antispam checks&lt;br /&gt;
* Send automatic group notices and IMs&lt;br /&gt;
* Act as mannequin or model bot&lt;br /&gt;
* Serve as a secretary or support robot by using autoresponder AI or remote chat assistant.&lt;br /&gt;
* Be a non-personal character (NPC) in a roleplaying game.&lt;br /&gt;
&lt;br /&gt;
== Classification ==&lt;br /&gt;
&lt;br /&gt;
Every Second Life bot requires a special software running. This software can be run either on user&#039;s PC or hosted with Second Life bot hosting provider.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: left; width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
== A. Hosting bot with provider ==&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
* You don&#039;t care about PC consuming power around the clock.&lt;br /&gt;
* You don&#039;t have to choose, probably buy and update the bot software.&lt;br /&gt;
* Bot does not depends on your internet connection.&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
* You have to pay a subscription fee (usually weekly)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
== B. Running bot on your own PC ==&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
* You can launch the bot when you need it&lt;br /&gt;
* Usually no subscription fee (however, you may need to buy the software)&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
* You have to keep your PC running all the time&lt;br /&gt;
* Bot hosting providers usually offer more features than standalone programs&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comparison ==&lt;br /&gt;
&lt;br /&gt;
(Sorted naturally, new records are appended at the end)&lt;br /&gt;
&lt;br /&gt;
{| width=100% border=1 cellspacing=0 cellpadding=4&lt;br /&gt;
|- bgcolor=&amp;quot;#DDDDDD&amp;quot;&lt;br /&gt;
! width=25% | &lt;br /&gt;
! width=25% | SmartBots&lt;br /&gt;
! width=25% | PikkuBot&lt;br /&gt;
! width=25% | Corrade&lt;br /&gt;
! width=25% | SecondBot&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=4 | &#039;&#039;&#039;Hosting type&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Server hosting&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || no&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Downloadable program&lt;br /&gt;
| no || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Source-Code Available&lt;br /&gt;
| no || no || &#039;&#039;&#039;yes&#039;&#039;&#039; || no &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=4 | &#039;&#039;&#039;Purpose&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Used as:&lt;br /&gt;
| &#039;&#039;&#039;Multi-functional Bot&#039;&#039;&#039; || &#039;&#039;&#039;Multi-functional Bot&#039;&#039;&#039; || &amp;lt;br&amp;gt;Group Inviter&amp;lt;br&amp;gt; || &#039;&#039;&#039;Multi-functional Bot&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=4 | &#039;&#039;&#039;Features&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Bot controlling approach&lt;br /&gt;
| web pages&amp;lt;br&amp;gt;in-world HUD&amp;lt;br&amp;gt;http API || chat commands || instant-messaging || instant-messaging&amp;lt;br/&amp;gt;http AI&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Group Inviter &amp;lt;ref&amp;gt;See [[Group inviters comparison]] for more info&amp;lt;/ref&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Chat moderator&lt;br /&gt;
| &#039;&#039;&#039;yes, web interface&#039;&#039;&#039; || &#039;&#039;&#039;yes, bot commands&#039;&#039;&#039; || no || no&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Automatic chat antispam&lt;br /&gt;
| &#039;&#039;&#039;yes, using free device&#039;&#039;&#039; || no || no || no&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Group notices and IMs&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || no || &#039;&#039;&#039;yes&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Scheduled notices and IMs&lt;br /&gt;
| &#039;&#039;&#039;yes, web interface&#039;&#039;&#039; || no || no || &#039;&#039;&#039;yes groups only&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=4 | &#039;&#039;&#039;Add-ons&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Add-ons for other services&lt;br /&gt;
| SHX devices&amp;lt;br&amp;gt;HippoRent&amp;lt;br&amp;gt;Casper (Vend and others)&amp;lt;br&amp;gt;AlikaRent&amp;lt;br&amp;gt;IntelliAd || not announced || developers welcome :-) || StreamAdmin&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Devices and tools&lt;br /&gt;
| [https://marketplace.secondlife.com/stores/11457 Available at SL Marketplace] || [http://www.pikkubot.de/dokuwiki/doku.php?id=pikkushop Pikku-Shop] || [http://was.fm/secondlife:scripted_agents:corrade Wizardry and Steamworks - Corrade] || None yet&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=4 | &#039;&#039;&#039;Prices&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Setup fee&lt;br /&gt;
| &#039;&#039;&#039;free&#039;&#039;&#039; || L$6,000 (premium license)&amp;lt;br&amp;gt;L$6,000 (light license) || &#039;&#039;&#039;free (donations)&#039;&#039;&#039; || &#039;&#039;&#039;free&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Bot hosting subscription&lt;br /&gt;
| L$479/week - fully-functional bot&amp;lt;br&amp;gt;L$179/week - model bot || L$504/week || &#039;&#039;&#039;free (donations)&#039;&#039;&#039; || &#039;&#039;&#039;Not supported yet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=4 | &#039;&#039;&#039;Programming&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | LSL API&amp;lt;ref&amp;gt;The LSL library which allows to utilize bot&#039;s functionality from your LSL scripts&amp;lt;/ref&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;[http://www.smartbots2life.com/docs/AdminBot AdminBot LSL Library]&#039;&#039;&#039;:&amp;lt;br&amp;gt;invite to group&amp;lt;br&amp;gt;group chat talk&amp;lt;br&amp;gt;group chat listen&amp;lt;br&amp;gt;eject group members || no || invite to group  || &#039;&#039;&#039;[http://secondbot.net/index.php?module=docs Full command control via scripts]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Bot chat API&lt;br /&gt;
| no || &#039;&#039;&#039;yes&#039;&#039;&#039; || no || &#039;&#039;&#039;yes&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | HTTP API&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || no || no || &#039;&#039;&#039;yes&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Other languages&lt;br /&gt;
| [http://www.smartbots2life.com/docs/SBSL Simple Bot Scripting Language] || no || no || no&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=4 | &#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | URL&lt;br /&gt;
| [http://www.smartbots2life.com/ SmartBots: Second Life bot hosting] || [http://www.pikkubots.de/ PikkuBots website] || [http://was.fm/secondlife:scripted_agents:corrade Wizardry and Steamworks - Corrade] || [http://secondbot.net/ SecondBot website]&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | SLURL&lt;br /&gt;
| [http://slurl.com/secondlife/DuoLife/200/99/32] || [http://slurl.com/secondlife/San/198/140/58] || --- || ---&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Other&lt;br /&gt;
| SmartBost is a publicly trading company, listed as [http://slcapex.com/symbol/BOTS BOTS] at SLCAPEX || --- || The source-code is released under the GNU GPLv3 license. For hosting, please contact [[Kira Komarov]] in-world. Free hosting may be available (within reason and at the mercy of resources). || --- &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
For more info on bots, visit the following pages:&lt;br /&gt;
* [[Group inviters comparison]] - the comparison table of the group inviter services&lt;br /&gt;
* [http://www.smartbots2life.com/docs/SmartBots_Documentation SmartBots services] - the general information about Second life bots and related services: group inviter, chat managing and group notices&lt;br /&gt;
&lt;br /&gt;
[[Category: SL Bots]]&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlRemoteLoadScriptPin&amp;diff=1181015</id>
		<title>LlRemoteLoadScriptPin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlRemoteLoadScriptPin&amp;diff=1181015"/>
		<updated>2013-08-29T17:06:05Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: adjusted the title of the new script example a bit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/give|target|name|sim=*|uuid=false|type=script|prim=*}}{{Issues/SVC-3321}}&lt;br /&gt;
|func_id=253|func_sleep=3.0|func_energy=10.0&lt;br /&gt;
|func=llRemoteLoadScriptPin&lt;br /&gt;
|func_desc=Copy script {{LSLP|name}} into {{LSLP|target}} and set to {{LSLP|running}} with a {{LSLP|start_param}} only if {{LSLP|target}}&#039;s [[llSetRemoteScriptAccessPin|pin]] matches {{LSLP|pin}}&lt;br /&gt;
|p1_type=key|p1_name=target|p1_desc&lt;br /&gt;
|p2_type=string|p2_name=name|p2_desc&lt;br /&gt;
|p3_type=integer|p3_name=pin|p3_desc=Must match pin set by [[llSetRemoteScriptAccessPin]]&lt;br /&gt;
|p4_type=integer|p4_name=running|p4_desc=boolean, if the script is to be set as running.&lt;br /&gt;
|p5_type=integer|p5_name=start_param|p5_desc=value returned by [[llGetStartParameter]] in the target script.&lt;br /&gt;
|func_footnote=Only works if the [[LSL Glossary#script owner|script owner]] can modify {{LSLP|target}}.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
* If {{LSLP|name}} is present in the {{LSLP|target}} prim&#039;s inventory then it is silently replaced.&lt;br /&gt;
* {{LSLP|start_param}} only lasts until the script is reset.&lt;br /&gt;
* Only the owner of an {{LSLGC|Attachment|attachment}} can modify it while it is being worn.&lt;br /&gt;
** If {{LSLP|target}} is an {{LSLGC|Attachment|attachment}} owned by a different user, regardless of object modify rights granted, this function will silently fail.&lt;br /&gt;
* If {{LSLP|pin}} fails to match, the error &amp;quot;Task ~Prim~ trying to illegally load script onto task ~Other_Prim~!&amp;quot; is shouted on [[DEBUG_CHANNEL]]. &amp;quot;~Prim~&amp;quot; and &amp;quot;~Other_Prim~&amp;quot; are substituted with the applicable prim names.&lt;br /&gt;
* If {{LSLP|target}} is the script&#039;s parent (&amp;lt;code&amp;gt;{{LSLPT|target}} == [[llGetKey]]()&amp;lt;/code&amp;gt;) then &amp;quot;Unable to add item!&amp;quot; is shouted on [[DEBUG_CHANNEL]].&lt;br /&gt;
* If the object containing this script is deeded to a group, than script {{LSLP|name}} needs transfer permissions; even if {{LSLP|target}} is deeded to the same group.&lt;br /&gt;
* When the script is set to run (with {{LSLP|running}}, the running checkbox or [[llSetScriptState]]) [[state_entry]] will be queued.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
====Script copier====&lt;br /&gt;
&amp;lt;lsl&amp;gt;//Copy a script to the second prim&lt;br /&gt;
integer PIN=1341134;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llRemoteLoadScriptPin( llGetLinkKey(2), &amp;quot;some script&amp;quot;, PIN, TRUE, 0xBEEEEEEF );&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
====Pin setter====&lt;br /&gt;
Simple script used for setting the pin for a prim, so you can later send scripts to it with llRemoteLoadScriptPin.&lt;br /&gt;
&amp;lt;lsl&amp;gt;//Child Prim PIN setter&lt;br /&gt;
integer PIN=1341134;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llOwnerSay(llGetObjectName()+&amp;quot; : &amp;quot;+(string)llGetKey()+&amp;quot; is ready to accept a describer script using the agreed upon PIN.&amp;quot;);&lt;br /&gt;
        llSetRemoteScriptAccessPin(PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rez and copy a file from a control object ==== &lt;br /&gt;
Notes: There is currently no signing on the starting messages only the owner is checked.&lt;br /&gt;
&lt;br /&gt;
this example rezs a prim from inventory that has a basic control file inside of it and does a basic handshake to setup the&lt;br /&gt;
pin and transfer the script. &lt;br /&gt;
&lt;br /&gt;
after the transfert the helper script in the rezzed prim deletes itself.&lt;br /&gt;
&lt;br /&gt;
==== Control prim ====&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer controlchan = 0;&lt;br /&gt;
integer controlid = -1;&lt;br /&gt;
start()&lt;br /&gt;
{&lt;br /&gt;
    llSetTimerEvent(0);&lt;br /&gt;
    talkingto = NULL_KEY;&lt;br /&gt;
    integer a = (integer)llFrand(43);&lt;br /&gt;
    controlchan = a * a;&lt;br /&gt;
    controlchan -= controlchan * 3;&lt;br /&gt;
    controlid = llListen(controlchan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;set-connect&amp;quot;);&lt;br /&gt;
    llRezObject(&amp;quot;card&amp;quot;,llGetPos()+&amp;lt;0,0,0.1&amp;gt;,&amp;lt;0,0,0&amp;gt;,ZERO_ROTATION,a);&lt;br /&gt;
    llSetTimerEvent(60);&lt;br /&gt;
}&lt;br /&gt;
key talkingto = NULL_KEY;&lt;br /&gt;
integer busy = FALSE;&lt;br /&gt;
integer accesspin = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Lost connection!&amp;quot;);&lt;br /&gt;
        llListenRemove(controlid);&lt;br /&gt;
        busy = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer chan,string name,key id,string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(chan == controlchan)&lt;br /&gt;
        {&lt;br /&gt;
            if(llGetOwnerKey(id) == llGetOwner())&lt;br /&gt;
            {&lt;br /&gt;
                if(talkingto == NULL_KEY)&lt;br /&gt;
                {&lt;br /&gt;
                    if(message == &amp;quot;set-connect&amp;quot;)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSetTimerEvent(0);&lt;br /&gt;
                        talkingto = id;&lt;br /&gt;
                        llListenRemove(controlid);&lt;br /&gt;
                        controlid = llListen(controlchan,&amp;quot;&amp;quot;,talkingto,&amp;quot;ready&amp;quot;);&lt;br /&gt;
                        llRegionSayTo(id,controlchan,&amp;quot;auto-connect&amp;quot;);&lt;br /&gt;
                        llSetTimerEvent(60);&lt;br /&gt;
                    }&lt;br /&gt;
                }   &lt;br /&gt;
                else if(id == talkingto)&lt;br /&gt;
                {&lt;br /&gt;
                    if(message == &amp;quot;ready&amp;quot;)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSetTimerEvent(0);&lt;br /&gt;
                        accesspin = (integer)llFrand(2345)+213;&lt;br /&gt;
                        llListenRemove(controlid);&lt;br /&gt;
                        controlid = llListen(controlchan,&amp;quot;&amp;quot;,talkingto,&amp;quot;pinset&amp;quot;);&lt;br /&gt;
                        llSleep(1);&lt;br /&gt;
                        llRegionSayTo(talkingto,controlchan,(string)accesspin);&lt;br /&gt;
                        llSetTimerEvent(60);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if(message == &amp;quot;pinset&amp;quot;)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSetTimerEvent(0);&lt;br /&gt;
                        llListenRemove(controlid);&lt;br /&gt;
                        llRemoteLoadScriptPin(talkingto,&amp;quot;demo.lsl&amp;quot;,accesspin,1,0);&lt;br /&gt;
                        llSleep(3);&lt;br /&gt;
                        llRegionSayTo(talkingto,controlchan,&amp;quot;finished&amp;quot;);&lt;br /&gt;
                        llOwnerSay(&amp;quot;Transfer of file finished - control file should have auto deleted itself!&amp;quot;);&lt;br /&gt;
                        busy = FALSE;&lt;br /&gt;
                    }&lt;br /&gt;
                } &lt;br /&gt;
            }   &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    touch_end(integer a)&lt;br /&gt;
    {&lt;br /&gt;
        if(busy == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            busy = TRUE;&lt;br /&gt;
            if(llGetOwner() == llDetectedKey(0))&lt;br /&gt;
            {&lt;br /&gt;
                start();&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;
==== rezzed prim ====&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer listen_id = -1;&lt;br /&gt;
integer listen_chan = -1;&lt;br /&gt;
key details_from = NULL_KEY;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer a)&lt;br /&gt;
    {&lt;br /&gt;
        if(a == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;- Direct rez -&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;- Awaiting config connection -&amp;quot;);&lt;br /&gt;
            listen_chan = a * a;&lt;br /&gt;
            listen_chan -= listen_chan * 3;&lt;br /&gt;
            listen_id = llListen(listen_chan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;auto-connect&amp;quot;);&lt;br /&gt;
            llWhisper(listen_chan,&amp;quot;set-connect&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(30);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Failed to connect to rezzer deleting myself!&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(0);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer chan,string name,key id,string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetOwnerKey(id) == llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            if(message == &amp;quot;auto-connect&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(0);&lt;br /&gt;
                llListenRemove(listen_id);&lt;br /&gt;
                listen_id = llListen(listen_chan,&amp;quot;&amp;quot;,id,&amp;quot;&amp;quot;);&lt;br /&gt;
                llRegionSayTo(id,listen_chan,&amp;quot;ready&amp;quot;);&lt;br /&gt;
                details_from = id;&lt;br /&gt;
                llSetTimerEvent(30);                 &lt;br /&gt;
            }&lt;br /&gt;
            else if(details_from != NULL_KEY)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(0);  &lt;br /&gt;
                if(message == &amp;quot;finished&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    llSetRemoteScriptAccessPin((integer)message);&lt;br /&gt;
                    llRemoveInventory(llGetScriptName());         &lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llSetRemoteScriptAccessPin((integer)message);&lt;br /&gt;
                    llRegionSayTo(id,listen_chan,&amp;quot;pinset&amp;quot;);&lt;br /&gt;
                } &lt;br /&gt;
                llSetTimerEvent(30);  &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;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llSetRemoteScriptAccessPin]]|Used to setup a prim for remote loading}}&lt;br /&gt;
{{LSL DefineRow||[[llSetScriptState]]|Set a scripts running state}}&lt;br /&gt;
{{LSL DefineRow||[[llResetOtherScript]]|Reset another script in the prim}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|history=&lt;br /&gt;
* Added in 1.2.6&lt;br /&gt;
* In SL 1.25.4 this function will not copy/move any script into an attachment unless the script is full perm. ([https://jira.secondlife.com/browse/SVC-3725 SVC-3725])&lt;br /&gt;
* SL 1.25.5 will allow this function to copy/move a script into an attachment so long as the target has matching (or more restrictive) copy and transfer permissions. ([https://jira.secondlife.com/browse/SVC-3738 SVC-3738])&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Script&lt;br /&gt;
|cat2=Inventory&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlRemoteLoadScriptPin&amp;diff=1181014</id>
		<title>LlRemoteLoadScriptPin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlRemoteLoadScriptPin&amp;diff=1181014"/>
		<updated>2013-08-29T17:05:10Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: added a example of rezzing a object and setting up a script transfer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/give|target|name|sim=*|uuid=false|type=script|prim=*}}{{Issues/SVC-3321}}&lt;br /&gt;
|func_id=253|func_sleep=3.0|func_energy=10.0&lt;br /&gt;
|func=llRemoteLoadScriptPin&lt;br /&gt;
|func_desc=Copy script {{LSLP|name}} into {{LSLP|target}} and set to {{LSLP|running}} with a {{LSLP|start_param}} only if {{LSLP|target}}&#039;s [[llSetRemoteScriptAccessPin|pin]] matches {{LSLP|pin}}&lt;br /&gt;
|p1_type=key|p1_name=target|p1_desc&lt;br /&gt;
|p2_type=string|p2_name=name|p2_desc&lt;br /&gt;
|p3_type=integer|p3_name=pin|p3_desc=Must match pin set by [[llSetRemoteScriptAccessPin]]&lt;br /&gt;
|p4_type=integer|p4_name=running|p4_desc=boolean, if the script is to be set as running.&lt;br /&gt;
|p5_type=integer|p5_name=start_param|p5_desc=value returned by [[llGetStartParameter]] in the target script.&lt;br /&gt;
|func_footnote=Only works if the [[LSL Glossary#script owner|script owner]] can modify {{LSLP|target}}.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
* If {{LSLP|name}} is present in the {{LSLP|target}} prim&#039;s inventory then it is silently replaced.&lt;br /&gt;
* {{LSLP|start_param}} only lasts until the script is reset.&lt;br /&gt;
* Only the owner of an {{LSLGC|Attachment|attachment}} can modify it while it is being worn.&lt;br /&gt;
** If {{LSLP|target}} is an {{LSLGC|Attachment|attachment}} owned by a different user, regardless of object modify rights granted, this function will silently fail.&lt;br /&gt;
* If {{LSLP|pin}} fails to match, the error &amp;quot;Task ~Prim~ trying to illegally load script onto task ~Other_Prim~!&amp;quot; is shouted on [[DEBUG_CHANNEL]]. &amp;quot;~Prim~&amp;quot; and &amp;quot;~Other_Prim~&amp;quot; are substituted with the applicable prim names.&lt;br /&gt;
* If {{LSLP|target}} is the script&#039;s parent (&amp;lt;code&amp;gt;{{LSLPT|target}} == [[llGetKey]]()&amp;lt;/code&amp;gt;) then &amp;quot;Unable to add item!&amp;quot; is shouted on [[DEBUG_CHANNEL]].&lt;br /&gt;
* If the object containing this script is deeded to a group, than script {{LSLP|name}} needs transfer permissions; even if {{LSLP|target}} is deeded to the same group.&lt;br /&gt;
* When the script is set to run (with {{LSLP|running}}, the running checkbox or [[llSetScriptState]]) [[state_entry]] will be queued.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
====Script copier====&lt;br /&gt;
&amp;lt;lsl&amp;gt;//Copy a script to the second prim&lt;br /&gt;
integer PIN=1341134;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llRemoteLoadScriptPin( llGetLinkKey(2), &amp;quot;some script&amp;quot;, PIN, TRUE, 0xBEEEEEEF );&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
====Pin setter====&lt;br /&gt;
Simple script used for setting the pin for a prim, so you can later send scripts to it with llRemoteLoadScriptPin.&lt;br /&gt;
&amp;lt;lsl&amp;gt;//Child Prim PIN setter&lt;br /&gt;
integer PIN=1341134;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llOwnerSay(llGetObjectName()+&amp;quot; : &amp;quot;+(string)llGetKey()+&amp;quot; is ready to accept a describer script using the agreed upon PIN.&amp;quot;);&lt;br /&gt;
        llSetRemoteScriptAccessPin(PIN);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Rez and copy a file from a control object ----&lt;br /&gt;
Notes: There is currently no signing on the starting messages only the owner is checked.&lt;br /&gt;
&lt;br /&gt;
this example rezs a prim from inventory that has a basic control file inside of it and does a basic handshake to setup the&lt;br /&gt;
pin and transfer the script. &lt;br /&gt;
&lt;br /&gt;
after the transfert the helper script in the rezzed prim deletes itself.&lt;br /&gt;
&lt;br /&gt;
==== Control prim ====&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer controlchan = 0;&lt;br /&gt;
integer controlid = -1;&lt;br /&gt;
start()&lt;br /&gt;
{&lt;br /&gt;
    llSetTimerEvent(0);&lt;br /&gt;
    talkingto = NULL_KEY;&lt;br /&gt;
    integer a = (integer)llFrand(43);&lt;br /&gt;
    controlchan = a * a;&lt;br /&gt;
    controlchan -= controlchan * 3;&lt;br /&gt;
    controlid = llListen(controlchan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;set-connect&amp;quot;);&lt;br /&gt;
    llRezObject(&amp;quot;card&amp;quot;,llGetPos()+&amp;lt;0,0,0.1&amp;gt;,&amp;lt;0,0,0&amp;gt;,ZERO_ROTATION,a);&lt;br /&gt;
    llSetTimerEvent(60);&lt;br /&gt;
}&lt;br /&gt;
key talkingto = NULL_KEY;&lt;br /&gt;
integer busy = FALSE;&lt;br /&gt;
integer accesspin = 0;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Lost connection!&amp;quot;);&lt;br /&gt;
        llListenRemove(controlid);&lt;br /&gt;
        busy = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer chan,string name,key id,string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(chan == controlchan)&lt;br /&gt;
        {&lt;br /&gt;
            if(llGetOwnerKey(id) == llGetOwner())&lt;br /&gt;
            {&lt;br /&gt;
                if(talkingto == NULL_KEY)&lt;br /&gt;
                {&lt;br /&gt;
                    if(message == &amp;quot;set-connect&amp;quot;)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSetTimerEvent(0);&lt;br /&gt;
                        talkingto = id;&lt;br /&gt;
                        llListenRemove(controlid);&lt;br /&gt;
                        controlid = llListen(controlchan,&amp;quot;&amp;quot;,talkingto,&amp;quot;ready&amp;quot;);&lt;br /&gt;
                        llRegionSayTo(id,controlchan,&amp;quot;auto-connect&amp;quot;);&lt;br /&gt;
                        llSetTimerEvent(60);&lt;br /&gt;
                    }&lt;br /&gt;
                }   &lt;br /&gt;
                else if(id == talkingto)&lt;br /&gt;
                {&lt;br /&gt;
                    if(message == &amp;quot;ready&amp;quot;)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSetTimerEvent(0);&lt;br /&gt;
                        accesspin = (integer)llFrand(2345)+213;&lt;br /&gt;
                        llListenRemove(controlid);&lt;br /&gt;
                        controlid = llListen(controlchan,&amp;quot;&amp;quot;,talkingto,&amp;quot;pinset&amp;quot;);&lt;br /&gt;
                        llSleep(1);&lt;br /&gt;
                        llRegionSayTo(talkingto,controlchan,(string)accesspin);&lt;br /&gt;
                        llSetTimerEvent(60);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if(message == &amp;quot;pinset&amp;quot;)&lt;br /&gt;
                    {&lt;br /&gt;
                        llSetTimerEvent(0);&lt;br /&gt;
                        llListenRemove(controlid);&lt;br /&gt;
                        llRemoteLoadScriptPin(talkingto,&amp;quot;demo.lsl&amp;quot;,accesspin,1,0);&lt;br /&gt;
                        llSleep(3);&lt;br /&gt;
                        llRegionSayTo(talkingto,controlchan,&amp;quot;finished&amp;quot;);&lt;br /&gt;
                        llOwnerSay(&amp;quot;Transfer of file finished - control file should have auto deleted itself!&amp;quot;);&lt;br /&gt;
                        busy = FALSE;&lt;br /&gt;
                    }&lt;br /&gt;
                } &lt;br /&gt;
            }   &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    touch_end(integer a)&lt;br /&gt;
    {&lt;br /&gt;
        if(busy == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            busy = TRUE;&lt;br /&gt;
            if(llGetOwner() == llDetectedKey(0))&lt;br /&gt;
            {&lt;br /&gt;
                start();&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;
==== rezzed prim ====&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer listen_id = -1;&lt;br /&gt;
integer listen_chan = -1;&lt;br /&gt;
key details_from = NULL_KEY;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer a)&lt;br /&gt;
    {&lt;br /&gt;
        if(a == 0)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;- Direct rez -&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;- Awaiting config connection -&amp;quot;);&lt;br /&gt;
            listen_chan = a * a;&lt;br /&gt;
            listen_chan -= listen_chan * 3;&lt;br /&gt;
            listen_id = llListen(listen_chan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;auto-connect&amp;quot;);&lt;br /&gt;
            llWhisper(listen_chan,&amp;quot;set-connect&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(30);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Failed to connect to rezzer deleting myself!&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(0);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer chan,string name,key id,string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetOwnerKey(id) == llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            if(message == &amp;quot;auto-connect&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(0);&lt;br /&gt;
                llListenRemove(listen_id);&lt;br /&gt;
                listen_id = llListen(listen_chan,&amp;quot;&amp;quot;,id,&amp;quot;&amp;quot;);&lt;br /&gt;
                llRegionSayTo(id,listen_chan,&amp;quot;ready&amp;quot;);&lt;br /&gt;
                details_from = id;&lt;br /&gt;
                llSetTimerEvent(30);                 &lt;br /&gt;
            }&lt;br /&gt;
            else if(details_from != NULL_KEY)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(0);  &lt;br /&gt;
                if(message == &amp;quot;finished&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    llSetRemoteScriptAccessPin((integer)message);&lt;br /&gt;
                    llRemoveInventory(llGetScriptName());         &lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llSetRemoteScriptAccessPin((integer)message);&lt;br /&gt;
                    llRegionSayTo(id,listen_chan,&amp;quot;pinset&amp;quot;);&lt;br /&gt;
                } &lt;br /&gt;
                llSetTimerEvent(30);  &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;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llSetRemoteScriptAccessPin]]|Used to setup a prim for remote loading}}&lt;br /&gt;
{{LSL DefineRow||[[llSetScriptState]]|Set a scripts running state}}&lt;br /&gt;
{{LSL DefineRow||[[llResetOtherScript]]|Reset another script in the prim}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|history=&lt;br /&gt;
* Added in 1.2.6&lt;br /&gt;
* In SL 1.25.4 this function will not copy/move any script into an attachment unless the script is full perm. ([https://jira.secondlife.com/browse/SVC-3725 SVC-3725])&lt;br /&gt;
* SL 1.25.5 will allow this function to copy/move a script into an attachment so long as the target has matching (or more restrictive) copy and transfer permissions. ([https://jira.secondlife.com/browse/SVC-3738 SVC-3738])&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Script&lt;br /&gt;
|cat2=Inventory&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=NumPad&amp;diff=1176230</id>
		<title>NumPad</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=NumPad&amp;diff=1176230"/>
		<updated>2013-01-18T01:29:34Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: /* Main Script */ fixed right side empty not updating lol&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
Scripting tools to allow display of text on a prim: [[XyText 1.5]] , [[XyzzyText]], [[XyyyyzText]], [[XyText-UTF8]], [[XyzzyText-UTF8]], [[ZZText]], [[VariText]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NumPad&#039;&#039;&#039; is a variant of the text on a prim but with some changes&lt;br /&gt;
&lt;br /&gt;
* 1 texture vs 5 textures needed for XyText 1.5 &#039;to render numbers&#039;&lt;br /&gt;
* Numbers and spaces only.&lt;br /&gt;
* About 73 lines of code.&lt;br /&gt;
&lt;br /&gt;
=Copyright &amp;amp; Licensing=&lt;br /&gt;
&amp;lt;font size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
* Madpeter Zond hereby releases his contributions to this under the MIT license. [Starting texture and Starting code]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=NumPad 10digits=&lt;br /&gt;
&lt;br /&gt;
Quickstart:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Take a copy of the 10 char prim setup from [[XyText 1.5]] and setup a prim&lt;br /&gt;
* After running the code create a new script and copy the NumPad code to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Set render_to_prim_number to the number of the prim you wish to render to,&lt;br /&gt;
* if you dont know the number you can put the script inside of the prim you want&lt;br /&gt;
* and not change this.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    NumPad&lt;br /&gt;
    ----------------&lt;br /&gt;
    Version: 1.0&lt;br /&gt;
    By: Madpeter Zond&lt;br /&gt;
    About: A 1 texture 10 digit number display&lt;br /&gt;
           great for a score output.&lt;br /&gt;
*/&lt;br /&gt;
string texture = &amp;quot;31f72af5-dee3-72f5-3981-bde21bf85e9c&amp;quot;;&lt;br /&gt;
integer render_to_prim_number = LINK_THIS;&lt;br /&gt;
vector render_color = &amp;lt;1,1,1&amp;gt;;&lt;br /&gt;
float glow_amount = 0.00;&lt;br /&gt;
&lt;br /&gt;
// please dont change this unless you want to break something ^_^&lt;br /&gt;
list faces = [3,7,4,6,1];&lt;br /&gt;
list grid_offset_starts = [&amp;lt;-0.38941,-0.54747,0&amp;gt;  ,&amp;lt;-0.44939,-0.54750,0&amp;gt;,  &amp;lt;0.01800,0.45256,0&amp;gt;,&amp;lt;-0.44939,-0.54750,0&amp;gt;,&amp;lt;-0.50941,-0.54747,0&amp;gt;];&lt;br /&gt;
list repeats_corrections = [&amp;lt;0.1,0,0&amp;gt;,&amp;lt;0,0,0&amp;gt;,&amp;lt;-1.35,0,0&amp;gt;,&amp;lt;0,0,0&amp;gt;,&amp;lt;0.1,0,0&amp;gt;];&lt;br /&gt;
vector repeats_config = &amp;lt;0.1,0.083333,0&amp;gt;;&lt;br /&gt;
float fix(float input)  // render blocking fix [haxy]   &lt;br /&gt;
{&lt;br /&gt;
     if(input &amp;gt; 1.0) input -= 1.0;&lt;br /&gt;
     else if(input &amp;lt; -1.0) input += 1.0;&lt;br /&gt;
     return input; &lt;br /&gt;
}&lt;br /&gt;
render(string output)&lt;br /&gt;
{&lt;br /&gt;
    while(llStringLength(output) &amp;lt;= 10) { output = &amp;quot;&amp;quot;+output+&amp;quot; &amp;quot;; }&lt;br /&gt;
    list renderrules = [];&lt;br /&gt;
    integer loop = 0;&lt;br /&gt;
    while(loop &amp;lt; 5)&lt;br /&gt;
    {&lt;br /&gt;
        string part = llGetSubString(output,(2*loop),(2*loop)+1);&lt;br /&gt;
        if(part == &amp;quot;  &amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            // empty&lt;br /&gt;
            renderrules = renderrules + [PRIM_COLOR,llList2Integer(faces,loop),&amp;lt;1,1,1&amp;gt;,0,PRIM_GLOW,llList2Integer(faces,loop),0];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            integer Y_offset = (integer)llGetSubString(part,0,0);&lt;br /&gt;
            integer X_offset = (integer)llGetSubString(part,1,1);&lt;br /&gt;
            if(llGetSubString(part,0,0) == &amp;quot; &amp;quot;) Y_offset = 10; // left side empty &lt;br /&gt;
            else if(llGetSubString(part,1,1) == &amp;quot; &amp;quot;) &lt;br /&gt;
            {&lt;br /&gt;
                Y_offset = 11; // right side empty&lt;br /&gt;
                X_offset = (integer)llGetSubString(part,0,0);&lt;br /&gt;
            }&lt;br /&gt;
            vector start = llList2Vector(grid_offset_starts,loop);&lt;br /&gt;
            start = &amp;lt;fix(start.x + (0.1 * X_offset)),fix(start.y + (-0.083333333 * Y_offset)),0&amp;gt;;&lt;br /&gt;
            renderrules = renderrules + [PRIM_TEXTURE,llList2Integer(faces,loop),texture,repeats_config+llList2Vector(repeats_corrections,loop),start,0,PRIM_COLOR,llList2Integer(faces,loop),render_color,1,PRIM_GLOW,llList2Integer(faces,loop),glow_amount];&lt;br /&gt;
        }&lt;br /&gt;
        loop++;&lt;br /&gt;
    }&lt;br /&gt;
    llSetLinkPrimitiveParamsFast(render_to_prim_number,renderrules);&lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        render(&amp;quot;1234567890&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Texture layout==&lt;br /&gt;
&amp;lt;p&amp;gt; the texture is setup in a 10x12 format as follows.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00 01 02 03 04 05 06 07 08 09&lt;br /&gt;
10 11 12 13 14 15 16 17 18 19&lt;br /&gt;
20 21 22 23 24 25 26 27 28 29&lt;br /&gt;
30 31 32 33 34 35 36 37 38 39&lt;br /&gt;
40 41 42 43 44 45 46 47 48 49&lt;br /&gt;
50 51 52 53 54 55 56 57 58 59&lt;br /&gt;
60 61 62 63 64 65 66 67 68 69&lt;br /&gt;
70 71 72 73 74 75 76 77 78 79&lt;br /&gt;
80 81 82 83 84 85 86 87 88 89&lt;br /&gt;
90 91 92 93 94 95 96 97 98 99&lt;br /&gt;
_0 _1 _2 _3 _4 _5 _6 _7 _8 _9&lt;br /&gt;
0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Improvements==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
there are some improvements that could be made&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
1: Change the texture format to 11x11 to improve the quality of the numbers.&amp;lt;br/&amp;gt;&lt;br /&gt;
2: Change the while loop to a for loop if that saves memory.&amp;lt;br/&amp;gt;&lt;br /&gt;
3: Change the way it builds rules if a way is found that saves script memory.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=NumPad&amp;diff=1176215</id>
		<title>NumPad</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=NumPad&amp;diff=1176215"/>
		<updated>2013-01-17T13:03:21Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: /* Main Script */  the left and right empty sides empty had a off by 1 error ^_^&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
Scripting tools to allow display of text on a prim: [[XyText 1.5]] , [[XyzzyText]], [[XyyyyzText]], [[XyText-UTF8]], [[XyzzyText-UTF8]], [[ZZText]], [[VariText]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NumPad&#039;&#039;&#039; is a variant of the text on a prim but with some changes&lt;br /&gt;
&lt;br /&gt;
* 1 texture vs 5 textures needed for XyText 1.5 &#039;to render numbers&#039;&lt;br /&gt;
* Numbers and spaces only.&lt;br /&gt;
* About 73 lines of code.&lt;br /&gt;
&lt;br /&gt;
=Copyright &amp;amp; Licensing=&lt;br /&gt;
&amp;lt;font size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
* Madpeter Zond hereby releases his contributions to this under the MIT license. [Starting texture and Starting code]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=NumPad 10digits=&lt;br /&gt;
&lt;br /&gt;
Quickstart:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Take a copy of the 10 char prim setup from [[XyText 1.5]] and setup a prim&lt;br /&gt;
* After running the code create a new script and copy the NumPad code to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Set render_to_prim_number to the number of the prim you wish to render to,&lt;br /&gt;
* if you dont know the number you can put the script inside of the prim you want&lt;br /&gt;
* and not change this.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    NumPad&lt;br /&gt;
    ----------------&lt;br /&gt;
    Version: 1.0&lt;br /&gt;
    By: Madpeter Zond&lt;br /&gt;
    About: A 1 texture 10 digit number display&lt;br /&gt;
           great for a score output.&lt;br /&gt;
*/&lt;br /&gt;
string texture = &amp;quot;31f72af5-dee3-72f5-3981-bde21bf85e9c&amp;quot;;&lt;br /&gt;
integer render_to_prim_number = LINK_THIS;&lt;br /&gt;
vector render_color = &amp;lt;1,1,1&amp;gt;;&lt;br /&gt;
float glow_amount = 0.00;&lt;br /&gt;
&lt;br /&gt;
// please dont change this unless you want to break something ^_^&lt;br /&gt;
list faces = [3,7,4,6,1];&lt;br /&gt;
list grid_offset_starts = [&amp;lt;-0.38941,-0.54747,0&amp;gt;  ,&amp;lt;-0.44939,-0.54750,0&amp;gt;,  &amp;lt;0.01800,0.45256,0&amp;gt;,&amp;lt;-0.44939,-0.54750,0&amp;gt;,&amp;lt;-0.50941,-0.54747,0&amp;gt;];&lt;br /&gt;
list repeats_corrections = [&amp;lt;0.1,0,0&amp;gt;,&amp;lt;0,0,0&amp;gt;,&amp;lt;-1.35,0,0&amp;gt;,&amp;lt;0,0,0&amp;gt;,&amp;lt;0.1,0,0&amp;gt;];&lt;br /&gt;
vector repeats_config = &amp;lt;0.1,0.083333,0&amp;gt;;&lt;br /&gt;
float fix(float input)  // render blocking fix [haxy]   &lt;br /&gt;
{&lt;br /&gt;
     if(input &amp;gt; 1.0) input -= 1.0;&lt;br /&gt;
     else if(input &amp;lt; -1.0) input += 1.0;&lt;br /&gt;
     return input; &lt;br /&gt;
}&lt;br /&gt;
render(string output)&lt;br /&gt;
{&lt;br /&gt;
    while(llStringLength(output) &amp;lt; 10) { output = &amp;quot;&amp;quot;+output+&amp;quot; &amp;quot;; }&lt;br /&gt;
    list renderrules = [];&lt;br /&gt;
    integer loop = 0;&lt;br /&gt;
    while(loop &amp;lt; 5)&lt;br /&gt;
    {&lt;br /&gt;
        string part = llGetSubString(output,(2*loop),(2*loop)+1);&lt;br /&gt;
        if(part == &amp;quot;  &amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            // empty&lt;br /&gt;
            renderrules = renderrules + [PRIM_COLOR,llList2Integer(faces,loop),&amp;lt;1,1,1&amp;gt;,0,PRIM_GLOW,llList2Integer(faces,loop),0];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            integer Y_offset = (integer)llGetSubString(part,0,0);&lt;br /&gt;
            integer X_offset = (integer)llGetSubString(part,1,1);&lt;br /&gt;
            if(llGetSubString(part,0,0) == &amp;quot; &amp;quot;)  Y_offset = 10; // left side empty &lt;br /&gt;
            else if(llGetSubString(part,1,1) == &amp;quot; &amp;quot;) Y_offset = 11; // right side empty&lt;br /&gt;
            vector start = llList2Vector(grid_offset_starts,loop);&lt;br /&gt;
            start = &amp;lt;fix(start.x + (0.1 * X_offset)),fix(start.y + (-0.083333333 * Y_offset)),0&amp;gt;;&lt;br /&gt;
            renderrules = renderrules + [PRIM_TEXTURE,llList2Integer(faces,loop),texture,repeats_config+llList2Vector(repeats_corrections,loop),start,0,PRIM_COLOR,llList2Integer(faces,loop),render_color,1,PRIM_GLOW,llList2Integer(faces,loop),glow_amount];&lt;br /&gt;
        }&lt;br /&gt;
        loop++;        &lt;br /&gt;
    }&lt;br /&gt;
    llSetLinkPrimitiveParamsFast(render_to_prim_number,renderrules);&lt;br /&gt;
            &lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        render(&amp;quot;1234567890&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Texture layout==&lt;br /&gt;
&amp;lt;p&amp;gt; the texture is setup in a 10x12 format as follows.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00 01 02 03 04 05 06 07 08 09&lt;br /&gt;
10 11 12 13 14 15 16 17 18 19&lt;br /&gt;
20 21 22 23 24 25 26 27 28 29&lt;br /&gt;
30 31 32 33 34 35 36 37 38 39&lt;br /&gt;
40 41 42 43 44 45 46 47 48 49&lt;br /&gt;
50 51 52 53 54 55 56 57 58 59&lt;br /&gt;
60 61 62 63 64 65 66 67 68 69&lt;br /&gt;
70 71 72 73 74 75 76 77 78 79&lt;br /&gt;
80 81 82 83 84 85 86 87 88 89&lt;br /&gt;
90 91 92 93 94 95 96 97 98 99&lt;br /&gt;
_0 _1 _2 _3 _4 _5 _6 _7 _8 _9&lt;br /&gt;
0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Improvements==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
there are some improvements that could be made&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
1: Change the texture format to 11x11 to improve the quality of the numbers.&amp;lt;br/&amp;gt;&lt;br /&gt;
2: Change the while loop to a for loop if that saves memory.&amp;lt;br/&amp;gt;&lt;br /&gt;
3: Change the way it builds rules if a way is found that saves script memory.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=NumPad&amp;diff=1176214</id>
		<title>NumPad</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=NumPad&amp;diff=1176214"/>
		<updated>2013-01-17T03:00:49Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: added Improvement ideas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
Scripting tools to allow display of text on a prim: [[XyText 1.5]] , [[XyzzyText]], [[XyyyyzText]], [[XyText-UTF8]], [[XyzzyText-UTF8]], [[ZZText]], [[VariText]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NumPad&#039;&#039;&#039; is a variant of the text on a prim but with some changes&lt;br /&gt;
&lt;br /&gt;
* 1 texture vs 5 textures needed for XyText 1.5 &#039;to render numbers&#039;&lt;br /&gt;
* Numbers and spaces only.&lt;br /&gt;
* About 73 lines of code.&lt;br /&gt;
&lt;br /&gt;
=Copyright &amp;amp; Licensing=&lt;br /&gt;
&amp;lt;font size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
* Madpeter Zond hereby releases his contributions to this under the MIT license. [Starting texture and Starting code]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=NumPad 10digits=&lt;br /&gt;
&lt;br /&gt;
Quickstart:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Take a copy of the 10 char prim setup from [[XyText 1.5]] and setup a prim&lt;br /&gt;
* After running the code create a new script and copy the NumPad code to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Set render_to_prim_number to the number of the prim you wish to render to,&lt;br /&gt;
* if you dont know the number you can put the script inside of the prim you want&lt;br /&gt;
* and not change this.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    NumPad&lt;br /&gt;
    ----------------&lt;br /&gt;
    Version: 1.0&lt;br /&gt;
    By: Madpeter Zond&lt;br /&gt;
    About: A 1 texture 10 digit number display&lt;br /&gt;
           great for a score output.&lt;br /&gt;
*/&lt;br /&gt;
string texture = &amp;quot;31f72af5-dee3-72f5-3981-bde21bf85e9c&amp;quot;;&lt;br /&gt;
integer render_to_prim_number = LINK_THIS;&lt;br /&gt;
vector render_color = &amp;lt;1,1,1&amp;gt;;&lt;br /&gt;
float glow_amount = 0.00;&lt;br /&gt;
&lt;br /&gt;
// please dont change this unless you want to break something ^_^&lt;br /&gt;
list faces = [3,7,4,6,1];&lt;br /&gt;
list grid_offset_starts = [&amp;lt;-0.38941,-0.54747,0&amp;gt;  ,&amp;lt;-0.44939,-0.54750,0&amp;gt;,  &amp;lt;0.01800,0.45256,0&amp;gt;,&amp;lt;-0.44939,-0.54750,0&amp;gt;,&amp;lt;-0.50941,-0.54747,0&amp;gt;];&lt;br /&gt;
list repeats_corrections = [&amp;lt;0.1,0,0&amp;gt;,&amp;lt;0,0,0&amp;gt;,&amp;lt;-1.35,0,0&amp;gt;,&amp;lt;0,0,0&amp;gt;,&amp;lt;0.1,0,0&amp;gt;];&lt;br /&gt;
vector repeats_config = &amp;lt;0.1,0.083333,0&amp;gt;;&lt;br /&gt;
float fix(float input)  // render blocking fix [haxy]   &lt;br /&gt;
{&lt;br /&gt;
     if(input &amp;gt; 1.0) input -= 1.0;&lt;br /&gt;
     else if(input &amp;lt; -1.0) input += 1.0;&lt;br /&gt;
     return input; &lt;br /&gt;
}&lt;br /&gt;
render(string output)&lt;br /&gt;
{&lt;br /&gt;
    while(llStringLength(output) &amp;lt; 10) { output = &amp;quot;&amp;quot;+output+&amp;quot; &amp;quot;; }&lt;br /&gt;
    list renderrules = [];&lt;br /&gt;
    integer loop = 0;&lt;br /&gt;
    while(loop &amp;lt; 5)&lt;br /&gt;
    {&lt;br /&gt;
        string part = llGetSubString(output,(2*loop),(2*loop)+1);&lt;br /&gt;
        if(part == &amp;quot;  &amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            // empty&lt;br /&gt;
            renderrules = renderrules + [PRIM_COLOR,llList2Integer(faces,loop),&amp;lt;1,1,1&amp;gt;,0,PRIM_GLOW,llList2Integer(faces,loop),0];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            integer Y_offset = (integer)llGetSubString(part,0,0);&lt;br /&gt;
            integer X_offset = (integer)llGetSubString(part,1,1);&lt;br /&gt;
            if(llGetSubString(part,0,0) == &amp;quot; &amp;quot;)  Y_offset = 11; // left side empty &lt;br /&gt;
            else if(llGetSubString(part,1,1) == &amp;quot; &amp;quot;) Y_offset = 12; // right side empty&lt;br /&gt;
            vector start = llList2Vector(grid_offset_starts,loop);&lt;br /&gt;
            start = &amp;lt;fix(start.x + (0.1 * X_offset)),fix(start.y + (-0.083333333 * Y_offset)),0&amp;gt;;&lt;br /&gt;
            renderrules = renderrules + [PRIM_TEXTURE,llList2Integer(faces,loop),texture,repeats_config+llList2Vector(repeats_corrections,loop),start,0,PRIM_COLOR,llList2Integer(faces,loop),render_color,1,PRIM_GLOW,llList2Integer(faces,loop),glow_amount];&lt;br /&gt;
        }&lt;br /&gt;
        loop++;        &lt;br /&gt;
    }&lt;br /&gt;
    llSetLinkPrimitiveParamsFast(render_to_prim_number,renderrules);&lt;br /&gt;
            &lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        render(&amp;quot;1234567890&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Texture layout==&lt;br /&gt;
&amp;lt;p&amp;gt; the texture is setup in a 10x12 format as follows.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00 01 02 03 04 05 06 07 08 09&lt;br /&gt;
10 11 12 13 14 15 16 17 18 19&lt;br /&gt;
20 21 22 23 24 25 26 27 28 29&lt;br /&gt;
30 31 32 33 34 35 36 37 38 39&lt;br /&gt;
40 41 42 43 44 45 46 47 48 49&lt;br /&gt;
50 51 52 53 54 55 56 57 58 59&lt;br /&gt;
60 61 62 63 64 65 66 67 68 69&lt;br /&gt;
70 71 72 73 74 75 76 77 78 79&lt;br /&gt;
80 81 82 83 84 85 86 87 88 89&lt;br /&gt;
90 91 92 93 94 95 96 97 98 99&lt;br /&gt;
_0 _1 _2 _3 _4 _5 _6 _7 _8 _9&lt;br /&gt;
0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Improvements==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
there are some improvements that could be made&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
1: Change the texture format to 11x11 to improve the quality of the numbers.&amp;lt;br/&amp;gt;&lt;br /&gt;
2: Change the while loop to a for loop if that saves memory.&amp;lt;br/&amp;gt;&lt;br /&gt;
3: Change the way it builds rules if a way is found that saves script memory.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=NumPad&amp;diff=1176213</id>
		<title>NumPad</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=NumPad&amp;diff=1176213"/>
		<updated>2013-01-17T02:57:31Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: added Texture layout info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
Scripting tools to allow display of text on a prim: [[XyText 1.5]] , [[XyzzyText]], [[XyyyyzText]], [[XyText-UTF8]], [[XyzzyText-UTF8]], [[ZZText]], [[VariText]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NumPad&#039;&#039;&#039; is a variant of the text on a prim but with some changes&lt;br /&gt;
&lt;br /&gt;
* 1 texture vs 5 textures needed for XyText 1.5 &#039;to render numbers&#039;&lt;br /&gt;
* Numbers and spaces only.&lt;br /&gt;
* About 73 lines of code.&lt;br /&gt;
&lt;br /&gt;
=Copyright &amp;amp; Licensing=&lt;br /&gt;
&amp;lt;font size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
* Madpeter Zond hereby releases his contributions to this under the MIT license. [Starting texture and Starting code]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=NumPad 10digits=&lt;br /&gt;
&lt;br /&gt;
Quickstart:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Take a copy of the 10 char prim setup from [[XyText 1.5]] and setup a prim&lt;br /&gt;
* After running the code create a new script and copy the NumPad code to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Set render_to_prim_number to the number of the prim you wish to render to,&lt;br /&gt;
* if you dont know the number you can put the script inside of the prim you want&lt;br /&gt;
* and not change this.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    NumPad&lt;br /&gt;
    ----------------&lt;br /&gt;
    Version: 1.0&lt;br /&gt;
    By: Madpeter Zond&lt;br /&gt;
    About: A 1 texture 10 digit number display&lt;br /&gt;
           great for a score output.&lt;br /&gt;
*/&lt;br /&gt;
string texture = &amp;quot;31f72af5-dee3-72f5-3981-bde21bf85e9c&amp;quot;;&lt;br /&gt;
integer render_to_prim_number = LINK_THIS;&lt;br /&gt;
vector render_color = &amp;lt;1,1,1&amp;gt;;&lt;br /&gt;
float glow_amount = 0.00;&lt;br /&gt;
&lt;br /&gt;
// please dont change this unless you want to break something ^_^&lt;br /&gt;
list faces = [3,7,4,6,1];&lt;br /&gt;
list grid_offset_starts = [&amp;lt;-0.38941,-0.54747,0&amp;gt;  ,&amp;lt;-0.44939,-0.54750,0&amp;gt;,  &amp;lt;0.01800,0.45256,0&amp;gt;,&amp;lt;-0.44939,-0.54750,0&amp;gt;,&amp;lt;-0.50941,-0.54747,0&amp;gt;];&lt;br /&gt;
list repeats_corrections = [&amp;lt;0.1,0,0&amp;gt;,&amp;lt;0,0,0&amp;gt;,&amp;lt;-1.35,0,0&amp;gt;,&amp;lt;0,0,0&amp;gt;,&amp;lt;0.1,0,0&amp;gt;];&lt;br /&gt;
vector repeats_config = &amp;lt;0.1,0.083333,0&amp;gt;;&lt;br /&gt;
float fix(float input)  // render blocking fix [haxy]   &lt;br /&gt;
{&lt;br /&gt;
     if(input &amp;gt; 1.0) input -= 1.0;&lt;br /&gt;
     else if(input &amp;lt; -1.0) input += 1.0;&lt;br /&gt;
     return input; &lt;br /&gt;
}&lt;br /&gt;
render(string output)&lt;br /&gt;
{&lt;br /&gt;
    while(llStringLength(output) &amp;lt; 10) { output = &amp;quot;&amp;quot;+output+&amp;quot; &amp;quot;; }&lt;br /&gt;
    list renderrules = [];&lt;br /&gt;
    integer loop = 0;&lt;br /&gt;
    while(loop &amp;lt; 5)&lt;br /&gt;
    {&lt;br /&gt;
        string part = llGetSubString(output,(2*loop),(2*loop)+1);&lt;br /&gt;
        if(part == &amp;quot;  &amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            // empty&lt;br /&gt;
            renderrules = renderrules + [PRIM_COLOR,llList2Integer(faces,loop),&amp;lt;1,1,1&amp;gt;,0,PRIM_GLOW,llList2Integer(faces,loop),0];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            integer Y_offset = (integer)llGetSubString(part,0,0);&lt;br /&gt;
            integer X_offset = (integer)llGetSubString(part,1,1);&lt;br /&gt;
            if(llGetSubString(part,0,0) == &amp;quot; &amp;quot;)  Y_offset = 11; // left side empty &lt;br /&gt;
            else if(llGetSubString(part,1,1) == &amp;quot; &amp;quot;) Y_offset = 12; // right side empty&lt;br /&gt;
            vector start = llList2Vector(grid_offset_starts,loop);&lt;br /&gt;
            start = &amp;lt;fix(start.x + (0.1 * X_offset)),fix(start.y + (-0.083333333 * Y_offset)),0&amp;gt;;&lt;br /&gt;
            renderrules = renderrules + [PRIM_TEXTURE,llList2Integer(faces,loop),texture,repeats_config+llList2Vector(repeats_corrections,loop),start,0,PRIM_COLOR,llList2Integer(faces,loop),render_color,1,PRIM_GLOW,llList2Integer(faces,loop),glow_amount];&lt;br /&gt;
        }&lt;br /&gt;
        loop++;        &lt;br /&gt;
    }&lt;br /&gt;
    llSetLinkPrimitiveParamsFast(render_to_prim_number,renderrules);&lt;br /&gt;
            &lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        render(&amp;quot;1234567890&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Texture layout==&lt;br /&gt;
&amp;lt;p&amp;gt; the texture is setup in a 10x12 format as follows.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00 01 02 03 04 05 06 07 08 09&lt;br /&gt;
10 11 12 13 14 15 16 17 18 19&lt;br /&gt;
20 21 22 23 24 25 26 27 28 29&lt;br /&gt;
30 31 32 33 34 35 36 37 38 39&lt;br /&gt;
40 41 42 43 44 45 46 47 48 49&lt;br /&gt;
50 51 52 53 54 55 56 57 58 59&lt;br /&gt;
60 61 62 63 64 65 66 67 68 69&lt;br /&gt;
70 71 72 73 74 75 76 77 78 79&lt;br /&gt;
80 81 82 83 84 85 86 87 88 89&lt;br /&gt;
90 91 92 93 94 95 96 97 98 99&lt;br /&gt;
_0 _1 _2 _3 _4 _5 _6 _7 _8 _9&lt;br /&gt;
0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=XyText_1.5&amp;diff=1176212</id>
		<title>XyText 1.5</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=XyText_1.5&amp;diff=1176212"/>
		<updated>2013-01-17T02:54:28Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: added link to numpad&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
Scripting tools to allow display of text on a prim: [[XyText 1.5]] , [[XyzzyText]], [[XyyyyzText]], [[XyzzyText-UTF8]], [[ZZText]], [[VariText]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;XyText 1.5&#039;&#039;&#039; is a variation of XyText allowing up to 10 characters on a prim. All scripts are included.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Also see [[XyzzyText]] for a much more efficient alternative for larger displays.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Additionally refer to [[ZZText]] and [[XyzzyText-UTF8]] for using International characters in your boards.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For a 1 texture numbers only refer to [[NumPad]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==XyText Setup==&lt;br /&gt;
The prim size script:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
////////////////////////////////////////////&lt;br /&gt;
// XyText v1.0.3 Prim Setup Script (5 Face, Multi Texture)&lt;br /&gt;
//&lt;br /&gt;
// Rewritten by Tdub Dowler&lt;br /&gt;
//&lt;br /&gt;
////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
string FACE_TEXTURE = &amp;quot;09b04244-9569-d21f-6de0-4bbcf5552222&amp;quot;;&lt;br /&gt;
string  TRANSPARENT = &amp;quot;701917a8-d614-471f-13dd-5f4644e36e3c&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetLinkPrimitiveParamsFast(LINK_THIS, [&lt;br /&gt;
            PRIM_TYPE, PRIM_TYPE_PRISM, PRIM_HOLE_SQUARE, &amp;lt;0.199, 0.8, 0.0&amp;gt;, 0.30,&lt;br /&gt;
            ZERO_VECTOR, &amp;lt;1.0, 1.0, 0.0&amp;gt;, ZERO_VECTOR,&lt;br /&gt;
&lt;br /&gt;
            // display a default face texture&lt;br /&gt;
            PRIM_TEXTURE, 1, FACE_TEXTURE, &amp;lt;2.48, 1.0, 0.0&amp;gt;, &amp;lt;-0.740013, 0.0, 0.0&amp;gt;, 0.0,&lt;br /&gt;
            PRIM_TEXTURE, 6, FACE_TEXTURE, &amp;lt;1.0, 1.0, 0.0&amp;gt;, &amp;lt;0.0, 0.0, 0.0&amp;gt;, 0.0,&lt;br /&gt;
            PRIM_TEXTURE, 4, FACE_TEXTURE, &amp;lt;-14.75, 1.0, 0.0&amp;gt;, &amp;lt;0.130009, 0.0, 0.0&amp;gt;, 0.0,&lt;br /&gt;
            PRIM_TEXTURE, 7, FACE_TEXTURE, &amp;lt;1.0, 1.0, 0.0&amp;gt;, &amp;lt;0.0, 0.0, 0.0&amp;gt;, 0.0,&lt;br /&gt;
            PRIM_TEXTURE, 3, FACE_TEXTURE, &amp;lt;2.48, 1.0, 0.0&amp;gt;, &amp;lt;-0.255989, 0.0, 0.0&amp;gt;, 0.0,&lt;br /&gt;
&lt;br /&gt;
            // show transparent textures for the other sides&lt;br /&gt;
            PRIM_TEXTURE, 0, TRANSPARENT, &amp;lt;0.1, 0.1, 0.0&amp;gt;, ZERO_VECTOR, 0.0,&lt;br /&gt;
            PRIM_TEXTURE, 2, TRANSPARENT, &amp;lt;0.1, 0.1, 0.0&amp;gt;, ZERO_VECTOR, 0.0,&lt;br /&gt;
            PRIM_TEXTURE, 5, TRANSPARENT, &amp;lt;0.1, 0.1, 0.0&amp;gt;, ZERO_VECTOR, 0.0,&lt;br /&gt;
&lt;br /&gt;
            PRIM_SIZE, &amp;lt;0.03, 2.89, 0.5&amp;gt;]);&lt;br /&gt;
&lt;br /&gt;
        // Remove ourselves from inventory.&lt;br /&gt;
        llRemoveInventory(llGetScriptName());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==XyText==&lt;br /&gt;
The modified XyText cell script (written by Xylor Baysklef)&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
////////////////////////////////////////////&lt;br /&gt;
// XyText v1.0.3 Script (5 Face, Multi Texture)&lt;br /&gt;
//&lt;br /&gt;
// Written by Xylor Baysklef&lt;br /&gt;
//&lt;br /&gt;
// Modified by Thraxis Epsilon January 20, 2006&lt;br /&gt;
// Added Support for 5 Face Prim, based on modification&lt;br /&gt;
// of XyText v1.1.1 by Kermitt Quick for Single Texture.&lt;br /&gt;
//&lt;br /&gt;
////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
/////////////// CONSTANTS ///////////////////&lt;br /&gt;
// XyText Message Map.&lt;br /&gt;
integer DISPLAY_STRING      = 204000;&lt;br /&gt;
integer DISPLAY_EXTENDED    = 204001;&lt;br /&gt;
integer REMAP_INDICES       = 204002;&lt;br /&gt;
integer RESET_INDICES       = 204003;&lt;br /&gt;
integer SET_CELL_INFO       = 204004;&lt;br /&gt;
integer SET_THICKNESS       = 204006;&lt;br /&gt;
integer SET_COLOR           = 204007;&lt;br /&gt;
 &lt;br /&gt;
// This is an extended character escape sequence.&lt;br /&gt;
string  ESCAPE_SEQUENCE = &amp;quot;\\e&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
// This is used to get an index for the extended character.&lt;br /&gt;
string  EXTENDED_INDEX  = &amp;quot;123456789abcdef&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
// Face numbers.&lt;br /&gt;
integer FACE_1          = 3;&lt;br /&gt;
integer FACE_2          = 7;&lt;br /&gt;
integer FACE_3          = 4;&lt;br /&gt;
integer FACE_4          = 6;&lt;br /&gt;
integer FACE_5          = 1;&lt;br /&gt;
 &lt;br /&gt;
// Used to hide the text after a fade-out.&lt;br /&gt;
key		TRANSPARENT     = &amp;quot;701917a8-d614-471f-13dd-5f4644e36e3c&amp;quot;;&lt;br /&gt;
// This is a list of textures for all 2-character combinations.&lt;br /&gt;
list	CHARACTER_GRID  = [&lt;br /&gt;
        &amp;quot;00e9f9f7-0669-181c-c192-7f8e67678c8d&amp;quot;,&lt;br /&gt;
        &amp;quot;347a5cb6-0031-7ec0-2fcf-f298eebf3c0e&amp;quot;,&lt;br /&gt;
        &amp;quot;4e7e689e-37f1-9eca-8596-a958bbd23963&amp;quot;,&lt;br /&gt;
        &amp;quot;19ea9c21-67ba-8f6f-99db-573b1b877eb1&amp;quot;,&lt;br /&gt;
        &amp;quot;dde7b412-cda1-652f-6fc2-73f4641f96e1&amp;quot;,&lt;br /&gt;
        &amp;quot;af6fa3bb-3a6c-9c4f-4bf5-d1c126c830da&amp;quot;,&lt;br /&gt;
        &amp;quot;a201d3a2-364b-43b6-8686-5881c0f82a94&amp;quot;,&lt;br /&gt;
        &amp;quot;b674dec8-fead-99e5-c28d-2db8e4c51540&amp;quot;,&lt;br /&gt;
        &amp;quot;366e05f3-be6b-e5cf-c33b-731dff649caa&amp;quot;,&lt;br /&gt;
        &amp;quot;75c4925c-0427-dc0c-c71c-e28674ff4d27&amp;quot;,&lt;br /&gt;
        &amp;quot;dcbe166b-6a97-efb2-fc8e-e5bc6a8b1be6&amp;quot;,&lt;br /&gt;
        &amp;quot;0dca2feb-fc66-a762-db85-89026a4ecd68&amp;quot;,&lt;br /&gt;
        &amp;quot;a0fca76f-503a-946b-9336-0a918e886f7a&amp;quot;,&lt;br /&gt;
        &amp;quot;67fb375d-89a1-5a4f-8c7a-0cd1c066ffc4&amp;quot;,&lt;br /&gt;
        &amp;quot;300470b2-da34-5470-074c-1b8464ca050c&amp;quot;,&lt;br /&gt;
        &amp;quot;d1f8e91c-ce2b-d85e-2120-930d3b630946&amp;quot;,&lt;br /&gt;
        &amp;quot;2a190e44-7b29-dadb-0bff-c31adaf5a170&amp;quot;,&lt;br /&gt;
        &amp;quot;75d55e71-f6f8-9835-e746-a45f189f30a1&amp;quot;,&lt;br /&gt;
        &amp;quot;300fac33-2b30-3da3-26bc-e2d70428ec19&amp;quot;,&lt;br /&gt;
        &amp;quot;0747c776-011a-53ce-13ee-8b5bb9e87c1e&amp;quot;,&lt;br /&gt;
        &amp;quot;85a855c3-a94f-01ca-33e0-7dde92e727e2&amp;quot;,&lt;br /&gt;
        &amp;quot;cbc1dab2-2d61-2986-1949-7a5235c954e1&amp;quot;,&lt;br /&gt;
        &amp;quot;f7aef047-f266-9596-16df-641010edd8e1&amp;quot;,&lt;br /&gt;
        &amp;quot;4c34ebf7-e5e1-2e1a-579f-e224d9d5e71b&amp;quot;,&lt;br /&gt;
        &amp;quot;4a69e98c-26a5-ad05-e92e-b5b906ad9ef9&amp;quot;,&lt;br /&gt;
        &amp;quot;462a9226-2a97-91ac-2d89-57ab33334b78&amp;quot;,&lt;br /&gt;
        &amp;quot;20b24b3a-8c57-82ee-c6ed-555003f5dbcd&amp;quot;,&lt;br /&gt;
        &amp;quot;9b481daa-9ea8-a9fa-1ee4-ab9a0d38e217&amp;quot;,&lt;br /&gt;
        &amp;quot;c231dbdc-c842-15b0-7aa6-6da14745cfdc&amp;quot;,&lt;br /&gt;
        &amp;quot;c97e3cbb-c9a3-45df-a0ae-955c1f4bf9cf&amp;quot;,&lt;br /&gt;
        &amp;quot;f1e7d030-ff80-a242-cb69-f6951d4eae3b&amp;quot;,&lt;br /&gt;
        &amp;quot;ed32d6c4-d733-c0f1-f242-6df1d222220d&amp;quot;,&lt;br /&gt;
        &amp;quot;88f96a30-dccf-9b20-31ef-da0dfeb23c72&amp;quot;,&lt;br /&gt;
        &amp;quot;252f2595-58b8-4bcc-6515-fa274d0cfb65&amp;quot;,&lt;br /&gt;
        &amp;quot;f2838c4f-de80-cced-dff8-195dfdf36b2c&amp;quot;,&lt;br /&gt;
        &amp;quot;cc2594fe-add2-a3df-cdb3-a61711badf53&amp;quot;,&lt;br /&gt;
        &amp;quot;e0ce2972-da00-955c-129e-3289b3676776&amp;quot;,&lt;br /&gt;
        &amp;quot;3e0d336d-321f-ddfa-5c1b-e26131766f6a&amp;quot;,&lt;br /&gt;
        &amp;quot;d43b1dc4-6b51-76a7-8b90-38865b82bf06&amp;quot;,&lt;br /&gt;
        &amp;quot;06d16cbb-1868-fd1d-5c93-eae42164a37d&amp;quot;,&lt;br /&gt;
        &amp;quot;dd5d98cf-273e-3fd0-f030-48be58ee3a0b&amp;quot;,&lt;br /&gt;
        &amp;quot;0e47c89e-de4a-6233-a2da-cb852aad1b00&amp;quot;,&lt;br /&gt;
        &amp;quot;fb9c4a55-0e13-495b-25c4-f0b459dc06de&amp;quot;,&lt;br /&gt;
        &amp;quot;e3ce8def-312c-735b-0e48-018b6799c883&amp;quot;,&lt;br /&gt;
        &amp;quot;2f713216-4e71-d123-03ed-9c8554710c6b&amp;quot;,&lt;br /&gt;
        &amp;quot;4a417d8a-1f4f-404b-9783-6672f8527911&amp;quot;,&lt;br /&gt;
        &amp;quot;ca5e21ec-5b20-5909-4c31-3f90d7316b33&amp;quot;,&lt;br /&gt;
        &amp;quot;06a4fcc3-e1c4-296d-8817-01f88fbd7367&amp;quot;,&lt;br /&gt;
        &amp;quot;130ac084-6f3c-95de-b5b6-d25c80703474&amp;quot;,&lt;br /&gt;
        &amp;quot;59d540a0-ae9d-3606-5ae0-4f2842b64cfa&amp;quot;,&lt;br /&gt;
        &amp;quot;8612ae9a-f53c-5bf4-2899-8174d7abc4fd&amp;quot;,&lt;br /&gt;
        &amp;quot;12467401-e979-2c49-34e0-6ac761542797&amp;quot;,&lt;br /&gt;
        &amp;quot;d53c3eaa-0404-3860-0675-3e375596c3e3&amp;quot;,&lt;br /&gt;
        &amp;quot;9f5b26bd-81d3-b25e-62fe-5b671d1e3e79&amp;quot;,&lt;br /&gt;
        &amp;quot;f57f0b64-a050-d617-ee00-c8e9e3adc9cb&amp;quot;,&lt;br /&gt;
        &amp;quot;beff166a-f5f3-f05e-e020-98f2b00e27ed&amp;quot;,&lt;br /&gt;
        &amp;quot;02278a65-94ba-6d5e-0d2b-93f2e4f4bf70&amp;quot;,&lt;br /&gt;
        &amp;quot;a707197d-449e-5b58-846c-0c850c61f9d6&amp;quot;,&lt;br /&gt;
        &amp;quot;021d4b1a-9503-a44f-ee2b-976eb5d80e68&amp;quot;,&lt;br /&gt;
        &amp;quot;0ae2ffae-7265-524d-cb76-c2b691992706&amp;quot;,&lt;br /&gt;
        &amp;quot;f6e41cf2-1104-bd0b-0190-dffad1bac813&amp;quot;,&lt;br /&gt;
        &amp;quot;2b4bb15e-956d-56ae-69f5-d26a20de0ce7&amp;quot;,&lt;br /&gt;
        &amp;quot;f816da2c-51f1-612a-2029-a542db7db882&amp;quot;,&lt;br /&gt;
        &amp;quot;345fea05-c7be-465c-409f-9dcb3bd2aa07&amp;quot;,&lt;br /&gt;
        &amp;quot;b3017e02-c063-5185-acd5-1ef5f9d79b89&amp;quot;,&lt;br /&gt;
        &amp;quot;4dcff365-1971-3c2b-d73c-77e1dc54242a&amp;quot;&lt;br /&gt;
        ];&lt;br /&gt;
 &lt;br /&gt;
///////////// END CONSTANTS ////////////////&lt;br /&gt;
 &lt;br /&gt;
///////////// GLOBAL VARIABLES ///////////////&lt;br /&gt;
// All displayable characters.  Default to ASCII order.&lt;br /&gt;
string gCharIndex;&lt;br /&gt;
// This is the channel to listen on while acting&lt;br /&gt;
// as a cell in a larger display.&lt;br /&gt;
integer gCellChannel      = -1;&lt;br /&gt;
// This is the starting character position in the cell channel message&lt;br /&gt;
// to render.&lt;br /&gt;
integer gCellCharPosition = 0;&lt;br /&gt;
// This is whether or not to use the fade in/out special effect.&lt;br /&gt;
integer gCellUseFading      = FALSE;&lt;br /&gt;
// This is how long to display the text before fading out (if using&lt;br /&gt;
// fading special effect).&lt;br /&gt;
// Note: &amp;lt; 0  means don&#039;t fade out.&lt;br /&gt;
float   gCellHoldDelay      = 1.0;&lt;br /&gt;
/////////// END GLOBAL VARIABLES ////////////&lt;br /&gt;
 &lt;br /&gt;
ResetCharIndex()&lt;br /&gt;
{&lt;br /&gt;
    gCharIndex  = &amp;quot; !\&amp;quot;#$%&amp;amp;&#039;()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`&amp;quot;;&lt;br /&gt;
    // \&amp;quot; &amp;lt;-- Fixes LSL syntax highlighting bug.&lt;br /&gt;
    gCharIndex += &amp;quot;abcdefghijklmnopqrstuvwxyz{|}~&amp;quot;;&lt;br /&gt;
    gCharIndex += &amp;quot;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector GetGridPos(integer index1, integer index2)&lt;br /&gt;
{&lt;br /&gt;
    // There are two ways to use the lookup table...&lt;br /&gt;
    integer Col;&lt;br /&gt;
    integer Row;&lt;br /&gt;
    if (index1 &amp;gt;= index2)&lt;br /&gt;
    {&lt;br /&gt;
        // In this case, the row is the index of the first character:&lt;br /&gt;
        Row = index1;&lt;br /&gt;
        // And the col is the index of the second character (x2)&lt;br /&gt;
        Col = index2 * 2;&lt;br /&gt;
    }&lt;br /&gt;
    // Index1 &amp;lt; Index2&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        // In this case, the row is the index of the second character:&lt;br /&gt;
        Row = index2;&lt;br /&gt;
        // And the col is the index of the first character, x2, offset by 1.&lt;br /&gt;
        Col = index1 * 2 + 1;&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;lt;Col, Row, 0&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
string GetGridTexture(vector grid_pos)&lt;br /&gt;
{&lt;br /&gt;
    // Calculate the texture in the grid to use.&lt;br /&gt;
    integer GridCol = llRound(grid_pos.x) / 20;&lt;br /&gt;
    integer GridRow = llRound(grid_pos.y) / 10;&lt;br /&gt;
 &lt;br /&gt;
    // Lookup the texture.&lt;br /&gt;
    key Texture = llList2Key(CHARACTER_GRID, GridRow * (GridRow + 1) / 2 + GridCol);&lt;br /&gt;
    return Texture;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector GetGridOffset(vector grid_pos)&lt;br /&gt;
{&lt;br /&gt;
    // Zoom in on the texture showing our character pair.&lt;br /&gt;
    integer Col = llRound(grid_pos.x) % 20;&lt;br /&gt;
    integer Row = llRound(grid_pos.y) % 10;&lt;br /&gt;
 &lt;br /&gt;
    // Return the offset in the texture.&lt;br /&gt;
    return &amp;lt;-0.45 + 0.05 * Col, 0.45 - 0.1 * Row, 0.0&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
ShowChars(vector grid_pos1, vector grid_pos2, vector grid_pos3, vector grid_pos4, vector grid_pos5)&lt;br /&gt;
{&lt;br /&gt;
   // Set the primitive textures directly.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    llSetLinkPrimitiveParamsFast(LINK_THIS, [&lt;br /&gt;
        PRIM_TEXTURE, FACE_1, GetGridTexture(grid_pos1), &amp;lt;0.25, 0.1, 0&amp;gt;, GetGridOffset(grid_pos1) + &amp;lt;0.075, 0, 0&amp;gt;, 0.0,&lt;br /&gt;
        PRIM_TEXTURE, FACE_2, GetGridTexture(grid_pos2), &amp;lt;0.1, 0.1, 0&amp;gt;, GetGridOffset(grid_pos2), 0.0,&lt;br /&gt;
        PRIM_TEXTURE, FACE_3, GetGridTexture(grid_pos3), &amp;lt;-1.48, 0.1, 0&amp;gt;, GetGridOffset(grid_pos3)+ &amp;lt;0.37, 0, 0&amp;gt;, 0.0,&lt;br /&gt;
        PRIM_TEXTURE, FACE_4, GetGridTexture(grid_pos4), &amp;lt;0.1, 0.1, 0&amp;gt;, GetGridOffset(grid_pos4), 0.0,&lt;br /&gt;
        PRIM_TEXTURE, FACE_5, GetGridTexture(grid_pos5), &amp;lt;0.25, 0.1, 0&amp;gt;, GetGridOffset(grid_pos5) - &amp;lt;0.075, 0, 0&amp;gt;, 0.0]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
RenderString(string str)&lt;br /&gt;
{&lt;br /&gt;
    // Get the grid positions for each pair of characters.&lt;br /&gt;
    vector GridPos1 = GetGridPos( llSubStringIndex(gCharIndex, llGetSubString(str, 0, 0)),&lt;br /&gt;
                                  llSubStringIndex(gCharIndex, llGetSubString(str, 1, 1)) );&lt;br /&gt;
    vector GridPos2 = GetGridPos( llSubStringIndex(gCharIndex, llGetSubString(str, 2, 2)),&lt;br /&gt;
                                  llSubStringIndex(gCharIndex, llGetSubString(str, 3, 3)) );&lt;br /&gt;
    vector GridPos3 = GetGridPos( llSubStringIndex(gCharIndex, llGetSubString(str, 4, 4)),&lt;br /&gt;
                                  llSubStringIndex(gCharIndex, llGetSubString(str, 5, 5)) );&lt;br /&gt;
    vector GridPos4 = GetGridPos( llSubStringIndex(gCharIndex, llGetSubString(str, 6, 6)),&lt;br /&gt;
                                  llSubStringIndex(gCharIndex, llGetSubString(str, 7, 7)) );&lt;br /&gt;
    vector GridPos5 = GetGridPos( llSubStringIndex(gCharIndex, llGetSubString(str, 8, 8)),&lt;br /&gt;
                                  llSubStringIndex(gCharIndex, llGetSubString(str, 9, 9)) );                                   &lt;br /&gt;
 &lt;br /&gt;
    // Use these grid positions to display the correct textures/offsets.&lt;br /&gt;
    ShowChars(GridPos1, GridPos2, GridPos3, GridPos4, GridPos5);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
RenderWithEffects(string str)&lt;br /&gt;
{&lt;br /&gt;
    // Get the grid positions for each pair of characters.&lt;br /&gt;
    vector GridPos1 = GetGridPos( llSubStringIndex(gCharIndex, llGetSubString(str, 0, 0)),&lt;br /&gt;
                                  llSubStringIndex(gCharIndex, llGetSubString(str, 1, 1)) );&lt;br /&gt;
    vector GridPos2 = GetGridPos( llSubStringIndex(gCharIndex, llGetSubString(str, 2, 2)),&lt;br /&gt;
                                  llSubStringIndex(gCharIndex, llGetSubString(str, 3, 3)) );&lt;br /&gt;
    vector GridPos3 = GetGridPos( llSubStringIndex(gCharIndex, llGetSubString(str, 4, 4)),&lt;br /&gt;
                                  llSubStringIndex(gCharIndex, llGetSubString(str, 5, 5)) );&lt;br /&gt;
    vector GridPos4 = GetGridPos( llSubStringIndex(gCharIndex, llGetSubString(str, 6, 6)),&lt;br /&gt;
                                  llSubStringIndex(gCharIndex, llGetSubString(str, 7, 7)) );&lt;br /&gt;
    vector GridPos5 = GetGridPos( llSubStringIndex(gCharIndex, llGetSubString(str, 8, 8)),&lt;br /&gt;
                                  llSubStringIndex(gCharIndex, llGetSubString(str, 9, 9)) );                                   &lt;br /&gt;
 &lt;br /&gt;
      // First set the alpha to the lowest possible.&lt;br /&gt;
    llSetAlpha(0.05, ALL_SIDES);&lt;br /&gt;
 &lt;br /&gt;
    // Use these grid positions to display the correct textures/offsets.&lt;br /&gt;
    ShowChars(GridPos1, GridPos2, GridPos3, GridPos4, GridPos5);&lt;br /&gt;
 &lt;br /&gt;
    float Alpha;&lt;br /&gt;
    for (Alpha = 0.10; Alpha &amp;lt;= 1.0; Alpha += 0.05)&lt;br /&gt;
    {&lt;br /&gt;
       llSetAlpha(Alpha, ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
    // See if we want to fade out as well.&lt;br /&gt;
    if (gCellHoldDelay &amp;lt; 0.0)&lt;br /&gt;
    {&lt;br /&gt;
       // No, bail out. (Just keep showing the string at full strength).&lt;br /&gt;
       return;&lt;br /&gt;
    }&lt;br /&gt;
    // Hold the text for a while.&lt;br /&gt;
    llSleep(gCellHoldDelay);&lt;br /&gt;
    // Now fade out.&lt;br /&gt;
    for (Alpha = 0.95; Alpha &amp;gt;= 0.05; Alpha -= 0.05)&lt;br /&gt;
    {&lt;br /&gt;
        llSetAlpha(Alpha, ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
    // Make the text transparent to fully hide it.&lt;br /&gt;
    llSetTexture(TRANSPARENT, ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
RenderExtended(string str)&lt;br /&gt;
{&lt;br /&gt;
    // Look for escape sequences.&lt;br /&gt;
    list Parsed       = llParseString2List(str, [], [ESCAPE_SEQUENCE]);&lt;br /&gt;
    integer ParsedLen = llGetListLength(Parsed);&lt;br /&gt;
 &lt;br /&gt;
    // Create a list of index values to work with.&lt;br /&gt;
    list Indices;&lt;br /&gt;
    // We start with room for 6 indices.&lt;br /&gt;
    integer IndicesLeft = 10;&lt;br /&gt;
 &lt;br /&gt;
    integer i;&lt;br /&gt;
    string Token;&lt;br /&gt;
    integer Clipped;&lt;br /&gt;
    integer LastWasEscapeSequence = FALSE;&lt;br /&gt;
    // Work from left to right.&lt;br /&gt;
    for (i = 0; i &amp;lt; ParsedLen &amp;amp;&amp;amp; IndicesLeft &amp;gt; 0; i++)&lt;br /&gt;
    {&lt;br /&gt;
        Token = llList2String(Parsed, i);&lt;br /&gt;
 &lt;br /&gt;
        // If this is an escape sequence, just set the flag and move on.&lt;br /&gt;
        if (Token == ESCAPE_SEQUENCE)&lt;br /&gt;
        {&lt;br /&gt;
            LastWasEscapeSequence = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
        // Token != ESCAPE_SEQUENCE&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // Otherwise this is a normal token.  Check its length.&lt;br /&gt;
            Clipped = FALSE;&lt;br /&gt;
            integer TokenLength = llStringLength(Token);&lt;br /&gt;
            // Clip if necessary.&lt;br /&gt;
            if (TokenLength &amp;gt; IndicesLeft)&lt;br /&gt;
            {&lt;br /&gt;
                Token = llGetSubString(Token, 0, IndicesLeft - 1);&lt;br /&gt;
                TokenLength = llStringLength(Token);&lt;br /&gt;
                IndicesLeft = 0;&lt;br /&gt;
                Clipped = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                IndicesLeft -= TokenLength;&lt;br /&gt;
 &lt;br /&gt;
            // Was the previous token an escape sequence?&lt;br /&gt;
            if (LastWasEscapeSequence)&lt;br /&gt;
            {&lt;br /&gt;
                // Yes, the first character is an escape character, the rest are normal.&lt;br /&gt;
 &lt;br /&gt;
                // This is the extended character.&lt;br /&gt;
                Indices += [llSubStringIndex(EXTENDED_INDEX, llGetSubString(Token, 0, 0)) + 95];&lt;br /&gt;
 &lt;br /&gt;
                // These are the normal characters.&lt;br /&gt;
                integer j;&lt;br /&gt;
                for (j = 1; j &amp;lt; TokenLength; j++)&lt;br /&gt;
                    Indices += [llSubStringIndex(gCharIndex, llGetSubString(Token, j, j))];&lt;br /&gt;
            }&lt;br /&gt;
            // Normal string.&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                // Just add the characters normally.&lt;br /&gt;
                integer j;&lt;br /&gt;
                for (j = 0; j &amp;lt; TokenLength; j++)&lt;br /&gt;
                {&lt;br /&gt;
                    Indices += [llSubStringIndex(gCharIndex, llGetSubString(Token, j, j))];&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            // Unset this flag, since this was not an escape sequence.&lt;br /&gt;
            LastWasEscapeSequence = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // Use the indices to create grid positions.&lt;br /&gt;
    vector GridPos1 = GetGridPos( llList2Integer(Indices, 0), llList2Integer(Indices, 1) );&lt;br /&gt;
    vector GridPos2 = GetGridPos( llList2Integer(Indices, 2), llList2Integer(Indices, 3) );&lt;br /&gt;
    vector GridPos3 = GetGridPos( llList2Integer(Indices, 4), llList2Integer(Indices, 5) );&lt;br /&gt;
    vector GridPos4 = GetGridPos( llList2Integer(Indices, 6), llList2Integer(Indices, 7) );&lt;br /&gt;
    vector GridPos5 = GetGridPos( llList2Integer(Indices, 8), llList2Integer(Indices, 9) );     &lt;br /&gt;
 &lt;br /&gt;
    // Use these grid positions to display the correct textures/offsets.&lt;br /&gt;
    ShowChars(GridPos1, GridPos2, GridPos3, GridPos4, GridPos5);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
integer ConvertIndex(integer index)&lt;br /&gt;
{&lt;br /&gt;
    // This converts from an ASCII based index to our indexing scheme.&lt;br /&gt;
    if (index &amp;gt;= 32) // &#039; &#039; or higher&lt;br /&gt;
        index -= 32;&lt;br /&gt;
    // index &amp;lt; 32&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        // Quick bounds check.&lt;br /&gt;
        if (index &amp;gt; 15)&lt;br /&gt;
            index = 15;&lt;br /&gt;
 &lt;br /&gt;
        index += 94; // extended characters&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    return index;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Initialize the character index.&lt;br /&gt;
        ResetCharIndex();&lt;br /&gt;
 &lt;br /&gt;
        //llSay(0, &amp;quot;Free Memory: &amp;quot; + (string) llGetFreeMemory());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    link_message(integer sender, integer channel, string data, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (channel == DISPLAY_STRING)&lt;br /&gt;
        {&lt;br /&gt;
            RenderString(data);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (channel == DISPLAY_EXTENDED)&lt;br /&gt;
        {&lt;br /&gt;
            RenderExtended(data);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (channel == gCellChannel)&lt;br /&gt;
        {&lt;br /&gt;
            // Extract the characters we are interested in, and use those to render.&lt;br /&gt;
            string TextToRender = llGetSubString(data, gCellCharPosition, gCellCharPosition + 9);&lt;br /&gt;
            if (gCellUseFading)&lt;br /&gt;
               RenderWithEffects( TextToRender );&lt;br /&gt;
            else // !gCellUseFading&lt;br /&gt;
                RenderString( TextToRender );&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (channel == REMAP_INDICES)&lt;br /&gt;
        {&lt;br /&gt;
            // Parse the message, splitting it up into index values.&lt;br /&gt;
            list Parsed = llCSV2List(data);&lt;br /&gt;
            integer i;&lt;br /&gt;
            // Go through the list and swap each pair of indices.&lt;br /&gt;
            for (i = 0; i &amp;lt; llGetListLength(Parsed); i += 2)&lt;br /&gt;
            {&lt;br /&gt;
                integer Index1 = ConvertIndex( llList2Integer(Parsed, i) );&lt;br /&gt;
                integer Index2 = ConvertIndex( llList2Integer(Parsed, i + 1) );&lt;br /&gt;
 &lt;br /&gt;
                // Swap these index values.&lt;br /&gt;
                string Value1 = llGetSubString(gCharIndex, Index1, Index1);&lt;br /&gt;
                string Value2 = llGetSubString(gCharIndex, Index2, Index2);&lt;br /&gt;
 &lt;br /&gt;
                gCharIndex = llDeleteSubString(gCharIndex, Index1, Index1);&lt;br /&gt;
                gCharIndex = llInsertString(gCharIndex, Index1, Value2);&lt;br /&gt;
 &lt;br /&gt;
                gCharIndex = llDeleteSubString(gCharIndex, Index2, Index2);&lt;br /&gt;
                gCharIndex = llInsertString(gCharIndex, Index2, Value1);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (channel == RESET_INDICES)&lt;br /&gt;
        {&lt;br /&gt;
            // Restore the character index back to default settings.&lt;br /&gt;
            ResetCharIndex();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (channel == SET_CELL_INFO)&lt;br /&gt;
        {&lt;br /&gt;
            // Change the channel we listen to for cell commands, and the&lt;br /&gt;
            // starting character position to extract from.&lt;br /&gt;
            list Parsed = llCSV2List(data);&lt;br /&gt;
            gCellChannel        = (integer) llList2String(Parsed, 0);&lt;br /&gt;
            gCellCharPosition   = (integer) llList2String(Parsed, 1);&lt;br /&gt;
            gCellUseFading      = (integer) llList2String(Parsed, 2);&lt;br /&gt;
            gCellHoldDelay      = (float)   llList2String(Parsed, 3);             &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (channel == SET_THICKNESS)&lt;br /&gt;
        {&lt;br /&gt;
            // Set our z scale to thickness, while staying fixed&lt;br /&gt;
            // in position relative the prim below us.&lt;br /&gt;
            vector Scale    = llGetScale();&lt;br /&gt;
            float Thickness = (float) data;&lt;br /&gt;
            // Reposition only if this isn&#039;t the root prim.&lt;br /&gt;
            integer ThisLink = llGetLinkNumber();&lt;br /&gt;
            if (ThisLink != 0 || ThisLink != 1) {&lt;br /&gt;
                // This is not the root prim.&lt;br /&gt;
                vector Up = llRot2Up(llGetLocalRot());&lt;br /&gt;
                float DistanceToMove = Thickness / 2.0 - Scale.z / 2.0;&lt;br /&gt;
                vector Pos = llGetLocalPos();&lt;br /&gt;
                llSetPos(Pos + DistanceToMove * Up);&lt;br /&gt;
            }&lt;br /&gt;
            // Apply the new thickness.&lt;br /&gt;
            Scale.z = Thickness;&lt;br /&gt;
            llSetScale(Scale);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (channel == SET_COLOR)&lt;br /&gt;
        {&lt;br /&gt;
           vector newColor = (vector)data;&lt;br /&gt;
           llSetColor(newColor, ALL_SIDES);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==XyText Board Control==&lt;br /&gt;
This last script is a script that allows an unlimited number of cells to be used together. The script:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
////////////////////////////////////////////&lt;br /&gt;
// XyText Board Control&lt;br /&gt;
//&lt;br /&gt;
// Written by Tdub Dowler&lt;br /&gt;
// Modified by Awsoonn Rawley&lt;br /&gt;
// Refactored by Strife Onizuka&lt;br /&gt;
////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/////////////// CONSTANTS /////////////////&lt;br /&gt;
// XyText Message Map.&lt;br /&gt;
integer SET_LINE_CHANNEL    = 100100;&lt;br /&gt;
integer DISPLAY_STRING      = 204000;&lt;br /&gt;
integer DISPLAY_EXTENDED    = 204001;&lt;br /&gt;
integer REMAP_INDICES       = 204002;&lt;br /&gt;
integer RESET_INDICES       = 204003;&lt;br /&gt;
integer SET_CELL_INFO       = 204004;&lt;br /&gt;
string  LOAD_MSG            = &amp;quot;Loading...&amp;quot;;&lt;br /&gt;
///////////// END CONSTANTS ////////////////&lt;br /&gt;
integer prims;&lt;br /&gt;
 &lt;br /&gt;
SetText(string msg)&lt;br /&gt;
{&lt;br /&gt;
    llMessageLinked(LINK_SET, SET_LINE_CHANNEL, msg, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
XytstOrder()&lt;br /&gt;
{ &lt;br /&gt;
    // Fills each cell of the board with it&#039;s number.&lt;br /&gt;
    string  str = &amp;quot;&amp;quot;;&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        str += llGetSubString(&amp;quot;          &amp;quot; + (string)i,-10,-1);&lt;br /&gt;
        llSetText(&amp;quot;Generating Pattern: &amp;quot; + (string)i, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
    }while(++i &amp;lt; prims);&lt;br /&gt;
 &lt;br /&gt;
    llSetText(&amp;quot;Displaying Order Test...&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
 &lt;br /&gt;
    // Send the message&lt;br /&gt;
    llMessageLinked(LINK_SET, SET_LINE_CHANNEL, str, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    llSetText(&amp;quot;&amp;quot;, ZERO_VECTOR, 0.0);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Determin the number of prims.&lt;br /&gt;
        prims = llGetNumberOfPrims();&lt;br /&gt;
 &lt;br /&gt;
        // Clear the screen.&lt;br /&gt;
        llMessageLinked(LINK_SET, DISPLAY_STRING, LOAD_MSG, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        integer StartLink = llGetLinkNumber() + 1;&lt;br /&gt;
        // Configure the board.&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        do&lt;br /&gt;
            llMessageLinked(StartLink + i, SET_CELL_INFO, llList2CSV([SET_LINE_CHANNEL, i * 10]), &amp;quot;&amp;quot;);&lt;br /&gt;
        while( ++i &amp;lt; prims );&lt;br /&gt;
 &lt;br /&gt;
        // Build this script in world to reveal the secret message!&lt;br /&gt;
        SetText( llBase64ToString(&amp;quot;SXMgdGhhdCBub3QgY29vbCBvciB3aGF0PyA6KQ==&amp;quot;) );&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    touch_end(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        // This can be used to help find mislinked prims. Its not required at all.&lt;br /&gt;
        XytstOrder(); &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; For new scripters/builders: Text for this script is displayed in the reverse order by which objects were linked. Breaks in the lines for multiline scripts are possible using the &#039;\n&#039; for newline, but a multiline linked object does not detect this. Theoretically, adding a message which communicates relative axis information (traditionally, z axis) could be used to allow for line breaks.&lt;br /&gt;
&lt;br /&gt;
=Example Use=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// XyText Message Map.&lt;br /&gt;
integer SET_LINE_CHANNEL    = 100100; //for multi-cell spanning text&lt;br /&gt;
integer DISPLAY_STRING      = 204000;&lt;br /&gt;
integer DISPLAY_EXTENDED    = 204001;&lt;br /&gt;
integer REMAP_INDICES       = 204002;&lt;br /&gt;
integer RESET_INDICES       = 204003;&lt;br /&gt;
integer SET_CELL_INFO       = 204004;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, DISPLAY_STRING, &amp;quot;text to display&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Many thanks to Xylor Baysklef and Kermitt Quick.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;br /&gt;
{{#vardefine:sort|Key Pad Door}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=NumPad&amp;diff=1176211</id>
		<title>NumPad</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=NumPad&amp;diff=1176211"/>
		<updated>2013-01-17T02:48:05Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: Created page and released the first version.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
Scripting tools to allow display of text on a prim: [[XyText 1.5]] , [[XyzzyText]], [[XyyyyzText]], [[XyText-UTF8]], [[XyzzyText-UTF8]], [[ZZText]], [[VariText]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NumPad&#039;&#039;&#039; is a variant of the text on a prim but with some changes&lt;br /&gt;
&lt;br /&gt;
* 1 texture vs 5 textures needed for XyText 1.5 &#039;to render numbers&#039;&lt;br /&gt;
* Numbers and spaces only.&lt;br /&gt;
* About 73 lines of code.&lt;br /&gt;
&lt;br /&gt;
=Copyright &amp;amp; Licensing=&lt;br /&gt;
&amp;lt;font size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
* Madpeter Zond hereby releases his contributions to this under the MIT license. [Starting texture and Starting code]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=NumPad 10digits=&lt;br /&gt;
&lt;br /&gt;
Quickstart:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Take a copy of the 10 char prim setup from [[XyText 1.5]] and setup a prim&lt;br /&gt;
* After running the code create a new script and copy the NumPad code to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Set render_to_prim_number to the number of the prim you wish to render to,&lt;br /&gt;
* if you dont know the number you can put the script inside of the prim you want&lt;br /&gt;
* and not change this.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    NumPad&lt;br /&gt;
    ----------------&lt;br /&gt;
    Version: 1.0&lt;br /&gt;
    By: Madpeter Zond&lt;br /&gt;
    About: A 1 texture 10 digit number display&lt;br /&gt;
           great for a score output.&lt;br /&gt;
*/&lt;br /&gt;
string texture = &amp;quot;31f72af5-dee3-72f5-3981-bde21bf85e9c&amp;quot;;&lt;br /&gt;
integer render_to_prim_number = LINK_THIS;&lt;br /&gt;
vector render_color = &amp;lt;1,1,1&amp;gt;;&lt;br /&gt;
float glow_amount = 0.00;&lt;br /&gt;
&lt;br /&gt;
// please dont change this unless you want to break something ^_^&lt;br /&gt;
list faces = [3,7,4,6,1];&lt;br /&gt;
list grid_offset_starts = [&amp;lt;-0.38941,-0.54747,0&amp;gt;  ,&amp;lt;-0.44939,-0.54750,0&amp;gt;,  &amp;lt;0.01800,0.45256,0&amp;gt;,&amp;lt;-0.44939,-0.54750,0&amp;gt;,&amp;lt;-0.50941,-0.54747,0&amp;gt;];&lt;br /&gt;
list repeats_corrections = [&amp;lt;0.1,0,0&amp;gt;,&amp;lt;0,0,0&amp;gt;,&amp;lt;-1.35,0,0&amp;gt;,&amp;lt;0,0,0&amp;gt;,&amp;lt;0.1,0,0&amp;gt;];&lt;br /&gt;
vector repeats_config = &amp;lt;0.1,0.083333,0&amp;gt;;&lt;br /&gt;
float fix(float input)  // render blocking fix [haxy]   &lt;br /&gt;
{&lt;br /&gt;
     if(input &amp;gt; 1.0) input -= 1.0;&lt;br /&gt;
     else if(input &amp;lt; -1.0) input += 1.0;&lt;br /&gt;
     return input; &lt;br /&gt;
}&lt;br /&gt;
render(string output)&lt;br /&gt;
{&lt;br /&gt;
    while(llStringLength(output) &amp;lt; 10) { output = &amp;quot;&amp;quot;+output+&amp;quot; &amp;quot;; }&lt;br /&gt;
    list renderrules = [];&lt;br /&gt;
    integer loop = 0;&lt;br /&gt;
    while(loop &amp;lt; 5)&lt;br /&gt;
    {&lt;br /&gt;
        string part = llGetSubString(output,(2*loop),(2*loop)+1);&lt;br /&gt;
        if(part == &amp;quot;  &amp;quot;) &lt;br /&gt;
        {&lt;br /&gt;
            // empty&lt;br /&gt;
            renderrules = renderrules + [PRIM_COLOR,llList2Integer(faces,loop),&amp;lt;1,1,1&amp;gt;,0,PRIM_GLOW,llList2Integer(faces,loop),0];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            integer Y_offset = (integer)llGetSubString(part,0,0);&lt;br /&gt;
            integer X_offset = (integer)llGetSubString(part,1,1);&lt;br /&gt;
            if(llGetSubString(part,0,0) == &amp;quot; &amp;quot;)  Y_offset = 11; // left side empty &lt;br /&gt;
            else if(llGetSubString(part,1,1) == &amp;quot; &amp;quot;) Y_offset = 12; // right side empty&lt;br /&gt;
            vector start = llList2Vector(grid_offset_starts,loop);&lt;br /&gt;
            start = &amp;lt;fix(start.x + (0.1 * X_offset)),fix(start.y + (-0.083333333 * Y_offset)),0&amp;gt;;&lt;br /&gt;
            renderrules = renderrules + [PRIM_TEXTURE,llList2Integer(faces,loop),texture,repeats_config+llList2Vector(repeats_corrections,loop),start,0,PRIM_COLOR,llList2Integer(faces,loop),render_color,1,PRIM_GLOW,llList2Integer(faces,loop),glow_amount];&lt;br /&gt;
        }&lt;br /&gt;
        loop++;        &lt;br /&gt;
    }&lt;br /&gt;
    llSetLinkPrimitiveParamsFast(render_to_prim_number,renderrules);&lt;br /&gt;
            &lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        render(&amp;quot;1234567890&amp;quot;);&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetOwner&amp;diff=1165389</id>
		<title>LlGetOwner</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetOwner&amp;diff=1165389"/>
		<updated>2012-04-10T14:53:33Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: added note about llGetOwner returning unexpected values&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func_id=117|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetOwner|sort=GetOwner&lt;br /&gt;
|return_type=key&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is the object owner&#039;s [[UUID]].&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*When the owner of an object changes, code that depends on this function&#039;s return value will not automatically update for the new owner or be automatically re-evaluated.&lt;br /&gt;
**This requires the reregistration of [[llListen|listens]] and  [[llRequestPermissions|requesting of permissions]] from the new owner as needed.&lt;br /&gt;
***This is not limited to listens and permissions but anything that caches the return value, it is up to the programmer to work around this limitation.&lt;br /&gt;
**Detection of owner change can be achieved with the [[changed]] event in conjunction with the [[CHANGED_OWNER]] flag (see the second example) or by storing the old value and periodically (e.g. in [[on_rez]]) checking if it has changed. Both techniques are valid though the latter will not detect the sale of the object if it is sold with &amp;quot;sell original&amp;quot; in-world and not picked up.&lt;br /&gt;
*When the object is deeded to a group, the UUID returned is that of the group.&lt;br /&gt;
*When the owner is offline the region can lose the owner uuid and return NULL_KEY or (Loading)... in some rare cases.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;llOwnerSay( (string)llGetOwner()); // speaks in chat the &amp;quot;key&amp;quot; (UUID code) of the avatar.&lt;br /&gt;
llOwnerSay( llKey2Name(llGetOwner())); // speaks in chat the name of the owner if in the sim.&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llInstantMessage(llGetOwner(), &amp;quot;Only you can hear me. Isn&#039;t that eerie.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_OWNER)&lt;br /&gt;
            llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llGetCreator]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetOwnerKey]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llDetectedOwner]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=&lt;br /&gt;
To retrieve the owners name while the owner is in the region use [[llKey2Name]], [[llRequestAgentData]] should be used when the owner is not in the region.&lt;br /&gt;
&lt;br /&gt;
The one problem many coders come up against is that previously-activated events referring to the owner don&#039;t automatically change when the owner changes.  The most often-seen result is a listen registered to owner will continue to listen to the PREVIOUS owner rather than the CURRENT owner.  It is often confused as a bug in [[llGetOwner]] or [[llListen]] it is not in fact a bug but part of the design.  There are several ways of working around this problem.  The easy solution is to reset the script when owner changes or it is rezzed. The easy solution is not always the right solution.&lt;br /&gt;
&lt;br /&gt;
There are two ways to detect if the owner has changed, the most reliable is to use the [[changed]] event.&lt;br /&gt;
&amp;lt;lsl&amp;gt;changed(integer change)&lt;br /&gt;
{&lt;br /&gt;
    if (change &amp;amp; CHANGED_OWNER)//if owner changes, reset the script.&lt;br /&gt;
        llResetScript();&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In many applications resetting the script when the object is rezzed is an adequate and easy solution.&lt;br /&gt;
&amp;lt;lsl&amp;gt;on_rez(integer start_param)&lt;br /&gt;
{ //when the object is rezzed, reset the script.&lt;br /&gt;
    llResetScript();&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resetting the script is not appropriate if the script needs to keep it&#039;s data when it&#039;s ownership is transfered or if script startup is slow, in these situations listens will need to be re-keyed to the new owner along with any other owner specific code, like who the script is supposed to be animating.&lt;br /&gt;
&lt;br /&gt;
The [[on_rez]] and [[changed]] events can be harnessed to reinitialize owner specific code every time the object is rezzed or changes owner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer listen_handle;&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    key owner = llGetOwner();&lt;br /&gt;
    llListenRemove(listen_handle);&lt;br /&gt;
    listen_handle = llListen(0, &amp;quot;&amp;quot;, owner, &amp;quot;&amp;quot;);&lt;br /&gt;
    llRequestPermissions(owner, PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
        //insert additional startup code here that doesn&#039;t need to run each rez/owner change&lt;br /&gt;
        //for example, reading settings from a notecard&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start)&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_OWNER)&lt;br /&gt;
            init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {//always use the run_time_permissions event with llRequestPermissions, never assume&lt;br /&gt;
        if(perm &amp;amp; PERMISSION_TRIGGER_ANIMATION)&lt;br /&gt;
        {&lt;br /&gt;
            //setup your animation code here, start your timers, etc.&lt;br /&gt;
            llOwnerSay(&amp;quot;I have animation permissions&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|cat1=Owner&lt;br /&gt;
|cat2=Object&lt;br /&gt;
|cat3=Key&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=IsInList&amp;diff=1162427</id>
		<title>IsInList</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=IsInList&amp;diff=1162427"/>
		<updated>2012-02-03T15:05:16Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: removed white space&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|mode=user&lt;br /&gt;
|func=IsInList&lt;br /&gt;
|p1_type=list|p1_name=data&lt;br /&gt;
|p2_type=string|p2_name=name&lt;br /&gt;
|return_type=integer&lt;br /&gt;
|return_text=&lt;br /&gt;
|func_desc=&#039;&#039;&#039;This function can be used to determine if a string variable is in a list&#039;&#039;&#039;&lt;br /&gt;
|func_footnote= {{KBtip|other variable types can be used with the exception of lists}}&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer IsInList(list data, string name)&lt;br /&gt;
{&lt;br /&gt;
    if(llListFindList(data,[name]) != -1) return TRUE;&lt;br /&gt;
    else return FALSE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{KBtip|[[User:Mitzpatrick_Fitzsimmons|See my wiki page]] for a video tutorial of this function}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Simple Visitor&#039;s List that will not allow duplicate list entries using the IsInList() function&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(-23467589, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llSensorRepeat(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 10.0, PI, 180);&lt;br /&gt;
        llSetTimerEvent(86400);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llTextBox(llDetectedKey(0), &amp;quot;What are you looking for?&amp;quot;, -23467589);&lt;br /&gt;
        TypeOutList();&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(IsInList(visitors, message))&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0, message + &amp;quot; is in the list.&amp;quot;);&lt;br /&gt;
        }else{&lt;br /&gt;
            llSay(0, message +  &amp;quot; is not in the list&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer i;&lt;br /&gt;
        for(i=0; i &amp;lt; detected; i++)&lt;br /&gt;
        {&lt;br /&gt;
            if(IsInList(visitors, llDetectedName(i)))&lt;br /&gt;
            {&lt;br /&gt;
               // DO NOTHING- already in the list &lt;br /&gt;
            }else{&lt;br /&gt;
                visitors += llDetectedName(0);&lt;br /&gt;
                llOwnerSay(&amp;quot;Added &amp;quot; + llDetectedName(0) + &amp;quot; to the visitors list. \nFree Memory: &amp;quot; + (string) llGetFreeMemory());&lt;br /&gt;
                llOwnerSay(&amp;quot;There are now &amp;quot; + (string) llGetListLength(visitors) + &amp;quot; names in the visitors list.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        // Optional&lt;br /&gt;
        llEmail(&amp;quot;your_email_address@your_domain.com&amp;quot;, &amp;quot;Here is the Visitors List for today&amp;quot;, llList2CSV(visitors) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=IsInList&amp;diff=1162426</id>
		<title>IsInList</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=IsInList&amp;diff=1162426"/>
		<updated>2012-02-03T15:04:05Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: Removed user function and replaced with an example using llListFindList as the old method was much slower&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|mode=user&lt;br /&gt;
|func=IsInList&lt;br /&gt;
|p1_type=list|p1_name=data&lt;br /&gt;
|p2_type=string|p2_name=name&lt;br /&gt;
|return_type=integer&lt;br /&gt;
|return_text=&lt;br /&gt;
|func_desc=&#039;&#039;&#039;This function can be used to determine if a string variable is in a list&#039;&#039;&#039;&lt;br /&gt;
|func_footnote= {{KBtip|other variable types can be used with the exception of lists}}&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer IsInList(list data, string name)&lt;br /&gt;
{&lt;br /&gt;
    if(llListFindList(data,[name]) != -1) return TRUE;&lt;br /&gt;
    else return FALSE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{KBtip|[[User:Mitzpatrick_Fitzsimmons|See my wiki page]] for a video tutorial of this function}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Simple Visitor&#039;s List that will not allow duplicate list entries using the IsInList() function&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(-23467589, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llSensorRepeat(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 10.0, PI, 180);&lt;br /&gt;
        llSetTimerEvent(86400);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llTextBox(llDetectedKey(0), &amp;quot;What are you looking for?&amp;quot;, -23467589);&lt;br /&gt;
        TypeOutList();&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(IsInList(visitors, message))&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0, message + &amp;quot; is in the list.&amp;quot;);&lt;br /&gt;
        }else{&lt;br /&gt;
            llSay(0, message +  &amp;quot; is not in the list&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer i;&lt;br /&gt;
        for(i=0; i &amp;lt; detected; i++)&lt;br /&gt;
        {&lt;br /&gt;
            if(IsInList(visitors, llDetectedName(i)))&lt;br /&gt;
            {&lt;br /&gt;
               // DO NOTHING- already in the list &lt;br /&gt;
            }else{&lt;br /&gt;
                visitors += llDetectedName(0);&lt;br /&gt;
                llOwnerSay(&amp;quot;Added &amp;quot; + llDetectedName(0) + &amp;quot; to the visitors list. \nFree Memory: &amp;quot; + (string) llGetFreeMemory());&lt;br /&gt;
                llOwnerSay(&amp;quot;There are now &amp;quot; + (string) llGetListLength(visitors) + &amp;quot; names in the visitors list.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        // Optional&lt;br /&gt;
        llEmail(&amp;quot;your_email_address@your_domain.com&amp;quot;, &amp;quot;Here is the Visitors List for today&amp;quot;, llList2CSV(visitors) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetPos&amp;diff=699232</id>
		<title>LlSetPos</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetPos&amp;diff=699232"/>
		<updated>2010-01-07T13:37:25Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: Created function to bypass bug when moving small amount llSetLocalPos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues/SVC-1945}}{{LSL Function&lt;br /&gt;
|func_id=58|func_sleep=0.2|func_energy=10.0&lt;br /&gt;
|func=llSetPos&lt;br /&gt;
|p1_type=vector|p1_name=pos|p1_desc=position in [[Viewer coordinate frames#Region|region]] or [[Viewer coordinate frames#local|local coordinates]] depending on the situation (see &#039;&#039;[[#Specification]]&#039;&#039;).|p1_hover=position in region or local coordinates depending on the situation.&lt;br /&gt;
|func_desc=Moves the object or primitive towards &#039;&#039;&#039;pos&#039;&#039;&#039; without using physics.&lt;br /&gt;
|func_footnote=Movement is capped to 10m per call for unattached root prims.{{Footnote|Unless you exploit the undocumented [[warpPos]] bug.}}&lt;br /&gt;
|spec=&lt;br /&gt;
=====Coordinate Frame=====&lt;br /&gt;
*Root prims (or single prim objects)&lt;br /&gt;
**Attached&lt;br /&gt;
***&#039;&#039;&#039;pos&#039;&#039;&#039; is a [[Viewer coordinate frames#Local|local coordinate]] relative to the attach point.&lt;br /&gt;
**Not attached&lt;br /&gt;
***&#039;&#039;&#039;pos&#039;&#039;&#039; is a [[Viewer coordinate frames#Region|region coordinate]].&lt;br /&gt;
*Child prims (non root prims)&lt;br /&gt;
**&#039;&#039;&#039;pos&#039;&#039;&#039; is a [[Viewer coordinate frames#Local|local coordinate]] relative to the root prim.&lt;br /&gt;
|caveats=&lt;br /&gt;
*Because of the intermixing of local and regional coordinates with this function, when a prims position is wanted it is best to use [[llGetLocalPos]].&lt;br /&gt;
*This function does not work for physical objects. Use [[llMoveToTarget]] instead.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Move the object up 1m when someone touches it.&lt;br /&gt;
default {&lt;br /&gt;
     touch_start(integer i) {&lt;br /&gt;
          llSetPos(llGetPos() + &amp;lt;0,0,1&amp;gt;);&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// to bypass the small movement bug use this&lt;br /&gt;
// - created by Madpeter Zond&lt;br /&gt;
// notes: it does not check if the movement would go out of limit range for linked prims&lt;br /&gt;
llSetLocalPos(vector offset)&lt;br /&gt;
{&lt;br /&gt;
    vector save = offset;&lt;br /&gt;
    if(offset.x &amp;lt; 0.0) offset.x -= 1;&lt;br /&gt;
    else offset.x += 1;&lt;br /&gt;
    if(offset.y &amp;lt; 0.0) offset.y -= 1;&lt;br /&gt;
    else offset.y += 1;&lt;br /&gt;
    if(offset.z &amp;lt; 0.0) offset.z -= 1;&lt;br /&gt;
    else offset.z += 1;&lt;br /&gt;
    llSetPos(offset);&lt;br /&gt;
    llSetPos(save);    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llGetLocalPos]]|Returns the prim&#039;s local position if it is attached or non-root (otherwise it returns the global position)}}&lt;br /&gt;
{{LSL DefineRow||[[llGetRootPosition]]|Gets the root prims position}}&lt;br /&gt;
{{LSL DefineRow||[[llGetPos]]|Returns the prim&#039;s global position, even if it is attached or non-root}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=Multiple movement commands can be chained together with [[llSetPrimitiveParams]] and [[PRIM_POSITION]]. The advantage of doing this is that the script only sleeps once per function call instead of once per movement.&lt;br /&gt;
|cat1=Movement&lt;br /&gt;
|cat2=Prim&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688202</id>
		<title>ListStridedRemove</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688202"/>
		<updated>2009-12-16T15:23:39Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|mode=user&lt;br /&gt;
|func=ListStridedRemove&lt;br /&gt;
|p1_type=list|p1_name=src&lt;br /&gt;
|p2_type=integer|p2_name=start&lt;br /&gt;
|p3_type=integer|p3_name=end&lt;br /&gt;
|p4_type=integer|p4_name=stride&lt;br /&gt;
|return_type=list&lt;br /&gt;
|return_text=&lt;br /&gt;
|func_desc=Removes each stride from a list, example a list of 1,2,3,A,1,2,3,A after ListStridedRemove(list,4,0,4); would be 1,2,3,1,2,3&lt;br /&gt;
|func_footnote= created fixed and improved by Madpeter Zond&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list ListStridedRemove(list src, integer start, integer end, integer stride)&lt;br /&gt;
{&lt;br /&gt;
    if((start &amp;lt; 1) || (stride &amp;lt; 1)) return src; // reverse stride not supported&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
         integer loop = start - 1;&lt;br /&gt;
         integer tricker = 0;&lt;br /&gt;
         integer maxlen = llGetListLength(src);&lt;br /&gt;
         if((end == 0) || (end &amp;gt; maxlen)) end = maxlen;&lt;br /&gt;
         while(loop &amp;lt; end)&lt;br /&gt;
         {&lt;br /&gt;
              integer pointid = loop-tricker;&lt;br /&gt;
              src = llDeleteSubList(src,pointid,pointid);&lt;br /&gt;
              tricker++;&lt;br /&gt;
              loop+=stride;    &lt;br /&gt;
         }&lt;br /&gt;
         return src;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also: [[List#Strided_lists|Strided Lists]]&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;list customers = ListStridedRemove(customers, 0, 0, STRIDELENGTH);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Examples&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688192</id>
		<title>ListStridedRemove</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688192"/>
		<updated>2009-12-16T15:23:08Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: added LSL function detail&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|mode=user&lt;br /&gt;
|func=ListStridedRemove&lt;br /&gt;
|p1_type=list|p1_name=src&lt;br /&gt;
|p2_type=integer|p2_name=start&lt;br /&gt;
|p3_type=integer|p3_name=end&lt;br /&gt;
|p4_type=integer|p4_name=stride&lt;br /&gt;
|return_type=list&lt;br /&gt;
|return_text=that contains the elements of &#039;&#039;&#039;myList&#039;&#039;&#039; but with the strides in the range of &#039;&#039;&#039;start&#039;&#039;&#039; to &#039;&#039;&#039;end&#039;&#039;&#039; removed.&lt;br /&gt;
|func_desc=Removes a specified part of a strided list. &lt;br /&gt;
|func_footnote=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list ListStridedRemove(list src, integer start, integer end, integer stride) {&lt;br /&gt;
     return llDeleteSubList(src, start * stride, (stride * (end + 1)) - 1);&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|mode=user&lt;br /&gt;
|func=ListStridedRemove&lt;br /&gt;
|p1_type=list|p1_name=src&lt;br /&gt;
|p2_type=integer|p2_name=start&lt;br /&gt;
|p3_type=integer|p3_name=end&lt;br /&gt;
|p4_type=integer|p4_name=stride&lt;br /&gt;
|return_type=list&lt;br /&gt;
|return_text=&lt;br /&gt;
|func_desc=Removes each stride from a list, example a list of 1,2,3,A,1,2,3,A after ListStridedRemove(list,4,0,4); would be 1,2,3,1,2,3&lt;br /&gt;
|func_footnote= created fixed and improved by Madpeter Zond&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list ListStridedRemove(list src, integer start, integer end, integer stride)&lt;br /&gt;
{&lt;br /&gt;
    if((start &amp;lt; 1) || (stride &amp;lt; 1)) return src; // reverse stride not supported&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
         integer loop = start - 1;&lt;br /&gt;
         integer tricker = 0;&lt;br /&gt;
         integer maxlen = llGetListLength(src);&lt;br /&gt;
         if((end == 0) || (end &amp;gt; maxlen)) end = maxlen;&lt;br /&gt;
         while(loop &amp;lt; end)&lt;br /&gt;
         {&lt;br /&gt;
              integer pointid = loop-tricker;&lt;br /&gt;
              src = llDeleteSubList(src,pointid,pointid);&lt;br /&gt;
              tricker++;&lt;br /&gt;
              loop+=stride;    &lt;br /&gt;
         }&lt;br /&gt;
         return src;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also: [[List#Strided_lists|Strided Lists]]&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;list customers = ListStridedRemove(customers, 0, 0, STRIDELENGTH);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Examples&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688182</id>
		<title>ListStridedRemove</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688182"/>
		<updated>2009-12-16T15:19:41Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: fixed my &amp;lt;lsl&amp;gt; issue :P should have used preview&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|mode=user&lt;br /&gt;
|func=ListStridedRemove&lt;br /&gt;
|p1_type=list|p1_name=src&lt;br /&gt;
|p2_type=integer|p2_name=start&lt;br /&gt;
|p3_type=integer|p3_name=end&lt;br /&gt;
|p4_type=integer|p4_name=stride&lt;br /&gt;
|return_type=list&lt;br /&gt;
|return_text=that contains the elements of &#039;&#039;&#039;myList&#039;&#039;&#039; but with the strides in the range of &#039;&#039;&#039;start&#039;&#039;&#039; to &#039;&#039;&#039;end&#039;&#039;&#039; removed.&lt;br /&gt;
|func_desc=Removes a specified part of a strided list. &lt;br /&gt;
|func_footnote=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// to remove indexs from a list (normaly one thats been strided use this function&lt;br /&gt;
list ListStridedRemove(list src, integer start, integer end, integer stride) {&lt;br /&gt;
     return llDeleteSubList(src, start * stride, (stride * (end + 1)) - 1);&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// to remove every stride from a list use this function&lt;br /&gt;
list ListStridedRemove(list src, integer start, integer end, integer stride)&lt;br /&gt;
{&lt;br /&gt;
    // fixed and improved by Madpeter Zond (the wiki entry is trash please update it)&lt;br /&gt;
    if((start &amp;lt; 1) || (stride &amp;lt; 1)) return src; // reverse stride not supported&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
         integer loop = start - 1;&lt;br /&gt;
         integer tricker = 0;&lt;br /&gt;
         integer maxlen = llGetListLength(src);&lt;br /&gt;
         if((end == 0) || (end &amp;gt; maxlen)) end = maxlen;&lt;br /&gt;
         while(loop &amp;lt; end)&lt;br /&gt;
         {&lt;br /&gt;
              integer pointid = loop-tricker;&lt;br /&gt;
              src = llDeleteSubList(src,pointid,pointid);&lt;br /&gt;
              tricker++;&lt;br /&gt;
              loop+=stride;    &lt;br /&gt;
         }&lt;br /&gt;
         return src;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also: [[List#Strided_lists|Strided Lists]]&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;list customers = ListStridedRemove(customers, 0, 0, STRIDELENGTH);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Examples&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688172</id>
		<title>ListStridedRemove</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688172"/>
		<updated>2009-12-16T15:19:03Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: Added details..&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|mode=user&lt;br /&gt;
|func=ListStridedRemove&lt;br /&gt;
|p1_type=list|p1_name=src&lt;br /&gt;
|p2_type=integer|p2_name=start&lt;br /&gt;
|p3_type=integer|p3_name=end&lt;br /&gt;
|p4_type=integer|p4_name=stride&lt;br /&gt;
|return_type=list&lt;br /&gt;
|return_text=that contains the elements of &#039;&#039;&#039;myList&#039;&#039;&#039; but with the strides in the range of &#039;&#039;&#039;start&#039;&#039;&#039; to &#039;&#039;&#039;end&#039;&#039;&#039; removed.&lt;br /&gt;
|func_desc=Removes a specified part of a strided list. &lt;br /&gt;
|func_footnote=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// to remove indexs from a list (normaly one thats been strided use this function&lt;br /&gt;
&amp;lt;lsl&amp;gt;list ListStridedRemove(list src, integer start, integer end, integer stride) {&lt;br /&gt;
     return llDeleteSubList(src, start * stride, (stride * (end + 1)) - 1);&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
// to remove every stride from a list use this function&lt;br /&gt;
list ListStridedRemove(list src, integer start, integer end, integer stride)&lt;br /&gt;
{&lt;br /&gt;
    // fixed and improved by Madpeter Zond (the wiki entry is trash please update it)&lt;br /&gt;
    if((start &amp;lt; 1) || (stride &amp;lt; 1)) return src; // reverse stride not supported&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
         integer loop = start - 1;&lt;br /&gt;
         integer tricker = 0;&lt;br /&gt;
         integer maxlen = llGetListLength(src);&lt;br /&gt;
         if((end == 0) || (end &amp;gt; maxlen)) end = maxlen;&lt;br /&gt;
         while(loop &amp;lt; end)&lt;br /&gt;
         {&lt;br /&gt;
              integer pointid = loop-tricker;&lt;br /&gt;
              src = llDeleteSubList(src,pointid,pointid);&lt;br /&gt;
              tricker++;&lt;br /&gt;
              loop+=stride;    &lt;br /&gt;
         }&lt;br /&gt;
         return src;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also: [[List#Strided_lists|Strided Lists]]&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;list customers = ListStridedRemove(customers, 0, 0, STRIDELENGTH);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Examples&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688142</id>
		<title>ListStridedRemove</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688142"/>
		<updated>2009-12-16T15:04:28Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: minor change to function to cover sending a low start value&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|mode=user&lt;br /&gt;
|func=ListStridedRemove&lt;br /&gt;
|p1_type=list|p1_name=src&lt;br /&gt;
|p2_type=integer|p2_name=start&lt;br /&gt;
|p3_type=integer|p3_name=end&lt;br /&gt;
|p4_type=integer|p4_name=stride&lt;br /&gt;
|return_type=list&lt;br /&gt;
|return_text=that contains the elements of &#039;&#039;&#039;myList&#039;&#039;&#039; but with the strides in the range of &#039;&#039;&#039;start&#039;&#039;&#039; to &#039;&#039;&#039;end&#039;&#039;&#039; removed.&lt;br /&gt;
|func_desc=Removes a specified part of a strided list. &lt;br /&gt;
|func_footnote=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list ListStridedRemove(list src, integer start, integer end, integer stride)&lt;br /&gt;
{&lt;br /&gt;
    // fixed and improved by Madpeter Zond (the wiki entry is trash please update it)&lt;br /&gt;
    if((start &amp;lt; 1) || (stride &amp;lt; 1)) return src; // reverse stride not supported&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
         integer loop = start - 1;&lt;br /&gt;
         integer tricker = 0;&lt;br /&gt;
         integer maxlen = llGetListLength(src);&lt;br /&gt;
         if((end == 0) || (end &amp;gt; maxlen)) end = maxlen;&lt;br /&gt;
         while(loop &amp;lt; end)&lt;br /&gt;
         {&lt;br /&gt;
              integer pointid = loop-tricker;&lt;br /&gt;
              src = llDeleteSubList(src,pointid,pointid);&lt;br /&gt;
              tricker++;&lt;br /&gt;
              loop+=stride;    &lt;br /&gt;
         }&lt;br /&gt;
         return src;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also: [[List#Strided_lists|Strided Lists]]&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;list customers = ListStridedRemove(customers, 0, 0, STRIDELENGTH);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Examples&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688132</id>
		<title>ListStridedRemove</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ListStridedRemove&amp;diff=688132"/>
		<updated>2009-12-16T15:01:15Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: replaced the function with one that works.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|mode=user&lt;br /&gt;
|func=ListStridedRemove&lt;br /&gt;
|p1_type=list|p1_name=src&lt;br /&gt;
|p2_type=integer|p2_name=start&lt;br /&gt;
|p3_type=integer|p3_name=end&lt;br /&gt;
|p4_type=integer|p4_name=stride&lt;br /&gt;
|return_type=list&lt;br /&gt;
|return_text=that contains the elements of &#039;&#039;&#039;myList&#039;&#039;&#039; but with the strides in the range of &#039;&#039;&#039;start&#039;&#039;&#039; to &#039;&#039;&#039;end&#039;&#039;&#039; removed.&lt;br /&gt;
|func_desc=Removes a specified part of a strided list. &lt;br /&gt;
|func_footnote=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list ListStridedRemove(list src, integer start, integer end, integer stride)&lt;br /&gt;
{&lt;br /&gt;
    // fixed and improved by Madpeter Zond (the wiki entry is trash please update it)&lt;br /&gt;
    integer loop = start - 1;&lt;br /&gt;
    integer tricker = 0;&lt;br /&gt;
    integer maxlen = llGetListLength(src);&lt;br /&gt;
    if((end == 0) || (end &amp;gt; maxlen)) end = maxlen;&lt;br /&gt;
    while(loop &amp;lt; end)&lt;br /&gt;
    {&lt;br /&gt;
        integer pointid = loop-tricker;&lt;br /&gt;
        src = llDeleteSubList(src,pointid,pointid);&lt;br /&gt;
        tricker++;&lt;br /&gt;
        loop+=stride;    &lt;br /&gt;
    }&lt;br /&gt;
    return src;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also: [[List#Strided_lists|Strided Lists]]&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;list customers = ListStridedRemove(customers, 0, 0, STRIDELENGTH);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Examples&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Madpeter_Zond&amp;diff=22148</id>
		<title>User:Madpeter Zond</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Madpeter_Zond&amp;diff=22148"/>
		<updated>2007-05-31T04:36:44Z</updated>

		<summary type="html">&lt;p&gt;Madpeter Zond: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Name: Madpeter Zond&lt;br /&gt;
RL: Peter (sorry i dont give out my second name)&lt;br /&gt;
Homepage: http://madpeter.2ya.com&lt;br /&gt;
&lt;br /&gt;
Second life projects&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
BlackAtom laptop&lt;br /&gt;
                a powerfull dialog powered laptop.&lt;br /&gt;
                - For more info please send me an IM.&lt;/div&gt;</summary>
		<author><name>Madpeter Zond</name></author>
	</entry>
</feed>