<?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=Ochi+Wolfe</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=Ochi+Wolfe"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Ochi_Wolfe"/>
	<updated>2026-05-10T04:09:08Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CatLibraries&amp;diff=1197833</id>
		<title>CatLibraries</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CatLibraries&amp;diff=1197833"/>
		<updated>2015-10-25T09:31:23Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Added LibObj&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}{{RightToc}}&lt;br /&gt;
==Libraries==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||[[Associative Array Emulator|Associative Array (Dictionary) Emulator]]&lt;br /&gt;
||[[User:Alynna Vixen|Alynna Vixen]]&lt;br /&gt;
||This library provides a set of functions for using a list as an associative array where string based keys can refer to one or more variant elements.&lt;br /&gt;
|-&lt;br /&gt;
||[[BigNum|BigNum Library (RSA Encryption)]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||A BigNum Library for dealing with big numbers! Specialized for modular multiplication, and RSA encryption.&lt;br /&gt;
|-&lt;br /&gt;
||[[Library Combined Library|Combined Library]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||Library of mostly encoding and decoding functions, some more useful then others.&lt;br /&gt;
* String functions: Replace / Trim right / Trim left / Trim both&lt;br /&gt;
* Unicode conversion: UTF8 to Unicode / Unicode to UTF8&lt;br /&gt;
* List functions: Replace / Compare&lt;br /&gt;
|-&lt;br /&gt;
||[[Geometric|Geometric Library]]&lt;br /&gt;
||Community Project&lt;br /&gt;
||A substantial amount of various geometric functions for intersection and other purposes of 3D maths.&lt;br /&gt;
|-&lt;br /&gt;
||[[Interpolation|Interpolation Library]]&lt;br /&gt;
||[[User:Nexii_Malthus|Nexii Malthus]]&lt;br /&gt;
||A small set of interpolation functions.&lt;br /&gt;
|-&lt;br /&gt;
|[[LibObj]]&lt;br /&gt;
|{{User|Ochi Wolfe}}&lt;br /&gt;
|A library to manage state in LSL using an object-oriented approach.&lt;br /&gt;
|-&lt;br /&gt;
||[[LibraryDisplayLandScreenshot]]&lt;br /&gt;
||[[User:Jon Desmoulins|Jon Desmoulins]]&lt;br /&gt;
||A modified version of LibraryDisplayProfilePic using the new [[PARCEL_DETAILS_ID]] Implemented in Server v1.36&lt;br /&gt;
|-&lt;br /&gt;
||[[LinksetIndexing|Linkset Indexing]]&lt;br /&gt;
||[[User:Nexii_Malthus|Nexii Malthus]]&lt;br /&gt;
||Functions for indexing a linkset by patterns or names down to their linkset numbers.&lt;br /&gt;
|-&lt;br /&gt;
||[[Wiki3DBuilder]] [[Wiki3DBuilder1.0]]&lt;br /&gt;
||[[User:Salahzar Stenvaag|Salahzar Stenvaag]] &lt;br /&gt;
||Allows a group of people to collectively build up complex 3D mindmaps with connected concepts. Uses particles for connections and low prim usage. Nodes can be textured, colored, changed form size moved collectively by everybody and can distribute notecards, landmarks, URL, objects, textures. I provide two version 0.1 and 1.0 and probably next version will communicate with moodle and sloodle external websites.&lt;br /&gt;
|-&lt;br /&gt;
||[[SL Mail V1.2]]&lt;br /&gt;
||[[User:Flennan Roffo|Flennan Roffo]]&lt;br /&gt;
||Second Life mail client V1.2 (released sept&#039;07). Send and receive mail from within Second Life from and to any address. With Address Book function and many chat commands. V1.3 is upcoming soon! &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{LSLC|}}&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=1197824</id>
		<title>Category:LSL Library</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&amp;diff=1197824"/>
		<updated>2015-10-24T14:45:30Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Added LibObj&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}{{RightToc}}&lt;br /&gt;
==Script Library==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em 0.5em 1.5em&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: Please add your scripts to this page and then add them to a category on the [[:Category:LSL Categorized Library|Categorized Library]] page.&lt;br /&gt;
&lt;br /&gt;
Come to this page to see complex examples that show how to combine parts of LSL.&lt;br /&gt;
&lt;br /&gt;
Go to the [[:Category:LSL Examples|LSL Examples]] page to see brief examples of how to use parts of LSL.&lt;br /&gt;
&lt;br /&gt;
Why collect complex examples here? Well, ...&lt;br /&gt;
&lt;br /&gt;
There is a treasure trove of user developed scripts that have become hard to find over time throughout Second Life&#039;s web server revisions and redesigns. The [http://community.secondlife.com/t5/Community-General/Upgrading-the-Forums/bc-p/77385 Huge Leap] to the new [http://www.jivesoftware.com/ Jive software], while traumatic and disruptive, has failed to dispose of  what&#039;s come before at the moment of your reading. These valuable community generated resources do indeed still remain and can be browsed/retrieved from several disjointed and disparate locations. While some links may point to duplicated, revised, or downright ancient wisdom, you may derive some enlightened perspective researching their hard won, timely solutions we encounter day to day.&lt;br /&gt;
&lt;br /&gt;
# [[Old forum Scripting Library index| Old Forums -Scripting Library index (wiki)]],&lt;br /&gt;
# [http://community.secondlife.com/t5/Scripting/bd-p/2108 Old Forums -Scripting Forum Archive],&lt;br /&gt;
# [http://forums-archive.secondlife.com/15/1.html Old Forums -Scripting Library],&lt;br /&gt;
# [http://community.secondlife.com/t5/Scripting-Library/bd-p/2122 new Forums -Archives &amp;gt; Scripting Library],&lt;br /&gt;
# [http://community.secondlife.com/t5/LSL-Scripting-Library/bd-p/LSLScriptingLibrary new Forums -LSL Library].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The wiki medium is well-suited for a script library due to its revision based historical foundation. If you feel inclined to release your scripts to the entire community, there&#039;s no better place to preserve your work/love/energy/gift as a unified and cohesive repository. Feel free to add your script page links here as well as adding it to the [[:Category:LSL Categorized Library|Categorized Library]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules for posting: ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
#Your script must be tested and working. If it&#039;s not, stick it in your user-space until it is. This is a list of working, usable scripts.&lt;br /&gt;
#Add a link to your script&#039;s page here. Link back to this page from your script&#039;s page. Start your page with &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{LSL Header}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Do not add scripts that duplicate the same functionality as an existing script or built in {{LSLGC|Functions|function}}. If yours does, explain why.&lt;br /&gt;
#Do not list simple scripts here. Include those among the [[:Category:LSL Examples|LSL Examples]] instead.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LSL Script Library==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|[[Notecard_Configuration_Reader_by_Maddox_Deluxe]]&lt;br /&gt;
|{{User2|Maddox Deluxe}}&lt;br /&gt;
|Notecard Multi-line Entries Configuration Reader v1.6.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Yumi Murakami/Addiction Moderator|Addiction Moderator and World Clock]]&lt;br /&gt;
|{{User|Yumi Murakami}}&lt;br /&gt;
|Keep tabs on usage of SL and easily share local times with other users.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Yumi Murakami/Bijocam And Other Camera Scripts|Bijocam and Other Camera Scripts]]&lt;br /&gt;
|{{User|Yumi Murakami}}&lt;br /&gt;
|Various camera control systems for machinima, security, and other effects.&lt;br /&gt;
|-&lt;br /&gt;
|[[Target Crosshair HUD]]&lt;br /&gt;
|[[User:Ackley Bing|Ackley]]&lt;br /&gt;
|A 2 prim HUD with crosshair targets nearby players names, profiles and user key&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Ackley Bing/Basic Sim Status Button Indicator HUD|Basic Sim Status Button Indicator HUD]]&lt;br /&gt;
|[[User:Ackley Bing|Ackley]]&lt;br /&gt;
|A single prim HUD. Color indicates sim status changes.&lt;br /&gt;
|-&lt;br /&gt;
|[[Basic Target Scanner HUD]]&lt;br /&gt;
|[[User:Ackley Bing|Ackley]]&lt;br /&gt;
|A single prim HUD.  Scrolls through nearby players names, photos and user key.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[StringIsNum|(Function) StringIsNum]]&lt;br /&gt;
|{{User|Zion Tristan}}&lt;br /&gt;
|A User Made Function to return TRUE if a string based input consists entirely of a whole number, and return FALSE otherwise.&lt;br /&gt;
|-&lt;br /&gt;
|[[Remove all scripts from a linkset]]&lt;br /&gt;
|{{User2|Dahlia Orfan}}&lt;br /&gt;
|Remove all scripts from a linkset.&lt;br /&gt;
|-&lt;br /&gt;
|[[RLV Viewer Titler]]&lt;br /&gt;
|{{User2|Jenna Felton}}&lt;br /&gt;
|Titler displaying viewer and it&#039;s version, revealed via RLV interface.&lt;br /&gt;
|-&lt;br /&gt;
|[[Sim Restart Notifyer]]&lt;br /&gt;
|{{User2|Jenna Felton}}&lt;br /&gt;
|On region restart, notifyes registered residents about the sim is online and the current sim version&lt;br /&gt;
|-&lt;br /&gt;
|[[Script Vitality plug-in]]&lt;br /&gt;
|{{User2|Jenna Felton}}&lt;br /&gt;
|Uses vehicle technology to allow scripts (in same prim) to run in &#039;dead&#039;, i.e. no-script areas.&lt;br /&gt;
|-&lt;br /&gt;
|[[1st necessity of SL]]&lt;br /&gt;
|{{User|Beer Dailey}}&lt;br /&gt;
|Monitors for avatars and (de)activates scripts states to control script performance/lag.&lt;br /&gt;
|-&lt;br /&gt;
|[[3D Radar]]&lt;br /&gt;
|{{User|Jesse Barnett}}&lt;br /&gt;
|Rezzes a ball for each avatar in range. Each ball tracks its own AV and displays distance.&lt;br /&gt;
|-&lt;br /&gt;
|[[RegionSitTeleport]]&lt;br /&gt;
|{{User|Vincent Nacon}}&lt;br /&gt;
|A very simple and clean sit/unsit teleporter.&lt;br /&gt;
|-&lt;br /&gt;
|[[Avatar Position Adjustement to Avatar Height When Sitting]]&lt;br /&gt;
|{{User|Cay Trudeau}}&lt;br /&gt;
|Animation Adjustement According to Avatar Height. A simple snippet to calculate avatar position upwards.&lt;br /&gt;
|-&lt;br /&gt;
|[[AbcText]]&lt;br /&gt;
|{{User|Ange Capalini}}&lt;br /&gt;
|EXPERIMENTAL Hyper low prim Display. only 2 prims for 25char.&lt;br /&gt;
|-&lt;br /&gt;
|[[Access (NewAge)]]&lt;br /&gt;
|{{User|Asia Snowfall}}&lt;br /&gt;
|An easy to use script for permissions on who can use the script, Public/Group/Owner&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Daemonika_Nightfire/Scripts/Access_Tutorial_EN|Access Tutorial (EN)]]&lt;br /&gt;
|{{User|Daemonika Nightfire}}&lt;br /&gt;
|Short examples about permission to executable commands.&lt;br /&gt;
|-&lt;br /&gt;
|[[Aim Detection]]&lt;br /&gt;
|{{User2|Han Shuffle|Dugley Reanimator}}&lt;br /&gt;
|Monitors for avatars and reports back to owner about who is aiming at them.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Daemonika_Nightfire/Scripts/Anti_copy_trans|Anti (copy &amp;amp; transfer)]]&lt;br /&gt;
|{{User|Daemonika Nightfire}}&lt;br /&gt;
|This funktion allows you to give away scripts with copy &amp;amp; transfer permissions and force the reseller to change the permission.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Daemonika_Nightfire/Scripts/Anti_Rezz|Anti Rezz]]&lt;br /&gt;
|{{User|Daemonika Nightfire}}&lt;br /&gt;
|This script delete the complete object by rezzing on ground and detach it after 5 minutes from avatar. &lt;br /&gt;
|-&lt;br /&gt;
|[[AnkleLock]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|An ankle lock script and attached animation to fix your displaced shoes. This will help if your shoes look displaced when you sit in certain poses or when your animation overrider is active.&lt;br /&gt;
|-&lt;br /&gt;
|[[AntiDelay Node]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|Uses [[llMessageLinked]] to stop those pesky delays.&lt;br /&gt;
|-&lt;br /&gt;
|[[Artillery]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|An artillery gun script, performing the necessary calculations based on a user-chosen velocity, in order to hit a designated target avatar.&lt;br /&gt;
|-&lt;br /&gt;
|[[AO Overriding Pose Ball]]&lt;br /&gt;
|{{User|Jesse Barnett}}&lt;br /&gt;
|No more turning your AO off and on when you sit down&lt;br /&gt;
|-&lt;br /&gt;
|[[ARCFOUR Strong Encryption Implementation]]&lt;br /&gt;
|{{User2|Nekow42 Zarf}}&lt;br /&gt;
|An LSL implementation of ARCFOUR, the most popular stream cipher still in use.&lt;br /&gt;
|-&lt;br /&gt;
|[[Assembly Programming Language|Assembly-Like Programming Language]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|A compiler that runs assembly-like programs.&lt;br /&gt;
|-&lt;br /&gt;
|[[Associative Array Emulator|Associative Array (Dictionary) Emulator]]&lt;br /&gt;
|{{User2|Alynna Vixen}}&lt;br /&gt;
|This library provides a set of functions for using a list as an associative array where string based keys can refer to one or more variant elements.&lt;br /&gt;
|-&lt;br /&gt;
|[[AvatarFollower]]&lt;br /&gt;
|{{User|Dale Innis}}&lt;br /&gt;
|Allows one avatar to automatically follow another.&lt;br /&gt;
|-&lt;br /&gt;
|[[Avatar Radar (NewAge)]]&lt;br /&gt;
|{{User|Asia Snowfall}}&lt;br /&gt;
|Version 1.2; A nice new avatar radar script i just finish that you can place in your hud, Also features avatar locator&lt;br /&gt;
|-&lt;br /&gt;
|[[Base2Dec]]&lt;br /&gt;
|{{User|Siann Beck}}&lt;br /&gt;
|Convert a number to decimal from any base.&lt;br /&gt;
|-&lt;br /&gt;
|[[BaseN]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
|Variable base compression, dynamically maps to usable UTF code points.&lt;br /&gt;
|-&lt;br /&gt;
|[[Basic Encryption Modules]]&lt;br /&gt;
|{{User|Beverly Larkin}}&lt;br /&gt;
|Basic encryption scripts, allows you to encrypt a float and shout it to another prim on a randomly chosen channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[Be happy]]&lt;br /&gt;
|{{User|Emmas Seetan}}&lt;br /&gt;
|Basic smile attachment script, makes your avatar smile.&lt;br /&gt;
|-&lt;br /&gt;
|[[Beat The Average Vendor]]&lt;br /&gt;
|{{User2|Kristen Giano}}&lt;br /&gt;
|A vendor script based on humblebundle.com&lt;br /&gt;
|-&lt;br /&gt;
|[[Best Neighbor Ad Hiding Script|Best Neighbor]]&lt;br /&gt;
|{{User2|Doran Zemlja}}&lt;br /&gt;
|Reduce ad clutter by hiding ads when users are on their own land nearby.&lt;br /&gt;
|-&lt;br /&gt;
|[[BigNum|BigNum Library (RSA Encryption)]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|A BigNum Library for dealing with big numbers! Specialized for modular multiplication, and RSA encryption.&lt;br /&gt;
|-&lt;br /&gt;
|[[Binary Clock v1.1|Binary Clock]]&lt;br /&gt;
|{{User|Fox Diller}}&lt;br /&gt;
|A Binary Clock.&lt;br /&gt;
|-&lt;br /&gt;
|[[BinaryDecimalConverter]]&lt;br /&gt;
|{{User2|Soundless Smalls}}&lt;br /&gt;
|Converts a binary value to a decimal value and vice versa.&lt;br /&gt;
|-&lt;br /&gt;
|[[Blacklist and Remote Kill|Blacklist and Remote Kill]]&lt;br /&gt;
|{{User|Chase Quinnell}}&lt;br /&gt;
|Blacklist(denial of use) or a creator kill script(can delete someone&#039;s item by command on private channel)&lt;br /&gt;
|-&lt;br /&gt;
|[[User_talk:Rolig_Loon/Bookmark_URLs|Bookmark URLs]]&lt;br /&gt;
|{{User|Rolig Loon}}&lt;br /&gt;
|Dialog driven HUD reads bookmarked URLs from notecards and navigates directly to them with user&#039;s in-world browser.&lt;br /&gt;
|-&lt;br /&gt;
|[[Bubble Gum]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script to create a bubble gum effect with sounds and animations.&lt;br /&gt;
|-&lt;br /&gt;
|[[Bubble Trapper]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script that rezzes a bubble and surrounds a dialog-chosen avatar, exploding 2 seconds after it has reached the avatar. The article also explains how to hash a name to a number or a key to a number and thereby avoiding to block the rezzer&#039;s [[timer]] [[event]] or using [[llRegionSay]].&lt;br /&gt;
|-&lt;br /&gt;
|[[Builders Buddy|Builder&#039;s Buddy Tool]]&lt;br /&gt;
|{{User|Newfie Pendragon}}&lt;br /&gt;
|Script to easily move/rotate large builds that exceed the linkable size [[limits]].&lt;br /&gt;
|-&lt;br /&gt;
|[[Button Click Detector]]&lt;br /&gt;
|{{User2|Sendao Goodman}}&lt;br /&gt;
|Use [[llDetectedTouchUV]] to determine which button was pressed on a texture.&lt;br /&gt;
|-&lt;br /&gt;
|[[Camera following prim]]&lt;br /&gt;
|{{User|Dale Innis}}&lt;br /&gt;
|Pair of scripts to make a prim follow your camera position around (for lights etc).&lt;br /&gt;
|-&lt;br /&gt;
|[[Camera Sync]]&lt;br /&gt;
|{{User|Meyermagic Salome}} and {{User2|Nomad Padar}}&lt;br /&gt;
|A system to synchronize the cameras of two avatars.&lt;br /&gt;
|-&lt;br /&gt;
|[[Chatbot]]&lt;br /&gt;
|Anonymous&lt;br /&gt;
|Compile and run the LSL you type on a channel, faster than you can thru the 2007-08 SL GUI.&lt;br /&gt;
|-&lt;br /&gt;
|[[Chat Logger (GPL)]]&lt;br /&gt;
|{{User|Nobody Fugazi}}&lt;br /&gt;
|Chat logger which requests permission from participants before recording them.&lt;br /&gt;
|-&lt;br /&gt;
|[[Chat_Relay|Chat Relay]]&lt;br /&gt;
|{{User|grumble Loudon}}&lt;br /&gt;
|A Chat relay which can be routed using a path header and won&#039;t echo.&lt;br /&gt;
|-&lt;br /&gt;
|[[ClickAndDrag]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
| Click and Drag user interface elements using dynamic feedback&lt;br /&gt;
|-&lt;br /&gt;
|[[TimeAPI Clock Script]]&lt;br /&gt;
|[[User:Elite Runner|Ryan R. Elite (Elite Runner)]]&lt;br /&gt;
|Gets time via HTTP function from TimeAPI.org&lt;br /&gt;
|-&lt;br /&gt;
|[[Code Racer]]&lt;br /&gt;
|Anonymous&lt;br /&gt;
|Race two versions of code forever, to see which runs faster.&lt;br /&gt;
|-&lt;br /&gt;
|[[Code Sizer]]&lt;br /&gt;
|Anonymous&lt;br /&gt;
|Count the bytes compiled from source code, to measure how to write small code.&lt;br /&gt;
|-&lt;br /&gt;
|[[Collision message sender]]&lt;br /&gt;
|{{User2|Taff Nouvelle}}&lt;br /&gt;
|Give a message to an avatar on collision if the message has not been sent in the last 10 minutes.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Programs#v7-D_Enh._Color_Picker|Color Changer]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Dialog driven color changer. Supports 16million+ colors, web color codes, multiple targeted prims, with save and recall.&lt;br /&gt;
|-&lt;br /&gt;
|[[Color Changer|Color Changer Plus]]&lt;br /&gt;
|{{User2|Neo Calcutt}}&lt;br /&gt;
|A color changer with 14 colors, a random function, and a custom vector function.&lt;br /&gt;
|-&lt;br /&gt;
|[[Color conversion scripts|Color Conversion]]&lt;br /&gt;
|{{User|Sally LaSalle}}&lt;br /&gt;
|Convert between Red Green Blue (RGB) and Hue Saturation Value (HSV).&lt;br /&gt;
|-&lt;br /&gt;
|[[ColorConvert]]&lt;br /&gt;
|{{User|Siann Beck}}&lt;br /&gt;
|Convert color values to vector from RGB, hex or HTML color name.&lt;br /&gt;
|-&lt;br /&gt;
|[[Color script]]&lt;br /&gt;
|{{User2|Masakazu Kojima}}&lt;br /&gt;
|Script for changing colors trough a listener with pre-defined colors.&lt;br /&gt;
|-&lt;br /&gt;
|[[Library Combined Library|Combined Library]]&lt;br /&gt;
|{{User|Strife Onizuka}}&lt;br /&gt;
|Library of mostly encoding and decoding functions, some more useful then others.&lt;br /&gt;
* String functions: Replace / Trim right / Trim left / Trim both&lt;br /&gt;
* Unicode conversion: UTF8 to Unicode / Unicode to UTF8&lt;br /&gt;
* List functions: Replace / Compare&lt;br /&gt;
|-&lt;br /&gt;
|[[Computer:jaycoonlanguage]]&lt;br /&gt;
|{{User|jayco121 Bing}}&lt;br /&gt;
| A language written in LSL that is meant for my computer (available at the shop).&lt;br /&gt;
|-&lt;br /&gt;
|[[Read Note Card Configuration|Configuration Notecard Reader]]&lt;br /&gt;
|{{User|Dedric Mauriac}}&lt;br /&gt;
|A script to read configuration information from a notecard. Parses notecard to extract key words and their assigned values. Allows for comment lines and many more useful features.&lt;br /&gt;
|-&lt;br /&gt;
|[[AdvancedNotecardReader|Configuration Notecard Reader (advanced)]]&lt;br /&gt;
|[[Lear Cale|Lear Cale]]&lt;br /&gt;
|Robust configuration notecard reader; supports multiple notecards with same suffix, handles reconfig on inventory change, and does not usurp the default state.&lt;br /&gt;
|-&lt;br /&gt;
|[[Library_Chat_Relay|Conversation Relay]]&lt;br /&gt;
|{{User|Jippen Faddoul}}&lt;br /&gt;
|Chat relay which requests permission from participants before relaying their messages. Also includes their attachments. (ToS compliant).&lt;br /&gt;
|-&lt;br /&gt;
|[[Curtain script]]&lt;br /&gt;
|{{User|Zilla Larsson}}&lt;br /&gt;
|A simple script to retract/stretch curtains, blinds, bedcovers and more&lt;br /&gt;
|-&lt;br /&gt;
|[[Library_Cycle_Dialog_Items|Cycle Dialog Items w/ Callback]]&lt;br /&gt;
|{{User|Hawkster Westmoreland}}&lt;br /&gt;
|A customizable way to cycle dialog items with pagination&lt;br /&gt;
|-&lt;br /&gt;
|[[Dataserver API]]&lt;br /&gt;
|{{User|Revolution Perenti}}&lt;br /&gt;
|Dataserver Framework for Notecards.&lt;br /&gt;
|-&lt;br /&gt;
|[[Date Library]]&lt;br /&gt;
|{{User|Corto Maltese}}&lt;br /&gt;
| Date library, based on number of day since march 3rd 1600, can be used to calculate weekday, date differences, and date offset, and date formating.&lt;br /&gt;
|-&lt;br /&gt;
|[[Day of the Week]]&lt;br /&gt;
|{{User|DoteDote Edison}}&lt;br /&gt;
|Function to get day of the week from [[llGetUnixTime]].&lt;br /&gt;
|-&lt;br /&gt;
|[[Days in Month]]&lt;br /&gt;
|{{User|IntLibber Brautigan}}&lt;br /&gt;
|Clicking on it returns the number of days in the present month. Useful for scripting calendars and tier systems that need to know the number of days in the month at hand or to calculate for any month. Even adjusts for leap years.&lt;br /&gt;
|-&lt;br /&gt;
|[[Deed Tools]]&lt;br /&gt;
|{{User|Falados Kapuskas}}&lt;br /&gt;
|Tools that allow the creator to modify Group-Owned (Deeded) Objects via chat.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Daemonika_Nightfire/Scripts/DEMO_Shield|DEMO_Shield]]&lt;br /&gt;
|{{User|Daemonika Nightfire}}&lt;br /&gt;
|With this script, it is impossible to use these scripts in copied (Copybot) object.&lt;br /&gt;
|-&lt;br /&gt;
|[[Describe Chatter]]&lt;br /&gt;
|Anonymous&lt;br /&gt;
|Chat to see yourself as others do.&lt;br /&gt;
|-&lt;br /&gt;
|[[Dialog Control]]&lt;br /&gt;
|{{User|Nargus Asturias}}&lt;br /&gt;
| A (not-so) simple dialog &amp;amp; menu control script. Call dialog and receive selected value via [[link_message]], with built-in timer and [[link_message]] notification on time out. Supports multi-pages dialog and numeric property dialog. Button text and dialog&#039;s returned value can differ.&lt;br /&gt;
Latest version also has [[Dialog Menus Control]] built-in; which allow multi-level menus through SL dialog system.&lt;br /&gt;
|-&lt;br /&gt;
|[[Dispenser Vendor]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
| A twist on [[Vendor]] that dispenses one object and then removes it from the list of objects.&lt;br /&gt;
|-&lt;br /&gt;
|[[MultiUser_Dialog_Handler|Dialog Menus (multiuser)]]&lt;br /&gt;
|{{User|SimonT Quinnell}}&lt;br /&gt;
| Menu dialog handler that supports multiple menus open at once from the single script. Displays multi-page menus if necessary as well as allowing for fixed header and footer buttons.  Timeouts as well as Text and button size limits are handled.&lt;br /&gt;
|-&lt;br /&gt;
|[[Dialog NumberPad|Dialog Number Pad]]&lt;br /&gt;
|{{User|DoteDote Edison}}&lt;br /&gt;
|Use a dialog to accept positive integer input from users.&lt;br /&gt;
|-&lt;br /&gt;
|[[Display Names Radar]]&lt;br /&gt;
|{{User|Cerise Sorbet}}&lt;br /&gt;
|Simple HUD type avatar radar that can show [[display names]] and script memory usage&lt;br /&gt;
|-&lt;br /&gt;
|[[Display Names to Key]]&lt;br /&gt;
|{{User|Joran Yoshikawa}}&lt;br /&gt;
|Simple way to get UUIDs from displaynames&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Daemonika_Nightfire/Scripts/DS_Display-Username_Online_Indicator|Display-Username_Online_Indicator]]&lt;br /&gt;
|{{User|Daemonika Nightfire}}&lt;br /&gt;
|This simple hover text-based script is used to shop owners in Second Life, customers at the current display name and user name to display publicly. Additionally shows the status of the Userkey and online. Furthermore, there are click of a chat link that opens the profile owner.&lt;br /&gt;
|-&lt;br /&gt;
|[[Displayer Script]]&lt;br /&gt;
|{{User|Akinori Kimagawa}}&lt;br /&gt;
|Display Words On Top Of An Object&lt;br /&gt;
|-&lt;br /&gt;
|[[Distributed Primitive Database]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|The distributed primitive database (DPD) is a database which is meant to survive entirely in SL by using redundancy, replication and time synchronisation to maintain the consistency of the dataset contained in the DPD node/primitives spread out between regions and even grids. Similarly to the [[Intercom]], the robustness of the theory would allow users to maintain a cross-grid database; as of 30 of August 2011 I have managed to couple and replicate data between the two grids by using the methodology described in the script article.&lt;br /&gt;
|-&lt;br /&gt;
|[[Drink script]]&lt;br /&gt;
|{{User|Emmas Seetan}}&lt;br /&gt;
|Used mainly for food and drink in Second Life.&lt;br /&gt;
|-&lt;br /&gt;
|[[Donut Dance]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|Err, a script that makes you dance and say something on the local chat once you attach an object (good example for conditional re-entry flipping).&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Daemonika_Nightfire/Scripts/DS_Single_AO-Sit|Single_AO-Sit]]&lt;br /&gt;
|{{User|Daemonika Nightfire}}&lt;br /&gt;
|Posescript for use with or without AO and with or without Animation. With the menu it is possible the seated Avatar to move.&lt;br /&gt;
|-&lt;br /&gt;
|[[TOXDropBox|DropBox]]&lt;br /&gt;
|{{User|Dimentox Travanti}}&lt;br /&gt;
| This is a Drop box which allows people to drop certain items in a object &amp;amp; has many config options.&lt;br /&gt;
|-&lt;br /&gt;
|[[Efficiency Tester]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|Tests the speed of a function.&lt;br /&gt;
|-&lt;br /&gt;
|[[Email-to-IM|Email2IM]]&lt;br /&gt;
|{{User|DoteDote Edison}}&lt;br /&gt;
|Send IMs to SL friends via [[email]].&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Kireji_Haiku/SIMchat_headset|Encrypted Region-wide chat]]&lt;br /&gt;
|{{User|Kireji Haiku}}&lt;br /&gt;
|Encrypted Region-wide chat&lt;br /&gt;
|-&lt;br /&gt;
|[[ExplodingObjects]]&lt;br /&gt;
|{{User|Dale Innis}}&lt;br /&gt;
|Causes an object (of the appropriate type) to explode on command.&lt;br /&gt;
|-&lt;br /&gt;
|[[FadeEasy]]&lt;br /&gt;
|{{User2|Nika Rugani}}&lt;br /&gt;
|The easy way of fading objects in or out (Using llSetLinkAlpha)&lt;br /&gt;
|-&lt;br /&gt;
|[[FastConeSpread]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
| Fast Algorithmn to achieve cone spread, main use in weaponry systems.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:PixelProphet Lane/Scripts#Fast List Prim Contents|Fast List Prim Contents]]&lt;br /&gt;
|{{User|PixelProphet Lane}}&lt;br /&gt;
|Fast and efficient method to print Object Inventory (Name, Type and next Owner permissions)&lt;br /&gt;
|-&lt;br /&gt;
|[[User:PixelProphet_Lane/Scripts#Grid_Status_Feed|Grid Status Feed]]&lt;br /&gt;
|{{User|PixelProphet Lane}}&lt;br /&gt;
|Receive important Grid information in-world&lt;br /&gt;
|-&lt;br /&gt;
|[[Find Avatar Key|Find Avatar Key]]&lt;br /&gt;
|{{User2|Huney Jewell}}&lt;br /&gt;
|Explores [[UUID]] of avatar whose name is said in local chat or who touches the prim.&lt;br /&gt;
|-&lt;br /&gt;
|[[First Name Letter Prize]]&lt;br /&gt;
|{{User|RaithSphere Whybrow}}&lt;br /&gt;
|Gives a prize if the person who sits on it&#039;s first letter of first name matches the random letter!&lt;br /&gt;
|-&lt;br /&gt;
|[[Fix Small Prims|Fix_Small_Prims]]&lt;br /&gt;
|{{User|Emma Nowhere}}&lt;br /&gt;
|Finds and adjusts the smallest prims in a linkset so that it can be scaled down further.&lt;br /&gt;
|-&lt;br /&gt;
|[[Flight Assist]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|Flight feather / flight band implementation supporting various commands and allowing you to fly above the clouds.&lt;br /&gt;
|-&lt;br /&gt;
|[[Float2Hex]]&lt;br /&gt;
|{{User|Strife Onizuka}}&lt;br /&gt;
|Very useful for transporting [[float|floats]].&lt;br /&gt;
|-&lt;br /&gt;
|[[Float Box Contents]]&lt;br /&gt;
|{{User|Rolig Loon}}&lt;br /&gt;
|Displays object inventory in hover text, identified by type and updated marquee-style.&lt;br /&gt;
|-&lt;br /&gt;
|[[Follower (script)|Follower]]&lt;br /&gt;
|Unknown, uploaded by {{User|Slik Swindlehurst}}&lt;br /&gt;
|Makes an object follow the nearest person. Do not use for [[grief|griefing]].&lt;br /&gt;
|-&lt;br /&gt;
|[[FURWARE_text]]&lt;br /&gt;
|{{User|Ochi Wolfe}}&lt;br /&gt;
|Versatile text-on-prim script, open source under the MIT license&lt;br /&gt;
|-&lt;br /&gt;
|[[GA Event Notifier]]&lt;br /&gt;
|{{User|Victor Hua}}&lt;br /&gt;
|Gathers seven days event data from a Google calendar and display it through a simple interface. The lsl script can access several calendars at once through seperate php files. One file per calendar. Host the included php on your own web server.&lt;br /&gt;
|-&lt;br /&gt;
|[[Geometric|Geometric Library]]&lt;br /&gt;
|Community Project&lt;br /&gt;
|A substantial amount of various geometric functions for intersection and other purposes of 3D maths.&lt;br /&gt;
|-&lt;br /&gt;
|[[Get Profile Picture]]&lt;br /&gt;
|{{User2|Valentine Foxdale}}&lt;br /&gt;
|Sets the texture of the object to profile picture of the person that touches ot&lt;br /&gt;
|-&lt;br /&gt;
|[[GetTimestampOffset]]&lt;br /&gt;
|[[User:Siann_Beck|Siann Beck]]&lt;br /&gt;
|Returns [[llGetTimestamp]] with an hour offset.&lt;br /&gt;
|-&lt;br /&gt;
|[[Give InvItem every n hours]]&lt;br /&gt;
|{{User|Criz Collins}}&lt;br /&gt;
|Will give an inventory item on touch only every n hours, even if somebody touches the object more than once.&lt;br /&gt;
|-&lt;br /&gt;
|[[Give random object]]&lt;br /&gt;
|{{User|Emmas Seetan}}&lt;br /&gt;
|Touch to receive a random object in the prim&#039;s inventory&lt;br /&gt;
|-&lt;br /&gt;
|[[Giver]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A menu-driven script that will hand out the objects in a prim. Supports multiple pages.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Yumi Murakami/Golden Vendor|Golden Vendor]]&lt;br /&gt;
|{{User|Yumi Murakami}}&lt;br /&gt;
|A cross between a vendor and a game.&lt;br /&gt;
|-&lt;br /&gt;
|[[Google Charts]]&lt;br /&gt;
|{{User|Dedric Mauriac}}&lt;br /&gt;
|Create links to display raw data as a chart image.&lt;br /&gt;
|-&lt;br /&gt;
|[[Google_Translator]]&lt;br /&gt;
|{{User|Ugleh Ulrik}}&lt;br /&gt;
|Translates spanish to english, and its simple to make it any other way.&lt;br /&gt;
|-&lt;br /&gt;
|[[Go transparent when walking]]&lt;br /&gt;
|{{User|Emmas Seetan}}&lt;br /&gt;
|An attachment that goes invisible when you walk and visible when you don&#039;t walk.&lt;br /&gt;
|-&lt;br /&gt;
|[[Great Wanderer]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A movement system based on [[Wizardry and Steamworks|State Machines]] which provides free roaming.&lt;br /&gt;
|-&lt;br /&gt;
|[[Greeter]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A multi-purpose greeter with multiple options (IM, landmark, notecard, URL, visitor statistics, shared access and compatible with the [[Mail]] system) that could work for shops, clubs, galleries and any other public place.&lt;br /&gt;
|-&lt;br /&gt;
|[[Group Authorization]]&lt;br /&gt;
|{{User|Chase Quinnell}}&lt;br /&gt;
|Checks to see if object is set to appropriate group (checks by [[Group key finder|group key]])&lt;br /&gt;
|-&lt;br /&gt;
|[[Group key finder]]&lt;br /&gt;
|{{User|Emmas Seetan}}&lt;br /&gt;
|Touch to find the key of the group&lt;br /&gt;
|-&lt;br /&gt;
|[[Group Privacy]]&lt;br /&gt;
|{{User|Chance Unknown}}&lt;br /&gt;
|Security device to insure members of a group can have a private area. Deactivates when nobody present.&lt;br /&gt;
|-&lt;br /&gt;
|[[Hello Avatar]]&lt;br /&gt;
|Linden Lab&lt;br /&gt;
|SL&#039;s default script.&lt;br /&gt;
|-&lt;br /&gt;
|[[Hello Avatar Companion]]&lt;br /&gt;
|[[Chase Quinnell]]&lt;br /&gt;
|Companion to the original [[Hello Avatar]] script&lt;br /&gt;
|-&lt;br /&gt;
|[[Hierarchics]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
| Advanced script to create an efficient self-aware hierarchic structure.&lt;br /&gt;
|-&lt;br /&gt;
|[[Hierarchics2]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
| Second generation, one script per object. Only two functions, can be embedded in others. Uses the new [[llSetLinkPrimitiveParamsFast]]/[[llGetLinkPrimitiveParams]] functions.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Rolig_Loon/High-Capacity_Greeter-Counter|High-Capacity Greeter-Counter]]&lt;br /&gt;
|{{User|Rolig Loon}}&lt;br /&gt;
|Uses a memory compression algorithm to store hashed visitor UUID&#039;s in a string instead of using a list.&lt;br /&gt;
|-&lt;br /&gt;
|[[Holodeck]]&lt;br /&gt;
|{{User|Revolution Perenti}}&lt;br /&gt;
|Home Rezzing System.&lt;br /&gt;
|-&lt;br /&gt;
|[[HUD Dots Radar]]&lt;br /&gt;
|[[User:Cerise Sorbet|Cerise]]&lt;br /&gt;
|HUD target example, draws dots on the HUD over avatars in view.&lt;br /&gt;
|-&lt;br /&gt;
|[[I Got It]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|Educational tool to provide feedback from students.&lt;br /&gt;
|-&lt;br /&gt;
|[[Intercom|Intercom]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A system allowing region-wide and grid-wide (as of 30 of August 2011, it also works grid-wide, a test was performed by linking up the chat between the OSGrid and SecondLife) mass chat relay. By using this you can relay a main chat across multiple regions or grids. The script was initially meant as a mid-way project in order to test and gather information for the [[Distributed Primitive Database]].&lt;br /&gt;
|-&lt;br /&gt;
|[[Interpolation|Interpolation Library]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
|A small set of interpolation functions.&lt;br /&gt;
|-&lt;br /&gt;
|[[Intra-Region Update Server]]&lt;br /&gt;
|[[User:Emma_Nowhere|Emma Nowhere]]&lt;br /&gt;
|Centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.&lt;br /&gt;
|-&lt;br /&gt;
|[[Inventory_Based_Menu]]&lt;br /&gt;
|{{User|Revolution Perenti}}&lt;br /&gt;
|Inventory Based Menu System.&lt;br /&gt;
|-&lt;br /&gt;
|[[iTunes RPC Email|iTunes RPC]]&lt;br /&gt;
|{{User|Fox Diller}}&lt;br /&gt;
|iTunes RPC via LSL [[llEmail]] and [[llRemoteDataReply]].&lt;br /&gt;
|-&lt;br /&gt;
|[[Jingle]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script that will make a primitive emit a sound when you wear it and walk around. Ideal for bells, footsteps and so on...&lt;br /&gt;
|-&lt;br /&gt;
|[[Key Frame Animator|Keyframe Animator]]&lt;br /&gt;
|{{User|Jasper Flossberg}}&lt;br /&gt;
| This is a KeyFrame Animator Script to simplify construction of keyframed animations.&lt;br /&gt;
|-&lt;br /&gt;
|[[Key Pad Door|Keypad Door]]&lt;br /&gt;
|{{User|Tdub Dowler}}&lt;br /&gt;
| Door and keypad with changeable code. Follow instructions carefully!&lt;br /&gt;
|-&lt;br /&gt;
|[[Key2Name]]&lt;br /&gt;
|{{User2|Nika Rugani}}&lt;br /&gt;
| Key2Name service where a user no longer needs to be in the same region to get users name&lt;br /&gt;
|-&lt;br /&gt;
|[[Kilt Editor|Kilt / Skirt Editor]]&lt;br /&gt;
|{{User|Brangus Weir}}&lt;br /&gt;
| This changes all the parameters of all the flexis in the link set in one swell foop!&lt;br /&gt;
|-&lt;br /&gt;
|[[Kira Warp Core Drive]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|Scripts and instructions on how to create a vehicle that teleports an avatar and a vehicle to any region on the grid. You can [http://www.youtube.com/watch?v=xQkBRD7HBvw watch the YouTube video showing the prototype] I created to demonstrate how it works.&lt;br /&gt;
|-&lt;br /&gt;
|[[Last Sound System]]&lt;br /&gt;
|Babbage Linden&lt;br /&gt;
|An LSL [http://Last.fm Last.fm] client.&lt;br /&gt;
|-&lt;br /&gt;
|[[LibObj]]&lt;br /&gt;
|{{User|Ochi Wolfe}}&lt;br /&gt;
|A library to manage state in LSL using an object-oriented approach.&lt;br /&gt;
|-&lt;br /&gt;
|[[LibraryDisplayLandScreenshot]]&lt;br /&gt;
|{{User|Jon Desmoulins}}&lt;br /&gt;
|A modified version of LibraryDisplayProfilePic using the new [[PARCEL_DETAILS_ID]] Implemented in Server v1.36&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Daemonika_Nightfire/Scripts/LinkNumber-List_in_llSetLinkPrimitiveParamsFast|LinkNumber-List_in_llSetLinkPrimitiveParamsFast]]&lt;br /&gt;
|{{User|Daemonika Nightfire}}&lt;br /&gt;
|Changed several prims in linkset with the same parameters, with a list. Without separate llSetLinkPrimitiveParams for each prim. (ideal for show/hide effects)&lt;br /&gt;
|-&lt;br /&gt;
|[[Limit Vendor]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|This is a vendor supporting any number of items with different prices which will only dispense a certain number of individual items by setting limits for each item based on a notecard configuration.&lt;br /&gt;
|-&lt;br /&gt;
|[[Linkset resizer]]&lt;br /&gt;
|Maestro Linden&lt;br /&gt;
|Systematically rescales a linkset by moving and resizing each prim (by using [[llGetLinkPrimitiveParams]] and [[llSetLinkPrimitiveParamsFast]])&lt;br /&gt;
|-&lt;br /&gt;
|[[Linkset resizer with menu]]&lt;br /&gt;
|{{User|Brilliant Scientist}}&lt;br /&gt;
|A menu-driven script that rescales a linkset by moving and resizing the prims using [[llGetLinkPrimitiveParams]] and [[llSetLinkPrimitiveParamsFast]] functions. Based on [[Linkset resizer]].&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Daemonika_Nightfire/Scripts/*DS*_Resize_Script|Resize Script (m/c/t) v2.0.01]]&lt;br /&gt;
|{{User|Daemonika Nightfire}}&lt;br /&gt;
|Single resize script for a complete linkset with save and restore option.&lt;br /&gt;
|-&lt;br /&gt;
|[[Pointing Stick]]&lt;br /&gt;
|{{User|rhonin Nissondorf}}&lt;br /&gt;
|A device that takes controls of your arrow keys and directs the device in the relative direction its pointing, forward and back of course.&lt;br /&gt;
|-&lt;br /&gt;
|[[Gun Script]]&lt;br /&gt;
|[[User:rhonin Nissondorf| rhonin Nissondorf]]&lt;br /&gt;
|Shoots out &amp;quot;ammo&amp;quot; from the root prim of your &amp;quot;gun&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|[[Grenade Script]]&lt;br /&gt;
|[[User:rhonin Nissondorf| rhonin Nissondorf]]&lt;br /&gt;
|Uses a timed factor to add influence to the velocity of a throw object.&lt;br /&gt;
|-&lt;br /&gt;
|[[Linkset Resizer 2]]&lt;br /&gt;
|{{User|Emma Nowhere}}&lt;br /&gt;
|A more user-friendly resizer script designed for either drop-in use by the end-user or builder or for use in products. Based on [[Fix Small Prims]].&lt;br /&gt;
|-&lt;br /&gt;
|[[List2CSV]]&lt;br /&gt;
|{{User|Kunnis Basiat}}&lt;br /&gt;
|Similar to [[llList2CSV]] &amp;amp; [[llCSV2List]] which includes preserving type and escaping characters.&lt;br /&gt;
|-&lt;br /&gt;
|[[list_cast]]&lt;br /&gt;
|{{User2|Fractured Crystal}}&lt;br /&gt;
|Casts a list of strings into the type they appear to be. Designed for preprocessing user input for feeding into [[llSetPrimitiveParams]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Listener Script]]&lt;br /&gt;
|{{User|Emmas Seetan}}&lt;br /&gt;
|Use to [[listen]] to other people&#039;s conversations (Like spying)&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Functions#List:_Find_Last_Index|List: Find Last Index]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Returns the last index of searched item in a source list. (backwards version of [[llListFindList]])&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Functions#List:_Multi-Find_Index_.28First_or_Last.29|List: Multi Find]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Returns the first found index of multiple search items in a list. (Multi-item version of [[llListFindList]]. Fwd and Rev versions included)&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Functions#List:_Get_Reverse_Order|List: Reverse]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Returns an input List in reverse order&lt;br /&gt;
|-&lt;br /&gt;
|[[LinksetIndexing]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
|Functions for indexing a linkset by patterns or names down to their linkset numbers.&lt;br /&gt;
|-&lt;br /&gt;
|[[llGetAgentList Sim-Wide Radar]]&lt;br /&gt;
|{{User|Tiaeld Tolsen}}&lt;br /&gt;
|Simple radar implementation using the new [[llGetAgentList]] LSL Function.&lt;br /&gt;
|-&lt;br /&gt;
|[[Live Event Timeout]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script which will set the the music URL back to a radio station of your liking when a DJ leaves or forgets to switch back the URL after a live event. It takes multiple DJs, using a notecard and several configuration parameters.&lt;br /&gt;
|-&lt;br /&gt;
|[[LOGO Turtle]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script that interprets basic LOGO commands, extending the directions to 3D.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Kephra_Nurmi/lsDancemachine|lsDancemachine]]&lt;br /&gt;
|[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
| Low lag client server dancemachine.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Kephra_Nurmi/lsDeejay|lsDeejay Home Edition]]&lt;br /&gt;
|[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
| Client server media control for music, video, youtube, pictures, and texture animations.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Kephra_Nurmi/lsDialog|lsDialog]]&lt;br /&gt;
|[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
| Universal notecard driven menu dialog system.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Kephra_Nurmi/lsDisplay|lsDisplay]]&lt;br /&gt;
|[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
| Picture cycler with preloader.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Kephra_Nurmi/lsDistributor|lsDistributor]]&lt;br /&gt;
|[[User:Kephra_Nurmi|Kephra Nurmi]]&lt;br /&gt;
| Simple &#039;try&#039; and &#039;buy&#039; vendor system.&lt;br /&gt;
|-&lt;br /&gt;
|[[Wizardry_and_Steamworks/LSL|LSL FUSS]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|FUSS (Frequently Used Short Snippets) is an collection of short snippets provided by [[Wizardry and Steamworks]]. They range from functions to one-liners and are provided for LSL developers.&lt;br /&gt;
|-&lt;br /&gt;
|[[LSL_languageAPI]]&lt;br /&gt;
|{{User|Gypsy Paz}}&lt;br /&gt;
|Multi-lingual API from notecard based language files&lt;br /&gt;
|-&lt;br /&gt;
|[[Mail]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|An system for sending objects to multiple recipients automatically supporting shared access and [[Greeter]] compatible auto-subscriptions.&lt;br /&gt;
|-&lt;br /&gt;
|[[Mandelbrot Explorer]]&lt;br /&gt;
|Babbage Linden&lt;br /&gt;
|An interactive fractal explorer.&lt;br /&gt;
|-&lt;br /&gt;
|[[Materialization Effects]]&lt;br /&gt;
|{{User|Overbrain Unplugged}}&lt;br /&gt;
| Special effects to add to rezzing events to simulate a teleportation or materialization.&lt;br /&gt;
|-&lt;br /&gt;
|[[Materialization Effects 2]]&lt;br /&gt;
|{{User2|Nika Rugani}}&lt;br /&gt;
| More efficient and faster version of Materialization Effects by Overbrain Unplugged.&lt;br /&gt;
|-&lt;br /&gt;
|[[Memory Module]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|An example of pseudo-persistent variable in-world storage.&lt;br /&gt;
|-&lt;br /&gt;
|[[Merge Sort]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|Implements a Merge Sort in LSL, however this code is 300(ish) times slower than [[llListSort]]. Don&#039;t use this in a script!&lt;br /&gt;
|-&lt;br /&gt;
|[[Minesweeper]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|A simple minesweeper game.&lt;br /&gt;
|-&lt;br /&gt;
|[[Mood Color Changer]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script that changes the color of all primitives in a linkset depending on the smileys the owner types on the main chat.&lt;br /&gt;
|-&lt;br /&gt;
|[[Morse Code]]&lt;br /&gt;
|{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
|A script that allows for the conversion to and from morse code and can &amp;quot;play&amp;quot; morse code.&lt;br /&gt;
|-&lt;br /&gt;
|[[Multi-displays Texture Cycler]]&lt;br /&gt;
|{{User|Nargus Asturias}}&lt;br /&gt;
|A simple texture rotator designed for multiple display screens. With delay between each screen AND delay between each loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[Multi Item Rezzer|Multi Item Rezzer]]&lt;br /&gt;
|{{User|Jesse Barnett}}&lt;br /&gt;
|A rework of my old High Altitude Rezzer. Place the objects that you wish to choose from to be rezzed inside. Sit on the rezzer and pick the item and the height. It will go to target height and rez the object.&lt;br /&gt;
|-&lt;br /&gt;
|[[Multirezzer|Multirezzer (on collision)]]&lt;br /&gt;
|{{User2|Beet Streeter}}&lt;br /&gt;
|Spawns up to 10 objects when the object containing the script collides with a user.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Allen_Kerensky/Myriad_Lite_Preview_5|Myriad Lite Preview 5 RPG System]]&lt;br /&gt;
|[[User:Allen_Kerensky|Allen Kerensky]]&lt;br /&gt;
|Working preview of the Myriad Universal RPG System by Ashok Desai, converted to LSL as a roleplay meter with quest NPC and goals, hand-to-hand and melee close combat, ranged combat, armor, healing, bullet, firearm, holster, practice target, and much more&lt;br /&gt;
|-&lt;br /&gt;
|[[N2K]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A Name To Key (Name2Key) implementation that does not use third-party databases, nor relies on the uptime of not well known websites but rather uses the World Wide Web Consortium to fetch the key of avatars while trying to alert the developers of the consequences of using Name2Key third-party providers as well as trying to refrain from sales pitch terminology such as &amp;quot;best&amp;quot;, &amp;quot;newest&amp;quot; and &amp;quot;fastest&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|[[Name2Key in LSL]]&lt;br /&gt;
|{{User|Maeva Anatine}}&lt;br /&gt;
|Get the Name2Key feature inside your scripts. Works even on lastly subscribed avatars.&lt;br /&gt;
|-&lt;br /&gt;
|[[Name2Key]]&lt;br /&gt;
|{{User2|Nika Rugani}}&lt;br /&gt;
|Newest and fastest Name2Key search, While the database is small it is also connected to Second Life&#039;s search.&lt;br /&gt;
|-&lt;br /&gt;
|[[NexiiText]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
| Text Renderer, specialised in features, performance and a compact nature. It features unique per character control, such as Colour, Bold, Italics, Underline, Stroke, Icons. The high performance means it comes in at a 5 char / prim ratio, but it is perfect where highly dynamic and rich text is required.&lt;br /&gt;
|-&lt;br /&gt;
|[[NexiiText2]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
| Second Gen Text Renderer. Same as above but features use of [[PRIM_LINK_TARGET]] and an awesome dynamic prim allocation architecture.&lt;br /&gt;
|-&lt;br /&gt;
|[[No Auto-Return]]&lt;br /&gt;
|{{User|Bellla Clarity}}&lt;br /&gt;
|To stop your long and hard builds from getting returned in sandboxes (&#039;&#039;only single prims, though!&#039;&#039;).&lt;br /&gt;
|-&lt;br /&gt;
|[[No Auto-Return NR]]&lt;br /&gt;
|{{User|Jor3l Boa}}&lt;br /&gt;
|This really works (29-05-09), needs a nearby region to do the trick and avoid auto return. (Tested on Blue and Rausch)&lt;br /&gt;
|-&lt;br /&gt;
|[[No Auto-Return (Multi)]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|A revision of Bella&#039;s that works for multi-prim objects.&lt;br /&gt;
|-&lt;br /&gt;
|[[No Limit Teleporter]]&lt;br /&gt;
|{{User|Morgam Biedermann}}&lt;br /&gt;
|Teleport to infinite altitudes (up to 4096m)&lt;br /&gt;
|-&lt;br /&gt;
|[[Object Size]]&lt;br /&gt;
|{{User|Chase Quinnell}}&lt;br /&gt;
|Gets the dimensions and footprint of a linkset&lt;br /&gt;
|-&lt;br /&gt;
|[[Object to Data v1.4|Object to Data]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|Turns an object into text (and back). Allows people to transfer objects through notecards (or otherwise).&lt;br /&gt;
|-&lt;br /&gt;
|[[Online Indicator|Online Indicator]]&lt;br /&gt;
|{{User|Kristy Fanshaw}}&lt;br /&gt;
|Will show if the user is online or not. Displays users profile picture and allows to send IM&#039;s to user. Also gives a link to open the users profile&lt;br /&gt;
|-&lt;br /&gt;
|[[Open Group Join]]&lt;br /&gt;
|{{User|Alicia Stella}}&lt;br /&gt;
|User Touches Object to Join Group from Group Info window, (no bot.)&lt;br /&gt;
|-&lt;br /&gt;
|[[Open Prim Animator]]&lt;br /&gt;
|{{User|Todd Borst}}&lt;br /&gt;
|Single script prim animation tool.  Menu driven, easy to use.&lt;br /&gt;
|-&lt;br /&gt;
|[[Open Zyngo Skin Installer]]&lt;br /&gt;
|{{User2|Tmzasz Luminos}}&lt;br /&gt;
|A Simple Script designed to install skins on the popular Skill machines.&lt;br /&gt;
|-&lt;br /&gt;
|[[Orbitor]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|Based on [[Wanderer]], we create [[Orbitor]] which allows a primitive to orbit around an origin point.&lt;br /&gt;
|-&lt;br /&gt;
|[[One Script, many doors]]&lt;br /&gt;
|{{User|Kyrah Abattoir}}&lt;br /&gt;
|Door script able to manage more than 50 linked doors from a single script instance.&lt;br /&gt;
|-&lt;br /&gt;
|[[ParseString2List]]&lt;br /&gt;
|{{User|Strife Onizuka}}&lt;br /&gt;
|Same as [[llParseString2List]] and [[llParseStringKeepNulls]], but not limited to 8 spacers or separators. Thus substitute a call to the [[llParseString2List]] and [[llParseStringKeepNulls]] functions by a call to [[Parse_String_To_List|ParseString2List]] whenever you have more than 8 separators or more than 8 spacers.&lt;br /&gt;
|-&lt;br /&gt;
|[[Password Generator]]&lt;br /&gt;
|{{User2|Syntrax Canucci}}&lt;br /&gt;
|This is an over-complicated, semi-complex password generator, which goes through multiple steps.&lt;br /&gt;
|-&lt;br /&gt;
|[[Pathfinder]]&lt;br /&gt;
|Babbage Linden&lt;br /&gt;
|A potential field based pathfinding library.&lt;br /&gt;
|-&lt;br /&gt;
|[[Pay to Strip]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|This script is mainly meant for dancers and uses RLV to allow people to strip an avatar by making every clothes and attachment piece removable, respectively detachable for a settable price.&lt;br /&gt;
|-&lt;br /&gt;
|[[Permanent Primitive URL]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script that uses [http://tiny.cc http://tiny.cc] REST API to update a SIM URL and make it permanent. Full description on how to register and set up a &amp;quot;nice&amp;quot; URL, like: http://tiny.cc/Kira. Should work with most URL shortening services (I&#039;m not affiliated with tiny.cc except for having a pass at them for not allowing OpenSIM-style generated URLs).&lt;br /&gt;
|-&lt;br /&gt;
|[[Personal ATM Machine]]&lt;br /&gt;
|{{User|Jessikiti Nikitin}}&lt;br /&gt;
|Allows deposits and withdrawals into another of your accounts, without the account being logged in.&lt;br /&gt;
|-&lt;br /&gt;
|[[Phantom Child]]&lt;br /&gt;
|{{User|Aeron Kohime}}&lt;br /&gt;
|Causes a child in a link set to become phantom without the entire object becoming phantom.&lt;br /&gt;
|-&lt;br /&gt;
|[[PHP_RegionFunctions]]&lt;br /&gt;
|{{User|Gypsy Paz}} and {{User2|Zayne Exonar}}&lt;br /&gt;
|Three useful PHP functions to get region info&lt;br /&gt;
|-&lt;br /&gt;
|[[PhysicsLib]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
| Interesting set of fun physics functions.&lt;br /&gt;
|-&lt;br /&gt;
|[[Planar Tile Generator]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script to generate perfectly aligned tiles.&lt;br /&gt;
|-&lt;br /&gt;
|[[Play and Loop Sound]]&lt;br /&gt;
|{{User|Bellla Clarity}}&lt;br /&gt;
|Very short and simple script; plays and loops a sound in an object.&lt;br /&gt;
|-&lt;br /&gt;
|[[Posing stand|Posing Stand]]&lt;br /&gt;
|{{User|Bellla Clarity}}&lt;br /&gt;
|Just a pose script to edit [[attachments]] more easily.&lt;br /&gt;
|-&lt;br /&gt;
|[[PosJump]]&lt;br /&gt;
|{{User|Uchi Desmoulins}}&lt;br /&gt;
|A much more efficient alternative to the popular [[warpPos]] function for bypassing 10m distance-moved limitations.&lt;br /&gt;
|-&lt;br /&gt;
|[[Puppeteer]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A simple puppeteer script that will allow you to record and animate prim movements and rotations.&lt;br /&gt;
|-&lt;br /&gt;
|[[Primitive Name Changer]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
| A script that changes the primitive&#039;s name based on an user-configurable interval and a notecard list containing possible names.&lt;br /&gt;
|-&lt;br /&gt;
|[[Prefix Calculator]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
| A calculator that evaluates expressions in prefix notation.&lt;br /&gt;
&amp;lt;code&amp;gt;+ 3 4 = 5. * + 1 2 + 3 4 = 14.&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Profile Generator]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A cynical script for generating boilerplate profiles by based on cliches and profile memes.&lt;br /&gt;
|-&lt;br /&gt;
|[[Profile Picture]]&lt;br /&gt;
|[[User: Jor3l Boa|Jor3l Boa]]&lt;br /&gt;
|A working profile picture script with the new SecondLife API (1/11/2011)&lt;br /&gt;
|-&lt;br /&gt;
|[[Progress Bar]]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
| Flexible and powerful little function for creating progress bars useful in hovertext.&lt;br /&gt;
|-&lt;br /&gt;
|[[Pseudo-random Number Generator]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|Generates a Pseudo-random number between -0x7FFFFFFF and 0x7FFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[Quick Collar]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A simple, no-bulk, no external database and essential feature-packed RLV collar script for your pleasures.&lt;br /&gt;
|-&lt;br /&gt;
|[[Quicksort]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|LSL implementation of the Quicksort algorithm.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Rolig_Loon/Quiz_From_Notecard|Quiz From Notecard]]&lt;br /&gt;
|{{User|Rolig Loon}}&lt;br /&gt;
|A multiple-choice testing script that reads questions and answer choices from a notecard and presents them in dialog boxes.&lt;br /&gt;
|-&lt;br /&gt;
|[[Racter]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|In-world, multi-purpose chatterbot (Eliza/A.L.I.C.E. inspired) supporting multiple configurable hot-swappable brain-files with a wide range of applications.&lt;br /&gt;
|-&lt;br /&gt;
|[[Rainbow_palette]]&lt;br /&gt;
|{{User|Rui Clary}}&lt;br /&gt;
|Build a color picker, using only one prim, and a few lines of code.&lt;br /&gt;
|-&lt;br /&gt;
|[[Random Gaussian Number Generator]]&lt;br /&gt;
|{{User2|Vlad Davidson}}&lt;br /&gt;
|Generates a random number drawn from a normal (Gaussian; bell-curve) distribution, based on a specified mean/stdev&lt;br /&gt;
|-&lt;br /&gt;
|[[Random AV Profile Projector]]&lt;br /&gt;
|{{User|Debbie Trilling}}&lt;br /&gt;
|Randomly selects an AV from a crowd &amp;amp; then projects their profile picture as a &#039;holographic&#039; image&lt;br /&gt;
|-&lt;br /&gt;
|[[Random Object Vendor]]&lt;br /&gt;
|{{User|CodeBastard Redgrave}}&lt;br /&gt;
|Simple vendor that gives out random objects when paid the right amount&lt;br /&gt;
|-&lt;br /&gt;
|[[Random Password Generator]]&lt;br /&gt;
|{{User|Jor3l Boa}}&lt;br /&gt;
|Generate Random passwords based on String Length.&lt;br /&gt;
|-&lt;br /&gt;
|[[RandomPrimParams]]&lt;br /&gt;
|{{User|Xintar Citron}}&lt;br /&gt;
|Simple script which randoms Prim Parameteres, in this example i used color, but you can use everything.&lt;br /&gt;
|-&lt;br /&gt;
|[[RavText]]&lt;br /&gt;
|{{User|Ravenous Dingo}}&lt;br /&gt;
|An alternate to XyText.  This is a lightweight, multiple font 10 character text display system.  It only supports uppercase alphanumeric text and a few special characters, but it is very fast, renders quickly and supports multiple fonts. It is meant for specialized use when all that is desired is basic, fast text display and the extra &amp;quot;bells and whistles&amp;quot; are not needed.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:PixelProphet Lane/Scripts#Real Object Inventory To Dialog|Real Object Inventory To Dialog]]&lt;br /&gt;
|{{User|PixelProphet Lane}}&lt;br /&gt;
|Display any amount of items contained in an Object in a Dialog, regardless of item name length.&lt;br /&gt;
|-&lt;br /&gt;
|[[RentalBoxv1|Rental Box, Simply]]&lt;br /&gt;
|{{User2|Sendao Goodman}}&lt;br /&gt;
|Simple explanation of how to make rental boxes.&lt;br /&gt;
|-&lt;br /&gt;
|[[Rental Cube]]&lt;br /&gt;
|{{User|Hank Ramos}}&lt;br /&gt;
|Simple cube for renting out a space.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Daemonika_Nightfire/Scripts/*DS*_Rental-Cube|Rental-Cube]]&lt;br /&gt;
|{{User|Daemonika Nightfire}}&lt;br /&gt;
|This is an Open-Source version of a Rental-Cube from Daemonika Nightfire. Just copy/paste this script into a inworld lsl-script and add one notecard called Info/Rules to the content of your cube.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Ackley Bing/Textbox2Hovertext|Textbox2Hovertext]]&lt;br /&gt;
|[[User:Ackley Bing|Ackley]]&lt;br /&gt;
|A simple script to allow hovertext to be set with a dialog text box.&lt;br /&gt;
|-&lt;br /&gt;
|[[Remote Texture Loader]]&lt;br /&gt;
|{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
|A set of scripts for remotely loading textures within a sim. This means that a single &amp;quot;texture server&amp;quot; can manage multiple changing billboards within a sim.&lt;br /&gt;
|-&lt;br /&gt;
|[[Say Region Frames Per Second|Region Frames Per Second]]&lt;br /&gt;
|{{User2|Heymeriou Mystakidou}}&lt;br /&gt;
| Says the region name and frames per second out loud on command.&lt;br /&gt;
|-&lt;br /&gt;
|[[Security Orb|Security Orb]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A regular security orb that ejects people from a land parcel supporting a menu configuration and a notecard based access list.&lt;br /&gt;
|-&lt;br /&gt;
|[[Resizer multi-prims|Resizer multi-prims]]&lt;br /&gt;
|{{User2|Christy Mansbridge}}&lt;br /&gt;
|1 Mono script to resize object (1 to 256 prims) by blue menu. Avoid risk to break the build by increasing link distance.&lt;br /&gt;
|-&lt;br /&gt;
|[[RLV Collision Grabber]]&lt;br /&gt;
|[[User:Vala_Vella|Vala Vella]]&lt;br /&gt;
|Grab people colliding with the object and sit them on a set target using RLV&lt;br /&gt;
|-&lt;br /&gt;
|[[sbDialog]]&lt;br /&gt;
|[[User:Siann_Beck|Siann Beck]]&lt;br /&gt;
|A simple replacement function for [[llDialog]]. It re-orders the button list so that the button values, as passed to it, display left-to-right, top-to-bottom. It also opens a [[llListen|listen]] on the specified channel, and returns the handle.&lt;br /&gt;
|-&lt;br /&gt;
|[[Scheduled Payments]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script that will allow you to make scheduled (and reoccurring) payments to multiple avatars via a notecard.&lt;br /&gt;
|-&lt;br /&gt;
|[[Scheduler]]&lt;br /&gt;
|{{User|Haravikk Mistral}}&lt;br /&gt;
|Schedule multiple events using a single script timer&lt;br /&gt;
|-&lt;br /&gt;
|[[Scheme_Interpreter|Scheme Interpreter]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|A scheme interpreter capable of handling most scheme expressions, including lambda and lists.&lt;br /&gt;
|-&lt;br /&gt;
|[[Script Override Functions]]&lt;br /&gt;
|{{User|Revolution Perenti}}&lt;br /&gt;
|bypass default strings, integer etc in chat channel.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Toady_Nakamura/Scrubber_Script|Script Scrubber]]&lt;br /&gt;
|{{User|Toady Nakamura}}&lt;br /&gt;
|Script scrubs memory resident script functions from prim and self-deletes the script. Does not damage the prim, or remove other scripts.  Use this to kill bling or other particle effects!&lt;br /&gt;
|-&lt;br /&gt;
|[[Scripted Attachment Detector.lsl|Scripted Attachment Detector]]&lt;br /&gt;
|{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
|A script that will display avatars wearing scripted attatchments in hovertext. This may be worn as an hud or rezzed.&lt;br /&gt;
|-&lt;br /&gt;
|[[Self Upgrading Script Enhanced]]&lt;br /&gt;
|{{User|Cron Stardust}}&lt;br /&gt;
|Keeps only latest version of the script on prim (even with multiple adds of the same script!)&lt;br /&gt;
|-&lt;br /&gt;
|[[Sensor Visualizer]]&lt;br /&gt;
|{{User|Cerise Sorbet}}&lt;br /&gt;
|Shows the size and shape you get with [[llSensor]] range and arc parameters&lt;br /&gt;
|-&lt;br /&gt;
|[[Serverless Key Exchange]]&lt;br /&gt;
|{{User2|Sendao Goodman}}&lt;br /&gt;
|Maintains a network of object keys without using an external server.&lt;br /&gt;
|-&lt;br /&gt;
|[[SetLinkText]]&lt;br /&gt;
|{{User2|Tacusin Memo}}&lt;br /&gt;
|Custom function like [[llSetText]] only applying to linked sets.&lt;br /&gt;
|-&lt;br /&gt;
|[[SHA-1|SHA-1 Hash]]&lt;br /&gt;
|{{User|Strife Onizuka}}&lt;br /&gt;
|Performs a SHA-1 Hash on an input text. Similar to MD5 only (slightly) more secure.&lt;br /&gt;
|-&lt;br /&gt;
|[[SHA-2|SHA-2 Hash]]&lt;br /&gt;
|{{User|Strife Onizuka}}&lt;br /&gt;
|Performs a SHA-2 Hash on an input text. Similar to SHA-1 only (slightly) more secure.&lt;br /&gt;
|-&lt;br /&gt;
|[[Shoutcast - radio controller v0.3 (remake of similar scripts)]]&lt;br /&gt;
|{{User|Flennan Roffo}}&lt;br /&gt;
|Control your shoutcast radio stations with this shoutcast controller. Uses notecard for info about genres and stations and menu to select the station. Sends info to Xytext display.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:PixelProphet Lane/Scripts#Show Agent Script Count and memory|Show Agent Script Count and memory]]&lt;br /&gt;
|{{User|PixelProphet Lane}}&lt;br /&gt;
|Fast and efficient method to display the amount of scripts and memory usage for an agent&lt;br /&gt;
|-&lt;br /&gt;
|[[Sim Map Particle Projector]]&lt;br /&gt;
|{{User|Jesse Barnett}}&lt;br /&gt;
|Displays a floating map of the sim the script is in.&lt;br /&gt;
|-&lt;br /&gt;
|[[Sim Performance Collector (Web-based]]&lt;br /&gt;
|{{User2|DeniseHoorn Slade}}&lt;br /&gt;
|Makes some graphs for your website on the sim-performance (DIL,FPS, PING). PHP and Round Robin Database on Server needed!&lt;br /&gt;
|-&lt;br /&gt;
|[[Sim Restart Logger]]&lt;br /&gt;
|{{User|Kyrah Abattoir}}&lt;br /&gt;
|Counts region restarts and displays log of last 9 restarts together with region FPS and dilation.&lt;br /&gt;
|-&lt;br /&gt;
|[[SIM status]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script that will scan and display the status of SIMs (up, down, starting, stopping, unknown, crashed) from a notecard in the same prim as the script.&lt;br /&gt;
|-&lt;br /&gt;
|[[Simple Elevator in a Box]]&lt;br /&gt;
|{{User|Hank Ramos}}&lt;br /&gt;
|Simple elevator example.&lt;br /&gt;
|-&lt;br /&gt;
|[[Simple Pay Door]]&lt;br /&gt;
|{{User|Giygas Static}}&lt;br /&gt;
|Simple door you pay to get access.&lt;br /&gt;
|-&lt;br /&gt;
|[[Skillingo AntiHack Script]]&lt;br /&gt;
|{{User2|Tmzasz Luminos}}&lt;br /&gt;
|A simple Protection script for skillingo thats modifyable to work with other machines.&lt;br /&gt;
|-&lt;br /&gt;
|[[Skunk Money]]&lt;br /&gt;
|{{User|Hank Ramos}}&lt;br /&gt;
|Fun gambling machine of yesteryear, which only supports freeplay now due to SL regulations against gambling.&lt;br /&gt;
|-&lt;br /&gt;
|[[SLateIt]]&lt;br /&gt;
|Babbage Linden&lt;br /&gt;
|An augmented virtual reality HUD.&lt;br /&gt;
|-&lt;br /&gt;
|[[SLetanque]]&lt;br /&gt;
|Babbage Linden&lt;br /&gt;
|An LSL petanque game.&lt;br /&gt;
|-&lt;br /&gt;
|[[SLURL HUD]]&lt;br /&gt;
|{{User|CodeBastard Redgrave}}&lt;br /&gt;
|Touch this HUD to get a SLURL through IM, email and floating text.&lt;br /&gt;
|-&lt;br /&gt;
|[[BuildSlurl (NewAge)]]&lt;br /&gt;
|{{User2|Archile Azalee}}&lt;br /&gt;
|A way to create a SLurl in a single function BuildSlurl&lt;br /&gt;
|-&lt;br /&gt;
|[[SL Mail V1.2]]&lt;br /&gt;
|{{User|Flennan Roffo}}&lt;br /&gt;
|Second Life mail client V1.2 (released sept&#039;07). Send and receive mail from within Second Life from and to any address. With Address Book function and many chat commands. V1.3 is upcoming soon!&lt;br /&gt;
|-&lt;br /&gt;
|[[SL_NTPoHTTP_v1.1_client|SL NTPoHTTP client]]&lt;br /&gt;
|{{User|SignpostMarv Martin}}&lt;br /&gt;
|Second Life Needs Time Parsing over Hyper Text Transfer Protocol&lt;br /&gt;
Emulates the function of [[llGetWallclock]] for any timezone by using SLOpenID&#039;s SLNTPoHTTP service. Also supports ISO 8601 and RFC 2822 timestamps. Script is dependent upon an external service operated by the author!&lt;br /&gt;
|-&lt;br /&gt;
|[[Slide Display]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A display for presentations or talks supporting multiple slides as well as zooming-in on the slides.&lt;br /&gt;
|-&lt;br /&gt;
|[[Smile]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|An extended smile script supporting two smiles (extendable via a list) and a time delay triggering them at random.&lt;br /&gt;
|-&lt;br /&gt;
|[[Smooth Rotating Door]]&lt;br /&gt;
|{{User|Toy Wylie}}&lt;br /&gt;
|A script for doors that open and close smoothly using llTargetOmega&lt;br /&gt;
|-&lt;br /&gt;
|[[Smooth Rotating Linked Door With Hinge]]&lt;br /&gt;
|{{User2|Lyn Mimistrobell}}&lt;br /&gt;
|A script for linked uncut (mesh) doors that smoothly rotates around a virtual hinge without the use of timers&lt;br /&gt;
|-&lt;br /&gt;
|[[Smooth Sliding Door]]&lt;br /&gt;
|{{User|SimonT Quinnell}}&lt;br /&gt;
|A script for sliding doors that open and close smoothly using [[llMoveToTarget]]. Asjusts for prim orientation.&lt;br /&gt;
|-&lt;br /&gt;
|[[Snake Game]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|The game of snake in Second Life.&lt;br /&gt;
|-&lt;br /&gt;
|[[Song Requests]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|Helper script for DJs, allowing listeners to request songs and make dedications.&lt;br /&gt;
|-&lt;br /&gt;
||[[Sound Preloader]]&lt;br /&gt;
|[[User:Trinity Dejavu|Trinity Dejavu]]&lt;br /&gt;
||A tripwire that preloads a selection of sound files when avatar collides with prim.&lt;br /&gt;
|-&lt;br /&gt;
|[[Speed Tester]]&lt;br /&gt;
|{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
|Similar to the [[Efficiency Tester]], this script allows you to test the speed of a particular function or snippet with multiple trials giving min/max/avg/median and the standard deviation.&lt;br /&gt;
|-&lt;br /&gt;
|[[Spiral Staircase Generator]]&lt;br /&gt;
|{{User|Meyermagic Salome}}&lt;br /&gt;
|Generates nice looking spiral staircases without much hassle.&lt;br /&gt;
|-&lt;br /&gt;
|[[Static URL&#039;s for HTTP-In Service|Static_URLs]]&lt;br /&gt;
|{{User|Jor3l Boa}}&lt;br /&gt;
|How to generate a static url for HTTP-In temporal limitations.&lt;br /&gt;
|-&lt;br /&gt;
|[[String Compare]]&lt;br /&gt;
|{{User|Xaviar Czervik}}&lt;br /&gt;
|Compares two strings and reliably returns either 1, -1, or 0 if they are the same.&lt;br /&gt;
|-&lt;br /&gt;
|[[Synchronize]]&lt;br /&gt;
|{{User|Cay Trudeau}}&lt;br /&gt;
|Makes synchronized start to a task on even/odd seconds&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Functions#String:_Find_Last_Index|String: Reverse]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Returns an input string in reverse order&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Functions#String:_Get_Reverse_Order|String: Last Index]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Returns the last index of search found in string (the backward equivalent of [[llSubStringIndex]])&lt;br /&gt;
|-&lt;br /&gt;
|[[Tail Messages (NewAge)]]&lt;br /&gt;
|{{User|Asia Snowfall}}&lt;br /&gt;
|A super nice easy to use script for those non-scripters out there! NewAge coding has done it again where you no longer need to scroll up and down adding buttons and adding messages, Features a tag system (you&#039;ll see what i mean :P)&lt;br /&gt;
|-&lt;br /&gt;
|[[Taper Door (minimalistic)]]&lt;br /&gt;
|{{User2|Kopilo Hallard}}&lt;br /&gt;
|A basic script for doors which open and close using taper.&lt;br /&gt;
|-&lt;br /&gt;
|[[Teleport HUD]]&lt;br /&gt;
|{{User|Jesse Barnett}}&lt;br /&gt;
|WORKS TO 4096 METERS!! Very user friendly teleport HUD. Add destinations by touching &amp;quot;Add&amp;quot; &amp;amp; naming destination in chat. Automatically gets sim name and coordinates. Will only display the destinations in the sim you are currently in. Demonstrates more advanced list manipulation and stride functions.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Programs#v7-D_Enh._Landmark-2-Map|Teleporter (landmark based)]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Uses Landmarks to offer map teleports. Works as Hud or inworld objects, just drop in landmarks and go.&lt;br /&gt;
|-&lt;br /&gt;
|[[Text_Scroller|Text Scroller]]&lt;br /&gt;
|[[User:Fred_Gandt|Fred Gandt]]&lt;br /&gt;
|A simple text display object that scrolls text (applied as a texture) from right to left (like &#039;&#039;those&#039;&#039; LED signs) in a continuous loop.&lt;br /&gt;
|-&lt;br /&gt;
|[[Bobbyb&#039;s texture changer|Texture Changers]]&lt;br /&gt;
|{{User|Bobbyb30 Swashbuckler}}&lt;br /&gt;
|A collection of texture changing scripts.&lt;br /&gt;
|-&lt;br /&gt;
|[[Texture Menu Management|Texture Management]]&lt;br /&gt;
|{{User|Revolution Perenti}}&lt;br /&gt;
|Dialog Menu based Texture Selection.&lt;br /&gt;
|-&lt;br /&gt;
|[[Texture Particle Poofer|Texture Particle Poofer]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|This is a generic dialog-based particle poofer, emitting textures towards an avatar for a configurable amount of time.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Xen_Lisle/Texture_Slide|Texture Slide]]&lt;br /&gt;
|{{User|Xen Lisle}}&lt;br /&gt;
|Slides a texture on mouse movement&lt;br /&gt;
|-&lt;br /&gt;
|[[Tic Tac Toe]]&lt;br /&gt;
|CG Linden&lt;br /&gt;
|Step by step demo on how to implement a larger scripting project&lt;br /&gt;
|-&lt;br /&gt;
|[[TightList]]&lt;br /&gt;
|{{User|Strife Onizuka}}&lt;br /&gt;
|Tight List is a family of functions for encoding lists as strings and then decoding them back into lists.&lt;br /&gt;
There are two flavors: TightList and TightListType. TightListType preserves types and uses a 6 char header, while TightList uses a 1 char header that doesn&#039;t preserve type.&lt;br /&gt;
|-&lt;br /&gt;
|[[Timer Module]]&lt;br /&gt;
|{{User|Isabelle Aquitaine}}&lt;br /&gt;
|Manage multiple timers via linked messages.&lt;br /&gt;
|-&lt;br /&gt;
|[[Two Avatars on single prim]]&lt;br /&gt;
|{{User2|Pale Janus|Cay Trudeau}}&lt;br /&gt;
|Allow two (or more) avatars to sit on same prim&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Functions#Unix_time_code_to_list_format|Timestamp:&amp;lt;br&amp;gt;Unix time code to list format]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|converts Unix timestamps to their [Y, M, D, h, m, s] equivalents (ex: 1234567890 to [2009, 2, 13, 3, 31, 30])&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Functions#List_format_to_Unix_time_code.|Timestamp:&amp;lt;br&amp;gt;List format to Unix time code]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|converts [Y, M, D, h, m, s] timestamps to their Unix equivalents (ex: [2009, 2, 13, 3, 31, 30] to 1234567890)&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Functions#Weekday_from_Unix_timestamp|Timestamp:&amp;lt;br&amp;gt;Weekday from Unix timestamp]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Gets weekday from Unix timestamps (ex: &amp;quot;Friday&amp;quot; from 1234567890)&lt;br /&gt;
|-&lt;br /&gt;
|[[Texture Repeater]]&lt;br /&gt;
|{{User2|Jenna Felton}}&lt;br /&gt;
|Observes textures and texture parameters on the prim. If changed, bulk-updates other prims in linkset.&lt;br /&gt;
|-&lt;br /&gt;
|[[The Stash (Bank)]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|This is a depositing system to link your secondary account (alt) to a prim in-world so you can retrieve money without switching back and forth between accounts. It supports setting an upper limit, sharing the stash if you wish, logging everybody who deposited money and retrieved money, sending money to a list of bookmarked avatars and getting a status of your current holdings. It also explains some tricks for developers, for example, how to get another timer() if your current timer() is used up already.&lt;br /&gt;
|-&lt;br /&gt;
|[[Tipjar]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|This is a fully fledged tipjar supporting shared access, split profits, inviting to group, handing over gifts, maintaining statistics of who tipped most and who tipped in general, eliminating deed to group and comes with an innovative feature: it periodically moves around from avatar to avatar in the room and returns back to its initial position after a sweep. This way your tijpar will not be static, but participate in the party!&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Functions#Weekday_from_.28_Y.2C_M.2C_D_.29_format|Timestamp:&amp;lt;br&amp;gt;Weekday from (Y, M, D) format]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Gets weekday from (Y, M, D) timestamps (ex: &amp;quot;Friday&amp;quot; from (2009, 2, 13))&lt;br /&gt;
|-&lt;br /&gt;
|[[Touch A Quote]]&lt;br /&gt;
|{{User|CodeBastard Redgrave}}&lt;br /&gt;
|Touch an object to read quotes sequentially from a notecard&lt;br /&gt;
|-&lt;br /&gt;
|[[Touring Balloon]]&lt;br /&gt;
|{{User|Hank Ramos}}&lt;br /&gt;
|Automated touring balloon with many options from long ago.  Always seems to work on one SL release, and not the other.&lt;br /&gt;
|-&lt;br /&gt;
|[[Towncrier]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A simple towncrier to be used in role-play SIMs or wherever there is a need to broadcast news in random intervals.&lt;br /&gt;
|-&lt;br /&gt;
|[[Trivia]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A trivia game engine with provided ready-made notecards.&lt;br /&gt;
|-&lt;br /&gt;
|[[Under Age Boot]]&lt;br /&gt;
|{{User|Chance Unknown}}&lt;br /&gt;
|Security device example to teleport home accounts below a minimum age limit; can be useful in combating free griefer accounts.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Rolig_Loon/UNDO_PosRot|UNDO_PosRot]]&lt;br /&gt;
|{{User|Rolig Loon}}&lt;br /&gt;
|Allows user to undo position and rotation changes that have been made &amp;quot;manually&amp;quot; to any or all prims in a linkset.&lt;br /&gt;
|-&lt;br /&gt;
|[[Universal Translator]]&lt;br /&gt;
|{{User|Hank Ramos}}&lt;br /&gt;
|Chat listener that handles seamless translation of public chat between 50+ written languages without the need for configuration.  Handles numerous avatars, auto-detects languages, and works together with multiple copies of translators to spread-workload using a sophisticated back-end communications sub-system.&lt;br /&gt;
|-&lt;br /&gt;
|[[Unix2DateTime]]&lt;br /&gt;
|{{User|Flennan Roffo}}&lt;br /&gt;
|Conversion from Unix time ([[llGetUnixTime]]()) to date and time string and vice versa.&lt;br /&gt;
|-&lt;br /&gt;
|[[Unmutable Descript Nagger]]&lt;br /&gt;
|{{User|Bobbyb30 Zohari}}&lt;br /&gt;
|To nag avatars to take off their scripted attatchments.&lt;br /&gt;
|-&lt;br /&gt;
|[[Unpacker On Rez (NewAge)]]&lt;br /&gt;
|{{User|Asia Snowfall}}&lt;br /&gt;
|A very simple to use script for all you creators out there, This script will enable you to send out boxed items and make it easier for users to unpack, Also features auto die on completion. Very simple to configure!&lt;br /&gt;
|-&lt;br /&gt;
|[[Unpacker On Touch (NewAge)]]&lt;br /&gt;
|{{User|Asia Snowfall}}&lt;br /&gt;
|Exactly like Unpacker On Rez, But changed some things about to make it Unpack On Touch&lt;br /&gt;
|-&lt;br /&gt;
|[[Update distributor]]&lt;br /&gt;
|{{User|Dale Innis}}&lt;br /&gt;
|Distribute an object (like a project update) to a list of people named in a notecard.&lt;br /&gt;
|-&lt;br /&gt;
|[[UUID2Channel]]&lt;br /&gt;
|{{User|Project Neox}}&lt;br /&gt;
|Optimised version of the original key2channel generators.&lt;br /&gt;
|-&lt;br /&gt;
|[[UUID Song Generator]]&lt;br /&gt;
|{{User2|Sendao Goodman}}&lt;br /&gt;
|Translates a UUID into a simple song and plays it.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/Programs#v7-D_Advanced_Visitor_Greeter|Visitor Greeter]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Reduced spam visitor greeter, highly configurable, easy to modify.&lt;br /&gt;
|-&lt;br /&gt;
|[[VariText]]&lt;br /&gt;
|[[User:Geneko Nemeth|Geneko Nemeth (Kakurady)]]&lt;br /&gt;
|Display text on a prim, without looking like from a typewriter&lt;br /&gt;
|-&lt;br /&gt;
|[[Visitor Logger (Web/Basic) ]]&lt;br /&gt;
|{{User|Buddy Sprocket}}&lt;br /&gt;
|A very basic visitor logger - log visitors in SL to a text file on your web-site.&lt;br /&gt;
|-&lt;br /&gt;
|[[Visitors]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A series of scripts to hold lists of visitors taking into account display names and supporting tracking multiple visits.&lt;br /&gt;
|-&lt;br /&gt;
|[[Volleyball Game (Kira&#039;s Artillery Variations)]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|The game of Volleyball in SecondLife, based on the [[Artillery]] script and freefall theory. Full build instructions, scripts, import archive and marketplace freebie product. All full permission.&lt;br /&gt;
|-&lt;br /&gt;
|[[Vote Simple]]&lt;br /&gt;
|{{User|JB Kraft}}&lt;br /&gt;
|Simple vote collector. One avi, one vote.&lt;br /&gt;
|-&lt;br /&gt;
|[[Walking Sound (NewAge)]]&lt;br /&gt;
|{{User|Asia Snowfall}}&lt;br /&gt;
|Very powerful walking sound script, Featuring customer ability to add their own sounds with the API Sound Feature!&lt;br /&gt;
|-&lt;br /&gt;
|[[Wanderer]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A script that can be used to randomly move a prim around relative to its origin point. Can be used for breeders, robots, birds and other applications where a primitive has to move around by itself.&lt;br /&gt;
|-&lt;br /&gt;
|[[WarpPos]]&lt;br /&gt;
|{{User2|Keknehv Psaltery}}&lt;br /&gt;
|Non-physical movement without the 10m limit.&lt;br /&gt;
|-&lt;br /&gt;
|[[Watchdog]]&lt;br /&gt;
|{{User|Tika Oberueng}}&lt;br /&gt;
|LSL Watchdog scripts to monitor other scripts in the prim and restart them if they crash or stop running.&lt;br /&gt;
|-&lt;br /&gt;
|[[Wiki3DBuilder]] [[Wiki3DBuilder1.0]]&lt;br /&gt;
|{{User|Salahzar Stenvaag}}&lt;br /&gt;
|Allows a group of people to collectively build up complex 3D mindmaps with connected concepts. Uses particles for connections and low prim usage. Nodes can be textured, colored, changed form size moved collectively by everybody and can distribute notecards, landmarks, URL, objects, textures. I provide two version 0.1 and 1.0 and probably next version will communicate with moodle and sloodle external websites.&lt;br /&gt;
|-&lt;br /&gt;
|[[Window Control]]&lt;br /&gt;
|{{User|Emmas Seetan}}&lt;br /&gt;
|For window opacity, helpful for buildings.&lt;br /&gt;
|-&lt;br /&gt;
|[[XTEA Strong Encryption Implementation]]&lt;br /&gt;
|{{User|Morse Dillon}}&lt;br /&gt;
|An LSL implementation of XTEA (eXtended Tiny Encryption Algorithm).  This is the first known public release of a &#039;real&#039; strong encryption implementation in LSL and is released under the GNU General Public License (GPL).&lt;br /&gt;
|-&lt;br /&gt;
|[[XyText 1.5|XyText]]&lt;br /&gt;
|{{User2|Xylor Baysklef}}&lt;br /&gt;
| Display text (up to 10 characters) on a prim. Use as many prims as desired.&lt;br /&gt;
|-&lt;br /&gt;
|[[XyyyyzText|XyyyyzText]]&lt;br /&gt;
|{{User|Criz Collins}}&lt;br /&gt;
| Display text (up to 10 characters) on a prim. Displays different text for each line instead of one single text, that will be broken into the next lines. Watch here for what that means: http://screencast.com/t/1wMLujLcEO&lt;br /&gt;
|-&lt;br /&gt;
|[[XyzzyText|XyzzyText]]&lt;br /&gt;
|{{User|Thraxis Epsilon}} and {{User|Gigs Taggart}}&lt;br /&gt;
| Display text (up to 10 characters) on a prim. Way more efficient than XyText.&lt;br /&gt;
|-&lt;br /&gt;
|[[Youtube TV]]&lt;br /&gt;
|{{User|Morgam Biedermann}}&lt;br /&gt;
|Watch your favorite Youtube videos / auto set the texture to the parcel media texture.&lt;br /&gt;
|-&lt;br /&gt;
|[[Input number of seconds, get a string back that shows days, hours, minutes, seconds]]&lt;br /&gt;
|{{User|Fire Centaur}}&lt;br /&gt;
|Returns a string that displays days, hours, seconds&lt;br /&gt;
|-&lt;br /&gt;
|[[Presenter with Timer]]&lt;br /&gt;
|[[User:Fire Centaur]]&lt;br /&gt;
|Yet another texture presenter with a timer, lock, next/prev etc&lt;br /&gt;
|-&lt;br /&gt;
|[[Random Giver Prim]]&lt;br /&gt;
|{{User|Damian Darkwyr}}&lt;br /&gt;
|A randomized item giver with a game-like twist&lt;br /&gt;
|-&lt;br /&gt;
|[[Client Specific Contents Giver]]&lt;br /&gt;
|{{User|Damian Darkwyr}}&lt;br /&gt;
|Give Contents only to users of a specific Client. Such as Phoenix, CoolVL or 2.0&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Void_Singer/v7-D_Zen_Resizer|Zen Resizer]]&lt;br /&gt;
|{{User|Void Singer}}&lt;br /&gt;
|Single script object resizer w/ multi-language &amp;amp; multi-menu support, + many other features for simple or advanced use.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Yumi Murakami/Weaver Spell Grid|Weaver Spell Grid]]&lt;br /&gt;
|{{User|Yumi Murakami}}&lt;br /&gt;
|Designs simple objects and creates them with magic words.&lt;br /&gt;
|-&lt;br /&gt;
|[[Zero Lag Poseball]]&lt;br /&gt;
|{{User|Jippen Faddoul}} and {{User|Daemonika Nightfire}}&lt;br /&gt;
|A simple poseball with no lag&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Dora_Gustafson/bezier_toy|Bézier Toy]]&lt;br /&gt;
|{{User|Dora Gustafson}}&lt;br /&gt;
|Strictly for fun! The toy is made by one prim and a script. The prim will move along a smooth closed Bézier curve in space until it is stopped.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Support Script Library==&lt;br /&gt;
These are scripts in other languages, intended to be run on other systems that support scripts written in LSL&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/Nexii-Malthus/phpPathfinding phpPathfinding]&lt;br /&gt;
|{{User|Nexii Malthus}}&lt;br /&gt;
|PHP script for offloading complex pathfinding operations away from heavy use simulators onto external servers. Primarily A* Algorithm. Flexible -- works with any type of node graph. Public Domain. Clean and minimalistic code.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Ina Centaur/UUID/calimg.api|Calendar Image UUID API]]&lt;br /&gt;
|{{User|Ina Centaur}}&lt;br /&gt;
|API that gives the UUID of an image of a calendar image give month and year arguments.&lt;br /&gt;
|-&lt;br /&gt;
|[[HTTP Post request to a PHP server]]&lt;br /&gt;
|{{User|Corto Maltese}}&lt;br /&gt;
|This small library allows you to make simple POST requests to your website. The libraries allow you to get your request through the variable $_POST on the server. It also include a basic security mechanism aimed to stop hacking. Comprises of LSL client script and PHP server script.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Ina Centaur/PHP/k2n.php|Key2Name.php]]&lt;br /&gt;
|{{User|Ina Centaur}}&lt;br /&gt;
|Get Avatar&#039;s Name using Second Life search service. (like in LSL Key2Name)&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Darien_Caldwell/HTTP-DNS|HTTP-IN DNS]]&lt;br /&gt;
|{{User|Darien Caldwell}}&lt;br /&gt;
|Public Domain DNS and HTTP-IN URL Distribution system running on GAE (the original). Deploy your own for maximum utility and security.&lt;br /&gt;
|-&lt;br /&gt;
|[[Lame_Object_DNS_and_Cross_Sim_Messaging|Lame Object DNS and Cross Sim Messaging]]&lt;br /&gt;
|{{User2|Liandra Ceawlin}}&lt;br /&gt;
|Simple, cheeseball method of doing cross-sim communications with http-in and an external object DNS service.&lt;br /&gt;
|-&lt;br /&gt;
|[[Minify|LSL Minify]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|LSL Minification and obfuscation tool written in JavaScript. Contains a form on the wiki using a widget where you can post LSL scripts to be minified as well as the source-code. For another full-screen demo you may [http://eva.comaroski.me/lslclean.html check it on my website]. To use, paste any LSL code and press ctrl+alt+enter to get the minified version.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:SignpostMarv Martin/PHP/llXorBase64StringsCorrect|llXorBase64StringsCorrect]]&lt;br /&gt;
|{{User|SignpostMarv Martin}}&lt;br /&gt;
|An implementation of [[llXorBase64StringsCorrect]] in PHP- should be useful if you&#039;re using llXorBase64StringsCorrect to do cryptography work in LSL2 and posting it out to the web via [[llHTTPRequest]].&lt;br /&gt;
|-&lt;br /&gt;
|[[User:SignpostMarv Martin/PHP/lsl fu.php|lsl_fu.php]]&lt;br /&gt;
|{{User|SignpostMarv Martin}}&lt;br /&gt;
|A basic OOP&#039;d PHP Class containing VeloxSeverine&#039;s $_POST fixer and Marv&#039;s own eccentric ideas for &amp;quot;fixing&amp;quot; things.&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Jor3l Boa/PHP/n2k.php|Name2Key.php]]&lt;br /&gt;
|{{User|Jor3l Boa}}&lt;br /&gt;
|Get Avatar&#039;s UUID using Second Life search service. (like in LSL Name2Key)&lt;br /&gt;
|-&lt;br /&gt;
|[[Public_Object_DNS|Public Object DNS]]&lt;br /&gt;
|{{User2|Liandra Ceawlin}}&lt;br /&gt;
|Public object DNS-like system running on GAE, for http-in. Hopefully scalable enough for wide-spread usage.&lt;br /&gt;
|-&lt;br /&gt;
|[[Rake|Rake]]&lt;br /&gt;
|[[Wizardry and Steamworks]]&lt;br /&gt;
|A C# utility meant to create full inventory backups to your local hard-drive including Textures/Sculpts, Animations, Notecards and Scripts.&lt;br /&gt;
|-&lt;br /&gt;
|Silo&lt;br /&gt;
|{{User2|Zero Linden}}&lt;br /&gt;
|General purpose data store in PHP.  Use this to persist arbitrary data from LSL via [[llHTTPRequest]].  See:&lt;br /&gt;
* [http://www.notabene-sl.com/misc/silo-README.txt README] file&lt;br /&gt;
* [http://www.notabene-sl.com/misc/silo.tgz silo.tgz] tarball&lt;br /&gt;
* forum post [http://forums-archive.secondlife.com/54/69/119570/1.html Announcement].&lt;br /&gt;
|-&lt;br /&gt;
|[[Silverday ObjectDNS]]&lt;br /&gt;
|{{User|Till Stirling}}&lt;br /&gt;
|Dynamic Object-DNS-System to provide dynamic mapping of LSL-URLs to persistent domains. Features include redirect service, password protected domains, write protected domains, LSL-API for all necessary functions, optional web-interface.&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/jgpippin/sldb SLDB]&lt;br /&gt;
|{{User2|Luc Aubret}}&lt;br /&gt;
|Flexible web database storage using PHP/MySQL.  Used to store per-user field/value pairs from in-world objects using [[llHTTPRequest]].&lt;br /&gt;
|-&lt;br /&gt;
|[https://tlabsfoundry.atlassian.net/wiki/display/SLAD/SL+Asset+Data SL Asset Data]&lt;br /&gt;
|{{User|Trimda Hedges}}&lt;br /&gt;
|A set of Java classes to retrieve information about Groups, Parcels and Agents/Avatars based on their key (UUID).  Includes caching of requests and results and example application.  Copyright under Eclipse Public License v1&lt;br /&gt;
* [https://tlabsfoundry.atlassian.net/wiki/display/SLAD/Downloads Downloads]&lt;br /&gt;
* [http://trimda.com/javadocs/slassetdata/1.1.0/ JavaDocs]&lt;br /&gt;
* [https://tlabsfoundry.atlassian.net/wiki/display/TF/TLabs+Foundry Other Projects]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Articles&#039;&#039;&#039;&lt;br /&gt;
*[[:Category:LSL Examples| Examples]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|}}&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LibObj/Reference&amp;diff=1197823</id>
		<title>LibObj/Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LibObj/Reference&amp;diff=1197823"/>
		<updated>2015-10-24T14:34:39Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Small fixes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LibObj Base - Object Handles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objNew()&lt;br /&gt;
objDelete(integer id)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The handle returned by &amp;lt;code&amp;gt;objNew&amp;lt;/code&amp;gt; is positive (&amp;gt; 0).&lt;br /&gt;
* The handle returned by &amp;lt;code&amp;gt;objNew&amp;lt;/code&amp;gt; is unique among all handles existing at the moment the function is called.&lt;br /&gt;
* &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt; does nothing if the given handle id does not exist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The implementation of &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt; should include calls to suitable functions of any used extensions to delete data associated with the given object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
LibObj has a simple representation of &amp;quot;objects&amp;quot; as handles which are of type &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;. Objects may be created and deleted using the &amp;quot;Object Base&amp;quot; module consisting of the functions &amp;lt;code&amp;gt;objNew&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt;. All handles returned by &amp;lt;code&amp;gt;objNew()&amp;lt;/code&amp;gt; are unique within the script at any given point in time and positive (&amp;gt; 0). By themself, handles have little use but are instead intended to be used in combination with any of the extensions described below to associate additional data with the objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; In addition to deleting the object handle, the &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt; function also needs to call additional functions to delete any data associated with the object managed by the used extensions. Keep this in mind and make sure that all deletion function calls corresponding to the extensions you&#039;re using are included in the implementation of &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create a new object.&lt;br /&gt;
objDelete(a); // Delete it again.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Names&amp;quot; Extension ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetName(integer id, string name)&lt;br /&gt;
string  objGetName(integer id)&lt;br /&gt;
integer objByName(string name)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetName&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetName&amp;lt;/code&amp;gt; removes the name if &amp;lt;code&amp;gt;name == &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* If a name for the given object already exists, &amp;lt;code&amp;gt;objSetName&amp;lt;/code&amp;gt; replaces that name.&lt;br /&gt;
* &amp;lt;code&amp;gt;objByName&amp;lt;/code&amp;gt; returns 0 if an object with the given name does not exist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* No particular assumptions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to address objects by name. Using the &amp;lt;code&amp;gt;objSetName&amp;lt;/code&amp;gt; function of the names extension you can assign a name to an object. The main use of this extension is to look up objects by name using &amp;lt;code&amp;gt;objByName&amp;lt;/code&amp;gt;. Once an object handle is retrieved, further operations may be performed on it. The &amp;lt;code&amp;gt;objByName&amp;lt;/code&amp;gt; function returns 0 if an object with the given name is not found. Note that arbitrary data should generally not be stored as an object name; use the &amp;quot;data&amp;quot; or &amp;quot;properties&amp;quot; extensions for that purpose.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create a new object.&lt;br /&gt;
objSetName(a, &amp;quot;A&amp;quot;); // Assign name to object.&lt;br /&gt;
llOwnerSay(objGetName(a)); // Says &amp;quot;A&amp;quot;.&lt;br /&gt;
integer b = objByName(&amp;quot;A&amp;quot;); // b == a.&lt;br /&gt;
objDelete(b); // Deletes the object.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Paths&amp;quot; Extension ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetPath(integer id, list path)&lt;br /&gt;
list    objGetPath(integer id)&lt;br /&gt;
string  objGetPathItem(integer id, integer item)&lt;br /&gt;
integer objByPath(list path)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetPath&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetPath&amp;lt;/code&amp;gt; removes the path if &amp;lt;code&amp;gt;path == []&amp;lt;/code&amp;gt;.&lt;br /&gt;
* If a path for the given object already exists, &amp;lt;code&amp;gt;objSetPath&amp;lt;/code&amp;gt; replaces it.&lt;br /&gt;
* &amp;lt;code&amp;gt;objByPath&amp;lt;/code&amp;gt; returns 0 if the given path does not match any object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* All elements of paths are automatically converted to the string data type.&lt;br /&gt;
* No element of valid paths should contain the newline character (&amp;quot;\n&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to address objects in a hierarchical (tree-like) manner. It is a generalization of the &amp;quot;names&amp;quot; extensions with more possibilities. Instead of assigning an object a single string as name, a multi-element list (&amp;quot;path&amp;quot;) of names may be given. This principle may be used to group objects of a specific &amp;quot;type&amp;quot; by giving them a common prefix (for instance the first item in the path list). The &amp;lt;code&amp;gt;objByPath&amp;lt;/code&amp;gt; function to retrieve an object handle by path does &#039;&#039;&#039;not&#039;&#039;&#039; require the whole path to match but instead returns the first object whose path &#039;&#039;&#039;prefix&#039;&#039;&#039; matches the given list.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; All elements of a given path are converted to strings and &#039;&#039;&#039;no&#039;&#039;&#039; path element shall contain a &#039;&#039;&#039;newline&#039;&#039;&#039; (&amp;quot;\n&amp;quot;) character.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create a new object.&lt;br /&gt;
integer b = objNew(); // Create another object.&lt;br /&gt;
objSetPath(a, [&amp;quot;X&amp;quot;]); // Assigns path to object a.&lt;br /&gt;
objSetPath(b, [&amp;quot;X&amp;quot;, &amp;quot;Y&amp;quot;]); // Assigns path to object b.&lt;br /&gt;
integer x = objByPath([&amp;quot;X&amp;quot;]); // x == a.&lt;br /&gt;
integer y = objByPath([&amp;quot;X&amp;quot;, &amp;quot;Y&amp;quot;]); // y == b.&lt;br /&gt;
llOwnerSay(objGetPathItem(x, 0)); // Says &amp;quot;X&amp;quot;.&lt;br /&gt;
llOwnerSay(objGetPathItem(y, 1)); // Says &amp;quot;Y&amp;quot;.&lt;br /&gt;
objDelete(x); // Deletes x (and a).&lt;br /&gt;
objDelete(y); // Deletes y (and b).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Data&amp;quot; Extension ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetData(integer id, string data)&lt;br /&gt;
string  objGetData(integer id)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetData&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetData&amp;lt;/code&amp;gt; removes any existing data for the given object if &amp;lt;code&amp;gt;data == &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;objGetData&amp;lt;/code&amp;gt; returns the empty string (&amp;quot;&amp;quot;) if no data is associated with the given object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* No particular assumptions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to assign a (string) payload to an object. It is similar to the &amp;quot;names&amp;quot; extension but does not include the capability to retrieve objects given a string. It is suitable to store possibly unsafe user data related to an object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create a new object.&lt;br /&gt;
objSetData(a, &amp;quot;Payload&amp;quot;); // Assign string data to object.&lt;br /&gt;
llOwnerSay(objGetData(a)); // Says &amp;quot;Payload&amp;quot;.&lt;br /&gt;
objDelete(a); // Deletes the object.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Properties&amp;quot; Extension ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetProp(integer id, string prop, string data)&lt;br /&gt;
string  objGetProp(integer id, string prop)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetProp&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetProp&amp;lt;/code&amp;gt; removes &#039;&#039;&#039;all&#039;&#039;&#039; properties of the given object if &amp;lt;code&amp;gt;prop == &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetProp&amp;lt;/code&amp;gt; removes a given property &amp;quot;X&amp;quot; if &amp;lt;code&amp;gt;prop == &amp;quot;X&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;data == &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;objGetProp&amp;lt;/code&amp;gt; returns the empty string (&amp;quot;&amp;quot;) if the given object or property does not exist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* No particular assumptions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to assign &#039;&#039;&#039;named&#039;&#039;&#039; properties to an object. It is a generalization of the &amp;quot;data&amp;quot; extension in that it allows to assign &#039;&#039;&#039;multiple&#039;&#039;&#039; separate string payloads to a single object. The idea is to simulate the concept of e.g. &amp;quot;structs&amp;quot; or &amp;quot;dictionaries&amp;quot; in other languages.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Creates a new object.&lt;br /&gt;
objSetProp(a, &amp;quot;A&amp;quot;, &amp;quot;X&amp;quot;); // Add property &amp;quot;A&amp;quot; with content &amp;quot;X&amp;quot;.&lt;br /&gt;
objSetProp(a, &amp;quot;B&amp;quot;, &amp;quot;Y&amp;quot;); // Add property &amp;quot;B&amp;quot; with content &amp;quot;Y&amp;quot;.&lt;br /&gt;
objSetProp(a, &amp;quot;A&amp;quot;, &amp;quot;Z&amp;quot;); // Replace content of property &amp;quot;A&amp;quot; with &amp;quot;Z&amp;quot;.&lt;br /&gt;
llOwnerSay(objGetProp(a, &amp;quot;A&amp;quot;)); // Says &amp;quot;Z&amp;quot;.&lt;br /&gt;
objDelete(a); // Delete the object.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Hierarchy&amp;quot; Extension ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetParent(integer id, integer parent)&lt;br /&gt;
integer objGetParent(integer id)&lt;br /&gt;
integer objGetChild(integer id)&lt;br /&gt;
list    objGetChildren(integer id)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetParent&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetParent&amp;lt;/code&amp;gt; removes the parent relation for the given object if &amp;lt;code&amp;gt;parent == 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;objGetChild&amp;lt;/code&amp;gt; returns 0 if the given object has no children.&lt;br /&gt;
* &amp;lt;code&amp;gt;objGetChildren&amp;lt;/code&amp;gt; returns the empty list ([]) if the given object has no children.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* If non-zero, the parent object given to &amp;lt;code&amp;gt;objSetParent&amp;lt;/code&amp;gt; shall be a handle to an existing object.&lt;br /&gt;
* The &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt; function should take care of setting the parent of children of the object being deleted to 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to define &amp;quot;child-parent&amp;quot; relationships between objects which allows to build object hierarchies (without common, redundant name prefixes as with the &amp;quot;path&amp;quot; extension). An object may have one parent object specified using the &amp;lt;code&amp;gt;objSetParent&amp;lt;/code&amp;gt; function. Conversely, an object &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt; may have multiple (implicitly defined) children which is the set of objects whose parent is &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt;. The function &amp;lt;code&amp;gt;objGetChild&amp;lt;/code&amp;gt; returns the first child for a given object; the function &amp;lt;code&amp;gt;objGetChildren&amp;lt;/code&amp;gt; may be used to get a list of all children of an object (a list of object handles).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create object a.&lt;br /&gt;
integer b = objNew(); // Create object b.&lt;br /&gt;
integer c = objNew(); // Create object c.&lt;br /&gt;
objSetParent(b, a); // Set parent of object b to a.&lt;br /&gt;
objSetParent(c, a); // Set parent of object c to a.&lt;br /&gt;
list children = objGetChildren(a); // children == [b, c].&lt;br /&gt;
integer child = objGetChild(a); // x == b or x == c, implementation dependent.&lt;br /&gt;
while (child = objGetChild(a)) {objDelete(child);} // Delete children (b, c).&lt;br /&gt;
objDelete(a); // Delete remaining object.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Object Timeouts ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetTimeout(integer id, integer time)&lt;br /&gt;
integer objCheckTimeout()&lt;br /&gt;
&lt;br /&gt;
// Minimal timer event for handling timeouts:&lt;br /&gt;
timer() {&lt;br /&gt;
    integer obj;&lt;br /&gt;
    while (obj = objCheckTimeout()) {&lt;br /&gt;
        // Do something with obj.&lt;br /&gt;
        &lt;br /&gt;
        // Finally, you should either disable the timeout for the object&lt;br /&gt;
        // by calling objSetTimeout(obj, 0) or delete the object.&lt;br /&gt;
        objDelete(obj);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetTimeout&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* Timeout is removed by &amp;lt;code&amp;gt;objSetTimeout&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;time &amp;lt;= 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The temporal resolution of timeouts are relatively coarse (seconds).&lt;br /&gt;
* The timeout mechanism should not be used for high frequency timers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to set independent timeouts for objects which are handled asynchronously by a timer event at a later point in time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create a new object.&lt;br /&gt;
objSetTimeout(a, 5); // Timeout handle will trigger in approximately 5 seconds in timer event.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LibObj&amp;diff=1197822</id>
		<title>LibObj</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LibObj&amp;diff=1197822"/>
		<updated>2015-10-24T13:44:06Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
LibObj is a collection of functions that are designed to simplify data management of multiple, (pseudo-)parallel threads in LSL scripts. Examples include the communication with multiple avatars (e.g. through dialogs) or objects (e.g. through listens or HTTP) where the states of the communication threads are usually independent from one another.&lt;br /&gt;
&lt;br /&gt;
To this end, the library implements a rudimentary concept of object-oriented data management. The concept should be relatively easy to grasp and use for programmers and offers versatile means to data management which is not resticted to its originally intended use case.&lt;br /&gt;
&lt;br /&gt;
Management of &amp;quot;objects&amp;quot; is based on two functions, &amp;lt;code&amp;gt;objNew&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt;, which merely manage unique, light-weight object handles. Functionality is extended by various functions which operate on these handles. The library is modular in that only the subset of functions which is actually used by a particular script needs to be included.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
[[LibObj/Reference|Reference]]&lt;br /&gt;
&lt;br /&gt;
For complete examples, please see the &amp;quot;Examples&amp;quot; subdirectory in the GitHub repo linked below.&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
The library is open source under the MIT license.&lt;br /&gt;
&lt;br /&gt;
== How to obtain ==&lt;br /&gt;
&lt;br /&gt;
The latest version is available on [https://github.com/furware/libobj GitHub].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LibObj/Reference&amp;diff=1197821</id>
		<title>LibObj/Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LibObj/Reference&amp;diff=1197821"/>
		<updated>2015-10-24T13:41:54Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LibObj Base - Object Handles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objNew()&lt;br /&gt;
objDelete(integer id)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The handle returned by &amp;lt;code&amp;gt;objNew&amp;lt;/code&amp;gt; is positive (&amp;gt; 0).&lt;br /&gt;
* The handle returned by &amp;lt;code&amp;gt;objNew&amp;lt;/code&amp;gt; is unique among all handles existing at the moment the function is called.&lt;br /&gt;
* &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt; does nothing if the given handle id does not exist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The implementation of &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt; should include calls to suitable functions of any used extensions to delete data associated with the given object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
LibObj has a simple representation of &amp;quot;objects&amp;quot; as handles which are of type &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;. Objects may be created and deleted using the &amp;quot;Object Base&amp;quot; module consisting of the functions &amp;lt;code&amp;gt;objNew&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt;. All handles returned by &amp;lt;code&amp;gt;objNew()&amp;lt;/code&amp;gt; are unique within the script at any given point in time and positive (&amp;gt; 0). By themself, handles have little use but are instead intended to be used in combination with any of the extensions described below to associate additional data with the objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; In addition to deleting the object handle, the &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt; function also needs to call additional functions to delete any data associated with the object managed by the used extensions. Keep this in mind and make sure that all deletion function calls corresponding to the extensions you&#039;re using are included in the implementation of &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create a new object.&lt;br /&gt;
objDelete(a); // Delete it again.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Names&amp;quot; Extension ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetName(integer id, string name)&lt;br /&gt;
string  objGetName(integer id)&lt;br /&gt;
integer objByName(string name)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetName&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetName&amp;lt;/code&amp;gt; removes the name if &amp;lt;code&amp;gt;name == &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* If a name for the given object already exists, &amp;lt;code&amp;gt;objSetName&amp;lt;/code&amp;gt; replaces that name.&lt;br /&gt;
* &amp;lt;code&amp;gt;objByName&amp;lt;/code&amp;gt; returns 0 if an object with the given name does not exist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* No particular assumptions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to address objects by name. Using the &amp;lt;code&amp;gt;objSetName&amp;lt;/code&amp;gt; function of the names extension you can assign a name to an object. The main use of this extension is to look up objects by name using &amp;lt;code&amp;gt;objByName&amp;lt;/code&amp;gt;. Once an object handle is retrieved, further operations may be performed on it. The &amp;lt;code&amp;gt;objByName&amp;lt;/code&amp;gt; function returns 0 if an object with the given name is not found. Note that arbitrary data should generally not be stored as an object name; use the &amp;quot;data&amp;quot; or &amp;quot;properties&amp;quot; extensions for that purpose.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create a new object.&lt;br /&gt;
setName(a, &amp;quot;A&amp;quot;); // Assign name to object.&lt;br /&gt;
llOwnerSay(getName(a)); // Says &amp;quot;A&amp;quot;.&lt;br /&gt;
integer b = objByName(&amp;quot;A&amp;quot;); // b == a.&lt;br /&gt;
objDelete(b); // Deletes the object.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Paths&amp;quot; Extension ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetPath(integer id, list path)&lt;br /&gt;
list    objGetPath(integer id)&lt;br /&gt;
string  objGetPathItem(integer id, integer item)&lt;br /&gt;
integer objByPath(list path)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetPath&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetPath&amp;lt;/code&amp;gt; removes the path if &amp;lt;code&amp;gt;path == []&amp;lt;/code&amp;gt;.&lt;br /&gt;
* If a path for the given object already exists, &amp;lt;code&amp;gt;objSetPath&amp;lt;/code&amp;gt; replaces it.&lt;br /&gt;
* &amp;lt;code&amp;gt;objByPath&amp;lt;/code&amp;gt; returns 0 if the given path does not match any object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* All elements of paths are automatically converted to the string data type.&lt;br /&gt;
* No element of valid paths should contain the newline character (&amp;quot;\n&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to address objects in a hierarchical (tree-like) manner. It is a generalization of the &amp;quot;names&amp;quot; extensions with more possibilities. Instead of assigning an object a single string as name, a multi-element list (&amp;quot;path&amp;quot;) of names may be given. This principle may be used to group objects of a specific &amp;quot;type&amp;quot; by giving them a common prefix (for instance the first item in the path list). The &amp;lt;code&amp;gt;objByPath&amp;lt;/code&amp;gt; function to retrieve an object handle by path does &#039;&#039;&#039;not&#039;&#039;&#039; require the whole path to match but instead returns the first object whose path &#039;&#039;&#039;prefix&#039;&#039;&#039; matches the given list.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; All elements of a given path are converted to strings and &#039;&#039;&#039;no&#039;&#039;&#039; path element shall be &#039;&#039;&#039;empty&#039;&#039;&#039; or contain a &#039;&#039;&#039;newline&#039;&#039;&#039; (&amp;quot;\n&amp;quot;) character.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create a new object.&lt;br /&gt;
integer b = objNew(); // Create another object.&lt;br /&gt;
objSetPath(a, [&amp;quot;X&amp;quot;]); // Assigns path to object a.&lt;br /&gt;
objSetPath(b, [&amp;quot;X&amp;quot;, &amp;quot;Y&amp;quot;]); // Assigns path to object b.&lt;br /&gt;
integer x = objByPath([&amp;quot;X&amp;quot;]); // x == a.&lt;br /&gt;
integer y = objByPath([&amp;quot;X&amp;quot;, &amp;quot;Y&amp;quot;]); // y == b.&lt;br /&gt;
llOwnerSay(objGetPathItem(y, 1)); // Says &amp;quot;Y&amp;quot;.&lt;br /&gt;
objDelete(x); // Deletes x (and a).&lt;br /&gt;
objDelete(y); // Deletes y (and b).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Data&amp;quot; Extension ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetData(integer id, string data)&lt;br /&gt;
string  objGetData(integer id)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetData&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetData&amp;lt;/code&amp;gt; removes any existing data for the given object if &amp;lt;code&amp;gt;data == &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;objGetData&amp;lt;/code&amp;gt; returns the empty string (&amp;quot;&amp;quot;) if no data is associated with the given object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* No particular assumptions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to assign a (string) payload to an object. It is similar to the &amp;quot;names&amp;quot; extension but does not include the capability to retrieve objects given a string. It is suitable to store possibly unsafe user data related to an object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create a new object.&lt;br /&gt;
objSetData(a, &amp;quot;Payload&amp;quot;); // Assign string data to object.&lt;br /&gt;
llOwnerSay(objGetData(a)); // Says &amp;quot;Payload&amp;quot;.&lt;br /&gt;
objDelete(a); // Deletes the object.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Properties&amp;quot; Extension ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetProp(integer id, string prop, string data)&lt;br /&gt;
string  objGetProp(integer id, string prop)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetProp&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetProp&amp;lt;/code&amp;gt; removes &#039;&#039;&#039;all&#039;&#039;&#039; properties of the given object if &amp;lt;code&amp;gt;prop == &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;objGetProp&amp;lt;/code&amp;gt; returns the empty string (&amp;quot;&amp;quot;) if the given object or property does not exist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The id provided to &amp;lt;code&amp;gt;objSetProp&amp;lt;/code&amp;gt; shall be positive (&amp;gt; 0).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to assign &#039;&#039;&#039;named&#039;&#039;&#039; properties to an object. It is a generalization of the &amp;quot;data&amp;quot; extension in that it allows to assign &#039;&#039;&#039;multiple&#039;&#039;&#039; separate string payloads to a single object. The idea is to simulate the concept of e.g. &amp;quot;structs&amp;quot; or &amp;quot;dictionaries&amp;quot; in other languages.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Creates a new object.&lt;br /&gt;
objSetProp(a, &amp;quot;A&amp;quot;, &amp;quot;X&amp;quot;); // Add property &amp;quot;A&amp;quot; with content &amp;quot;X&amp;quot;.&lt;br /&gt;
objSetProp(a, &amp;quot;B&amp;quot;, &amp;quot;Y&amp;quot;); // Add property &amp;quot;B&amp;quot; with content &amp;quot;Y&amp;quot;.&lt;br /&gt;
objSetProp(a, &amp;quot;A&amp;quot;, &amp;quot;Z&amp;quot;); // Replace content of property &amp;quot;A&amp;quot; with &amp;quot;Z&amp;quot;.&lt;br /&gt;
llOwnerSay(objGetProp(a, &amp;quot;A&amp;quot;)); // Says &amp;quot;Z&amp;quot;.&lt;br /&gt;
objDelete(a); // Delete the object.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Hierarchy&amp;quot; Extension ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetParent(integer id, integer parent)&lt;br /&gt;
integer objGetParent(integer id)&lt;br /&gt;
integer objGetChild(integer id)&lt;br /&gt;
list    objGetChildren(integer id)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetParent&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetParent&amp;lt;/code&amp;gt; removes the parent relation for the given object if &amp;lt;code&amp;gt;parent == 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;objGetChild&amp;lt;/code&amp;gt; returns 0 if the given object has no children.&lt;br /&gt;
* &amp;lt;code&amp;gt;objGetChildren&amp;lt;/code&amp;gt; returns the empty list ([]) if the given object has no children.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* If non-zero, the parent object given to &amp;lt;code&amp;gt;objSetParent&amp;lt;/code&amp;gt; shall be a handle to an existing object.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to define &amp;quot;child-parent&amp;quot; relationships between objects which allows to build object hierarchies (without common, redundant name prefixes as with the &amp;quot;path&amp;quot; extension). An object may have one parent object specified using the &amp;lt;code&amp;gt;objSetParent&amp;lt;/code&amp;gt; function. Conversely, an object &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt; may have multiple (implicitly defined) children which is the set of objects whose parent is &amp;lt;code&amp;gt;obj&amp;lt;/code&amp;gt;. The function &amp;lt;code&amp;gt;objGetChild&amp;lt;/code&amp;gt; returns the first child for a given object; the function &amp;lt;code&amp;gt;objGetChildren&amp;lt;/code&amp;gt; may be used to get a list of all children of an object (a list of object handles).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create object a.&lt;br /&gt;
integer b = objNew(); // Create object b.&lt;br /&gt;
integer c = objNew(); // Create object c.&lt;br /&gt;
objSetParent(b, a); // Set parent of object b to a.&lt;br /&gt;
objSetParent(c, a); // Set parent of object c to a.&lt;br /&gt;
list children = objGetChildren(a); // children == [b, c].&lt;br /&gt;
integer child = objGetChild(a); // x == b or x == c, implementation dependent.&lt;br /&gt;
while (child = objGetChild(a)) {objDelete(child);} // Delete children (b, c).&lt;br /&gt;
objDelete(a); // Delete remaining object.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Object Timeouts ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer objSetTimeout(integer id, integer time)&lt;br /&gt;
integer objCheckTimeout()&lt;br /&gt;
&lt;br /&gt;
// Minimal timer event for handling timeouts:&lt;br /&gt;
timer() {&lt;br /&gt;
    integer obj;&lt;br /&gt;
    while (obj = objCheckTimeout()) {&lt;br /&gt;
        // Do something with obj.&lt;br /&gt;
        &lt;br /&gt;
        // Finally, you should either disable the timeout for the object&lt;br /&gt;
        // by calling objSetTimeout(obj, 0) or delete the object.&lt;br /&gt;
        objDelete(obj);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guarantees&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objSetTimeout&amp;lt;/code&amp;gt; returns the given object handle, even if invalid.&lt;br /&gt;
* Timeout is removed by &amp;lt;code&amp;gt;objSetTimeout&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;time == 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assumptions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Behavior of &amp;lt;code&amp;gt;objSetTimeout&amp;lt;/code&amp;gt; is undefined for &amp;lt;code&amp;gt;time &amp;lt; 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The purpose of this extension is to set independent timeouts for objects which are handled asynchronously by a timer event at a later point in time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer a = objNew(); // Create a new object.&lt;br /&gt;
objSetTimeout(a, 5); // Timeout handle will trigger in approximately 5 seconds in timer event.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LibObj&amp;diff=1197820</id>
		<title>LibObj</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LibObj&amp;diff=1197820"/>
		<updated>2015-10-24T13:40:32Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
LibObj is a collection of functions that are designed to simplify data management of multiple, (pseudo-)parallel threads in LSL scripts. Examples include the communication with multiple avatars (e.g. through dialogs) or objects (e.g. through listens or HTTP) where the states of the communication threads are usually independent from one another.&lt;br /&gt;
&lt;br /&gt;
To this end, the library implements a rudimentary concept of object-oriented data management. The concept should be relatively easy to grasp and use for programmers and offers versatile means to data management which is not resticted to its originally intended use case.&lt;br /&gt;
&lt;br /&gt;
Management of &amp;quot;objects&amp;quot; is based on two functions, &amp;lt;code&amp;gt;objNew&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;objDelete&amp;lt;/code&amp;gt;, which merely manage unique, light-weight object handles. Functionality is extended by various functions which operate on these handles. The library is modular in that only the subset of functions which is actually used by a particular script needs to be included.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
[[LibObj/Reference|Reference]]&lt;br /&gt;
&lt;br /&gt;
[[LibObj/Examples|Examples]]&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
&lt;br /&gt;
The library is open source under the MIT license.&lt;br /&gt;
&lt;br /&gt;
== How to obtain ==&lt;br /&gt;
&lt;br /&gt;
The latest version is available on [https://github.com/furware/libobj GitHub].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1196082</id>
		<title>FURWARE text/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1196082"/>
		<updated>2015-04-08T09:12:19Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Removed todo section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
Diese Seite ist auch [[FURWARE_text|auf englisch]] verfügbar. / This page is also available [[FURWARE_text|in English]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text ist ein &#039;&#039;&#039;Skript zur Darstellung von Text&#039;&#039;&#039; mittels Texturen auf Prims. Es ist zum &#039;&#039;&#039;Einbau in deine Objekte&#039;&#039;&#039; gedacht in denen es von &#039;&#039;&#039;deinen eigenen Skripten&#039;&#039;&#039; gesteuert wird.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;ist keine&#039;&#039;&#039; vorgefertigte Anzeigetafel sondern ist für &#039;&#039;&#039;Skripter&#039;&#039;&#039; gedacht, die es in ihre eigene Kreationen integrieren.&lt;br /&gt;
&lt;br /&gt;
Das Skript war von 2010 bis Juli 2013 proprietär bis ich ({{User|Ochi Wolfe}}) mich dazu entschieden habe, es Open Source unter der MIT-Lizenz zu machen. Dies ist mein erster Versuch eines vollständig offenen Produkts in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Merkmale ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Nur ein Skript&#039;&#039;&#039; für eine ganze Gruppe (&amp;quot;sets&amp;quot;) von Anzeigetafeln&lt;br /&gt;
* &#039;&#039;&#039;Formatierung&#039;&#039;&#039; (Farbe, Alpha, Ausrichtung, Umbruch, Trimming, Font, Rahmen)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; mit 1-8 Zeichen, die je nur 0.5 Prims belegen&lt;br /&gt;
* &#039;&#039;&#039;Virtuelle Text-Boxen&#039;&#039;&#039; um Text beliebig zu Positionieren&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; um mehrere Stileinstellungen zusammenzufassen&lt;br /&gt;
&lt;br /&gt;
== Wo du das Skript bekommst ==&lt;br /&gt;
&lt;br /&gt;
Du kannst dir ein komplettes Paket inklusive dem Display Creator, Meshes und Schrift-Texturen auf [http://marketplace.secondlife.com/p/FURWARE-text/141379 dem Marketplace] holen.&lt;br /&gt;
&lt;br /&gt;
Für Entwickler und interessierte Benutzer habe ich für die Skripte außerdem einen Account auf [http://github.com/furware/text GitHub] erstellt.&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Unter den folgenden Unterseiten findest du eine Bedienungsanleitung sowie Dokumentation für Entwickler:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial/de|Erste Schritte &amp;amp; ausführliches Tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference/de|Kurzreferenz &amp;amp; Versionsgeschichte]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets/de|Hilfsfunktionen für einfachere Verwendung]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers/de|Dokumentation für Entwickler]]&lt;br /&gt;
&lt;br /&gt;
== Texture creator ==&lt;br /&gt;
&lt;br /&gt;
Auf [[FURWARE_text/TextureCreator/de|dieser]] Seite findest du mehr Informationen zum &amp;quot;texture creator&amp;quot;, mit dem du deine eigenen Schrifttexturen erstellen kannst.&lt;br /&gt;
&lt;br /&gt;
== Wie du helfen kannst ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Anwender:&#039;&#039;&#039; Eine wichtige Hilfe bei der Entwicklung dieses Skripts ist das Berichten von Problemen bei seiner Verwendung sowie Vorschläge, wie man die Benutzung noch besser machen kann. Momentan sind die wahrscheinlich besten Möglichkeiten hierfür {{User|Ochi Wolfe}} eine Notecard zu schreiben oder deine Kommentare zur Diskussion dieser Wiki-Seite hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Entwickler:&#039;&#039;&#039; Wenn du Vorschläge für die Verbesserung des Skripts hast kannst du diese gerne auf dieselbe Weise kundtun. Alternativ kannst du aber auch gerne einen Branch des Projekts auf [http://github.com/furware/text GitHub] erstellen und Pull-Requests senden. Bitte stelle sicher, dass die Änderungen von sehr guter Qualität sind und sie das Skript nicht weiter aufblähen als es sowieso schon ist. Genauergesagt sind Vorschläge zur Verbesserung der Performance und Senkung des Speicherverbrauchs &#039;&#039;&#039;äußerst&#039;&#039;&#039; gern gesehen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
Für die aktuelle Version sind keine Probleme bekannt. Falls welche auftreten, melde dies bitte.&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1196081</id>
		<title>FURWARE text</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1196081"/>
		<updated>2015-04-08T09:11:46Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Removed todo section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
This page is also available [[FURWARE_text/de|in German]]. / Diese Seite ist auch [[FURWARE_text/de|auf deutsch]] verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text is a &#039;&#039;&#039;script for displaying text&#039;&#039;&#039; on prims using textures. It is intended to be &#039;&#039;&#039;integrated in your objects&#039;&#039;&#039; in which it will be controlled by &#039;&#039;&#039;your own scripts&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;is not&#039;&#039;&#039; a ready-made display board but is intented for &#039;&#039;&#039;scripters&#039;&#039;&#039; who wish to integrate it in their own creations.&lt;br /&gt;
&lt;br /&gt;
The script was proprietary from 2010 to July 2013 until I ({{User|Ochi Wolfe}}) have decided to make it open source under the MIT license. It is my first attempt to make a fully open sourced product in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Only one script&#039;&#039;&#039; for a whole group (&amp;quot;sets&amp;quot;) of displays&lt;br /&gt;
* &#039;&#039;&#039;Formatting&#039;&#039;&#039; (color, alpha, alignment, wrapping, trimming, font, borders)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; with 1 to 8 chars, only occupying 0.5 prims each&lt;br /&gt;
* &#039;&#039;&#039;Virtual text boxes&#039;&#039;&#039; to position text arbitrarily&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; for encapsulating multiple style settings&lt;br /&gt;
&lt;br /&gt;
== How to obtain the script ==&lt;br /&gt;
&lt;br /&gt;
You can obtain a complete package containing the script, the display creator, display meshes and font textures at [http://marketplace.secondlife.com/p/FURWARE-text/141379 the Marketplace].&lt;br /&gt;
&lt;br /&gt;
For developers and interested users, I have also set up a [http://github.com/furware/text GitHub] account for the core scripts.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
Please see the following subpages for the user&#039;s manual and developer documentation:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial|First steps &amp;amp; extensive tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference|Short reference &amp;amp; version history]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets|Helper functions for more convenient usage]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers|Developer documentation]]&lt;br /&gt;
&lt;br /&gt;
== Texture creator ==&lt;br /&gt;
&lt;br /&gt;
Please see [[FURWARE_text/TextureCreator|this page]] for information about the texture creator tool for making your own font textures.&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For users:&#039;&#039;&#039; A very important part of contribution to the development of this script is to report any problems you experience while using it as well as suggestions how to make using it even more awesome. For the time being, feel free to write a notecard to {{User|Ochi Wolfe}} or add your comments to the discussion of this wiki-page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For developers:&#039;&#039;&#039; If you have any suggestions for improvements to the script itself, you can either post them in the same way or you can branch the project on [http://github.com/furware/text GitHub] and send your pull requests. Just make sure that they are, of course, of awesome quality and that they don&#039;t bloat the script more than it already is bloated. In fact, any suggestions to improve performance and decrease memory consumption are &#039;&#039;&#039;very&#039;&#039;&#039; welcome.&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
No issues are known for the current release, but please report any problems you find.&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:Syntax_Highlighting_Examples&amp;diff=1196080</id>
		<title>Talk:Syntax Highlighting Examples</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:Syntax_Highlighting_Examples&amp;diff=1196080"/>
		<updated>2015-04-08T09:04:51Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It seems like this extension is no longer working correctly (most languages are not being formatted correctly anymore). Is it officially deprecated or is this a bug? [[User:Ochi Wolfe|Ochi Wolfe]] ([[User talk:Ochi Wolfe|talk]]) 01:28, 8 April 2015 (PDT)&lt;br /&gt;
&lt;br /&gt;
- Nevermind, see [https://jira.secondlife.com/browse/BUG-8292] [[User:Ochi Wolfe|Ochi Wolfe]] ([[User talk:Ochi Wolfe|talk]]) 02:04, 8 April 2015 (PDT)&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets/de&amp;diff=1196079</id>
		<title>FURWARE text/Snippets/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets/de&amp;diff=1196079"/>
		<updated>2015-04-08T08:49:42Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Fixed source highlighting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Seite beinhaltet verschiedene nützliche Code-Schnipsel (Funktionen, Konstanten), die die Arbeit mit [[FURWARE_text/de|FURWARE_text]] wesentlich angenehmer machen.&lt;br /&gt;
&lt;br /&gt;
== Grundlegende Funktionen ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionen in diesem Abschnitt sind Wrapper um die einzelnen [[FURWARE_text/de|FURWARE_text]]-Befehle. Sie wurden so entworfen, dass sie den folgenden Anforderungen genügen:&lt;br /&gt;
&lt;br /&gt;
* Die Funktionen sollen &#039;&#039;in sich abgeschlossen&#039;&#039; sein. Das heißt, dass du auch nur diejenigen Funktionen kopieren kannst, die du wirklich benötigst und sie werden funktionieren.&lt;br /&gt;
* Die Funktionen (und deren Parameter) sollen &#039;&#039;selbsterklärend&#039;&#039; sein. Das heißt, dass sie auch direkt als eine Kurzreferenz für den Befehl dienen sollen, den sie ausführen.&lt;br /&gt;
&lt;br /&gt;
Dass die Funktionen in sich abgeschlossen sind bedeutet auch, dass jede der Funktionen einen [[llMessageLinked]](...)-Aufruf enthält. Das Ziel dieser Aufrufe ist hier auf [[LINK_SET]] (also das gesamte Linkset) gesetzt. Falls nötig, ändere dieses Ziel bitte in deinen Skripten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
fwSetText(string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxText(string box, string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetStyle(string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxStyle(string box, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetDefaultStyle(string target, string style) {&lt;br /&gt;
    // &amp;quot;target&amp;quot; darf leer, &amp;quot;root&amp;quot; oder &amp;quot;nonroot&amp;quot; sein.&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_defaultconf:&amp;quot; + target);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetVariable(string name, string value) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, value, &amp;quot;fw_var:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwAddBox(string name, string parent, integer x, integer y, integer w, integer h, string text, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_addbox: &amp;quot; +name + &amp;quot;:&amp;quot; + parent + &amp;quot;:&amp;quot;+&lt;br /&gt;
                    (string)x + &amp;quot;,&amp;quot; + (string)y + &amp;quot;,&amp;quot; + (string)w + &amp;quot;,&amp;quot; + (string)h + &amp;quot;:&amp;quot; + style);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwDelBox(string name) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwTouchQuery(integer linkNumber, integer faceNumber, string userData) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, userData, &amp;quot;fw_touchquery:&amp;quot; + (string)linkNumber + &amp;quot;:&amp;quot; + (string)faceNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list fwTouchReply(string replyString) {&lt;br /&gt;
    list tokens = llParseStringKeepNulls(replyString, [&amp;quot;:&amp;quot;], []);&lt;br /&gt;
    return [&lt;br /&gt;
        llList2String(tokens, 0), llList2Integer(tokens, 1), llList2Integer(tokens, 2),&lt;br /&gt;
        llList2String(tokens, 3), llList2Integer(tokens, 4), llList2Integer(tokens, 5),&lt;br /&gt;
        llDumpList2String(llDeleteSubList(tokens, 0, 5), &amp;quot;:&amp;quot;)&lt;br /&gt;
    ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetNotify(integer enabled) {&lt;br /&gt;
    string s = &amp;quot;off&amp;quot;; if (enabled) s = &amp;quot;on&amp;quot;;&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, s, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwMemory() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwReset() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
&lt;br /&gt;
Die oben aufgeführen Funktionen erlauben dir zwar die meisten Befehle einfacher zu verwenden, aber einige Details müssen dennoch von Hand erledigt werden, beispielsweise das Angeben von Textstil-Konfigurationen. Die folgenden Zeilen geben dir ein paar Beispiele für die Verwendung der Funktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Setzt den Text aller Boxen in allen Sets.&lt;br /&gt;
fwSetText(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Setzt den Text der Box &amp;quot;SomeBox&amp;quot;.&lt;br /&gt;
fwSetBoxText(&amp;quot;SomeBox&amp;quot;, &amp;quot;This is some box!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Setzt den Standard-Stil aller Boxen auf color=red, align=center (der nächste Abschnitt zeigt, wie man dies schöner erledigen kann).&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, &amp;quot;c=red;a=center&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Füge eine Box &amp;quot;NewBox&amp;quot; mit &amp;quot;ExistingBox&amp;quot; als Parent hinzu.&lt;br /&gt;
fwAddBox(&amp;quot;NewBox&amp;quot;, &amp;quot;ExistingBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Lösche eine Box.&lt;br /&gt;
fwDelBox(&amp;quot;NewBox&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Sende eine Touch Query aus dem touch_start(...)-Event heraus.&lt;br /&gt;
touch_start(integer num) {&lt;br /&gt;
    fwTouchQuery(llDetectedLinkNumber(0), llDetectedTouchFace(0), &amp;quot;Arbitrary user data goes here&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Verarbeite eine &amp;quot;Touch Reply&amp;quot;-Antwort im link_message(...)-Event.&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
        list result = fwTouchReply(str);&lt;br /&gt;
        // Die Liste &amp;quot;result&amp;quot; enthält jetzt die Antwort als [boxName, boxRelativeX, boxRelativeY, rootName, absoluteX, absoluteY, userData].&lt;br /&gt;
        // &amp;quot;boxName&amp;quot; ist leer, wenn die Touch Query ungültig war.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Noch angenehmere Verwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionen im letzten Abschnitt sind lediglich Wrapper um die [[FURWARE_text/de|FURWARE_text]]-Befehle, allerdings muss du weiterhin Dinge wie Stileinstellungen selber schreiben und dir die verschiedenen Optionen und deren Werte merken. Die folgenden Konstanten und Funktionen nehmen dir einen Teil dieser Arbeit ab (auch hier gilt, dass du nur die Teile kopieren musst, die du tatsächlich benötigst – auch um Speicher zu sparen!).&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Beachte, dass die folgenden Zeilen die Funktionen im vorigen Abschnitt ergänzen, d.h. du musst die entsprechenden Funktionen zusätzlich mitkopieren.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// === Farben (colors) ===&lt;br /&gt;
&lt;br /&gt;
string COLOR_DEFAULT            = &amp;quot;c=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Graustufen.&lt;br /&gt;
string COLOR_WHITE              = &amp;quot;c=white;&amp;quot;;&lt;br /&gt;
string COLOR_SILVER             = &amp;quot;c=silver;&amp;quot;;&lt;br /&gt;
string COLOR_GRAY               = &amp;quot;c=gray;&amp;quot;;&lt;br /&gt;
string COLOR_BLACK              = &amp;quot;c=black;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Standardfarben.&lt;br /&gt;
string COLOR_RED                = &amp;quot;c=red;&amp;quot;;&lt;br /&gt;
string COLOR_GREEN              = &amp;quot;c=green;&amp;quot;;&lt;br /&gt;
string COLOR_BLUE               = &amp;quot;c=blue;&amp;quot;;&lt;br /&gt;
string COLOR_CYAN               = &amp;quot;c=cyan;&amp;quot;;&lt;br /&gt;
string COLOR_MAGENTA            = &amp;quot;c=magenta;&amp;quot;;&lt;br /&gt;
string COLOR_YELLOW             = &amp;quot;c=yellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Dunkle Farben.&lt;br /&gt;
string COLOR_DARKRED            = &amp;quot;c=darkred;&amp;quot;;&lt;br /&gt;
string COLOR_DARKGREEN          = &amp;quot;c=darkgreen;&amp;quot;;&lt;br /&gt;
string COLOR_DARKBLUE           = &amp;quot;c=darkblue;&amp;quot;;&lt;br /&gt;
string COLOR_DARKCYAN           = &amp;quot;c=darkcyan;&amp;quot;;&lt;br /&gt;
string COLOR_DARKMAGENTA        = &amp;quot;c=darkmagenta;&amp;quot;;&lt;br /&gt;
string COLOR_DARKYELLOW         = &amp;quot;c=darkyellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Beliebige RGB- (Rot, Grün, Blau) Farben.&lt;br /&gt;
string fwColorRGB(float red, float green, float blue) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,1&amp;quot; + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Beliebige RGBA- (Rot, Grün, Blau, Alpha/Deckkraft) Farben.&lt;br /&gt;
string fwColorRGBA(float red, float green, float blue, float alpha) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,&amp;quot; + (string)alpha + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Ausrichtung (alignment) ===&lt;br /&gt;
&lt;br /&gt;
string ALIGN_DEFAULT            = &amp;quot;a=def;&amp;quot;;&lt;br /&gt;
string ALIGN_LEFT               = &amp;quot;a=left;&amp;quot;;&lt;br /&gt;
string ALIGN_CENTER             = &amp;quot;a=center;&amp;quot;;&lt;br /&gt;
string ALIGN_RIGHT              = &amp;quot;a=right;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Umbruch (wrapping) ===&lt;br /&gt;
&lt;br /&gt;
string WRAP_DEFAULT             = &amp;quot;w=def;&amp;quot;;&lt;br /&gt;
string WRAP_WORD                = &amp;quot;w=word;&amp;quot;;&lt;br /&gt;
string WRAP_CHAR                = &amp;quot;w=char;&amp;quot;;&lt;br /&gt;
string WRAP_NONE                = &amp;quot;w=none;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Abschneiden von Leerzeichen am Anfang/Ende (trimming) ===&lt;br /&gt;
&lt;br /&gt;
string TRIM_DEFAULT             = &amp;quot;t=def;&amp;quot;;&lt;br /&gt;
string TRIM_ON                  = &amp;quot;t=on;&amp;quot;;&lt;br /&gt;
string TRIM_OFF                 = &amp;quot;t=off;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Schriftarten (fonts) ===&lt;br /&gt;
&lt;br /&gt;
string FONT_DEFAULT             = &amp;quot;f=def;&amp;quot;;&lt;br /&gt;
string FONT_ANDALE              = &amp;quot;f=e31ce6e8-4117-7073-6aac-e6503034b4c5;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO       = &amp;quot;f=24c4ead5-04cd-1831-5fd9-ec48882e00b1;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO_BOLD  = &amp;quot;f=82c4fcac-3990-223c-286d-5bc92a258fbc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU              = &amp;quot;f=f974fdfc-8fbd-2f29-2b38-3c34411c1fcc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU_BOLD         = &amp;quot;f=5054fec3-1465-af8f-2fe5-e9507795c82a;&amp;quot;;&lt;br /&gt;
string FONT_ENVYCODER           = &amp;quot;f=a2ec2cf0-b207-db51-d4a1-f3f8d6684c07;&amp;quot;;&lt;br /&gt;
string FONT_FREEFONT            = &amp;quot;f=05f6f69e-8bdf-a824-a2cf-d91c9e371c23;&amp;quot;;&lt;br /&gt;
string FONT_INCONSOLATA         = &amp;quot;f=867288f9-940e-a7cf-ac7d-5596ea7fb2c5;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION          = &amp;quot;f=c992dfc4-0aca-02c8-bc01-8330e6db6f87;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION_BOLD     = &amp;quot;f=1494337d-5296-3c43-8f7c-45617448ec9a;&amp;quot;;&lt;br /&gt;
string FONT_LUXI                = &amp;quot;f=2d8f52d7-2220-2d7a-15b5-e685a9449e5c;&amp;quot;;&lt;br /&gt;
string FONT_LUXI_BOLD           = &amp;quot;f=03812794-535b-f546-6171-6bec5bf399be;&amp;quot;;&lt;br /&gt;
string FONT_MONOFUR             = &amp;quot;f=8fc63e35-a18f-e335-3936-e2ca196a944d;&amp;quot;;&lt;br /&gt;
string FONT_NOVA                = &amp;quot;f=2df8e09d-e1bd-d17f-6bec-b8d713790380;&amp;quot;;&lt;br /&gt;
string FONT_PROFONT             = &amp;quot;f=45a8e6f6-90e4-299d-d3bc-0bf4dbf170db;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Rahmen (borders) ===&lt;br /&gt;
&lt;br /&gt;
string BORDER_DEFAULT           = &amp;quot;border=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Einige Beispiele für oft benutzte Rahmenstile.&lt;br /&gt;
string BORDER_ALL_SIDES         = &amp;quot;border=tblr;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_THICK   = &amp;quot;border=tblr1;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_DOUBLE  = &amp;quot;border=tblr2;&amp;quot;;&lt;br /&gt;
string BORDER_BOTTOM            = &amp;quot;border=b;&amp;quot;;&lt;br /&gt;
string BORDER_LEFT_RIGHT        = &amp;quot;border=lr;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Eine allgemeinere Hilfsfunktion für Rahmen. Die Seiten-Parameter sind von oben beginnend im Uhrzeigersinn angeordnet.&lt;br /&gt;
string fwBorder(integer top, integer right, integer bottom, integer left, integer style) {&lt;br /&gt;
    string result = &amp;quot;border=&amp;quot;;&lt;br /&gt;
    if (top)    result += &amp;quot;t&amp;quot;; if (right)  result += &amp;quot;r&amp;quot;;&lt;br /&gt;
    if (bottom) result += &amp;quot;b&amp;quot;; if (left)   result += &amp;quot;l&amp;quot;;&lt;br /&gt;
    if (style)  result += (string)style;&lt;br /&gt;
    return result + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Stil-Variablen ===&lt;br /&gt;
&lt;br /&gt;
// Lädt einen in einer fw_var(iable) gespeicherten Stil.&lt;br /&gt;
string fwStyle(string styleVariableName) {&lt;br /&gt;
    return &amp;quot;style=&amp;quot; + styleVariableName + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
&lt;br /&gt;
Jeder Wert der Konstanten endet mit einem &amp;quot;;&amp;quot;. Das erlaubt dir, die Konstanten einfach mit &amp;quot;+&amp;quot; zu verbinden und trotzdem gültige Strings für Stileinstellungen zu erhalten. Damit kannst du so etwas schreiben wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Setzt die Farbe (color), den Umbruch (wrapping) und die Schriftart (font) für alle Boxen.&lt;br /&gt;
fwSetStyle(COLOR_YELLOW + WRAP_NONE + FONT_MONOFUR);&lt;br /&gt;
&lt;br /&gt;
// Setzt die Standard-Stileinstellung für alle Boxen.&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, COLOR_RED + ALIGN_CENTER);&lt;br /&gt;
&lt;br /&gt;
// Füge eine Box mit einer Stileinstellung hinzu. Wir benutzen hier eine selbstspezifizierte RGB-Farbe.&lt;br /&gt;
fwAddBox(&amp;quot;SomeBox&amp;quot;, &amp;quot;ParentBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, FONT_LUXI + fwColorRGB(0.5, 0.75, 0.0) + BORDER_ALL_SIDES);&lt;br /&gt;
&lt;br /&gt;
// Speichere einen Stil-String in einer Variablen und benutze diesen.&lt;br /&gt;
fwSetVariable(&amp;quot;MyStyle&amp;quot;, FONT_MONOFUR + ALIGN_CENTER + BORDER_ALL_SIDES);&lt;br /&gt;
fwSetBoxStyle(&amp;quot;BoxA&amp;quot;, fwStyle(&amp;quot;MyStyle&amp;quot;));&lt;br /&gt;
fwSetBoxStyle(&amp;quot;BoxB&amp;quot;, fwStyle(&amp;quot;MyStyle&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets&amp;diff=1196078</id>
		<title>FURWARE text/Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets&amp;diff=1196078"/>
		<updated>2015-04-08T08:48:31Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Fixed syntax highlighting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page contains several useful code snippets (functions, constants) that can make the usage of [[FURWARE_text]] a lot more convenient.&lt;br /&gt;
&lt;br /&gt;
== Basic convenience functions ==&lt;br /&gt;
&lt;br /&gt;
The functions in this section are wrappers around each of the FURWARE text commands. They were designed to follow these rules:&lt;br /&gt;
&lt;br /&gt;
* The functions shall be &#039;&#039;self-contained&#039;&#039;. That is, you may copy any subset of the functions that you need and they will work.&lt;br /&gt;
* The functions (and their parameters) shall be &#039;&#039;self-explanatory&#039;&#039;. That is, they also serve as a quick reference guide to the parameters of the commands they execute.&lt;br /&gt;
&lt;br /&gt;
The fact that the functions are self-contained also means that each of them contains a [[llMessageLinked]](...)-call. The target of this call is set to [[LINK_SET]] (the whole linkset). Please change this target accordingly in your scripts, if needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
fwSetText(string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxText(string box, string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetStyle(string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxStyle(string box, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetDefaultStyle(string target, string style) {&lt;br /&gt;
    // &amp;quot;target&amp;quot; may be empty, &amp;quot;root&amp;quot; or &amp;quot;nonroot&amp;quot;.&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_defaultconf:&amp;quot; + target);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetVariable(string name, string value) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, value, &amp;quot;fw_var:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwAddBox(string name, string parent, integer x, integer y, integer w, integer h, string text, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_addbox: &amp;quot; +name + &amp;quot;:&amp;quot; + parent + &amp;quot;:&amp;quot;+&lt;br /&gt;
                    (string)x + &amp;quot;,&amp;quot; + (string)y + &amp;quot;,&amp;quot; + (string)w + &amp;quot;,&amp;quot; + (string)h + &amp;quot;:&amp;quot; + style);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwDelBox(string name) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwTouchQuery(integer linkNumber, integer faceNumber, string userData) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, userData, &amp;quot;fw_touchquery:&amp;quot; + (string)linkNumber + &amp;quot;:&amp;quot; + (string)faceNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list fwTouchReply(string replyString) {&lt;br /&gt;
    list tokens = llParseStringKeepNulls(replyString, [&amp;quot;:&amp;quot;], []);&lt;br /&gt;
    return [&lt;br /&gt;
        llList2String(tokens, 0), llList2Integer(tokens, 1), llList2Integer(tokens, 2),&lt;br /&gt;
        llList2String(tokens, 3), llList2Integer(tokens, 4), llList2Integer(tokens, 5),&lt;br /&gt;
        llDumpList2String(llDeleteSubList(tokens, 0, 5), &amp;quot;:&amp;quot;)&lt;br /&gt;
    ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetNotify(integer enabled) {&lt;br /&gt;
    string s = &amp;quot;off&amp;quot;; if (enabled) s = &amp;quot;on&amp;quot;;&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, s, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwMemory() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwReset() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The above snippets allow you to use the basic commands more easily, but you may still need to do some manual work, for example when specifying style configuration strings. The following lines give a few assorted examples of calls using the functions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Set the text of all boxes in all sets.&lt;br /&gt;
fwSetText(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Set the text of the box &amp;quot;SomeBox&amp;quot;.&lt;br /&gt;
fwSetBoxText(&amp;quot;SomeBox&amp;quot;, &amp;quot;This is some box!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Set the default style of all boxes to color=red, align=center (see the next section how to make this much nicer).&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, &amp;quot;c=red;a=center&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Add a box &amp;quot;NewBox&amp;quot; using &amp;quot;ExistingBox&amp;quot; as its parent.&lt;br /&gt;
fwAddBox(&amp;quot;NewBox&amp;quot;, &amp;quot;ExistingBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Delete a box.&lt;br /&gt;
fwDelBox(&amp;quot;NewBox&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Send a touch query from the touch_start(...)-event.&lt;br /&gt;
touch_start(integer num) {&lt;br /&gt;
    fwTouchQuery(llDetectedLinkNumber(0), llDetectedTouchFace(0), &amp;quot;Arbitrary user data goes here&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Parse a touch reply in the link_message(...)-event.&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
        list result = fwTouchReply(str);&lt;br /&gt;
        // The list &amp;quot;result&amp;quot; now contains the reply as [boxName, boxRelativeX, boxRelativeY, rootName, absoluteX, absoluteY, userData].&lt;br /&gt;
        // &amp;quot;boxName&amp;quot; is empty if the touch query was invalid.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional awesomeness ==&lt;br /&gt;
&lt;br /&gt;
The functions in the previous section are wrappers around the [[FURWARE_text]] commands, but you still need to write, for instance, style configuration strings yourself and remember the style options and values. The following set of constants and functions help you with that (again, you don&#039;t have to copy all of them but just the ones you need to save script memory!).&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Note that these constants complement the functions defined above, so make sure to copy the functions you need as well.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// === Colors ===&lt;br /&gt;
&lt;br /&gt;
string COLOR_DEFAULT            = &amp;quot;c=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Grayscales.&lt;br /&gt;
string COLOR_WHITE              = &amp;quot;c=white;&amp;quot;;&lt;br /&gt;
string COLOR_SILVER             = &amp;quot;c=silver;&amp;quot;;&lt;br /&gt;
string COLOR_GRAY               = &amp;quot;c=gray;&amp;quot;;&lt;br /&gt;
string COLOR_BLACK              = &amp;quot;c=black;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Standard colors.&lt;br /&gt;
string COLOR_RED                = &amp;quot;c=red;&amp;quot;;&lt;br /&gt;
string COLOR_GREEN              = &amp;quot;c=green;&amp;quot;;&lt;br /&gt;
string COLOR_BLUE               = &amp;quot;c=blue;&amp;quot;;&lt;br /&gt;
string COLOR_CYAN               = &amp;quot;c=cyan;&amp;quot;;&lt;br /&gt;
string COLOR_MAGENTA            = &amp;quot;c=magenta;&amp;quot;;&lt;br /&gt;
string COLOR_YELLOW             = &amp;quot;c=yellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Dark colors.&lt;br /&gt;
string COLOR_DARKRED            = &amp;quot;c=darkred;&amp;quot;;&lt;br /&gt;
string COLOR_DARKGREEN          = &amp;quot;c=darkgreen;&amp;quot;;&lt;br /&gt;
string COLOR_DARKBLUE           = &amp;quot;c=darkblue;&amp;quot;;&lt;br /&gt;
string COLOR_DARKCYAN           = &amp;quot;c=darkcyan;&amp;quot;;&lt;br /&gt;
string COLOR_DARKMAGENTA        = &amp;quot;c=darkmagenta;&amp;quot;;&lt;br /&gt;
string COLOR_DARKYELLOW         = &amp;quot;c=darkyellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Arbitrary RGB (red, green, blue) color.&lt;br /&gt;
string fwColorRGB(float red, float green, float blue) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,1&amp;quot; + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Arbitrary RGBA (red, green, blue, alpha/opacity) color.&lt;br /&gt;
string fwColorRGBA(float red, float green, float blue, float alpha) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,&amp;quot; + (string)alpha + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Alignment ===&lt;br /&gt;
&lt;br /&gt;
string ALIGN_DEFAULT            = &amp;quot;a=def;&amp;quot;;&lt;br /&gt;
string ALIGN_LEFT               = &amp;quot;a=left;&amp;quot;;&lt;br /&gt;
string ALIGN_CENTER             = &amp;quot;a=center;&amp;quot;;&lt;br /&gt;
string ALIGN_RIGHT              = &amp;quot;a=right;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Wrapping ===&lt;br /&gt;
&lt;br /&gt;
string WRAP_DEFAULT             = &amp;quot;w=def;&amp;quot;;&lt;br /&gt;
string WRAP_WORD                = &amp;quot;w=word;&amp;quot;;&lt;br /&gt;
string WRAP_CHAR                = &amp;quot;w=char;&amp;quot;;&lt;br /&gt;
string WRAP_NONE                = &amp;quot;w=none;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Trimming ===&lt;br /&gt;
&lt;br /&gt;
string TRIM_DEFAULT             = &amp;quot;t=def;&amp;quot;;&lt;br /&gt;
string TRIM_ON                  = &amp;quot;t=on;&amp;quot;;&lt;br /&gt;
string TRIM_OFF                 = &amp;quot;t=off;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Fonts ===&lt;br /&gt;
&lt;br /&gt;
string FONT_DEFAULT             = &amp;quot;f=def;&amp;quot;;&lt;br /&gt;
string FONT_ANDALE              = &amp;quot;f=e31ce6e8-4117-7073-6aac-e6503034b4c5;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO       = &amp;quot;f=24c4ead5-04cd-1831-5fd9-ec48882e00b1;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO_BOLD  = &amp;quot;f=82c4fcac-3990-223c-286d-5bc92a258fbc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU              = &amp;quot;f=f974fdfc-8fbd-2f29-2b38-3c34411c1fcc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU_BOLD         = &amp;quot;f=5054fec3-1465-af8f-2fe5-e9507795c82a;&amp;quot;;&lt;br /&gt;
string FONT_ENVYCODER           = &amp;quot;f=a2ec2cf0-b207-db51-d4a1-f3f8d6684c07;&amp;quot;;&lt;br /&gt;
string FONT_FREEFONT            = &amp;quot;f=05f6f69e-8bdf-a824-a2cf-d91c9e371c23;&amp;quot;;&lt;br /&gt;
string FONT_INCONSOLATA         = &amp;quot;f=867288f9-940e-a7cf-ac7d-5596ea7fb2c5;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION          = &amp;quot;f=c992dfc4-0aca-02c8-bc01-8330e6db6f87;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION_BOLD     = &amp;quot;f=1494337d-5296-3c43-8f7c-45617448ec9a;&amp;quot;;&lt;br /&gt;
string FONT_LUXI                = &amp;quot;f=2d8f52d7-2220-2d7a-15b5-e685a9449e5c;&amp;quot;;&lt;br /&gt;
string FONT_LUXI_BOLD           = &amp;quot;f=03812794-535b-f546-6171-6bec5bf399be;&amp;quot;;&lt;br /&gt;
string FONT_MONOFUR             = &amp;quot;f=8fc63e35-a18f-e335-3936-e2ca196a944d;&amp;quot;;&lt;br /&gt;
string FONT_NOVA                = &amp;quot;f=2df8e09d-e1bd-d17f-6bec-b8d713790380;&amp;quot;;&lt;br /&gt;
string FONT_PROFONT             = &amp;quot;f=45a8e6f6-90e4-299d-d3bc-0bf4dbf170db;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Borders ===&lt;br /&gt;
&lt;br /&gt;
string BORDER_DEFAULT           = &amp;quot;border=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// These are just some examples for common border styles.&lt;br /&gt;
string BORDER_ALL_SIDES         = &amp;quot;border=tblr;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_THICK   = &amp;quot;border=tblr1;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_DOUBLE  = &amp;quot;border=tblr2;&amp;quot;;&lt;br /&gt;
string BORDER_BOTTOM            = &amp;quot;border=b;&amp;quot;;&lt;br /&gt;
string BORDER_LEFT_RIGHT        = &amp;quot;border=lr;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// A more general helper function for borders. The side parameters are ordered clockwise, starting on top.&lt;br /&gt;
string fwBorder(integer top, integer right, integer bottom, integer left, integer style) {&lt;br /&gt;
    string result = &amp;quot;border=&amp;quot;;&lt;br /&gt;
    if (top)    result += &amp;quot;t&amp;quot;; if (right)  result += &amp;quot;r&amp;quot;;&lt;br /&gt;
    if (bottom) result += &amp;quot;b&amp;quot;; if (left)   result += &amp;quot;l&amp;quot;;&lt;br /&gt;
    if (style)  result += (string)style;&lt;br /&gt;
    return result + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Style variables ===&lt;br /&gt;
&lt;br /&gt;
// Loads a style stored in a fw_var(iable).&lt;br /&gt;
string fwStyle(string styleVariableName) {&lt;br /&gt;
    return &amp;quot;style=&amp;quot; + styleVariableName + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
Note that the value of each constant ends with &amp;quot;;&amp;quot;. This allows you to simply &amp;quot;+&amp;quot; them together and you still get valid style strings which you may then use wherever you need a style config string. This allows you to write things like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Set the color, wrapping and font of all boxes.&lt;br /&gt;
fwSetStyle(COLOR_YELLOW + WRAP_NONE + FONT_MONOFUR);&lt;br /&gt;
&lt;br /&gt;
// Set the default style for all boxes.&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, COLOR_RED + ALIGN_CENTER);&lt;br /&gt;
&lt;br /&gt;
// Add a box with some style config. We will use a custom RGB color here.&lt;br /&gt;
fwAddBox(&amp;quot;SomeBox&amp;quot;, &amp;quot;ParentBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, FONT_LUXI + fwColorRGB(0.5, 0.75, 0.0) + BORDER_ALL_SIDES);&lt;br /&gt;
&lt;br /&gt;
// Store a style string in a variable and use it.&lt;br /&gt;
fwSetVariable(&amp;quot;MyStyle&amp;quot;, FONT_MONOFUR + ALIGN_CENTER + BORDER_ALL_SIDES);&lt;br /&gt;
fwSetBoxStyle(&amp;quot;BoxA&amp;quot;, fwStyle(&amp;quot;MyStyle&amp;quot;));&lt;br /&gt;
fwSetBoxStyle(&amp;quot;BoxB&amp;quot;, fwStyle(&amp;quot;MyStyle&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Reference/de&amp;diff=1196077</id>
		<title>FURWARE text/Reference/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Reference/de&amp;diff=1196077"/>
		<updated>2015-04-08T08:46:38Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Fixed syntax highlighting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kurzreferenz ==&lt;br /&gt;
&lt;br /&gt;
Dieses Kapitel ist als eine knappe Zusammenfassung aller Dinge gedacht, die zur Arbeit mit FURWARE text nötig sind. Das sind vor allem die Namen und Parameter der verschiedenen Befehle. Das Kapitel ist nicht als Ersatz für das Tutorial gedacht.&lt;br /&gt;
&lt;br /&gt;
=== Befehle ===&lt;br /&gt;
&lt;br /&gt;
==== fw_data &amp;amp; fw_conf ====&lt;br /&gt;
&lt;br /&gt;
Box-Einstellung für Text (fw_data) und Stil (fw_conf)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some new text&amp;quot;,   &amp;quot;fw_data : BoxSpec : BoxSpec : BoxSpec : ...&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_conf : BoxSpec : BoxSpec : BoxSpec : ...&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes &amp;quot;&#039;&#039;&#039;BoxSpec&#039;&#039;&#039;&amp;quot; kann hierbei verschiedene Formen haben um verschiedene Boxen auszuwählen. Seien in der folgenden Tabelle &amp;quot;BoxOne&amp;quot; und &amp;quot;BoxTwo&amp;quot; zwei gültige Box-Namen aus demselben Display-Set:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
! BoxSpec&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| (leer)&lt;br /&gt;
| Alle Boxen in allen Sets.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne&lt;br /&gt;
| Genau die Box &amp;quot;BoxOne&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne ; BoxTwo&lt;br /&gt;
| Alle Boxen zwischen* (und inklusive) &amp;quot;BoxOne&amp;quot; und &amp;quot;BoxTwo&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne ;&lt;br /&gt;
| &amp;quot;BoxOne&amp;quot; und alle folgenden* Boxen im selben Display-Set.&lt;br /&gt;
|-&lt;br /&gt;
| ; BoxTwo&lt;br /&gt;
| &amp;quot;BoxTwo&amp;quot; und alle davorliegenden* Boxen im selben Display-Set.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Abhängig von der Reihenfolge, in denen die Boxen hinzugefügt wurden.&lt;br /&gt;
&lt;br /&gt;
==== fw_defaultconf ====&lt;br /&gt;
&lt;br /&gt;
Setzt globale Stilvoreinstellungen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf : root&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf : nonroot&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die drei Varianten setzen die Stilvoreinstellung für alle Boxen, alle Root-Boxen bzw. alle Nicht-Root-Boxen.&lt;br /&gt;
&lt;br /&gt;
==== fw_var ====&lt;br /&gt;
&lt;br /&gt;
Speichert einen String in einem &amp;quot;Variablennamen&amp;quot;. Dies wird momentan nur für Stilvorlangen verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some string&amp;quot;, &amp;quot;fw_var : varName&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzt den Inhalt der Variable &amp;quot;varName&amp;quot; auf &amp;quot;Some string&amp;quot;. Variablen können gelöscht werden, indem ihnen der leere String zugewiesen wird.&lt;br /&gt;
&lt;br /&gt;
==== fw_addbox ====&lt;br /&gt;
&lt;br /&gt;
Fügt eine neue virtuelle Textbox hinzu. Es kann höchstens 16 Boxen pro Set (inklusive der Basis-Box) geben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some initial text&amp;quot;, &amp;quot;fw_addbox : boxName : parentName : dx, dy, sx, sy : stylePrefs&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe das Tutorial für Details.&lt;br /&gt;
&lt;br /&gt;
==== fw_delbox ====&lt;br /&gt;
&lt;br /&gt;
Löscht eine oder mehrere Textboxen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox : boxOne : boxTwo : ...&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löscht die Textboxen &amp;quot;boxOne&amp;quot;, &amp;quot;boxTwo&amp;quot;, usw.&lt;br /&gt;
&lt;br /&gt;
==== fw_touchquery ====&lt;br /&gt;
&lt;br /&gt;
Führt eine Anfrage aus, welche Box wo geklickt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;userData&amp;quot;, &amp;quot;fw_touchquery : linkNumber : faceNumber&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Antwort hat die Form (Pseudo-Code):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
link_message(..., ..., &amp;quot;boxName:dx:dy:rootName:x:y:userData&amp;quot;, &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe das Tutorial für Details.&lt;br /&gt;
&lt;br /&gt;
==== fw_notify ====&lt;br /&gt;
&lt;br /&gt;
Aktiviere oder deaktiviere Benachrichtigungen per Link Message wenn das Aktualisieren der Anzeige fertig ist. Standardmäßig aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;on&amp;quot;, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;off&amp;quot;, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Benachrichtigungen aktiviert sind, sendet das Textskript eine Link Message in welcher &amp;quot;id&amp;quot; auf &amp;quot;fw_done&amp;quot; gesetzt ist wenn alle ausstehendenen Aktualisierungen der Anzeige durchgeführt wurden.&lt;br /&gt;
&lt;br /&gt;
==== fw_memory ====&lt;br /&gt;
&lt;br /&gt;
Teilt dem Besitzer des Objekts mit wie viel Speicher verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fw_reset ====&lt;br /&gt;
&lt;br /&gt;
Setzt das Textskript vollständig zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Wenn das Zurücksetzen abgeschlossen ist sendet das Skript an alle Prims eine Link Message, in der der &amp;quot;id&amp;quot;-Parameter auf &amp;quot;fw_ready&amp;quot; gesetzt ist. Dadurch weiß man wann das Skript wieder Befehle entgegennehmen kann.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Setze das Skript nur zurück wenn es nötig ist. Die Initialisierung ist eine relativ aufwendige Operation und das Textskript ist für einen Moment nicht verfügbar.}}&lt;br /&gt;
&lt;br /&gt;
=== Style settings ===&lt;br /&gt;
&lt;br /&gt;
Stil- und Formateinstellungen werden durch spezielle Strings angegeben. Diese werden für globale Einstellungen, Einstellungen pro Box (&amp;quot;fw_conf&amp;quot;) und für Einstellungen direkt im Text (inline) verwendet.&lt;br /&gt;
&lt;br /&gt;
Eine einzelne Einstellung wird als &#039;&#039;&#039;key=value&#039;&#039;&#039;-Paar angegeben, z.B. &#039;&#039;&#039;c=red&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Mehrere Einstellungen werden durch &amp;quot;&#039;&#039;&#039;;&#039;&#039;&#039;&amp;quot; getrennt, z.B. &#039;&#039;&#039;c=red; a=center; w=none&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
In der folgenden Tabelle: &#039;&#039;Kursiv&#039;&#039; = Standardwert&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
! Einstellung&lt;br /&gt;
! Schlüssel&lt;br /&gt;
! Werte&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Schriftfarbe&lt;br /&gt;
| c&lt;br /&gt;
| R,G,B&lt;br /&gt;
| Schriftfarbe als Rot, Grün, Blau (jeweils im Bereich 0.0-1.0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| R,G,B,A&lt;br /&gt;
| Schriftfarbe als Rot, Grün, Blau, Alpha (jeweils im Bereich 0.0-1.0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| rand&lt;br /&gt;
| Zufällige Farbe (mit Alpha = 1)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| (vordefiniert)&lt;br /&gt;
| Vordefinierte Farbe, siehe Tabelle unten&lt;br /&gt;
|-&lt;br /&gt;
| Ausrichtung&lt;br /&gt;
| a&lt;br /&gt;
| &#039;&#039;left&#039;&#039;&lt;br /&gt;
| Ausrichtung links&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| center&lt;br /&gt;
| Ausrichtung zentriert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| right&lt;br /&gt;
| Ausrichtung rechts&lt;br /&gt;
|-&lt;br /&gt;
| Umbruch&lt;br /&gt;
| w&lt;br /&gt;
| &#039;&#039;word&#039;&#039;&lt;br /&gt;
| Möglichst nach Wörtern umbrechen&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| char&lt;br /&gt;
| An jeder beliebigen Stelle umbrechen&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| none&lt;br /&gt;
| Kein Umbruch; schneidet überlange Zeilen ab&lt;br /&gt;
|-&lt;br /&gt;
| Trimmen&lt;br /&gt;
| t&lt;br /&gt;
| &#039;&#039;on&#039;&#039;&lt;br /&gt;
| Schneidet Leerzeichen von Anfang und Ende jeder Zeile ab&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| off&lt;br /&gt;
| Behält Leerzeichen bei (außer bei wrap=word)&lt;br /&gt;
|-&lt;br /&gt;
| Schriftart&lt;br /&gt;
| f&lt;br /&gt;
| (UUID/name)&lt;br /&gt;
| Setzt die Schrift-Textur auf UUID oder Name&lt;br /&gt;
|-&lt;br /&gt;
| Rahmen&lt;br /&gt;
| border&lt;br /&gt;
| {trblTRBL12}&lt;br /&gt;
| Stellt den Rahmen von Boxen ein&lt;br /&gt;
|-&lt;br /&gt;
| Stilvorlage&lt;br /&gt;
| style&lt;br /&gt;
| (Style name)&lt;br /&gt;
| Verwendet einen mit fw_var definierten Stil&lt;br /&gt;
|-&lt;br /&gt;
| Inline styles&lt;br /&gt;
| tags&lt;br /&gt;
| &#039;&#039;on&#039;&#039;&lt;br /&gt;
| Aktiviert die Verwendung von inline styles&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| off&lt;br /&gt;
| Deaktiviert die Verwendung von inline styles&lt;br /&gt;
|-&lt;br /&gt;
| Force refresh&lt;br /&gt;
| force&lt;br /&gt;
| on&lt;br /&gt;
| Aktiviert die erzwungene Aktualierung aller Faces (deaktiviert Optimierungen!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;off&#039;&#039;&lt;br /&gt;
| Deaktiviert die erzwungene Aktualisierung alles Faces (ermöglicht Optimierungen)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vordefinierte Farben ===&lt;br /&gt;
&lt;br /&gt;
Du kannst die Folgenden Namen anstelle von vektoriellen Farbangeben in Stilen verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_colors.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Schriftarten ===&lt;br /&gt;
&lt;br /&gt;
Die hier angegebenen Schriftarten kannst du mit der &amp;quot;&#039;&#039;&#039;f=...&#039;&#039;&#039;&amp;quot;-Stilangabe entweder durch Angabe ihrer UUID verwenden oder indem du die zugehörige Textur (diese sind Teil des FURWARE text-Pakets) in dein Objekt legst und dann den Texturnamen benutzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_fonts.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versionsgeschichte ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fehler behoben, der beim Anzeigen von Zeichen, die nicht in der Textur-Spezifikation enthalten sind, unerwartetes Verhalten verursachen konnte.&lt;br /&gt;
* Der Set Pointer einer Box wird jetzt bit-packed zusammen mit dem restlichen Box Status gespeichert. Das verkürzt die Länge eines Strides in boxDataList um 1.&lt;br /&gt;
* Nachricht über freien Speicher beim Skript-Start entfernt.&lt;br /&gt;
* getNumberOfPrims()-Funktion entfernt.&lt;br /&gt;
* Der Test, ob wenigstens ein Set verfügbar ist, wurde an den Anfang des link_message()-Handlers verschoben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Das Skript wurde unter der MIT-Lizenz als Open Source veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0-Beta1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Funktionalität von &amp;quot;fw_data&amp;quot; und &amp;quot;fw_conf&amp;quot; wurde überarbeitet um sie (hoffentlich) intuitiver zu machen.&lt;br /&gt;
* Mit den Befehlen &amp;quot;fw_data&amp;quot;, &amp;quot;fw_conf&amp;quot; und &amp;quot;fw_delbox&amp;quot; können nun auch mehrere Boxen auf einmal modifiziert werden.&lt;br /&gt;
* Befehl &amp;quot;fw_defaultconf&amp;quot; hinzugefügt. Momentan für globale Stileinstellungen verwendet.&lt;br /&gt;
* Touch replies liefern jetzt auch den Namen der Root-Box und die absoluten Koordinaten.&lt;br /&gt;
* Stilattribut &amp;quot;force&amp;quot; hinzugefügt um stets alle Faces zu aktualisieren (nützlich für Schriften in denen das Leerzeichen nicht vollständig transparent ist).&lt;br /&gt;
* Optimierte Verarbeitung wenn mehrere &amp;quot;ähnliche&amp;quot; Befehle (z.B. &amp;quot;fw_delbox&amp;quot;) schnell hintereinander ankommen.&lt;br /&gt;
* Überprüfung hinzugefügt ob das Board überhaupt erfolgreich initialisiert wurde bevor Befehle angenommen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0-Beta0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Mesh Prims mit bis zu 8 Buchstaben pro Prim, die jeweils 0.5 Prims belegen&lt;br /&gt;
* Virtuelle Text-Boxen um Text beliebig zu positionieren&lt;br /&gt;
* Style templates zum Speichern von Formatierungseinstellungen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Entwicklerversion erlaubt jetzt eine Weitergabe entweder als +copy/-trans oder -copy/+trans&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.0.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Geschwindigkeit verbessert&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Erste veröffentlichte Version&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Reference&amp;diff=1196076</id>
		<title>FURWARE text/Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Reference&amp;diff=1196076"/>
		<updated>2015-04-08T08:43:17Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Fixed syntax highlighting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference manual ==&lt;br /&gt;
&lt;br /&gt;
This chapter is meant to be a quick overview of pretty much everything necessary to use FURWARE text, especially which names and parameters go where. It is &#039;&#039;&#039;not&#039;&#039;&#039; meant to replace the tutorial in any way.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
&lt;br /&gt;
==== fw_data &amp;amp; fw_conf ====&lt;br /&gt;
&lt;br /&gt;
Per-box settings for text (fw_data) and style (fw_conf)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some new text&amp;quot;,   &amp;quot;fw_data : BoxSpec : BoxSpec : BoxSpec : ...&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_conf : BoxSpec : BoxSpec : BoxSpec : ...&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each &amp;quot;&#039;&#039;&#039;BoxSpec&#039;&#039;&#039;&amp;quot; can have different forms to select different boxes. In the following table, let &amp;quot;BoxOne&amp;quot; and &amp;quot;BoxTwo&amp;quot; be two valid box names in the same display set:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
! BoxSpec&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| (empty)&lt;br /&gt;
| All boxes in all sets.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne&lt;br /&gt;
| Only the box &amp;quot;BoxOne&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne ; BoxTwo&lt;br /&gt;
| All Boxes between* (and including) &amp;quot;BoxOne&amp;quot; and &amp;quot;BoxTwo&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne ;&lt;br /&gt;
| &amp;quot;BoxOne&amp;quot; and all following* boxes in the same display set.&lt;br /&gt;
|-&lt;br /&gt;
| ; BoxTwo&lt;br /&gt;
| &amp;quot;BoxTwo&amp;quot; and all preceding* boxes in the same display set.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Depending on the order in which the boxes were added.&lt;br /&gt;
&lt;br /&gt;
==== fw_defaultconf ====&lt;br /&gt;
&lt;br /&gt;
Sets global style preferences&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf : root&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf : nonroot&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The three variants set the global style preferences for all boxes, all root-boxes and all non-root boxes.&lt;br /&gt;
&lt;br /&gt;
==== fw_var ====&lt;br /&gt;
&lt;br /&gt;
Store some string data in a &amp;quot;variable&amp;quot; name. Currently only used for style templates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some string&amp;quot;, &amp;quot;fw_var : varName&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets the contents of variable &amp;quot;varName&amp;quot; to &amp;quot;Some string&amp;quot;. You can delete variables by passing the empty string as data.&lt;br /&gt;
&lt;br /&gt;
==== fw_addbox ====&lt;br /&gt;
&lt;br /&gt;
Adds a new virtual text box. There can be at most 16 boxes per set (including the root box).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some initial text&amp;quot;, &amp;quot;fw_addbox : boxName : parentName : dx, dy, sx, sy : stylePrefs&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please see the tutorial for details.&lt;br /&gt;
&lt;br /&gt;
==== fw_delbox ====&lt;br /&gt;
&lt;br /&gt;
Deletes one or more text boxes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox : boxOne : boxTwo : ...&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deletes the boxes named &amp;quot;boxOne&amp;quot;, &amp;quot;boxTwo&amp;quot;, etc.&lt;br /&gt;
&lt;br /&gt;
==== fw_touchquery ====&lt;br /&gt;
&lt;br /&gt;
Performs a query which box has been touched where.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;userData&amp;quot;, &amp;quot;fw_touchquery : linkNumber : faceNumber&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The reply has the form (pseudo code):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
link_message(..., ..., &amp;quot;boxName:dx:dy:rootName:x:y:userData&amp;quot;, &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please see the tutorial for details.&lt;br /&gt;
&lt;br /&gt;
==== fw_notify ====&lt;br /&gt;
&lt;br /&gt;
Enable or disable link message notifications when the script has done rendering. Off by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;on&amp;quot;, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;off&amp;quot;, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When notifications are enabled, the text script will send a link message with &amp;quot;id&amp;quot; set to &amp;quot;fw_done&amp;quot; to the whole linkset to let you know when all pending rendering actions have been completed.&lt;br /&gt;
&lt;br /&gt;
==== fw_memory ====&lt;br /&gt;
&lt;br /&gt;
Tells the owner how much memory is available.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fw_reset ====&lt;br /&gt;
&lt;br /&gt;
Performs a full reset on the text script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{KBtip|When the reset has completed, the script sends a link message with &amp;quot;id&amp;quot; set to &amp;quot;fw_ready&amp;quot; to all prims in the linkset. This tells you when the script is ready to take further commands.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Only reset the text script if necessary. Initialization is a quite expensive operation and the script will not be available to take commands for a few seconds.}}&lt;br /&gt;
&lt;br /&gt;
=== Style settings ===&lt;br /&gt;
&lt;br /&gt;
Text styles and format settings are specified using special strings. They are used for global and per-box settings (&amp;quot;fw_conf&amp;quot;) as well as for specifying styles directly within the text (inline styles).&lt;br /&gt;
&lt;br /&gt;
A single setting is given as a &#039;&#039;&#039;key=value&#039;&#039;&#039; pair, for example &#039;&#039;&#039;c=red&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Multiple settings are separated by &amp;quot;&#039;&#039;&#039;;&#039;&#039;&#039;&amp;quot;, for example &#039;&#039;&#039;c=red; a=center; w=none&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
In the following table: &#039;&#039;Italic&#039;&#039; = Default&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
! Setting&lt;br /&gt;
! Key&lt;br /&gt;
! Values&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Font color&lt;br /&gt;
| c&lt;br /&gt;
| R,G,B&lt;br /&gt;
| Font color as red, green, blue (each in range 0.0-1.0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| R,G,B,A&lt;br /&gt;
| Font color as red, green, blue, alpha (each in range 0.0-1.0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| rand&lt;br /&gt;
| Random color (with alpha = 1)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| (predefined)&lt;br /&gt;
| Predefined color, see table below&lt;br /&gt;
|-&lt;br /&gt;
| Alignment&lt;br /&gt;
| a&lt;br /&gt;
| &#039;&#039;left&#039;&#039;&lt;br /&gt;
| Alignment left&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| center&lt;br /&gt;
| Alignment centered&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| right&lt;br /&gt;
| Alignment right&lt;br /&gt;
|-&lt;br /&gt;
| Wrapping&lt;br /&gt;
| w&lt;br /&gt;
| &#039;&#039;word&#039;&#039;&lt;br /&gt;
| Wrap after words, if possible&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| char&lt;br /&gt;
| Wrap at any position&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| none&lt;br /&gt;
| No wrapping; cuts overlong lines&lt;br /&gt;
|-&lt;br /&gt;
| Trimming&lt;br /&gt;
| t&lt;br /&gt;
| &#039;&#039;on&#039;&#039;&lt;br /&gt;
| Trims whitespace from beginning and end of lines&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| off&lt;br /&gt;
| Keeps whitespace (except with wrap=word)&lt;br /&gt;
|-&lt;br /&gt;
| Font&lt;br /&gt;
| f&lt;br /&gt;
| (UUID/name)&lt;br /&gt;
| Sets the font texture to UUID or name&lt;br /&gt;
|-&lt;br /&gt;
| Borders&lt;br /&gt;
| border&lt;br /&gt;
| {trblTRBL12}&lt;br /&gt;
| Specifies the style of box borders&lt;br /&gt;
|-&lt;br /&gt;
| Style template&lt;br /&gt;
| style&lt;br /&gt;
| (Style name)&lt;br /&gt;
| Uses a style defined using fw_var&lt;br /&gt;
|-&lt;br /&gt;
| Inline styles&lt;br /&gt;
| tags&lt;br /&gt;
| &#039;&#039;on&#039;&#039;&lt;br /&gt;
| Enables usage of inline styles&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| off&lt;br /&gt;
| Disables usage of inline styles&lt;br /&gt;
|-&lt;br /&gt;
| Force refresh&lt;br /&gt;
| force&lt;br /&gt;
| on&lt;br /&gt;
| Enables forced refresh of all faces (disables optimizations!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;off&#039;&#039;&lt;br /&gt;
| Disables forced refresh of all faces (enables optimizations)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Predefined colors ===&lt;br /&gt;
&lt;br /&gt;
You may use the following names in place of color vectors in styles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_colors.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fonts ===&lt;br /&gt;
&lt;br /&gt;
You can use the fonts listed here with the &amp;quot;&#039;&#039;&#039;f=...&#039;&#039;&#039;&amp;quot; style setting either by using their UUID or by putting the corresponding texture item (included in the FURWARE text package) into your object and then use the texture&#039;s name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_fonts.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Version history ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fixed an issue where characters that are not part of the font texture specification would cause unexpected behavior.&lt;br /&gt;
* A box&#039;s set pointer is now stored bit-packed together with the rest of its status. This decreases the length of a stride in boxDataList by 1.&lt;br /&gt;
* Removed message about free memory on script startup.&lt;br /&gt;
* Removed getNumberOfPrims()-function.&lt;br /&gt;
* Moved the check if we have any sets at all to the beginning of the link_message()-handler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Made the script open source under the MIT license.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0-Beta1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The functionality of &amp;quot;fw_data&amp;quot; and &amp;quot;fw_conf&amp;quot; has been reworked to (hopefully) make it more intuitive.&lt;br /&gt;
* The commands &amp;quot;fw_data&amp;quot;, &amp;quot;fw_conf&amp;quot;, and &amp;quot;fw_delbox&amp;quot; are now able to modify multiple boxes at once.&lt;br /&gt;
* Added &amp;quot;fw_defaultconf&amp;quot; command. Currently used to configure global style settings.&lt;br /&gt;
* Touch replies now also contain the name of the root box and the absolute coordinates.&lt;br /&gt;
* Added &amp;quot;force&amp;quot; style attribute to force refresh of all faces (useful for fonts where whitespace is not completely transparent).&lt;br /&gt;
* Optimized handling when multiple &amp;quot;similar&amp;quot; commands (e.g. &amp;quot;fw_delbox&amp;quot;) come in quickly.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0-Beta0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Mesh prims with up to 8 characters per prim, each occupying 0.5 prims&lt;br /&gt;
* Virtual text boxes for aligning text arbitrarily&lt;br /&gt;
* Style templates for saving format settings&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The developer version now allows distribution of the script as +copy/-trans or -copy/+trans&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.0.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Improved speed&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* First released version&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Tutorial/de&amp;diff=1196075</id>
		<title>FURWARE text/Tutorial/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Tutorial/de&amp;diff=1196075"/>
		<updated>2015-04-08T08:41:43Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Fixed syntax highlighting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erste Schritte ==&lt;br /&gt;
&lt;br /&gt;
=== Displays erstellen ===&lt;br /&gt;
&lt;br /&gt;
Du kannst (und solltest) den mitgelieferten &amp;quot;&#039;&#039;&#039;FURWARE display creator&#039;&#039;&#039;&amp;quot; verwenden um automatisch perfekt ausgerichtete Display Prims zu erstellen. Jedes Prim erhält automatisch einen speziellen Objektnamen der vom Textskript verwendet wird um die korrekte Reihenfolge unabhängig von der Link-Reihenfolge feststellen zu können.&lt;br /&gt;
&lt;br /&gt;
Ein Display zu erstellen ist einfach:&lt;br /&gt;
&lt;br /&gt;
* Stelle den Display Creator auf ein Landstück, auf dem du hinreichende Rechte hast.&lt;br /&gt;
* Klicke das Creator-Objekt. In dem erscheindenden Dialog kannst du die Parameter des neuen Displays einstellen:&lt;br /&gt;
** Einen &#039;&#039;&#039;Namen&#039;&#039;&#039; für das Display. Dieser wird dazu verwendet um festzulegen, welches Display du ansprechen möchtest wenn du mehrere davon in einem Linkset verwendest.&lt;br /&gt;
** Die Anzahl der &#039;&#039;&#039;Zeilen und Spalten&#039;&#039;&#039; des Displays (die Spalten werden hier in Prims gezählt, nicht in Zeichen).&lt;br /&gt;
** Die Anzahl von &#039;&#039;&#039;Faces&#039;&#039;&#039; (Flächen, entspricht hier der Anzahl von Zeichen) &#039;&#039;&#039;pro Prim&#039;&#039;&#039;. Es stehen Prims mit 1 bis 8 Faces zur Verfügung. Im Allgemeinen ist es effizienter, mehr Faces pro Prim zu verwenden.&lt;br /&gt;
* Wenn du mit den Einstellungen zufrieden bist, klicke &amp;quot;Create&amp;quot; um die Prims zu erstellen. Anschließend kannst du sie geeignet an das Objekt linken auf dem du das Display verwenden möchtest.&lt;br /&gt;
&lt;br /&gt;
=== Einrichtung und Initialisierung ===&lt;br /&gt;
&lt;br /&gt;
Wenn du dein(e) Display(s) erstellt und verlinkt hast, lege &#039;&#039;&#039;eine&#039;&#039;&#039; Kopie des FURWARE text-Skripts in das Linkset. Es ist nur ein einziges Skript nötig um mehrere Displays im Linkset anzusteuern. Das Skript muss &#039;&#039;&#039;nicht&#039;&#039;&#039; im Root-Prim liegen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtiger Hinweis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wahrscheinlich möchtest du dem Textskript einige Befehle senden nachdem es sich selbst initialisiert hat. Ein Reset kann in ein paar Fällen auftreten:&lt;br /&gt;
&lt;br /&gt;
* Das Skript wurde neu in das Objekt hineingelegt.&lt;br /&gt;
* Das Objekt, in dem sich das Skript befindet, wurde durch Shift-Drag kopiert.&lt;br /&gt;
* Das Linkset hat sich geändert (dann muss das Skript neu nach Display Prims suchen).&lt;br /&gt;
* Es wurde manuell zurückgesetzt (etwa per &amp;quot;fw_reset&amp;quot;-Befehl).&lt;br /&gt;
&lt;br /&gt;
Um genau zu wissen wann das Skript bereit ist Befehle zu empfangen, sendet es nach der Initialisierung eine Link Message an das gesamte Linkset, in der der &amp;quot;id&amp;quot;-Parameter auf &amp;quot;fw_ready&amp;quot; gesetzt ist. Es wird &#039;&#039;&#039;dringend empfohlen&#039;&#039;&#039; nach diesen Link Messages zu lauschen und die eigenen Befehle zur Einrichtung des Textskript erst dann zu senden. Dein Code könnte in etwa so aussehen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_ready&amp;quot;) {&lt;br /&gt;
        llOwnerSay(&amp;quot;FW text is up and running!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Sende die ersten Kommandos.&lt;br /&gt;
        llMessageLinked(sender, 0, &amp;quot;c=red&amp;quot;,        &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
        llMessageLinked(sender, 0, &amp;quot;Default text&amp;quot;, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tutorial ==&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitungen ===&lt;br /&gt;
&lt;br /&gt;
Als erstes werden wir einen Rahmen schaffen mit welchem du die Beispiele in diesem Tutorial ausprobieren kannst. Es ist für den Anfang wahrscheinlich praktisch wenn sich das Textskript nach einer Änderung an deinem eigenen Skript zurücksetzt, sodass sich Einstellungen aus vorigen Experimenten nicht in die Quere kommen. Du kannst folgendes Skript als Ausgangspunkt verwenden:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Setze das FURWARE text-Skript zurück.&lt;br /&gt;
        llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
        // Das Textskript sendet &amp;quot;fw_ready&amp;quot; wenn es sich initialisiert hat.&lt;br /&gt;
        if (id == &amp;quot;fw_ready&amp;quot;) {&lt;br /&gt;
            // Hier kannst du deine Kommandos ausprobieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|In diesem Tutorial wird der Einfachheit halber immer an LINK_SET gesendet. Du kannst in deinen Objekten natürlich spezifischere/optimierte Angaben zum Empfänger verwenden.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Es ist im Allgemeinen &#039;&#039;&#039;kein&#039;&#039;&#039; guter Stil das Skript jedes Mal zurückzusetzen wenn du irgendwas am Text verändern möchtest. Sobald du dich mit den Konzepten von FURWARE text vertraut gemacht hast wirst du sehen, dass man so gut wie alles machen kann ohne das Skript resetten zu müssen. Es ist lediglich praktischer für die ersten Experimente.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Einzelnes Display-Set ===&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns zunächst den einfachsten Fall an. Als konkretes Beispiel verwenden wir ein Display bestehend aus 3x4 Prims mit jeweils 8 Faces. Hier eine schematische Darstellung unseres Displays:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_single_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst die zwei wichtigsten Befehle von FURWARE text: &amp;quot;fw_data&amp;quot; zum Setzen von Text und &amp;quot;fw_conf&amp;quot; zum Einstellen des Textstils (Farbe, Ausrichtung, Schriftart usw.). Der Text wird folgendermaßen gesetzt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;This is some example text&amp;quot;, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dies ergibt:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_single_example_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf ähnliche Weise können wir die &#039;&#039;&#039;Textfarbe&#039;&#039;&#039; (color) auf blau und die &#039;&#039;&#039;Ausrichtung&#039;&#039;&#039; (alignment) auf zentriert setzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=blue; a=center&amp;quot;, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kombiniert mit dem vorherigen &amp;quot;fw_data&amp;quot;-Befehl ergibt dies dann:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_single_example_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Du musst nicht jedes mal sowohl den Text als auch den Stil setzen wenn du eines von beidem ändern möchtest. Wenn du den Stil einstellst wird der gerade gesetzte Text wiederverwendet und mit dem neuen Stil dargestellt. Ebenso wird der aktuelle Stil verwendet wenn du neuen Text einstellst.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Display-Sets ===&lt;br /&gt;
&lt;br /&gt;
Ein einzelnes FURWARE text-Skript kann mehrere Display Sets in einem Linkset ansteuern. Das folgende Beispiel besteht aus drei Sets mit den Namen &amp;quot;Alpha&amp;quot;, &amp;quot;Beta&amp;quot; und &amp;quot;Gamma&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_multi_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Die Prims der einzelnen Sets müssen nicht denselben Prim-Typ haben (also Faces pro Prim). Allerdings müssen &#039;&#039;&#039;innerhalb&#039;&#039;&#039; eines Sets die Prim-Typen identisch und die Anzahl der Spalten in allen Zeilen gleich sein.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn wir nun dieselben zwei Code-Zeilen wie im Fall des einzelnen Sets verwenden, werden &#039;&#039;&#039;alle Sets dieselben Einstellungen&#039;&#039;&#039; verwenden. Somit ergibt der Code&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;This is some example text&amp;quot;, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=blue; a=center&amp;quot;, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
folgendes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_multi_example_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nun stellt sich natürlich die Frage wie man die Sets &#039;&#039;&#039;einzeln&#039;&#039;&#039; anspricht. An dieser Stelle kommen die &#039;&#039;&#039;Namen&#039;&#039;&#039; ins Spiel, die wir bei der Display-Erstellung vergeben haben. Der letzte Parameter des llMessageLinked()-Befehls muss abgeändert werden. Um beispielsweise den Text und Stil von Set &amp;quot;Beta&amp;quot; zu ändern ergänzen wir &amp;quot;fw_data&amp;quot; und &amp;quot;fw_conf&amp;quot; jetzt um eine Angabe des Namens des Sets in der Form &amp;quot;&#039;&#039;&#039;fw_data : Beta&#039;&#039;&#039;&amp;quot; und &amp;quot;&#039;&#039;&#039;fw_conf : Beta&#039;&#039;&#039;&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Only for set Beta&amp;quot;, &amp;quot;fw_data : Beta&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Beta&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn wir dies wieder mit dem vorherigen Code verbinden, dann erhalten wir:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_multi_example_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Virtuelle Textboxen ===&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zur Verwendung von mehreren Sets können wir auch virtuelle &#039;&#039;&#039;Textboxen&#039;&#039;&#039; innerhalb eines Sets erstellen. Diese können dazu verwendet werden um auf einfache Weise Text zu positionieren, beispielsweise um &#039;&#039;&#039;Tabellen&#039;&#039;&#039;, &#039;&#039;&#039;Dialoge&#039;&#039;&#039; und mehr zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispiel haben wir zwei Sets &amp;quot;Dialog&amp;quot; und &amp;quot;Table&amp;quot;. Das Set &amp;quot;Dialog&amp;quot; wollen wir als einen einfachen Dialog mit zwei Knöpfen verwenden und das Set &amp;quot;Table&amp;quot; als eine Tabelle mit drei Zeilen, drei Spalten und noch eine zusätzliche Spalte für &amp;quot;up&amp;quot;- und &amp;quot;down&amp;quot;-Knöpfe.&lt;br /&gt;
&lt;br /&gt;
Die kleine Überlappung (Overlap) zwischen den Spalten der Tabelle wird später nützlich sein wenn wir Rahmen zu den Boxen hinzufügen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_boxes_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die erste Aufgabe ist das &#039;&#039;&#039;Hinzufügen&#039;&#039;&#039; der Textboxen. Dies wird mit dem &amp;quot;fw_addbox&amp;quot;-Kommando erledigt. Die Syntax ist wie folgt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;fw_addbox : boxName : parentName : dx, dy, sx, sy : stylePrefs&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Parameter haben folgende Bedeutung:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;boxName&#039;&#039;&#039;: Ein beliebiger Name für die Box. Muss &#039;&#039;&#039;eindeutig&#039;&#039;&#039; unter allen Box- und Set-Namen sein.&lt;br /&gt;
* &#039;&#039;&#039;parentName&#039;&#039;&#039;: Der Name eines &#039;&#039;&#039;Sets oder einer Box&#039;&#039;&#039; zu dem oder der diese Box relativ positioniert werden soll.&lt;br /&gt;
* &#039;&#039;&#039;dx, dy, sx, sy&#039;&#039;&#039;: Vier Ganzzahlen, die die &#039;&#039;&#039;Position&#039;&#039;&#039; der neuen Box relativ zum Parent (dx, dy) und die &#039;&#039;&#039;Größe&#039;&#039;&#039; der neuen Box (sx, sy) angeben.&lt;br /&gt;
* &#039;&#039;&#039;stylePrefs&#039;&#039;&#039;: Die Angabe des Schriftstils (z.B. &amp;quot;c=red; a=center&amp;quot;) den die neue Box standardmäßig verwenden soll; kann weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
Schreiben wir den Code zum Hinzufügen der Boxen auf. Wir werden dies zunächst ziemlich &#039;&#039;&#039;ausführlich&#039;&#039;&#039; machen und später eine kürzere Version anschauen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Add the boxes.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : ButtonOK     : Dialog :  1, 2, 10, 1&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : Column0 : Table   : 0, 1, 8, 3&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : Column1 : Column0 : 7, 0, 8, 3&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : Column2 : Column1 : 7, 0, 8, 3&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : UpDown  : Column2 : 9, 0, 1, 3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Set the boxes&#039; style.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;a=center&amp;quot;, &amp;quot;fw_conf : ButtonOK&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;a=center&amp;quot;, &amp;quot;fw_conf : ButtonCancel&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;w=none&amp;quot;, &amp;quot;fw_conf : Column0&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;w=none&amp;quot;, &amp;quot;fw_conf : Column1&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;w=none&amp;quot;, &amp;quot;fw_conf : Column2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Set some text for the boxes.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some dialog&amp;quot;, &amp;quot;fw_data : Dialog&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;OK&amp;quot;,          &amp;quot;fw_data : ButtonOK&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Cancel&amp;quot;,      &amp;quot;fw_data : ButtonCancel&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;One\nTwo\nThree&amp;quot;, &amp;quot;fw_data : Column0&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;123\n456\n789&amp;quot;,   &amp;quot;fw_data : Column1&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;1.2\n2.3\n3.4&amp;quot;,   &amp;quot;fw_data : Column2&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;▲\n\n▼&amp;quot;,          &amp;quot;fw_data : UpDown&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dies liefert das folgende Ergebnis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_boxes_example_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bitte nimm dir einen Moment um alle Teile der Befehle zu verstehen.&lt;br /&gt;
&lt;br /&gt;
Die ersten beiden Boxen wurden zu der Parent-Box &amp;quot;Dialog&amp;quot; hinzugefügt, also lautet der dritte Parameter von &amp;quot;fw_addbox&amp;quot; gerade &amp;quot;Dialog&amp;quot;. Du kannst auch den Namen einer &#039;&#039;&#039;anderen Box&#039;&#039;&#039; als Parent angeben, dann sind die Positionsangaben &#039;&#039;&#039;relativ&#039;&#039;&#039; zu dem angegebenen Parent. Beispielsweise haben wir für den Parent von &amp;quot;Column1&amp;quot; die Box &amp;quot;Column0&amp;quot; verwendet und die Koordinaten relativ zu der oberen linken Ecke der Box angegeben. Das gleiche haben wir für die Boxen &amp;quot;Column2&amp;quot; und &amp;quot;UpDown&amp;quot; gemacht.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Boxen erstellt wurden haben wir einige Stileinstellungen vorgenommen. So haben wir die &#039;&#039;&#039;Ausrichtung&#039;&#039;&#039; der Dialog-Knöpfe auf zentriert eingestellt (&amp;quot;a=center&amp;quot;) und den &#039;&#039;&#039;Textumbruch&#039;&#039;&#039; für die Tabellenspalten deaktiviert (&amp;quot;w=none&amp;quot;), sodass auch überlange Zeilen immer innerhalb einer Tabellenzeile bleiben.&lt;br /&gt;
&lt;br /&gt;
Schließlich haben wir noch den Text der Boxen gesetzt.&lt;br /&gt;
&lt;br /&gt;
==== Eine etwas knappere Variante ====&lt;br /&gt;
&lt;br /&gt;
Wie bereits erwähnt können wir das vorhergegangene Beispiel auch etwas kürzer schreiben, indem wir den Stil und Text &#039;&#039;&#039;direkt beim Erstellen der Boxen&#039;&#039;&#039; angeben. Der folgende Code liefert das gleiche Ergebnis wie zuvor:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;OK&amp;quot;,     &amp;quot;fw_addbox : ButtonOK     : Dialog :  1, 2, 10, 1 : a=center&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Cancel&amp;quot;, &amp;quot;fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1 : a=center&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;One\nTwo\nThree&amp;quot;, &amp;quot;fw_addbox : Column0 : Table   : 0, 1, 8, 3 : w=none&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;123\n456\n789&amp;quot;,   &amp;quot;fw_addbox : Column1 : Column0 : 7, 0, 8, 3 : w=none&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;1.2\n2.3\n3.4&amp;quot;,   &amp;quot;fw_addbox : Column2 : Column1 : 7, 0, 8, 3 : w=none&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;▲\n\n▼&amp;quot;,          &amp;quot;fw_addbox : UpDown  : Column2 : 9, 0, 1, 3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some dialog&amp;quot;, &amp;quot;fw_data : Dialog&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Box-Rahmen ====&lt;br /&gt;
&lt;br /&gt;
FURWARE text bietet eine besondere Stil-Option die vor allem für Boxen nützlich ist: Die &#039;&#039;&#039;border&#039;&#039;&#039;-Einstellung. Wahrscheinlich sagt hier ein Beispiel mehr als tausend Worte. Schauen wir uns deshalb folgende Abänderung des letzten Beispiels an:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;OK&amp;quot;,     &amp;quot;fw_addbox : ButtonOK     : Dialog :  1, 2, 10, 1 : a=center; border=lr&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Cancel&amp;quot;, &amp;quot;fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1 : a=center; border=lr&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;One\nTwo\nThree&amp;quot;, &amp;quot;fw_addbox : Column0 : Table   : 0, 1, 8, 3 : w=none; border=lr&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;123\n456\n789&amp;quot;,   &amp;quot;fw_addbox : Column1 : Column0 : 7, 0, 8, 3 : w=none; border=lr&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;1.2\n2.3\n3.4&amp;quot;,   &amp;quot;fw_addbox : Column2 : Column1 : 7, 0, 8, 3 : w=none; border=lr&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;▲\n\n▼&amp;quot;,          &amp;quot;fw_addbox : UpDown  : Column2 : 9, 0, 1, 3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some dialog&amp;quot;, &amp;quot;fw_data : Dialog&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;border=lrtb&amp;quot;, &amp;quot;fw_conf : Dialog&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im folgenden Bild wurden die Unterteilungen zwischen den einzelnen Faces weggelassen damit man die hinzugekommenen Rahmen besser sehen kann. Beachte wie das Textskript die Textposition automatisch an die Rahmen anpasst:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_boxes_example_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &amp;quot;border&amp;quot;-Einstellung akzeptiert als Wert &#039;&#039;&#039;jede (sinnvolle) Kombination&#039;&#039;&#039; der Zeichen &#039;&#039;&#039;tblrTBLR12&#039;&#039;&#039; (die Reihenfolge ist egal). Die Kleinbuchstaben t, b, l, r fügen Rahmen am oberen (top), unteren (bottom), linken (left) und rechten (right) Rand ein. Die Großbuchstaben T, B, L, R fügen zusätzlich spezielle Symbole an den Ecken der Boxen ein um diese mit weiteren Boxen verbinden zu können (siehe auch nächstes Bild). Die Zahlen &amp;quot;1&amp;quot; oder &amp;quot;2&amp;quot; wählen andere Stile für die Rahmen aus. Hier ein paar Beispiele:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_boxes_example_3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt sollte auch klar sein wieso die zuvor erwähnte Überlappung zwischen den Tabellenspalten nützlich ist: Auf diese Weise können wir für &#039;&#039;&#039;alle&#039;&#039;&#039; Tabellenspalten einfach einen linken und rechten Rand angeben ohne unterscheiden zu müssen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Der zum Zeichnen der Rahmen zusätzlich benötigte Platz muss manuell zu den jeweiligen Box-Größen hinzuaddiert werden.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Boxen löschen ====&lt;br /&gt;
&lt;br /&gt;
Das Entfernen einer Box wird mittels des &amp;quot;fw_delbox&amp;quot;-Befehls erledigt. Beispielsweise löscht der folgende Code die Knöpfe des Dialogs:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox : ButtonOK&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox : ButtonCancel&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Boxen auf einmal gelöscht werden. Folgender Code liefert dasselbe Ergebnis:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox : ButtonOK : ButtonCancel&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Die &amp;quot;Basis&amp;quot;-Boxen der Display-Sets können nicht entfernt werden (in diesem Beispiel &amp;quot;Dialog&amp;quot; und &amp;quot;Table&amp;quot;).}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Klick-Abfragen (Touch Queries) ===&lt;br /&gt;
&lt;br /&gt;
Das Beispiel aus dem letzten Abschnitt enthält einige Stellen auf den Boxen, die von dem Benutzer angeklickt werden können sollten, nämlich die Knöpfe des &amp;quot;Dialogs&amp;quot; und die &amp;quot;up&amp;quot;-/&amp;quot;down&amp;quot;-Knöpfe auf der Rechten Seite der Tabelle.&lt;br /&gt;
&lt;br /&gt;
Mit einem speziellen Befehl kann vom FURWARE text-Skript erfragt werden, &#039;&#039;&#039;welche Box&#039;&#039;&#039; an &#039;&#039;&#039;welchen Koordinaten&#039;&#039;&#039; geklickt wurde. Das Skript rechnet dabei automatisch die Koordinaten relativ zur oberen linken Ecke der Box um und beachtet die Reihenfolge und etwaige Überlappungen zwischen Boxen.&lt;br /&gt;
&lt;br /&gt;
==== Senden der Anfrage ====&lt;br /&gt;
&lt;br /&gt;
Betrachten wir einen möglichen touch_start()-Handler in unserem Skript, der einen &amp;quot;fw_touchquery&amp;quot;-Befehl an das Textskript sendet:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
touch_start(integer numDetected) {&lt;br /&gt;
    string link = (string)llDetectedLinkNumber(0);&lt;br /&gt;
    string face = (string)llDetectedTouchFace(0);&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;Some user data&amp;quot;, &amp;quot;fw_touchquery:&amp;quot; + link + &amp;quot;:&amp;quot; + face);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wie man sehen kann, enthält der letzte Parameter von llMessageLinked() den &amp;quot;fw_touchquery&amp;quot;-Befehl gefolgt von der Link-Nummer und Face-Nummer, die geklickt wurden. Diese Werte sind durch &amp;quot;:&amp;quot; getrennt.&lt;br /&gt;
&lt;br /&gt;
Du kannst außerdem einen &#039;&#039;&#039;beliebigen String&#039;&#039;&#039; als dritten Parameter von llMessageLinked() übergeben; in diesem Beispiel ist dies &amp;quot;Some user data&amp;quot;. Dieser String wird bei einer Antwort vom Textskript unverändert an dein Skript zurückgegeben. Auf diese Weise kannst du Anfragen den entsprechenden Antworten zuordnen.&lt;br /&gt;
&lt;br /&gt;
==== Verarbeiten der Antwort ====&lt;br /&gt;
&lt;br /&gt;
Das FURWARE text Skript antwortet &#039;&#039;&#039;immer&#039;&#039;&#039; auf eine solche Anfrage, auch wenn die Angaben keinen Sinn machen (etwa wenn das geklickte Prim gar nicht zu einem Display gehört).&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;id&amp;quot;-Parameter des &amp;quot;link_message()&amp;quot;-Handlers enthält immer genau den String &amp;quot;fw_touchreply&amp;quot;, sodass du die Antworten einfach aus sonstigen Link Messages filtern kannst.&lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;str&amp;quot;-Parameter enthält die &amp;quot;:&amp;quot;-separierte Antwort auf die Anfrage. Diese hat die Form&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;boxName:dx:dy:rootName:x:y:userData&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Teile sind dabei:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;boxName&#039;&#039;&#039; ist der Name der Box, die geklickt wurde.&lt;br /&gt;
* &#039;&#039;&#039;dx&#039;&#039;&#039; ist die Spalte des Klicks (gezählt in Zeichen) relativ zur linken Seite der Box.&lt;br /&gt;
* &#039;&#039;&#039;dy&#039;&#039;&#039; ist die Zeile des Klicks relativ zur oberen Seite.&lt;br /&gt;
* &#039;&#039;&#039;rootName&#039;&#039;&#039; ist der Name der Basis-Box des Display-Sets, in dem sich die Box befindet.&lt;br /&gt;
* &#039;&#039;&#039;x&#039;&#039;&#039; ist die Spalte des Klicks (gezählt in Zeichen) relativ zur linken Seite des Display-Sets.&lt;br /&gt;
* &#039;&#039;&#039;y&#039;&#039;&#039; ist die Zeile des Klicks relativ zur oberen Seite des Display-Sets.&lt;br /&gt;
* &#039;&#039;&#039;userData&#039;&#039;&#039; ist der String, der in der Anfrage als dritter Parameter von &amp;quot;llMessageLinked()&amp;quot; übergeben wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Alle Felder bis auf &amp;quot;userData&amp;quot; sind leer wenn die Anfrage ungültig war (z.b. wenn das übergebene Prim nicht zu einem Display gehört).}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel wie wir die Antwort in unserem Beispiel verarbeiten könnten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
        list     tokens    = llParseStringKeepNulls(str, [&amp;quot;:&amp;quot;], []);&lt;br /&gt;
        string   boxName   = llList2String(tokens, 0);&lt;br /&gt;
        integer  dx        = llList2Integer(tokens, 1);&lt;br /&gt;
        integer  dy        = llList2Integer(tokens, 2);&lt;br /&gt;
        string   rootName  = llList2String(tokens, 3);&lt;br /&gt;
        integer  x         = llList2Integer(tokens, 4);&lt;br /&gt;
        integer  y         = llList2Integer(tokens, 5);&lt;br /&gt;
        string   userData  = llList2String(tokens, 6);&lt;br /&gt;
&lt;br /&gt;
        if (boxName == &amp;quot;ButtonOK&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;OK button was clicked.&amp;quot;);&lt;br /&gt;
        } else if (boxName == &amp;quot;ButtonCancel&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Cancel button was clicked.&amp;quot;);&lt;br /&gt;
        } else if (boxName == &amp;quot;UpDown&amp;quot;) {&lt;br /&gt;
            // Wir benutzen die Y-Koordinate um festzustellen ob &amp;quot;hoch&amp;quot; oder &amp;quot;runter&amp;quot; geklickt wurde.&lt;br /&gt;
            if (dy == 0) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Up button was clicked.&amp;quot;);&lt;br /&gt;
            } else if (dy == 2) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Down button was clicked.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stilvorlagen (Style Templates) ===&lt;br /&gt;
&lt;br /&gt;
Machen wir die Knöpfe unseres Dialogs ein wenig interessanter. Wir können ihnen beispielsweise eine andere Schriftart und -farbe geben (zusätzlich zu den Rahmen auf der linken und rechten Seite sowie der zentrierten Ausrichtung). Wir &#039;&#039;&#039;könnten&#039;&#039;&#039; natürlich etwas schreiben wie:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a&amp;quot;, &amp;quot;fw_conf : ButtonOK&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a&amp;quot;, &amp;quot;fw_conf : ButtonCancel&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das mag für dieses kleine Beispiel noch in Ordnung sein; es wirkt trotzdem etwas redundant. Wenn du mehrere Boxen oder Textpassagen hast bei denen du Stile mehrfach verwenden möchtest, dann ist es möglicherweise effizienter &#039;&#039;&#039;Vorlagen&#039;&#039;&#039; (Templates) zu verwenden.&lt;br /&gt;
&lt;br /&gt;
FURWARE text erlaubt das Speichern von Strings in &amp;quot;Variablen&amp;quot;, denen man einen Namen zuweisen kann. Momentan werden diese nur für die Stilvorlagen verwendet. Stecken wir also den oben angegebenen Stil in eine Variable mittels des &amp;quot;fw_var&amp;quot;-Befehls und geben der Variable den Namen &amp;quot;button&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a&amp;quot;, &amp;quot;fw_var : button&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wir können diese Variable nun mittels der Syntax &#039;&#039;&#039;style=...&#039;&#039;&#039; in unserer Stildefinition verwenden. Schreiben wir die beiden &amp;quot;fw_conf&amp;quot;-Zeilen also um:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;style=button&amp;quot;, &amp;quot;fw_conf : ButtonOK&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;style=button&amp;quot;, &amp;quot;fw_conf : ButtonCancel&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unser Dialog sieht dann folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_tmpl_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Du kannst die Vorlagen sogar mit anderen Stileinstellungen kombinieren (sogar mit anderen Templates). Wenn wir beispielsweise den &amp;quot;Cancel&amp;quot;-Knopf dunkelrot machen wollen aber die übrigen Einstellungen des &amp;quot;button&amp;quot;-Templates beibehalten, so können wir schreiben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;style=button; c=darkred&amp;quot;, &amp;quot;fw_conf : ButtonCancel&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Du kannst &amp;quot;fw_var&amp;quot; auch dazu verwenden um den Inhalt einer Variablen zu &#039;&#039;&#039;ändern&#039;&#039;&#039;. Wird als Inhalt der leere String übergeben, so &#039;&#039;&#039;löscht&#039;&#039;&#039; das die Variable. Beachte, dass das Ändern einer vorhandenen Variablen ein &#039;&#039;&#039;vollständiges Aktualisieren&#039;&#039;&#039; der Anzeige nach sich zieht, da das Skript nicht weiß, welche Teile der Anzeige von der Änderung betroffen sein könnten.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Stilvorlagen erlauben Rekursion (d.h. die Verwendung von Stilvorlagen innerhalb einer anderen Stilvorlage). Das Textskript prüft &#039;&#039;&#039;nicht&#039;&#039;&#039; auf unendliche Rekursion!}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Boxen auf einmal konfigurieren ===&lt;br /&gt;
&lt;br /&gt;
Manchmal möchtest du vielleicht denselben Text oder Stil für mehrere Boxen auf einmal setzen. Betrachten wir als Beispiel ein &amp;quot;Spiel-Board&amp;quot; mit 9 separaten Boxen für die &amp;quot;X&amp;quot; und &amp;quot;O&amp;quot;-Zellen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_range_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nehmen wir nun an, dass wir die mittlere Zeile folgendermaßen hervorheben möchten:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_range_example_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um das zu erreichen &#039;&#039;&#039;könnten&#039;&#039;&#039; wir natürlich folgendes schreiben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Cell3&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Cell4&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Cell5&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Allerdings benötigt dies offensichtlich drei Link Messages. FURWARE text bietet eine spezielle Syntax der &amp;quot;fw_data&amp;quot;- und &amp;quot;fw_conf&amp;quot;-Befehle um den Text oder Stil von mehreren Boxen &#039;&#039;&#039;auf einmal&#039;&#039;&#039; einzustellen. Eine Möglichkeit in unserem Beispiel ist die Angabe aller Boxen, die konfiguriert werden sollen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Cell3 : Cell4 : Cell5&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn wir annehmen, dass die Boxen in der Reihenfolge &amp;quot;Cell0&amp;quot;, &amp;quot;Cell1&amp;quot;, etc. zum Board hinzugefügt wurden, dann können wir den Befehl sogar noch kürzer schreiben. Wir können &#039;&#039;&#039;Intervalle&#039;&#039;&#039; von Boxen in der folgenden Schreibweise angeben (beachte das Semikolon (&amp;quot;;&amp;quot;) zwischen den Box-Namen!):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Cell3 ; Cell5&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nehmen wir nun an, dass wir das Spiel &amp;quot;zurücksetzen&amp;quot; möchten, sodass alle Felder &amp;quot;?&amp;quot; anzeigen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_range_example_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dafür müssen wir die Farbe und den Text aller Felder zurücksetzen. Wir können hierfür die Intervall-Notation für &amp;quot;fw_conf&amp;quot; und &amp;quot;fw_data&amp;quot; verwenden:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;,  &amp;quot;fw_conf : Cell0 ; Cell8&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;?&amp;quot;, &amp;quot;fw_data : Cell0 ; Cell8&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In dem vorliegenden Beispiel können wir sogar ein Ende des Intervalls weglassen: Da &amp;quot;Cell8&amp;quot; die letzte Box im Display-Set ist können wir ihren Namen weglassen und schreiben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;,  &amp;quot;fw_conf : Cell0 ;&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;?&amp;quot;, &amp;quot;fw_data : Cell0 ;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dies bedeutet &amp;quot;wende den Befehl auf Cell0 &#039;&#039;&#039;und alle folgenden Boxen&#039;&#039;&#039; im selben Display-Set an&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Die Intervall- und Einzel-Box-Schreibweisen können sogar gemischt verwendet werden. Betrachte den folgenden Code (die zusätzlichen Leerzeichen dienen nur der Übersichtlichkeit und können natürlich weggelassen werden):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;!&amp;quot;, &amp;quot;fw_data :   Cell1;Cell3   :   Cell5   :   Cell7;   &amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Angewendet auf das obige Beispiel-Board ergibt dies:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_range_example_3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Siehe auch die Referenz für eine vollständige Übersicht aller möglichen Parameter-Notationen.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Globale Stilvoreinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Einige Stileinstellungen können einen &amp;quot;globalen&amp;quot; Charakter haben. Beispielsweise möchtest du vielleicht eine bestimmte Schriftart für &#039;&#039;&#039;alle&#039;&#039;&#039; Boxen verwenden und diese schnell ändern können.&lt;br /&gt;
&lt;br /&gt;
Im letzten Abschnitt haben wir bereits eine Möglichkeit gesehen wie wir mehreren Boxen einen Stil geben und diesen später zentral ändern können (nämlich indem wir die zugehörige Variable mittels &amp;quot;fw_var&amp;quot; ändern). Der &#039;&#039;&#039;Nachteil&#039;&#039;&#039; dieser Methode ist, dass das &amp;quot;style=...&amp;quot; für jede Box separat angegeben werden muss und wir daran denken müssen es wieder hinzuschreiben wenn wir andere Einstellungen einer Box ändern mittels &amp;quot;fw_conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Für solche Fälle bietet das Skript den Befehl &amp;quot;&#039;&#039;&#039;fw_defaultconf&#039;&#039;&#039;&amp;quot;. Mit diesem Befehl kannst du globale Stileinstellungen für &#039;&#039;&#039;alle Boxen&#039;&#039;&#039;, &#039;&#039;&#039;alle Root-Boxen&#039;&#039;&#039; (d.h. alle &amp;quot;Basis&amp;quot;-Boxen der Display-Sets) und &#039;&#039;&#039;alle Nicht-Root-Boxen&#039;&#039;&#039; vornehmen.&lt;br /&gt;
&lt;br /&gt;
Momentan existieren drei Varianten dieses Befehls um die oben genannten Voreinstellungen vorzunehmen. Hier einige Beispiele für die Verwendung (beachte die verschiedenen Argumente des &amp;quot;fw_defaultconf:...&amp;quot;-Befehls):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Setzt die Voreinstellung für alle Boxen auf rot, zentriert.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Setzt die Voreinstellung für alle ROOT-Boxen auf grün, kein Wrapping.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=green; w=none&amp;quot;, &amp;quot;fw_defaultconf : root&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Setzt die Voreinstellung für alle NICHT-ROOT-Boxen auf &amp;quot;kein Trimming&amp;quot;.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;t=off&amp;quot;,           &amp;quot;fw_defaultconf : nonroot&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stilangaben im Text (Inline Styles) ===&lt;br /&gt;
&lt;br /&gt;
Bisher haben wir Stileinstellungen global und pro Box vorgenommen. FURWARE text unterstützt eine weitere Stufe dieser Einstellungen: Stileinstellungen, die &#039;&#039;&#039;direkt im Text&#039;&#039;&#039; vorgenommen werden. Dies Erlaubt ein Überschreiben der aktuellen Einstellungen für einzelne Textpassagen, beispielsweise um einzelne Wörter hervorzuheben oder einzelne Zeilen auszurichten.&lt;br /&gt;
&lt;br /&gt;
So eine Einstellung wird von &amp;quot;&#039;&#039;&#039;&amp;lt;!&#039;&#039;&#039;&amp;quot; eingeleitet (beachte das Ausrufezeichen) und von &amp;quot;&#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&amp;quot; beendet. Innerhalb dieser Begrenzer kannst du Angaben über den Textstil machen. Machen wir beispielsweise den Text unseres Dialogs zentriert, weisen einem Wort eine zufällige Farbe zu und ändern die Schriftart teilweise:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;lt;!a=center&amp;gt;Some &amp;lt;!c=rand; f=5054fec3-1465-af8f-2fe5-e9507795c82a&amp;gt;fancy&amp;lt;!c=def&amp;gt; dialog&amp;quot;, &amp;quot;fw_data : Dialog&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis sieht dann in etwa so aus (die Farbe ist natürlich bei jeder Aktualisierung zufällig):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_inline_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schau&#039; dir den Code genau an: Wir haben die spezielle Einstellung &amp;quot;&#039;&#039;&#039;c=def&#039;&#039;&#039;&amp;quot; verwendet um die &#039;&#039;&#039;normale Farbe&#039;&#039;&#039; der Box nach dem Wort &amp;quot;fancy&amp;quot; wiederherzustellen, allerdings haben wir &#039;&#039;&#039;die Schriftart nicht zurückgesetzt&#039;&#039;&#039;. Das bedeutet, dass die Schriftart für den Rest des Texts geändert bleibt. Du kannst den speziellen Wert &amp;quot;&#039;&#039;&#039;def&#039;&#039;&#039;&amp;quot; für alle Einstellungen (Farbe, Schriftart, Ausrichtung, etc.) verwenden um die Standardeinstellung der Box wiederherzustellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Du kannst Stilvorlagen auch direkt im Text mittels dem &amp;quot;style&amp;quot;-Befehl verwenden.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Die &amp;quot;border&amp;quot;-Einstellung im Fließtext zu verwenden hat keinen Effekt.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Ausrichtung, Trimmen und Umbruch dürfen nur direkt &#039;&#039;&#039;am Anfang einer neuen Zeile&#039;&#039;&#039; (d.h. auch direkt nach jedem &amp;quot;\n&amp;quot;) verwendet werden und haben dann Auswirkung auf diese und folgende Zeilen.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Inline Styles selektiv deaktivieren ====&lt;br /&gt;
&lt;br /&gt;
Unter Umständen möchtest du Stilangaben im Text für bestimmte Teile deines Displays deaktivieren, beispielsweise bei der Darstellung von Benutzereingaben wo ein &amp;quot;&amp;lt;!&amp;quot; nicht als der Anfang von Stilangaben interpretiert werden soll.&lt;br /&gt;
&lt;br /&gt;
Kurioserweise ist der Befehl dafür selbst eine Stileinstellung, nämlich &amp;quot;&#039;&#039;&#039;tags=off&#039;&#039;&#039;&amp;quot;. Nachdem diese Angabe verarbeitet wurde werden keine weiteren &amp;quot;&amp;lt;!&amp;quot; mehr interpretiert. Beispielsweise deaktiviert der folgende Befehl Stilangaben im Text unseres &amp;quot;Dialogs&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;border=tblr; tags=off&amp;quot;, &amp;quot;fw_conf : Dialog&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Du kannst diese Einstellung sogar &amp;quot;inline&amp;quot; verwenden, aber nur am Anfang von Zeilen (genauso wie bei Ausrichtung usw.). Dann werden Angaben für den Rest der Zeile und &#039;&#039;&#039;alle&#039;&#039;&#039; weiteren Zeilen ignoriert (es gibt dann ja keine Möglichkeit mehr, die Stilangaben innerhalb der Zeile wieder zu aktivieren).&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Tutorial&amp;diff=1196074</id>
		<title>FURWARE text/Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Tutorial&amp;diff=1196074"/>
		<updated>2015-04-08T08:37:25Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Fixed syntax highlighting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== First steps ==&lt;br /&gt;
&lt;br /&gt;
=== Creating displays ===&lt;br /&gt;
&lt;br /&gt;
You may (and should) use the included &amp;quot;&#039;&#039;&#039;FURWARE display creator&#039;&#039;&#039;&amp;quot; to have a perfectly aligned grid of display prims automatically created for you. Every prim will be automatically assigned a special object name that is used internally by the text script so that it knows how to order them correctly, independently of the link order.&lt;br /&gt;
&lt;br /&gt;
Creating a display is simple:&lt;br /&gt;
&lt;br /&gt;
* Rez the display creator on a parcel where you have sufficient permissions.&lt;br /&gt;
* Touch the creator object. A dialog appears where you can set some parameters of the new display:&lt;br /&gt;
** A &#039;&#039;&#039;name&#039;&#039;&#039; for the display. You will use this name to identify which display you wish to manipulate when using multiple displays within one linkset.&lt;br /&gt;
** The number of &#039;&#039;&#039;rows and columns&#039;&#039;&#039; of the display (the columns are counted in prims here, not in characters).&lt;br /&gt;
** The number of &#039;&#039;&#039;faces per prim&#039;&#039;&#039;. There are mesh prims from 1 to 8 faces available. Generally speaking, using more faces per prim is more efficient.&lt;br /&gt;
* When you&#039;re happy with the settings, click &amp;quot;Create&amp;quot; to start rezzing the prims. Link them to your creation as appropriate.&lt;br /&gt;
&lt;br /&gt;
=== Setup and initialization ===&lt;br /&gt;
&lt;br /&gt;
When you have created your display(s) and linked them together in your creation, simply put &#039;&#039;&#039;a single copy&#039;&#039;&#039; of the FURWARE text script into the linkset. Only a single copy of the text script is required for handling multiple display sets within a linkset. The script does &#039;&#039;&#039;not&#039;&#039;&#039; have to be in the root prim.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important hint:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You may wish to send some initial commands to the text script as soon as its initialization is done. A reset of the text script may happen in a number of cases:&lt;br /&gt;
&lt;br /&gt;
* The script was just put into the object.&lt;br /&gt;
* The object in which the script resides was shift-copied.&lt;br /&gt;
* The linkset has changed (then the script needs to search for display prims again).&lt;br /&gt;
* The script was reset manually (for instance using the &amp;quot;fw_reset&amp;quot; command).&lt;br /&gt;
&lt;br /&gt;
In order to know when exactly the script is ready to take commands, it sends a link message to the whole set with the &amp;quot;id&amp;quot; parameter set to &amp;quot;fw_ready&amp;quot;. It is &#039;&#039;&#039;good practice&#039;&#039;&#039; to watch for these messages and send your initialization commands when receiving this message. Your code could look something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_ready&amp;quot;) {&lt;br /&gt;
        llOwnerSay(&amp;quot;FW text is up and running!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Start sending some initialization stuff.&lt;br /&gt;
        llMessageLinked(sender, 0, &amp;quot;c=red&amp;quot;,        &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
        llMessageLinked(sender, 0, &amp;quot;Default text&amp;quot;, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tutorial ==&lt;br /&gt;
&lt;br /&gt;
=== Preparations ===&lt;br /&gt;
&lt;br /&gt;
Let&#039;s first prepare a small framework that you can use to try out the examples in this tutorial. It may be convenient to reset the FURWARE text script each time you make changes to the controller script to start with a freshly initialized script so that settings made in previous runs won&#039;t interfere. You can use the following snippet as a starting point:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Reset the FURWARE text script.&lt;br /&gt;
        llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
        // The text script sends &amp;quot;fw_ready&amp;quot; when it has initialized itself.&lt;br /&gt;
        if (id == &amp;quot;fw_ready&amp;quot;) {&lt;br /&gt;
            // Here you can try out your commands.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|For the sake of simplicity, all commands shown in this tutorial will be sent to LINK_SET. You can of course use more specific/optimized receivers in your own objects.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|It is usually &#039;&#039;&#039;not&#039;&#039;&#039; considered good practice to reset the script each time you wish to change something. Once you get more familiar with the concepts of FURWARE text you will see that you can do almost anything without ever having to fully reset the script. It is just more convenient for your first experiments.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Single display set ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let&#039;s first consider the simplest case. As a concrete example, let&#039;s assume that we have created a display consisting of 3 by 4 prims, each of them having 8 faces. Here&#039;s a schematic representation of our display:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_single_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We first take look at the two most important commands of FURWARE text, namely &amp;quot;fw_data&amp;quot; for setting text and &amp;quot;fw_conf&amp;quot; to control style preferences (text color, alignment, font, etc.). Setting the text is done like so:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;This is some example text&amp;quot;, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This will yield:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_single_example_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, setting the text &#039;&#039;&#039;color&#039;&#039;&#039; to blue and the &#039;&#039;&#039;alignment&#039;&#039;&#039; to centered is done using the following call:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=blue; a=center&amp;quot;, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Combined with the previous &amp;quot;fw_data&amp;quot; call, the display now looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_single_example_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|You do not have to send both style and text data each time you wish to change one or the other. When setting the style, the currently set text is re-used and rendered with the new style. Likewise, when setting text, the currently set style will be used.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Multiple display sets ===&lt;br /&gt;
&lt;br /&gt;
A single FURWARE text script can handle multiple display sets within a linkset. Let&#039;s consider the following example consisting of three sets named &amp;quot;Alpha&amp;quot;, &amp;quot;Beta&amp;quot; and &amp;quot;Gamma&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_multi_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|The sets do not have to use the same prim type (i.e. number of faces per prim) but &#039;&#039;&#039;within&#039;&#039;&#039; a particular set, the prim type and the number of columns in each row need to be the same.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If we use the same two lines of code for setting the text and style as in the single-set case, &#039;&#039;&#039;all sets&#039;&#039;&#039; will use the &#039;&#039;&#039;same&#039;&#039;&#039; settings. So using the code&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;This is some example text&amp;quot;, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=blue; a=center&amp;quot;, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
will yield&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_multi_example_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now the question arises how to set text and styles for the &#039;&#039;&#039;individual&#039;&#039;&#039; sets independently. This is where the &#039;&#039;&#039;names&#039;&#039;&#039; of the display sets that we have specified when we created the displays come into play. The last parameter of the llMessageLinked()-call needs to be modified. For instance, for setting the text and style of the set &amp;quot;Beta&amp;quot;, instead of writing &amp;quot;fw_data&amp;quot; and &amp;quot;fw_conf&amp;quot; we specify the set name by writing &amp;quot;&#039;&#039;&#039;fw_data : Beta&#039;&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;&#039;fw_conf : Beta&#039;&#039;&#039;&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Only for set Beta&amp;quot;, &amp;quot;fw_data : Beta&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Beta&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Again combining these lines with the previous code, this will yield:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_multi_example_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Virtual text boxes ===&lt;br /&gt;
&lt;br /&gt;
In addition to using multiple sets, we can also define multiple virtual &#039;&#039;&#039;text boxes&#039;&#039;&#039; within a display set. This can be used to easily position text on a display, for example for displaying &#039;&#039;&#039;tables&#039;&#039;&#039;, &#039;&#039;&#039;dialog boxes&#039;&#039;&#039; and much more.&lt;br /&gt;
&lt;br /&gt;
In the following example we have two sets called &amp;quot;Dialog&amp;quot; and &amp;quot;Table&amp;quot;. Let&#039;s assume that we wish to use the set &amp;quot;Dialog&amp;quot; as a simple dialog with two buttons and the set &amp;quot;Table&amp;quot; as a small table having three rows, three columns and an additional column that will be used for &amp;quot;up&amp;quot; and &amp;quot;down&amp;quot; buttons.&lt;br /&gt;
&lt;br /&gt;
The small overlap between the column boxes will be useful later when adding borders to our boxes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_boxes_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The first task is to &#039;&#039;&#039;add&#039;&#039;&#039; the text boxes to the sets. This is done using the &amp;quot;fw_addbox&amp;quot; command. The syntax of the command is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;fw_addbox : boxName : parentName : dx, dy, sx, sy : stylePrefs&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The meaning of the individual parameters is as follows:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;boxName&#039;&#039;&#039;: A user-specified name for the new box. Must be &#039;&#039;&#039;unique&#039;&#039;&#039; among all box and set names.&lt;br /&gt;
* &#039;&#039;&#039;parentName&#039;&#039;&#039;: The name of the &#039;&#039;&#039;set or box&#039;&#039;&#039; that the new box should be aligned relatively to.&lt;br /&gt;
* &#039;&#039;&#039;dx, dy, sx, sy&#039;&#039;&#039;: Four integers specifying the &#039;&#039;&#039;position&#039;&#039;&#039; relative to the parent set or box (dx, dy) and the &#039;&#039;&#039;size&#039;&#039;&#039; of the box (sx, sy).&lt;br /&gt;
* &#039;&#039;&#039;stylePrefs&#039;&#039;&#039;: A style string (for example &amp;quot;c=red; a=center&amp;quot;) that the box should use as its default; may be omitted.&lt;br /&gt;
&lt;br /&gt;
Let us write down the code for adding the boxes in our example. We will first make it rather &#039;&#039;&#039;verbose&#039;&#039;&#039; and take a look at a shorter version later.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Add the boxes.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : ButtonOK     : Dialog :  1, 2, 10, 1&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : Column0 : Table   : 0, 1, 8, 3&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : Column1 : Column0 : 7, 0, 8, 3&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : Column2 : Column1 : 7, 0, 8, 3&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_addbox : UpDown  : Column2 : 9, 0, 1, 3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Set the boxes&#039; style.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;a=center&amp;quot;, &amp;quot;fw_conf : ButtonOK&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;a=center&amp;quot;, &amp;quot;fw_conf : ButtonCancel&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;w=none&amp;quot;, &amp;quot;fw_conf : Column0&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;w=none&amp;quot;, &amp;quot;fw_conf : Column1&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;w=none&amp;quot;, &amp;quot;fw_conf : Column2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Set some text for the boxes.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some dialog&amp;quot;, &amp;quot;fw_data : Dialog&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;OK&amp;quot;,          &amp;quot;fw_data : ButtonOK&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Cancel&amp;quot;,      &amp;quot;fw_data : ButtonCancel&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;One\nTwo\nThree&amp;quot;, &amp;quot;fw_data : Column0&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;123\n456\n789&amp;quot;,   &amp;quot;fw_data : Column1&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;1.2\n2.3\n3.4&amp;quot;,   &amp;quot;fw_data : Column2&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;▲\n\n▼&amp;quot;,          &amp;quot;fw_data : UpDown&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This will yield a constellation as depicted below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_boxes_example_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Please take a moment to understand all parts of the commands.&lt;br /&gt;
&lt;br /&gt;
The first two boxes were added to the parent &amp;quot;Dialog&amp;quot; which is the name of the left set, hence the &amp;quot;Dialog&amp;quot; as the third parameter to &amp;quot;fw_addbox&amp;quot;. You may also specify the name of &#039;&#039;&#039;another box&#039;&#039;&#039; as the parent, then the coordinates of the new box will be &#039;&#039;&#039;relative&#039;&#039;&#039; to the upper-left corner of that (already added) box. For instance, for box &amp;quot;Column1&amp;quot; we have used &amp;quot;Column0&amp;quot; as the parent box and then specified the coordinates relative to the upper-left corner of that box. The same was done for the boxes &amp;quot;Column2&amp;quot; and &amp;quot;UpDown&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
After the boxes have been created, we have set some style preferences for them. For instance, we have set the &#039;&#039;&#039;alignment&#039;&#039;&#039; of the dialog buttons to center (&amp;quot;a=center&amp;quot;) and &#039;&#039;&#039;disabled wrapping&#039;&#039;&#039; (&amp;quot;w=none&amp;quot;) for the table&#039;s columns so that even overlong lines will always stay within one row of our table.&lt;br /&gt;
&lt;br /&gt;
Lastly, we have set some text for each of the boxes.&lt;br /&gt;
&lt;br /&gt;
==== A more concise version ====&lt;br /&gt;
&lt;br /&gt;
As mentioned before, we can write the above example in a more concise way by directly specifying style and text data &#039;&#039;&#039;when creating the boxes&#039;&#039;&#039;. The following code results in the same constellation as in the last example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;OK&amp;quot;,     &amp;quot;fw_addbox : ButtonOK     : Dialog :  1, 2, 10, 1 : a=center&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Cancel&amp;quot;, &amp;quot;fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1 : a=center&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;One\nTwo\nThree&amp;quot;, &amp;quot;fw_addbox : Column0 : Table   : 0, 1, 8, 3 : w=none&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;123\n456\n789&amp;quot;,   &amp;quot;fw_addbox : Column1 : Column0 : 7, 0, 8, 3 : w=none&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;1.2\n2.3\n3.4&amp;quot;,   &amp;quot;fw_addbox : Column2 : Column1 : 7, 0, 8, 3 : w=none&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;▲\n\n▼&amp;quot;,          &amp;quot;fw_addbox : UpDown  : Column2 : 9, 0, 1, 3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some dialog&amp;quot;, &amp;quot;fw_data : Dialog&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Box borders ====&lt;br /&gt;
&lt;br /&gt;
FURWARE text offers a special style option that comes in especially handy when dealing with boxes: The &#039;&#039;&#039;border&#039;&#039;&#039; style option. Because an example probably says more than words here, consider the following modification of the previous example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;OK&amp;quot;,     &amp;quot;fw_addbox : ButtonOK     : Dialog :  1, 2, 10, 1 : a=center; border=lr&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Cancel&amp;quot;, &amp;quot;fw_addbox : ButtonCancel : Dialog : 13, 2, 10, 1 : a=center; border=lr&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;One\nTwo\nThree&amp;quot;, &amp;quot;fw_addbox : Column0 : Table   : 0, 1, 8, 3 : w=none; border=lr&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;123\n456\n789&amp;quot;,   &amp;quot;fw_addbox : Column1 : Column0 : 7, 0, 8, 3 : w=none; border=lr&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;1.2\n2.3\n3.4&amp;quot;,   &amp;quot;fw_addbox : Column2 : Column1 : 7, 0, 8, 3 : w=none; border=lr&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;▲\n\n▼&amp;quot;,          &amp;quot;fw_addbox : UpDown  : Column2 : 9, 0, 1, 3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some dialog&amp;quot;, &amp;quot;fw_data : Dialog&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;border=lrtb&amp;quot;, &amp;quot;fw_conf : Dialog&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the following picture, the separating lines between the prims and faces were omitted so you can get a better view on the borders introduced by the above commands. Note how FURWARE text automatically adjusts the text positions according to the borders.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_boxes_example_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;border&amp;quot; style setting takes &#039;&#039;&#039;any (meaningful) combination&#039;&#039;&#039; of the letters &#039;&#039;&#039;tblrTBLR12&#039;&#039;&#039; (order does not matter). The lowercase letters t, b, l, r introduce borders at the top, bottom, left or right side. The uppercase letters T, B, L, R additionally introduce special characters at the corners of boxes to connect them with other boxes (see also the next picture). The numbers &amp;quot;1&amp;quot; or &amp;quot;2&amp;quot; yield different border styles. Here are a few examples:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_boxes_example_3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now it should become clear why the previously mentioned overlap of the table&#039;s columns is useful: This way we could simply set the borders of &#039;&#039;&#039;all&#039;&#039;&#039; table columns to left and right without having to distinguish between them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|The additional space that is needed to draw the borders must be manually added to the respective box sizes.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Deleting boxes ====&lt;br /&gt;
&lt;br /&gt;
Deleting boxes is done using the &amp;quot;fw_delbox&amp;quot; command followed by the box&#039;s name. For instance, the following code would remove the dialog&#039;s buttons:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox : ButtonOK&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox : ButtonCancel&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can also delete multiple boxes at once. The following code yields the same result:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox : ButtonOK : ButtonCancel&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|You cannot delete the &amp;quot;root&amp;quot; boxes of the display sets (&amp;quot;Dialog&amp;quot; and &amp;quot;Table&amp;quot; in this example).}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Touch queries ===&lt;br /&gt;
&lt;br /&gt;
The example we used in the last chapter contains parts of the text that the user should be able to touch on the object and get some response, namely the buttons of the &amp;quot;dialog&amp;quot; and the up/down buttons right of our table.&lt;br /&gt;
&lt;br /&gt;
The FURWARE text script can be queried about &#039;&#039;&#039;which box&#039;&#039;&#039; has been touched and at &#039;&#039;&#039;what coordinates&#039;&#039;&#039;, given the prim and face number that has been touched. The script will automatically take into account the correct translation into coordinates relative to the box, the correct ordering and any overlap between boxes.&lt;br /&gt;
&lt;br /&gt;
==== Performing a query ====&lt;br /&gt;
&lt;br /&gt;
Let&#039;s take a look at the touch_start()-handler in our script and how it can send a &amp;quot;fw_touchquery&amp;quot; to the FURWARE text script:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
touch_start(integer numDetected) {&lt;br /&gt;
    string link = (string)llDetectedLinkNumber(0);&lt;br /&gt;
    string face = (string)llDetectedTouchFace(0);&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;Some user data&amp;quot;, &amp;quot;fw_touchquery:&amp;quot; + link + &amp;quot;:&amp;quot; + face);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As you can see, the last parameter of llMessageLinked() contains the &amp;quot;fw_touchquery&amp;quot; command, the touched link number and face number, all separated by &amp;quot;:&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In addition, you may pass an &#039;&#039;&#039;arbitrary string&#039;&#039;&#039; as the third parameter to llMessageLinked(); &amp;quot;Some user data&amp;quot; in this example. This data will be sent back unmodified in the response message. This way you can associate queries with respones.&lt;br /&gt;
&lt;br /&gt;
==== Parsing the reply ====&lt;br /&gt;
&lt;br /&gt;
The FURWARE text script will &#039;&#039;&#039;always&#039;&#039;&#039; reply to such a query, even if something went wrong and it could not make sense of the parameters given in the query (for instance when a prim was touched that is not a display prim).&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;id&amp;quot; parameter of the &amp;quot;link_message()&amp;quot; handler always contains the string &amp;quot;fw_touchreply&amp;quot; so you can quickly distinguish the reply messages from other link messages.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;str&amp;quot; parameter contains &amp;quot;:&amp;quot;-separated data about the result of the query in the form&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;boxName:dx:dy:rootName:x:y:userData&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;boxName&#039;&#039;&#039; is the name of the box that has been touched.&lt;br /&gt;
* &#039;&#039;&#039;dx&#039;&#039;&#039; is the column (in characters) of the touch relative to the box&#039;s left side.&lt;br /&gt;
* &#039;&#039;&#039;dy&#039;&#039;&#039; is the row of the touch relative to the box&#039;s top side.&lt;br /&gt;
* &#039;&#039;&#039;rootName&#039;&#039;&#039; is the name of the base box of the display set in which the box resides.&lt;br /&gt;
* &#039;&#039;&#039;x&#039;&#039;&#039; is the column (in characters) of the touch relative to the display set&#039;s left side.&lt;br /&gt;
* &#039;&#039;&#039;y&#039;&#039;&#039; is the row of the touch relative to the display set&#039;s top side.&lt;br /&gt;
* &#039;&#039;&#039;userData&#039;&#039;&#039; is the string that has been passed as third parameter of &amp;quot;llMessageLinked()&amp;quot; in the touch query.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|All fields except for &amp;quot;userData&amp;quot; will be empty if the touch query was invalid (e.g. a prim was touched that is not part of a display).}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is an example how we could parse a reply in our example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
        list     tokens    = llParseStringKeepNulls(str, [&amp;quot;:&amp;quot;], []);&lt;br /&gt;
        string   boxName   = llList2String(tokens, 0);&lt;br /&gt;
        integer  dx        = llList2Integer(tokens, 1);&lt;br /&gt;
        integer  dy        = llList2Integer(tokens, 2);&lt;br /&gt;
        string   rootName  = llList2String(tokens, 3);&lt;br /&gt;
        integer  x         = llList2Integer(tokens, 4);&lt;br /&gt;
        integer  y         = llList2Integer(tokens, 5);&lt;br /&gt;
        string   userData  = llList2String(tokens, 6);&lt;br /&gt;
&lt;br /&gt;
        if (boxName == &amp;quot;ButtonOK&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;OK button was clicked.&amp;quot;);&lt;br /&gt;
        } else if (boxName == &amp;quot;ButtonCancel&amp;quot;) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Cancel button was clicked.&amp;quot;);&lt;br /&gt;
        } else if (boxName == &amp;quot;UpDown&amp;quot;) {&lt;br /&gt;
            // We use the Y coordinate to determine whether &amp;quot;up&amp;quot; or &amp;quot;down&amp;quot; was touched.&lt;br /&gt;
            if (dy == 0) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Up button was clicked.&amp;quot;);&lt;br /&gt;
            } else if (dy == 2) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Down button was clicked.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Style templates ===&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say we wish to make the buttons of our dialog a bit more fancy. For instance, we might wish to give them another font and color (in addition to their left and right borders and the centered alignment). We &#039;&#039;&#039;could&#039;&#039;&#039; of course write something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a&amp;quot;, &amp;quot;fw_conf : ButtonOK&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a&amp;quot;, &amp;quot;fw_conf : ButtonCancel&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Although it might not be that bad in this small example, it seems to be a little redundant. If you have more boxes or text passages with styles that you wish to share among boxes, using &#039;&#039;&#039;templates&#039;&#039;&#039; is probably more efficient.&lt;br /&gt;
&lt;br /&gt;
FURWARE text allows you to store string &amp;quot;variables&amp;quot; that you can assign a name. Currently, these variables are only used for style templates. Let&#039;s put the above shared style commands into such a variable using the &amp;quot;fw_var&amp;quot; command and give it the name &amp;quot;button&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;border=lr; a=center; c=darkgreen; f=5054fec3-1465-af8f-2fe5-e9507795c82a&amp;quot;, &amp;quot;fw_var : button&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We may now use this variable in style specifications using the &#039;&#039;&#039;style=...&#039;&#039;&#039; syntax. Let&#039;s rewrite the two &amp;quot;fw_conf&amp;quot; lines from before:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;style=button&amp;quot;, &amp;quot;fw_conf : ButtonOK&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;style=button&amp;quot;, &amp;quot;fw_conf : ButtonCancel&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Our dialog then looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_tmpl_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may even mix templates with other style settings (even other templates). For instance, we might want to make the &amp;quot;Cancel&amp;quot; button dark red but keep the other style attributes of the &amp;quot;button&amp;quot; template:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;style=button; c=darkred&amp;quot;, &amp;quot;fw_conf : ButtonCancel&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|You can also use &amp;quot;fw_var&amp;quot; to &#039;&#039;&#039;change&#039;&#039;&#039; the contents of an existing variable. Passing the empty string as the variable&#039;s contents &#039;&#039;&#039;deletes&#039;&#039;&#039; the variable. Note that changing an existing variable will trigger a &#039;&#039;&#039;complete refresh&#039;&#039;&#039; of the display because it doesn&#039;t know where the variables might be currently in use.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Style templates allow recursion (i.e. calling a style template from within another style template). The text script does &#039;&#039;&#039;not&#039;&#039;&#039; check for infinite recursion!}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuring multiple boxes at once ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you may wish to set the same style or text data for multiple boxes at once. As an example, let us consider the following &amp;quot;game board&amp;quot; that has 9 separate boxes for the &amp;quot;X&amp;quot; and &amp;quot;O&amp;quot; cells:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_range_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now let&#039;s say that we wish to highlight the middle row like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_range_example_1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To achieve this, we &#039;&#039;&#039;could&#039;&#039;&#039; of course write:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Cell3&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Cell4&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Cell5&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But this obviously requires three link messages. FURWARE text offers a special syntax that can be used for the &amp;quot;fw_data&amp;quot; and &amp;quot;fw_conf&amp;quot; commands to set text or style data for multiple boxes &#039;&#039;&#039;at once&#039;&#039;&#039;. One possibilty for our example is to specify the names of all boxes that should be configured like so:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Cell3 : Cell4 : Cell5&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If we assume that the boxes were added to the display in the order &amp;quot;Cell0&amp;quot;, &amp;quot;Cell1&amp;quot;, and so on, we can shorten the code even more. We may specify &#039;&#039;&#039;intervals&#039;&#039;&#039; of boxes that we wish to set using the following syntax (note the semicolon (&amp;quot;;&amp;quot;) between the box names!):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red&amp;quot;, &amp;quot;fw_conf : Cell3 ; Cell5&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say that we wish to &amp;quot;reset&amp;quot; the game so that all fields to show the &amp;quot;?&amp;quot; symbol like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_range_example_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To achieve this, we need to reset the color and the text for all fields. We can use the interval notation for both &amp;quot;fw_conf&amp;quot; and &amp;quot;fw_data&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;,  &amp;quot;fw_conf : Cell0 ; Cell8&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;?&amp;quot;, &amp;quot;fw_data : Cell0 ; Cell8&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this concrete example we can even omit one end of the interval: Because &amp;quot;Cell8&amp;quot; is the last box in the display set, we may omit its name and write:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;,  &amp;quot;fw_conf : Cell0 ;&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;?&amp;quot;, &amp;quot;fw_data : Cell0 ;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This means &amp;quot;apply to Cell0 &#039;&#039;&#039;and all following boxes&#039;&#039;&#039; in the same display set&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
It is even possible to mix interval- and single-box-notation. Consider the following code (the additional whitespace is just inserted for clarity, you may of course omit it):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;!&amp;quot;, &amp;quot;fw_data :   Cell1;Cell3   :   Cell5   :   Cell7;   &amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Applied to the above example board, this yields:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_range_example_3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Please see the reference for a complete overview of all possible parameter notations.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Global style settings ===&lt;br /&gt;
&lt;br /&gt;
Some of the style settings of your board may have a &amp;quot;global&amp;quot; nature. For instance, you might wish to always use a certain font for &#039;&#039;&#039;all&#039;&#039;&#039; boxes and be able to change that setting quickly.&lt;br /&gt;
&lt;br /&gt;
Using the style templates from the last section, we already have a way to give multiple boxes a style that we can later on change centrally (by changing the respective variable using &amp;quot;fw_var&amp;quot;). The &#039;&#039;&#039;drawback&#039;&#039;&#039; of this method is that we still need to specify the &amp;quot;style=...&amp;quot; for each box separately and remember to include it again when changing some other style settings specific to a box using &amp;quot;fw_conf&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
For such cases, the script offers the &amp;quot;&#039;&#039;&#039;fw_defaultconf&#039;&#039;&#039;&amp;quot; command. Using this command, you may set global defaults for &#039;&#039;&#039;all boxes&#039;&#039;&#039;, &#039;&#039;&#039;all root boxes&#039;&#039;&#039; (i.e. the &amp;quot;base&amp;quot; boxes of each display set) and &#039;&#039;&#039;all non-root boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
There currently are three variants of the command that can be sent for setting the defaults as mentioned above. Here are examples showing their usage (note the different arguments for &amp;quot;fw_defaultconf:...&amp;quot; command):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Sets the default style for all boxes to red, centered.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Sets the default style for all ROOT boxes to green, no wrapping.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=green; w=none&amp;quot;, &amp;quot;fw_defaultconf : root&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Sets the default style for all NON-ROOT boxes to &amp;quot;no trimming&amp;quot;.&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;t=off&amp;quot;,           &amp;quot;fw_defaultconf : nonroot&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Inline styles ===&lt;br /&gt;
&lt;br /&gt;
By now we have used global and per-box style configuration. FURWARE text supports yet another level which is the most fine-grained: Style commands that are placed &#039;&#039;&#039;directly within&#039;&#039;&#039; the text. This allows you to override parts of the current style settings for only parts of your text, for instance to highlight words or align individual lines of text differently.&lt;br /&gt;
&lt;br /&gt;
Such a style command is started by &amp;quot;&amp;lt;!&amp;quot; (note the exclamation mark) and ended by &amp;quot;&amp;gt;&amp;quot;. In between those tags, you may specify style commands. As an example, let&#039;s make the heading text of our dialog centered, one word within the text randomly colored and make it use a different font:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;lt;!a=center&amp;gt;Some &amp;lt;!c=rand; f=5054fec3-1465-af8f-2fe5-e9507795c82a&amp;gt;fancy&amp;lt;!c=def&amp;gt; dialog&amp;quot;, &amp;quot;fw_data : Dialog&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The result may look something like this (of course, here the color is random each time the dialog is rendered):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_inline_example_0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Take a close look at the result and at the code: We have used a special setting &amp;quot;&#039;&#039;&#039;c=def&#039;&#039;&#039;&amp;quot; to &#039;&#039;&#039;restore the normal color&#039;&#039;&#039; of the text after the word &amp;quot;fancy&amp;quot; but &#039;&#039;&#039;we have not reset the font&#039;&#039;&#039; and thus it will stay active for the rest of the text. You may use the special setting &amp;quot;&#039;&#039;&#039;def&#039;&#039;&#039;&amp;quot; for any setting (color, font, alignment, etc.) to restore the box&#039;s default.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|You may also use style templates using the inline formatting command &amp;quot;style&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Using &amp;quot;border&amp;quot; settings as an inline style does not have any effect.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Alignment, trimming or wrapping settings may only be used immediately at the beginning of a new line (also immediately after each &amp;quot;\n&amp;quot;) and will then affect that line and following lines.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Selectively disabling inline styles ====&lt;br /&gt;
&lt;br /&gt;
You might want to disable inline styles for parts of your display, for instance when displaying user input where you do not want the &amp;quot;&amp;lt;!&amp;quot; to be interpreted as the start of style data.&lt;br /&gt;
&lt;br /&gt;
Curiously enough, the command for doing this is a style setting itself, namely &amp;quot;&#039;&#039;&#039;tags=off&#039;&#039;&#039;&amp;quot;. After it has been parsed, further &amp;quot;&amp;lt;!&amp;quot; tags will be ignored. As an example, the following command disables inline styles for the contents of our &amp;quot;Dialog&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;border=tblr; tags=off&amp;quot;, &amp;quot;fw_conf : Dialog&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can even use this setting in an inline fashion, but only at the beginning of new lines (similar to alignment, etc.). Then this line and &#039;&#039;&#039;all&#039;&#039;&#039; following lines will ignore inline styles (indeed there is no way to enable them again using an inline command).&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template_talk:KBtip&amp;diff=1196073</id>
		<title>Template talk:KBtip</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template_talk:KBtip&amp;diff=1196073"/>
		<updated>2015-04-08T08:36:13Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Created page with &amp;quot;Seems like the icons of the box templates are not showing anymore - bug? ~~~~&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seems like the icons of the box templates are not showing anymore - bug? [[User:Ochi Wolfe|Ochi Wolfe]] ([[User talk:Ochi Wolfe|talk]]) 01:36, 8 April 2015 (PDT)&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:Syntax_Highlighting_Examples&amp;diff=1196072</id>
		<title>Talk:Syntax Highlighting Examples</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:Syntax_Highlighting_Examples&amp;diff=1196072"/>
		<updated>2015-04-08T08:28:32Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Created page with &amp;quot;It seems like this extension is no longer working correctly (most languages are not being formatted correctly anymore). Is it officially deprecated or is this a bug? ~~~~&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It seems like this extension is no longer working correctly (most languages are not being formatted correctly anymore). Is it officially deprecated or is this a bug? [[User:Ochi Wolfe|Ochi Wolfe]] ([[User talk:Ochi Wolfe|talk]]) 01:28, 8 April 2015 (PDT)&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Reference&amp;diff=1181408</id>
		<title>FURWARE text/TextureCreator/Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Reference&amp;diff=1181408"/>
		<updated>2013-09-06T21:46:09Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Updated loadFont description to match git master&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
== Chain/script commands ==&lt;br /&gt;
&lt;br /&gt;
The following commands may be used in &amp;quot;chain&amp;quot; and &amp;quot;script&amp;quot; files.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;runScript&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;scriptName&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Executes commands from another script file (usually with the extension &amp;quot;.script&amp;quot;; file name only, &#039;&#039;&#039;not&#039;&#039;&#039; a full path; note that &#039;&#039;&amp;lt;code&amp;gt;scriptName&amp;lt;/code&amp;gt;&#039;&#039; must include the file name extension). The given script file ist first searched for in the folder of the font that is currently being processed and, if not found, in the global &amp;quot;scripts&amp;quot; directory. After successful execution of the commands in the other script, execution continues where runScript was called.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;sizeX sizeY scaleX scaleY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Initializes a new texture to draw to. This command should generally be one of the first things to call, except for &amp;quot;runScript&amp;quot; commands. The &#039;&#039;&amp;lt;code&amp;gt;sizeX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;sizeY&amp;lt;/code&amp;gt;&#039;&#039; values set the size of the drawing area in pixels. However, this only equals the size of the resulting texture if &#039;&#039;&amp;lt;code&amp;gt;scaleX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;scaleY&amp;lt;/code&amp;gt;&#039;&#039; is set to &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;. The scale parameters may be used to create larger or smaller versions of a texture without having to tweak any positioning of characters, etc. because everything will be scaled relative to these values.&lt;br /&gt;
&lt;br /&gt;
For instance, the configs that come with the creator are made for 1024x1024 textures. If you set the &#039;&#039;&amp;lt;code&amp;gt;size*&amp;lt;/code&amp;gt;&#039;&#039; values to &amp;lt;code&amp;gt;1024&amp;lt;/code&amp;gt; and the &#039;&#039;&amp;lt;code&amp;gt;scale*&amp;lt;/code&amp;gt;&#039;&#039; values to &amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt;, you will get a 512x512 texture with the same content as the 1024x1024 version, just smaller. In contrast, if you set the &#039;&#039;&amp;lt;code&amp;gt;size*&amp;lt;/code&amp;gt;&#039;&#039; values to &amp;lt;code&amp;gt;512&amp;lt;/code&amp;gt; and keep the &#039;&#039;&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt;&#039;&#039; values set to &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;, you will get a cropped version of the 1024x1024 version, showing only the upper-left quarter of the texture. Note that the scaling is not performed by scaling the final texture but during the drawing, yielding smooth and detailed textures at all scales.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setOutputName&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;outputName&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the name of the texture file to be created. Note that &#039;&#039;&amp;lt;code&amp;gt;outputName&amp;lt;/code&amp;gt;&#039;&#039; should not include the file extension, for instance &amp;lt;code&amp;gt;.tga&amp;lt;/code&amp;gt;. When you do not call &#039;&#039;&#039;&amp;lt;code&amp;gt;setOutputName&amp;lt;/code&amp;gt;&#039;&#039;&#039;, the name of the folder of the font currently being processed is used as the texture name. This command may be used for creating multiple versions of a texture from the same font.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setOutputNameSuffix&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;outputNameSuffix&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Similar to &#039;&#039;&#039;&amp;lt;code&amp;gt;setOutputName&amp;lt;/code&amp;gt;&#039;&#039;&#039;, with the difference that &#039;&#039;&#039;&amp;lt;code&amp;gt;outputNameSuffix&amp;lt;/code&amp;gt;&#039;&#039;&#039; is appended to the currently set output name. This allows you to append suffixes like &amp;lt;code&amp;gt;-512&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-1024&amp;lt;/code&amp;gt; to different versions of textures created from the same font.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellSize&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;sizeX sizeY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the size of one character cell to &#039;&#039;&amp;lt;code&amp;gt;sizeX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;sizeY&amp;lt;/code&amp;gt;&#039;&#039; (in pixels, assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellOffset&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;offsetX offsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the distance of the center of the upper-left cell to the upper-left corner of the texture to &#039;&#039;&amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt;&#039;&#039; (in pixels, assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellSpacing&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;spaceX spaceY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the horizontal and vertical spacing between the centers of two cells to &#039;&#039;&amp;lt;code&amp;gt;spaceX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;spaceY&amp;lt;/code&amp;gt;&#039;&#039; (in pixels, assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellCount&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;numX numY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the number of cells in horizontal and vertical direction. Used for various purposes, especially for determining when to go to the next row when drawing many characters at once.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setBaselineOffset&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;value unit&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the vertical offset of the font&#039;s native baseline from the cell centers. The &#039;&#039;&amp;lt;code&amp;gt;unit&amp;lt;/code&amp;gt;&#039;&#039; parameter determines how &#039;&#039;&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&#039;&#039; is interpreted; see below for possible values of &#039;&#039;&amp;lt;code&amp;gt;unit&amp;lt;/code&amp;gt;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;jumpToCell&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;cellX cellY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the position of the virtual &amp;quot;cursor&amp;quot; in the cell grid to &#039;&#039;&amp;lt;code&amp;gt;cellX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;cellY&amp;lt;/code&amp;gt;&#039;&#039;. The next call of &#039;&#039;&#039;&amp;lt;code&amp;gt;drawChars&amp;lt;/code&amp;gt;&#039;&#039;&#039; will then draw the next character to that cell.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;loadFont&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;fontName&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Loads a font for drawing, also loading the respective &amp;lt;code&amp;gt;font.conf&amp;lt;/code&amp;gt; file, if there is one in the same folder as the font file. &#039;&#039;&amp;lt;code&amp;gt;fontName&amp;lt;/code&amp;gt;&#039;&#039; may be empty to load the font that is currently being processed by the tool. If it is not empty, it must be the name of one of the directories in the &amp;quot;fonts&amp;quot; directory. This command may be used to use symbols from other fonts, for instance when they offer special characters that are not available in the font being processed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawChars&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;listOfChars&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Draws the characters given in &#039;&#039;&amp;lt;code&amp;gt;listOfChars&amp;lt;/code&amp;gt;&#039;&#039; to the current cursor position (see also &#039;&#039;&#039;&amp;lt;code&amp;gt;jumpToCell&amp;lt;/code&amp;gt;&#039;&#039;&#039;). When multiple characters are specified, the virtual cursor will automatically be moved forward and, if necessary, to the next row.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawLineBetweenCells&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;thickness startX startY endX endY startOffsetX startOffsetY endOffsetX endOffsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to draw a line between two cells with the given line &#039;&#039;&amp;lt;code&amp;gt;thickness&amp;lt;/code&amp;gt;&#039;&#039;. The &#039;&#039;&amp;lt;code&amp;gt;startX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;startY&amp;lt;/code&amp;gt;&#039;&#039; and &#039;&#039;&amp;lt;code&amp;gt;endX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;endY&amp;lt;/code&amp;gt;&#039;&#039; values are the coordinates of the start/end cells in the cell grid, starting from &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. The &#039;&#039;&amp;lt;code&amp;gt;*Offset*&amp;lt;/code&amp;gt;&#039;&#039; values are offsets of the line endpoints from the start/end cells&#039; center, in pixels.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawRectBetweenCells&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;thickness startX startY endX endY startOffsetX startOffsetY endOffsetX endOffsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Similar to &#039;&#039;&#039;&amp;lt;code&amp;gt;drawLineBetweenCells&amp;lt;/code&amp;gt;&#039;&#039;&#039;, but draws the outline of a rectangle between two cells instead of a line, with the given stroke thickness. The start coordinates specify the upper-left, the end coordinates for the lower-right corner of the rectangle.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawFilledRectBetweenCells&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;thickness startX startY endX endY startOffsetX startOffsetY endOffsetX endOffsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Similar to &#039;&#039;&#039;&amp;lt;code&amp;gt;drawRectBetweenCells&amp;lt;/code&amp;gt;&#039;&#039;&#039;, but draws a filled rectangle. Note that the &#039;&#039;&amp;lt;code&amp;gt;thickness&amp;lt;/code&amp;gt;&#039;&#039; parameter does not actually have any effect for this command.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;noBuild&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Causes script execution for the current font to be stopped and no texture is created. Used for fonts which are only there for usage from other scripts but for which no complete textures shall be created.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawDebugGrid&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Draws an opaque grid showing the grid layout behind any drawn characters or geometry. Shall be called after the grid has been set up completely using &#039;&#039;&#039;&amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;&#039;&#039;&#039; and the necessary &#039;&#039;&#039;&amp;lt;code&amp;gt;set*&amp;lt;/code&amp;gt;&#039;&#039;&#039; functions, but before drawing any characters, etc.&lt;br /&gt;
&lt;br /&gt;
== Font configuration files ==&lt;br /&gt;
&lt;br /&gt;
The following commands may be used in &amp;lt;code&amp;gt;font.conf&amp;lt;/code&amp;gt; files to tweak per-font and per-character settings.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;offsetX offsetY unitX unitY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the offset of all characters drawn using this font. See below for possible values of &#039;&#039;&amp;lt;code&amp;gt;unitX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;unitY&amp;lt;/code&amp;gt;&#039;&#039; which decides in which unit the &#039;&#039;&amp;lt;code&amp;gt;offset*&amp;lt;/code&amp;gt;&#039;&#039; values are given.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;value unit&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the scaling (text size) for all characters drawn using this font. See below for possible values of &#039;&#039;&amp;lt;code&amp;gt;unit&amp;lt;/code&amp;gt;&#039;&#039; which decides in which unit the &#039;&#039;&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&#039;&#039; argument is given.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;charSettings&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;char offsetX offsetY scaleX scaleY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Set per-character offset and scaling values. The &#039;&#039;&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;&#039;&#039; parameter shall be exactly one character for which the settings are being set. The &#039;&#039;&amp;lt;code&amp;gt;offset*&amp;lt;/code&amp;gt;&#039;&#039; parameters set an offset that should be &#039;&#039;&#039;added&#039;&#039;&#039; to the global offset set using the &#039;&#039;&#039;&amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt;&#039;&#039;&#039; setting when drawing the character &#039;&#039;&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;&#039;&#039;; given in pixels (assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;). The &#039;&#039;&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt;&#039;&#039; parameters are floats where a value of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; means &amp;quot;no scaling&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;enableAutoShrink&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If this line is given in the font config, a heuristic is activated that tries to guess a horizontal down-scaling for characters that would otherwise be too wide to fit in a cell. The idea is to automatically tweak the wider characters of non-monospace fonts (like &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt;) to fit into the grid cells. This is very experimental.&lt;br /&gt;
&lt;br /&gt;
== The &#039;&#039;unit*&#039;&#039; parameters ==&lt;br /&gt;
&lt;br /&gt;
Some functions have &#039;&#039;&amp;lt;code&amp;gt;unit*&amp;lt;/code&amp;gt;&#039;&#039; parameters that specify how the given values (offsets, sizes) shall be interpreted. Each &#039;&#039;&amp;lt;code&amp;gt;unit*&amp;lt;/code&amp;gt;&#039;&#039; parameter may be one of:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cellWidth&amp;lt;/code&amp;gt;: The offset/size value is interpreted relative to the set cell width, so a value of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; means equal to the cell width.&lt;br /&gt;
* &amp;lt;code&amp;gt;cellHeight&amp;lt;/code&amp;gt;: Same as &amp;lt;code&amp;gt;cellWidth&amp;lt;/code&amp;gt;, but using the cell height.&lt;br /&gt;
* Any other value, recommended is &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;: Absolute pixel values (assuming a texture scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1181273</id>
		<title>FURWARE text</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1181273"/>
		<updated>2013-09-03T20:08:44Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Small updates to the to-do list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
This page is also available [[FURWARE_text/de|in German]]. / Diese Seite ist auch [[FURWARE_text/de|auf deutsch]] verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text is a &#039;&#039;&#039;script for displaying text&#039;&#039;&#039; on prims using textures. It is intended to be &#039;&#039;&#039;integrated in your objects&#039;&#039;&#039; in which it will be controlled by &#039;&#039;&#039;your own scripts&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;is not&#039;&#039;&#039; a ready-made display board but is intented for &#039;&#039;&#039;scripters&#039;&#039;&#039; who wish to integrate it in their own creations.&lt;br /&gt;
&lt;br /&gt;
The script was proprietary from 2010 to July 2013 until I ({{User|Ochi Wolfe}}) have decided to make it open source under the MIT license. It is my first attempt to make a fully open sourced product in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Only one script&#039;&#039;&#039; for a whole group (&amp;quot;sets&amp;quot;) of displays&lt;br /&gt;
* &#039;&#039;&#039;Formatting&#039;&#039;&#039; (color, alpha, alignment, wrapping, trimming, font, borders)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; with 1 to 8 chars, only occupying 0.5 prims each&lt;br /&gt;
* &#039;&#039;&#039;Virtual text boxes&#039;&#039;&#039; to position text arbitrarily&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; for encapsulating multiple style settings&lt;br /&gt;
&lt;br /&gt;
== How to obtain the script ==&lt;br /&gt;
&lt;br /&gt;
You can obtain a complete package containing the script, the display creator, display meshes and font textures at [http://marketplace.secondlife.com/p/FURWARE-text/141379 the Marketplace].&lt;br /&gt;
&lt;br /&gt;
For developers and interested users, I have also set up a [http://github.com/furware/text GitHub] account for the core scripts.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
Please see the following subpages for the user&#039;s manual and developer documentation:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial|First steps &amp;amp; extensive tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference|Short reference &amp;amp; version history]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets|Helper functions for more convenient usage]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers|Developer documentation]]&lt;br /&gt;
&lt;br /&gt;
== Texture creator ==&lt;br /&gt;
&lt;br /&gt;
Please see [[FURWARE_text/TextureCreator|this page]] for information about the texture creator tool for making your own font textures.&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For users:&#039;&#039;&#039; A very important part of contribution to the development of this script is to report any problems you experience while using it as well as suggestions how to make using it even more awesome. For the time being, feel free to write a notecard to {{User|Ochi Wolfe}} or add your comments to the discussion of this wiki-page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For developers:&#039;&#039;&#039; If you have any suggestions for improvements to the script itself, you can either post them in the same way or you can branch the project on [http://github.com/furware/text GitHub] and send your pull requests. Just make sure that they are, of course, of awesome quality and that they don&#039;t bloat the script more than it already is bloated. In fact, any suggestions to improve performance and decrease memory consumption are &#039;&#039;&#039;very&#039;&#039;&#039; welcome.&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
No issues are known for the current release, but please report any problems you find.&lt;br /&gt;
&lt;br /&gt;
== To do ==&lt;br /&gt;
&lt;br /&gt;
There are still some things to do for the conversion into an open source project:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;Check the documentation for errors.&amp;lt;/s&amp;gt; &#039;&#039;Never-ending task anyway.&#039;&#039;&lt;br /&gt;
* &amp;lt;s&amp;gt;Migrate the German documentation to the SL Wiki.&amp;lt;/s&amp;gt;&lt;br /&gt;
* Create developer documentation explaining concepts and ideas of the script. &#039;&#039;(in progress)&#039;&#039;&lt;br /&gt;
* Improve the font overview in the manual; make UUIDs copyable.&lt;br /&gt;
* I think there is a small bug in one of the images in the tutorial, I&#039;ll have to check that.&lt;br /&gt;
* Publish texture specifications. &#039;&#039;(in progress; developing texture creator)&#039;&#039;&lt;br /&gt;
* Publish mesh specifications. &#039;&#039;(in progress; published Collada versions of the meshes on GitHub)&#039;&#039;&lt;br /&gt;
* Add more useful comments to the scripts themselves.&lt;br /&gt;
* Clean up the scripts of the display creator and element initializer.&lt;br /&gt;
* &amp;lt;s&amp;gt;Migrate internal bug tracker, possibly to GitHub.&amp;lt;/s&amp;gt;&lt;br /&gt;
* Update the &amp;quot;FURWARE info board&amp;quot; to use the open source version of text.&lt;br /&gt;
* Make more open source example (controller) scripts.&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Usage&amp;diff=1181130</id>
		<title>FURWARE text/TextureCreator/Usage</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Usage&amp;diff=1181130"/>
		<updated>2013-09-01T19:59:00Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Link to Fonts subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quick start ==&lt;br /&gt;
&lt;br /&gt;
You can find download links for the tool on the [[FURWARE_text/TextureCreator|TextureCreator page]]. To run the TextureCreator under Windows, the easiest way is probably to fetch the pre-compiled package. Otherwise (and for using it on Linux or Mac), you can get the latest Python 2 code on the GitHub page. Note that when using the Python version, you will need Python 2 (tested with 2.7.5), pyCairo, Cairo, FreeType and any dependencies of these packages. A Python 3 version is currently not available because the pyCairo package for Python 3 does not have some of the required functionality.&lt;br /&gt;
&lt;br /&gt;
Once you have the TextureCreator tool running and it is able to create textures for the included fonts, you may add your own font folders to the &amp;quot;fonts&amp;quot; directory and place a &amp;quot;.ttf&amp;quot; or &amp;quot;.otf&amp;quot; font file inside it. When you execute the TextureCreator, it should create a texture using the newly added font using default settings. However, more tweaking may be necessary to really get the best out of a certain font (most notably a custom &amp;quot;font.conf&amp;quot; file), because every font is different. See below for a more in-depth description of how the TextureCreator works.&lt;br /&gt;
&lt;br /&gt;
== More on the mode of operation ==&lt;br /&gt;
&lt;br /&gt;
The most important items in the texture creator directory are the main program file (&amp;quot;TextureCreator.py&amp;quot; or &amp;quot;TextureCreator.exe&amp;quot;), the &amp;quot;fonts&amp;quot; directory, the &amp;quot;scripts&amp;quot; directory and the &amp;quot;output&amp;quot; directory (which might not exist initially, but it is created automatically by the tool when needed).&lt;br /&gt;
&lt;br /&gt;
The basic mode of operation is to load font files together with any custom configurations from the &#039;&#039;fonts&#039;&#039; directory, process them using one or more &#039;&#039;chain and script file(s)&#039;&#039; and output the resulting texture to the &#039;&#039;output&#039;&#039; directory.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;fonts&amp;quot; directory contains sub-directories; one for each font. Each of these sub-directories usually contains a font file (TrueType (ttf) or OpenType (otf)). If a sub-directory does not contain any font file, it is silently ignored. Please note that only the most basic font files come bundled with the TextureCreator; see [[FURWARE_text/TextureCreator/Fonts|this page]] for links to the rest of the standard FURWARE text font files.&lt;br /&gt;
&lt;br /&gt;
The texture creator searches each of the font sub-directories for a font file and if it finds one, it continues by searching for one or more &amp;quot;chain&amp;quot; files which contain commands that shall be executed for creating a texture for the font. Such commands might be (figuratively) &amp;quot;create a texture of a certain size&amp;quot;, &amp;quot;draw these symbols using the currently loaded font at certain positions&amp;quot; or &amp;quot;continue with commands in another file&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Thus the &amp;quot;chain&amp;quot; files may be seen as the &amp;quot;entry points&amp;quot; for execution of commands for a certain font. The way the texture creator searches for chain files is as follows: First, the font&#039;s directory is searched for chain files; this allows you to specify chains that are specific to the font. Only if no chain files are contained in the font&#039;s directory, all chains contained in the &amp;quot;scripts&amp;quot; directory are executed.&lt;br /&gt;
&lt;br /&gt;
Chain files may execute commands contained in other files (&amp;quot;.script&amp;quot; files). For instance, the default chain files in the scripts directory execute several script files containing commands for initializing the new texture, drawing basic symbols, special symbols, and so on. Note that the only difference between &amp;quot;.chain&amp;quot; and &amp;quot;.script&amp;quot; files is the file extension; the same set of commands is available in both chain and script files, but only files with the &amp;quot;.chain&amp;quot; extension are used as the entry points for script execution.&lt;br /&gt;
&lt;br /&gt;
Note that, just like chain files, &amp;quot;.script&amp;quot; files are also searched for in the font&#039;s directory first, then in the global &amp;quot;scripts&amp;quot; directory. This, again, allows you to bundle custom script files specific to a certain font.&lt;br /&gt;
&lt;br /&gt;
Each font sub-directory may also contain a &amp;quot;font.conf&amp;quot; file for font-specific configuration. These files are different from the chain and script files. They may contain font-specific offset and scaling settings, also for individual symbols of the respective font. Whenever a font is being loaded for drawing (also when it is loaded from other script files), that font&#039;s configuration is used.&lt;br /&gt;
&lt;br /&gt;
After all commands in a chain file have been executed, the created texture is written out to the &amp;quot;output&amp;quot; directory. By default, the name of the font directory is used for the texture&#039;s name (plus the image format&#039;s extension), but that name may be changed using script commands.&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator&amp;diff=1181127</id>
		<title>FURWARE text/TextureCreator</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator&amp;diff=1181127"/>
		<updated>2013-09-01T19:55:05Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Added link to the Fonts subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FURWARE texture creator is a tool for creating font textures for the FURWARE text script from TrueType/OpenType font files. It offers quite flexible configuration options for tweaking per-font and per-symbol options like offsets and scaling. This enables you to create configuration files for specific fonts to fit perfectly for usage with FURWARE text without any additional, manual tweaking of the resulting textures.&lt;br /&gt;
&lt;br /&gt;
The tool is available as a Python 2 script and a pre-compiled package for Windows; see below.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
Please see the following subpages for documentation:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/TextureCreator/Usage|Quick start and overview]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/TextureCreator/Reference|Script commands and font configuration reference]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/TextureCreator/Fonts|Download links for the standard FURWARE text fonts]]&lt;br /&gt;
&lt;br /&gt;
== How to obtain the tool ==&lt;br /&gt;
&lt;br /&gt;
The Python 2 code is available at [http://github.com/furware/text/tree/master/TextureCreator GitHub].&lt;br /&gt;
&lt;br /&gt;
Also, there is a pre-compiled package for Windows available from the [http://www.furware.de/products/text/TextureCreator.zip FURWARE website].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Fonts&amp;diff=1181124</id>
		<title>FURWARE text/TextureCreator/Fonts</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Fonts&amp;diff=1181124"/>
		<updated>2013-09-01T19:53:07Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links to the FURWARE text standard font files ==&lt;br /&gt;
&lt;br /&gt;
Only the most basic fonts (DejaVu, FreeFont Serif) come bundled with the TextureCreator tool. For the other standard fonts, only configuration files are included. If you wish to build font textures for these fonts, please use the following links to download the font files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039;&lt;br /&gt;
* The &amp;quot;Hashes&amp;quot; sections contain the SHA1 hashes of the font files that were last tested and used for creating the &amp;quot;official&amp;quot;, bundled FURWARE text font textures.&lt;br /&gt;
* Please also note that the &amp;quot;Hashes&amp;quot; sections contain the names of the used font files. The downloadable font packages often contain many more variations of the respective font.&lt;br /&gt;
* Please report any broken links.&lt;br /&gt;
&lt;br /&gt;
=== Andale ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [http://sourceforge.net/projects/corefonts/files/the%20fonts/final/ Website], [http://sourceforge.net/projects/corefonts/files/the%20fonts/final/andale32.exe/download Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039; The font file is packed in a self-extracting archive. Under Linux, you may use &amp;quot;cabextract&amp;quot; to extract the font file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
953839b69c5bc047cb53efefc755dd21175a3a1d  fonts/Andale/AndaleMo.TTF&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anonymous Pro ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [http://www.marksimonson.com/fonts/view/anonymous-pro Website], [http://www.marksimonson.com/assets/content/fonts/AnonymousPro-1.002.zip Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
a5af97297e863b4fc9d463200e5befc7ee102d57  fonts/AnonymousPro/Anonymous Pro.ttf&lt;br /&gt;
&lt;br /&gt;
8fd93c43aa27045a533c56bbf948e1e4e3081ef0  fonts/AnonymousPro-Bold/Anonymous Pro B.ttf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DejaVu ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [http://dejavu-fonts.org/wiki/Download Website], [http://sourceforge.net/projects/dejavu/files/dejavu/2.34/dejavu-fonts-ttf-2.34.zip/download Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
73225779da81fc5a874596d065e336ca3d7b4c37  fonts/DejaVu/DejaVuSansMono.ttf&lt;br /&gt;
&lt;br /&gt;
a2152e5cc64b7f038546d0150bfb68f61572aa55  fonts/DejaVu-Bold/DejaVuSansMono-Bold.ttf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EnvyCodeR ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [http://damieng.com/blog/2008/05/26/envy-code-r-preview-7-coding-font-released Website], [http://download.damieng.com/fonts/original/EnvyCodeR-PR7.zip Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
b8bfc57294faf001ce3b5297f045d323cf524d50  fonts/EnvyCodeR/Envy Code R.ttf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeFont/FreeSerif ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [http://savannah.gnu.org/projects/freefont/ Website], [http://ftp.gnu.org/gnu/freefont/freefont-ttf-20120503.zip Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
583e0b2acb91c59954c8fa7692c453a36c1b1a82  fonts/FreeFont/FreeMonoBold.ttf&lt;br /&gt;
&lt;br /&gt;
6023b0abf77647ad1489d059678f5b7a63c78147  fonts/FreeSerif/FreeSerif.ttf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inconsolata ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [http://levien.com/type/myfonts/inconsolata.html Website], [http://levien.com/type/myfonts/Inconsolata.otf Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
7f0a4919d91edcef0af9dc153054ec49d1ab3072  fonts/Inconsolata/Inconsolata.otf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Liberation ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [https://fedorahosted.org/liberation-fonts/ Website], [https://fedorahosted.org/releases/l/i/liberation-fonts/liberation-fonts-ttf-2.00.1.tar.gz Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
302c90a3435f6768669be3b0796b32f02e02fb8c  fonts/Liberation/LiberationMono-Regular.ttf&lt;br /&gt;
&lt;br /&gt;
96429f1d58a45ffa36f21d1052d691a0cd11125c  fonts/Liberation-Bold/LiberationMono-Bold.ttf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Luxi ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/Luxi_fonts Website], [http://xorg.freedesktop.org/releases/individual/font/font-bh-ttf-1.0.3.tar.bz2 Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
14abb9893507742837094ad262e6cd78edf1e42a  fonts/Luxi/luximr.ttf&lt;br /&gt;
&lt;br /&gt;
01bcf993dc3161f3eddaa76f91a3b323ce2c225e  fonts/Luxi-Bold/luximb.ttf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monofur ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [http://www.dafont.com/monofur.font Website], [http://img.dafont.com/dl/?f=monofur Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
30c79031b7a6a6e613f1e2c00dcedf0027902aed  fonts/Monofur/monof55.ttf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nova Mono ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [http://www.google.com/fonts/specimen/Nova+Mono Website], [http://www.google.com/fonts/download?kit=_m2nPFkZFucmzq044Y7St1tkqrIMaAZWyLYEoB48lSQ Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
dfd7d60609fcd7c6d7a7b372d2ec1f91b3cab650  fonts/Nova/NovaMono.ttf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ProFont ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Links:&#039;&#039;&#039; [http://www.tobias-jung.de/seekingprofont/index.html Website], [http://www.tobiasjung.net/download.php?file=ProFontWinTweaked.zip Direct link]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039; Please use the &#039;&#039;&#039;tweaked&#039;&#039;&#039; TrueType version of the font.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hashes:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
82f6ad711c91f59f5fd30b3d3770d0340762fa4f  fonts/ProFont/ProFontWindows.ttf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator&amp;diff=1181114</id>
		<title>FURWARE text/TextureCreator</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator&amp;diff=1181114"/>
		<updated>2013-08-31T22:13:26Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Added links to documentation subpages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FURWARE texture creator is a tool for creating font textures for the FURWARE text script from TrueType/OpenType font files. It offers quite flexible configuration options for tweaking per-font and per-symbol options like offsets and scaling. This enables you to create configuration files for specific fonts to fit perfectly for usage with FURWARE text without any additional, manual tweaking of the resulting textures.&lt;br /&gt;
&lt;br /&gt;
The tool is available as a Python 2 script and a pre-compiled package for Windows; see below.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
Please see the following subpages for documentation:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/TextureCreator/Usage|Quick start and overview]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/TextureCreator/Reference|Script commands and font configuration reference]]&lt;br /&gt;
&lt;br /&gt;
== How to obtain the tool ==&lt;br /&gt;
&lt;br /&gt;
The Python 2 code is available at [http://github.com/furware/text/tree/master/TextureCreator GitHub].&lt;br /&gt;
&lt;br /&gt;
Also, there is a pre-compiled package for Windows available from the [http://www.furware.de/products/text/TextureCreator.zip FURWARE website].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Reference&amp;diff=1181113</id>
		<title>FURWARE text/TextureCreator/Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Reference&amp;diff=1181113"/>
		<updated>2013-08-31T22:08:14Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Updated to match current git version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
== Chain/script commands ==&lt;br /&gt;
&lt;br /&gt;
The following commands may be used in &amp;quot;chain&amp;quot; and &amp;quot;script&amp;quot; files.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;runScript&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;scriptName&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Executes commands from another script file (usually with the extension &amp;quot;.script&amp;quot;; file name only, &#039;&#039;&#039;not&#039;&#039;&#039; a full path; note that &#039;&#039;&amp;lt;code&amp;gt;scriptName&amp;lt;/code&amp;gt;&#039;&#039; must include the file name extension). The given script file ist first searched for in the folder of the font that is currently being processed and, if not found, in the global &amp;quot;scripts&amp;quot; directory. After successful execution of the commands in the other script, execution continues where runScript was called.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;sizeX sizeY scaleX scaleY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Initializes a new texture to draw to. This command should generally be one of the first things to call, except for &amp;quot;runScript&amp;quot; commands. The &#039;&#039;&amp;lt;code&amp;gt;sizeX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;sizeY&amp;lt;/code&amp;gt;&#039;&#039; values set the size of the drawing area in pixels. However, this only equals the size of the resulting texture if &#039;&#039;&amp;lt;code&amp;gt;scaleX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;scaleY&amp;lt;/code&amp;gt;&#039;&#039; is set to &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;. The scale parameters may be used to create larger or smaller versions of a texture without having to tweak any positioning of characters, etc. because everything will be scaled relative to these values.&lt;br /&gt;
&lt;br /&gt;
For instance, the configs that come with the creator are made for 1024x1024 textures. If you set the &#039;&#039;&amp;lt;code&amp;gt;size*&amp;lt;/code&amp;gt;&#039;&#039; values to &amp;lt;code&amp;gt;1024&amp;lt;/code&amp;gt; and the &#039;&#039;&amp;lt;code&amp;gt;scale*&amp;lt;/code&amp;gt;&#039;&#039; values to &amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt;, you will get a 512x512 texture with the same content as the 1024x1024 version, just smaller. In contrast, if you set the &#039;&#039;&amp;lt;code&amp;gt;size*&amp;lt;/code&amp;gt;&#039;&#039; values to &amp;lt;code&amp;gt;512&amp;lt;/code&amp;gt; and keep the &#039;&#039;&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt;&#039;&#039; values set to &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;, you will get a cropped version of the 1024x1024 version, showing only the upper-left quarter of the texture. Note that the scaling is not performed by scaling the final texture but during the drawing, yielding smooth and detailed textures at all scales.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setOutputName&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;outputName&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the name of the texture file to be created. Note that &#039;&#039;&amp;lt;code&amp;gt;outputName&amp;lt;/code&amp;gt;&#039;&#039; should not include the file extension, for instance &amp;lt;code&amp;gt;.tga&amp;lt;/code&amp;gt;. When you do not call &#039;&#039;&#039;&amp;lt;code&amp;gt;setOutputName&amp;lt;/code&amp;gt;&#039;&#039;&#039;, the name of the folder of the font currently being processed is used as the texture name. This command may be used for creating multiple versions of a texture from the same font.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setOutputNameSuffix&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;outputNameSuffix&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Similar to &#039;&#039;&#039;&amp;lt;code&amp;gt;setOutputName&amp;lt;/code&amp;gt;&#039;&#039;&#039;, with the difference that &#039;&#039;&#039;&amp;lt;code&amp;gt;outputNameSuffix&amp;lt;/code&amp;gt;&#039;&#039;&#039; is appended to the currently set output name. This allows you to append suffixes like &amp;lt;code&amp;gt;-512&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-1024&amp;lt;/code&amp;gt; to different versions of textures created from the same font.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellSize&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;sizeX sizeY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the size of one character cell to &#039;&#039;&amp;lt;code&amp;gt;sizeX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;sizeY&amp;lt;/code&amp;gt;&#039;&#039; (in pixels, assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellOffset&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;offsetX offsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the distance of the center of the upper-left cell to the upper-left corner of the texture to &#039;&#039;&amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt;&#039;&#039; (in pixels, assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellSpacing&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;spaceX spaceY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the horizontal and vertical spacing between the centers of two cells to &#039;&#039;&amp;lt;code&amp;gt;spaceX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;spaceY&amp;lt;/code&amp;gt;&#039;&#039; (in pixels, assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellCount&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;numX numY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the number of cells in horizontal and vertical direction. Used for various purposes, especially for determining when to go to the next row when drawing many characters at once.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setBaselineOffset&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;value unit&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the vertical offset of the font&#039;s native baseline from the cell centers. The &#039;&#039;&amp;lt;code&amp;gt;unit&amp;lt;/code&amp;gt;&#039;&#039; parameter determines how &#039;&#039;&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&#039;&#039; is interpreted; see below for possible values of &#039;&#039;&amp;lt;code&amp;gt;unit&amp;lt;/code&amp;gt;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;jumpToCell&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;cellX cellY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the position of the virtual &amp;quot;cursor&amp;quot; in the cell grid to &#039;&#039;&amp;lt;code&amp;gt;cellX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;cellY&amp;lt;/code&amp;gt;&#039;&#039;. The next call of &#039;&#039;&#039;&amp;lt;code&amp;gt;drawChars&amp;lt;/code&amp;gt;&#039;&#039;&#039; will then draw the next character to that cell.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;loadFont&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;fontFilePath&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Loads a font file (&amp;lt;code&amp;gt;.ttf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.otf&amp;lt;/code&amp;gt;) for drawing, also loading the respective &amp;lt;code&amp;gt;font.conf&amp;lt;/code&amp;gt; file, if there is one in the same folder as the font file. &#039;&#039;&amp;lt;code&amp;gt;fontFilePath&amp;lt;/code&amp;gt;&#039;&#039; may be empty to load the font that is currently being processed by the tool. If it is not empty, it must be either a complete path, or a path relative to where the TextureCreator program is being executed (for example: &amp;lt;code&amp;gt;fonts/DejaVu/DejaVu.ttf&amp;lt;/code&amp;gt;). This command may be used to use symbols from other fonts, for instance when they offer special characters that are not available in the font being processed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawChars&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;listOfChars&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Draws the characters given in &#039;&#039;&amp;lt;code&amp;gt;listOfChars&amp;lt;/code&amp;gt;&#039;&#039; to the current cursor position (see also &#039;&#039;&#039;&amp;lt;code&amp;gt;jumpToCell&amp;lt;/code&amp;gt;&#039;&#039;&#039;). When multiple characters are specified, the virtual cursor will automatically be moved forward and, if necessary, to the next row.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawLineBetweenCells&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;thickness startX startY endX endY startOffsetX startOffsetY endOffsetX endOffsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to draw a line between two cells with the given line &#039;&#039;&amp;lt;code&amp;gt;thickness&amp;lt;/code&amp;gt;&#039;&#039;. The &#039;&#039;&amp;lt;code&amp;gt;startX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;startY&amp;lt;/code&amp;gt;&#039;&#039; and &#039;&#039;&amp;lt;code&amp;gt;endX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;endY&amp;lt;/code&amp;gt;&#039;&#039; values are the coordinates of the start/end cells in the cell grid, starting from &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. The &#039;&#039;&amp;lt;code&amp;gt;*Offset*&amp;lt;/code&amp;gt;&#039;&#039; values are offsets of the line endpoints from the start/end cells&#039; center, in pixels.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawRectBetweenCells&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;thickness startX startY endX endY startOffsetX startOffsetY endOffsetX endOffsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Similar to &#039;&#039;&#039;&amp;lt;code&amp;gt;drawLineBetweenCells&amp;lt;/code&amp;gt;&#039;&#039;&#039;, but draws the outline of a rectangle between two cells instead of a line, with the given stroke thickness. The start coordinates specify the upper-left, the end coordinates for the lower-right corner of the rectangle.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawFilledRectBetweenCells&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;thickness startX startY endX endY startOffsetX startOffsetY endOffsetX endOffsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Similar to &#039;&#039;&#039;&amp;lt;code&amp;gt;drawRectBetweenCells&amp;lt;/code&amp;gt;&#039;&#039;&#039;, but draws a filled rectangle. Note that the &#039;&#039;&amp;lt;code&amp;gt;thickness&amp;lt;/code&amp;gt;&#039;&#039; parameter does not actually have any effect for this command.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;noBuild&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Causes script execution for the current font to be stopped and no texture is created. Used for fonts which are only there for usage from other scripts but for which no complete textures shall be created.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawDebugGrid&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Draws an opaque grid showing the grid layout behind any drawn characters or geometry. Shall be called after the grid has been set up completely using &#039;&#039;&#039;&amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;&#039;&#039;&#039; and the necessary &#039;&#039;&#039;&amp;lt;code&amp;gt;set*&amp;lt;/code&amp;gt;&#039;&#039;&#039; functions, but before drawing any characters, etc.&lt;br /&gt;
&lt;br /&gt;
== Font configuration files ==&lt;br /&gt;
&lt;br /&gt;
The following commands may be used in &amp;lt;code&amp;gt;font.conf&amp;lt;/code&amp;gt; files to tweak per-font and per-character settings.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;offsetX offsetY unitX unitY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the offset of all characters drawn using this font. See below for possible values of &#039;&#039;&amp;lt;code&amp;gt;unitX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;unitY&amp;lt;/code&amp;gt;&#039;&#039; which decides in which unit the &#039;&#039;&amp;lt;code&amp;gt;offset*&amp;lt;/code&amp;gt;&#039;&#039; values are given.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;value unit&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the scaling (text size) for all characters drawn using this font. See below for possible values of &#039;&#039;&amp;lt;code&amp;gt;unit&amp;lt;/code&amp;gt;&#039;&#039; which decides in which unit the &#039;&#039;&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&#039;&#039; argument is given.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;charSettings&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;char offsetX offsetY scaleX scaleY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Set per-character offset and scaling values. The &#039;&#039;&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;&#039;&#039; parameter shall be exactly one character for which the settings are being set. The &#039;&#039;&amp;lt;code&amp;gt;offset*&amp;lt;/code&amp;gt;&#039;&#039; parameters set an offset that should be &#039;&#039;&#039;added&#039;&#039;&#039; to the global offset set using the &#039;&#039;&#039;&amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt;&#039;&#039;&#039; setting when drawing the character &#039;&#039;&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;&#039;&#039;; given in pixels (assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;). The &#039;&#039;&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt;&#039;&#039; parameters are floats where a value of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; means &amp;quot;no scaling&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;enableAutoShrink&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If this line is given in the font config, a heuristic is activated that tries to guess a horizontal down-scaling for characters that would otherwise be too wide to fit in a cell. The idea is to automatically tweak the wider characters of non-monospace fonts (like &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt;) to fit into the grid cells. This is very experimental.&lt;br /&gt;
&lt;br /&gt;
== The &#039;&#039;unit*&#039;&#039; parameters ==&lt;br /&gt;
&lt;br /&gt;
Some functions have &#039;&#039;&amp;lt;code&amp;gt;unit*&amp;lt;/code&amp;gt;&#039;&#039; parameters that specify how the given values (offsets, sizes) shall be interpreted. Each &#039;&#039;&amp;lt;code&amp;gt;unit*&amp;lt;/code&amp;gt;&#039;&#039; parameter may be one of:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cellWidth&amp;lt;/code&amp;gt;: The offset/size value is interpreted relative to the set cell width, so a value of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; means equal to the cell width.&lt;br /&gt;
* &amp;lt;code&amp;gt;cellHeight&amp;lt;/code&amp;gt;: Same as &amp;lt;code&amp;gt;cellWidth&amp;lt;/code&amp;gt;, but using the cell height.&lt;br /&gt;
* Any other value, recommended is &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;: Absolute pixel values (assuming a texture scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Usage&amp;diff=1181018</id>
		<title>FURWARE text/TextureCreator/Usage</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Usage&amp;diff=1181018"/>
		<updated>2013-08-29T20:13:25Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quick start ==&lt;br /&gt;
&lt;br /&gt;
You can find download links for the tool on the [[FURWARE_text/TextureCreator|TextureCreator page]]. To run the TextureCreator under Windows, the easiest way is probably to fetch the pre-compiled package. Otherwise (and for using it on Linux or Mac), you can get the latest Python 2 code on the GitHub page. Note that when using the Python version, you will need Python 2 (tested with 2.7.5), pyCairo, Cairo, FreeType and any dependencies of these packages. A Python 3 version is currently not available because the pyCairo package for Python 3 does not have some of the required functionality.&lt;br /&gt;
&lt;br /&gt;
Once you have the TextureCreator tool running and it is able to create textures for the included fonts, you may add your own font folders to the &amp;quot;fonts&amp;quot; directory and place a &amp;quot;.ttf&amp;quot; or &amp;quot;.otf&amp;quot; font file inside it. When you execute the TextureCreator, it should create a texture using the newly added font using default settings. However, more tweaking may be necessary to really get the best out of a certain font (most notably a custom &amp;quot;font.conf&amp;quot; file), because every font is different. See below for a more in-depth description of how the TextureCreator works.&lt;br /&gt;
&lt;br /&gt;
== More on the mode of operation ==&lt;br /&gt;
&lt;br /&gt;
The most important items in the texture creator directory are the main program file (&amp;quot;TextureCreator.py&amp;quot; or &amp;quot;TextureCreator.exe&amp;quot;), the &amp;quot;fonts&amp;quot; directory, the &amp;quot;scripts&amp;quot; directory and the &amp;quot;output&amp;quot; directory (which might not exist initially, but it is created automatically by the tool when needed).&lt;br /&gt;
&lt;br /&gt;
The basic mode of operation is to load font files together with any custom configurations from the &#039;&#039;fonts&#039;&#039; directory, process them using one or more &#039;&#039;chain and script file(s)&#039;&#039; and output the resulting texture to the &#039;&#039;output&#039;&#039; directory.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;fonts&amp;quot; directory contains sub-directories; one for each font. Each of these sub-directories usually contains a font file (TrueType (ttf) or OpenType (otf)). If a sub-directory does not contain any font file, it is silently ignored (please see below why many font sub-directories do not contain font files by default).&lt;br /&gt;
&lt;br /&gt;
The texture creator searches each of the font sub-directories for a font file and if it finds one, it continues by searching for one or more &amp;quot;chain&amp;quot; files which contain commands that shall be executed for creating a texture for the font. Such commands might be (figuratively) &amp;quot;create a texture of a certain size&amp;quot;, &amp;quot;draw these symbols using the currently loaded font at certain positions&amp;quot; or &amp;quot;continue with commands in another file&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Thus the &amp;quot;chain&amp;quot; files may be seen as the &amp;quot;entry points&amp;quot; for execution of commands for a certain font. The way the texture creator searches for chain files is as follows: First, the font&#039;s directory is searched for chain files; this allows you to specify chains that are specific to the font. Only if no chain files are contained in the font&#039;s directory, all chains contained in the &amp;quot;scripts&amp;quot; directory are executed.&lt;br /&gt;
&lt;br /&gt;
Chain files may execute commands contained in other files (&amp;quot;.script&amp;quot; files). For instance, the default chain files in the scripts directory execute several script files containing commands for initializing the new texture, drawing basic symbols, special symbols, and so on. Note that the only difference between &amp;quot;.chain&amp;quot; and &amp;quot;.script&amp;quot; files is the file extension; the same set of commands is available in both chain and script files, but only files with the &amp;quot;.chain&amp;quot; extension are used as the entry points for script execution.&lt;br /&gt;
&lt;br /&gt;
Note that, just like chain files, &amp;quot;.script&amp;quot; files are also searched for in the font&#039;s directory first, then in the global &amp;quot;scripts&amp;quot; directory. This, again, allows you to bundle custom script files specific to a certain font.&lt;br /&gt;
&lt;br /&gt;
Each font sub-directory may also contain a &amp;quot;font.conf&amp;quot; file for font-specific configuration. These files are different from the chain and script files. They may contain font-specific offset and scaling settings, also for individual symbols of the respective font. Whenever a font is being loaded for drawing (also when it is loaded from other script files), that font&#039;s configuration is used.&lt;br /&gt;
&lt;br /&gt;
After all commands in a chain file have been executed, the created texture is written out to the &amp;quot;output&amp;quot; directory. By default, the name of the font directory is used for the texture&#039;s name (plus the image format&#039;s extension), but that name may be changed using script commands.&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Reference&amp;diff=1181017</id>
		<title>FURWARE text/TextureCreator/Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/Reference&amp;diff=1181017"/>
		<updated>2013-08-29T19:48:46Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
== Chain/script commands ==&lt;br /&gt;
&lt;br /&gt;
The following commands may be used in &amp;quot;chain&amp;quot; and &amp;quot;script&amp;quot; files.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;runScript&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;scriptName&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Executes commands from another script file (usually with the extension &amp;quot;.script&amp;quot;; file name only, &#039;&#039;&#039;not&#039;&#039;&#039; a full path; note that &#039;&#039;&amp;lt;code&amp;gt;scriptName&amp;lt;/code&amp;gt;&#039;&#039; must include the file name extension). The given script file ist first searched for in the folder of the font that is currently being processed and, if not found, in the global &amp;quot;scripts&amp;quot; directory. After successful execution of the commands in the other script, execution continues where runScript was called.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;sizeX sizeY scaleX scaleY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Initializes a new texture to draw to. This command should generally be one of the first things to call, except for &amp;quot;runScript&amp;quot; commands. The &#039;&#039;&amp;lt;code&amp;gt;sizeX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;sizeY&amp;lt;/code&amp;gt;&#039;&#039; values set the size of the drawing area in pixels. However, this only equals the size of the resulting texture if &#039;&#039;&amp;lt;code&amp;gt;scaleX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;scaleY&amp;lt;/code&amp;gt;&#039;&#039; is set to &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;. The scale parameters may be used to create larger or smaller versions of a texture without having to tweak any positioning of characters, etc. because everything will be scaled relative to these values.&lt;br /&gt;
&lt;br /&gt;
For instance, the configs that come with the creator are made for 1024x1024 textures. If you set the &#039;&#039;&amp;lt;code&amp;gt;size*&amp;lt;/code&amp;gt;&#039;&#039; values to &amp;lt;code&amp;gt;1024&amp;lt;/code&amp;gt; and the &#039;&#039;&amp;lt;code&amp;gt;scale*&amp;lt;/code&amp;gt;&#039;&#039; values to &amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt;, you will get a 512x512 texture with the same content as the 1024x1024 version, just smaller. In contrast, if you set the &#039;&#039;&amp;lt;code&amp;gt;size*&amp;lt;/code&amp;gt;&#039;&#039; values to &amp;lt;code&amp;gt;512&amp;lt;/code&amp;gt; and keep the &#039;&#039;&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt;&#039;&#039; values set to &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;, you will get a cropped version of the 1024x1024 version, showing only the upper-left quarter of the texture. Note that the scaling is not performed by scaling the final texture but during the drawing, yielding smooth and detailed textures at all scales.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setOutputName&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;outputName&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the name of the texture file to be created. Note that &#039;&#039;&amp;lt;code&amp;gt;outputName&amp;lt;/code&amp;gt;&#039;&#039; should not include the file extension, for instance &amp;lt;code&amp;gt;.tga&amp;lt;/code&amp;gt;. When you do not call &#039;&#039;&#039;&amp;lt;code&amp;gt;setOutputName&amp;lt;/code&amp;gt;&#039;&#039;&#039;, the name of the folder of the font currently being processed is used as the texture name. This command may be used for creating multiple versions of a texture from the same font.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setOutputNameSuffix&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;outputNameSuffix&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Similar to &#039;&#039;&#039;&amp;lt;code&amp;gt;setOutputName&amp;lt;/code&amp;gt;&#039;&#039;&#039;, with the difference that &#039;&#039;&#039;&amp;lt;code&amp;gt;outputNameSuffix&amp;lt;/code&amp;gt;&#039;&#039;&#039; is appended to the currently set output name. This allows you to append suffixes like &amp;lt;code&amp;gt;-512&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-1024&amp;lt;/code&amp;gt; to different versions of textures created from the same font.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellSize&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;sizeX sizeY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the size of one character cell to &#039;&#039;&amp;lt;code&amp;gt;sizeX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;sizeY&amp;lt;/code&amp;gt;&#039;&#039; (in pixels, assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellOffset&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;offsetX offsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the distance of the center of the upper-left cell to the upper-left corner of the texture to &#039;&#039;&amp;lt;code&amp;gt;offsetX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;offsetY&amp;lt;/code&amp;gt;&#039;&#039; (in pixels, assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellSpacing&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;spaceX spaceY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the horizontal and vertical spacing between the centers of two cells to &#039;&#039;&amp;lt;code&amp;gt;spaceX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;spaceY&amp;lt;/code&amp;gt;&#039;&#039; (in pixels, assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;setCellCount&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;numX numY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the number of cells in horizontal and vertical direction. Used for various purposes, especially for determining when to go to the next row when drawing many characters at once.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;jumpToCell&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;cellX cellY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the position of the virtual &amp;quot;cursor&amp;quot; in the cell grid to &#039;&#039;&amp;lt;code&amp;gt;cellX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;cellY&amp;lt;/code&amp;gt;&#039;&#039;. The next call of &#039;&#039;&#039;&amp;lt;code&amp;gt;drawChars&amp;lt;/code&amp;gt;&#039;&#039;&#039; will then draw the next character to that cell.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;loadFont&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;fontFilePath&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Loads a font file (&amp;lt;code&amp;gt;.ttf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.otf&amp;lt;/code&amp;gt;) for drawing, also loading the respective &amp;lt;code&amp;gt;font.conf&amp;lt;/code&amp;gt; file, if there is one in the same folder as the font file. &#039;&#039;&amp;lt;code&amp;gt;fontFilePath&amp;lt;/code&amp;gt;&#039;&#039; may be empty to load the font that is currently being processed by the tool. If it is not empty, it must be either a complete path, or a path relative to where the TextureCreator program is being executed (for example: &amp;lt;code&amp;gt;fonts/DejaVu/DejaVu.ttf&amp;lt;/code&amp;gt;). This command may be used to use symbols from other fonts, for instance when they offer special characters that are not available in the font being processed.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawChars&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;listOfChars&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Draws the characters given in &#039;&#039;&amp;lt;code&amp;gt;listOfChars&amp;lt;/code&amp;gt;&#039;&#039; to the current cursor position (see also &#039;&#039;&#039;&amp;lt;code&amp;gt;jumpToCell&amp;lt;/code&amp;gt;&#039;&#039;&#039;). When multiple characters are specified, the virtual cursor will automatically be moved forward and, if necessary, to the next row.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawLineBetweenCells&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;thickness startX startY endX endY startOffsetX startOffsetY endOffsetX endOffsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to draw a line between two cells with the given line &#039;&#039;&amp;lt;code&amp;gt;thickness&amp;lt;/code&amp;gt;&#039;&#039;. The &#039;&#039;&amp;lt;code&amp;gt;startX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;startY&amp;lt;/code&amp;gt;&#039;&#039; and &#039;&#039;&amp;lt;code&amp;gt;endX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;endY&amp;lt;/code&amp;gt;&#039;&#039; values are the coordinates of the start/end cells in the cell grid, starting from &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. The &#039;&#039;&amp;lt;code&amp;gt;*Offset*&amp;lt;/code&amp;gt;&#039;&#039; values are offsets of the line endpoints from the start/end cells&#039; center, in pixels.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawRectBetweenCells&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;thickness startX startY endX endY startOffsetX startOffsetY endOffsetX endOffsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Similar to &#039;&#039;&#039;&amp;lt;code&amp;gt;drawLineBetweenCells&amp;lt;/code&amp;gt;&#039;&#039;&#039;, but draws the outline of a rectangle between two cells instead of a line, with the given stroke thickness. The start coordinates specify the upper-left, the end coordinates for the lower-right corner of the rectangle.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawFilledRectBetweenCells&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;thickness startX startY endX endY startOffsetX startOffsetY endOffsetX endOffsetY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Similar to &#039;&#039;&#039;&amp;lt;code&amp;gt;drawRectBetweenCells&amp;lt;/code&amp;gt;&#039;&#039;&#039;, but draws a filled rectangle. Note that the &#039;&#039;&amp;lt;code&amp;gt;thickness&amp;lt;/code&amp;gt;&#039;&#039; parameter does not actually have any effect for this command.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;noBuild&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Causes script execution for the current font to be stopped and no texture is created. Used for fonts which are only there for usage from other scripts but for which no complete textures shall be created.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;drawDebugGrid&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Draws an opaque grid showing the grid layout behind any drawn characters or geometry. Shall be called after the grid has been set up completely using &#039;&#039;&#039;&amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;&#039;&#039;&#039; and the necessary &#039;&#039;&#039;&amp;lt;code&amp;gt;set*&amp;lt;/code&amp;gt;&#039;&#039;&#039; functions, but before drawing any characters, etc.&lt;br /&gt;
&lt;br /&gt;
== Font configuration files ==&lt;br /&gt;
&lt;br /&gt;
The following commands may be used in &amp;lt;code&amp;gt;font.conf&amp;lt;/code&amp;gt; files to tweak per-font and per-character settings.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;offsetX offsetY unitX unitY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the offset of all characters drawn using this font. See below for possible values of &#039;&#039;&amp;lt;code&amp;gt;unitX&amp;lt;/code&amp;gt;&#039;&#039;, &#039;&#039;&amp;lt;code&amp;gt;unitY&amp;lt;/code&amp;gt;&#039;&#039; which decides in which unit the &#039;&#039;&amp;lt;code&amp;gt;offset*&amp;lt;/code&amp;gt;&#039;&#039; values are given.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;value unit&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the scaling (text size) for all characters drawn using this font. See below for possible values of &#039;&#039;&amp;lt;code&amp;gt;unit&amp;lt;/code&amp;gt;&#039;&#039; which decides in which unit the &#039;&#039;&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&#039;&#039; argument is given.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;charOffset&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;char offsetX offsetY scaleX scaleY&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets an offset that should be &#039;&#039;&#039;added&#039;&#039;&#039; to the global offset set using the &#039;&#039;&#039;&amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt;&#039;&#039;&#039; setting when drawing the character &#039;&#039;&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;&#039;&#039;. The &#039;&#039;&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;&#039;&#039; char parameter shall be exactly one character. The &#039;&#039;&amp;lt;code&amp;gt;offset*&amp;lt;/code&amp;gt;&#039;&#039; parameters are given in pixels (assuming a scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;). The &#039;&#039;&amp;lt;code&amp;gt;scale&amp;lt;/code&amp;gt;&#039;&#039; parameters are floats where a value of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; means &amp;quot;no scaling&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;guessingChar&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets the character that is used for auomatically guessing parameters for centering the characters in the cells. The default character that is used is the capital &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;. Other good candidates might be &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; but this depends heavily on the font.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;enableAutoShrink&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;Parameters: none&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If this line is given in the font config, a heuristic is activated that tries to guess a horizontal down-scaling for characters that would otherwise be too wide to fit in a cell. The idea is to automatically tweak the wider characters of non-monospace fonts (like &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt;) to fit into the grid cells. This is very experimental.&lt;br /&gt;
&lt;br /&gt;
== The &#039;&#039;unit*&#039;&#039; parameters ==&lt;br /&gt;
&lt;br /&gt;
Some functions have &#039;&#039;&amp;lt;code&amp;gt;unit*&amp;lt;/code&amp;gt;&#039;&#039; parameters that specify how the given values (offsets, sizes) shall be interpreted. Each &#039;&#039;&amp;lt;code&amp;gt;unit*&amp;lt;/code&amp;gt;&#039;&#039; parameter may be one of:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cellWidth&amp;lt;/code&amp;gt;: The offset/size value is interpreted relative to the set cell width, so a value of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; means equal to the cell width.&lt;br /&gt;
* &amp;lt;code&amp;gt;cellHeight&amp;lt;/code&amp;gt;: Same as &amp;lt;code&amp;gt;cellWidth&amp;lt;/code&amp;gt;, but using the cell height.&lt;br /&gt;
* Any other value, recommended is &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;: Absolute pixel values (assuming a texture scale of &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;).&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator&amp;diff=1180958</id>
		<title>FURWARE text/TextureCreator</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator&amp;diff=1180958"/>
		<updated>2013-08-26T22:26:32Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Some extensions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FURWARE texture creator is a tool for creating font textures for the FURWARE text script from TrueType/OpenType font files. It offers quite flexible configuration options for tweaking per-font and per-symbol options like offsets and scaling. This enables you to create configuration files for specific fonts to fit perfectly for usage with FURWARE text without any additional, manual tweaking of the resulting textures.&lt;br /&gt;
&lt;br /&gt;
The tool is available as a Python 2 script and a pre-compiled package for Windows; see below.&lt;br /&gt;
&lt;br /&gt;
== Mode of operation ==&lt;br /&gt;
&lt;br /&gt;
The most important items in the texture creator directory are the main program file (&amp;quot;TextureCreator.py&amp;quot; or &amp;quot;TextureCreator.exe&amp;quot;), the &amp;quot;fonts&amp;quot; directory, the &amp;quot;scripts&amp;quot; directory and the &amp;quot;output&amp;quot; directory (which might not exist initially, but it is created automatically by the tool when needed).&lt;br /&gt;
&lt;br /&gt;
The basic mode of operation is to load font files together with any custom configurations from the &#039;&#039;fonts&#039;&#039; directory, process them using one or more &#039;&#039;chain and script file(s)&#039;&#039; and output the resulting texture to the &#039;&#039;output&#039;&#039; directory.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;fonts&amp;quot; directory contains sub-directories; one for each font. Each of these sub-directories usually contains a font file (TrueType (ttf) or OpenType (otf)). If a sub-directory does not contain any font file, it is silently ignored (please see below why many font sub-directories do not contain font files by default).&lt;br /&gt;
&lt;br /&gt;
The texture creator searches each of the font sub-directories for a font file and if it finds one, it continues by searching for one or more &amp;quot;chain&amp;quot; files which contain commands that shall be executed for creating a texture for the font. Such commands might be (figuratively) &amp;quot;create a texture of a certain size&amp;quot;, &amp;quot;draw these symbols using the currently loaded font at certain positions&amp;quot; or &amp;quot;continue with commands in another file&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Thus the &amp;quot;chain&amp;quot; files may be seen as the &amp;quot;entry points&amp;quot; for execution of commands for a certain font. The way the texture creator searches for chain files is as follows: First, the font&#039;s directory is searched for chain files; this allows you to specify chains that are specific to the font. Only if no chain files are contained in the font&#039;s directory, all chains contained in the &amp;quot;scripts&amp;quot; directory are executed.&lt;br /&gt;
&lt;br /&gt;
Chain files may execute commands contained in other files (&amp;quot;.script&amp;quot; files). For instance, the default chain files in the scripts directory execute several script files containing commands for initializing the new texture, drawing basic symbols, special symbols, and so on. Note that the only difference between &amp;quot;.chain&amp;quot; and &amp;quot;.script&amp;quot; files is the file extension; the same set of commands is available in both chain and script files, but only files with the &amp;quot;.chain&amp;quot; extension are used as the entry points for script execution.&lt;br /&gt;
&lt;br /&gt;
Note that, just like chain files, &amp;quot;.script&amp;quot; files are also searched for in the font&#039;s directory first, then in the global &amp;quot;scripts&amp;quot; directory. This, again, allows you to bundle custom script files specific to a certain font.&lt;br /&gt;
&lt;br /&gt;
Each font sub-directory may also contain a &amp;quot;font.conf&amp;quot; file for font-specific configuration. These files are different from the chain and script files. They may contain font-specific offset and scaling settings, also for individual symbols of the respective font. Whenever a font is being loaded for drawing (also when it is loaded from other script files), that font&#039;s configuration is used.&lt;br /&gt;
&lt;br /&gt;
After all commands in a chain file have been executed, the created texture is written out to the &amp;quot;output&amp;quot; directory. By default, the name of the font directory is used for the texture&#039;s name (plus the image format&#039;s extension), but that name may be changed using script commands.&lt;br /&gt;
&lt;br /&gt;
== Script commands ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Will follow soon&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== How to obtain the tool ==&lt;br /&gt;
&lt;br /&gt;
The Python 2 code is available at [http://github.com/furware/text/tree/master/TextureCreator GitHub].&lt;br /&gt;
&lt;br /&gt;
Also, there is a pre-compiled package for Windows available from the [http://www.furware.de/products/text/TextureCreator.zip FURWARE website].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1180936</id>
		<title>FURWARE text/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1180936"/>
		<updated>2013-08-25T22:01:52Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
Diese Seite ist auch [[FURWARE_text|auf englisch]] verfügbar. / This page is also available [[FURWARE_text|in English]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text ist ein &#039;&#039;&#039;Skript zur Darstellung von Text&#039;&#039;&#039; mittels Texturen auf Prims. Es ist zum &#039;&#039;&#039;Einbau in deine Objekte&#039;&#039;&#039; gedacht in denen es von &#039;&#039;&#039;deinen eigenen Skripten&#039;&#039;&#039; gesteuert wird.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;ist keine&#039;&#039;&#039; vorgefertigte Anzeigetafel sondern ist für &#039;&#039;&#039;Skripter&#039;&#039;&#039; gedacht, die es in ihre eigene Kreationen integrieren.&lt;br /&gt;
&lt;br /&gt;
Das Skript war von 2010 bis Juli 2013 proprietär bis ich ({{User|Ochi Wolfe}}) mich dazu entschieden habe, es Open Source unter der MIT-Lizenz zu machen. Dies ist mein erster Versuch eines vollständig offenen Produkts in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Merkmale ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Nur ein Skript&#039;&#039;&#039; für eine ganze Gruppe (&amp;quot;sets&amp;quot;) von Anzeigetafeln&lt;br /&gt;
* &#039;&#039;&#039;Formatierung&#039;&#039;&#039; (Farbe, Alpha, Ausrichtung, Umbruch, Trimming, Font, Rahmen)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; mit 1-8 Zeichen, die je nur 0.5 Prims belegen&lt;br /&gt;
* &#039;&#039;&#039;Virtuelle Text-Boxen&#039;&#039;&#039; um Text beliebig zu Positionieren&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; um mehrere Stileinstellungen zusammenzufassen&lt;br /&gt;
&lt;br /&gt;
== Wo du das Skript bekommst ==&lt;br /&gt;
&lt;br /&gt;
Du kannst dir ein komplettes Paket inklusive dem Display Creator, Meshes und Schrift-Texturen auf [http://marketplace.secondlife.com/p/FURWARE-text/141379 dem Marketplace] holen.&lt;br /&gt;
&lt;br /&gt;
Für Entwickler und interessierte Benutzer habe ich für die Skripte außerdem einen Account auf [http://github.com/furware/text GitHub] erstellt.&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Unter den folgenden Unterseiten findest du eine Bedienungsanleitung sowie Dokumentation für Entwickler:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial/de|Erste Schritte &amp;amp; ausführliches Tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference/de|Kurzreferenz &amp;amp; Versionsgeschichte]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets/de|Hilfsfunktionen für einfachere Verwendung]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers/de|Dokumentation für Entwickler]]&lt;br /&gt;
&lt;br /&gt;
== Texture creator ==&lt;br /&gt;
&lt;br /&gt;
Auf [[FURWARE_text/TextureCreator/de|dieser]] Seite findest du mehr Informationen zum &amp;quot;texture creator&amp;quot;, mit dem du deine eigenen Schrifttexturen erstellen kannst.&lt;br /&gt;
&lt;br /&gt;
== Wie du helfen kannst ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Anwender:&#039;&#039;&#039; Eine wichtige Hilfe bei der Entwicklung dieses Skripts ist das Berichten von Problemen bei seiner Verwendung sowie Vorschläge, wie man die Benutzung noch besser machen kann. Momentan sind die wahrscheinlich besten Möglichkeiten hierfür {{User|Ochi Wolfe}} eine Notecard zu schreiben oder deine Kommentare zur Diskussion dieser Wiki-Seite hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Entwickler:&#039;&#039;&#039; Wenn du Vorschläge für die Verbesserung des Skripts hast kannst du diese gerne auf dieselbe Weise kundtun. Alternativ kannst du aber auch gerne einen Branch des Projekts auf [http://github.com/furware/text GitHub] erstellen und Pull-Requests senden. Bitte stelle sicher, dass die Änderungen von sehr guter Qualität sind und sie das Skript nicht weiter aufblähen als es sowieso schon ist. Genauergesagt sind Vorschläge zur Verbesserung der Performance und Senkung des Speicherverbrauchs &#039;&#039;&#039;äußerst&#039;&#039;&#039; gern gesehen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
Für die aktuelle Version sind keine Probleme bekannt. Falls welche auftreten, melde dies bitte.&lt;br /&gt;
&lt;br /&gt;
== To do ==&lt;br /&gt;
&lt;br /&gt;
Siehe bitte die [[FURWARE_text|englische Version dieser Seite]].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1180935</id>
		<title>FURWARE text/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1180935"/>
		<updated>2013-08-25T22:01:22Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Added texture creator link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
Diese Seite ist auch [[FURWARE_text|auf englisch]] verfügbar. / This page is also available [[FURWARE_text|in English]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text ist ein &#039;&#039;&#039;Skript zur Darstellung von Text&#039;&#039;&#039; mittels Texturen auf Prims. Es ist zum &#039;&#039;&#039;Einbau in deine Objekte&#039;&#039;&#039; gedacht in denen es von &#039;&#039;&#039;deinen eigenen Skripten&#039;&#039;&#039; gesteuert wird.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;ist keine&#039;&#039;&#039; vorgefertigte Anzeigetafel sondern ist für &#039;&#039;&#039;Skripter&#039;&#039;&#039; gedacht, die es in ihre eigene Kreationen integrieren.&lt;br /&gt;
&lt;br /&gt;
Das Skript war von 2010 bis Juli 2013 proprietär bis ich ({{User|Ochi Wolfe}}) mich dazu entschieden habe, es Open Source unter der MIT-Lizenz zu machen. Dies ist mein erster Versuch eines vollständig offenen Produkts in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Merkmale ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Nur ein Skript&#039;&#039;&#039; für eine ganze Gruppe (&amp;quot;sets&amp;quot;) von Anzeigetafeln&lt;br /&gt;
* &#039;&#039;&#039;Formatierung&#039;&#039;&#039; (Farbe, Alpha, Ausrichtung, Umbruch, Trimming, Font, Rahmen)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; mit 1-8 Zeichen, die je nur 0.5 Prims belegen&lt;br /&gt;
* &#039;&#039;&#039;Virtuelle Text-Boxen&#039;&#039;&#039; um Text beliebig zu Positionieren&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; um mehrere Stileinstellungen zusammenzufassen&lt;br /&gt;
&lt;br /&gt;
== Wo du das Skript bekommst ==&lt;br /&gt;
&lt;br /&gt;
Du kannst dir ein komplettes Paket inklusive dem Display Creator, Meshes und Schrift-Texturen auf [http://marketplace.secondlife.com/p/FURWARE-text/141379 dem Marketplace] holen.&lt;br /&gt;
&lt;br /&gt;
Für Entwickler und interessierte Benutzer habe ich für die Skripte außerdem einen Account auf [http://github.com/furware/text GitHub] erstellt.&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Unter den folgenden Unterseiten findest du eine Bedienungsanleitung sowie Dokumentation für Entwickler:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial/de|Erste Schritte &amp;amp; ausführliches Tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference/de|Kurzreferenz &amp;amp; Versionsgeschichte]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets/de|Hilfsfunktionen für einfachere Verwendung]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers/de|Dokumentation für Entwickler]]&lt;br /&gt;
&lt;br /&gt;
== Texture creator ==&lt;br /&gt;
&lt;br /&gt;
Auf [[FURWARE_text/TextureCreator|dieser]] Seite findest du mehr Informationen zum &amp;quot;texture creator&amp;quot;, mit dem du deine eigenen Schrifttexturen erstellen kannst.&lt;br /&gt;
&lt;br /&gt;
== Wie du helfen kannst ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Anwender:&#039;&#039;&#039; Eine wichtige Hilfe bei der Entwicklung dieses Skripts ist das Berichten von Problemen bei seiner Verwendung sowie Vorschläge, wie man die Benutzung noch besser machen kann. Momentan sind die wahrscheinlich besten Möglichkeiten hierfür {{User|Ochi Wolfe}} eine Notecard zu schreiben oder deine Kommentare zur Diskussion dieser Wiki-Seite hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Entwickler:&#039;&#039;&#039; Wenn du Vorschläge für die Verbesserung des Skripts hast kannst du diese gerne auf dieselbe Weise kundtun. Alternativ kannst du aber auch gerne einen Branch des Projekts auf [http://github.com/furware/text GitHub] erstellen und Pull-Requests senden. Bitte stelle sicher, dass die Änderungen von sehr guter Qualität sind und sie das Skript nicht weiter aufblähen als es sowieso schon ist. Genauergesagt sind Vorschläge zur Verbesserung der Performance und Senkung des Speicherverbrauchs &#039;&#039;&#039;äußerst&#039;&#039;&#039; gern gesehen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
Für die aktuelle Version sind keine Probleme bekannt. Falls welche auftreten, melde dies bitte.&lt;br /&gt;
&lt;br /&gt;
== To do ==&lt;br /&gt;
&lt;br /&gt;
Siehe bitte die [[FURWARE_text|englische Version dieser Seite]].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1180934</id>
		<title>FURWARE text</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1180934"/>
		<updated>2013-08-25T21:58:47Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Added texture creator link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
This page is also available [[FURWARE_text/de|in German]]. / Diese Seite ist auch [[FURWARE_text/de|auf deutsch]] verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text is a &#039;&#039;&#039;script for displaying text&#039;&#039;&#039; on prims using textures. It is intended to be &#039;&#039;&#039;integrated in your objects&#039;&#039;&#039; in which it will be controlled by &#039;&#039;&#039;your own scripts&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;is not&#039;&#039;&#039; a ready-made display board but is intented for &#039;&#039;&#039;scripters&#039;&#039;&#039; who wish to integrate it in their own creations.&lt;br /&gt;
&lt;br /&gt;
The script was proprietary from 2010 to July 2013 until I ({{User|Ochi Wolfe}}) have decided to make it open source under the MIT license. It is my first attempt to make a fully open sourced product in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Only one script&#039;&#039;&#039; for a whole group (&amp;quot;sets&amp;quot;) of displays&lt;br /&gt;
* &#039;&#039;&#039;Formatting&#039;&#039;&#039; (color, alpha, alignment, wrapping, trimming, font, borders)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; with 1 to 8 chars, only occupying 0.5 prims each&lt;br /&gt;
* &#039;&#039;&#039;Virtual text boxes&#039;&#039;&#039; to position text arbitrarily&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; for encapsulating multiple style settings&lt;br /&gt;
&lt;br /&gt;
== How to obtain the script ==&lt;br /&gt;
&lt;br /&gt;
You can obtain a complete package containing the script, the display creator, display meshes and font textures at [http://marketplace.secondlife.com/p/FURWARE-text/141379 the Marketplace].&lt;br /&gt;
&lt;br /&gt;
For developers and interested users, I have also set up a [http://github.com/furware/text GitHub] account for the core scripts.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
Please see the following subpages for the user&#039;s manual and developer documentation:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial|First steps &amp;amp; extensive tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference|Short reference &amp;amp; version history]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets|Helper functions for more convenient usage]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers|Developer documentation]]&lt;br /&gt;
&lt;br /&gt;
== Texture creator ==&lt;br /&gt;
&lt;br /&gt;
Please see [[FURWARE_text/TextureCreator|this page]] for information about the texture creator tool for making your own font textures.&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For users:&#039;&#039;&#039; A very important part of contribution to the development of this script is to report any problems you experience while using it as well as suggestions how to make using it even more awesome. For the time being, feel free to write a notecard to {{User|Ochi Wolfe}} or add your comments to the discussion of this wiki-page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For developers:&#039;&#039;&#039; If you have any suggestions for improvements to the script itself, you can either post them in the same way or you can branch the project on [http://github.com/furware/text GitHub] and send your pull requests. Just make sure that they are, of course, of awesome quality and that they don&#039;t bloat the script more than it already is bloated. In fact, any suggestions to improve performance and decrease memory consumption are &#039;&#039;&#039;very&#039;&#039;&#039; welcome.&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
No issues are known for the current release, but please report any problems you find.&lt;br /&gt;
&lt;br /&gt;
== To do ==&lt;br /&gt;
&lt;br /&gt;
There are still some things to do for the conversion into an open source project:&lt;br /&gt;
&lt;br /&gt;
* Check the documentation for errors.&lt;br /&gt;
* &amp;lt;s&amp;gt;Migrate the German documentation to the SL Wiki.&amp;lt;/s&amp;gt;&lt;br /&gt;
* Create developer documentation explaining concepts and ideas of the script. &#039;&#039;(in progress)&#039;&#039;&lt;br /&gt;
* Improve the font overview in the manual; make UUIDs copyable.&lt;br /&gt;
* I think there is a small bug in one of the images in the tutorial, I&#039;ll have to check that.&lt;br /&gt;
* Publish texture specifications. &#039;&#039;(in progress; developing texture creator)&#039;&#039;&lt;br /&gt;
* Publish mesh specifications.&lt;br /&gt;
* Add more useful comments to the scripts themselves.&lt;br /&gt;
* Clean up the scripts of the display creator and element initializer.&lt;br /&gt;
* &amp;lt;s&amp;gt;Migrate internal bug tracker, possibly to GitHub.&amp;lt;/s&amp;gt;&lt;br /&gt;
* Update the &amp;quot;FURWARE info board&amp;quot; to use the open source version of text.&lt;br /&gt;
* Make more open source example (controller) scripts.&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator&amp;diff=1180933</id>
		<title>FURWARE text/TextureCreator</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator&amp;diff=1180933"/>
		<updated>2013-08-25T21:55:20Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
The FURWARE texture creator is a tool to generate font textures from TrueType/OpenType font files. It is currently under development and documentation will follow soon.&lt;br /&gt;
&lt;br /&gt;
You can get the Python 2 source code at [http://github.com/furware/text/tree/master/TextureCreator].&lt;br /&gt;
&lt;br /&gt;
Also, there is a pre-compiled package for Windows available at [http://www.furware.de/products/text/TextureCreator.zip].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/de&amp;diff=1180932</id>
		<title>FURWARE text/TextureCreator/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator/de&amp;diff=1180932"/>
		<updated>2013-08-25T21:53:43Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
FURWARE texture creator ist ein Programm zur Erstellung von Schrifttexturen aus TrueType-/OpenType-Dateien. Es befindet sich momentan in der Entwicklung und eine Anleitung folgt bald.&lt;br /&gt;
&lt;br /&gt;
Du kannst den Python 2-Code unter [http://github.com/furware/text/tree/master/TextureCreator] beziehen.&lt;br /&gt;
&lt;br /&gt;
Außerdem ist ein vorkompiliertes Paket für Windows unter [http://www.furware.de/products/text/TextureCreator.zip] verfügbar.&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator&amp;diff=1180931</id>
		<title>FURWARE text/TextureCreator</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/TextureCreator&amp;diff=1180931"/>
		<updated>2013-08-25T21:49:10Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
The FURWARE texture creator is a tool to generate font textures from TrueType/OpenType font files. It is currently under development and documentation will follow soon.&lt;br /&gt;
&lt;br /&gt;
You can get raw the Python 2 code at [http://github.com/furware/text/tree/master/TextureCreator].&lt;br /&gt;
&lt;br /&gt;
Also, there is a pre-compiled &amp;quot;convenience package&amp;quot; for Windows available at [http://www.furware.de/products/text/TextureCreator.zip].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Reference/de&amp;diff=1180218</id>
		<title>FURWARE text/Reference/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Reference/de&amp;diff=1180218"/>
		<updated>2013-07-20T12:11:55Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: /* Versionsgeschichte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kurzreferenz ==&lt;br /&gt;
&lt;br /&gt;
Dieses Kapitel ist als eine knappe Zusammenfassung aller Dinge gedacht, die zur Arbeit mit FURWARE text nötig sind. Das sind vor allem die Namen und Parameter der verschiedenen Befehle. Das Kapitel ist nicht als Ersatz für das Tutorial gedacht.&lt;br /&gt;
&lt;br /&gt;
=== Befehle ===&lt;br /&gt;
&lt;br /&gt;
==== fw_data &amp;amp; fw_conf ====&lt;br /&gt;
&lt;br /&gt;
Box-Einstellung für Text (fw_data) und Stil (fw_conf)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some new text&amp;quot;,   &amp;quot;fw_data : BoxSpec : BoxSpec : BoxSpec : ...&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_conf : BoxSpec : BoxSpec : BoxSpec : ...&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jedes &amp;quot;&#039;&#039;&#039;BoxSpec&#039;&#039;&#039;&amp;quot; kann hierbei verschiedene Formen haben um verschiedene Boxen auszuwählen. Seien in der folgenden Tabelle &amp;quot;BoxOne&amp;quot; und &amp;quot;BoxTwo&amp;quot; zwei gültige Box-Namen aus demselben Display-Set:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
! BoxSpec&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| (leer)&lt;br /&gt;
| Alle Boxen in allen Sets.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne&lt;br /&gt;
| Genau die Box &amp;quot;BoxOne&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne ; BoxTwo&lt;br /&gt;
| Alle Boxen zwischen* (und inklusive) &amp;quot;BoxOne&amp;quot; und &amp;quot;BoxTwo&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne ;&lt;br /&gt;
| &amp;quot;BoxOne&amp;quot; und alle folgenden* Boxen im selben Display-Set.&lt;br /&gt;
|-&lt;br /&gt;
| ; BoxTwo&lt;br /&gt;
| &amp;quot;BoxTwo&amp;quot; und alle davorliegenden* Boxen im selben Display-Set.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Abhängig von der Reihenfolge, in denen die Boxen hinzugefügt wurden.&lt;br /&gt;
&lt;br /&gt;
==== fw_defaultconf ====&lt;br /&gt;
&lt;br /&gt;
Setzt globale Stilvoreinstellungen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf : root&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf : nonroot&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die drei Varianten setzen die Stilvoreinstellung für alle Boxen, alle Root-Boxen bzw. alle Nicht-Root-Boxen.&lt;br /&gt;
&lt;br /&gt;
==== fw_var ====&lt;br /&gt;
&lt;br /&gt;
Speichert einen String in einem &amp;quot;Variablennamen&amp;quot;. Dies wird momentan nur für Stilvorlangen verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some string&amp;quot;, &amp;quot;fw_var : varName&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setzt den Inhalt der Variable &amp;quot;varName&amp;quot; auf &amp;quot;Some string&amp;quot;. Variablen können gelöscht werden, indem ihnen der leere String zugewiesen wird.&lt;br /&gt;
&lt;br /&gt;
==== fw_addbox ====&lt;br /&gt;
&lt;br /&gt;
Fügt eine neue virtuelle Textbox hinzu. Es kann höchstens 16 Boxen pro Set (inklusive der Basis-Box) geben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some initial text&amp;quot;, &amp;quot;fw_addbox : boxName : parentName : dx, dy, sx, sy : stylePrefs&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe das Tutorial für Details.&lt;br /&gt;
&lt;br /&gt;
==== fw_delbox ====&lt;br /&gt;
&lt;br /&gt;
Löscht eine oder mehrere Textboxen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox : boxOne : boxTwo : ...&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Löscht die Textboxen &amp;quot;boxOne&amp;quot;, &amp;quot;boxTwo&amp;quot;, usw.&lt;br /&gt;
&lt;br /&gt;
==== fw_touchquery ====&lt;br /&gt;
&lt;br /&gt;
Führt eine Anfrage aus, welche Box wo geklickt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;userData&amp;quot;, &amp;quot;fw_touchquery : linkNumber : faceNumber&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Antwort hat die Form (Pseudo-Code):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
link_message(..., ..., &amp;quot;boxName:dx:dy:rootName:x:y:userData&amp;quot;, &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe das Tutorial für Details.&lt;br /&gt;
&lt;br /&gt;
==== fw_notify ====&lt;br /&gt;
&lt;br /&gt;
Aktiviere oder deaktiviere Benachrichtigungen per Link Message wenn das Aktualisieren der Anzeige fertig ist. Standardmäßig aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;on&amp;quot;, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;off&amp;quot;, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Benachrichtigungen aktiviert sind, sendet das Textskript eine Link Message in welcher &amp;quot;id&amp;quot; auf &amp;quot;fw_done&amp;quot; gesetzt ist wenn alle ausstehendenen Aktualisierungen der Anzeige durchgeführt wurden.&lt;br /&gt;
&lt;br /&gt;
==== fw_memory ====&lt;br /&gt;
&lt;br /&gt;
Teilt dem Besitzer des Objekts mit wie viel Speicher verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fw_reset ====&lt;br /&gt;
&lt;br /&gt;
Setzt das Textskript vollständig zurück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Wenn das Zurücksetzen abgeschlossen ist sendet das Skript an alle Prims eine Link Message, in der der &amp;quot;id&amp;quot;-Parameter auf &amp;quot;fw_ready&amp;quot; gesetzt ist. Dadurch weiß man wann das Skript wieder Befehle entgegennehmen kann.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Setze das Skript nur zurück wenn es nötig ist. Die Initialisierung ist eine relativ aufwendige Operation und das Textskript ist für einen Moment nicht verfügbar.}}&lt;br /&gt;
&lt;br /&gt;
=== Style settings ===&lt;br /&gt;
&lt;br /&gt;
Stil- und Formateinstellungen werden durch spezielle Strings angegeben. Diese werden für globale Einstellungen, Einstellungen pro Box (&amp;quot;fw_conf&amp;quot;) und für Einstellungen direkt im Text (inline) verwendet.&lt;br /&gt;
&lt;br /&gt;
Eine einzelne Einstellung wird als &#039;&#039;&#039;key=value&#039;&#039;&#039;-Paar angegeben, z.B. &#039;&#039;&#039;c=red&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Mehrere Einstellungen werden durch &amp;quot;&#039;&#039;&#039;;&#039;&#039;&#039;&amp;quot; getrennt, z.B. &#039;&#039;&#039;c=red; a=center; w=none&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
In der folgenden Tabelle: &#039;&#039;Kursiv&#039;&#039; = Standardwert&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
! Einstellung&lt;br /&gt;
! Schlüssel&lt;br /&gt;
! Werte&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Schriftfarbe&lt;br /&gt;
| c&lt;br /&gt;
| R,G,B&lt;br /&gt;
| Schriftfarbe als Rot, Grün, Blau (jeweils im Bereich 0.0-1.0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| R,G,B,A&lt;br /&gt;
| Schriftfarbe als Rot, Grün, Blau, Alpha (jeweils im Bereich 0.0-1.0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| rand&lt;br /&gt;
| Zufällige Farbe (mit Alpha = 1)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| (vordefiniert)&lt;br /&gt;
| Vordefinierte Farbe, siehe Tabelle unten&lt;br /&gt;
|-&lt;br /&gt;
| Ausrichtung&lt;br /&gt;
| a&lt;br /&gt;
| &#039;&#039;left&#039;&#039;&lt;br /&gt;
| Ausrichtung links&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| center&lt;br /&gt;
| Ausrichtung zentriert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| right&lt;br /&gt;
| Ausrichtung rechts&lt;br /&gt;
|-&lt;br /&gt;
| Umbruch&lt;br /&gt;
| w&lt;br /&gt;
| &#039;&#039;word&#039;&#039;&lt;br /&gt;
| Möglichst nach Wörtern umbrechen&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| char&lt;br /&gt;
| An jeder beliebigen Stelle umbrechen&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| none&lt;br /&gt;
| Kein Umbruch; schneidet überlange Zeilen ab&lt;br /&gt;
|-&lt;br /&gt;
| Trimmen&lt;br /&gt;
| t&lt;br /&gt;
| &#039;&#039;on&#039;&#039;&lt;br /&gt;
| Schneidet Leerzeichen von Anfang und Ende jeder Zeile ab&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| off&lt;br /&gt;
| Behält Leerzeichen bei (außer bei wrap=word)&lt;br /&gt;
|-&lt;br /&gt;
| Schriftart&lt;br /&gt;
| f&lt;br /&gt;
| (UUID/name)&lt;br /&gt;
| Setzt die Schrift-Textur auf UUID oder Name&lt;br /&gt;
|-&lt;br /&gt;
| Rahmen&lt;br /&gt;
| border&lt;br /&gt;
| {trblTRBL12}&lt;br /&gt;
| Stellt den Rahmen von Boxen ein&lt;br /&gt;
|-&lt;br /&gt;
| Stilvorlage&lt;br /&gt;
| style&lt;br /&gt;
| (Style name)&lt;br /&gt;
| Verwendet einen mit fw_var definierten Stil&lt;br /&gt;
|-&lt;br /&gt;
| Inline styles&lt;br /&gt;
| tags&lt;br /&gt;
| &#039;&#039;on&#039;&#039;&lt;br /&gt;
| Aktiviert die Verwendung von inline styles&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| off&lt;br /&gt;
| Deaktiviert die Verwendung von inline styles&lt;br /&gt;
|-&lt;br /&gt;
| Force refresh&lt;br /&gt;
| force&lt;br /&gt;
| on&lt;br /&gt;
| Aktiviert die erzwungene Aktualierung aller Faces (deaktiviert Optimierungen!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;off&#039;&#039;&lt;br /&gt;
| Deaktiviert die erzwungene Aktualisierung alles Faces (ermöglicht Optimierungen)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vordefinierte Farben ===&lt;br /&gt;
&lt;br /&gt;
Du kannst die Folgenden Namen anstelle von vektoriellen Farbangeben in Stilen verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_colors.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Schriftarten ===&lt;br /&gt;
&lt;br /&gt;
Die hier angegebenen Schriftarten kannst du mit der &amp;quot;&#039;&#039;&#039;f=...&#039;&#039;&#039;&amp;quot;-Stilangabe entweder durch Angabe ihrer UUID verwenden oder indem du die zugehörige Textur (diese sind Teil des FURWARE text-Pakets) in dein Objekt legst und dann den Texturnamen benutzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_fonts.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versionsgeschichte ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fehler behoben, der beim Anzeigen von Zeichen, die nicht in der Textur-Spezifikation enthalten sind, unerwartetes Verhalten verursachen konnte.&lt;br /&gt;
* Der Set Pointer einer Box wird jetzt bit-packed zusammen mit dem restlichen Box Status gespeichert. Das verkürzt die Länge eines Strides in boxDataList um 1.&lt;br /&gt;
* Nachricht über freien Speicher beim Skript-Start entfernt.&lt;br /&gt;
* getNumberOfPrims()-Funktion entfernt.&lt;br /&gt;
* Der Test, ob wenigstens ein Set verfügbar ist, wurde an den Anfang des link_message()-Handlers verschoben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Das Skript wurde unter der MIT-Lizenz als Open Source veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0-Beta1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Funktionalität von &amp;quot;fw_data&amp;quot; und &amp;quot;fw_conf&amp;quot; wurde überarbeitet um sie (hoffentlich) intuitiver zu machen.&lt;br /&gt;
* Mit den Befehlen &amp;quot;fw_data&amp;quot;, &amp;quot;fw_conf&amp;quot; und &amp;quot;fw_delbox&amp;quot; können nun auch mehrere Boxen auf einmal modifiziert werden.&lt;br /&gt;
* Befehl &amp;quot;fw_defaultconf&amp;quot; hinzugefügt. Momentan für globale Stileinstellungen verwendet.&lt;br /&gt;
* Touch replies liefern jetzt auch den Namen der Root-Box und die absoluten Koordinaten.&lt;br /&gt;
* Stilattribut &amp;quot;force&amp;quot; hinzugefügt um stets alle Faces zu aktualisieren (nützlich für Schriften in denen das Leerzeichen nicht vollständig transparent ist).&lt;br /&gt;
* Optimierte Verarbeitung wenn mehrere &amp;quot;ähnliche&amp;quot; Befehle (z.B. &amp;quot;fw_delbox&amp;quot;) schnell hintereinander ankommen.&lt;br /&gt;
* Überprüfung hinzugefügt ob das Board überhaupt erfolgreich initialisiert wurde bevor Befehle angenommen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0-Beta0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Mesh Prims mit bis zu 8 Buchstaben pro Prim, die jeweils 0.5 Prims belegen&lt;br /&gt;
* Virtuelle Text-Boxen um Text beliebig zu positionieren&lt;br /&gt;
* Style templates zum Speichern von Formatierungseinstellungen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Die Entwicklerversion erlaubt jetzt eine Weitergabe entweder als +copy/-trans oder -copy/+trans&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.0.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Geschwindigkeit verbessert&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Erste veröffentlichte Version&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Reference&amp;diff=1180216</id>
		<title>FURWARE text/Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Reference&amp;diff=1180216"/>
		<updated>2013-07-20T12:07:57Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: /* Version history */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference manual ==&lt;br /&gt;
&lt;br /&gt;
This chapter is meant to be a quick overview of pretty much everything necessary to use FURWARE text, especially which names and parameters go where. It is &#039;&#039;&#039;not&#039;&#039;&#039; meant to replace the tutorial in any way.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
&lt;br /&gt;
==== fw_data &amp;amp; fw_conf ====&lt;br /&gt;
&lt;br /&gt;
Per-box settings for text (fw_data) and style (fw_conf)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some new text&amp;quot;,   &amp;quot;fw_data : BoxSpec : BoxSpec : BoxSpec : ...&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_conf : BoxSpec : BoxSpec : BoxSpec : ...&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each &amp;quot;&#039;&#039;&#039;BoxSpec&#039;&#039;&#039;&amp;quot; can have different forms to select different boxes. In the following table, let &amp;quot;BoxOne&amp;quot; and &amp;quot;BoxTwo&amp;quot; be two valid box names in the same display set:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
! BoxSpec&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| (empty)&lt;br /&gt;
| All boxes in all sets.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne&lt;br /&gt;
| Only the box &amp;quot;BoxOne&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne ; BoxTwo&lt;br /&gt;
| All Boxes between* (and including) &amp;quot;BoxOne&amp;quot; and &amp;quot;BoxTwo&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| BoxOne ;&lt;br /&gt;
| &amp;quot;BoxOne&amp;quot; and all following* boxes in the same display set.&lt;br /&gt;
|-&lt;br /&gt;
| ; BoxTwo&lt;br /&gt;
| &amp;quot;BoxTwo&amp;quot; and all preceding* boxes in the same display set.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Depending on the order in which the boxes were added.&lt;br /&gt;
&lt;br /&gt;
==== fw_defaultconf ====&lt;br /&gt;
&lt;br /&gt;
Sets global style preferences&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf : root&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;c=red; a=center&amp;quot;, &amp;quot;fw_defaultconf : nonroot&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The three variants set the global style preferences for all boxes, all root-boxes and all non-root boxes.&lt;br /&gt;
&lt;br /&gt;
==== fw_var ====&lt;br /&gt;
&lt;br /&gt;
Store some string data in a &amp;quot;variable&amp;quot; name. Currently only used for style templates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some string&amp;quot;, &amp;quot;fw_var : varName&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets the contents of variable &amp;quot;varName&amp;quot; to &amp;quot;Some string&amp;quot;. You can delete variables by passing the empty string as data.&lt;br /&gt;
&lt;br /&gt;
==== fw_addbox ====&lt;br /&gt;
&lt;br /&gt;
Adds a new virtual text box. There can be at most 16 boxes per set (including the root box).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;Some initial text&amp;quot;, &amp;quot;fw_addbox : boxName : parentName : dx, dy, sx, sy : stylePrefs&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please see the tutorial for details.&lt;br /&gt;
&lt;br /&gt;
==== fw_delbox ====&lt;br /&gt;
&lt;br /&gt;
Deletes one or more text boxes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox : boxOne : boxTwo : ...&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deletes the boxes named &amp;quot;boxOne&amp;quot;, &amp;quot;boxTwo&amp;quot;, etc.&lt;br /&gt;
&lt;br /&gt;
==== fw_touchquery ====&lt;br /&gt;
&lt;br /&gt;
Performs a query which box has been touched where.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;userData&amp;quot;, &amp;quot;fw_touchquery : linkNumber : faceNumber&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The reply has the form (pseudo code):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
link_message(..., ..., &amp;quot;boxName:dx:dy:rootName:x:y:userData&amp;quot;, &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please see the tutorial for details.&lt;br /&gt;
&lt;br /&gt;
==== fw_notify ====&lt;br /&gt;
&lt;br /&gt;
Enable or disable link message notifications when the script has done rendering. Off by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;on&amp;quot;, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;off&amp;quot;, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When notifications are enabled, the text script will send a link message with &amp;quot;id&amp;quot; set to &amp;quot;fw_done&amp;quot; to the whole linkset to let you know when all pending rendering actions have been completed.&lt;br /&gt;
&lt;br /&gt;
==== fw_memory ====&lt;br /&gt;
&lt;br /&gt;
Tells the owner how much memory is available.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fw_reset ====&lt;br /&gt;
&lt;br /&gt;
Performs a full reset on the text script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{KBtip|When the reset has completed, the script sends a link message with &amp;quot;id&amp;quot; set to &amp;quot;fw_ready&amp;quot; to all prims in the linkset. This tells you when the script is ready to take further commands.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Only reset the text script if necessary. Initialization is a quite expensive operation and the script will not be available to take commands for a few seconds.}}&lt;br /&gt;
&lt;br /&gt;
=== Style settings ===&lt;br /&gt;
&lt;br /&gt;
Text styles and format settings are specified using special strings. They are used for global and per-box settings (&amp;quot;fw_conf&amp;quot;) as well as for specifying styles directly within the text (inline styles).&lt;br /&gt;
&lt;br /&gt;
A single setting is given as a &#039;&#039;&#039;key=value&#039;&#039;&#039; pair, for example &#039;&#039;&#039;c=red&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Multiple settings are separated by &amp;quot;&#039;&#039;&#039;;&#039;&#039;&#039;&amp;quot;, for example &#039;&#039;&#039;c=red; a=center; w=none&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
In the following table: &#039;&#039;Italic&#039;&#039; = Default&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
! Setting&lt;br /&gt;
! Key&lt;br /&gt;
! Values&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Font color&lt;br /&gt;
| c&lt;br /&gt;
| R,G,B&lt;br /&gt;
| Font color as red, green, blue (each in range 0.0-1.0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| R,G,B,A&lt;br /&gt;
| Font color as red, green, blue, alpha (each in range 0.0-1.0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| rand&lt;br /&gt;
| Random color (with alpha = 1)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| (predefined)&lt;br /&gt;
| Predefined color, see table below&lt;br /&gt;
|-&lt;br /&gt;
| Alignment&lt;br /&gt;
| a&lt;br /&gt;
| &#039;&#039;left&#039;&#039;&lt;br /&gt;
| Alignment left&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| center&lt;br /&gt;
| Alignment centered&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| right&lt;br /&gt;
| Alignment right&lt;br /&gt;
|-&lt;br /&gt;
| Wrapping&lt;br /&gt;
| w&lt;br /&gt;
| &#039;&#039;word&#039;&#039;&lt;br /&gt;
| Wrap after words, if possible&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| char&lt;br /&gt;
| Wrap at any position&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| none&lt;br /&gt;
| No wrapping; cuts overlong lines&lt;br /&gt;
|-&lt;br /&gt;
| Trimming&lt;br /&gt;
| t&lt;br /&gt;
| &#039;&#039;on&#039;&#039;&lt;br /&gt;
| Trims whitespace from beginning and end of lines&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| off&lt;br /&gt;
| Keeps whitespace (except with wrap=word)&lt;br /&gt;
|-&lt;br /&gt;
| Font&lt;br /&gt;
| f&lt;br /&gt;
| (UUID/name)&lt;br /&gt;
| Sets the font texture to UUID or name&lt;br /&gt;
|-&lt;br /&gt;
| Borders&lt;br /&gt;
| border&lt;br /&gt;
| {trblTRBL12}&lt;br /&gt;
| Specifies the style of box borders&lt;br /&gt;
|-&lt;br /&gt;
| Style template&lt;br /&gt;
| style&lt;br /&gt;
| (Style name)&lt;br /&gt;
| Uses a style defined using fw_var&lt;br /&gt;
|-&lt;br /&gt;
| Inline styles&lt;br /&gt;
| tags&lt;br /&gt;
| &#039;&#039;on&#039;&#039;&lt;br /&gt;
| Enables usage of inline styles&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| off&lt;br /&gt;
| Disables usage of inline styles&lt;br /&gt;
|-&lt;br /&gt;
| Force refresh&lt;br /&gt;
| force&lt;br /&gt;
| on&lt;br /&gt;
| Enables forced refresh of all faces (disables optimizations!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &#039;&#039;off&#039;&#039;&lt;br /&gt;
| Disables forced refresh of all faces (enables optimizations)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Predefined colors ===&lt;br /&gt;
&lt;br /&gt;
You may use the following names in place of color vectors in styles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_colors.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fonts ===&lt;br /&gt;
&lt;br /&gt;
You can use the fonts listed here with the &amp;quot;&#039;&#039;&#039;f=...&#039;&#039;&#039;&amp;quot; style setting either by using their UUID or by putting the corresponding texture item (included in the FURWARE text package) into your object and then use the texture&#039;s name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_fonts.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Version history ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Fixed an issue where characters that are not part of the font texture specification would cause unexpected behavior.&lt;br /&gt;
* A box&#039;s set pointer is now stored bit-packed together with the rest of its status. This decreases the length of a stride in boxDataList by 1.&lt;br /&gt;
* Removed message about free memory on script startup.&lt;br /&gt;
* Removed getNumberOfPrims()-function.&lt;br /&gt;
* Moved the check if we have any sets at all to the beginning of the link_message()-handler.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Made the script open source under the MIT license.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0-Beta1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The functionality of &amp;quot;fw_data&amp;quot; and &amp;quot;fw_conf&amp;quot; has been reworked to (hopefully) make it more intuitive.&lt;br /&gt;
* The commands &amp;quot;fw_data&amp;quot;, &amp;quot;fw_conf&amp;quot;, and &amp;quot;fw_delbox&amp;quot; are now able to modify multiple boxes at once.&lt;br /&gt;
* Added &amp;quot;fw_defaultconf&amp;quot; command. Currently used to configure global style settings.&lt;br /&gt;
* Touch replies now also contain the name of the root box and the absolute coordinates.&lt;br /&gt;
* Added &amp;quot;force&amp;quot; style attribute to force refresh of all faces (useful for fonts where whitespace is not completely transparent).&lt;br /&gt;
* Optimized handling when multiple &amp;quot;similar&amp;quot; commands (e.g. &amp;quot;fw_delbox&amp;quot;) come in quickly.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.0-Beta0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Mesh prims with up to 8 characters per prim, each occupying 0.5 prims&lt;br /&gt;
* Virtual text boxes for aligning text arbitrarily&lt;br /&gt;
* Style templates for saving format settings&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The developer version now allows distribution of the script as +copy/-trans or -copy/+trans&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.0.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Improved speed&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* First released version&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Developers/de&amp;diff=1180215</id>
		<title>FURWARE text/Developers/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Developers/de&amp;diff=1180215"/>
		<updated>2013-07-20T12:04:57Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Updated to reflect changes in v2.0.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Seite beinhaltet technische Informationen zu [[FURWARE_text/de|FURWARE text]] und richtet sich an Entwickler und interessierte Benutzer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Wenn du mehr zu einem bestimmten Thema wissen möchtest, hinterlasse bitte eine Notiz auf der Diskussionsseite. :)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Terminologie und Hierarchien ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein &amp;quot;&#039;&#039;&#039;Set&#039;&#039;&#039;&amp;quot; bezeichnet ein Text-Display, das aus in Zeilen und Spalten angeordneten Prims besteht. Jedes Set hat einen Namen, der in der Regel mithilfe des Display Creators gesetzt wird. Ein Linkset kann mehrere Sets enthalten.&lt;br /&gt;
&lt;br /&gt;
Eine &amp;quot;&#039;&#039;&#039;Box&#039;&#039;&#039;&amp;quot; ist eine virtuelle Text-Box innerhalb eines Sets. Jedes Set hat immer eine (Root-)Box mit derselben Größe und demselben Namen wie das Set. Jeder Box wird beim Erstellen ein Name zugewiesen (per Parameter des &#039;&#039;fw_addbox&#039;&#039;-Befehls). Zu einem Set können mehrere Boxen hinzugefügt werden, die dann in Layern übereinandergelegt dargestellt werden (in der Reihenfolge, in der sie hinzugefügt wurden).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Daraus folgen einige Zusammenhänge:&lt;br /&gt;
&lt;br /&gt;
* Eine Box ist immer Teil von einem Set und liegt vollständig innerhalb von diesem.&lt;br /&gt;
* Ein Set besteht aus einem oder mehreren Prims.&lt;br /&gt;
* Ein Prim kann mehrere Faces haben.&lt;br /&gt;
* Jedes Face stellt ein Zeichen des Texts dar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Text-Inhalt einer Box wird oft als &amp;quot;&#039;&#039;&#039;data&#039;&#039;&#039;&amp;quot; der Box bezeichnet (&amp;quot;data&amp;quot; wird aber auch in allgemeinerem Zusammenhang verwendet).&lt;br /&gt;
&lt;br /&gt;
Der Text-Stil einer Box (oder Textabschnitten) wird oft als &amp;quot;&#039;&#039;&#039;conf&#039;&#039;&#039;&amp;quot; (der Box) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datenstrukturen für Box-, Set- und Prim-Informationen ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die meisten Informationen zur Geometrie und zum Inhalt des Displays werden in einigen [[list|Listen]] gespeichert. Einige [[list|Listen]] enthalten auch Indizes (&amp;quot;Pointer&amp;quot;) zu Daten in anderen [[list|Listen]].&lt;br /&gt;
&lt;br /&gt;
=== Box-Informationen ===&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;boxNameList&amp;quot; ist eine einfache [[list|Liste]] der Namen aller Boxen. Der Grund dafür, dass die Namen in einer separaten [[list|Liste]] vorgehalten werden (und nicht als Teil von &amp;quot;boxDataList&amp;quot;, siehe unten) ist, dass die Namen schnell durchsuchbar sein sollen. Das ist beispielsweise nötig wenn neuer Text gesetzt werden soll und der Index einer Box ermittelt werden muss anhand ihres Namens.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;boxDataList&amp;quot; ist eine [[:Category:LSL_List#Strided_lists|Strided List]], die mehr Informationen zu jeder Box enthält. Ein Stride enthält:&lt;br /&gt;
** Den Text der Box ([[string]]).&lt;br /&gt;
** Die Textstil-Einstellung der Box ([[string]]).&lt;br /&gt;
** Einen bit-packed [[integer]], der den Layer der Box (4 Bits), den Index des Sets, zu dem die Box gehört (8 Bits), dirty flags (2 bits), zwei reservierte Bits und die &amp;quot;Layer Override&amp;quot;-Bits (16 Bits) enthält.&lt;br /&gt;
** Die Geometrie der box (Spalten-Offset, Zeilen-Offset, Breite, Höhe) ([[rotation]]).&lt;br /&gt;
&lt;br /&gt;
=== Set-Informationen ===&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;setDataList&amp;quot; ist eine [[:Category:LSL_List#Strided_lists|Strided List]], die Informationen zu jedem Set enthält. Ein Stride enthält:&lt;br /&gt;
** Die Geometrie des Sets (Anzahl von Prim-Spalten und -Zeilen, Anzahl der Faces) ([[vector]]).&lt;br /&gt;
** Einen Pointer zum Beginn der Prim-Informationen in den &amp;quot;prim*List&amp;quot;-Listen ([[integer]]).&lt;br /&gt;
&lt;br /&gt;
=== Prim-Informationen ===&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;primLinkList&amp;quot; enthält die Link-Nummern der einzelnen Prims, sortiert zuerst nach Set, dann nach Zeilen, dann nach Spalten. Die Link-Nummern sind nicht bit-packed, weil sie schnell durchsuchbar sein sollen, etwa wenn Touch Queries bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;primFillList&amp;quot; enthält bit-packed Integer, die den Status der einzelnen Faces auf den Prims enthalten. &amp;quot;Der Status&amp;quot; bedeutet hier, ob die Faces momenten ein Leerzeichen anzeigen oder nicht. Diese Information wird als Cache benutzt um unnötige SetPrimitiveParams-Aufrufe zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;primLayerList&amp;quot; enthält bit-packed Integer, die die Zuordnung von Faces zu Layern beinhaltet. Die 32 Bits des Integers sind dabei in je 4 Bits für jedes Face geteilt und somit kann jedem Face eine von 16 Layer-IDs zugeteilt werden. Diese Information wird während des Renderns verwendet um schnell feststellen zu können, welcher Layer an der Position dieses Faces gerade im Vordergrund liegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Grundlegender Ablauf der Events ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das folgende Bild ist ein Versuch, die grundlegenden Zusammenhänge von Events und Funktionen im FURWARE text-Skript darzustellen, wenn ein Befehl empfangen wird, der den Inhalt oder das Layout des Displays verändert (eine deutsche Übersetzung folgt).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_basic_event_flow.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Initialisierungs-Routine ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To do&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der [[link_message]](...)-Handler ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To do&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die setDirty(...)-Funktion ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht zwischen dem Entgegennehmen von Befehlen in [[link_message]](...) und dem tatsächlichen (Neu-)Zeichnen in refresh(...). Sie besitzt folgende Parameter:&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; action ===&lt;br /&gt;
&lt;br /&gt;
Kann einen der Werte der Konstanten ACTION_CONTENT, ACTION_ADD_BOX oder ACTION_DEL_BOX annehmen. Dieser Wert gibt an, welche &#039;&#039;Art&#039;&#039; von Kommando ausgeführt werden soll (beispielsweise ist das Setzen von neuem Text von der Art ACTION_CONTENT). Der übergebene Wert wird als globale Variable gespeichert und beim nächsten Aufruf von refresh(...) wieder zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
Der Grund dafür, dass wir uns diesen Wert merken, ist das &#039;&#039;zeitverzögerte Aktualisieren&#039;&#039; des Displays (welches im Übrigen einer der Gründe ist, weshalb setDirty(...) als Puffer zwischen Parsen und Refreshen überhaupt eingebaut wurde). Am Ende von setDirty(...) wird ein Timer mit einem recht kurzen Intervall gestartet. Das [[timer]]()-Event ruft dann lediglich refresh() auf. Allerdings können in dieser kurzen Zeit noch weitere [[link_message]](...)-Events empfangen und verarbeitet werden, was uns erlaubt, mehrere Befehle zu sammeln bevor wir das Display tatsächlich aktualisieren (beispielsweise das Setzen von Text mehrerer verschiedener Boxen). Dies kann in manchen Situationen einen großen Geschwindigkeitsvorteil bringen. Beachte, dass der Timer nicht neugestartet wird, wenn die letzte Aktion bereits auf etwas anderes als [[FALSE|0]] gesetzt ist. Das &amp;quot;garantiert&amp;quot; uns, dass das [[timer]]()-Event irgendwann ausgeführt wird, selbst wenn wir einen konstanten Strom von Befehlen empfangen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Es gibt allerdings einen Haken an der Sache.&#039;&#039; Wenn wir alle verschiedenen Arten von Befehlen wie das Setzen von Text, Stilen, Variablen, das Hinzufügen und Entfernen von Boxen sammeln würden ohne zu geeigneten Zeitpunkten zu aktualisieren, würden wir irgendwann ein Durcheinander und kaputte Datenstrukturen haben (du darfst gerne über die Details nachdenken, aber es verursacht Kopfschmerzen). Hier kommt die Unterscheidung zwischen den verschiedenen Arten von Aktionen ins Spiel.&lt;br /&gt;
&lt;br /&gt;
Operationen, die lediglich den &amp;quot;Inhalt&amp;quot; von Boxen verändern sind gewissermaßen &amp;quot;kompatibel&amp;quot; zueinander und können gesammelt werden, da die Indizes der Listen mit Box-Informationen und der Layer während der Änderungen &#039;&#039;konstant&#039;&#039; bleiben. Operationen, die &#039;&#039;Boxen hinzufügen&#039;&#039; können ebenfalls gesammelt werden, da die Informationen lediglich zu einigen [[list|Listen]] hinzugefügt werden und wir dann die neuen Boxen auf einmal aktualisieren können. Operationen, die &#039;&#039;Boxen löschen&#039;&#039; können gesammelt werden, da wir uns im Grunde nur merken müssen, welche Layer wieder freigeworden sind. Anschließend können wir durch die verbliebenen Boxen gehen und diese entsprechend neu zeichnen.&lt;br /&gt;
&lt;br /&gt;
Da das &#039;&#039;Mischen&#039;&#039; der verschiedenen Arten von Operationen &#039;&#039;ungut&#039;&#039; ist, prüft der Handler wenn ein neuer Befehl hereinkommt, ob die neue Operation mit der vorherigen kompatibel ist (das heißt, &amp;quot;Art der letzten Operation&amp;quot; == &amp;quot;Art der neuen Operation&amp;quot;) und wenn sie dies nicht ist, wird ein &#039;&#039;sofortiges&#039;&#039; Aktualisieren erzwungen bevor der Befehl verarbeitet wird. Beachte, dass nur die &#039;&#039;Art&#039;&#039; der Operation gleich sein muss, nicht der genaue Befehl; beispielsweise sind die Befehle fw_data und fw_conf zueinander kompatibel, da beide den Typ ACTION_CONTENT besitzen.&lt;br /&gt;
&lt;br /&gt;
Beachte weiterhin, dass die Art der Operation die Arbeitsweise der refresh()-Funktion beeinflusst; bitte siehe den entsprechenden Abschnitt für Einzelheiten.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; first / last ===&lt;br /&gt;
&lt;br /&gt;
Das Intervall von Box-Indizes, auf denen gearbeitet werden soll. Dies erlaubt uns direkt auf einer ganzen Reihe von Boxen auf einmal zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; isConf ===&lt;br /&gt;
&lt;br /&gt;
Kann entweder [[FALSE|0]] oder [[TRUE|1]] sein. Dieser Wert wird dazu benutzt um festzustellen, ob etwaig übergebene Daten als data oder conf der Box(en) gespeichert werden sollen. Außerdem wird das (Neu-)Zeichnen der Rahmen von Boxen erzwungen, wenn isConf [[TRUE|1]] ist, da sich dieser geändert haben könnte.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; newLayerOverrideBits ===&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle wird es ein wenig knifflig. :) Bevor wir uns um den Sinn dieses Wertes kümmern, hier einige Fakten: Dieser Parameter sollte nur Nicht-Null sein, wenn Boxen hinzugefügt oder entfernt werden. Der Wert wird bit-packed als Teil des Status der Boxen in boxDataList gespeichert und am Ende von refresh() wieder gelöscht. Der Wert selbst ist 16 Bits lang und jedes Bit steht für einen der 16 möglichen Layer innerhalb eines Sets. Beispielsweise bedeutet ein Wert von 0xFFFF (binär 1111111111111111) &amp;quot;alle Layer&amp;quot; während ein Wert von 0x4 (binär 0000000000000100) &amp;quot;Layer 2&amp;quot; bedeutet (von 0 beginnend gezählt).&lt;br /&gt;
&lt;br /&gt;
Der Wert wird in der draw(...)-Funktion verwendet, welche an verschiedenen Stellen in refresh() benutzt wird um ein Zeichen auf eine Face zu zeichnen. Normalerweise holt sich draw(...) die ID des Layers, der sich an der Position des Face gerade im Vordergrund befindet, sowie die ID des Layers der Box, die gerade gezeichnet werden soll. Wenn diese Layer-IDs ungleich sind, dann wird die Face nicht verändert, da die zu zeichnende Box an der Stelle nicht im Vordergrund ist.&lt;br /&gt;
&lt;br /&gt;
Wenn wir jetzt aber eine Box hinzufügen oder entfernen, dann kann sich die Information, welche Layer an welchen Stellen im Vordergrund sind, für einige Faces ändern. Das ist genau die Information, die uns die newLayerOverrideBits liefern. Wenn beispielsweise eine neue Box hinzugefügt wird, sind deren Override-Bits auf 0xFFFF gesetzt. Wenn diese Box nun gezeichnet wird, dann merkt die draw(...)-Funktion, dass sie alle anderen Layer überschreiben und die neue Box darüber zeichnen soll. Wenn eine Box entfernt wird ist die Logik ähnlich, allerdings werden nur bestimmte Bits gesetzt und die Reihenfolge des Refreshs wird umgedreht; siehe dazu auch den Abschnitt über die refresh()-Funktion.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; setIndex ===&lt;br /&gt;
&lt;br /&gt;
Erlaubt uns, das (Über-)Schreiben von Informationen auf Boxen eines bestimmten Sets einzuschränken. Ein Wert von -1 bedeutet, dass auf allen Sets gearbeitet werden soll.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; withData ===&lt;br /&gt;
&lt;br /&gt;
Gibt an, ob der &amp;quot;data&amp;quot;-Parameter (siehe unten) Daten enthält. Das erlaubt eine Unterscheidung zwischen dem leeren String und &amp;quot;keine Daten angegeben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[string]]&#039;&#039; data ===&lt;br /&gt;
&lt;br /&gt;
Enthält entweder neuen Text oder neue Stil-Einstellungen zur Speicherung in boxDataList.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die refresh()-Funktion ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die refresh()-Funktion kann als das &amp;quot;Herz&amp;quot; des Text-Skripts angesehen werden. Sie wird entweder aufgerufen nachdem einige Änderungen gesammelt wurden oder wenn eine Aktualisierung während des Abarbeitens eines Befehls erzwungen werden muss.&lt;br /&gt;
&lt;br /&gt;
Sie besteht hauptsächlich aus einer großen Schleife, die über alle Boxen iteriert und deren &amp;quot;Dirty&amp;quot;-Bit prüft. Wenn eine Box als dirty markiert ist, werden ihre Informationen (Text, Stil, Geometrie) geladen und zum Zeichnen vorbereitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein paar Worte zur Reihenfolge der Schleife:&#039;&#039;&#039; Normalerweise werden die Boxen in der &#039;&#039;umgekehrten&#039;&#039; Reihenfolge, in der sie hinzugefügt wurden, durchgegangen. Das bedeutet, dass die Boxen &amp;quot;von oben nach unten&amp;quot; aktualisiert werden (bezüglich der Layer). Allerdings gibt es eine Ausnahme: Wenn die Art des letzten Befehls ACTION_ADD_BOX war (siehe auch den &amp;quot;action&amp;quot;-Parameter von setDirty(...)), dann werden die Boxen &#039;&#039;in&#039;&#039; der Reihenfolge, in der sie hinzugefügt wurden, durchgegangen (&amp;quot;von unten nach oben&amp;quot;). Dies ist nötig um die Information, welche Layer auf welchen Faces gerade im Vordergrund sind, korrekt zu aktualisieren (siehe auch den &amp;quot;newLayerOverrideBits&amp;quot;-Parameter von setDirty(...)).&lt;br /&gt;
&lt;br /&gt;
Zurück zur Schleife und dem &amp;quot;Dirty&amp;quot;-Bit. Genauergesagt gibt es zwei &amp;quot;Dirty&amp;quot;-Bits: Eines sagt uns, ob die Box überhaupt aktualisiert werden soll und ein zweites, ob außerdem die Rahmen der Box u.U. aktualisiert werden müssen. Wenn etwa lediglich der Text einer Box geändert wurde – aber nicht die Stileinstellungen – dann gibt es keinen Grund, den Rahmen neuzuzeichnen.&lt;br /&gt;
&lt;br /&gt;
Der Text der Box wird dann in Teile zerlegt (an den Stellen wo Leerzeichen, Umbrüche, Stil-Markup auftreten) und eine innere Schleife iteriert durch diese Teile, welche wiederum Listen von einzelnen Zeichen und Stilinformationen, die direkt im Text gegeben sind, vorbereitet. Sobald eine Zeile an Daten vorbereitet ist (eine Zeile bedeutet hier eine Zeile von Prims), kümmert sich eine weitere kleine Schleife um das eigentliche Zeichnen auf die Faces. Anschließend wird mit der nächsten Zeile fortgefahren.&lt;br /&gt;
&lt;br /&gt;
Nachdem eine Box aktualisiert wurde, werden ihre &amp;quot;Dirty&amp;quot;-Bits zurückgesetzt. Sobald alle Boxen fertig sind, wird die global gespeicherte Art der letzten Aktion zurückgesetzt und (falls die &amp;quot;Notification&amp;quot;-Option aktiviert ist) eine &amp;quot;fw_done&amp;quot;-Nachricht an das Linkset gesendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Caching-Strategien ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To do&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Developers&amp;diff=1180212</id>
		<title>FURWARE text/Developers</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Developers&amp;diff=1180212"/>
		<updated>2013-07-20T12:00:02Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Updated to reflect changes in v2.0.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page contains technical information about [[FURWARE_text]] and is intended for developers and interested users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|If you would like to get more info on specific topics, please leave a note on the discussion page. :)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Terminology and hierarchy of entities ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;&#039;&#039;&#039;set&#039;&#039;&#039;&amp;quot; is a part of a text display consisting of display prims arranged in rows and columns. Each set has a name, usually assigned using the display creator tool. A linkset may contain multiple sets.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;&#039;&#039;&#039;box&#039;&#039;&#039;&amp;quot; is a virtual text box within a set. Each set always has a (root) box of the size of the set. Each box has a name which is assigned via a parameter to the &#039;&#039;fw_addbox&#039;&#039; command. Additional boxes may be added to a set which are then stacked in layers, depending on the order in which the boxes were added.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This yields the following relations:&lt;br /&gt;
&lt;br /&gt;
* A box is always part of (and fully contained within) a set.&lt;br /&gt;
* A set consists of one or more prims.&lt;br /&gt;
* A prim may have multiple faces.&lt;br /&gt;
* Each face shows one character of text.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The textual content of a box is often referred to as the box&#039;s &amp;quot;&#039;&#039;&#039;data&#039;&#039;&#039;&amp;quot; (note that &amp;quot;data&amp;quot; is sometimes also used with a more general meaning).&lt;br /&gt;
&lt;br /&gt;
The text style configuration of a box (or parts of text) is often referred to as (the box&#039;s) &amp;quot;&#039;&#039;&#039;conf&#039;&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The main data structure for box, set and prim data ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most of the information about the geometry and contents of the displays is stored in a few [[list|lists]]. Some [[list|lists]] contain indices (&amp;quot;pointers&amp;quot;) to data in other [[list|lists]].&lt;br /&gt;
&lt;br /&gt;
=== Box data ===&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;boxNameList&amp;quot; is a [[list]] containing the names of the boxes one after another. The reason for having the box names in a separate [[list]] (i.e. not part of &amp;quot;boxDataList&amp;quot;, see below) is that the names shall be quickly searchable. For instance, when new text is received, the index of a box given its name must be retrieved.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;boxDataList&amp;quot; is a [[:Category:LSL_List#Strided_lists|strided list]] containing more information about each box. One stride contains:&lt;br /&gt;
** The box&#039;s text content ([[string]]).&lt;br /&gt;
** The box&#039;s style configuration ([[string]]).&lt;br /&gt;
** A bit-packed [[integer]] containing the box&#039;s layer (4 bits), the index of the set the box is part of (8 bits), dirty flags (2 bits), two reserved bits and the layer override bits (16 bits).&lt;br /&gt;
** The box&#039;s geometry (column offset, row offset, width, height) ([[rotation]]).&lt;br /&gt;
&lt;br /&gt;
=== Set data ===&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;setDataList&amp;quot; is a [[:Category:LSL_List#Strided_lists|strided list]] containing information about each set. One stride contains:&lt;br /&gt;
** The set&#039;s geometry (number of prim columns and rows, face count) ([[vector]]).&lt;br /&gt;
** A pointer to the start of the prim data stored in the &amp;quot;prim*List&amp;quot;-lists ([[integer]]).&lt;br /&gt;
&lt;br /&gt;
=== Prim data ===&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;primLinkList&amp;quot; contains the link numbers of the prims, ordered by sets, rows and columns. The link numbers are not bit-packed because they shall be quickly searchable, e.g. when performing touch queries.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;primFillList&amp;quot; contains bit-packed integers storing the state of each face on the respective prim. &amp;quot;The state&amp;quot; of a face means whether it is currently known to be showing whitespace or non-whitespace. This information is used as a cache to avoid SetPrimitiveParams-calls when not necessary.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;primLayerList&amp;quot; contains bit-packed integers that store the assignment of faces to layers. The 32 bits of the integer are split into 4 bits for each face and thus each face may be assigned one of 16 different layer IDs. This information is used during rendering to quickly determine which layer a given face of a given prim belongs to.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Basic flow of events ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This images is an attempt to visualize the basic flow of events and functions inside FURWARE text when a command that modifies the layout or contents of the display is received.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_basic_event_flow.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The initialization routine ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To do&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The [[link_message]](...)-handler ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To do&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The setDirty(...)-function ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This functions stands between the parsing of commands in [[link_message]](...) and the actual rendering in refresh(...). The parameters are as follows:&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; action ===&lt;br /&gt;
&lt;br /&gt;
One of the [[integer]] constants ACTION_CONTENT, ACTION_ADD_BOX or ACTION_DEL_BOX. This tells us what basic type of action shall be performed (for instance, setting new text is of type ACTION_CONTENT). This type is stored in a global variable and is reset in a call to refresh(...).&lt;br /&gt;
&lt;br /&gt;
The reason for storing this information is the &#039;&#039;delayed refresh mechanism&#039;&#039; (which is in turn one of the reasons why setDirty(...) was introduced as a buffer between parsing and refreshing in the first place). At the end of setDirty(...), a timer is started with a quite short interval. The [[timer]]()-event merely calls refresh() once it fires. However, until then, more [[link_message]](...)-events may be received and parsed which basically allows us to aggregate multiple commands (for instance, setting text for different boxes) before starting an actual refresh. This can yield a huge performance gain in some situations. Note that the timer is not restarted if the last action is already set to something else than [[FALSE|0]] which &amp;quot;guarantees&amp;quot; that the timer will fire at some point, even if a constant stream of commands is received.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;However, there&#039;s a catch.&#039;&#039; If we would just go and postpone all kinds of actions like setting text, styles, variables, adding and deleting boxes, we would end up with a mess and destroyed data structures (think about the details if you like, but it will make your head hurt). This is where the distinction between the different types of operations comes into play.&lt;br /&gt;
&lt;br /&gt;
Operations that merely modify the &#039;&#039;contents&#039;&#039; of boxes are in some sense &#039;&#039;compatible&#039;&#039; to each other and allow us to aggregate them  because the indices of the box data lists and layers remain &#039;&#039;constant&#039;&#039; during any content modifications and refreshes. Operations that &#039;&#039;add boxes&#039;&#039; may also be aggregated, broadly speaking because data will only be appended to some data [[list|lists]] and we can then refresh a batch of newly added boxes at once. Operations that &#039;&#039;delete boxes&#039;&#039; may be aggregated and we basically remember which layers have been freed during these operations. After that, we can just sweep through the remaining boxes and refresh the display accordingly.&lt;br /&gt;
&lt;br /&gt;
Because &#039;&#039;mixing&#039;&#039; these types operations is a &#039;&#039;bad thing&#039;&#039;, each time a command is received, the handler checks whether the new operation is compatible with the last type of operation (that is, &amp;quot;last action type == new action type&amp;quot;) and if it is not, an &#039;&#039;immediate&#039;&#039; refresh is forced before handling the command. Note that only the &#039;&#039;type&#039;&#039; of operation needs to be the same, not the exact command; for instance, fw_data and a fw_conf commands are compatible because they are both of type ACTION_CONTENT.&lt;br /&gt;
&lt;br /&gt;
Note that the kind of action may also change the operation of the refresh()-function; please see the according section for details.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; first / last ===&lt;br /&gt;
&lt;br /&gt;
The interval of box indices to work on. This way we can operate on a whole range of boxes at once.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; isConf ===&lt;br /&gt;
&lt;br /&gt;
May be either [[FALSE|0]] or [[TRUE|1]]. Used for determining whether to store given data (if any) as the data or conf of the box(es). Also, if isConf is true, drawing of the border of the box(es) is forced on next refresh because the border style may have changed.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; newLayerOverrideBits ===&lt;br /&gt;
&lt;br /&gt;
This is where it gets a little tricky. :) Before we talk about how this value is used, a few facts: This parameter shall only be non-zero when adding or deleting boxes. It is stored bit-packed as part of the status of the box(es) in the boxDataList and is cleared after a refresh() is completed. The value itself is 16 bits long and each bit stands for one of the 16 layers available within a set. A value of 0xFFFF (binary 1111111111111111) thus means &amp;quot;all layers&amp;quot; and a value of 0x4 (binary 0000000000000100) means &amp;quot;layer 2&amp;quot; (counted from 0).&lt;br /&gt;
&lt;br /&gt;
The value is used in the draw(...)-function which is called at several places in refresh() to draw a character to a face. Normally, draw(...) fetches the index of the layer that is currently in the foreground at the specified face as well as the layer of the box whose contents shall be drawn. If these two values are not equal, it will reject to update that face because the box to be drawn is not in the foreground.&lt;br /&gt;
&lt;br /&gt;
Now if we added or removed a box, the stored information about which layers are in the foreground may change for some faces. This is just what the value of the newLayerOverrideBits tells us. For instance, when a box was added, the bits are set to 0xFFFF. Now when the newly added box is being drawn, the draw(...)-function will see that it is supposed to override any other layer and draw the new box on top. When deleting a box, the logic is similar, however only specific bits will be set and the order of the refresh routine is reversed; also see the section about the refresh()-function.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; setIndex ===&lt;br /&gt;
&lt;br /&gt;
Allows us to restrict writing data to boxes that are part of a certain set. A value of -1 means to operate on boxes belonging to any set.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; withData ===&lt;br /&gt;
&lt;br /&gt;
Tells us whether the data-parameter (see below) contains data to be stored. This allows us to differentiate between the empty string and &amp;quot;no data given&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[string]]&#039;&#039; data ===&lt;br /&gt;
&lt;br /&gt;
Contains either new text content or a new style config string that is to be stored in the boxDataList.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The refresh()-function ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The refresh()-function may be seen as the &amp;quot;heart&amp;quot; of the text script. It is either called after some changes have been aggregated or when a refresh needs to be forced during command handling.&lt;br /&gt;
&lt;br /&gt;
It basically consists of a loop that iterates through all boxes and checks their &amp;quot;dirty&amp;quot; bit. If a box is marked dirty, its current data (text, style, geometry) is loaded and prepared for drawing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A word on the order of iteration of this outer loop:&#039;&#039;&#039; Normally, the boxes are iterated in the &#039;&#039;reverse&#039;&#039; order in which they have been added. That means that boxes will be refreshed &amp;quot;top-to-bottom&amp;quot; (with respect to the layers). However, there is an exception: When the type of the last command(s) was ACTION_ADD_BOX (see the &amp;quot;action&amp;quot; parameter of setDirty(...)), the boxes are iterated &#039;&#039;in&#039;&#039; the order in which they were added to the board (bottom-to-top). This is necessary to correctly update the information which faces currently show what layer (also see the &amp;quot;newLayerOverrideBits&amp;quot; parameter of setDirty(...)).&lt;br /&gt;
&lt;br /&gt;
Back to the main loop and the dirty bit. There are actually two dirty bits: One telling us that the box needs to be refreshed at all and one that the border of the box also needs to be refreshed. For instance, if only the text content of the box was changed – but not its style settings – then there is no need to bother with re-drawing the border.&lt;br /&gt;
&lt;br /&gt;
The text of the box is split into parts (at whitespaces, newlines, style markup tags) and an inner loop iterates through these tokens which prepares lists of character indices and style information given right within the text as markup. Once a row worth of data has been prepared (row = a row of primitives), another small loop renders the text to the faces before data preparation for the next row begins.&lt;br /&gt;
&lt;br /&gt;
After a box has been refreshed, its dirty bits are reset. When all boxes are done, the last action is also reset and (if the notification option is enabled) a &amp;quot;fw_done&amp;quot; message is emitted to the linkset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Caching strategies ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To do&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1180210</id>
		<title>FURWARE text/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1180210"/>
		<updated>2013-07-20T11:54:16Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
Diese Seite ist auch [[FURWARE_text|auf englisch]] verfügbar. / This page is also available [[FURWARE_text|in English]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text ist ein &#039;&#039;&#039;Skript zur Darstellung von Text&#039;&#039;&#039; mittels Texturen auf Prims. Es ist zum &#039;&#039;&#039;Einbau in deine Objekte&#039;&#039;&#039; gedacht in denen es von &#039;&#039;&#039;deinen eigenen Skripten&#039;&#039;&#039; gesteuert wird.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;ist keine&#039;&#039;&#039; vorgefertigte Anzeigetafel sondern ist für &#039;&#039;&#039;Skripter&#039;&#039;&#039; gedacht, die es in ihre eigene Kreationen integrieren.&lt;br /&gt;
&lt;br /&gt;
Das Skript war von 2010 bis Juli 2013 proprietär bis ich ({{User|Ochi Wolfe}}) mich dazu entschieden habe, es Open Source unter der MIT-Lizenz zu machen. Dies ist mein erster Versuch eines vollständig offenen Produkts in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Merkmale ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Nur ein Skript&#039;&#039;&#039; für eine ganze Gruppe (&amp;quot;sets&amp;quot;) von Anzeigetafeln&lt;br /&gt;
* &#039;&#039;&#039;Formatierung&#039;&#039;&#039; (Farbe, Alpha, Ausrichtung, Umbruch, Trimming, Font, Rahmen)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; mit 1-8 Zeichen, die je nur 0.5 Prims belegen&lt;br /&gt;
* &#039;&#039;&#039;Virtuelle Text-Boxen&#039;&#039;&#039; um Text beliebig zu Positionieren&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; um mehrere Stileinstellungen zusammenzufassen&lt;br /&gt;
&lt;br /&gt;
== Wo du das Skript bekommst ==&lt;br /&gt;
&lt;br /&gt;
Du kannst dir ein komplettes Paket inklusive dem Display Creator, Meshes und Schrift-Texturen auf [http://marketplace.secondlife.com/p/FURWARE-text/141379 dem Marketplace] holen.&lt;br /&gt;
&lt;br /&gt;
Für Entwickler und interessierte Benutzer habe ich für die Skripte außerdem einen Account auf [http://github.com/furware/text GitHub] erstellt.&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Unter den folgenden Unterseiten findest du eine Bedienungsanleitung sowie Dokumentation für Entwickler:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial/de|Erste Schritte &amp;amp; ausführliches Tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference/de|Kurzreferenz &amp;amp; Versionsgeschichte]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets/de|Hilfsfunktionen für einfachere Verwendung]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers/de|Dokumentation für Entwickler]]&lt;br /&gt;
&lt;br /&gt;
== Wie du helfen kannst ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Anwender:&#039;&#039;&#039; Eine wichtige Hilfe bei der Entwicklung dieses Skripts ist das Berichten von Problemen bei seiner Verwendung sowie Vorschläge, wie man die Benutzung noch besser machen kann. Momentan sind die wahrscheinlich besten Möglichkeiten hierfür {{User|Ochi Wolfe}} eine Notecard zu schreiben oder deine Kommentare zur Diskussion dieser Wiki-Seite hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Entwickler:&#039;&#039;&#039; Wenn du Vorschläge für die Verbesserung des Skripts hast kannst du diese gerne auf dieselbe Weise kundtun. Alternativ kannst du aber auch gerne einen Branch des Projekts auf [http://github.com/furware/text GitHub] erstellen und Pull-Requests senden. Bitte stelle sicher, dass die Änderungen von sehr guter Qualität sind und sie das Skript nicht weiter aufblähen als es sowieso schon ist. Genauergesagt sind Vorschläge zur Verbesserung der Performance und Senkung des Speicherverbrauchs &#039;&#039;&#039;äußerst&#039;&#039;&#039; gern gesehen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
Für die aktuelle Version sind keine Probleme bekannt. Falls welche auftreten, melde dies bitte.&lt;br /&gt;
&lt;br /&gt;
== To do ==&lt;br /&gt;
&lt;br /&gt;
Siehe bitte die [[FURWARE_text|englische Version dieser Seite]].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1180207</id>
		<title>FURWARE text</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1180207"/>
		<updated>2013-07-20T11:51:03Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
This page is also available [[FURWARE_text/de|in German]]. / Diese Seite ist auch [[FURWARE_text/de|auf deutsch]] verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text is a &#039;&#039;&#039;script for displaying text&#039;&#039;&#039; on prims using textures. It is intended to be &#039;&#039;&#039;integrated in your objects&#039;&#039;&#039; in which it will be controlled by &#039;&#039;&#039;your own scripts&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;is not&#039;&#039;&#039; a ready-made display board but is intented for &#039;&#039;&#039;scripters&#039;&#039;&#039; who wish to integrate it in their own creations.&lt;br /&gt;
&lt;br /&gt;
The script was proprietary from 2010 to July 2013 until I ({{User|Ochi Wolfe}}) have decided to make it open source under the MIT license. It is my first attempt to make a fully open sourced product in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Only one script&#039;&#039;&#039; for a whole group (&amp;quot;sets&amp;quot;) of displays&lt;br /&gt;
* &#039;&#039;&#039;Formatting&#039;&#039;&#039; (color, alpha, alignment, wrapping, trimming, font, borders)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; with 1 to 8 chars, only occupying 0.5 prims each&lt;br /&gt;
* &#039;&#039;&#039;Virtual text boxes&#039;&#039;&#039; to position text arbitrarily&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; for encapsulating multiple style settings&lt;br /&gt;
&lt;br /&gt;
== How to obtain the script ==&lt;br /&gt;
&lt;br /&gt;
You can obtain a complete package containing the script, the display creator, display meshes and font textures at [http://marketplace.secondlife.com/p/FURWARE-text/141379 the Marketplace].&lt;br /&gt;
&lt;br /&gt;
For developers and interested users, I have also set up a [http://github.com/furware/text GitHub] account for the core scripts.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
Please see the following subpages for the user&#039;s manual and developer documentation:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial|First steps &amp;amp; extensive tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference|Short reference &amp;amp; version history]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets|Helper functions for more convenient usage]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers|Developer documentation]]&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For users:&#039;&#039;&#039; A very important part of contribution to the development of this script is to report any problems you experience while using it as well as suggestions how to make using it even more awesome. For the time being, feel free to write a notecard to {{User|Ochi Wolfe}} or add your comments to the discussion of this wiki-page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For developers:&#039;&#039;&#039; If you have any suggestions for improvements to the script itself, you can either post them in the same way or you can branch the project on [http://github.com/furware/text GitHub] and send your pull requests. Just make sure that they are, of course, of awesome quality and that they don&#039;t bloat the script more than it already is bloated. In fact, any suggestions to improve performance and decrease memory consumption are &#039;&#039;&#039;very&#039;&#039;&#039; welcome.&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
No issues are known for the current release, but please report any problems you find.&lt;br /&gt;
&lt;br /&gt;
== To do ==&lt;br /&gt;
&lt;br /&gt;
There are still some things to do for the conversion into an open source project:&lt;br /&gt;
&lt;br /&gt;
* Check the documentation for errors.&lt;br /&gt;
* &amp;lt;s&amp;gt;Migrate the German documentation to the SL Wiki.&amp;lt;/s&amp;gt;&lt;br /&gt;
* Create developer documentation explaining concepts and ideas of the script. &#039;&#039;(in progress)&#039;&#039;&lt;br /&gt;
* Improve the font overview in the manual; make UUIDs copyable.&lt;br /&gt;
* I think there is a small bug in one of the images in the tutorial, I&#039;ll have to check that.&lt;br /&gt;
* Publish texture specifications.&lt;br /&gt;
* Publish mesh specifications.&lt;br /&gt;
* Add more useful comments to the scripts themselves.&lt;br /&gt;
* Clean up the scripts of the display creator and element initializer.&lt;br /&gt;
* &amp;lt;s&amp;gt;Migrate internal bug tracker, possibly to GitHub.&amp;lt;/s&amp;gt;&lt;br /&gt;
* Update the &amp;quot;FURWARE info board&amp;quot; to use the open source version of text.&lt;br /&gt;
* Make more open source example (controller) scripts.&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1180137</id>
		<title>FURWARE text/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1180137"/>
		<updated>2013-07-19T23:41:16Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
Diese Seite ist auch [[FURWARE_text|auf englisch]] verfügbar. / This page is also available [[FURWARE_text|in English]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text ist ein &#039;&#039;&#039;Skript zur Darstellung von Text&#039;&#039;&#039; mittels Texturen auf Prims. Es ist zum &#039;&#039;&#039;Einbau in deine Objekte&#039;&#039;&#039; gedacht in denen es von &#039;&#039;&#039;deinen eigenen Skripten&#039;&#039;&#039; gesteuert wird.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;ist keine&#039;&#039;&#039; vorgefertigte Anzeigetafel sondern ist für &#039;&#039;&#039;Skripter&#039;&#039;&#039; gedacht, die es in ihre eigene Kreationen integrieren.&lt;br /&gt;
&lt;br /&gt;
Das Skript war von 2010 bis Juli 2013 proprietär bis ich ({{User|Ochi Wolfe}}) mich dazu entschieden habe, es Open Source unter der MIT-Lizenz zu machen. Dies ist mein erster Versuch eines vollständig offenen Produkts in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Merkmale ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Nur ein Skript&#039;&#039;&#039; für eine ganze Gruppe (&amp;quot;sets&amp;quot;) von Anzeigetafeln&lt;br /&gt;
* &#039;&#039;&#039;Formatierung&#039;&#039;&#039; (Farbe, Alpha, Ausrichtung, Umbruch, Trimming, Font, Rahmen)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; mit 1-8 Zeichen, die je nur 0.5 Prims belegen&lt;br /&gt;
* &#039;&#039;&#039;Virtuelle Text-Boxen&#039;&#039;&#039; um Text beliebig zu Positionieren&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; um mehrere Stileinstellungen zusammenzufassen&lt;br /&gt;
&lt;br /&gt;
== Wo du das Skript bekommst ==&lt;br /&gt;
&lt;br /&gt;
Du kannst dir ein komplettes Paket inklusive dem Display Creator, Meshes und Schrift-Texturen auf [http://marketplace.secondlife.com/p/FURWARE-text/141379 dem Marketplace] holen.&lt;br /&gt;
&lt;br /&gt;
Für Entwickler und interessierte Benutzer habe ich für die Skripte außerdem einen Account auf [http://github.com/furware/text GitHub] erstellt.&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Unter den folgenden Unterseiten findest du eine Bedienungsanleitung sowie Dokumentation für Entwickler:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial/de|Erste Schritte &amp;amp; ausführliches Tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference/de|Kurzreferenz &amp;amp; Versionsgeschichte]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets/de|Hilfsfunktionen für einfachere Verwendung]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers/de|Dokumentation für Entwickler]]&lt;br /&gt;
&lt;br /&gt;
== Wie du helfen kannst ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Anwender:&#039;&#039;&#039; Eine wichtige Hilfe bei der Entwicklung dieses Skripts ist das Berichten von Problemen bei seiner Verwendung sowie Vorschläge, wie man die Benutzung noch besser machen kann. Momentan sind die wahrscheinlich besten Möglichkeiten hierfür {{User|Ochi Wolfe}} eine Notecard zu schreiben oder deine Kommentare zur Diskussion dieser Wiki-Seite hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Entwickler:&#039;&#039;&#039; Wenn du Vorschläge für die Verbesserung des Skripts hast kannst du diese gerne auf dieselbe Weise kundtun. Alternativ kannst du aber auch gerne einen Branch des Projekts auf [http://github.com/furware/text GitHub] erstellen und Pull-Requests senden. Bitte stelle sicher, dass die Änderungen von sehr guter Qualität sind und sie das Skript nicht weiter aufblähen als es sowieso schon ist. Genauergesagt sind Vorschläge zur Verbesserung der Performance und Senkung des Speicherverbrauchs &#039;&#039;&#039;äußerst&#039;&#039;&#039; gern gesehen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
* Es gibt momentan ein Problem wenn Zeichen verwendet werden, die nicht Teil der Schrift-Textur sind; dies kann zu unerwartetem Verhalten führen. Ich habe diesen Fehler versehentlich eingebaut als ich das Open-Source-Release vorbereitet habe (der Fehler ist in der 2.0-Beta1-Version nicht vorhanden). Ich arbeite zurzeit an einer Lösung und werde diese bald zusammen mit anderen Änderungen veröffentlichen.&lt;br /&gt;
&lt;br /&gt;
== To do ==&lt;br /&gt;
&lt;br /&gt;
Siehe bitte die [[FURWARE_text|englische Version dieser Seite]].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1180136</id>
		<title>FURWARE text</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1180136"/>
		<updated>2013-07-19T23:39:27Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
This page is also available [[FURWARE_text/de|in German]]. / Diese Seite ist auch [[FURWARE_text/de|auf deutsch]] verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text is a &#039;&#039;&#039;script for displaying text&#039;&#039;&#039; on prims using textures. It is intended to be &#039;&#039;&#039;integrated in your objects&#039;&#039;&#039; in which it will be controlled by &#039;&#039;&#039;your own scripts&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;is not&#039;&#039;&#039; a ready-made display board but is intented for &#039;&#039;&#039;scripters&#039;&#039;&#039; who wish to integrate it in their own creations.&lt;br /&gt;
&lt;br /&gt;
The script was proprietary from 2010 to July 2013 until I ({{User|Ochi Wolfe}}) have decided to make it open source under the MIT license. It is my first attempt to make a fully open sourced product in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Only one script&#039;&#039;&#039; for a whole group (&amp;quot;sets&amp;quot;) of displays&lt;br /&gt;
* &#039;&#039;&#039;Formatting&#039;&#039;&#039; (color, alpha, alignment, wrapping, trimming, font, borders)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; with 1 to 8 chars, only occupying 0.5 prims each&lt;br /&gt;
* &#039;&#039;&#039;Virtual text boxes&#039;&#039;&#039; to position text arbitrarily&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; for encapsulating multiple style settings&lt;br /&gt;
&lt;br /&gt;
== How to obtain the script ==&lt;br /&gt;
&lt;br /&gt;
You can obtain a complete package containing the script, the display creator, display meshes and font textures at [http://marketplace.secondlife.com/p/FURWARE-text/141379 the Marketplace].&lt;br /&gt;
&lt;br /&gt;
For developers and interested users, I have also set up a [http://github.com/furware/text GitHub] account for the core scripts.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
Please see the following subpages for the user&#039;s manual and developer documentation:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial|First steps &amp;amp; extensive tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference|Short reference &amp;amp; version history]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets|Helper functions for more convenient usage]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers|Developer documentation]]&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For users:&#039;&#039;&#039; A very important part of contribution to the development of this script is to report any problems you experience while using it as well as suggestions how to make using it even more awesome. For the time being, feel free to write a notecard to {{User|Ochi Wolfe}} or add your comments to the discussion of this wiki-page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For developers:&#039;&#039;&#039; If you have any suggestions for improvements to the script itself, you can either post them in the same way or you can branch the project on [http://github.com/furware/text GitHub] and send your pull requests. Just make sure that they are, of course, of awesome quality and that they don&#039;t bloat the script more than it already is bloated. In fact, any suggestions to improve performance and decrease memory consumption are &#039;&#039;&#039;very&#039;&#039;&#039; welcome.&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
* There is currently an issue where sending characters that are not part of the font texture may cause unexpected behavior. I accidentally introduced this bug when preparing the open source release of the script (the error is not present in 2.0-Beta1). I&#039;m working on a fix and will release it together with some other changes soon.&lt;br /&gt;
&lt;br /&gt;
== To do ==&lt;br /&gt;
&lt;br /&gt;
There are still some things to do for the conversion into an open source project:&lt;br /&gt;
&lt;br /&gt;
* Check the documentation for errors.&lt;br /&gt;
* &amp;lt;s&amp;gt;Migrate the German documentation to the SL Wiki.&amp;lt;/s&amp;gt;&lt;br /&gt;
* Create developer documentation explaining concepts and ideas of the script. &#039;&#039;(in progress)&#039;&#039;&lt;br /&gt;
* Improve the font overview in the manual; make UUIDs copyable.&lt;br /&gt;
* I think there is a small bug in one of the images in the tutorial, I&#039;ll have to check that.&lt;br /&gt;
* Publish texture specifications.&lt;br /&gt;
* Publish mesh specifications.&lt;br /&gt;
* Add more useful comments to the scripts themselves.&lt;br /&gt;
* Clean up the scripts of the display creator and element initializer.&lt;br /&gt;
* &amp;lt;s&amp;gt;Migrate internal bug tracker, possibly to GitHub.&amp;lt;/s&amp;gt;&lt;br /&gt;
* Update the &amp;quot;FURWARE info board&amp;quot; to use the open source version of text.&lt;br /&gt;
* Make more open source example (controller) scripts.&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1180134</id>
		<title>FURWARE text/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/de&amp;diff=1180134"/>
		<updated>2013-07-19T21:14:47Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Added &amp;quot;known issues&amp;quot; section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
Diese Seite ist auch [[FURWARE_text|auf englisch]] verfügbar. / This page is also available [[FURWARE_text|in English]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text ist ein &#039;&#039;&#039;Skript zur Darstellung von Text&#039;&#039;&#039; mittels Texturen auf Prims. Es ist zum &#039;&#039;&#039;Einbau in deine Objekte&#039;&#039;&#039; gedacht in denen es von &#039;&#039;&#039;deinen eigenen Skripten&#039;&#039;&#039; gesteuert wird.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;ist keine&#039;&#039;&#039; vorgefertigte Anzeigetafel sondern ist für &#039;&#039;&#039;Skripter&#039;&#039;&#039; gedacht, die es in ihre eigene Kreationen integrieren.&lt;br /&gt;
&lt;br /&gt;
Das Skript war von 2010 bis Juli 2013 proprietär bis ich ({{User|Ochi Wolfe}}) mich dazu entschieden habe, es Open Source unter der MIT-Lizenz zu machen. Dies ist mein erster Versuch eines vollständig offenen Produkts in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Merkmake ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Nur ein Skript&#039;&#039;&#039; für eine ganze Gruppe (&amp;quot;sets&amp;quot;) von Anzeigetafeln&lt;br /&gt;
* &#039;&#039;&#039;Formatierung&#039;&#039;&#039; (Farbe, Alpha, Ausrichtung, Umbruch, Trimming, Font, Rahmen)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; mit 1-8 Zeichen, die je nur 0.5 Prims belegen&lt;br /&gt;
* &#039;&#039;&#039;Virtuelle Text-Boxen&#039;&#039;&#039; um Text beliebig zu Positionieren&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; um mehrere Stileinstellungen zusammenzufassen&lt;br /&gt;
&lt;br /&gt;
== Wo du das Skript bekommst ==&lt;br /&gt;
&lt;br /&gt;
Du kannst dir ein komplettes Paket inklusive dem Display Creator, Meshes und Schrift-Texturen auf [http://marketplace.secondlife.com/p/FURWARE-text/141379 dem Marketplace] holen.&lt;br /&gt;
&lt;br /&gt;
Für Entwickler und interessierte Benutzer habe ich für die Skripte außerdem einen Account auf [http://github.com/furware/text GitHub] erstellt.&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Unter den folgenden Unterseiten findest du eine Bedienungsanleitung sowie Dokumentation für Entwickler:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial/de|Erste Schritte &amp;amp; ausführliches Tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference/de|Kurzreferenz &amp;amp; Versionsgeschichte]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets/de|Hilfsfunktionen für einfachere Verwendung]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers/de|Dokumentation für Entwickler]]&lt;br /&gt;
&lt;br /&gt;
== Wie du helfen kannst ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Anwender:&#039;&#039;&#039; Eine wichtige Hilfe bei der Entwicklung dieses Skripts ist das Berichten von Problemen bei seiner Verwendung sowie Vorschläge, wie man die Benutzung noch besser machen kann. Momentan sind die wahrscheinlich besten Möglichkeiten hierfür {{User|Ochi Wolfe}} eine Notecard zu schreiben oder deine Kommentare zur Diskussion dieser Wiki-Seite hinzuzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Für Entwickler:&#039;&#039;&#039; Wenn du Vorschläge für die Verbesserung des Skripts hast kannst du diese gerne auf dieselbe Weise kundtun. Alternativ kannst du aber auch gerne einen Branch des Projekts auf [http://github.com/furware/text GitHub] erstellen und Pull-Requests senden. Bitte stelle sicher, dass die Änderungen von sehr guter Qualität sind und sie das Skript nicht weiter aufblähen als es sowieso schon ist. Genauergesagt sind Vorschläge zur Verbesserung der Performance und Senkung des Speicherverbrauchs &#039;&#039;&#039;äußerst&#039;&#039;&#039; gern gesehen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
&lt;br /&gt;
* Es gibt momentan ein Problem wenn Zeichen verwendet werden, die nicht Teil der Schrift-Textur sind; dies kann zu unerwartetem Verhalten führen. Ich habe diesen Fehler versehentlich eingebaut als ich das Open-Source-Release vorbereitet habe (der Fehler ist in der 2.0-Beta1-Version nicht vorhanden). Ich arbeite zurzeit an einer Lösung und werde diese bald zusammen mit anderen Änderungen veröffentlichen.&lt;br /&gt;
&lt;br /&gt;
== To do ==&lt;br /&gt;
&lt;br /&gt;
Siehe bitte die [[FURWARE_text|englische Version dieser Seite]].&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1180133</id>
		<title>FURWARE text</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text&amp;diff=1180133"/>
		<updated>2013-07-19T21:12:20Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Added &amp;quot;known issues&amp;quot; section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
This page is also available [[FURWARE_text/de|in German]]. / Diese Seite ist auch [[FURWARE_text/de|auf deutsch]] verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FURWARE text is a &#039;&#039;&#039;script for displaying text&#039;&#039;&#039; on prims using textures. It is intended to be &#039;&#039;&#039;integrated in your objects&#039;&#039;&#039; in which it will be controlled by &#039;&#039;&#039;your own scripts&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
FURWARE text &#039;&#039;&#039;is not&#039;&#039;&#039; a ready-made display board but is intented for &#039;&#039;&#039;scripters&#039;&#039;&#039; who wish to integrate it in their own creations.&lt;br /&gt;
&lt;br /&gt;
The script was proprietary from 2010 to July 2013 until I ({{User|Ochi Wolfe}}) have decided to make it open source under the MIT license. It is my first attempt to make a fully open sourced product in Second Life.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Open source&#039;&#039;&#039; (MIT license)&lt;br /&gt;
* &#039;&#039;&#039;Only one script&#039;&#039;&#039; for a whole group (&amp;quot;sets&amp;quot;) of displays&lt;br /&gt;
* &#039;&#039;&#039;Formatting&#039;&#039;&#039; (color, alpha, alignment, wrapping, trimming, font, borders)&lt;br /&gt;
* &#039;&#039;&#039;Mesh prims&#039;&#039;&#039; with 1 to 8 chars, only occupying 0.5 prims each&lt;br /&gt;
* &#039;&#039;&#039;Virtual text boxes&#039;&#039;&#039; to position text arbitrarily&lt;br /&gt;
* &#039;&#039;&#039;Style templates&#039;&#039;&#039; for encapsulating multiple style settings&lt;br /&gt;
&lt;br /&gt;
== How to obtain the script ==&lt;br /&gt;
&lt;br /&gt;
You can obtain a complete package containing the script, the display creator, display meshes and font textures at [http://marketplace.secondlife.com/p/FURWARE-text/141379 the Marketplace].&lt;br /&gt;
&lt;br /&gt;
For developers and interested users, I have also set up a [http://github.com/furware/text GitHub] account for the core scripts.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
Please see the following subpages for the user&#039;s manual and developer documentation:&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Tutorial|First steps &amp;amp; extensive tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Reference|Short reference &amp;amp; version history]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Snippets|Helper functions for more convenient usage]]&lt;br /&gt;
&lt;br /&gt;
[[FURWARE_text/Developers|Developer documentation]]&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For users:&#039;&#039;&#039; A very important part of contribution to the development of this script is to report any problems you experience while using it as well as suggestions how to make using it even more awesome. For the time being, feel free to write a notecard to {{User|Ochi Wolfe}} or add your comments to the discussion of this wiki-page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For developers:&#039;&#039;&#039; If you have any suggestions for improvements to the script itself, you can either post them in the same way or you can branch the project on [http://github.com/furware/text GitHub] and send your pull requests. Just make sure that they are, of course, of awesome quality and that they don&#039;t bloat the script more than it already is bloated. In fact, any suggestions to improve performance and decrease memory consumption are &#039;&#039;&#039;very&#039;&#039;&#039; welcome.&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
* There is currently an issue where sending characters that are not part of the font texture may cause unexpected behavior. I accidentally introduced this bug when preparing the open source release of the script (the error is not present in the 2.0-Beta1 developer version). I&#039;m working on a fix and will release it together with some other changes soon.&lt;br /&gt;
&lt;br /&gt;
== To do ==&lt;br /&gt;
&lt;br /&gt;
There are still some things to do for the conversion into an open source project:&lt;br /&gt;
&lt;br /&gt;
* Check the documentation for errors.&lt;br /&gt;
* &amp;lt;s&amp;gt;Migrate the German documentation to the SL Wiki.&amp;lt;/s&amp;gt;&lt;br /&gt;
* Create developer documentation explaining concepts and ideas of the script. &#039;&#039;(in progress)&#039;&#039;&lt;br /&gt;
* Improve the font overview in the manual; make UUIDs copyable.&lt;br /&gt;
* I think there is a small bug in one of the images in the tutorial, I&#039;ll have to check that.&lt;br /&gt;
* Publish texture specifications.&lt;br /&gt;
* Publish mesh specifications.&lt;br /&gt;
* Add more useful comments to the scripts themselves.&lt;br /&gt;
* Clean up the scripts of the display creator and element initializer.&lt;br /&gt;
* &amp;lt;s&amp;gt;Migrate internal bug tracker, possibly to GitHub.&amp;lt;/s&amp;gt;&lt;br /&gt;
* Update the &amp;quot;FURWARE info board&amp;quot; to use the open source version of text.&lt;br /&gt;
* Make more open source example (controller) scripts.&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets/de&amp;diff=1179965</id>
		<title>FURWARE text/Snippets/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets/de&amp;diff=1179965"/>
		<updated>2013-07-12T23:50:23Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Added fwStyle function&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Seite beinhaltet verschiedene nützliche Code-Schnipsel (Funktionen, Konstanten), die die Arbeit mit [[FURWARE_text/de|FURWARE_text]] wesentlich angenehmer machen.&lt;br /&gt;
&lt;br /&gt;
== Grundlegende Funktionen ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionen in diesem Abschnitt sind Wrapper um die einzelnen [[FURWARE_text/de|FURWARE_text]]-Befehle. Sie wurden so entworfen, dass sie den folgenden Anforderungen genügen:&lt;br /&gt;
&lt;br /&gt;
* Die Funktionen sollen &#039;&#039;in sich abgeschlossen&#039;&#039; sein. Das heißt, dass du auch nur diejenigen Funktionen kopieren kannst, die du wirklich benötigst und sie werden funktionieren.&lt;br /&gt;
* Die Funktionen (und deren Parameter) sollen &#039;&#039;selbsterklärend&#039;&#039; sein. Das heißt, dass sie auch direkt als eine Kurzreferenz für den Befehl dienen sollen, den sie ausführen.&lt;br /&gt;
&lt;br /&gt;
Dass die Funktionen in sich abgeschlossen sind bedeutet auch, dass jede der Funktionen einen [[llMessageLinked]](...)-Aufruf enthält. Das Ziel dieser Aufrufe ist hier auf [[LINK_SET]] (also das gesamte Linkset) gesetzt. Falls nötig, ändere dieses Ziel bitte in deinen Skripten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
fwSetText(string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxText(string box, string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetStyle(string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxStyle(string box, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetDefaultStyle(string target, string style) {&lt;br /&gt;
    // &amp;quot;target&amp;quot; darf leer, &amp;quot;root&amp;quot; oder &amp;quot;nonroot&amp;quot; sein.&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_defaultconf:&amp;quot; + target);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetVariable(string name, string value) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, value, &amp;quot;fw_var:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwAddBox(string name, string parent, integer x, integer y, integer w, integer h, string text, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_addbox: &amp;quot; +name + &amp;quot;:&amp;quot; + parent + &amp;quot;:&amp;quot;+&lt;br /&gt;
                    (string)x + &amp;quot;,&amp;quot; + (string)y + &amp;quot;,&amp;quot; + (string)w + &amp;quot;,&amp;quot; + (string)h + &amp;quot;:&amp;quot; + style);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwDelBox(string name) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwTouchQuery(integer linkNumber, integer faceNumber, string userData) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, userData, &amp;quot;fw_touchquery:&amp;quot; + (string)linkNumber + &amp;quot;:&amp;quot; + (string)faceNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list fwTouchReply(string replyString) {&lt;br /&gt;
    list tokens = llParseStringKeepNulls(replyString, [&amp;quot;:&amp;quot;], []);&lt;br /&gt;
    return [&lt;br /&gt;
        llList2String(tokens, 0), llList2Integer(tokens, 1), llList2Integer(tokens, 2),&lt;br /&gt;
        llList2String(tokens, 3), llList2Integer(tokens, 4), llList2Integer(tokens, 5),&lt;br /&gt;
        llDumpList2String(llDeleteSubList(tokens, 0, 5), &amp;quot;:&amp;quot;)&lt;br /&gt;
    ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetNotify(integer enabled) {&lt;br /&gt;
    string s = &amp;quot;off&amp;quot;; if (enabled) s = &amp;quot;on&amp;quot;;&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, s, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwMemory() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwReset() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
&lt;br /&gt;
Die oben aufgeführen Funktionen erlauben dir zwar die meisten Befehle einfacher zu verwenden, aber einige Details müssen dennoch von Hand erledigt werden, beispielsweise das Angeben von Textstil-Konfigurationen. Die folgenden Zeilen geben dir ein paar Beispiele für die Verwendung der Funktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Setzt den Text aller Boxen in allen Sets.&lt;br /&gt;
fwSetText(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Setzt den Text der Box &amp;quot;SomeBox&amp;quot;.&lt;br /&gt;
fwSetBoxText(&amp;quot;SomeBox&amp;quot;, &amp;quot;This is some box!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Setzt den Standard-Stil aller Boxen auf color=red, align=center (der nächste Abschnitt zeigt, wie man dies schöner erledigen kann).&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, &amp;quot;c=red;a=center&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Füge eine Box &amp;quot;NewBox&amp;quot; mit &amp;quot;ExistingBox&amp;quot; als Parent hinzu.&lt;br /&gt;
fwAddBox(&amp;quot;NewBox&amp;quot;, &amp;quot;ExistingBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Lösche eine Box.&lt;br /&gt;
fwDelBox(&amp;quot;NewBox&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Sende eine Touch Query aus dem touch_start(...)-Event heraus.&lt;br /&gt;
touch_start(integer num) {&lt;br /&gt;
    fwTouchQuery(llDetectedLinkNumber(0), llDetectedTouchFace(0), &amp;quot;Arbitrary user data goes here&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Verarbeite eine &amp;quot;Touch Reply&amp;quot;-Antwort im link_message(...)-Event.&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
        list result = fwTouchReply(str);&lt;br /&gt;
        // Die Liste &amp;quot;result&amp;quot; enthält jetzt die Antwort als [boxName, boxRelativeX, boxRelativeY, rootName, absoluteX, absoluteY, userData].&lt;br /&gt;
        // &amp;quot;boxName&amp;quot; ist leer, wenn die Touch Query ungültig war.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Noch angenehmere Verwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionen im letzten Abschnitt sind lediglich Wrapper um die [[FURWARE_text/de|FURWARE_text]]-Befehle, allerdings muss du weiterhin Dinge wie Stileinstellungen selber schreiben und dir die verschiedenen Optionen und deren Werte merken. Die folgenden Konstanten und Funktionen nehmen dir einen Teil dieser Arbeit ab (auch hier gilt, dass du nur die Teile kopieren musst, die du tatsächlich benötigst – auch um Speicher zu sparen!).&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Beachte, dass die folgenden Zeilen die Funktionen im vorigen Abschnitt ergänzen, d.h. du musst die entsprechenden Funktionen zusätzlich mitkopieren.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// === Farben (colors) ===&lt;br /&gt;
&lt;br /&gt;
string COLOR_DEFAULT            = &amp;quot;c=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Graustufen.&lt;br /&gt;
string COLOR_WHITE              = &amp;quot;c=white;&amp;quot;;&lt;br /&gt;
string COLOR_SILVER             = &amp;quot;c=silver;&amp;quot;;&lt;br /&gt;
string COLOR_GRAY               = &amp;quot;c=gray;&amp;quot;;&lt;br /&gt;
string COLOR_BLACK              = &amp;quot;c=black;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Standardfarben.&lt;br /&gt;
string COLOR_RED                = &amp;quot;c=red;&amp;quot;;&lt;br /&gt;
string COLOR_GREEN              = &amp;quot;c=green;&amp;quot;;&lt;br /&gt;
string COLOR_BLUE               = &amp;quot;c=blue;&amp;quot;;&lt;br /&gt;
string COLOR_CYAN               = &amp;quot;c=cyan;&amp;quot;;&lt;br /&gt;
string COLOR_MAGENTA            = &amp;quot;c=magenta;&amp;quot;;&lt;br /&gt;
string COLOR_YELLOW             = &amp;quot;c=yellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Dunkle Farben.&lt;br /&gt;
string COLOR_DARKRED            = &amp;quot;c=darkred;&amp;quot;;&lt;br /&gt;
string COLOR_DARKGREEN          = &amp;quot;c=darkgreen;&amp;quot;;&lt;br /&gt;
string COLOR_DARKBLUE           = &amp;quot;c=darkblue;&amp;quot;;&lt;br /&gt;
string COLOR_DARKCYAN           = &amp;quot;c=darkcyan;&amp;quot;;&lt;br /&gt;
string COLOR_DARKMAGENTA        = &amp;quot;c=darkmagenta;&amp;quot;;&lt;br /&gt;
string COLOR_DARKYELLOW         = &amp;quot;c=darkyellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Beliebige RGB- (Rot, Grün, Blau) Farben.&lt;br /&gt;
string fwColorRGB(float red, float green, float blue) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,1&amp;quot; + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Beliebige RGBA- (Rot, Grün, Blau, Alpha/Deckkraft) Farben.&lt;br /&gt;
string fwColorRGBA(float red, float green, float blue, float alpha) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,&amp;quot; + (string)alpha + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Ausrichtung (alignment) ===&lt;br /&gt;
&lt;br /&gt;
string ALIGN_DEFAULT            = &amp;quot;a=def;&amp;quot;;&lt;br /&gt;
string ALIGN_LEFT               = &amp;quot;a=left;&amp;quot;;&lt;br /&gt;
string ALIGN_CENTER             = &amp;quot;a=center;&amp;quot;;&lt;br /&gt;
string ALIGN_RIGHT              = &amp;quot;a=right;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Umbruch (wrapping) ===&lt;br /&gt;
&lt;br /&gt;
string WRAP_DEFAULT             = &amp;quot;w=def;&amp;quot;;&lt;br /&gt;
string WRAP_WORD                = &amp;quot;w=word;&amp;quot;;&lt;br /&gt;
string WRAP_CHAR                = &amp;quot;w=char;&amp;quot;;&lt;br /&gt;
string WRAP_NONE                = &amp;quot;w=none;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Abschneiden von Leerzeichen am Anfang/Ende (trimming) ===&lt;br /&gt;
&lt;br /&gt;
string TRIM_DEFAULT             = &amp;quot;t=def;&amp;quot;;&lt;br /&gt;
string TRIM_ON                  = &amp;quot;t=on;&amp;quot;;&lt;br /&gt;
string TRIM_OFF                 = &amp;quot;t=off;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Schriftarten (fonts) ===&lt;br /&gt;
&lt;br /&gt;
string FONT_DEFAULT             = &amp;quot;f=def;&amp;quot;;&lt;br /&gt;
string FONT_ANDALE              = &amp;quot;f=e31ce6e8-4117-7073-6aac-e6503034b4c5;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO       = &amp;quot;f=24c4ead5-04cd-1831-5fd9-ec48882e00b1;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO_BOLD  = &amp;quot;f=82c4fcac-3990-223c-286d-5bc92a258fbc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU              = &amp;quot;f=f974fdfc-8fbd-2f29-2b38-3c34411c1fcc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU_BOLD         = &amp;quot;f=5054fec3-1465-af8f-2fe5-e9507795c82a;&amp;quot;;&lt;br /&gt;
string FONT_ENVYCODER           = &amp;quot;f=a2ec2cf0-b207-db51-d4a1-f3f8d6684c07;&amp;quot;;&lt;br /&gt;
string FONT_FREEFONT            = &amp;quot;f=05f6f69e-8bdf-a824-a2cf-d91c9e371c23;&amp;quot;;&lt;br /&gt;
string FONT_INCONSOLATA         = &amp;quot;f=867288f9-940e-a7cf-ac7d-5596ea7fb2c5;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION          = &amp;quot;f=c992dfc4-0aca-02c8-bc01-8330e6db6f87;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION_BOLD     = &amp;quot;f=1494337d-5296-3c43-8f7c-45617448ec9a;&amp;quot;;&lt;br /&gt;
string FONT_LUXI                = &amp;quot;f=2d8f52d7-2220-2d7a-15b5-e685a9449e5c;&amp;quot;;&lt;br /&gt;
string FONT_LUXI_BOLD           = &amp;quot;f=03812794-535b-f546-6171-6bec5bf399be;&amp;quot;;&lt;br /&gt;
string FONT_MONOFUR             = &amp;quot;f=8fc63e35-a18f-e335-3936-e2ca196a944d;&amp;quot;;&lt;br /&gt;
string FONT_NOVA                = &amp;quot;f=2df8e09d-e1bd-d17f-6bec-b8d713790380;&amp;quot;;&lt;br /&gt;
string FONT_PROFONT             = &amp;quot;f=45a8e6f6-90e4-299d-d3bc-0bf4dbf170db;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Rahmen (borders) ===&lt;br /&gt;
&lt;br /&gt;
string BORDER_DEFAULT           = &amp;quot;border=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Einige Beispiele für oft benutzte Rahmenstile.&lt;br /&gt;
string BORDER_ALL_SIDES         = &amp;quot;border=tblr;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_THICK   = &amp;quot;border=tblr1;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_DOUBLE  = &amp;quot;border=tblr2;&amp;quot;;&lt;br /&gt;
string BORDER_BOTTOM            = &amp;quot;border=b;&amp;quot;;&lt;br /&gt;
string BORDER_LEFT_RIGHT        = &amp;quot;border=lr;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Eine allgemeinere Hilfsfunktion für Rahmen. Die Seiten-Parameter sind von oben beginnend im Uhrzeigersinn angeordnet.&lt;br /&gt;
string fwBorder(integer top, integer right, integer bottom, integer left, integer style) {&lt;br /&gt;
    string result = &amp;quot;border=&amp;quot;;&lt;br /&gt;
    if (top)    result += &amp;quot;t&amp;quot;; if (right)  result += &amp;quot;r&amp;quot;;&lt;br /&gt;
    if (bottom) result += &amp;quot;b&amp;quot;; if (left)   result += &amp;quot;l&amp;quot;;&lt;br /&gt;
    if (style)  result += (string)style;&lt;br /&gt;
    return result + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Stil-Variablen ===&lt;br /&gt;
&lt;br /&gt;
// Lädt einen in einer fw_var(iable) gespeicherten Stil.&lt;br /&gt;
string fwStyle(string styleVariableName) {&lt;br /&gt;
    return &amp;quot;style=&amp;quot; + styleVariableName + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
&lt;br /&gt;
Jeder Wert der Konstanten endet mit einem &amp;quot;;&amp;quot;. Das erlaubt dir, die Konstanten einfach mit &amp;quot;+&amp;quot; zu verbinden und trotzdem gültige Strings für Stileinstellungen zu erhalten. Damit kannst du so etwas schreiben wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Setzt die Farbe (color), den Umbruch (wrapping) und die Schriftart (font) für alle Boxen.&lt;br /&gt;
fwSetStyle(COLOR_YELLOW + WRAP_NONE + FONT_MONOFUR);&lt;br /&gt;
&lt;br /&gt;
// Setzt die Standard-Stileinstellung für alle Boxen.&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, COLOR_RED + ALIGN_CENTER);&lt;br /&gt;
&lt;br /&gt;
// Füge eine Box mit einer Stileinstellung hinzu. Wir benutzen hier eine selbstspezifizierte RGB-Farbe.&lt;br /&gt;
fwAddBox(&amp;quot;SomeBox&amp;quot;, &amp;quot;ParentBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, FONT_LUXI + fwColorRGB(0.5, 0.75, 0.0) + BORDER_ALL_SIDES);&lt;br /&gt;
&lt;br /&gt;
// Speichere einen Stil-String in einer Variablen und benutze diesen.&lt;br /&gt;
fwSetVariable(&amp;quot;MyStyle&amp;quot;, FONT_MONOFUR + ALIGN_CENTER + BORDER_ALL_SIDES);&lt;br /&gt;
fwSetBoxStyle(&amp;quot;BoxA&amp;quot;, fwStyle(&amp;quot;MyStyle&amp;quot;));&lt;br /&gt;
fwSetBoxStyle(&amp;quot;BoxB&amp;quot;, fwStyle(&amp;quot;MyStyle&amp;quot;));&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets&amp;diff=1179964</id>
		<title>FURWARE text/Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets&amp;diff=1179964"/>
		<updated>2013-07-12T23:47:49Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Added fwStyle function&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page contains several useful code snippets (functions, constants) that can make the usage of [[FURWARE_text]] a lot more convenient.&lt;br /&gt;
&lt;br /&gt;
== Basic convenience functions ==&lt;br /&gt;
&lt;br /&gt;
The functions in this section are wrappers around each of the FURWARE text commands. They were designed to follow these rules:&lt;br /&gt;
&lt;br /&gt;
* The functions shall be &#039;&#039;self-contained&#039;&#039;. That is, you may copy any subset of the functions that you need and they will work.&lt;br /&gt;
* The functions (and their parameters) shall be &#039;&#039;self-explanatory&#039;&#039;. That is, they also serve as a quick reference guide to the parameters of the commands they execute.&lt;br /&gt;
&lt;br /&gt;
The fact that the functions are self-contained also means that each of them contains a [[llMessageLinked]](...)-call. The target of this call is set to [[LINK_SET]] (the whole linkset). Please change this target accordingly in your scripts, if needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
fwSetText(string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxText(string box, string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetStyle(string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxStyle(string box, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetDefaultStyle(string target, string style) {&lt;br /&gt;
    // &amp;quot;target&amp;quot; may be empty, &amp;quot;root&amp;quot; or &amp;quot;nonroot&amp;quot;.&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_defaultconf:&amp;quot; + target);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetVariable(string name, string value) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, value, &amp;quot;fw_var:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwAddBox(string name, string parent, integer x, integer y, integer w, integer h, string text, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_addbox: &amp;quot; +name + &amp;quot;:&amp;quot; + parent + &amp;quot;:&amp;quot;+&lt;br /&gt;
                    (string)x + &amp;quot;,&amp;quot; + (string)y + &amp;quot;,&amp;quot; + (string)w + &amp;quot;,&amp;quot; + (string)h + &amp;quot;:&amp;quot; + style);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwDelBox(string name) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwTouchQuery(integer linkNumber, integer faceNumber, string userData) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, userData, &amp;quot;fw_touchquery:&amp;quot; + (string)linkNumber + &amp;quot;:&amp;quot; + (string)faceNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list fwTouchReply(string replyString) {&lt;br /&gt;
    list tokens = llParseStringKeepNulls(replyString, [&amp;quot;:&amp;quot;], []);&lt;br /&gt;
    return [&lt;br /&gt;
        llList2String(tokens, 0), llList2Integer(tokens, 1), llList2Integer(tokens, 2),&lt;br /&gt;
        llList2String(tokens, 3), llList2Integer(tokens, 4), llList2Integer(tokens, 5),&lt;br /&gt;
        llDumpList2String(llDeleteSubList(tokens, 0, 5), &amp;quot;:&amp;quot;)&lt;br /&gt;
    ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetNotify(integer enabled) {&lt;br /&gt;
    string s = &amp;quot;off&amp;quot;; if (enabled) s = &amp;quot;on&amp;quot;;&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, s, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwMemory() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwReset() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The above snippets allow you to use the basic commands more easily, but you may still need to do some manual work, for example when specifying style configuration strings. The following lines give a few assorted examples of calls using the functions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Set the text of all boxes in all sets.&lt;br /&gt;
fwSetText(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Set the text of the box &amp;quot;SomeBox&amp;quot;.&lt;br /&gt;
fwSetBoxText(&amp;quot;SomeBox&amp;quot;, &amp;quot;This is some box!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Set the default style of all boxes to color=red, align=center (see the next section how to make this much nicer).&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, &amp;quot;c=red;a=center&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Add a box &amp;quot;NewBox&amp;quot; using &amp;quot;ExistingBox&amp;quot; as its parent.&lt;br /&gt;
fwAddBox(&amp;quot;NewBox&amp;quot;, &amp;quot;ExistingBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Delete a box.&lt;br /&gt;
fwDelBox(&amp;quot;NewBox&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Send a touch query from the touch_start(...)-event.&lt;br /&gt;
touch_start(integer num) {&lt;br /&gt;
    fwTouchQuery(llDetectedLinkNumber(0), llDetectedTouchFace(0), &amp;quot;Arbitrary user data goes here&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Parse a touch reply in the link_message(...)-event.&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
        list result = fwTouchReply(str);&lt;br /&gt;
        // The list &amp;quot;result&amp;quot; now contains the reply as [boxName, boxRelativeX, boxRelativeY, rootName, absoluteX, absoluteY, userData].&lt;br /&gt;
        // &amp;quot;boxName&amp;quot; is empty if the touch query was invalid.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional awesomeness ==&lt;br /&gt;
&lt;br /&gt;
The functions in the previous section are wrappers around the [[FURWARE_text]] commands, but you still need to write, for instance, style configuration strings yourself and remember the style options and values. The following set of constants and functions help you with that (again, you don&#039;t have to copy all of them but just the ones you need to save script memory!).&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Note that these constants complement the functions defined above, so make sure to copy the functions you need as well.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// === Colors ===&lt;br /&gt;
&lt;br /&gt;
string COLOR_DEFAULT            = &amp;quot;c=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Grayscales.&lt;br /&gt;
string COLOR_WHITE              = &amp;quot;c=white;&amp;quot;;&lt;br /&gt;
string COLOR_SILVER             = &amp;quot;c=silver;&amp;quot;;&lt;br /&gt;
string COLOR_GRAY               = &amp;quot;c=gray;&amp;quot;;&lt;br /&gt;
string COLOR_BLACK              = &amp;quot;c=black;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Standard colors.&lt;br /&gt;
string COLOR_RED                = &amp;quot;c=red;&amp;quot;;&lt;br /&gt;
string COLOR_GREEN              = &amp;quot;c=green;&amp;quot;;&lt;br /&gt;
string COLOR_BLUE               = &amp;quot;c=blue;&amp;quot;;&lt;br /&gt;
string COLOR_CYAN               = &amp;quot;c=cyan;&amp;quot;;&lt;br /&gt;
string COLOR_MAGENTA            = &amp;quot;c=magenta;&amp;quot;;&lt;br /&gt;
string COLOR_YELLOW             = &amp;quot;c=yellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Dark colors.&lt;br /&gt;
string COLOR_DARKRED            = &amp;quot;c=darkred;&amp;quot;;&lt;br /&gt;
string COLOR_DARKGREEN          = &amp;quot;c=darkgreen;&amp;quot;;&lt;br /&gt;
string COLOR_DARKBLUE           = &amp;quot;c=darkblue;&amp;quot;;&lt;br /&gt;
string COLOR_DARKCYAN           = &amp;quot;c=darkcyan;&amp;quot;;&lt;br /&gt;
string COLOR_DARKMAGENTA        = &amp;quot;c=darkmagenta;&amp;quot;;&lt;br /&gt;
string COLOR_DARKYELLOW         = &amp;quot;c=darkyellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Arbitrary RGB (red, green, blue) color.&lt;br /&gt;
string fwColorRGB(float red, float green, float blue) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,1&amp;quot; + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Arbitrary RGBA (red, green, blue, alpha/opacity) color.&lt;br /&gt;
string fwColorRGBA(float red, float green, float blue, float alpha) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,&amp;quot; + (string)alpha + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Alignment ===&lt;br /&gt;
&lt;br /&gt;
string ALIGN_DEFAULT            = &amp;quot;a=def;&amp;quot;;&lt;br /&gt;
string ALIGN_LEFT               = &amp;quot;a=left;&amp;quot;;&lt;br /&gt;
string ALIGN_CENTER             = &amp;quot;a=center;&amp;quot;;&lt;br /&gt;
string ALIGN_RIGHT              = &amp;quot;a=right;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Wrapping ===&lt;br /&gt;
&lt;br /&gt;
string WRAP_DEFAULT             = &amp;quot;w=def;&amp;quot;;&lt;br /&gt;
string WRAP_WORD                = &amp;quot;w=word;&amp;quot;;&lt;br /&gt;
string WRAP_CHAR                = &amp;quot;w=char;&amp;quot;;&lt;br /&gt;
string WRAP_NONE                = &amp;quot;w=none;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Trimming ===&lt;br /&gt;
&lt;br /&gt;
string TRIM_DEFAULT             = &amp;quot;t=def;&amp;quot;;&lt;br /&gt;
string TRIM_ON                  = &amp;quot;t=on;&amp;quot;;&lt;br /&gt;
string TRIM_OFF                 = &amp;quot;t=off;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Fonts ===&lt;br /&gt;
&lt;br /&gt;
string FONT_DEFAULT             = &amp;quot;f=def;&amp;quot;;&lt;br /&gt;
string FONT_ANDALE              = &amp;quot;f=e31ce6e8-4117-7073-6aac-e6503034b4c5;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO       = &amp;quot;f=24c4ead5-04cd-1831-5fd9-ec48882e00b1;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO_BOLD  = &amp;quot;f=82c4fcac-3990-223c-286d-5bc92a258fbc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU              = &amp;quot;f=f974fdfc-8fbd-2f29-2b38-3c34411c1fcc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU_BOLD         = &amp;quot;f=5054fec3-1465-af8f-2fe5-e9507795c82a;&amp;quot;;&lt;br /&gt;
string FONT_ENVYCODER           = &amp;quot;f=a2ec2cf0-b207-db51-d4a1-f3f8d6684c07;&amp;quot;;&lt;br /&gt;
string FONT_FREEFONT            = &amp;quot;f=05f6f69e-8bdf-a824-a2cf-d91c9e371c23;&amp;quot;;&lt;br /&gt;
string FONT_INCONSOLATA         = &amp;quot;f=867288f9-940e-a7cf-ac7d-5596ea7fb2c5;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION          = &amp;quot;f=c992dfc4-0aca-02c8-bc01-8330e6db6f87;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION_BOLD     = &amp;quot;f=1494337d-5296-3c43-8f7c-45617448ec9a;&amp;quot;;&lt;br /&gt;
string FONT_LUXI                = &amp;quot;f=2d8f52d7-2220-2d7a-15b5-e685a9449e5c;&amp;quot;;&lt;br /&gt;
string FONT_LUXI_BOLD           = &amp;quot;f=03812794-535b-f546-6171-6bec5bf399be;&amp;quot;;&lt;br /&gt;
string FONT_MONOFUR             = &amp;quot;f=8fc63e35-a18f-e335-3936-e2ca196a944d;&amp;quot;;&lt;br /&gt;
string FONT_NOVA                = &amp;quot;f=2df8e09d-e1bd-d17f-6bec-b8d713790380;&amp;quot;;&lt;br /&gt;
string FONT_PROFONT             = &amp;quot;f=45a8e6f6-90e4-299d-d3bc-0bf4dbf170db;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Borders ===&lt;br /&gt;
&lt;br /&gt;
string BORDER_DEFAULT           = &amp;quot;border=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// These are just some examples for common border styles.&lt;br /&gt;
string BORDER_ALL_SIDES         = &amp;quot;border=tblr;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_THICK   = &amp;quot;border=tblr1;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_DOUBLE  = &amp;quot;border=tblr2;&amp;quot;;&lt;br /&gt;
string BORDER_BOTTOM            = &amp;quot;border=b;&amp;quot;;&lt;br /&gt;
string BORDER_LEFT_RIGHT        = &amp;quot;border=lr;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// A more general helper function for borders. The side parameters are ordered clockwise, starting on top.&lt;br /&gt;
string fwBorder(integer top, integer right, integer bottom, integer left, integer style) {&lt;br /&gt;
    string result = &amp;quot;border=&amp;quot;;&lt;br /&gt;
    if (top)    result += &amp;quot;t&amp;quot;; if (right)  result += &amp;quot;r&amp;quot;;&lt;br /&gt;
    if (bottom) result += &amp;quot;b&amp;quot;; if (left)   result += &amp;quot;l&amp;quot;;&lt;br /&gt;
    if (style)  result += (string)style;&lt;br /&gt;
    return result + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Style variables ===&lt;br /&gt;
&lt;br /&gt;
// Loads a style stored in a fw_var(iable).&lt;br /&gt;
string fwStyle(string styleVariableName) {&lt;br /&gt;
    return &amp;quot;style=&amp;quot; + styleVariableName + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
Note that the value of each constant ends with &amp;quot;;&amp;quot;. This allows you to simply &amp;quot;+&amp;quot; them together and you still get valid style strings which you may then use wherever you need a style config string. This allows you to write things like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Set the color, wrapping and font of all boxes.&lt;br /&gt;
fwSetStyle(COLOR_YELLOW + WRAP_NONE + FONT_MONOFUR);&lt;br /&gt;
&lt;br /&gt;
// Set the default style for all boxes.&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, COLOR_RED + ALIGN_CENTER);&lt;br /&gt;
&lt;br /&gt;
// Add a box with some style config. We will use a custom RGB color here.&lt;br /&gt;
fwAddBox(&amp;quot;SomeBox&amp;quot;, &amp;quot;ParentBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, FONT_LUXI + fwColorRGB(0.5, 0.75, 0.0) + BORDER_ALL_SIDES);&lt;br /&gt;
&lt;br /&gt;
// Store a style string in a variable and use it.&lt;br /&gt;
fwSetVariable(&amp;quot;MyStyle&amp;quot;, FONT_MONOFUR + ALIGN_CENTER + BORDER_ALL_SIDES);&lt;br /&gt;
fwSetBoxStyle(&amp;quot;BoxA&amp;quot;, fwStyle(&amp;quot;MyStyle&amp;quot;));&lt;br /&gt;
fwSetBoxStyle(&amp;quot;BoxB&amp;quot;, fwStyle(&amp;quot;MyStyle&amp;quot;));&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Developers/de&amp;diff=1179925</id>
		<title>FURWARE text/Developers/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Developers/de&amp;diff=1179925"/>
		<updated>2013-07-11T20:07:48Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: Initial German translation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Seite beinhaltet technische Informationen zu [[FURWARE text]] und richtet sich an Entwickler und interessierte Benutzer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Wenn du mehr zu einem bestimmten Thema wissen möchtest, hinterlasse bitte eine Notiz auf der Diskussionsseite. :)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Terminologie und Hierarchien ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein &amp;quot;&#039;&#039;&#039;Set&#039;&#039;&#039;&amp;quot; bezeichnet ein Text-Display, das aus in Zeilen und Spalten angeordneten Prims besteht. Jedes Set hat einen Namen, der in der Regel mithilfe des Display Creators gesetzt wird. Ein Linkset kann mehrere Sets enthalten.&lt;br /&gt;
&lt;br /&gt;
Eine &amp;quot;&#039;&#039;&#039;Box&#039;&#039;&#039;&amp;quot; ist eine virtuelle Text-Box innerhalb eines Sets. Jedes Set hat immer eine (Root-)Box mit derselben Größe und demselben Namen wie das Set. Jeder Box wird beim Erstellen ein Name zugewiesen (per Parameter des &#039;&#039;fw_addbox&#039;&#039;-Befehls). Zu einem Set können mehrere Boxen hinzugefügt werden, die dann in Layern übereinandergelegt dargestellt werden (in der Reihenfolge, in der sie hinzugefügt wurden).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Daraus folgen einige Zusammenhänge:&lt;br /&gt;
&lt;br /&gt;
* Eine Box ist immer Teil von einem Set und liegt vollständig innerhalb von diesem.&lt;br /&gt;
* Ein Set besteht aus einem oder mehreren Prims.&lt;br /&gt;
* Ein Prim kann mehrere Faces haben.&lt;br /&gt;
* Jedes Face stellt ein Zeichen des Texts dar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Text-Inhalt einer Box wird oft als &amp;quot;&#039;&#039;&#039;data&#039;&#039;&#039;&amp;quot; der Box bezeichnet (&amp;quot;data&amp;quot; wird aber auch in allgemeinerem Zusammenhang verwendet).&lt;br /&gt;
&lt;br /&gt;
Der Text-Stil einer Box (oder Textabschnitten) wird oft als &amp;quot;&#039;&#039;&#039;conf&#039;&#039;&#039;&amp;quot; (der Box) bezeichnet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datenstrukturen für Box-, Set- und Prim-Informationen ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die meisten Informationen zur Geometrie und zum Inhalt des Displays werden in einigen [[list|Listen]] gespeichert. Einige [[list|Listen]] enthalten auch Indizes (&amp;quot;Pointer&amp;quot;) zu Daten in anderen [[list|Listen]].&lt;br /&gt;
&lt;br /&gt;
=== Box-Informationen ===&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;boxNameList&amp;quot; ist eine einfache [[list|Liste]] der Namen aller Boxen. Der Grund dafür, dass die Namen in einer separaten [[list|Liste]] vorgehalten werden (und nicht als Teil von &amp;quot;boxDataList&amp;quot;, siehe unten) ist, dass die Namen schnell durchsuchbar sein sollen. Das ist beispielsweise nötig wenn neuer Text gesetzt werden soll und der Index einer Box ermittelt werden muss anhand ihres Namens.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;boxDataList&amp;quot; ist eine [[:Category:LSL_List#Strided_lists|Strided List]], die mehr Informationen zu jeder Box enthält. Ein Stride enthält:&lt;br /&gt;
** Den Text der Box ([[string]]).&lt;br /&gt;
** Die Textstil-Einstellung der Box ([[string]]).&lt;br /&gt;
** Einen Pointer auf den Beginn des Sets in der &amp;quot;setDataList&amp;quot; zu dem diese Box gehört ([[integer]]).&lt;br /&gt;
** Den Status der Box (u.A. ob die box &amp;quot;dirty&amp;quot; ist und neu gezeichnet werden muss) (bit-packed [[integer]]).&lt;br /&gt;
** Die Geometrie der box (Spalten-Offset, Zeilen-Offset, Breite, Höhe) ([[rotation]]).&lt;br /&gt;
&lt;br /&gt;
=== Set-Informationen ===&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;setDataList&amp;quot; ist eine [[:Category:LSL_List#Strided_lists|Strided List]], die Informationen zu jedem Set enthält. Ein Stride enthält:&lt;br /&gt;
** Die Geometrie des Sets (Anzahl von Prim-Spalten und -Zeilen, Anzahl der Faces) ([[vector]]).&lt;br /&gt;
** Einen Pointer zum Beginn der Prim-Informationen in den &amp;quot;prim*List&amp;quot;-Listen ([[integer]]).&lt;br /&gt;
&lt;br /&gt;
=== Prim-Informationen ===&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;primLinkList&amp;quot; enthält die Link-Nummern der einzelnen Prims, sortiert zuerst nach Set, dann nach Zeilen, dann nach Spalten. Die Link-Nummern sind nicht bit-packed, weil sie schnell durchsuchbar sein sollen, etwa wenn Touch Queries bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;primFillList&amp;quot; enthält bit-packed Integer, die den Status der einzelnen Faces auf den Prims enthalten. &amp;quot;Der Status&amp;quot; bedeutet hier, ob die Faces momenten ein Leerzeichen anzeigen oder nicht. Diese Information wird als Cache benutzt um unnötige SetPrimitiveParams-Aufrufe zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;primLayerList&amp;quot; enthält bit-packed Integer, die die Zuordnung von Faces zu Layern beinhaltet. Die 32 Bits des Integers sind dabei in je 4 Bits für jedes Face geteilt und somit kann jedem Face eine von 16 Layer-IDs zugeteilt werden. Diese Information wird während des Renderns verwendet um schnell feststellen zu können, welcher Layer an der Position dieses Faces gerade im Vordergrund liegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Grundlegender Ablauf der Events ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das folgende Bild ist ein Versuch, die grundlegenden Zusammenhänge von Events und Funktionen im FURWARE text-Skript darzustellen, wenn ein Befehl empfangen wird, der den Inhalt oder das Layout des Displays verändert (eine deutsche Übersetzung folgt).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:FURWARE_text_basic_event_flow.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Initialisierungs-Routine ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To do&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der [[link_message]](...)-Handler ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To do&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die setDirty(...)-Funktion ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht zwischen dem Entgegennehmen von Befehlen in [[link_message]](...) und dem tatsächlichen (Neu-)Zeichnen in refresh(...). Sie besitzt folgende Parameter:&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; action ===&lt;br /&gt;
&lt;br /&gt;
Kann einen der Werte der Konstanten ACTION_CONTENT, ACTION_ADD_BOX oder ACTION_DEL_BOX annehmen. Dieser Wert gibt an, welche &#039;&#039;Art&#039;&#039; von Kommando ausgeführt werden soll (beispielsweise ist das Setzen von neuem Text von der Art ACTION_CONTENT). Der übergebene Wert wird als globale Variable gespeichert und beim nächsten Aufruf von refresh(...) wieder zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
Der Grund dafür, dass wir uns diesen Wert merken, ist das &#039;&#039;zeitverzögerte Aktualisieren&#039;&#039; des Displays (welches im Übrigen einer der Gründe ist, weshalb setDirty(...) als Puffer zwischen Parsen und Refreshen überhaupt eingebaut wurde). Am Ende von setDirty(...) wird ein Timer mit einem recht kurzen Intervall gestartet. Das [[timer]]()-Event ruft dann lediglich refresh() auf. Allerdings können in dieser kurzen Zeit noch weitere [[link_message]](...)-Events empfangen und verarbeitet werden, was uns erlaubt, mehrere Befehle zu sammeln bevor wir das Display tatsächlich aktualisieren (beispielsweise das Setzen von Text mehrerer verschiedener Boxen). Dies kann in manchen Situationen einen großen Geschwindigkeitsvorteil bringen. Beachte, dass der Timer nicht neugestartet wird, wenn die letzte Aktion bereits auf etwas anderes als [[FALSE|0]] gesetzt ist. Das &amp;quot;garantiert&amp;quot; uns, dass das [[timer]]()-Event irgendwann ausgeführt wird, selbst wenn wir einen konstanten Strom von Befehlen empfangen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Es gibt allerdings einen Haken an der Sache.&#039;&#039; Wenn wir alle verschiedenen Arten von Befehlen wie das Setzen von Text, Stilen, Variablen, das Hinzufügen und Entfernen von Boxen sammeln würden ohne zu geeigneten Zeitpunkten zu aktualisieren, würden wir irgendwann ein Durcheinander und kaputte Datenstrukturen haben (du darfst gerne über die Details nachdenken, aber es verursacht Kopfschmerzen). Hier kommt die Unterscheidung zwischen den verschiedenen Arten von Aktionen ins Spiel.&lt;br /&gt;
&lt;br /&gt;
Operationen, die lediglich den &amp;quot;Inhalt&amp;quot; von Boxen verändern sind gewissermaßen &amp;quot;kompatibel&amp;quot; zueinander und können gesammelt werden, da die Indizes der Listen mit Box-Informationen und der Layer während der Änderungen &#039;&#039;konstant&#039;&#039; bleiben. Operationen, die &#039;&#039;Boxen hinzufügen&#039;&#039; können ebenfalls gesammelt werden, da die Informationen lediglich zu einigen [[list|Listen]] hinzugefügt werden und wir dann die neuen Boxen auf einmal aktualisieren können. Operationen, die &#039;&#039;Boxen löschen&#039;&#039; können gesammelt werden, da wir uns im Grunde nur merken müssen, welche Layer wieder freigeworden sind. Anschließend können wir durch die verbliebenen Boxen gehen und diese entsprechend neu zeichnen.&lt;br /&gt;
&lt;br /&gt;
Da das &#039;&#039;Mischen&#039;&#039; der verschiedenen Arten von Operationen &#039;&#039;ungut&#039;&#039; ist, prüft der Handler wenn ein neuer Befehl hereinkommt, ob die neue Operation mit der vorherigen kompatibel ist (das heißt, &amp;quot;Art der letzten Operation&amp;quot; == &amp;quot;Art der neuen Operation&amp;quot;) und wenn sie dies nicht ist, wird ein &#039;&#039;sofortiges&#039;&#039; Aktualisieren erzwungen bevor der Befehl verarbeitet wird. Beachte, dass nur die &#039;&#039;Art&#039;&#039; der Operation gleich sein muss, nicht der genaue Befehl; beispielsweise sind die Befehle fw_data und fw_conf zueinander kompatibel, da beide den Typ ACTION_CONTENT besitzen.&lt;br /&gt;
&lt;br /&gt;
Beachte weiterhin, dass die Art der Operation die Arbeitsweise der refresh()-Funktion beeinflusst; bitte siehe den entsprechenden Abschnitt für Einzelheiten.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; first / last ===&lt;br /&gt;
&lt;br /&gt;
Das Intervall von Box-Indizes, auf denen gearbeitet werden soll. Dies erlaubt uns direkt auf einer ganzen Reihe von Boxen auf einmal zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; isConf ===&lt;br /&gt;
&lt;br /&gt;
Kann entweder [[FALSE|0]] oder [[TRUE|1]] sein. Dieser Wert wird dazu benutzt um festzustellen, ob etwaig übergebene Daten als data oder conf der Box(en) gespeichert werden sollen. Außerdem wird das (Neu-)Zeichnen der Rahmen von Boxen erzwungen, wenn isConf [[TRUE|1]] ist, da sich dieser geändert haben könnte.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; newLayerOverrideBits ===&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle wird es ein wenig knifflig. :) Bevor wir uns um den Sinn dieses Wertes kümmern, hier einige Fakten: Dieser Parameter sollte nur Nicht-Null sein, wenn Boxen hinzugefügt oder entfernt werden. Der Wert wird bit-packed als Teil des Status der Boxen in boxDataList gespeichert und am Ende von refresh() wieder gelöscht. Der Wert selbst ist 16 Bits lang und jedes Bit steht für einen der 16 möglichen Layer innerhalb eines Sets. Beispielsweise bedeutet ein Wert von 0xFFFF (binär 1111111111111111) &amp;quot;alle Layer&amp;quot; während ein Wert von 0x4 (binär 0000000000000100) &amp;quot;Layer 2&amp;quot; bedeutet (von 0 beginnend gezählt).&lt;br /&gt;
&lt;br /&gt;
Der Wert wird in der draw(...)-Funktion verwendet, welche an verschiedenen Stellen in refresh() benutzt wird um ein Zeichen auf eine Face zu zeichnen. Normalerweise holt sich draw(...) die ID des Layers, der sich an der Position des Face gerade im Vordergrund befindet, sowie die ID des Layers der Box, die gerade gezeichnet werden soll. Wenn diese Layer-IDs ungleich sind, dann wird die Face nicht verändert, da die zu zeichnende Box an der Stelle nicht im Vordergrund ist.&lt;br /&gt;
&lt;br /&gt;
Wenn wir jetzt aber eine Box hinzufügen oder entfernen, dann kann sich die Information, welche Layer an welchen Stellen im Vordergrund sind, für einige Faces ändern. Das ist genau die Information, die uns die newLayerOverrideBits liefern. Wenn beispielsweise eine neue Box hinzugefügt wird, sind deren Override-Bits auf 0xFFFF gesetzt. Wenn diese Box nun gezeichnet wird, dann merkt die draw(...)-Funktion, dass sie alle anderen Layer überschreiben und die neue Box darüber zeichnen soll. Wenn eine Box entfernt wird ist die Logik ähnlich, allerdings werden nur bestimmte Bits gesetzt und die Reihenfolge des Refreshs wird umgedreht; siehe dazu auch den Abschnitt über die refresh()-Funktion.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; setIndex ===&lt;br /&gt;
&lt;br /&gt;
Erlaubt uns, das (Über-)Schreiben von Informationen auf Boxen eines bestimmten Sets einzuschränken. Ein Wert von -1 bedeutet, dass auf allen Sets gearbeitet werden soll.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[integer]]&#039;&#039; withData ===&lt;br /&gt;
&lt;br /&gt;
Gibt an, ob der &amp;quot;data&amp;quot;-Parameter (siehe unten) Daten enthält. Das erlaubt eine Unterscheidung zwischen dem leeren String und &amp;quot;keine Daten angegeben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;[[string]]&#039;&#039; data ===&lt;br /&gt;
&lt;br /&gt;
Enthält entweder neuen Text oder neue Stil-Einstellungen zur Speicherung in boxDataList.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die refresh()-Funktion ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die refresh()-Funktion kann als das &amp;quot;Herz&amp;quot; des Text-Skripts angesehen werden. Sie wird entweder aufgerufen nachdem einige Änderungen gesammelt wurden oder wenn eine Aktualisierung während des Abarbeitens eines Befehls erzwungen werden muss.&lt;br /&gt;
&lt;br /&gt;
Sie besteht hauptsächlich aus einer großen Schleife, die über alle Boxen iteriert und deren &amp;quot;Dirty&amp;quot;-Bit prüft. Wenn eine Box als dirty markiert ist, werden ihre Informationen (Text, Stil, Geometrie) geladen und zum Zeichnen vorbereitet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ein paar Worte zur Reihenfolge der Schleife:&#039;&#039;&#039; Normalerweise werden die Boxen in der &#039;&#039;umgekehrten&#039;&#039; Reihenfolge, in der sie hinzugefügt wurden, durchgegangen. Das bedeutet, dass die Boxen &amp;quot;von oben nach unten&amp;quot; aktualisiert werden (bezüglich der Layer). Allerdings gibt es eine Ausnahme: Wenn die Art des letzten Befehls ACTION_ADD_BOX war (siehe auch den &amp;quot;action&amp;quot;-Parameter von setDirty(...)), dann werden die Boxen &#039;&#039;in&#039;&#039; der Reihenfolge, in der sie hinzugefügt wurden, durchgegangen (&amp;quot;von unten nach oben&amp;quot;). Dies ist nötig um die Information, welche Layer auf welchen Faces gerade im Vordergrund sind, korrekt zu aktualisieren (siehe auch den &amp;quot;newLayerOverrideBits&amp;quot;-Parameter von setDirty(...)).&lt;br /&gt;
&lt;br /&gt;
Zurück zur Schleife und dem &amp;quot;Dirty&amp;quot;-Bit. Genauergesagt gibt es zwei &amp;quot;Dirty&amp;quot;-Bits: Eines sagt uns, ob die Box überhaupt aktualisiert werden soll und ein zweites, ob außerdem die Rahmen der Box u.U. aktualisiert werden müssen. Wenn etwa lediglich der Text einer Box geändert wurde – aber nicht die Stileinstellungen – dann gibt es keinen Grund, den Rahmen neuzuzeichnen.&lt;br /&gt;
&lt;br /&gt;
Der Text der Box wird dann in Teile zerlegt (an den Stellen wo Leerzeichen, Umbrüche, Stil-Markup auftreten) und eine innere Schleife iteriert durch diese Teile, welche wiederum Listen von einzelnen Zeichen und Stilinformationen, die direkt im Text gegeben sind, vorbereitet. Sobald eine Zeile an Daten vorbereitet ist (eine Zeile bedeutet hier eine Zeile von Prims), kümmert sich eine weitere kleine Schleife um das eigentliche Zeichnen auf die Faces. Anschließend wird mit der nächsten Zeile fortgefahren.&lt;br /&gt;
&lt;br /&gt;
Nachdem eine Box aktualisiert wurde, werden ihre &amp;quot;Dirty&amp;quot;-Bits zurückgesetzt. Sobald alle Boxen fertig sind, wird die global gespeicherte Art der letzten Aktion zurückgesetzt und (falls die &amp;quot;Notification&amp;quot;-Option aktiviert ist) eine &amp;quot;fw_done&amp;quot;-Nachricht an das Linkset gesendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Caching-Strategien ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To do&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets/de&amp;diff=1179889</id>
		<title>FURWARE text/Snippets/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets/de&amp;diff=1179889"/>
		<updated>2013-07-10T23:33:49Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Seite beinhaltet verschiedene nützliche Code-Schnipsel (Funktionen, Konstanten), die die Arbeit mit [[FURWARE_text/de|FURWARE_text]] wesentlich angenehmer machen.&lt;br /&gt;
&lt;br /&gt;
== Grundlegende Funktionen ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionen in diesem Abschnitt sind Wrapper um die einzelnen [[FURWARE_text/de|FURWARE_text]]-Befehle. Sie wurden so entworfen, dass sie den folgenden Anforderungen genügen:&lt;br /&gt;
&lt;br /&gt;
* Die Funktionen sollen &#039;&#039;in sich abgeschlossen&#039;&#039; sein. Das heißt, dass du auch nur diejenigen Funktionen kopieren kannst, die du wirklich benötigst und sie werden funktionieren.&lt;br /&gt;
* Die Funktionen (und deren Parameter) sollen &#039;&#039;selbsterklärend&#039;&#039; sein. Das heißt, dass sie auch direkt als eine Kurzreferenz für den Befehl dienen sollen, den sie ausführen.&lt;br /&gt;
&lt;br /&gt;
Dass die Funktionen in sich abgeschlossen sind bedeutet auch, dass jede der Funktionen einen [[llMessageLinked]](...)-Aufruf enthält. Das Ziel dieser Aufrufe ist hier auf [[LINK_SET]] (also das gesamte Linkset) gesetzt. Falls nötig, ändere dieses Ziel bitte in deinen Skripten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
fwSetText(string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxText(string box, string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetStyle(string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxStyle(string box, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetDefaultStyle(string target, string style) {&lt;br /&gt;
    // &amp;quot;target&amp;quot; darf leer, &amp;quot;root&amp;quot; oder &amp;quot;nonroot&amp;quot; sein.&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_defaultconf:&amp;quot; + target);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetVariable(string name, string value) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, value, &amp;quot;fw_var:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwAddBox(string name, string parent, integer x, integer y, integer w, integer h, string text, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_addbox: &amp;quot; +name + &amp;quot;:&amp;quot; + parent + &amp;quot;:&amp;quot;+&lt;br /&gt;
                    (string)x + &amp;quot;,&amp;quot; + (string)y + &amp;quot;,&amp;quot; + (string)w + &amp;quot;,&amp;quot; + (string)h + &amp;quot;:&amp;quot; + style);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwDelBox(string name) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwTouchQuery(integer linkNumber, integer faceNumber, string userData) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, userData, &amp;quot;fw_touchquery:&amp;quot; + (string)linkNumber + &amp;quot;:&amp;quot; + (string)faceNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list fwTouchReply(string replyString) {&lt;br /&gt;
    list tokens = llParseStringKeepNulls(replyString, [&amp;quot;:&amp;quot;], []);&lt;br /&gt;
    return [&lt;br /&gt;
        llList2String(tokens, 0), llList2Integer(tokens, 1), llList2Integer(tokens, 2),&lt;br /&gt;
        llList2String(tokens, 3), llList2Integer(tokens, 4), llList2Integer(tokens, 5),&lt;br /&gt;
        llDumpList2String(llDeleteSubList(tokens, 0, 5), &amp;quot;:&amp;quot;)&lt;br /&gt;
    ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetNotify(integer enabled) {&lt;br /&gt;
    string s = &amp;quot;off&amp;quot;; if (enabled) s = &amp;quot;on&amp;quot;;&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, s, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwMemory() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwReset() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
&lt;br /&gt;
Die oben aufgeführen Funktionen erlauben dir zwar die meisten Befehle einfacher zu verwenden, aber einige Details müssen dennoch von Hand erledigt werden, beispielsweise das Angeben von Textstil-Konfigurationen. Die folgenden Zeilen geben dir ein paar Beispiele für die Verwendung der Funktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Setzt den Text aller Boxen in allen Sets.&lt;br /&gt;
fwSetText(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Setzt den Text der Box &amp;quot;SomeBox&amp;quot;.&lt;br /&gt;
fwSetBoxText(&amp;quot;SomeBox&amp;quot;, &amp;quot;This is some box!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Setzt den Standard-Stil aller Boxen auf color=red, align=center (der nächste Abschnitt zeigt, wie man dies schöner erledigen kann).&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, &amp;quot;c=red;a=center&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Füge eine Box &amp;quot;NewBox&amp;quot; mit &amp;quot;ExistingBox&amp;quot; als Parent hinzu.&lt;br /&gt;
fwAddBox(&amp;quot;NewBox&amp;quot;, &amp;quot;ExistingBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Lösche eine Box.&lt;br /&gt;
fwDelBox(&amp;quot;NewBox&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Sende eine Touch Query aus dem touch_start(...)-Event heraus.&lt;br /&gt;
touch_start(integer num) {&lt;br /&gt;
    fwTouchQuery(llDetectedLinkNumber(0), llDetectedTouchFace(0), &amp;quot;Arbitrary user data goes here&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Verarbeite eine &amp;quot;Touch Reply&amp;quot;-Antwort im link_message(...)-Event.&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
        list result = fwTouchReply(str);&lt;br /&gt;
        // Die Liste &amp;quot;result&amp;quot; enthält jetzt die Antwort als [boxName, boxRelativeX, boxRelativeY, rootName, absoluteX, absoluteY, userData].&lt;br /&gt;
        // &amp;quot;boxName&amp;quot; ist leer, wenn die Touch Query ungültig war.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Noch angenehmere Verwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionen im letzten Abschnitt sind lediglich Wrapper um die [[FURWARE_text/de|FURWARE_text]]-Befehle, allerdings muss du weiterhin Dinge wie Stileinstellungen selber schreiben und dir die verschiedenen Optionen und deren Werte merken. Die folgenden Konstanten und Funktionen nehmen dir einen Teil dieser Arbeit ab (auch hier gilt, dass du nur die Teile kopieren musst, die du tatsächlich benötigst – auch um Speicher zu sparen!).&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Beachte, dass die folgenden Zeilen die Funktionen im vorigen Abschnitt ergänzen, d.h. du musst die entsprechenden Funktionen zusätzlich mitkopieren.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// === Farben (colors) ===&lt;br /&gt;
&lt;br /&gt;
string COLOR_DEFAULT            = &amp;quot;c=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Graustufen.&lt;br /&gt;
string COLOR_WHITE              = &amp;quot;c=white;&amp;quot;;&lt;br /&gt;
string COLOR_SILVER             = &amp;quot;c=silver;&amp;quot;;&lt;br /&gt;
string COLOR_GRAY               = &amp;quot;c=gray;&amp;quot;;&lt;br /&gt;
string COLOR_BLACK              = &amp;quot;c=black;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Standardfarben.&lt;br /&gt;
string COLOR_RED                = &amp;quot;c=red;&amp;quot;;&lt;br /&gt;
string COLOR_GREEN              = &amp;quot;c=green;&amp;quot;;&lt;br /&gt;
string COLOR_BLUE               = &amp;quot;c=blue;&amp;quot;;&lt;br /&gt;
string COLOR_CYAN               = &amp;quot;c=cyan;&amp;quot;;&lt;br /&gt;
string COLOR_MAGENTA            = &amp;quot;c=magenta;&amp;quot;;&lt;br /&gt;
string COLOR_YELLOW             = &amp;quot;c=yellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Dunkle Farben.&lt;br /&gt;
string COLOR_DARKRED            = &amp;quot;c=darkred;&amp;quot;;&lt;br /&gt;
string COLOR_DARKGREEN          = &amp;quot;c=darkgreen;&amp;quot;;&lt;br /&gt;
string COLOR_DARKBLUE           = &amp;quot;c=darkblue;&amp;quot;;&lt;br /&gt;
string COLOR_DARKCYAN           = &amp;quot;c=darkcyan;&amp;quot;;&lt;br /&gt;
string COLOR_DARKMAGENTA        = &amp;quot;c=darkmagenta;&amp;quot;;&lt;br /&gt;
string COLOR_DARKYELLOW         = &amp;quot;c=darkyellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Beliebige RGB- (Rot, Grün, Blau) Farben.&lt;br /&gt;
string fwColorRGB(float red, float green, float blue) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,1&amp;quot; + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Beliebige RGBA- (Rot, Grün, Blau, Alpha/Deckkraft) Farben.&lt;br /&gt;
string fwColorRGBA(float red, float green, float blue, float alpha) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,&amp;quot; + (string)alpha + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Ausrichtung (alignment) ===&lt;br /&gt;
&lt;br /&gt;
string ALIGN_DEFAULT            = &amp;quot;a=def;&amp;quot;;&lt;br /&gt;
string ALIGN_LEFT               = &amp;quot;a=left;&amp;quot;;&lt;br /&gt;
string ALIGN_CENTER             = &amp;quot;a=center;&amp;quot;;&lt;br /&gt;
string ALIGN_RIGHT              = &amp;quot;a=right;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Umbruch (wrapping) ===&lt;br /&gt;
&lt;br /&gt;
string WRAP_DEFAULT             = &amp;quot;w=def;&amp;quot;;&lt;br /&gt;
string WRAP_WORD                = &amp;quot;w=word;&amp;quot;;&lt;br /&gt;
string WRAP_CHAR                = &amp;quot;w=char;&amp;quot;;&lt;br /&gt;
string WRAP_NONE                = &amp;quot;w=none;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Abschneiden von Leerzeichen am Anfang/Ende (trimming) ===&lt;br /&gt;
&lt;br /&gt;
string TRIM_DEFAULT             = &amp;quot;t=def;&amp;quot;;&lt;br /&gt;
string TRIM_ON                  = &amp;quot;t=on;&amp;quot;;&lt;br /&gt;
string TRIM_OFF                 = &amp;quot;t=off;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Schriftarten (fonts) ===&lt;br /&gt;
&lt;br /&gt;
string FONT_DEFAULT             = &amp;quot;f=def;&amp;quot;;&lt;br /&gt;
string FONT_ANDALE              = &amp;quot;f=e31ce6e8-4117-7073-6aac-e6503034b4c5;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO       = &amp;quot;f=24c4ead5-04cd-1831-5fd9-ec48882e00b1;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO_BOLD  = &amp;quot;f=82c4fcac-3990-223c-286d-5bc92a258fbc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU              = &amp;quot;f=f974fdfc-8fbd-2f29-2b38-3c34411c1fcc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU_BOLD         = &amp;quot;f=5054fec3-1465-af8f-2fe5-e9507795c82a;&amp;quot;;&lt;br /&gt;
string FONT_ENVYCODER           = &amp;quot;f=a2ec2cf0-b207-db51-d4a1-f3f8d6684c07;&amp;quot;;&lt;br /&gt;
string FONT_FREEFONT            = &amp;quot;f=05f6f69e-8bdf-a824-a2cf-d91c9e371c23;&amp;quot;;&lt;br /&gt;
string FONT_INCONSOLATA         = &amp;quot;f=867288f9-940e-a7cf-ac7d-5596ea7fb2c5;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION          = &amp;quot;f=c992dfc4-0aca-02c8-bc01-8330e6db6f87;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION_BOLD     = &amp;quot;f=1494337d-5296-3c43-8f7c-45617448ec9a;&amp;quot;;&lt;br /&gt;
string FONT_LUXI                = &amp;quot;f=2d8f52d7-2220-2d7a-15b5-e685a9449e5c;&amp;quot;;&lt;br /&gt;
string FONT_LUXI_BOLD           = &amp;quot;f=03812794-535b-f546-6171-6bec5bf399be;&amp;quot;;&lt;br /&gt;
string FONT_MONOFUR             = &amp;quot;f=8fc63e35-a18f-e335-3936-e2ca196a944d;&amp;quot;;&lt;br /&gt;
string FONT_NOVA                = &amp;quot;f=2df8e09d-e1bd-d17f-6bec-b8d713790380;&amp;quot;;&lt;br /&gt;
string FONT_PROFONT             = &amp;quot;f=45a8e6f6-90e4-299d-d3bc-0bf4dbf170db;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Rahmen (borders) ===&lt;br /&gt;
&lt;br /&gt;
string BORDER_DEFAULT           = &amp;quot;border=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Einige Beispiele für oft benutzte Rahmenstile.&lt;br /&gt;
string BORDER_ALL_SIDES         = &amp;quot;border=tblr;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_THICK   = &amp;quot;border=tblr1;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_DOUBLE  = &amp;quot;border=tblr2;&amp;quot;;&lt;br /&gt;
string BORDER_BOTTOM            = &amp;quot;border=b;&amp;quot;;&lt;br /&gt;
string BORDER_LEFT_RIGHT        = &amp;quot;border=lr;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Eine allgemeinere Hilfsfunktion für Rahmen. Die Seiten-Parameter sind von oben beginnend im Uhrzeigersinn angeordnet.&lt;br /&gt;
string fwBorder(integer top, integer right, integer bottom, integer left, integer style) {&lt;br /&gt;
    string result = &amp;quot;border=&amp;quot;;&lt;br /&gt;
    if (top)    result += &amp;quot;t&amp;quot;; if (right)  result += &amp;quot;r&amp;quot;;&lt;br /&gt;
    if (bottom) result += &amp;quot;b&amp;quot;; if (left)   result += &amp;quot;l&amp;quot;;&lt;br /&gt;
    if (style)  result += (string)style;&lt;br /&gt;
    return result + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
&lt;br /&gt;
Jeder Wert der Konstanten endet mit einem &amp;quot;;&amp;quot;. Das erlaubt dir, die Konstanten einfach mit &amp;quot;+&amp;quot; zu verbinden und trotzdem gültige Strings für Stileinstellungen zu erhalten. Damit kannst du so etwas schreiben wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Setzt die Farbe (color), den Umbruch (wrapping) und die Schriftart (font) für alle Boxen.&lt;br /&gt;
fwSetStyle(COLOR_YELLOW + WRAP_NONE + FONT_MONOFUR);&lt;br /&gt;
&lt;br /&gt;
// Setzt die Standard-Stileinstellung für alle Boxen.&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, COLOR_RED + ALIGN_CENTER);&lt;br /&gt;
&lt;br /&gt;
// Füge eine Box mit einer Stileinstellung hinzu. Wir benutzen hier eine selbstspezifizierte RGB-Farbe.&lt;br /&gt;
fwAddBox(&amp;quot;SomeBox&amp;quot;, &amp;quot;ParentBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, FONT_LUXI + fwColorRGB(0.5, 0.75, 0.0) + BORDER_ALL_SIDES);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Ochi_Wolfe&amp;diff=1179888</id>
		<title>User talk:Ochi Wolfe</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Ochi_Wolfe&amp;diff=1179888"/>
		<updated>2013-07-10T23:19:04Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Moin ==&lt;br /&gt;
&lt;br /&gt;
Ich war so frei und hab mal deinen Projektseiten ein paar wiki-interne Links verpasst. Schönen Abend noch! -- [[User:Kireji Haiku|Kireji Haiku]] 15:18, 10 July 2013 (PDT)&lt;br /&gt;
:Sehr cool, danke. :) -- [[User:Ochi Wolfe|Ochi Wolfe]] 16:19, 10 July 2013 (PDT)&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets/de&amp;diff=1179882</id>
		<title>FURWARE text/Snippets/de</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets/de&amp;diff=1179882"/>
		<updated>2013-07-10T22:00:43Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Seite beinhaltet verschiedene nützliche Code-Schnipsel (Funktionen, Konstanten), die die Arbeit mit FURWARE text wesentlich angenehmer machen.&lt;br /&gt;
&lt;br /&gt;
== Grundlegende Funktionen ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionen in diesem Abschnitt sind Wrapper um die einzelnen FURWARE text-Befehle. Sie wurden so entworfen, dass sie den folgenden Anforderungen genügen:&lt;br /&gt;
&lt;br /&gt;
* Die Funktionen sollen &#039;&#039;in sich abgeschlossen&#039;&#039; sein. Das heißt, dass du auch nur diejenigen Funktionen kopieren kannst, die du wirklich benötigst und sie werden funktionieren.&lt;br /&gt;
* Die Funktionen (und deren Parameter) sollen &#039;&#039;selbsterklärend&#039;&#039; sein. Das heißt, dass sie auch direkt als eine Kurzreferenz für den Befehl dienen sollen, den sie ausführen.&lt;br /&gt;
&lt;br /&gt;
Dass die Funktionen in sich abgeschlossen sind bedeutet auch, dass jede der Funktionen einen &#039;&#039;llMessageLinked(...)&#039;&#039;-Aufruf enthält. Das Ziel dieser Aufrufe ist hier auf &#039;&#039;LINK_SET&#039;&#039; (also das gesamte Linkset) gesetzt. Falls nötig, ändere dieses Ziel bitte in deinen Skripten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
fwSetText(string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxText(string box, string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetStyle(string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxStyle(string box, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetDefaultStyle(string target, string style) {&lt;br /&gt;
    // &amp;quot;target&amp;quot; darf leer, &amp;quot;root&amp;quot; oder &amp;quot;nonroot&amp;quot; sein.&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_defaultconf:&amp;quot; + target);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetVariable(string name, string value) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, value, &amp;quot;fw_var:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwAddBox(string name, string parent, integer x, integer y, integer w, integer h, string text, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_addbox: &amp;quot; +name + &amp;quot;:&amp;quot; + parent + &amp;quot;:&amp;quot;+&lt;br /&gt;
                    (string)x + &amp;quot;,&amp;quot; + (string)y + &amp;quot;,&amp;quot; + (string)w + &amp;quot;,&amp;quot; + (string)h + &amp;quot;:&amp;quot; + style);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwDelBox(string name) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwTouchQuery(integer linkNumber, integer faceNumber, string userData) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, userData, &amp;quot;fw_touchquery:&amp;quot; + (string)linkNumber + &amp;quot;:&amp;quot; + (string)faceNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list fwTouchReply(string replyString) {&lt;br /&gt;
    list tokens = llParseStringKeepNulls(replyString, [&amp;quot;:&amp;quot;], []);&lt;br /&gt;
    return [&lt;br /&gt;
        llList2String(tokens, 0), llList2Integer(tokens, 1), llList2Integer(tokens, 2),&lt;br /&gt;
        llList2String(tokens, 3), llList2Integer(tokens, 4), llList2Integer(tokens, 5),&lt;br /&gt;
        llDumpList2String(llDeleteSubList(tokens, 0, 5), &amp;quot;:&amp;quot;)&lt;br /&gt;
    ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetNotify(integer enabled) {&lt;br /&gt;
    string s = &amp;quot;off&amp;quot;; if (enabled) s = &amp;quot;on&amp;quot;;&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, s, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwMemory() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwReset() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
&lt;br /&gt;
Die oben aufgeführen Funktionen erlauben dir zwar die meisten Befehle einfacher zu verwenden, aber einige Details müssen dennoch von Hand erledigt werden, beispielsweise das Angeben von Textstil-Konfigurationen. Die folgenden Zeilen geben dir ein paar Beispiele für die Verwendung der Funktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Setzt den Text aller Boxen in allen Sets.&lt;br /&gt;
fwSetText(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Setzt den Text der Box &amp;quot;SomeBox&amp;quot;.&lt;br /&gt;
fwSetBoxText(&amp;quot;SomeBox&amp;quot;, &amp;quot;This is some box!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Setzt den Standard-Stil aller Boxen auf color=red, align=center (der nächste Abschnitt zeigt, wie man dies schöner erledigen kann).&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, &amp;quot;c=red;a=center&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Füge eine Box &amp;quot;NewBox&amp;quot; mit &amp;quot;ExistingBox&amp;quot; als Parent hinzu.&lt;br /&gt;
fwAddBox(&amp;quot;NewBox&amp;quot;, &amp;quot;ExistingBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Lösche eine Box.&lt;br /&gt;
fwDelBox(&amp;quot;NewBox&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Sende eine Touch Query aus dem touch_start(...)-Event heraus.&lt;br /&gt;
touch_start(integer num) {&lt;br /&gt;
    fwTouchQuery(llDetectedLinkNumber(0), llDetectedTouchFace(0), &amp;quot;Arbitrary user data goes here&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Verarbeite eine &amp;quot;Touch Reply&amp;quot;-Antwort im link_message(...)-Event.&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
        list result = fwTouchReply(str);&lt;br /&gt;
        // Die Liste &amp;quot;result&amp;quot; enthält jetzt die Antwort als [boxName, boxRelativeX, boxRelativeY, rootName, absoluteX, absoluteY, userData].&lt;br /&gt;
        // &amp;quot;boxName&amp;quot; ist leer, wenn die Touch Query ungültig war.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Noch angenehmere Verwendung ==&lt;br /&gt;
&lt;br /&gt;
Die Funktionen im letzten Abschnitt sind lediglich Wrapper um die FURWARE text-Befehle, allerdings muss du weiterhin Dinge wie Stileinstellungen selber schreiben und dir die verschiedenen Optionen und deren Werte merken. Die folgenden Konstanten und Funktionen nehmen dir einen Teil dieser Arbeit ab (auch hier gilt, dass du nur die Teile kopieren musst, die du tatsächlich benötigst – auch um Speicher zu sparen!).&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Beachte, dass die folgenden Zeilen die Funktionen im vorigen Abschnitt ergänzen, d.h. du musst die entsprechenden Funktionen zusätzlich mitkopieren.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// === Farben (colors) ===&lt;br /&gt;
&lt;br /&gt;
string COLOR_DEFAULT            = &amp;quot;c=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Graustufen.&lt;br /&gt;
string COLOR_WHITE              = &amp;quot;c=white;&amp;quot;;&lt;br /&gt;
string COLOR_SILVER             = &amp;quot;c=silver;&amp;quot;;&lt;br /&gt;
string COLOR_GRAY               = &amp;quot;c=gray;&amp;quot;;&lt;br /&gt;
string COLOR_BLACK              = &amp;quot;c=black;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Standardfarben.&lt;br /&gt;
string COLOR_RED                = &amp;quot;c=red;&amp;quot;;&lt;br /&gt;
string COLOR_GREEN              = &amp;quot;c=green;&amp;quot;;&lt;br /&gt;
string COLOR_BLUE               = &amp;quot;c=blue;&amp;quot;;&lt;br /&gt;
string COLOR_CYAN               = &amp;quot;c=cyan;&amp;quot;;&lt;br /&gt;
string COLOR_MAGENTA            = &amp;quot;c=magenta;&amp;quot;;&lt;br /&gt;
string COLOR_YELLOW             = &amp;quot;c=yellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Dunkle Farben.&lt;br /&gt;
string COLOR_DARKRED            = &amp;quot;c=darkred;&amp;quot;;&lt;br /&gt;
string COLOR_DARKGREEN          = &amp;quot;c=darkgreen;&amp;quot;;&lt;br /&gt;
string COLOR_DARKBLUE           = &amp;quot;c=darkblue;&amp;quot;;&lt;br /&gt;
string COLOR_DARKCYAN           = &amp;quot;c=darkcyan;&amp;quot;;&lt;br /&gt;
string COLOR_DARKMAGENTA        = &amp;quot;c=darkmagenta;&amp;quot;;&lt;br /&gt;
string COLOR_DARKYELLOW         = &amp;quot;c=darkyellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Beliebige RGB- (Rot, Grün, Blau) Farben.&lt;br /&gt;
string fwColorRGB(float red, float green, float blue) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,1&amp;quot; + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Beliebige RGBA- (Rot, Grün, Blau, Alpha/Deckkraft) Farben.&lt;br /&gt;
string fwColorRGBA(float red, float green, float blue, float alpha) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,&amp;quot; + (string)alpha + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Ausrichtung (alignment) ===&lt;br /&gt;
&lt;br /&gt;
string ALIGN_DEFAULT            = &amp;quot;a=def;&amp;quot;;&lt;br /&gt;
string ALIGN_LEFT               = &amp;quot;a=left;&amp;quot;;&lt;br /&gt;
string ALIGN_CENTER             = &amp;quot;a=center;&amp;quot;;&lt;br /&gt;
string ALIGN_RIGHT              = &amp;quot;a=right;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Umbruch (wrapping) ===&lt;br /&gt;
&lt;br /&gt;
string WRAP_DEFAULT             = &amp;quot;w=def;&amp;quot;;&lt;br /&gt;
string WRAP_WORD                = &amp;quot;w=word;&amp;quot;;&lt;br /&gt;
string WRAP_CHAR                = &amp;quot;w=char;&amp;quot;;&lt;br /&gt;
string WRAP_NONE                = &amp;quot;w=none;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Abschneiden von Leerzeichen am Anfang/Ende (trimming) ===&lt;br /&gt;
&lt;br /&gt;
string TRIM_DEFAULT             = &amp;quot;t=def;&amp;quot;;&lt;br /&gt;
string TRIM_ON                  = &amp;quot;t=on;&amp;quot;;&lt;br /&gt;
string TRIM_OFF                 = &amp;quot;t=off;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Schriftarten (fonts) ===&lt;br /&gt;
&lt;br /&gt;
string FONT_DEFAULT             = &amp;quot;f=def;&amp;quot;;&lt;br /&gt;
string FONT_ANDALE              = &amp;quot;f=e31ce6e8-4117-7073-6aac-e6503034b4c5;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO       = &amp;quot;f=24c4ead5-04cd-1831-5fd9-ec48882e00b1;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO_BOLD  = &amp;quot;f=82c4fcac-3990-223c-286d-5bc92a258fbc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU              = &amp;quot;f=f974fdfc-8fbd-2f29-2b38-3c34411c1fcc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU_BOLD         = &amp;quot;f=5054fec3-1465-af8f-2fe5-e9507795c82a;&amp;quot;;&lt;br /&gt;
string FONT_ENVYCODER           = &amp;quot;f=a2ec2cf0-b207-db51-d4a1-f3f8d6684c07;&amp;quot;;&lt;br /&gt;
string FONT_FREEFONT            = &amp;quot;f=05f6f69e-8bdf-a824-a2cf-d91c9e371c23;&amp;quot;;&lt;br /&gt;
string FONT_INCONSOLATA         = &amp;quot;f=867288f9-940e-a7cf-ac7d-5596ea7fb2c5;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION          = &amp;quot;f=c992dfc4-0aca-02c8-bc01-8330e6db6f87;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION_BOLD     = &amp;quot;f=1494337d-5296-3c43-8f7c-45617448ec9a;&amp;quot;;&lt;br /&gt;
string FONT_LUXI                = &amp;quot;f=2d8f52d7-2220-2d7a-15b5-e685a9449e5c;&amp;quot;;&lt;br /&gt;
string FONT_LUXI_BOLD           = &amp;quot;f=03812794-535b-f546-6171-6bec5bf399be;&amp;quot;;&lt;br /&gt;
string FONT_MONOFUR             = &amp;quot;f=8fc63e35-a18f-e335-3936-e2ca196a944d;&amp;quot;;&lt;br /&gt;
string FONT_NOVA                = &amp;quot;f=2df8e09d-e1bd-d17f-6bec-b8d713790380;&amp;quot;;&lt;br /&gt;
string FONT_PROFONT             = &amp;quot;f=45a8e6f6-90e4-299d-d3bc-0bf4dbf170db;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Rahmen (borders) ===&lt;br /&gt;
&lt;br /&gt;
string BORDER_DEFAULT           = &amp;quot;border=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Einige Beispiele für oft benutzte Rahmenstile.&lt;br /&gt;
string BORDER_ALL_SIDES         = &amp;quot;border=tblr;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_THICK   = &amp;quot;border=tblr1;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_DOUBLE  = &amp;quot;border=tblr2;&amp;quot;;&lt;br /&gt;
string BORDER_BOTTOM            = &amp;quot;border=b;&amp;quot;;&lt;br /&gt;
string BORDER_LEFT_RIGHT        = &amp;quot;border=lr;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Eine allgemeinere Hilfsfunktion für Rahmen. Die Seiten-Parameter sind von oben beginnend im Uhrzeigersinn angeordnet.&lt;br /&gt;
string fwBorder(integer top, integer right, integer bottom, integer left, integer style) {&lt;br /&gt;
    string result = &amp;quot;border=&amp;quot;;&lt;br /&gt;
    if (top)    result += &amp;quot;t&amp;quot;; if (right)  result += &amp;quot;r&amp;quot;;&lt;br /&gt;
    if (bottom) result += &amp;quot;b&amp;quot;; if (left)   result += &amp;quot;l&amp;quot;;&lt;br /&gt;
    if (style)  result += (string)style;&lt;br /&gt;
    return result + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
Jeder Wert der Konstanten endet mit einem &amp;quot;;&amp;quot;. Das erlaubt dir, die Konstanten einfach mit &amp;quot;+&amp;quot; zu verbinden und trotzdem gültige Strings für Stileinstellungen zu erhalten. Damit kannst du so etwas schreiben wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Setzt die Farbe (color), den Umbruch (wrapping) und die Schriftart (font) für alle Boxen.&lt;br /&gt;
fwSetStyle(COLOR_YELLOW + WRAP_NONE + FONT_MONOFUR);&lt;br /&gt;
&lt;br /&gt;
// Setzt die Standard-Stileinstellung für alle Boxen.&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, COLOR_RED + ALIGN_CENTER);&lt;br /&gt;
&lt;br /&gt;
// Füge eine Box mit einer Stileinstellung hinzu. Wir benutzen hier eine selbstspezifizierte RGB-Farbe.&lt;br /&gt;
fwAddBox(&amp;quot;SomeBox&amp;quot;, &amp;quot;ParentBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, FONT_LUXI + fwColorRGB(0.5, 0.75, 0.0) + BORDER_ALL_SIDES);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets&amp;diff=1179879</id>
		<title>FURWARE text/Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FURWARE_text/Snippets&amp;diff=1179879"/>
		<updated>2013-07-10T21:49:30Z</updated>

		<summary type="html">&lt;p&gt;Ochi Wolfe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page contains several useful code snippets (functions, constants) that can make the usage of FURWARE text a lot more convenient.&lt;br /&gt;
&lt;br /&gt;
== Basic convenience functions ==&lt;br /&gt;
&lt;br /&gt;
The functions in this section are wrappers around each of the FURWARE text commands. They were designed to follow these rules:&lt;br /&gt;
&lt;br /&gt;
* The functions shall be &#039;&#039;self-contained&#039;&#039;. That is, you may copy any subset of the functions that you need and they will work.&lt;br /&gt;
* The functions (and their parameters) shall be &#039;&#039;self-explanatory&#039;&#039;. That is, they also serve as a quick reference guide to the parameters of the commands they execute.&lt;br /&gt;
&lt;br /&gt;
The fact that the functions are self-contained also means that each of them contains a &#039;&#039;llMessageLinked(...)&#039;&#039;-call. The target of this call is set to &#039;&#039;LINK_SET&#039;&#039; (the whole linkset). Please change this target accordingly in your scripts, if needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
fwSetText(string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxText(string box, string text) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_data:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetStyle(string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetBoxStyle(string box, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_conf:&amp;quot; + box);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetDefaultStyle(string target, string style) {&lt;br /&gt;
    // &amp;quot;target&amp;quot; may be empty, &amp;quot;root&amp;quot; or &amp;quot;nonroot&amp;quot;.&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, style, &amp;quot;fw_defaultconf:&amp;quot; + target);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetVariable(string name, string value) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, value, &amp;quot;fw_var:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwAddBox(string name, string parent, integer x, integer y, integer w, integer h, string text, string style) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, text, &amp;quot;fw_addbox: &amp;quot; +name + &amp;quot;:&amp;quot; + parent + &amp;quot;:&amp;quot;+&lt;br /&gt;
                    (string)x + &amp;quot;,&amp;quot; + (string)y + &amp;quot;,&amp;quot; + (string)w + &amp;quot;,&amp;quot; + (string)h + &amp;quot;:&amp;quot; + style);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwDelBox(string name) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_delbox:&amp;quot; + name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwTouchQuery(integer linkNumber, integer faceNumber, string userData) {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, userData, &amp;quot;fw_touchquery:&amp;quot; + (string)linkNumber + &amp;quot;:&amp;quot; + (string)faceNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list fwTouchReply(string replyString) {&lt;br /&gt;
    list tokens = llParseStringKeepNulls(replyString, [&amp;quot;:&amp;quot;], []);&lt;br /&gt;
    return [&lt;br /&gt;
        llList2String(tokens, 0), llList2Integer(tokens, 1), llList2Integer(tokens, 2),&lt;br /&gt;
        llList2String(tokens, 3), llList2Integer(tokens, 4), llList2Integer(tokens, 5),&lt;br /&gt;
        llDumpList2String(llDeleteSubList(tokens, 0, 5), &amp;quot;:&amp;quot;)&lt;br /&gt;
    ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwSetNotify(integer enabled) {&lt;br /&gt;
    string s = &amp;quot;off&amp;quot;; if (enabled) s = &amp;quot;on&amp;quot;;&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, s, &amp;quot;fw_notify&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwMemory() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_memory&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fwReset() {&lt;br /&gt;
    llMessageLinked(LINK_SET, 0, &amp;quot;&amp;quot;, &amp;quot;fw_reset&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
The above snippets allow you to use the basic commands more easily, but you may still need to do some manual work, for example when specifying style configuration strings. The following lines give a few assorted examples of calls using the functions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Set the text of all boxes in all sets.&lt;br /&gt;
fwSetText(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Set the text of the box &amp;quot;SomeBox&amp;quot;.&lt;br /&gt;
fwSetBoxText(&amp;quot;SomeBox&amp;quot;, &amp;quot;This is some box!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Set the default style of all boxes to color=red, align=center (see the next section how to make this much nicer).&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, &amp;quot;c=red;a=center&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Add a box &amp;quot;NewBox&amp;quot; using &amp;quot;ExistingBox&amp;quot; as its parent.&lt;br /&gt;
fwAddBox(&amp;quot;NewBox&amp;quot;, &amp;quot;ExistingBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Delete a box.&lt;br /&gt;
fwDelBox(&amp;quot;NewBox&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Send a touch query from the touch_start(...)-event.&lt;br /&gt;
touch_start(integer num) {&lt;br /&gt;
    fwTouchQuery(llDetectedLinkNumber(0), llDetectedTouchFace(0), &amp;quot;Arbitrary user data goes here&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Parse a touch reply in the link_message(...)-event.&lt;br /&gt;
link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
    if (id == &amp;quot;fw_touchreply&amp;quot;) {&lt;br /&gt;
        list result = fwTouchReply(str);&lt;br /&gt;
        // The list &amp;quot;result&amp;quot; now contains the reply as [boxName, boxRelativeX, boxRelativeY, rootName, absoluteX, absoluteY, userData].&lt;br /&gt;
        // &amp;quot;boxName&amp;quot; is empty if the touch query was invalid.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional awesomeness ==&lt;br /&gt;
&lt;br /&gt;
The functions in the previous section are wrappers around the FURWARE text commands, but you still need to write, for instance, style configuration strings yourself and remember the style options and values. The following set of constants and functions help you with that (again, you don&#039;t have to copy all of them but just the ones you need to save script memory!).&lt;br /&gt;
&lt;br /&gt;
{{KBtip|Note that these constants complement the functions defined above, so make sure to copy the functions you need as well.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// === Colors ===&lt;br /&gt;
&lt;br /&gt;
string COLOR_DEFAULT            = &amp;quot;c=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Grayscales.&lt;br /&gt;
string COLOR_WHITE              = &amp;quot;c=white;&amp;quot;;&lt;br /&gt;
string COLOR_SILVER             = &amp;quot;c=silver;&amp;quot;;&lt;br /&gt;
string COLOR_GRAY               = &amp;quot;c=gray;&amp;quot;;&lt;br /&gt;
string COLOR_BLACK              = &amp;quot;c=black;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Standard colors.&lt;br /&gt;
string COLOR_RED                = &amp;quot;c=red;&amp;quot;;&lt;br /&gt;
string COLOR_GREEN              = &amp;quot;c=green;&amp;quot;;&lt;br /&gt;
string COLOR_BLUE               = &amp;quot;c=blue;&amp;quot;;&lt;br /&gt;
string COLOR_CYAN               = &amp;quot;c=cyan;&amp;quot;;&lt;br /&gt;
string COLOR_MAGENTA            = &amp;quot;c=magenta;&amp;quot;;&lt;br /&gt;
string COLOR_YELLOW             = &amp;quot;c=yellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Dark colors.&lt;br /&gt;
string COLOR_DARKRED            = &amp;quot;c=darkred;&amp;quot;;&lt;br /&gt;
string COLOR_DARKGREEN          = &amp;quot;c=darkgreen;&amp;quot;;&lt;br /&gt;
string COLOR_DARKBLUE           = &amp;quot;c=darkblue;&amp;quot;;&lt;br /&gt;
string COLOR_DARKCYAN           = &amp;quot;c=darkcyan;&amp;quot;;&lt;br /&gt;
string COLOR_DARKMAGENTA        = &amp;quot;c=darkmagenta;&amp;quot;;&lt;br /&gt;
string COLOR_DARKYELLOW         = &amp;quot;c=darkyellow;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Arbitrary RGB (red, green, blue) color.&lt;br /&gt;
string fwColorRGB(float red, float green, float blue) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,1&amp;quot; + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Arbitrary RGBA (red, green, blue, alpha/opacity) color.&lt;br /&gt;
string fwColorRGBA(float red, float green, float blue, float alpha) {&lt;br /&gt;
    return &amp;quot;c=&amp;quot; + (string)red + &amp;quot;,&amp;quot; + (string)green + &amp;quot;,&amp;quot; + (string)blue + &amp;quot;,&amp;quot; + (string)alpha + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// === Alignment ===&lt;br /&gt;
&lt;br /&gt;
string ALIGN_DEFAULT            = &amp;quot;a=def;&amp;quot;;&lt;br /&gt;
string ALIGN_LEFT               = &amp;quot;a=left;&amp;quot;;&lt;br /&gt;
string ALIGN_CENTER             = &amp;quot;a=center;&amp;quot;;&lt;br /&gt;
string ALIGN_RIGHT              = &amp;quot;a=right;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Wrapping ===&lt;br /&gt;
&lt;br /&gt;
string WRAP_DEFAULT             = &amp;quot;w=def;&amp;quot;;&lt;br /&gt;
string WRAP_WORD                = &amp;quot;w=word;&amp;quot;;&lt;br /&gt;
string WRAP_CHAR                = &amp;quot;w=char;&amp;quot;;&lt;br /&gt;
string WRAP_NONE                = &amp;quot;w=none;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Trimming ===&lt;br /&gt;
&lt;br /&gt;
string TRIM_DEFAULT             = &amp;quot;t=def;&amp;quot;;&lt;br /&gt;
string TRIM_ON                  = &amp;quot;t=on;&amp;quot;;&lt;br /&gt;
string TRIM_OFF                 = &amp;quot;t=off;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Fonts ===&lt;br /&gt;
&lt;br /&gt;
string FONT_DEFAULT             = &amp;quot;f=def;&amp;quot;;&lt;br /&gt;
string FONT_ANDALE              = &amp;quot;f=e31ce6e8-4117-7073-6aac-e6503034b4c5;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO       = &amp;quot;f=24c4ead5-04cd-1831-5fd9-ec48882e00b1;&amp;quot;;&lt;br /&gt;
string FONT_ANONYMOUS_PRO_BOLD  = &amp;quot;f=82c4fcac-3990-223c-286d-5bc92a258fbc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU              = &amp;quot;f=f974fdfc-8fbd-2f29-2b38-3c34411c1fcc;&amp;quot;;&lt;br /&gt;
string FONT_DEJAVU_BOLD         = &amp;quot;f=5054fec3-1465-af8f-2fe5-e9507795c82a;&amp;quot;;&lt;br /&gt;
string FONT_ENVYCODER           = &amp;quot;f=a2ec2cf0-b207-db51-d4a1-f3f8d6684c07;&amp;quot;;&lt;br /&gt;
string FONT_FREEFONT            = &amp;quot;f=05f6f69e-8bdf-a824-a2cf-d91c9e371c23;&amp;quot;;&lt;br /&gt;
string FONT_INCONSOLATA         = &amp;quot;f=867288f9-940e-a7cf-ac7d-5596ea7fb2c5;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION          = &amp;quot;f=c992dfc4-0aca-02c8-bc01-8330e6db6f87;&amp;quot;;&lt;br /&gt;
string FONT_LIBERATION_BOLD     = &amp;quot;f=1494337d-5296-3c43-8f7c-45617448ec9a;&amp;quot;;&lt;br /&gt;
string FONT_LUXI                = &amp;quot;f=2d8f52d7-2220-2d7a-15b5-e685a9449e5c;&amp;quot;;&lt;br /&gt;
string FONT_LUXI_BOLD           = &amp;quot;f=03812794-535b-f546-6171-6bec5bf399be;&amp;quot;;&lt;br /&gt;
string FONT_MONOFUR             = &amp;quot;f=8fc63e35-a18f-e335-3936-e2ca196a944d;&amp;quot;;&lt;br /&gt;
string FONT_NOVA                = &amp;quot;f=2df8e09d-e1bd-d17f-6bec-b8d713790380;&amp;quot;;&lt;br /&gt;
string FONT_PROFONT             = &amp;quot;f=45a8e6f6-90e4-299d-d3bc-0bf4dbf170db;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// === Borders ===&lt;br /&gt;
&lt;br /&gt;
string BORDER_DEFAULT           = &amp;quot;border=def;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// These are just some examples for common border styles.&lt;br /&gt;
string BORDER_ALL_SIDES         = &amp;quot;border=tblr;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_THICK   = &amp;quot;border=tblr1;&amp;quot;;&lt;br /&gt;
string BORDER_ALL_SIDES_DOUBLE  = &amp;quot;border=tblr2;&amp;quot;;&lt;br /&gt;
string BORDER_BOTTOM            = &amp;quot;border=b;&amp;quot;;&lt;br /&gt;
string BORDER_LEFT_RIGHT        = &amp;quot;border=lr;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// A more general helper function for borders. The side parameters are ordered clockwise, starting on top.&lt;br /&gt;
string fwBorder(integer top, integer right, integer bottom, integer left, integer style) {&lt;br /&gt;
    string result = &amp;quot;border=&amp;quot;;&lt;br /&gt;
    if (top)    result += &amp;quot;t&amp;quot;; if (right)  result += &amp;quot;r&amp;quot;;&lt;br /&gt;
    if (bottom) result += &amp;quot;b&amp;quot;; if (left)   result += &amp;quot;l&amp;quot;;&lt;br /&gt;
    if (style)  result += (string)style;&lt;br /&gt;
    return result + &amp;quot;;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
Note that the value of each constant ends with &amp;quot;;&amp;quot;. This allows you to simply &amp;quot;+&amp;quot; them together and you still get valid style strings which you may then use wherever you need a style config string. This allows you to write things like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Set the color, wrapping and font of all boxes.&lt;br /&gt;
fwSetStyle(COLOR_YELLOW + WRAP_NONE + FONT_MONOFUR);&lt;br /&gt;
&lt;br /&gt;
// Set the default style for all boxes.&lt;br /&gt;
fwSetDefaultStyle(&amp;quot;&amp;quot;, COLOR_RED + ALIGN_CENTER);&lt;br /&gt;
&lt;br /&gt;
// Add a box with some style config. We will use a custom RGB color here.&lt;br /&gt;
fwAddBox(&amp;quot;SomeBox&amp;quot;, &amp;quot;ParentBox&amp;quot;, 2, 2, 10, 5, &amp;quot;Some initial text&amp;quot;, FONT_LUXI + fwColorRGB(0.5, 0.75, 0.0) + BORDER_ALL_SIDES);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ochi Wolfe</name></author>
	</entry>
</feed>