<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://opensimulator.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://opensimulator.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=JeffKelley</id>
		<title>OpenSimulator - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://opensimulator.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=JeffKelley"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Special:Contributions/JeffKelley"/>
		<updated>2026-04-20T18:07:59Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.19.9</generator>

	<entry>
		<id>http://opensimulator.org/wiki/Accessing_Prim_Properties</id>
		<title>Accessing Prim Properties</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Accessing_Prim_Properties"/>
				<updated>2025-04-07T15:08:14Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Copy-paste error&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks|Accessing_Prim_Properties}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A bit of history==&lt;br /&gt;
&lt;br /&gt;
First, there was &amp;lt;u&amp;gt;llSetColor&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then, there was &amp;lt;u&amp;gt;llSetLinkColor&amp;lt;/u&amp;gt;. That was a huge step forward, since it was releaving you from the burden to script each and every prim in your hair. Don't laugh. You may still find such blatantly outdated scripts on the Hypergrid. Do us a favor. Don't propagate them. Trash them. Rewrite them.&lt;br /&gt;
&lt;br /&gt;
Later, it was recognized that the ability to access every property of a prim in a linkset from a master script was a Good Thing. It makes your application simpler to understand and to maintain, and helps reduce script count. &amp;lt;u&amp;gt;llSetLinkPrimitiveParams&amp;lt;/u&amp;gt; was born.&lt;br /&gt;
&lt;br /&gt;
Finally, OpenSimulator added it's own touch. Why not manipulate prims ''outside'' the linkset from a master script ? And we had &amp;lt;u&amp;gt;osSetPrimitiveParams.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
llGet/SetLinkPrimitiveParams, osGet/SetPrimitiveParams are the workhorse of prim manipulations. You can access every existing property of a prim from a centralized location. Streamlined, faster code. No more need for chat, or LinkedMessages between prims.&lt;br /&gt;
&lt;br /&gt;
A special note about &amp;lt;u&amp;gt;llGetObjectLinkKey&amp;lt;/u&amp;gt; : Introduced September, 2022, this function is the glue you need to access prims outside the linkset. Once you get the id of an external object (maybe using llSensor), you may call llGetObjectPrimCount (also consider osGetPrimCount which does not count sitting avatars) then iterate on llGetObjectLinkKey to get the id of each prim in the remote object. Finally, apply osGet/SetPrimitiveParams.&lt;br /&gt;
&lt;br /&gt;
The following tables tries to sort out the functions available to manipulate prims, for each addressing method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Target is script's host&amp;lt;br/&amp;gt;(prim containing the script)&lt;br /&gt;
! Target is link number&amp;lt;br/&amp;gt;(any prim in the linkset)&lt;br /&gt;
! Target is prim id&amp;lt;br/&amp;gt;(any prim you own in the scene)&lt;br /&gt;
|-&lt;br /&gt;
| llGetOwner || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetKey || llGetLinkKey(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetText || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetRot / llSetRot || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetScale / llSetScale || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetAlpha / llSetAlpha || llSetLinkAlpha(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetColor / llSetColor || llSetLinkColor(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetPos / llSetPos || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetObjectName / llSetObjectName || llGetLinkName(num) ||&lt;br /&gt;
|-(num)&lt;br /&gt;
| llGetObjectDesc / llSetObjectDesc || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetNumberOfSides || llGetLinkNumberOfSides(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetTexture / llSetTexture || llSetLinkTexture(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetTextureAnim || llSetLinkTextureAnim(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llParticleSystem || llLinkParticleSystem(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetPrimMediaParams || llSetLinkMedia(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectPrimCount(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectDetails(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectLinkKey(uuid,num)&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot; | &amp;quot;Universal&amp;quot; access (list of rules)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| llGet/SetPrimitiveParams || llGet/SetLinkPrimitiveParams(num) || osGet/SetPrimitiveParams(uuid)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example : A replicator==&lt;br /&gt;
Put this script in a box, along with a single-prim object named &amp;quot;seed&amp;quot;. It will iterate on each prim of a named object you own in the scene, then rez an identical prim at a given offset, perfectly replicating the source object, even meshes. Sleeps are here for demo. Remove them for speedy replication. CLEANUP option will get rid of rezed prims.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string targetName = &amp;quot;Example&amp;quot;; // The name of an object you own in the scene&lt;br /&gt;
string seedName = &amp;quot;seed&amp;quot;;      // Name of the seed prim &lt;br /&gt;
vector offset = &amp;lt;5,0,0&amp;gt;;       // Offset of the dupicata&lt;br /&gt;
&lt;br /&gt;
integer primcnt;&lt;br /&gt;
integer primnum;&lt;br /&gt;
key rootKey;&lt;br /&gt;
&lt;br /&gt;
integer TupleLength (integer param)&lt;br /&gt;
{&lt;br /&gt;
    if (param == PRIM_GLOW)       return 1;&lt;br /&gt;
    if (param == PRIM_COLOR)      return 2;&lt;br /&gt;
    if (param == PRIM_TEXGEN)     return 1;&lt;br /&gt;
    if (param == PRIM_TEXTURE)    return 4;&lt;br /&gt;
    if (param == PRIM_NORMAL)     return 4;&lt;br /&gt;
    if (param == PRIM_SPECULAR)   return 7;&lt;br /&gt;
    if (param == PRIM_BUMP_SHINY) return 2;&lt;br /&gt;
    if (param == PRIM_FULLBRIGHT) return 1;&lt;br /&gt;
&lt;br /&gt;
    return 0; // Not a by-side parameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list IterateFaces (list p, integer param)&lt;br /&gt;
{&lt;br /&gt;
    integer tuplelength = TupleLength (param);&lt;br /&gt;
    integer numsides =  llGetListLength(p) / tuplelength;&lt;br /&gt;
&lt;br /&gt;
    // Une seule face, retourner [ param, ALL_SIDES, p ]&lt;br /&gt;
    if (numsides == 1) return [ param, ALL_SIDES ] + p;&lt;br /&gt;
&lt;br /&gt;
    list result = [ ];&lt;br /&gt;
    for (integer s=0; s&amp;lt;numsides; s++) {&lt;br /&gt;
        list tuple = llList2List (p, s*tuplelength, (s+1)*tuplelength-1);&lt;br /&gt;
        result += [ param, s ] + tuple;&lt;br /&gt;
    }  &lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CopyParams (key srcprim, key dstprim, integer param) {&lt;br /&gt;
    if (TupleLength(param) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param ]);&lt;br /&gt;
        if (param == PRIM_POSITION) p = [ llList2Vector (p,0) + offset ];&lt;br /&gt;
        osSetPrimitiveParams (dstprim, [ param ] + p);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param, ALL_SIDES ]);&lt;br /&gt;
        p = IterateFaces (p, param);&lt;br /&gt;
        osSetPrimitiveParams (dstprim, p);&lt;br /&gt;
    }&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
RezAPrim ()&lt;br /&gt;
{&lt;br /&gt;
    if (++primnum &amp;gt; primcnt) llResetScript();&lt;br /&gt;
    llRezObject (seedName, llGetPos()+&amp;lt;0,0,1&amp;gt;, ZERO_VECTOR, ZERO_ROTATION, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PrimRezed (key dstkey)&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay (&amp;quot;Processing link &amp;quot;+(string)primnum+&amp;quot; of &amp;quot;+(string)primcnt);&lt;br /&gt;
    key srckey = llGetObjectLinkKey (rootKey, primnum);&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
    &lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_POSITION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_ROTATION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TYPE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SIZE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_COLOR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXTURE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_NORMAL);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SPECULAR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXGEN);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_BUMP_SHINY);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_FULLBRIGHT);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_PHYSICS_SHAPE_TYPE);&lt;br /&gt;
&lt;br /&gt;
    RezAPrim ();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
key OwnerOf (key id)&lt;br /&gt;
{&lt;br /&gt;
    list l = llGetObjectDetails (id, [ OBJECT_OWNER ]);&lt;br /&gt;
    return llList2Key (l, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;READY&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start (integer n)&lt;br /&gt;
    {&lt;br /&gt;
        state dialog;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer dlgchan = 99;&lt;br /&gt;
integer dlglistener;&lt;br /&gt;
state dialog&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;LISTENING&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llDialog (llGetOwner(), &amp;quot;Action?&amp;quot;, [&amp;quot;CLEANUP&amp;quot;, &amp;quot;REPLICATE&amp;quot;], dlgchan);&lt;br /&gt;
        dlglistener = llListen (dlgchan, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent (10);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen (integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == &amp;quot;CLEANUP&amp;quot;)   state cleanup;&lt;br /&gt;
        if (msg == &amp;quot;REPLICATE&amp;quot;) state replicate;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer ()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_exit ()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent (0.0);&lt;br /&gt;
        llListenRemove (dlglistener);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state cleanup&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;CLEANUP&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (seedName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        llOwnerSay (&amp;quot;Garbage collecting &amp;quot;+(string)num);&lt;br /&gt;
        for (integer i=0; i&amp;lt;num; i++) osDie (llDetectedKey(i));&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;All clean.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state replicate&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;REPLICATE&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (targetName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        rootKey = llDetectedKey (0);&lt;br /&gt;
&lt;br /&gt;
        if (OwnerOf(rootKey) != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay (&amp;quot;I don't own &amp;quot;+targetName+&amp;quot;. Aborting.&amp;quot;);&lt;br /&gt;
            state default;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        primcnt = llGetObjectPrimCount (rootKey);&lt;br /&gt;
        primnum = 0; RezAPrim ();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;Object &amp;quot;+targetName+&amp;quot; was not found.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    object_rez (key uuid) {&lt;br /&gt;
        PrimRezed (uuid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Writing accessors==&lt;br /&gt;
&lt;br /&gt;
The Get/SetPrimitiveParams family of functions is awesomely powerful. It is also [https://wiki.secondlife.com/wiki/LlSetLinkPrimitiveParamsFast quite arcane to write and decipher]. A way to get rid of these long lists of parameters cluttering your code is to encapsulate Get/SetPrimitiveParams in individual get/set accessors, actually 'filling the blanks' in the above table. Although this is much pleasant to read, note that doing so may hurt performance when you want to change many properties at once, which SetPrimitiveParams can do in one call. The following library is offered as an example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Index of properties for PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TYPE      = 0;&lt;br /&gt;
integer INDEX_HOLE      = 1;&lt;br /&gt;
integer INDEX_CUT       = 2;&lt;br /&gt;
integer INDEX_HOLLOW    = 3;&lt;br /&gt;
integer INDEX_TWIST     = 4;&lt;br /&gt;
integer INDEX_TAPER     = 5;&lt;br /&gt;
integer INDEX_SHEAR     = 6;&lt;br /&gt;
&lt;br /&gt;
// Index of properties for PRIM_TEXTURE&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TEXTURE   = 0;&lt;br /&gt;
integer INDEX_REPEATS   = 1;&lt;br /&gt;
integer INDEX_OFFSETS   = 2;&lt;br /&gt;
integer INDEX_ROTATION  = 3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//                client        script&lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
//  Taper   | -1.0 0  +1.0  |  2.0   0.0 | &lt;br /&gt;
//  Shear   | -0.5 0  +0.5  | -0.5  +0.5 |&lt;br /&gt;
//  Twist   | -180 0  +180  | -1.0  +1.0 | &lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Set accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
mySetLinkName (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_NAME, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkDesc (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_DESC, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkText (integer link, string text, vector color) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXT, text, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkColor (integer link, vector color, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_COLOR, face, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkBright (integer link, integer bright, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_FULLBRIGHT, face, bright]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkGlow (integer link, float glow, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_GLOW, face, glow]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Les 3 suivants ne marchent pas pour ALL_SIDES&lt;br /&gt;
&lt;br /&gt;
mySetLinkTexture (integer link, key texture, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [texture], INDEX_TEXTURE, INDEX_TEXTURE);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRepeat (integer link, vector repeat, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [repeat], INDEX_REPEATS, INDEX_REPEATS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkOffset (integer link, vector offset, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [offset], INDEX_OFFSETS, INDEX_OFFSETS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkPos (integer link, vector pos) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_POS_LOCAL, pos]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRot (integer link, rotation rot) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_ROT_LOCAL, rot]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkSize (integer link, vector size) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_SIZE, size]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkCut (integer link, vector cut) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [cut], INDEX_CUT, INDEX_CUT);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTwist (integer link, vector twist) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [twist], INDEX_TWIST, INDEX_TWIST);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTaper (integer link, vector taper) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [taper], INDEX_TAPER, INDEX_TAPER);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkShear (integer link, vector shear) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [shear], INDEX_SHEAR, INDEX_SHEAR);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkHollow (integer link, float hollow) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [hollow], INDEX_HOLLOW, INDEX_HOLLOW);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Get accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
string myGetLinkName (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_NAME]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkDesc (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_DESC]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkText (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXT]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkColor (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_COLOR, face]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer myGetLinkBright (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_FULLBRIGHT, face]);&lt;br /&gt;
    return llList2Integer (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkGlow (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_GLOW, face]);&lt;br /&gt;
    return llList2Float (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key myGetLinkTexture (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Key(l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkRepeat (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkOffset (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkPos (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_POS_LOCAL]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkSize (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_SIZE]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkCut (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_CUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTwist (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TWIST);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTaper (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TAPER);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkShear (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_SHEAR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkHollow (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Float (l, INDEX_HOLLOW);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
LL accessors can be effortlessly converted to OS versions. Just change prim_num to prim_key in argument list, and pick the right os/ll function. Finally, you can use function overloading to write universal routines :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
SetPrimColor (key prim, vector color, integer side)&lt;br /&gt;
{&lt;br /&gt;
    osSetPrimitiveParams (prim, [PRIM_COLOR, side, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SetPrimColor (integer prim, vector color, integer side)&lt;br /&gt;
{&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (prim, [PRIM_COLOR, side, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
[[Category:Scripts]]&lt;br /&gt;
[[Category:OSSL]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Accessing_Prim_Properties</id>
		<title>Accessing Prim Properties</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Accessing_Prim_Properties"/>
				<updated>2025-04-07T15:07:14Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Clarification&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks|Accessing_Prim_Properties}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A bit of history==&lt;br /&gt;
&lt;br /&gt;
First, there was &amp;lt;u&amp;gt;llSetColor&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then, there was &amp;lt;u&amp;gt;llSetLinkColor&amp;lt;/u&amp;gt;. That was a huge step forward, since it was releaving you from the burden to script each and every prim in your hair. Don't laugh. You may still find such blatantly outdated scripts on the Hypergrid. Do us a favor. Don't propagate them. Trash them. Rewrite them.&lt;br /&gt;
&lt;br /&gt;
Later, it was recognized that the ability to access every property of a prim in a linkset from a master script was a Good Thing. It makes your application simpler to understand and to maintain, and helps reduce script count. &amp;lt;u&amp;gt;llSetLinkPrimitiveParams&amp;lt;/u&amp;gt; was born.&lt;br /&gt;
&lt;br /&gt;
Finally, OpenSimulator added it's own touch. Why not manipulate prims ''outside'' the linkset from a master script ? And we had &amp;lt;u&amp;gt;osSetPrimitiveParams.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
llGet/SetLinkPrimitiveParams, osGet/SetPrimitiveParams are the workhorse of prim manipulations. You can access every existing property of a prim from a centralized location. Streamlined, faster code. No more need for chat, or LinkedMessages between prims.&lt;br /&gt;
&lt;br /&gt;
A special note about &amp;lt;u&amp;gt;llGetObjectLinkKey&amp;lt;/u&amp;gt; : Introduced September, 2022, this function is the glue you need to access prims outside the linkset. Once you get the id of an external object (maybe using llSensor), you may call llGetObjectPrimCount (also consider osGetPrimCount which does not count sitting avatars) then iterate on llGetObjectLinkKey to get the id of each prim in the remote object. Finally, apply osGet/SetPrimitiveParams.&lt;br /&gt;
&lt;br /&gt;
The following tables tries to sort out the functions available to manipulate prims, for each addressing method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Target is script's host&amp;lt;br/&amp;gt;(prim containing the script)&lt;br /&gt;
! Target is link number&amp;lt;br/&amp;gt;(any prim you own the linkset)&lt;br /&gt;
! Target is prim id&amp;lt;br/&amp;gt;(any prim you own in the scene)&lt;br /&gt;
|-&lt;br /&gt;
| llGetOwner || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetKey || llGetLinkKey(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetText || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetRot / llSetRot || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetScale / llSetScale || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetAlpha / llSetAlpha || llSetLinkAlpha(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetColor / llSetColor || llSetLinkColor(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetPos / llSetPos || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetObjectName / llSetObjectName || llGetLinkName(num) ||&lt;br /&gt;
|-(num)&lt;br /&gt;
| llGetObjectDesc / llSetObjectDesc || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetNumberOfSides || llGetLinkNumberOfSides(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetTexture / llSetTexture || llSetLinkTexture(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetTextureAnim || llSetLinkTextureAnim(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llParticleSystem || llLinkParticleSystem(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetPrimMediaParams || llSetLinkMedia(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectPrimCount(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectDetails(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectLinkKey(uuid,num)&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot; | &amp;quot;Universal&amp;quot; access (list of rules)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| llGet/SetPrimitiveParams || llGet/SetLinkPrimitiveParams(num) || osGet/SetPrimitiveParams(uuid)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example : A replicator==&lt;br /&gt;
Put this script in a box, along with a single-prim object named &amp;quot;seed&amp;quot;. It will iterate on each prim of a named object you own in the scene, then rez an identical prim at a given offset, perfectly replicating the source object, even meshes. Sleeps are here for demo. Remove them for speedy replication. CLEANUP option will get rid of rezed prims.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string targetName = &amp;quot;Example&amp;quot;; // The name of an object you own in the scene&lt;br /&gt;
string seedName = &amp;quot;seed&amp;quot;;      // Name of the seed prim &lt;br /&gt;
vector offset = &amp;lt;5,0,0&amp;gt;;       // Offset of the dupicata&lt;br /&gt;
&lt;br /&gt;
integer primcnt;&lt;br /&gt;
integer primnum;&lt;br /&gt;
key rootKey;&lt;br /&gt;
&lt;br /&gt;
integer TupleLength (integer param)&lt;br /&gt;
{&lt;br /&gt;
    if (param == PRIM_GLOW)       return 1;&lt;br /&gt;
    if (param == PRIM_COLOR)      return 2;&lt;br /&gt;
    if (param == PRIM_TEXGEN)     return 1;&lt;br /&gt;
    if (param == PRIM_TEXTURE)    return 4;&lt;br /&gt;
    if (param == PRIM_NORMAL)     return 4;&lt;br /&gt;
    if (param == PRIM_SPECULAR)   return 7;&lt;br /&gt;
    if (param == PRIM_BUMP_SHINY) return 2;&lt;br /&gt;
    if (param == PRIM_FULLBRIGHT) return 1;&lt;br /&gt;
&lt;br /&gt;
    return 0; // Not a by-side parameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list IterateFaces (list p, integer param)&lt;br /&gt;
{&lt;br /&gt;
    integer tuplelength = TupleLength (param);&lt;br /&gt;
    integer numsides =  llGetListLength(p) / tuplelength;&lt;br /&gt;
&lt;br /&gt;
    // Une seule face, retourner [ param, ALL_SIDES, p ]&lt;br /&gt;
    if (numsides == 1) return [ param, ALL_SIDES ] + p;&lt;br /&gt;
&lt;br /&gt;
    list result = [ ];&lt;br /&gt;
    for (integer s=0; s&amp;lt;numsides; s++) {&lt;br /&gt;
        list tuple = llList2List (p, s*tuplelength, (s+1)*tuplelength-1);&lt;br /&gt;
        result += [ param, s ] + tuple;&lt;br /&gt;
    }  &lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CopyParams (key srcprim, key dstprim, integer param) {&lt;br /&gt;
    if (TupleLength(param) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param ]);&lt;br /&gt;
        if (param == PRIM_POSITION) p = [ llList2Vector (p,0) + offset ];&lt;br /&gt;
        osSetPrimitiveParams (dstprim, [ param ] + p);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param, ALL_SIDES ]);&lt;br /&gt;
        p = IterateFaces (p, param);&lt;br /&gt;
        osSetPrimitiveParams (dstprim, p);&lt;br /&gt;
    }&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
RezAPrim ()&lt;br /&gt;
{&lt;br /&gt;
    if (++primnum &amp;gt; primcnt) llResetScript();&lt;br /&gt;
    llRezObject (seedName, llGetPos()+&amp;lt;0,0,1&amp;gt;, ZERO_VECTOR, ZERO_ROTATION, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PrimRezed (key dstkey)&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay (&amp;quot;Processing link &amp;quot;+(string)primnum+&amp;quot; of &amp;quot;+(string)primcnt);&lt;br /&gt;
    key srckey = llGetObjectLinkKey (rootKey, primnum);&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
    &lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_POSITION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_ROTATION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TYPE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SIZE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_COLOR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXTURE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_NORMAL);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SPECULAR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXGEN);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_BUMP_SHINY);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_FULLBRIGHT);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_PHYSICS_SHAPE_TYPE);&lt;br /&gt;
&lt;br /&gt;
    RezAPrim ();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
key OwnerOf (key id)&lt;br /&gt;
{&lt;br /&gt;
    list l = llGetObjectDetails (id, [ OBJECT_OWNER ]);&lt;br /&gt;
    return llList2Key (l, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;READY&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start (integer n)&lt;br /&gt;
    {&lt;br /&gt;
        state dialog;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer dlgchan = 99;&lt;br /&gt;
integer dlglistener;&lt;br /&gt;
state dialog&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;LISTENING&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llDialog (llGetOwner(), &amp;quot;Action?&amp;quot;, [&amp;quot;CLEANUP&amp;quot;, &amp;quot;REPLICATE&amp;quot;], dlgchan);&lt;br /&gt;
        dlglistener = llListen (dlgchan, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent (10);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen (integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == &amp;quot;CLEANUP&amp;quot;)   state cleanup;&lt;br /&gt;
        if (msg == &amp;quot;REPLICATE&amp;quot;) state replicate;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer ()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_exit ()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent (0.0);&lt;br /&gt;
        llListenRemove (dlglistener);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state cleanup&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;CLEANUP&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (seedName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        llOwnerSay (&amp;quot;Garbage collecting &amp;quot;+(string)num);&lt;br /&gt;
        for (integer i=0; i&amp;lt;num; i++) osDie (llDetectedKey(i));&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;All clean.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state replicate&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;REPLICATE&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (targetName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        rootKey = llDetectedKey (0);&lt;br /&gt;
&lt;br /&gt;
        if (OwnerOf(rootKey) != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay (&amp;quot;I don't own &amp;quot;+targetName+&amp;quot;. Aborting.&amp;quot;);&lt;br /&gt;
            state default;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        primcnt = llGetObjectPrimCount (rootKey);&lt;br /&gt;
        primnum = 0; RezAPrim ();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;Object &amp;quot;+targetName+&amp;quot; was not found.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    object_rez (key uuid) {&lt;br /&gt;
        PrimRezed (uuid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Writing accessors==&lt;br /&gt;
&lt;br /&gt;
The Get/SetPrimitiveParams family of functions is awesomely powerful. It is also [https://wiki.secondlife.com/wiki/LlSetLinkPrimitiveParamsFast quite arcane to write and decipher]. A way to get rid of these long lists of parameters cluttering your code is to encapsulate Get/SetPrimitiveParams in individual get/set accessors, actually 'filling the blanks' in the above table. Although this is much pleasant to read, note that doing so may hurt performance when you want to change many properties at once, which SetPrimitiveParams can do in one call. The following library is offered as an example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Index of properties for PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TYPE      = 0;&lt;br /&gt;
integer INDEX_HOLE      = 1;&lt;br /&gt;
integer INDEX_CUT       = 2;&lt;br /&gt;
integer INDEX_HOLLOW    = 3;&lt;br /&gt;
integer INDEX_TWIST     = 4;&lt;br /&gt;
integer INDEX_TAPER     = 5;&lt;br /&gt;
integer INDEX_SHEAR     = 6;&lt;br /&gt;
&lt;br /&gt;
// Index of properties for PRIM_TEXTURE&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TEXTURE   = 0;&lt;br /&gt;
integer INDEX_REPEATS   = 1;&lt;br /&gt;
integer INDEX_OFFSETS   = 2;&lt;br /&gt;
integer INDEX_ROTATION  = 3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//                client        script&lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
//  Taper   | -1.0 0  +1.0  |  2.0   0.0 | &lt;br /&gt;
//  Shear   | -0.5 0  +0.5  | -0.5  +0.5 |&lt;br /&gt;
//  Twist   | -180 0  +180  | -1.0  +1.0 | &lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Set accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
mySetLinkName (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_NAME, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkDesc (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_DESC, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkText (integer link, string text, vector color) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXT, text, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkColor (integer link, vector color, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_COLOR, face, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkBright (integer link, integer bright, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_FULLBRIGHT, face, bright]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkGlow (integer link, float glow, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_GLOW, face, glow]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Les 3 suivants ne marchent pas pour ALL_SIDES&lt;br /&gt;
&lt;br /&gt;
mySetLinkTexture (integer link, key texture, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [texture], INDEX_TEXTURE, INDEX_TEXTURE);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRepeat (integer link, vector repeat, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [repeat], INDEX_REPEATS, INDEX_REPEATS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkOffset (integer link, vector offset, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [offset], INDEX_OFFSETS, INDEX_OFFSETS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkPos (integer link, vector pos) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_POS_LOCAL, pos]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRot (integer link, rotation rot) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_ROT_LOCAL, rot]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkSize (integer link, vector size) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_SIZE, size]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkCut (integer link, vector cut) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [cut], INDEX_CUT, INDEX_CUT);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTwist (integer link, vector twist) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [twist], INDEX_TWIST, INDEX_TWIST);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTaper (integer link, vector taper) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [taper], INDEX_TAPER, INDEX_TAPER);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkShear (integer link, vector shear) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [shear], INDEX_SHEAR, INDEX_SHEAR);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkHollow (integer link, float hollow) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [hollow], INDEX_HOLLOW, INDEX_HOLLOW);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Get accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
string myGetLinkName (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_NAME]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkDesc (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_DESC]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkText (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXT]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkColor (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_COLOR, face]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer myGetLinkBright (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_FULLBRIGHT, face]);&lt;br /&gt;
    return llList2Integer (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkGlow (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_GLOW, face]);&lt;br /&gt;
    return llList2Float (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key myGetLinkTexture (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Key(l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkRepeat (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkOffset (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkPos (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_POS_LOCAL]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkSize (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_SIZE]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkCut (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_CUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTwist (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TWIST);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTaper (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TAPER);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkShear (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_SHEAR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkHollow (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Float (l, INDEX_HOLLOW);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
LL accessors can be effortlessly converted to OS versions. Just change prim_num to prim_key in argument list, and pick the right os/ll function. Finally, you can use function overloading to write universal routines :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
SetPrimColor (key prim, vector color, integer side)&lt;br /&gt;
{&lt;br /&gt;
    osSetPrimitiveParams (prim, [PRIM_COLOR, side, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SetPrimColor (integer prim, vector color, integer side)&lt;br /&gt;
{&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (prim, [PRIM_COLOR, side, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
[[Category:Scripts]]&lt;br /&gt;
[[Category:OSSL]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OSSL_vs_LSL</id>
		<title>OSSL vs LSL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OSSL_vs_LSL"/>
				<updated>2025-04-07T15:03:35Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Added Key2Name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;LSL and OSSL functions may appear overlapping. Sometimes, they are. This may happen when a OSSL function has been written before it's LL conterpart. Most of the time, they are complementary.&lt;br /&gt;
&lt;br /&gt;
OSSL implements features not available in LSL (NPCs, Texture Drawing) or extend them, like adressing prims by key, which gives unprecedented flexibility to the scripter. &lt;br /&gt;
&lt;br /&gt;
This page tries to highlight the differences between OSSL and LSL functions when similar versions exist. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
| llGetLinkPrimitiveParams || [[osGetLinkPrimitiveParams]] || Allows for multiple-link constants LINK_SET, LINK_ALL_CHILDREN. Returns a by-side list of properties.&lt;br /&gt;
|-&lt;br /&gt;
| llSetLinkPrimitiveParams ||  || No need for OSSL version since llSetLinkPrimitiveParams accepts all LINK_* flags&lt;br /&gt;
|-&lt;br /&gt;
| llGetPrimitiveParams&amp;lt;br/&amp;gt;llSetPrimitiveParams || [[osGetPrimitiveParams]]&amp;lt;br/&amp;gt;[[osSetPrimitiveParams]] || Acts on out-of-linkset primitive (uuid instead of linknumber)&lt;br /&gt;
|-&lt;br /&gt;
|| || [[osSetProjectionParams]] || Same effect can be obtained with llSetLinkPrimitiveParams (linknum, [PRIM_PROJECTOR]) but OSSL version has osSetPrimitiveParams power to work outside linkset.&lt;br /&gt;
|-&lt;br /&gt;
| llCreateLink&amp;lt;br\&amp;gt;llBreakLink&amp;lt;br\&amp;gt;llBreakAllLinks || [[osForceCreateLink]]&amp;lt;br/&amp;gt;[[osForceBreakLink]]&amp;lt;br\&amp;gt;[[osForceBreakAllLinks]] || Does not require PERMISSION_CHANGE_LINKS&lt;br /&gt;
|-&lt;br /&gt;
| llParticleSystem&amp;lt;br/&amp;gt;llLinkParticleSystem || [[osParticleSystem]]&amp;lt;br/&amp;gt;[[osLinkParticleSystem]] || &lt;br /&gt;
|-&lt;br /&gt;
| llSitTarget&amp;lt;br/&amp;gt;llLinkSitTarget || [[osSetStandTarget]]&amp;lt;br/&amp;gt;[[osSetLinkStandTarget]] || SitTarget is position when sitting.&amp;lt;br/&amp;gt;StandTarget, position when unsitting.&lt;br /&gt;
|-&lt;br /&gt;
| llAvatarOnSitTarget&amp;lt;br/&amp;gt;llAvatarOnLinkSitTarget || [[osGetSittingAvatarsCount]]()&amp;lt;br/&amp;gt;[[osGetSittingAvatarsCount]](uuid) || OSSL function returns the total number of avatars sitting on a linkset. LSL functions apply only to avatars on sittarget (return NULL_KEY if sittarget is not set) and cannot operate outside the linkset. A similar result can be obtained with llGetObjectDetails(uuid, [OBJECT_SIT_COUNT]).&lt;br /&gt;
|-&lt;br /&gt;
| llPlaySound&amp;lt;br/&amp;gt;llLoopSound&amp;lt;br/&amp;gt;llTriggerSound&amp;lt;br/&amp;gt;... || [[osPlaySound]]&amp;lt;br\&amp;gt;[[osLoopSound]]&amp;lt;br\&amp;gt;[[osTriggerSound]]&amp;lt;br/&amp;gt;... || All OSSL sound functions takes a linknumber argument.&lt;br /&gt;
|-&lt;br /&gt;
| llLinkPlaySound || || Universal link sound function (SOUND_PLAY, SOUND_LOOP, SOUND_TRIGGER, SOUND_SYNC). Equivalent to resp. osPlaySound, osLoopSound, osTriggerSound, osPlaySoundSlave, osLoopSoundSlave.&lt;br /&gt;
|-&lt;br /&gt;
| llGetNumberOfPrims&amp;lt;br/&amp;gt;llGetObjectPrimCount || [[osGetPrimCount]]()&amp;lt;br/&amp;gt;[[osGetPrimCount]](uuid) || OSSL version does not count sitting avatars and does work on attachments&lt;br /&gt;
|-&lt;br /&gt;
| llStartAnimation&amp;lt;br/&amp;gt;llStopAnimation ||[[osAvatarPlayAnimation]]&amp;lt;br/&amp;gt;[[osAvatarStopAnimation]] || Does not require PERMISSION_TRIGGER_ANIMATION&amp;lt;br/&amp;gt;OSSL can animate multiples avatars, when LSL is bound to the avatar having granted the permission.&lt;br /&gt;
|-&lt;br /&gt;
| llAttachToAvatar&amp;lt;br/&amp;gt; llDetachFromAvatar || [[osForceAttachToAvatar]]&amp;lt;br/&amp;gt;[[osForceDetachFromAvatar]] || Does not require PERMISSION_ATTACH.&amp;lt;br/&amp;gt;Target avatar is implicit. To attach explicitely to a given avatar, use osForceAttachToOtherAvatarFromInventory on the avatar's key.&lt;br /&gt;
|-&lt;br /&gt;
| llGetAgentList || [[osGetAgents]]&amp;lt;br/&amp;gt;[[osGetAvatarList]]&amp;lt;br/&amp;gt;[[OsGetNpcList|osGetNPCList]] || llGetAgentList returns a list of agent keys.&amp;lt;br/&amp;gt; osGetAgents, a list of agent names.&amp;lt;br/&amp;gt;osGetAvatarList, a strided list of agent (key, position, name).&amp;lt;br/&amp;gt;osGetNPCList : same as osGetAvatarList, but only NPCs.&lt;br /&gt;
|-&lt;br /&gt;
| llGetInventoryKey&amp;lt;br/&amp;gt;llGetInventoryName || [[osGetInventoryItemKey]]&amp;lt;br/&amp;gt;[[osGetInventoryName]] || llGetInventoryKey returns &amp;lt;u&amp;gt;item&amp;lt;/u&amp;gt; id while osGetInventoryItemKey returns &amp;lt;u&amp;gt;asset&amp;lt;/u&amp;gt; id.&amp;lt;br/&amp;gt;llGetInventoryName returns name from (index,type) while osGetInventoryName return name fro item id.&lt;br /&gt;
|-&lt;br /&gt;
| llKey2Name || [[osKey2Name]] || llKey2Name works on both avatars and objects.&amp;lt;br&amp;gt;osKey2Name returns an empty string on objects.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Server_Commands</id>
		<title>Server Commands</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Server_Commands"/>
				<updated>2025-01-20T12:43:38Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Object Commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks|Server_Commands}}&lt;br /&gt;
&lt;br /&gt;
= What are server commands? =&lt;br /&gt;
&lt;br /&gt;
Server commands are those you can type on the console to make the server do various things.&lt;br /&gt;
&lt;br /&gt;
Commands can be divided up into those that apply to the simulator (simulator commands) and those that apply to grid services (service commands).&lt;br /&gt;
&lt;br /&gt;
On a standalone system, both simulator and service commands will be available on the single standalone system console.&lt;br /&gt;
&lt;br /&gt;
On a grid architecture, the simulator commands will be available on the simulators, whilst the service commands will be available on the ROBUST console.&lt;br /&gt;
&lt;br /&gt;
'''Disclaimer''': some commands may not work as expected, some may not work at all, and there is a chance that you may even lose all your settings/contents. This summary quickly goes out of date - the best place to find commands is by typing &amp;quot;help&amp;quot; on the region console.&lt;br /&gt;
&lt;br /&gt;
Except where noted, this list should be accurate for OpenSimulator 0.7.1 onwards.&lt;br /&gt;
&lt;br /&gt;
= Commands =&lt;br /&gt;
&lt;br /&gt;
== General Server Commands ==&lt;br /&gt;
&lt;br /&gt;
These commands are available in both simulator and robust consoles.&lt;br /&gt;
&lt;br /&gt;
=== General ===&lt;br /&gt;
&lt;br /&gt;
* command-script [scriptfile] - Runs a command script containing console commands.&lt;br /&gt;
* quit - shutdown the server.&lt;br /&gt;
* show info - show server information (version and startup path).  Before OpenSimulator 0.7.5 this is only available on the simulator console.&lt;br /&gt;
* show uptime - show server startup time and uptime.  Before OpenSimulator 0.7.5 this is only available on the simulator console.&lt;br /&gt;
* show version - show server version.  Before OpenSimulator 0.7.5 this is only available on the simulator console.&lt;br /&gt;
* shutdown - synonym for quit&lt;br /&gt;
* get log level - In OpenSimulator 0.7.5 and later, print the current console logging level.  In OpenSimulator 0.7.4 and earlier please use the &amp;quot;set log level&amp;quot; command instead without a level parameter.&lt;br /&gt;
* set log level [level] - change the console logging level only. For example, off or debug. See [[Logging]] for more information.  In OpenSimulator 0.7.4 and earlier, if called without the level argument prints the current level.  In OpenSimulator 0.7.5 and later please use the &amp;quot;get log level&amp;quot; command instead.  Only available on ROBUST console from OpenSimulator 0.7.5.&lt;br /&gt;
&lt;br /&gt;
=== Debug ===&lt;br /&gt;
&lt;br /&gt;
* debug http [&amp;lt;level&amp;gt;] - Turn on/off extra logging for HTTP request debugging.  Only available on robust console from commit 94517c8 (dev code post 0.7.3.1).  In current development code (for OpenSimulator 0.7.5) this is debug http in|out|all [&amp;lt;level&amp;gt;] since outbound HTTP messages can also now be logged (this was only possible for inbound before). For more information on this command, see [[Debugging]].&lt;br /&gt;
&lt;br /&gt;
* debug threadpool level &amp;lt;level&amp;gt; - Turn on/off logging of activity in the main threadpool. For more information, see [[General-Purpose Threadpool]].&lt;br /&gt;
&lt;br /&gt;
== Simulator Commands ==&lt;br /&gt;
&lt;br /&gt;
=== General ===&lt;br /&gt;
&lt;br /&gt;
* change region &amp;lt;region name&amp;gt; - subsequent commands apply only to the specified region. If region name is &amp;quot;root&amp;quot; then all regions are selected&lt;br /&gt;
* debug packet &amp;lt;level&amp;gt; - Turn on packet debugging, where OpenSimulator prints out summaries of incoming and outgoing packets for viewers, depending on the level set&lt;br /&gt;
* emergency-monitoring - turn emergency debugging monitoring mode on or off.&lt;br /&gt;
* help [&amp;lt;command&amp;gt;] - Get general command list or more detailed help on a specific command or set of commands&lt;br /&gt;
* link-mapping - Set a local grid co-ordinate to link to a remote hypergrid &lt;br /&gt;
* link-region - Link a HyperGrid region. Not sure how this differs from link-mapping&lt;br /&gt;
* modules list - List modules&lt;br /&gt;
* modules load &amp;lt;name&amp;gt; - Load a module&lt;br /&gt;
* modules unload &amp;lt;name&amp;gt; - Unload a module&lt;br /&gt;
* monitor report - Returns a variety of statistics about the current region and/or simulator&lt;br /&gt;
* set terrain heights &amp;lt;corner&amp;gt; &amp;lt;min&amp;gt; &amp;lt;max&amp;gt; [&amp;lt;x&amp;gt;] [&amp;lt;y&amp;gt;] - Sets the terrain texture heights on corner #&amp;lt;corner&amp;gt; to &amp;lt;min&amp;gt;/&amp;lt;max&amp;gt;, if &amp;lt;x&amp;gt; or &amp;lt;y&amp;gt; are specified, it will only set it on regions with a matching coordinate. Specify -1 in &amp;lt;x&amp;gt; or &amp;lt;y&amp;gt; to wildcard that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.&lt;br /&gt;
* set terrain texture &amp;lt;number&amp;gt; &amp;lt;uuid&amp;gt; [&amp;lt;x&amp;gt;] [&amp;lt;y&amp;gt;] - Sets the terrain &amp;lt;number&amp;gt; to &amp;lt;uuid&amp;gt;, if &amp;lt;x&amp;gt; or &amp;lt;y&amp;gt; are specified, it will only set it on regions with a matching coordinate. Specify -1 in &amp;lt;x&amp;gt; or &amp;lt;y&amp;gt; to wildcard that coordinate.&lt;br /&gt;
* show caps - show all registered capabilities URLs&lt;br /&gt;
:NOTE: In OpenSimulator 0.7.1, &amp;quot;show capabilities&amp;quot; is shown as a result for help command, but actually only &amp;quot;show caps&amp;quot; will be accepted. ([http://opensimulator.org/mantis/view.php?id=5467 #5467])&lt;br /&gt;
* set water height # - sets the height simulator wide or single region if you use change region.&lt;br /&gt;
* show circuits - Show agent circuit data&lt;br /&gt;
* show connections - show connections data&lt;br /&gt;
* show http-handlers - show all registered http handlers&lt;br /&gt;
* show hyperlinks - list hg regions&lt;br /&gt;
* show modules - show module data&lt;br /&gt;
* show pending-objects - show number of objects in the pending queues of all viewers&lt;br /&gt;
* show pqueues [full] - show priority queue data for each client. Without the 'full' option, only root agents are shown. With the 'full' option child agents are also shown.&lt;br /&gt;
* show queues - Show queue data for agent connections.&lt;br /&gt;
* show threads - shows the persistent threads registered with the system. Does not include threadpool threads. &lt;br /&gt;
* show throttles [full] - Show throttle data for each client connection, and the maximum allowed for each connection by the server. Without the 'full' option, only root agents are shown. With the 'full' option child agents are also shown.&lt;br /&gt;
* unlink-region &amp;lt;local name&amp;gt; - unlink a hypergrid region&lt;br /&gt;
&lt;br /&gt;
=== Appearance Commands ===&lt;br /&gt;
&lt;br /&gt;
* appearance find &amp;lt;uuid-or-start-of-uuid&amp;gt; - Find out which avatar uses the given asset as a baked texture, if any.&lt;br /&gt;
* appearance rebake &amp;lt;first-name&amp;gt; &amp;lt;last-name&amp;gt; - Send a request to the user's viewer for it to rebake and reupload its appearance textures.&lt;br /&gt;
* appearance send [&amp;lt;first-name&amp;gt; &amp;lt;last-name&amp;gt;] - Send appearance data for each avatar in the simulator to other viewers.&lt;br /&gt;
* appearance show [&amp;lt;first-name&amp;gt; &amp;lt;last-name&amp;gt;] - Show appearance information for avatars.&lt;br /&gt;
&lt;br /&gt;
Only exists in development code at the moment.&lt;br /&gt;
&lt;br /&gt;
=== Archive Commands ===&lt;br /&gt;
&lt;br /&gt;
* load iar &amp;lt;first&amp;gt; &amp;lt;last&amp;gt; &amp;lt;inventory path&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;archive path&amp;gt;] - Load user inventory archive. See [[Inventory Archives]].&lt;br /&gt;
* load oar [filename] - load an OpenSimulator archive. This entirely replaces the current region. Default filename is '''region.oar'''. See [[OpenSim Archives]].&lt;br /&gt;
* load xml [-newIDs [&amp;lt;x&amp;gt; &amp;lt;y&amp;gt; &amp;lt;z&amp;gt;]] - Load a region's data from XML format (0.7.*: DEPRECATED and may be REMOVED soon. Use &amp;quot;load xml2&amp;quot; instead)&lt;br /&gt;
:those xml are the result of the export save or *export save-all&lt;br /&gt;
* load xml2 [filename] - optional parameters not supported for XML2 format as at 1-Jul-2008 &lt;br /&gt;
* save iar &amp;lt;first&amp;gt; &amp;lt;last&amp;gt; &amp;lt;inventory path&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;archive path&amp;gt;] - Save user inventory archive. See [[Inventory Archives]]&lt;br /&gt;
* save oar [filename] - save the current region to an OpenSimulator archive. Default filename is '''region.oar'''. See [[OpenSim Archives]].&lt;br /&gt;
* save prims xml2 [&amp;lt;prim name&amp;gt; &amp;lt;file name&amp;gt;] - Save named prim to XML2&lt;br /&gt;
* save xml [filename] - save prims to XML &lt;br /&gt;
* save xml2 [filename] - save prims to XML (Format 2 - rearrangement of some nodes, to make loading/saving easier) &lt;br /&gt;
&lt;br /&gt;
=== Asset Commands ===&lt;br /&gt;
&lt;br /&gt;
The fcache commands only currently appearance if you are using the fcache asset cache.  This is the default on OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* fcache assets - Attempt a deep scan and cache of all assets in all scenes&lt;br /&gt;
* fcache clear [file] [memory] - Remove all assets in the cache.  If file or memory is specified then only this cache is cleared.&lt;br /&gt;
* fcache expire &amp;lt;datetime&amp;gt; - Purge cached assets older then the specified date/time&lt;br /&gt;
* fcache status - Display cache status&lt;br /&gt;
* j2k decode &amp;lt;ID&amp;gt; - Do JPEG2000 decoding of an asset.&lt;br /&gt;
&lt;br /&gt;
=== Config Commands ===&lt;br /&gt;
&lt;br /&gt;
* config get [&amp;lt;section&amp;gt;] [&amp;lt;key&amp;gt;] - Get the current configuration, either for a particular key, a particular section or the whole config.&lt;br /&gt;
* config save &amp;lt;path&amp;gt; - Save the current configuration to a file.&lt;br /&gt;
* config set &amp;lt;section&amp;gt; &amp;lt;key&amp;gt; - Set a particular configuration value. On the whole, this is useless since neither OpenSimulator nor modules dynamically reload config values.&lt;br /&gt;
* config show [&amp;lt;section&amp;gt;] [&amp;lt;key&amp;gt;] - Synonym for 'config get'&lt;br /&gt;
&lt;br /&gt;
=== Land Commands ===&lt;br /&gt;
&lt;br /&gt;
* land show - Shows all parcels on the current region.&lt;br /&gt;
* land clear - Clears all parcels on the land.&lt;br /&gt;
&lt;br /&gt;
=== Map Commands ===&lt;br /&gt;
&lt;br /&gt;
* export-map [&amp;lt;path&amp;gt;] - Save an image of the world map (default name is exportmap.jpg)&lt;br /&gt;
* generate map - Regenerates and stores map tile.  Only in development code post 0.7.6.&lt;br /&gt;
&lt;br /&gt;
=== Object Commands ===&lt;br /&gt;
&lt;br /&gt;
* backup - Persist currently unsaved object changes immediately instead of waiting for the normal persistence call.  This shouldn't normally be required - the simulator persists region objects automatically at regular intervals and on shutdown.&lt;br /&gt;
* delete object creator &amp;lt;UUID&amp;gt; - Delete a scene object by creator&lt;br /&gt;
* delete object name [--regex] &amp;lt;name&amp;gt; - Delete a scene object by name.&lt;br /&gt;
* delete object outside - Delete all scene objects outside region boundaries.  This is currently if z &amp;lt; 0 or z &amp;gt; 10000.  Object outside these bounds have been known to cause issues with OpenSimulator's use of some physics engines (such as the Open Dynamics Engine).&lt;br /&gt;
* delete object owner &amp;lt;UUID&amp;gt; - Delete a scene object by owner&lt;br /&gt;
* delete object id &amp;lt;UUID-or-localID&amp;gt; - Delete a scene object by uuid or localID. Pre 0.7.5, this was &amp;quot;delete object uuid&amp;quot;.&lt;br /&gt;
* dump object id &amp;lt;UUID-or-localID&amp;gt; - Dump the serialization of the given object to a file for debug purposes.&lt;br /&gt;
* edit scale &amp;lt;name&amp;gt; &amp;lt;x&amp;gt; &amp;lt;y&amp;gt; &amp;lt;z&amp;gt; - Change the scale of a named prim&lt;br /&gt;
* force update - Force the region to send all clients updates about all objects.&lt;br /&gt;
* show object name [--regex] &amp;lt;name&amp;gt; - Show details of scene objects with the given name.&lt;br /&gt;
* show object id &amp;lt;UUID-or-localID&amp;gt; - Show details of a scene object with the given UUID or localID. Pre 0.7.5, this was &amp;quot;show object uuid&amp;quot;.&lt;br /&gt;
* show part name [--regex] &amp;lt;name&amp;gt; - Show details of scene object parts with the given name.&lt;br /&gt;
* show part id &amp;lt;UUID-or-localID&amp;gt; - Show details of a scene object parts with the given UUID or localID. Pre 0.7.5, this was &amp;quot;show part uuid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Estate Commands ===&lt;br /&gt;
* reload estate - reload estate data&lt;br /&gt;
* estate link region &amp;lt;estate ID&amp;gt; &amp;lt;region ID&amp;gt; - Attaches the specified region to the specified estate.&lt;br /&gt;
* estate show - This command will show the estate name, ID, and owner for regions currently running in the simulator. This list does not necessarily include all estates that are present in the database.  &lt;br /&gt;
Sample usage: &lt;br /&gt;
 estate show&amp;lt;enter&amp;gt;&lt;br /&gt;
 Estate information for region TestRegion&lt;br /&gt;
 Estate Name ID Owner&lt;br /&gt;
 My Estate 103 Test User&lt;br /&gt;
* estate set name &amp;lt;estate ID&amp;gt; &amp;lt;new name&amp;gt; - Rename an estate&lt;br /&gt;
* estate set owner &amp;lt;estate ID&amp;gt; &amp;lt;FirstName&amp;gt; &amp;lt;LastName&amp;gt; - Change the owner of an estate. This command supports two forms; this one uses the owner's name.&lt;br /&gt;
* estate set owner &amp;lt;estate ID&amp;gt; &amp;lt;owner UUID&amp;gt; - Change the owner of an estate. This command supports two forms; this one uses the owner's UUID.&lt;br /&gt;
* estate create &amp;lt;owner UUID&amp;gt; &amp;lt;estate name&amp;gt; - Must be a user UUID which you can get from 'show names'&lt;br /&gt;
&lt;br /&gt;
=== Region Commands ===&lt;br /&gt;
* change region &amp;lt;region name&amp;gt; - subsequent commands apply only to the specified region. If region name is &amp;quot;root&amp;quot; then all regions are selected&lt;br /&gt;
* create region [name] [filename] - Create a new region &lt;br /&gt;
* delete-region &amp;lt;name&amp;gt; - Delete a region from disk.&lt;br /&gt;
* region get - Post OpenSimulator 0.8.0.*.  Show region parameters (Region Name, Region UUID, Location, URI, Owner ID, Flags).&lt;br /&gt;
* region restart abort [&amp;lt;message&amp;gt;] - Abort a scheduled region restart, with an optional message&lt;br /&gt;
* region restart bluebox &amp;lt;message&amp;gt; &amp;lt;delta seconds&amp;gt;+ - Schedule a region restart. If one delta is given then the region is restarted in delta seconds time. A time to restart is sent to users in the region as a dismissable bluebox notice. If multiple deltas are given then a notice is sent when we reach each delta.&lt;br /&gt;
* region restart notice &amp;lt;message&amp;gt; &amp;lt;delta seconds&amp;gt;+ - Schedule a region restart. Same as above except showing a transient notice instead of a dismissable bluebox.&lt;br /&gt;
* region set - Post OpenSimulator 0.8.0.*.  Set certain region parameters.  Currently, can set&lt;br /&gt;
** agent-limit - The current avatar limit for the region.  More usually this is set via the region/estate dialog in a typical viewer.  This persists over simulator restarts.&lt;br /&gt;
** max-agent-limit - The maximum value that agent-limit can have.  Unfortunately, setting it here does not currently persist over server restarts.  For that to happen it must be separately set as the MaxAgents parameter in the region config file.&lt;br /&gt;
* remove-region - remove a region from the simulator&lt;br /&gt;
* restart - Restarts all sims in this instance&lt;br /&gt;
* restart region &amp;lt;regionname&amp;gt; - Restarts just one sim in an instance. Set the console to the region name first, with 'change region &amp;lt;regionname&amp;gt;', or all regions will restart.&lt;br /&gt;
* set region flags &amp;lt;Region name&amp;gt; &amp;lt;flags&amp;gt; - Set database flags for region&lt;br /&gt;
:Flags can be one of the following:&lt;br /&gt;
:'''DefaultRegion'''	Used for new Rez. Random if multiple defined&lt;br /&gt;
:'''FallbackRegion'''	Regions we redirect to when the destination is down&lt;br /&gt;
:'''RegionOnline'''	Set when a region comes online, unset when it unregisters and DeleteOnUnregister is false&lt;br /&gt;
:'''NoDirectLogin'''	Region unavailable for direct logins (by name)&lt;br /&gt;
:'''Persistent'''	Don't remove on unregister&lt;br /&gt;
:'''LockedOut'''	Don't allow registration&lt;br /&gt;
:'''NoMove	'''Don't allow moving this region&lt;br /&gt;
:'''Reservation'''	This is an inactive reservation&lt;br /&gt;
:'''Authenticate'''	Require authentication&lt;br /&gt;
:'''Hyperlink'''	Record represents a HG link&lt;br /&gt;
:'''DefaultHGRegion'''	Record represents a default region for hypergrid teleports only.&lt;br /&gt;
:Note: flags are additive, there is no way to unset them from the console.&lt;br /&gt;
* show neighbours - Shows the local regions' neighbours&lt;br /&gt;
* show ratings - Show rating data&lt;br /&gt;
* show region - Show region parameters (Region Name, Region UUID, Location, URI, Owner ID, Flags).&lt;br /&gt;
* show regions - Show regions data (Region Names, XLocation YLocation coordinates, Region Ports, Estate Names)&lt;br /&gt;
&lt;br /&gt;
=== Scene Commands ===&lt;br /&gt;
&lt;br /&gt;
* debug scene - Turn on scene debugging&lt;br /&gt;
* rotate scene &amp;lt;degrees&amp;gt; - Rotates scene around 128,128 axis by x degrees where x=0-360.&lt;br /&gt;
* scale scene &amp;lt;factor&amp;gt; - Scales all scene objects by a factor where original size =1.0.&lt;br /&gt;
* translate scene &amp;lt;x,y,z&amp;gt; - Translate (move) the entire scene to a new coordinate. Useful for moving a scene to a different location on either a Mega or Variable region. &lt;br /&gt;
(please back up your region before using any of these commands and be aware of possible floating point errors the more they are used.)&lt;br /&gt;
 &lt;br /&gt;
=== Script Commands ===&lt;br /&gt;
&lt;br /&gt;
These currently only exist in git master OpenSimulator development code post the 0.7.2 release.&lt;br /&gt;
&lt;br /&gt;
* scripts resume [&amp;lt;script-item-uuid&amp;gt;] - Resumes all suspended scripts&lt;br /&gt;
* scripts show [&amp;lt;script-item-uuid&amp;gt;] - Show script information. &amp;lt;script-item-uuid&amp;gt; option only exists from git master 82f0e19 (2012-01-14) onwards (post OpenSimulator 0.7.2).&lt;br /&gt;
* scripts start [&amp;lt;script-item-uuid&amp;gt;] - Starts all stopped scripts&lt;br /&gt;
* scripts stop [&amp;lt;script-item-uuid&amp;gt;] - Stops all running scripts&lt;br /&gt;
* scripts suspend [&amp;lt;script-item-uuid&amp;gt;] - Suspends all running scripts&lt;br /&gt;
&lt;br /&gt;
=== Stats Commands ===&lt;br /&gt;
&lt;br /&gt;
* show stats - show useful statistical information for this server. See [[#Frame Statistics Values|Frame Statistics Values]] below for more information.&lt;br /&gt;
* stats show - a synonym for &amp;quot;show stats&amp;quot; (OpenSimulator dev code only post 19th March 2014).&lt;br /&gt;
* stats record - record stats periodically to a separate log file.&lt;br /&gt;
* stats save - save a snapshot of current stats to a file (OpenSimulator dev code only post 19th March 2014).&lt;br /&gt;
&lt;br /&gt;
=== Terrain Commands ===&lt;br /&gt;
&lt;br /&gt;
Some of these may require a sim restart to show properly.&lt;br /&gt;
* terrain load - Loads a terrain from a specified file. (see note1)&lt;br /&gt;
* terrain load-tile - Loads a terrain from a section of a larger file.&lt;br /&gt;
* terrain save - Saves the current heightmap to a specified file.&lt;br /&gt;
* terrain save-tile - Saves the current heightmap to the larger file.&lt;br /&gt;
* terrain fill - Fills the current heightmap with a specified value.&lt;br /&gt;
* terrain elevate - Raises the current heightmap by the specified amount.&lt;br /&gt;
* terrain lower - Lowers the current heightmap by the specified amount.&lt;br /&gt;
* terrain multiply - Multiplies the heightmap by the value specified.&lt;br /&gt;
* terrain bake - Saves the current terrain into the regions baked map.&lt;br /&gt;
* terrain revert - Loads the baked map terrain into the regions heightmap.&lt;br /&gt;
* terrain newbrushes - Enables experimental brushes which replace the standard terrain brushes.&lt;br /&gt;
* terrain show - Shows terrain height at a given co-ordinate.&lt;br /&gt;
* terrain stats - Shows some information about the regions heightmap for debugging purposes.&lt;br /&gt;
* terrain effect - Runs a specified plugin effect&lt;br /&gt;
* terrain flip - Flips the current terrain about the X or Y axis&lt;br /&gt;
* terrain rescale - Rescales the current terrain to fit between the given min and max heights&lt;br /&gt;
* terrain min - Sets the minimum terrain height to the specified value.&lt;br /&gt;
* terrain max - Sets the maximum terrain height to the specified value.&lt;br /&gt;
* terrain modify - Provides several area-of-effect terraforming commands.&lt;br /&gt;
&lt;br /&gt;
Note1 : If you have a sim with multiple regions and you want to set all regions on that sim to be from one larger image you can use 'terrain load &amp;lt;file&amp;gt; &amp;lt;width in regions&amp;gt; &amp;lt;height in regions&amp;gt; &amp;lt;regionX&amp;gt; &amp;lt;regionY&amp;gt; where regionX and regionY are the coordinates of the bottom-left region.&lt;br /&gt;
&lt;br /&gt;
=== Tree Commands ===&lt;br /&gt;
&lt;br /&gt;
* tree active - Change activity state for the trees module&lt;br /&gt;
* tree freeze - Freeze/Unfreeze activity for a defined copse&lt;br /&gt;
* tree load - Load a copse definition from an xml file&lt;br /&gt;
* tree plant - Start the planting on a copse&lt;br /&gt;
* tree rate - Reset the tree update rate (mSec)&lt;br /&gt;
* tree reload - Reload copse definitions from the in-scene trees&lt;br /&gt;
* tree remove - Remove a copse definition and all its in-scene trees&lt;br /&gt;
* tree statistics - Log statistics about the trees&lt;br /&gt;
&lt;br /&gt;
=== User Commands ===&lt;br /&gt;
&lt;br /&gt;
* alert &amp;lt;message&amp;gt; - send an in-world alert to everyone&lt;br /&gt;
* alert-user &amp;lt;first&amp;gt; &amp;lt;last&amp;gt; &amp;lt;message&amp;gt; - send an an in-world alert to a specific user&lt;br /&gt;
* bypass permissions &amp;amp;lt;true / false&amp;amp;gt; - Bypass in-world permission checks &lt;br /&gt;
* debug permissions - Turn on permissions debugging&lt;br /&gt;
* force permissions - Force permissions on or off.&lt;br /&gt;
* kick user &amp;lt;first&amp;gt; &amp;lt;last&amp;gt; [message]: - Kick a user off the simulator&lt;br /&gt;
* login disable - Disable user entry to this simulator&lt;br /&gt;
* login enable - Enable user entry to this simulator&lt;br /&gt;
* login status - Show whether logins to this simulator are enabled or disabled&lt;br /&gt;
* show users [full]- show info about currently connected users to this region. Without the 'full' option, only users actually on the region are shown. With the 'full' option child agents of users in neighbouring regions are also shown.&lt;br /&gt;
* teleport user &amp;lt;destination&amp;gt; - Teleport a user on this simulator to a specific destination.  Currently only in OpenSimulator development code after the 0.7.3.1 release (commit bf0b817).&lt;br /&gt;
&lt;br /&gt;
=== Windlight/[[LightShare]] Commands ===&lt;br /&gt;
&lt;br /&gt;
* windlight load - Load windlight profile from the database and broadcast&lt;br /&gt;
* windlight enable - Enable the windlight plugin&lt;br /&gt;
* windlight disable - Disable the windlight plugin&lt;br /&gt;
&lt;br /&gt;
=== [[YEngine]] Commands ===&lt;br /&gt;
* yeng help&lt;br /&gt;
* yeng reset -all | &amp;lt;part-of-script-name&amp;gt;&lt;br /&gt;
* yeng resume - resume script processing&lt;br /&gt;
* yeng suspend - suspend script processing&lt;br /&gt;
* yeng ls -full -max=&amp;lt;number&amp;gt; -out=&amp;lt;filename&amp;gt; -queues -topcpu&lt;br /&gt;
* yeng cvv - show compiler version value&lt;br /&gt;
* yeng mvv [&amp;lt;newvalue&amp;gt;] - show migration version value&lt;br /&gt;
* yeng tracecalls [yes | no]&lt;br /&gt;
* yeng verbose [yes | no]&lt;br /&gt;
* yeng pev -all | &amp;lt;part-of-script-name&amp;gt; &amp;lt;event-name&amp;gt; &amp;lt;params...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ROBUST Service Commands ==&lt;br /&gt;
&lt;br /&gt;
These can also be accessed on the simulator command console itself in standalone mode.&lt;br /&gt;
&lt;br /&gt;
=== Asset Service ===&lt;br /&gt;
&lt;br /&gt;
* delete asset &amp;lt;ID&amp;gt; - Delete an asset from the database. Doesn't appear to be implemented.&lt;br /&gt;
* dump asset &amp;lt;ID&amp;gt; - Dump an asset to the filesystem.  OpenSimulator 0.7.3 onwards.&lt;br /&gt;
* show digest &amp;lt;ID&amp;gt; - Show summary information about an asset. From OpenSimulator 0.7.3 onwards this will be renamed to &amp;quot;show asset&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Grid Service ===&lt;br /&gt;
&lt;br /&gt;
* set region flags &amp;lt;Region name&amp;gt; &amp;lt;flags&amp;gt; - Set database flags for region&lt;br /&gt;
* show region &amp;lt;Region name&amp;gt; - Show the details of a given region.  This command is renamed to &amp;quot;show region name&amp;quot; in development versions of OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
The following commands currently only exist in development versions of OpenSimulator (post 0.7.3.1).  These are currently found in the &amp;quot;Regions&amp;quot; help section.&lt;br /&gt;
&lt;br /&gt;
* deregister region id &amp;lt;Region UUID&amp;gt; - Deregister a region manually.  This can be helpful if a region was not properly removed due to bad simulator shutdown and the simulator has not since been restarted or its region configuration has been changed.&lt;br /&gt;
* show region at &amp;lt;x-coord&amp;gt; &amp;lt;y-coord&amp;gt; - Show details on a region at the given co-ordinate.&lt;br /&gt;
* show region name &amp;lt;Region name&amp;gt; - Show details on a region&lt;br /&gt;
* show regions - Show details on all regions.  In standalone mode this version of the command is not currently available - the simulator version of &amp;quot;show regions&amp;quot; is used instead, which shows similar information.&lt;br /&gt;
&lt;br /&gt;
=== User Service ===&lt;br /&gt;
* create user [first] [last] [passw] [Email] [Primary UUID] [Model} - creates a new user&lt;br /&gt;
:or just: create user - and server prompts for all data&lt;br /&gt;
:&lt;br /&gt;
:If UUID is nul or whitespace a UUID will be generated for you.&lt;br /&gt;
:&lt;br /&gt;
:Model is the &amp;quot;first lastname&amp;quot; of another user, that user's outfit will be cloned to the new user.&lt;br /&gt;
:&lt;br /&gt;
* reset user password - This command ''sets'' a new password for a user and directly updates the database. It does not ''reset'' the password to a default or temporary value, as the term might suggest.&lt;br /&gt;
* show account &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt; - show account details for the given user name (0.7.2-dev)&lt;br /&gt;
&lt;br /&gt;
=== Login Service ===&lt;br /&gt;
* login level &amp;lt;value&amp;gt; - Set the miminim userlevel allowed to login (see [[Userlevel|User Level]]).&lt;br /&gt;
* login reset - reset the login level to its default value.&lt;br /&gt;
* login text &amp;lt;text to print during the login&amp;gt;&lt;br /&gt;
* set user level &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt; &amp;lt;level&amp;gt; - Set UserLevel for the user, which determines whether a user has a god account or can login at all (0.7.2-dev) (see [[Userlevel|User Level]]).&lt;br /&gt;
&lt;br /&gt;
== Details of Terrain Module Commands ==&lt;br /&gt;
&lt;br /&gt;
==== terrain load ====&lt;br /&gt;
Loads a terrain from a specified file.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* filename (String)&lt;br /&gt;
	The file you wish to load from, the file extension determines the loader to be used. Supported extensions include: .r32 (RAW32) .f32 (RAW32) .ter (Terragen) .raw (LL/SL RAW) .jpg (JPEG) .jpeg (JPEG) .bmp (BMP) .png (PNG) .gif (GIF) .tif (TIFF) .tiff (TIFF)&lt;br /&gt;
&lt;br /&gt;
==== terrain load-tile ====&lt;br /&gt;
Loads a terrain from a section of a larger file.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* filename (String)&lt;br /&gt;
	The file you wish to load from, the file extension determines the loader to be used. Supported extensions include: .r32 (RAW32) .f32 (RAW32) .ter (Terragen) .raw (LL/SL RAW) .jpg (JPEG) .jpeg (JPEG) .bmp (BMP) .png (PNG) .gif (GIF) .tif (TIFF) .tiff (TIFF)&lt;br /&gt;
* file width (Integer)&lt;br /&gt;
	The width of the file in tiles&lt;br /&gt;
* file height (Integer)&lt;br /&gt;
	The height of the file in tiles&lt;br /&gt;
* minimum X tile (Integer)&lt;br /&gt;
	The X region coordinate of the first section on the file&lt;br /&gt;
* minimum Y tile (Integer)&lt;br /&gt;
	The Y region coordinate of the first section on the file&lt;br /&gt;
&lt;br /&gt;
==== terrain save ====&lt;br /&gt;
Saves the current heightmap to a specified file.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* filename (String)&lt;br /&gt;
	The destination filename for your heightmap, the file extension determines the format to save in. Supported extensions include: .r32 (RAW32) .f32 (RAW32) .ter (Terragen) .raw (LL/SL RAW) .jpg (JPEG) .jpeg (JPEG) .bmp (BMP) .png (PNG) .gif (GIF) .tif (TIFF) .tiff (TIFF)&lt;br /&gt;
&lt;br /&gt;
==== terrain fill ====&lt;br /&gt;
Fills the current heightmap with a specified value.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* value (Double)&lt;br /&gt;
	The numeric value of the height you wish to set your region to.&lt;br /&gt;
&lt;br /&gt;
==== terrain elevate ====&lt;br /&gt;
Raises the current heightmap by the specified amount.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* amount (Double)&lt;br /&gt;
&lt;br /&gt;
==== terrain lower ====&lt;br /&gt;
Lowers the current heightmap by the specified amount.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* amount (Double)&lt;br /&gt;
	The amount of height to remove from the terrain in meters.&lt;br /&gt;
&lt;br /&gt;
==== terrain multiply ====&lt;br /&gt;
Multiplies the heightmap by the value specified.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* value (Double)&lt;br /&gt;
	The value to multiply the heightmap by.&lt;br /&gt;
&lt;br /&gt;
==== terrain bake ====&lt;br /&gt;
Saves the current terrain into the regions revert map.&lt;br /&gt;
&lt;br /&gt;
==== terrain revert ====&lt;br /&gt;
Loads the revert map terrain into the regions heightmap.&lt;br /&gt;
&lt;br /&gt;
==== terrain newbrushes ====&lt;br /&gt;
Enables experimental brushes which replace the standard terrain brushes. WARNING: This is a debug setting and may be removed at any time.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* Enabled? (Boolean)&lt;br /&gt;
	true / false - Enable new brushes&lt;br /&gt;
&lt;br /&gt;
==== terrain stats ====&lt;br /&gt;
Shows some information about the regions heightmap for debugging purposes.&lt;br /&gt;
&lt;br /&gt;
==== terrain effect ====&lt;br /&gt;
Runs a specified plugin effect&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* name (String)&lt;br /&gt;
	The plugin effect you wish to run, or 'list' to see all plugins&lt;br /&gt;
&lt;br /&gt;
==== terrain modify ====&lt;br /&gt;
Allows area-of-effect and tapering with standard heightmap manipulations.&lt;br /&gt;
&lt;br /&gt;
General command usage:&lt;br /&gt;
:''terrain modify &amp;lt;operation&amp;gt; value [&amp;lt;mask&amp;gt;] [-taper=&amp;lt;value2&amp;gt;]''&lt;br /&gt;
&lt;br /&gt;
:Parameters&lt;br /&gt;
:* value: base value to use in applying operation&lt;br /&gt;
:* mask:&lt;br /&gt;
:** -rec=x1,y1,dx[,dy] creates a rectangular mask based at x1,y1&lt;br /&gt;
:** -ell=x0,y0,rx[,ry] creates an elliptical mask centred at x0,y0&lt;br /&gt;
:* taper:&lt;br /&gt;
:** rectangular masks taper as pyramids&lt;br /&gt;
:** elliptical masks taper as cones&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terrain Manipulation (fill, min, max)&lt;br /&gt;
:* value represents target height (at centre of range)&lt;br /&gt;
:* value2 represents target height (at edges of range)&lt;br /&gt;
&lt;br /&gt;
Terrain Movement (raise, lower, noise)&lt;br /&gt;
:* value represents a delta amount (at centre of range)&lt;br /&gt;
:* value2 represents a delta amount (at edges of range)&lt;br /&gt;
&lt;br /&gt;
Terrain Smoothing (smooth)&lt;br /&gt;
:The smoothing operation is somewhat different than the others, as it does not deal with elevation values, but rather with strength values (in the range of 0.01 to 0.99).  The algorithm is simplistic in averaging the values around a point, and is implemented as follows:&lt;br /&gt;
&lt;br /&gt;
:The &amp;quot;strength&amp;quot; parameter specifies how much of the result is from the original value (&amp;quot;strength&amp;quot; * map[x,y]).&lt;br /&gt;
:The &amp;quot;taper&amp;quot; parameter specifies how much of the remainder is from the first ring surrounding the point (1.0 - &amp;quot;strength&amp;quot;) * &amp;quot;taper&amp;quot;. There are 8 elements in the first ring.&lt;br /&gt;
:The remaining contribution is made from the second ring surrounding the point.  There are 16 elements in the second ring.&lt;br /&gt;
:e.g.&lt;br /&gt;
:''terrain modify smooth 0.5 -taper=0.6''&lt;br /&gt;
:* the original element will contribute 0.5 * map[x0,y0]&lt;br /&gt;
:* each element 1m from the point will contribute ((1-0.5)*0.6)/8 * map[x1,y1]&lt;br /&gt;
:* each element 2m from the point will contribute ((1-0.5)*0.4)/16 * map[x2,y2]&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
:The &amp;quot;taper&amp;quot; value may need to be exaggerated due to the integer math used in maps.&lt;br /&gt;
:e.g. To create a 512x512 var island:&lt;br /&gt;
:''terrain modify min 30 -ell=256,256,240 -taper=-29''&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
: https://www.youtube.com/watch?v=pehyqr3H8I0 (dead link)&lt;br /&gt;
&lt;br /&gt;
== Details of Hypergrid Commands ==&lt;br /&gt;
&lt;br /&gt;
For full details and explanations of Hypergrid Commands, see the [http://opensimulator.org/wiki/Installing_and_Running_Hypergrid#Linking_regions_.28Optional.29 Linking Regions] sections of the [http://opensimulator.org/wiki/Installing_and_Running_Hypergrid Installing and Running Hypergrid] page.&lt;br /&gt;
&lt;br /&gt;
'''show hyperlinks''' &lt;br /&gt;
&lt;br /&gt;
This command will show a list of all hypergrid linked regions.&lt;br /&gt;
&lt;br /&gt;
'''link-region &amp;lt;Xloc&amp;gt; &amp;lt;Yloc&amp;gt; &amp;lt;host&amp;gt; &amp;lt;port&amp;gt; &amp;lt;location-name&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
* Use Xloc and Yloc that make sense to your world, i.e. close to your regions, but not adjacent.&lt;br /&gt;
* replace osl2.nac.uci.edu and 9006 with the domain name / ip address and the port of the region you want to link to&lt;br /&gt;
&lt;br /&gt;
E.g. link-region 8998 8998 osl2.nac.uci.edu 9006 OSGrid Gateway&lt;br /&gt;
&lt;br /&gt;
'''unlink-region &amp;lt;local region name&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
This command will unlink the specified hypergrid linked region - be sure to use the exact local name as reported by the &amp;quot;show hyperlinks&amp;quot; command.&lt;br /&gt;
&lt;br /&gt;
link-mapping - Link a HyperGrid region. Not sure how this differs from link-mapping.&lt;br /&gt;
&lt;br /&gt;
== Frame Statistics Values ==&lt;br /&gt;
&lt;br /&gt;
The labels of the Frame Statistics values shown by the console command &amp;quot;show stats&amp;quot; are a bit cryptic. Here is a list of the meanings of these values:&lt;br /&gt;
&lt;br /&gt;
* Dilatn - time dilation&lt;br /&gt;
* SimFPS - simulator frames per second&lt;br /&gt;
* PhyFPS - physics frames per second&lt;br /&gt;
* AgntUp - # of agent updates&lt;br /&gt;
* RootAg - # of root agents&lt;br /&gt;
* ChldAg - # of child agents&lt;br /&gt;
* Prims - # of total prims&lt;br /&gt;
* AtvPrm - # of active prims&lt;br /&gt;
* AtvScr - # of active scripts&lt;br /&gt;
* ScrLPS - # of script lines per second&lt;br /&gt;
* PktsIn - # of in packets per second&lt;br /&gt;
* PktOut - # of out packets per second&lt;br /&gt;
* PendDl - # of pending downloads&lt;br /&gt;
* PendUl - # of pending uploads&lt;br /&gt;
* UnackB - # of unacknowledged bytes&lt;br /&gt;
* TotlFt - total frame time&lt;br /&gt;
* NetFt - net frame time&lt;br /&gt;
* PhysFt - physics frame time&lt;br /&gt;
* OthrFt - other frame time&lt;br /&gt;
* AgntFt - agent frame time&lt;br /&gt;
* ImgsFt - image frame time&lt;br /&gt;
&lt;br /&gt;
[[Category:Support]]&lt;br /&gt;
[[Category:Help]]&lt;br /&gt;
[[Category:Configuration]]&lt;br /&gt;
[[Category:Getting Started]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/User:JeffKelley</id>
		<title>User:JeffKelley</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/User:JeffKelley"/>
				<updated>2024-11-04T20:26:03Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Scripting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Me ==&lt;br /&gt;
&lt;br /&gt;
I contribute occasionnally to this wiki, mainly in the database section.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== My links ==&lt;br /&gt;
&lt;br /&gt;
===[[Release_Notes]]===&lt;br /&gt;
===[[Database:Documentation|Database]]===&lt;br /&gt;
*[[Assets]]&lt;br /&gt;
*[[Inventoryfolders]]&lt;br /&gt;
*[[Inventoryitems]]&lt;br /&gt;
*[[Prims_(database_table)|Prims]]&lt;br /&gt;
*[[Primitems]]&lt;br /&gt;
*[[Database:Primshapes|Primshapes]]&lt;br /&gt;
&lt;br /&gt;
===[[Services]]===&lt;br /&gt;
*[[AssetService]]&lt;br /&gt;
*[[AvatarService]]&lt;br /&gt;
*[[GridService]]&lt;br /&gt;
*[[GroupsService]]&lt;br /&gt;
*[[GridUserService]]&lt;br /&gt;
*[[InventoryService]]&lt;br /&gt;
*[[PresenceService]]&lt;br /&gt;
*[[UserAccountService]]&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
*[[ClothingManipulation]]&lt;br /&gt;
*[[UserManipulation]]&lt;br /&gt;
&lt;br /&gt;
===[[Scripting]]===&lt;br /&gt;
&lt;br /&gt;
*[[ScriptEngines]]&lt;br /&gt;
*[[XEngine]]&lt;br /&gt;
*[[YEngine]]&lt;br /&gt;
*[[OSSL_Implemented]]&lt;br /&gt;
*[[http://web.archive.org/web/20240713224456/http://wiki.dreamnation.net/index.php/XMREngine_Script_Engine XMRE]] on Wayback Machine&lt;br /&gt;
&lt;br /&gt;
===[[Monitoring]]===&lt;br /&gt;
*[[Monitoring_Module]] + [[Collectd]]&lt;br /&gt;
*[[Web_Statistics_Module]]&lt;br /&gt;
*[[User:Allen_Kerensky/JSON_User_SimStats|JSON_User_SimStats]], [[UXSimStatus]], [[XSimStatus]]&lt;br /&gt;
*[[Logging]]&lt;br /&gt;
&lt;br /&gt;
===AutoBackup===&lt;br /&gt;
*[[Feature_Proposals/AutoBackup]] (proposal)&lt;br /&gt;
*[[Autobackup]] (AutoBackupSkipAssets)&lt;br /&gt;
*[http://opensimulator.org/mantis/view.php?id=5440 MANTIS 5440] (discussion)&lt;br /&gt;
*[http://opensimulator.org/mantis/view.php?id=7240 MANTIS 7240] (AutoBackupKeepFilesForDays)&lt;br /&gt;
&lt;br /&gt;
===[[Development#Integration|Integration]]===&lt;br /&gt;
*[[REST]]&lt;br /&gt;
*[[RestConsole]]&lt;br /&gt;
*[[RemoteAdmin]]&lt;br /&gt;
*[https://github.com/justincc/opensimulator-tools/tree/master/integration/php php tools] (justincc)&lt;br /&gt;
&lt;br /&gt;
===Formats===&lt;br /&gt;
*[[Inventory_Archives|IAR]]&lt;br /&gt;
*[[OpenSim_Archives|OAR]]&lt;br /&gt;
*[[Asset_Formats|Assets]]&lt;br /&gt;
&lt;br /&gt;
===Region Modules===&lt;br /&gt;
*[[Developing_OpenSim_Addins]]&lt;br /&gt;
*[[Getting_Started_with_Region_Modules]]&lt;br /&gt;
*[[Getting_Started_with_Region_Modules/New]]&lt;br /&gt;
*[[New_Region_Modules]]&lt;br /&gt;
*[[IRegionModule]]&lt;br /&gt;
*[[OSSL_Script_Library/ModSendCommand|ModSendCommand]]&lt;br /&gt;
*[[OSSL_Script_Library/ModInvoke|ModInvoke]]&lt;br /&gt;
*[http://bluewallvirtual.com/example_region_module Example Region Module] (Bluewall)&lt;br /&gt;
&lt;br /&gt;
===[[Server_Commands]]===&lt;br /&gt;
*[[Inventory_Archives]] (IAR)&lt;br /&gt;
*[[OpenSim_Archives]] (OAR)&lt;br /&gt;
*[[Load_Oar]]&lt;br /&gt;
*[[Load_Oar_0.9.0+]]&lt;br /&gt;
&lt;br /&gt;
===Pages in progress, or needing refinement===&lt;br /&gt;
*[[OSSL_vs_LSL]]&lt;br /&gt;
*[[Accessing_Prim_Properties]]&lt;br /&gt;
*[[Streaming_Media_in_OpenSim]]&lt;br /&gt;
*[[Streaming_sound_in_OpenSim]]&lt;br /&gt;
*[[Playing_Music_files_in_OpenSim]]&lt;br /&gt;
*[[Clearing_a_common_misconception_about_the_event_model]]&lt;br /&gt;
*[[Artist_Home_(2023_project)]] https://omrg.org/w/index.php?title=OpenSimulator_Content_Creators_Home&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Server_Commands</id>
		<title>Server Commands</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Server_Commands"/>
				<updated>2024-10-30T15:27:43Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Object Commands */ Swapped Post/Pre 0.7.5&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
= What are server commands? =&lt;br /&gt;
&lt;br /&gt;
Server commands are those you can type on the console to make the server do various things.&lt;br /&gt;
&lt;br /&gt;
Commands can be divided up into those that apply to the simulator (simulator commands) and those that apply to grid services (service commands).&lt;br /&gt;
&lt;br /&gt;
On a standalone system, both simulator and service commands will be available on the single standalone system console.&lt;br /&gt;
&lt;br /&gt;
On a grid architecture, the simulator commands will be available on the simulators, whilst the service commands will be available on the ROBUST console.&lt;br /&gt;
&lt;br /&gt;
'''Disclaimer''': some commands may not work as expected, some may not work at all, and there is a chance that you may even lose all your settings/contents. This summary quickly goes out of date - the best place to find commands is by typing &amp;quot;help&amp;quot; on the region console.&lt;br /&gt;
&lt;br /&gt;
Except where noted, this list should be accurate for OpenSimulator 0.7.1 onwards.&lt;br /&gt;
&lt;br /&gt;
= Commands =&lt;br /&gt;
&lt;br /&gt;
== General Server Commands ==&lt;br /&gt;
&lt;br /&gt;
These commands are available in both simulator and robust consoles.&lt;br /&gt;
&lt;br /&gt;
=== General ===&lt;br /&gt;
&lt;br /&gt;
* command-script [scriptfile] - Runs a command script containing console commands.&lt;br /&gt;
* quit - shutdown the server.&lt;br /&gt;
* show info - show server information (version and startup path).  Before OpenSimulator 0.7.5 this is only available on the simulator console.&lt;br /&gt;
* show uptime - show server startup time and uptime.  Before OpenSimulator 0.7.5 this is only available on the simulator console.&lt;br /&gt;
* show version - show server version.  Before OpenSimulator 0.7.5 this is only available on the simulator console.&lt;br /&gt;
* shutdown - synonym for quit&lt;br /&gt;
* get log level - In OpenSimulator 0.7.5 and later, print the current console logging level.  In OpenSimulator 0.7.4 and earlier please use the &amp;quot;set log level&amp;quot; command instead without a level parameter.&lt;br /&gt;
* set log level [level] - change the console logging level only. For example, off or debug. See [[Logging]] for more information.  In OpenSimulator 0.7.4 and earlier, if called without the level argument prints the current level.  In OpenSimulator 0.7.5 and later please use the &amp;quot;get log level&amp;quot; command instead.  Only available on ROBUST console from OpenSimulator 0.7.5.&lt;br /&gt;
&lt;br /&gt;
=== Debug ===&lt;br /&gt;
&lt;br /&gt;
* debug http [&amp;lt;level&amp;gt;] - Turn on/off extra logging for HTTP request debugging.  Only available on robust console from commit 94517c8 (dev code post 0.7.3.1).  In current development code (for OpenSimulator 0.7.5) this is debug http in|out|all [&amp;lt;level&amp;gt;] since outbound HTTP messages can also now be logged (this was only possible for inbound before). For more information on this command, see [[Debugging]].&lt;br /&gt;
&lt;br /&gt;
* debug threadpool level &amp;lt;level&amp;gt; - Turn on/off logging of activity in the main threadpool. For more information, see [[General-Purpose Threadpool]].&lt;br /&gt;
&lt;br /&gt;
== Simulator Commands ==&lt;br /&gt;
&lt;br /&gt;
=== General ===&lt;br /&gt;
&lt;br /&gt;
* change region &amp;lt;region name&amp;gt; - subsequent commands apply only to the specified region. If region name is &amp;quot;root&amp;quot; then all regions are selected&lt;br /&gt;
* debug packet &amp;lt;level&amp;gt; - Turn on packet debugging, where OpenSimulator prints out summaries of incoming and outgoing packets for viewers, depending on the level set&lt;br /&gt;
* emergency-monitoring - turn emergency debugging monitoring mode on or off.&lt;br /&gt;
* help [&amp;lt;command&amp;gt;] - Get general command list or more detailed help on a specific command or set of commands&lt;br /&gt;
* link-mapping - Set a local grid co-ordinate to link to a remote hypergrid &lt;br /&gt;
* link-region - Link a HyperGrid region. Not sure how this differs from link-mapping&lt;br /&gt;
* modules list - List modules&lt;br /&gt;
* modules load &amp;lt;name&amp;gt; - Load a module&lt;br /&gt;
* modules unload &amp;lt;name&amp;gt; - Unload a module&lt;br /&gt;
* monitor report - Returns a variety of statistics about the current region and/or simulator&lt;br /&gt;
* set terrain heights &amp;lt;corner&amp;gt; &amp;lt;min&amp;gt; &amp;lt;max&amp;gt; [&amp;lt;x&amp;gt;] [&amp;lt;y&amp;gt;] - Sets the terrain texture heights on corner #&amp;lt;corner&amp;gt; to &amp;lt;min&amp;gt;/&amp;lt;max&amp;gt;, if &amp;lt;x&amp;gt; or &amp;lt;y&amp;gt; are specified, it will only set it on regions with a matching coordinate. Specify -1 in &amp;lt;x&amp;gt; or &amp;lt;y&amp;gt; to wildcard that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.&lt;br /&gt;
* set terrain texture &amp;lt;number&amp;gt; &amp;lt;uuid&amp;gt; [&amp;lt;x&amp;gt;] [&amp;lt;y&amp;gt;] - Sets the terrain &amp;lt;number&amp;gt; to &amp;lt;uuid&amp;gt;, if &amp;lt;x&amp;gt; or &amp;lt;y&amp;gt; are specified, it will only set it on regions with a matching coordinate. Specify -1 in &amp;lt;x&amp;gt; or &amp;lt;y&amp;gt; to wildcard that coordinate.&lt;br /&gt;
* show caps - show all registered capabilities URLs&lt;br /&gt;
:NOTE: In OpenSimulator 0.7.1, &amp;quot;show capabilities&amp;quot; is shown as a result for help command, but actually only &amp;quot;show caps&amp;quot; will be accepted. ([http://opensimulator.org/mantis/view.php?id=5467 #5467])&lt;br /&gt;
* set water height # - sets the height simulator wide or single region if you use change region.&lt;br /&gt;
* show circuits - Show agent circuit data&lt;br /&gt;
* show connections - show connections data&lt;br /&gt;
* show http-handlers - show all registered http handlers&lt;br /&gt;
* show hyperlinks - list hg regions&lt;br /&gt;
* show modules - show module data&lt;br /&gt;
* show pending-objects - show number of objects in the pending queues of all viewers&lt;br /&gt;
* show pqueues [full] - show priority queue data for each client. Without the 'full' option, only root agents are shown. With the 'full' option child agents are also shown.&lt;br /&gt;
* show queues - Show queue data for agent connections.&lt;br /&gt;
* show threads - shows the persistent threads registered with the system. Does not include threadpool threads. &lt;br /&gt;
* show throttles [full] - Show throttle data for each client connection, and the maximum allowed for each connection by the server. Without the 'full' option, only root agents are shown. With the 'full' option child agents are also shown.&lt;br /&gt;
* unlink-region &amp;lt;local name&amp;gt; - unlink a hypergrid region&lt;br /&gt;
&lt;br /&gt;
=== Appearance Commands ===&lt;br /&gt;
&lt;br /&gt;
* appearance find &amp;lt;uuid-or-start-of-uuid&amp;gt; - Find out which avatar uses the given asset as a baked texture, if any.&lt;br /&gt;
* appearance rebake &amp;lt;first-name&amp;gt; &amp;lt;last-name&amp;gt; - Send a request to the user's viewer for it to rebake and reupload its appearance textures.&lt;br /&gt;
* appearance send [&amp;lt;first-name&amp;gt; &amp;lt;last-name&amp;gt;] - Send appearance data for each avatar in the simulator to other viewers.&lt;br /&gt;
* appearance show [&amp;lt;first-name&amp;gt; &amp;lt;last-name&amp;gt;] - Show appearance information for avatars.&lt;br /&gt;
&lt;br /&gt;
Only exists in development code at the moment.&lt;br /&gt;
&lt;br /&gt;
=== Archive Commands ===&lt;br /&gt;
&lt;br /&gt;
* load iar &amp;lt;first&amp;gt; &amp;lt;last&amp;gt; &amp;lt;inventory path&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;archive path&amp;gt;] - Load user inventory archive. See [[Inventory Archives]].&lt;br /&gt;
* load oar [filename] - load an OpenSimulator archive. This entirely replaces the current region. Default filename is '''region.oar'''. See [[OpenSim Archives]].&lt;br /&gt;
* load xml [-newIDs [&amp;lt;x&amp;gt; &amp;lt;y&amp;gt; &amp;lt;z&amp;gt;]] - Load a region's data from XML format (0.7.*: DEPRECATED and may be REMOVED soon. Use &amp;quot;load xml2&amp;quot; instead)&lt;br /&gt;
:those xml are the result of the export save or *export save-all&lt;br /&gt;
* load xml2 [filename] - optional parameters not supported for XML2 format as at 1-Jul-2008 &lt;br /&gt;
* save iar &amp;lt;first&amp;gt; &amp;lt;last&amp;gt; &amp;lt;inventory path&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;archive path&amp;gt;] - Save user inventory archive. See [[Inventory Archives]]&lt;br /&gt;
* save oar [filename] - save the current region to an OpenSimulator archive. Default filename is '''region.oar'''. See [[OpenSim Archives]].&lt;br /&gt;
* save prims xml2 [&amp;lt;prim name&amp;gt; &amp;lt;file name&amp;gt;] - Save named prim to XML2&lt;br /&gt;
* save xml [filename] - save prims to XML &lt;br /&gt;
* save xml2 [filename] - save prims to XML (Format 2 - rearrangement of some nodes, to make loading/saving easier) &lt;br /&gt;
&lt;br /&gt;
=== Asset Commands ===&lt;br /&gt;
&lt;br /&gt;
The fcache commands only currently appearance if you are using the fcache asset cache.  This is the default on OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* fcache assets - Attempt a deep scan and cache of all assets in all scenes&lt;br /&gt;
* fcache clear [file] [memory] - Remove all assets in the cache.  If file or memory is specified then only this cache is cleared.&lt;br /&gt;
* fcache expire &amp;lt;datetime&amp;gt; - Purge cached assets older then the specified date/time&lt;br /&gt;
* fcache status - Display cache status&lt;br /&gt;
* j2k decode &amp;lt;ID&amp;gt; - Do JPEG2000 decoding of an asset.&lt;br /&gt;
&lt;br /&gt;
=== Config Commands ===&lt;br /&gt;
&lt;br /&gt;
* config get [&amp;lt;section&amp;gt;] [&amp;lt;key&amp;gt;] - Get the current configuration, either for a particular key, a particular section or the whole config.&lt;br /&gt;
* config save &amp;lt;path&amp;gt; - Save the current configuration to a file.&lt;br /&gt;
* config set &amp;lt;section&amp;gt; &amp;lt;key&amp;gt; - Set a particular configuration value. On the whole, this is useless since neither OpenSimulator nor modules dynamically reload config values.&lt;br /&gt;
* config show [&amp;lt;section&amp;gt;] [&amp;lt;key&amp;gt;] - Synonym for 'config get'&lt;br /&gt;
&lt;br /&gt;
=== Land Commands ===&lt;br /&gt;
&lt;br /&gt;
* land show - Shows all parcels on the current region.&lt;br /&gt;
* land clear - Clears all parcels on the land.&lt;br /&gt;
&lt;br /&gt;
=== Map Commands ===&lt;br /&gt;
&lt;br /&gt;
* export-map [&amp;lt;path&amp;gt;] - Save an image of the world map (default name is exportmap.jpg)&lt;br /&gt;
* generate map - Regenerates and stores map tile.  Only in development code post 0.7.6.&lt;br /&gt;
&lt;br /&gt;
=== Object Commands ===&lt;br /&gt;
&lt;br /&gt;
* backup - Persist currently unsaved object changes immediately instead of waiting for the normal persistence call.  This shouldn't normally be required - the simulator persists region objects automatically at regular intervals and on shutdown.&lt;br /&gt;
* delete object creator &amp;lt;UUID&amp;gt; - Delete a scene object by creator&lt;br /&gt;
* delete object name [--regex] &amp;lt;name&amp;gt; - Delete a scene object by name.&lt;br /&gt;
* delete object outside - Delete all scene objects outside region boundaries.  This is currently if z &amp;lt; 0 or z &amp;gt; 10000.  Object outside these bounds have been known to cause issues with OpenSimulator's use of some physics engines (such as the Open Dynamics Engine).&lt;br /&gt;
* delete object owner &amp;lt;UUID&amp;gt; - Delete a scene object by owner&lt;br /&gt;
* delete object id &amp;lt;UUID-or-localID&amp;gt; - Delete a scene object by uuid or localID. Pre 0.7.5, this was &amp;quot;show object uuid&amp;quot;.&lt;br /&gt;
* dump object id &amp;lt;UUID-or-localID&amp;gt; - Dump the serialization of the given object to a file for debug purposes.&lt;br /&gt;
* edit scale &amp;lt;name&amp;gt; &amp;lt;x&amp;gt; &amp;lt;y&amp;gt; &amp;lt;z&amp;gt; - Change the scale of a named prim&lt;br /&gt;
* force update - Force the region to send all clients updates about all objects.&lt;br /&gt;
* show object name [--regex] &amp;lt;name&amp;gt; - Show details of scene objects with the given name.&lt;br /&gt;
* show object id &amp;lt;UUID-or-localID&amp;gt; - Show details of a scene object with the given UUID or localID. Pre 0.7.5, this was &amp;quot;show object uuid&amp;quot;.&lt;br /&gt;
* show part name [--regex] &amp;lt;name&amp;gt; - Show details of scene object parts with the given name.&lt;br /&gt;
* show part id &amp;lt;UUID-or-localID&amp;gt; - Show details of a scene object parts with the given UUID or localID. Pre 0.7.5, this was &amp;quot;show object uuid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Estate Commands ===&lt;br /&gt;
* reload estate - reload estate data&lt;br /&gt;
* estate link region &amp;lt;estate ID&amp;gt; &amp;lt;region ID&amp;gt; - Attaches the specified region to the specified estate.&lt;br /&gt;
* estate show - This command will show the estate name, ID, and owner for regions currently running in the simulator. This list does not necessarily include all estates that are present in the database.  &lt;br /&gt;
Sample usage: &lt;br /&gt;
 estate show&amp;lt;enter&amp;gt;&lt;br /&gt;
 Estate information for region TestRegion&lt;br /&gt;
 Estate Name ID Owner&lt;br /&gt;
 My Estate 103 Test User&lt;br /&gt;
* estate set name &amp;lt;estate ID&amp;gt; &amp;lt;new name&amp;gt; - Rename an estate&lt;br /&gt;
* estate set owner &amp;lt;estate ID&amp;gt; &amp;lt;FirstName&amp;gt; &amp;lt;LastName&amp;gt; - Change the owner of an estate. This command supports two forms; this one uses the owner's name.&lt;br /&gt;
* estate set owner &amp;lt;estate ID&amp;gt; &amp;lt;owner UUID&amp;gt; - Change the owner of an estate. This command supports two forms; this one uses the owner's UUID.&lt;br /&gt;
* estate create &amp;lt;owner UUID&amp;gt; &amp;lt;estate name&amp;gt; - Must be a user UUID which you can get from 'show names'&lt;br /&gt;
&lt;br /&gt;
=== Region Commands ===&lt;br /&gt;
* change region &amp;lt;region name&amp;gt; - subsequent commands apply only to the specified region. If region name is &amp;quot;root&amp;quot; then all regions are selected&lt;br /&gt;
* create region [name] [filename] - Create a new region &lt;br /&gt;
* delete-region &amp;lt;name&amp;gt; - Delete a region from disk.&lt;br /&gt;
* region get - Post OpenSimulator 0.8.0.*.  Show region parameters (Region Name, Region UUID, Location, URI, Owner ID, Flags).&lt;br /&gt;
* region restart abort [&amp;lt;message&amp;gt;] - Abort a scheduled region restart, with an optional message&lt;br /&gt;
* region restart bluebox &amp;lt;message&amp;gt; &amp;lt;delta seconds&amp;gt;+ - Schedule a region restart. If one delta is given then the region is restarted in delta seconds time. A time to restart is sent to users in the region as a dismissable bluebox notice. If multiple deltas are given then a notice is sent when we reach each delta.&lt;br /&gt;
* region restart notice &amp;lt;message&amp;gt; &amp;lt;delta seconds&amp;gt;+ - Schedule a region restart. Same as above except showing a transient notice instead of a dismissable bluebox.&lt;br /&gt;
* region set - Post OpenSimulator 0.8.0.*.  Set certain region parameters.  Currently, can set&lt;br /&gt;
** agent-limit - The current avatar limit for the region.  More usually this is set via the region/estate dialog in a typical viewer.  This persists over simulator restarts.&lt;br /&gt;
** max-agent-limit - The maximum value that agent-limit can have.  Unfortunately, setting it here does not currently persist over server restarts.  For that to happen it must be separately set as the MaxAgents parameter in the region config file.&lt;br /&gt;
* remove-region - remove a region from the simulator&lt;br /&gt;
* restart - Restarts all sims in this instance&lt;br /&gt;
* restart region &amp;lt;regionname&amp;gt; - Restarts just one sim in an instance. Set the console to the region name first, with 'change region &amp;lt;regionname&amp;gt;', or all regions will restart.&lt;br /&gt;
* set region flags &amp;lt;Region name&amp;gt; &amp;lt;flags&amp;gt; - Set database flags for region&lt;br /&gt;
:Flags can be one of the following:&lt;br /&gt;
:'''DefaultRegion'''	Used for new Rez. Random if multiple defined&lt;br /&gt;
:'''FallbackRegion'''	Regions we redirect to when the destination is down&lt;br /&gt;
:'''RegionOnline'''	Set when a region comes online, unset when it unregisters and DeleteOnUnregister is false&lt;br /&gt;
:'''NoDirectLogin'''	Region unavailable for direct logins (by name)&lt;br /&gt;
:'''Persistent'''	Don't remove on unregister&lt;br /&gt;
:'''LockedOut'''	Don't allow registration&lt;br /&gt;
:'''NoMove	'''Don't allow moving this region&lt;br /&gt;
:'''Reservation'''	This is an inactive reservation&lt;br /&gt;
:'''Authenticate'''	Require authentication&lt;br /&gt;
:'''Hyperlink'''	Record represents a HG link&lt;br /&gt;
:'''DefaultHGRegion'''	Record represents a default region for hypergrid teleports only.&lt;br /&gt;
:Note: flags are additive, there is no way to unset them from the console.&lt;br /&gt;
* show neighbours - Shows the local regions' neighbours&lt;br /&gt;
* show ratings - Show rating data&lt;br /&gt;
* show region - Show region parameters (Region Name, Region UUID, Location, URI, Owner ID, Flags).&lt;br /&gt;
* show regions - Show regions data (Region Names, XLocation YLocation coordinates, Region Ports, Estate Names)&lt;br /&gt;
&lt;br /&gt;
=== Scene Commands ===&lt;br /&gt;
&lt;br /&gt;
* debug scene - Turn on scene debugging&lt;br /&gt;
* rotate scene &amp;lt;degrees&amp;gt; - Rotates scene around 128,128 axis by x degrees where x=0-360.&lt;br /&gt;
* scale scene &amp;lt;factor&amp;gt; - Scales all scene objects by a factor where original size =1.0.&lt;br /&gt;
* translate scene &amp;lt;x,y,z&amp;gt; - Translate (move) the entire scene to a new coordinate. Useful for moving a scene to a different location on either a Mega or Variable region. &lt;br /&gt;
(please back up your region before using any of these commands and be aware of possible floating point errors the more they are used.)&lt;br /&gt;
 &lt;br /&gt;
=== Script Commands ===&lt;br /&gt;
&lt;br /&gt;
These currently only exist in git master OpenSimulator development code post the 0.7.2 release.&lt;br /&gt;
&lt;br /&gt;
* scripts resume [&amp;lt;script-item-uuid&amp;gt;] - Resumes all suspended scripts&lt;br /&gt;
* scripts show [&amp;lt;script-item-uuid&amp;gt;] - Show script information. &amp;lt;script-item-uuid&amp;gt; option only exists from git master 82f0e19 (2012-01-14) onwards (post OpenSimulator 0.7.2).&lt;br /&gt;
* scripts start [&amp;lt;script-item-uuid&amp;gt;] - Starts all stopped scripts&lt;br /&gt;
* scripts stop [&amp;lt;script-item-uuid&amp;gt;] - Stops all running scripts&lt;br /&gt;
* scripts suspend [&amp;lt;script-item-uuid&amp;gt;] - Suspends all running scripts&lt;br /&gt;
&lt;br /&gt;
=== Stats Commands ===&lt;br /&gt;
&lt;br /&gt;
* show stats - show useful statistical information for this server. See [[#Frame Statistics Values|Frame Statistics Values]] below for more information.&lt;br /&gt;
* stats show - a synonym for &amp;quot;show stats&amp;quot; (OpenSimulator dev code only post 19th March 2014).&lt;br /&gt;
* stats record - record stats periodically to a separate log file.&lt;br /&gt;
* stats save - save a snapshot of current stats to a file (OpenSimulator dev code only post 19th March 2014).&lt;br /&gt;
&lt;br /&gt;
=== Terrain Commands ===&lt;br /&gt;
&lt;br /&gt;
Some of these may require a sim restart to show properly.&lt;br /&gt;
* terrain load - Loads a terrain from a specified file. (see note1)&lt;br /&gt;
* terrain load-tile - Loads a terrain from a section of a larger file.&lt;br /&gt;
* terrain save - Saves the current heightmap to a specified file.&lt;br /&gt;
* terrain save-tile - Saves the current heightmap to the larger file.&lt;br /&gt;
* terrain fill - Fills the current heightmap with a specified value.&lt;br /&gt;
* terrain elevate - Raises the current heightmap by the specified amount.&lt;br /&gt;
* terrain lower - Lowers the current heightmap by the specified amount.&lt;br /&gt;
* terrain multiply - Multiplies the heightmap by the value specified.&lt;br /&gt;
* terrain bake - Saves the current terrain into the regions baked map.&lt;br /&gt;
* terrain revert - Loads the baked map terrain into the regions heightmap.&lt;br /&gt;
* terrain newbrushes - Enables experimental brushes which replace the standard terrain brushes.&lt;br /&gt;
* terrain show - Shows terrain height at a given co-ordinate.&lt;br /&gt;
* terrain stats - Shows some information about the regions heightmap for debugging purposes.&lt;br /&gt;
* terrain effect - Runs a specified plugin effect&lt;br /&gt;
* terrain flip - Flips the current terrain about the X or Y axis&lt;br /&gt;
* terrain rescale - Rescales the current terrain to fit between the given min and max heights&lt;br /&gt;
* terrain min - Sets the minimum terrain height to the specified value.&lt;br /&gt;
* terrain max - Sets the maximum terrain height to the specified value.&lt;br /&gt;
* terrain modify - Provides several area-of-effect terraforming commands.&lt;br /&gt;
&lt;br /&gt;
Note1 : If you have a sim with multiple regions and you want to set all regions on that sim to be from one larger image you can use 'terrain load &amp;lt;file&amp;gt; &amp;lt;width in regions&amp;gt; &amp;lt;height in regions&amp;gt; &amp;lt;regionX&amp;gt; &amp;lt;regionY&amp;gt; where regionX and regionY are the coordinates of the bottom-left region.&lt;br /&gt;
&lt;br /&gt;
=== Tree Commands ===&lt;br /&gt;
&lt;br /&gt;
* tree active - Change activity state for the trees module&lt;br /&gt;
* tree freeze - Freeze/Unfreeze activity for a defined copse&lt;br /&gt;
* tree load - Load a copse definition from an xml file&lt;br /&gt;
* tree plant - Start the planting on a copse&lt;br /&gt;
* tree rate - Reset the tree update rate (mSec)&lt;br /&gt;
* tree reload - Reload copse definitions from the in-scene trees&lt;br /&gt;
* tree remove - Remove a copse definition and all its in-scene trees&lt;br /&gt;
* tree statistics - Log statistics about the trees&lt;br /&gt;
&lt;br /&gt;
=== User Commands ===&lt;br /&gt;
&lt;br /&gt;
* alert &amp;lt;message&amp;gt; - send an in-world alert to everyone&lt;br /&gt;
* alert-user &amp;lt;first&amp;gt; &amp;lt;last&amp;gt; &amp;lt;message&amp;gt; - send an an in-world alert to a specific user&lt;br /&gt;
* bypass permissions &amp;amp;lt;true / false&amp;amp;gt; - Bypass in-world permission checks &lt;br /&gt;
* debug permissions - Turn on permissions debugging&lt;br /&gt;
* force permissions - Force permissions on or off.&lt;br /&gt;
* kick user &amp;lt;first&amp;gt; &amp;lt;last&amp;gt; [message]: - Kick a user off the simulator&lt;br /&gt;
* login disable - Disable user entry to this simulator&lt;br /&gt;
* login enable - Enable user entry to this simulator&lt;br /&gt;
* login status - Show whether logins to this simulator are enabled or disabled&lt;br /&gt;
* show users [full]- show info about currently connected users to this region. Without the 'full' option, only users actually on the region are shown. With the 'full' option child agents of users in neighbouring regions are also shown.&lt;br /&gt;
* teleport user &amp;lt;destination&amp;gt; - Teleport a user on this simulator to a specific destination.  Currently only in OpenSimulator development code after the 0.7.3.1 release (commit bf0b817).&lt;br /&gt;
&lt;br /&gt;
=== Windlight/[[LightShare]] Commands ===&lt;br /&gt;
&lt;br /&gt;
* windlight load - Load windlight profile from the database and broadcast&lt;br /&gt;
* windlight enable - Enable the windlight plugin&lt;br /&gt;
* windlight disable - Disable the windlight plugin&lt;br /&gt;
&lt;br /&gt;
=== [[YEngine]] Commands ===&lt;br /&gt;
* yeng help&lt;br /&gt;
* yeng reset -all | &amp;lt;part-of-script-name&amp;gt;&lt;br /&gt;
* yeng resume - resume script processing&lt;br /&gt;
* yeng suspend - suspend script processing&lt;br /&gt;
* yeng ls -full -max=&amp;lt;number&amp;gt; -out=&amp;lt;filename&amp;gt; -queues -topcpu&lt;br /&gt;
* yeng cvv - show compiler version value&lt;br /&gt;
* yeng mvv [&amp;lt;newvalue&amp;gt;] - show migration version value&lt;br /&gt;
* yeng tracecalls [yes | no]&lt;br /&gt;
* yeng verbose [yes | no]&lt;br /&gt;
* yeng pev -all | &amp;lt;part-of-script-name&amp;gt; &amp;lt;event-name&amp;gt; &amp;lt;params...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ROBUST Service Commands ==&lt;br /&gt;
&lt;br /&gt;
These can also be accessed on the simulator command console itself in standalone mode.&lt;br /&gt;
&lt;br /&gt;
=== Asset Service ===&lt;br /&gt;
&lt;br /&gt;
* delete asset &amp;lt;ID&amp;gt; - Delete an asset from the database. Doesn't appear to be implemented.&lt;br /&gt;
* dump asset &amp;lt;ID&amp;gt; - Dump an asset to the filesystem.  OpenSimulator 0.7.3 onwards.&lt;br /&gt;
* show digest &amp;lt;ID&amp;gt; - Show summary information about an asset. From OpenSimulator 0.7.3 onwards this will be renamed to &amp;quot;show asset&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Grid Service ===&lt;br /&gt;
&lt;br /&gt;
* set region flags &amp;lt;Region name&amp;gt; &amp;lt;flags&amp;gt; - Set database flags for region&lt;br /&gt;
* show region &amp;lt;Region name&amp;gt; - Show the details of a given region.  This command is renamed to &amp;quot;show region name&amp;quot; in development versions of OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
The following commands currently only exist in development versions of OpenSimulator (post 0.7.3.1).  These are currently found in the &amp;quot;Regions&amp;quot; help section.&lt;br /&gt;
&lt;br /&gt;
* deregister region id &amp;lt;Region UUID&amp;gt; - Deregister a region manually.  This can be helpful if a region was not properly removed due to bad simulator shutdown and the simulator has not since been restarted or its region configuration has been changed.&lt;br /&gt;
* show region at &amp;lt;x-coord&amp;gt; &amp;lt;y-coord&amp;gt; - Show details on a region at the given co-ordinate.&lt;br /&gt;
* show region name &amp;lt;Region name&amp;gt; - Show details on a region&lt;br /&gt;
* show regions - Show details on all regions.  In standalone mode this version of the command is not currently available - the simulator version of &amp;quot;show regions&amp;quot; is used instead, which shows similar information.&lt;br /&gt;
&lt;br /&gt;
=== User Service ===&lt;br /&gt;
* create user [first] [last] [passw] [Email] [Primary UUID] [Model} - creates a new user&lt;br /&gt;
:or just: create user - and server prompts for all data&lt;br /&gt;
:&lt;br /&gt;
:If UUID is nul or whitespace a UUID will be generated for you.&lt;br /&gt;
:&lt;br /&gt;
:Model is the &amp;quot;first lastname&amp;quot; of another user, that user's outfit will be cloned to the new user.&lt;br /&gt;
:&lt;br /&gt;
* reset user password - reset a user's password.&lt;br /&gt;
* show account &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt; - show account details for the given user name (0.7.2-dev)&lt;br /&gt;
&lt;br /&gt;
=== Login Service ===&lt;br /&gt;
* login level &amp;lt;value&amp;gt; - Set the miminim userlevel allowed to login (see [[Userlevel|User Level]]).&lt;br /&gt;
* login reset - reset the login level to its default value.&lt;br /&gt;
* login text &amp;lt;text to print during the login&amp;gt;&lt;br /&gt;
* set user level &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt; &amp;lt;level&amp;gt; - Set UserLevel for the user, which determines whether a user has a god account or can login at all (0.7.2-dev) (see [[Userlevel|User Level]]).&lt;br /&gt;
&lt;br /&gt;
== Details of Terrain Module Commands ==&lt;br /&gt;
&lt;br /&gt;
==== terrain load ====&lt;br /&gt;
Loads a terrain from a specified file.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* filename (String)&lt;br /&gt;
	The file you wish to load from, the file extension determines the loader to be used. Supported extensions include: .r32 (RAW32) .f32 (RAW32) .ter (Terragen) .raw (LL/SL RAW) .jpg (JPEG) .jpeg (JPEG) .bmp (BMP) .png (PNG) .gif (GIF) .tif (TIFF) .tiff (TIFF)&lt;br /&gt;
&lt;br /&gt;
==== terrain load-tile ====&lt;br /&gt;
Loads a terrain from a section of a larger file.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* filename (String)&lt;br /&gt;
	The file you wish to load from, the file extension determines the loader to be used. Supported extensions include: .r32 (RAW32) .f32 (RAW32) .ter (Terragen) .raw (LL/SL RAW) .jpg (JPEG) .jpeg (JPEG) .bmp (BMP) .png (PNG) .gif (GIF) .tif (TIFF) .tiff (TIFF)&lt;br /&gt;
* file width (Integer)&lt;br /&gt;
	The width of the file in tiles&lt;br /&gt;
* file height (Integer)&lt;br /&gt;
	The height of the file in tiles&lt;br /&gt;
* minimum X tile (Integer)&lt;br /&gt;
	The X region coordinate of the first section on the file&lt;br /&gt;
* minimum Y tile (Integer)&lt;br /&gt;
	The Y region coordinate of the first section on the file&lt;br /&gt;
&lt;br /&gt;
==== terrain save ====&lt;br /&gt;
Saves the current heightmap to a specified file.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* filename (String)&lt;br /&gt;
	The destination filename for your heightmap, the file extension determines the format to save in. Supported extensions include: .r32 (RAW32) .f32 (RAW32) .ter (Terragen) .raw (LL/SL RAW) .jpg (JPEG) .jpeg (JPEG) .bmp (BMP) .png (PNG) .gif (GIF) .tif (TIFF) .tiff (TIFF)&lt;br /&gt;
&lt;br /&gt;
==== terrain fill ====&lt;br /&gt;
Fills the current heightmap with a specified value.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* value (Double)&lt;br /&gt;
	The numeric value of the height you wish to set your region to.&lt;br /&gt;
&lt;br /&gt;
==== terrain elevate ====&lt;br /&gt;
Raises the current heightmap by the specified amount.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* amount (Double)&lt;br /&gt;
&lt;br /&gt;
==== terrain lower ====&lt;br /&gt;
Lowers the current heightmap by the specified amount.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* amount (Double)&lt;br /&gt;
	The amount of height to remove from the terrain in meters.&lt;br /&gt;
&lt;br /&gt;
==== terrain multiply ====&lt;br /&gt;
Multiplies the heightmap by the value specified.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* value (Double)&lt;br /&gt;
	The value to multiply the heightmap by.&lt;br /&gt;
&lt;br /&gt;
==== terrain bake ====&lt;br /&gt;
Saves the current terrain into the regions revert map.&lt;br /&gt;
&lt;br /&gt;
==== terrain revert ====&lt;br /&gt;
Loads the revert map terrain into the regions heightmap.&lt;br /&gt;
&lt;br /&gt;
==== terrain newbrushes ====&lt;br /&gt;
Enables experimental brushes which replace the standard terrain brushes. WARNING: This is a debug setting and may be removed at any time.&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* Enabled? (Boolean)&lt;br /&gt;
	true / false - Enable new brushes&lt;br /&gt;
&lt;br /&gt;
==== terrain stats ====&lt;br /&gt;
Shows some information about the regions heightmap for debugging purposes.&lt;br /&gt;
&lt;br /&gt;
==== terrain effect ====&lt;br /&gt;
Runs a specified plugin effect&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
* name (String)&lt;br /&gt;
	The plugin effect you wish to run, or 'list' to see all plugins&lt;br /&gt;
&lt;br /&gt;
==== terrain modify ====&lt;br /&gt;
Allows area-of-effect and tapering with standard heightmap manipulations.&lt;br /&gt;
&lt;br /&gt;
General command usage:&lt;br /&gt;
:''terrain modify &amp;lt;operation&amp;gt; value [&amp;lt;mask&amp;gt;] [-taper=&amp;lt;value2&amp;gt;]''&lt;br /&gt;
&lt;br /&gt;
:Parameters&lt;br /&gt;
:* value: base value to use in applying operation&lt;br /&gt;
:* mask:&lt;br /&gt;
:** -rec=x1,y1,dx[,dy] creates a rectangular mask based at x1,y1&lt;br /&gt;
:** -ell=x0,y0,rx[,ry] creates an elliptical mask centred at x0,y0&lt;br /&gt;
:* taper:&lt;br /&gt;
:** rectangular masks taper as pyramids&lt;br /&gt;
:** elliptical masks taper as cones&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terrain Manipulation (fill, min, max)&lt;br /&gt;
:* value represents target height (at centre of range)&lt;br /&gt;
:* value2 represents target height (at edges of range)&lt;br /&gt;
&lt;br /&gt;
Terrain Movement (raise, lower, noise)&lt;br /&gt;
:* value represents a delta amount (at centre of range)&lt;br /&gt;
:* value2 represents a delta amount (at edges of range)&lt;br /&gt;
&lt;br /&gt;
Terrain Smoothing (smooth)&lt;br /&gt;
:The smoothing operation is somewhat different than the others, as it does not deal with elevation values, but rather with strength values (in the range of 0.01 to 0.99).  The algorithm is simplistic in averaging the values around a point, and is implemented as follows:&lt;br /&gt;
&lt;br /&gt;
:The &amp;quot;strength&amp;quot; parameter specifies how much of the result is from the original value (&amp;quot;strength&amp;quot; * map[x,y]).&lt;br /&gt;
:The &amp;quot;taper&amp;quot; parameter specifies how much of the remainder is from the first ring surrounding the point (1.0 - &amp;quot;strength&amp;quot;) * &amp;quot;taper&amp;quot;. There are 8 elements in the first ring.&lt;br /&gt;
:The remaining contribution is made from the second ring surrounding the point.  There are 16 elements in the second ring.&lt;br /&gt;
:e.g.&lt;br /&gt;
:''terrain modify smooth 0.5 -taper=0.6''&lt;br /&gt;
:* the original element will contribute 0.5 * map[x0,y0]&lt;br /&gt;
:* each element 1m from the point will contribute ((1-0.5)*0.6)/8 * map[x1,y1]&lt;br /&gt;
:* each element 2m from the point will contribute ((1-0.5)*0.4)/16 * map[x2,y2]&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
:The &amp;quot;taper&amp;quot; value may need to be exaggerated due to the integer math used in maps.&lt;br /&gt;
:e.g. To create a 512x512 var island:&lt;br /&gt;
:''terrain modify min 30 -ell=256,256,240 -taper=-29''&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
: https://www.youtube.com/watch?v=pehyqr3H8I0 (dead link)&lt;br /&gt;
&lt;br /&gt;
== Details of Hypergrid Commands ==&lt;br /&gt;
&lt;br /&gt;
For full details and explanations of Hypergrid Commands, see the [http://opensimulator.org/wiki/Installing_and_Running_Hypergrid#Linking_regions_.28Optional.29 Linking Regions] sections of the [http://opensimulator.org/wiki/Installing_and_Running_Hypergrid Installing and Running Hypergrid] page.&lt;br /&gt;
&lt;br /&gt;
'''show hyperlinks''' &lt;br /&gt;
&lt;br /&gt;
This command will show a list of all hypergrid linked regions.&lt;br /&gt;
&lt;br /&gt;
'''link-region &amp;lt;Xloc&amp;gt; &amp;lt;Yloc&amp;gt; &amp;lt;host&amp;gt; &amp;lt;port&amp;gt; &amp;lt;location-name&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
* Use Xloc and Yloc that make sense to your world, i.e. close to your regions, but not adjacent.&lt;br /&gt;
* replace osl2.nac.uci.edu and 9006 with the domain name / ip address and the port of the region you want to link to&lt;br /&gt;
&lt;br /&gt;
E.g. link-region 8998 8998 osl2.nac.uci.edu 9006 OSGrid Gateway&lt;br /&gt;
&lt;br /&gt;
'''unlink-region &amp;lt;local region name&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
This command will unlink the specified hypergrid linked region - be sure to use the exact local name as reported by the &amp;quot;show hyperlinks&amp;quot; command.&lt;br /&gt;
&lt;br /&gt;
link-mapping - Link a HyperGrid region. Not sure how this differs from link-mapping.&lt;br /&gt;
&lt;br /&gt;
== Frame Statistics Values ==&lt;br /&gt;
&lt;br /&gt;
The labels of the Frame Statistics values shown by the console command &amp;quot;show stats&amp;quot; are a bit cryptic. Here is a list of the meanings of these values:&lt;br /&gt;
&lt;br /&gt;
* Dilatn - time dilation&lt;br /&gt;
* SimFPS - simulator frames per second&lt;br /&gt;
* PhyFPS - physics frames per second&lt;br /&gt;
* AgntUp - # of agent updates&lt;br /&gt;
* RootAg - # of root agents&lt;br /&gt;
* ChldAg - # of child agents&lt;br /&gt;
* Prims - # of total prims&lt;br /&gt;
* AtvPrm - # of active prims&lt;br /&gt;
* AtvScr - # of active scripts&lt;br /&gt;
* ScrLPS - # of script lines per second&lt;br /&gt;
* PktsIn - # of in packets per second&lt;br /&gt;
* PktOut - # of out packets per second&lt;br /&gt;
* PendDl - # of pending downloads&lt;br /&gt;
* PendUl - # of pending uploads&lt;br /&gt;
* UnackB - # of unacknowledged bytes&lt;br /&gt;
* TotlFt - total frame time&lt;br /&gt;
* NetFt - net frame time&lt;br /&gt;
* PhysFt - physics frame time&lt;br /&gt;
* OthrFt - other frame time&lt;br /&gt;
* AgntFt - agent frame time&lt;br /&gt;
* ImgsFt - image frame time&lt;br /&gt;
&lt;br /&gt;
[[Category:Support]]&lt;br /&gt;
[[Category:Help]]&lt;br /&gt;
[[Category:Configuration]]&lt;br /&gt;
[[Category:Getting Started]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/User:JeffKelley</id>
		<title>User:JeffKelley</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/User:JeffKelley"/>
				<updated>2024-10-14T21:09:20Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Pages in progress, or needing refinement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Me ==&lt;br /&gt;
&lt;br /&gt;
I contribute occasionnally to this wiki, mainly in the database section.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== My links ==&lt;br /&gt;
&lt;br /&gt;
===[[Release_Notes]]===&lt;br /&gt;
===[[Database:Documentation|Database]]===&lt;br /&gt;
*[[Assets]]&lt;br /&gt;
*[[Inventoryfolders]]&lt;br /&gt;
*[[Inventoryitems]]&lt;br /&gt;
*[[Prims_(database_table)|Prims]]&lt;br /&gt;
*[[Primitems]]&lt;br /&gt;
*[[Database:Primshapes|Primshapes]]&lt;br /&gt;
&lt;br /&gt;
===[[Services]]===&lt;br /&gt;
*[[AssetService]]&lt;br /&gt;
*[[AvatarService]]&lt;br /&gt;
*[[GridService]]&lt;br /&gt;
*[[GroupsService]]&lt;br /&gt;
*[[GridUserService]]&lt;br /&gt;
*[[InventoryService]]&lt;br /&gt;
*[[PresenceService]]&lt;br /&gt;
*[[UserAccountService]]&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
*[[ClothingManipulation]]&lt;br /&gt;
*[[UserManipulation]]&lt;br /&gt;
&lt;br /&gt;
===[[Scripting]]===&lt;br /&gt;
&lt;br /&gt;
*[[ScriptEngines]]&lt;br /&gt;
*[[XEngine]]&lt;br /&gt;
*[[YEngine]]&lt;br /&gt;
*[[OSSL_Implemented]]&lt;br /&gt;
&lt;br /&gt;
===[[Monitoring]]===&lt;br /&gt;
*[[Monitoring_Module]] + [[Collectd]]&lt;br /&gt;
*[[Web_Statistics_Module]]&lt;br /&gt;
*[[User:Allen_Kerensky/JSON_User_SimStats|JSON_User_SimStats]], [[UXSimStatus]], [[XSimStatus]]&lt;br /&gt;
*[[Logging]]&lt;br /&gt;
&lt;br /&gt;
===AutoBackup===&lt;br /&gt;
*[[Feature_Proposals/AutoBackup]] (proposal)&lt;br /&gt;
*[[Autobackup]] (AutoBackupSkipAssets)&lt;br /&gt;
*[http://opensimulator.org/mantis/view.php?id=5440 MANTIS 5440] (discussion)&lt;br /&gt;
*[http://opensimulator.org/mantis/view.php?id=7240 MANTIS 7240] (AutoBackupKeepFilesForDays)&lt;br /&gt;
&lt;br /&gt;
===[[Development#Integration|Integration]]===&lt;br /&gt;
*[[REST]]&lt;br /&gt;
*[[RestConsole]]&lt;br /&gt;
*[[RemoteAdmin]]&lt;br /&gt;
*[https://github.com/justincc/opensimulator-tools/tree/master/integration/php php tools] (justincc)&lt;br /&gt;
&lt;br /&gt;
===Formats===&lt;br /&gt;
*[[Inventory_Archives|IAR]]&lt;br /&gt;
*[[OpenSim_Archives|OAR]]&lt;br /&gt;
*[[Asset_Formats|Assets]]&lt;br /&gt;
&lt;br /&gt;
===Region Modules===&lt;br /&gt;
*[[Developing_OpenSim_Addins]]&lt;br /&gt;
*[[Getting_Started_with_Region_Modules]]&lt;br /&gt;
*[[Getting_Started_with_Region_Modules/New]]&lt;br /&gt;
*[[New_Region_Modules]]&lt;br /&gt;
*[[IRegionModule]]&lt;br /&gt;
*[[OSSL_Script_Library/ModSendCommand|ModSendCommand]]&lt;br /&gt;
*[[OSSL_Script_Library/ModInvoke|ModInvoke]]&lt;br /&gt;
*[http://bluewallvirtual.com/example_region_module Example Region Module] (Bluewall)&lt;br /&gt;
&lt;br /&gt;
===[[Server_Commands]]===&lt;br /&gt;
*[[Inventory_Archives]] (IAR)&lt;br /&gt;
*[[OpenSim_Archives]] (OAR)&lt;br /&gt;
*[[Load_Oar]]&lt;br /&gt;
*[[Load_Oar_0.9.0+]]&lt;br /&gt;
&lt;br /&gt;
===Pages in progress, or needing refinement===&lt;br /&gt;
*[[OSSL_vs_LSL]]&lt;br /&gt;
*[[Accessing_Prim_Properties]]&lt;br /&gt;
*[[Streaming_Media_in_OpenSim]]&lt;br /&gt;
*[[Streaming_sound_in_OpenSim]]&lt;br /&gt;
*[[Playing_Music_files_in_OpenSim]]&lt;br /&gt;
*[[Clearing_a_common_misconception_about_the_event_model]]&lt;br /&gt;
*[[Artist_Home_(2023_project)]] https://omrg.org/w/index.php?title=OpenSimulator_Content_Creators_Home&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Clearing_a_frequent_misconception_about_the_event_model</id>
		<title>Clearing a frequent misconception about the event model</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Clearing_a_frequent_misconception_about_the_event_model"/>
				<updated>2024-10-14T21:08:32Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: JeffKelley moved page Clearing a frequent misconception about the event model to Clearing a common misconception about the event model&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Clearing a common misconception about the event model]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Clearing_a_common_misconception_about_the_event_model</id>
		<title>Clearing a common misconception about the event model</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Clearing_a_common_misconception_about_the_event_model"/>
				<updated>2024-10-14T21:08:32Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: JeffKelley moved page Clearing a frequent misconception about the event model to Clearing a common misconception about the event model&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color:#ffcc99; padding:10px; padding-bottom:5px; border: 1px solid&amp;quot;&amp;gt;DRAFT&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clearing a frequent misconception about the event model&lt;br /&gt;
&lt;br /&gt;
Sometimes, we see code like this :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00	string A_name,&lt;br /&gt;
01	key A_key;&lt;br /&gt;
02&lt;br /&gt;
03	state_entry()&lt;br /&gt;
04	{&lt;br /&gt;
05		llRezObject (A_name, .....);&lt;br /&gt;
06		DoThis();&lt;br /&gt;
07		DoThat();&lt;br /&gt;
08	}&lt;br /&gt;
09&lt;br /&gt;
10	object_rez(key id)&lt;br /&gt;
11	{&lt;br /&gt;
12		A_key = id;&lt;br /&gt;
13	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some hope that object_rez will be executed 'as soon as' llRezObject returns, or 'while' state_entry is running. This is false. Despite the fact that the environment (script engine, simulator, network, operating system) is all multi-tasking, your script is NOT.&lt;br /&gt;
&lt;br /&gt;
object_rez cannot run 'while' state_entry runs. This is concurrency, and it is the privilege of multi-tasking (or multi-threaded) languages. In a multi-threaded language, state_entry would be suspended to run object_rez, then resumed later. Like :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
05	llRezObject (A_name, .....);&lt;br /&gt;
12	A_key = id;&lt;br /&gt;
06	DoThis();&lt;br /&gt;
07	DoThat();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LSL being single-threaded, state_entry has to complete before your script can do anything else. Then, it will dequeue the next event from the event queue, that may be (but not necessarily) object_rez. The flow of execution is actually :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
05	llRezObject (A_name, .....);&lt;br /&gt;
06	DoThis();&lt;br /&gt;
07	DoThat();&lt;br /&gt;
12	A_key = id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But it works !&lt;br /&gt;
&lt;br /&gt;
Yes, it works. Because you have only one operation pending. Imagine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
03	state_entry()&lt;br /&gt;
04	{&lt;br /&gt;
05		llRezObject (A_name, .....);&lt;br /&gt;
06		llRezObject (B_name, .....);&lt;br /&gt;
07		DoThis();&lt;br /&gt;
08		DoThat();&lt;br /&gt;
09	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
How do you differentiate between key for objectA and key for objectB ?&lt;br /&gt;
&lt;br /&gt;
The first object_rez gives A_key and the second B_key ?&lt;br /&gt;
&lt;br /&gt;
Wrong.&lt;br /&gt;
&lt;br /&gt;
llRezObject is an asynchronous operation and you have no control of what happens once initiated. objectA may take more time to rez than objectB for any reason. Think about initiating two i/o operations on DiskA and DiskB in C. Which completes first ? You cannot know. Your code must use some mechanism to bind i/o initiation to i/o completion. Then, when an operation completes, it can be bound to either DiskA or DiskB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But this is LSL, not C, and there is nothing to bind object_rez to llRezObject. Fortunately, the solution is simple : Have only one rez pending at any time. Once llRezObject is called, wait for object_rez to fire before rezing next.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00	string object_rezed;&lt;br /&gt;
01&lt;br /&gt;
02	state_entry()&lt;br /&gt;
03	{&lt;br /&gt;
04		object_rezed = GetNextObject();&lt;br /&gt;
05		llRezObject (object_rezed, .....); 	// Prime process&lt;br /&gt;
06	}&lt;br /&gt;
07&lt;br /&gt;
08	object_rez(key id)&lt;br /&gt;
09	{&lt;br /&gt;
10		// id is key for 'object_rezed'&lt;br /&gt;
11		object_rezed = GetNextObject();&lt;br /&gt;
12		if (object_rezed == &amp;quot;&amp;quot;) return; 	// Stop process&lt;br /&gt;
13		llRezObject (object_rezed, .....); 	// Propagate process&lt;br /&gt;
14	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In line 10, id is guaranteed to be key of objet 'object_rezed'. You can now associate both. There is no risk of overflowing the event queue, as would be the case with a loop on llRezObject.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What may RezNext look like ? A simple dequeue from a list, maybe :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
50	list ObjectsToRez = [ &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;D&amp;quot; ];&lt;br /&gt;
51&lt;br /&gt;
52	string GetNextObject()&lt;br /&gt;
53	{&lt;br /&gt;
54	    string next_item = llList2List (ObjectsToRez, 0,0);&lt;br /&gt;
55	    ObjectsToRez = llDeleteSubList (ObjectsToRez, 0,0);&lt;br /&gt;
56	    return next_item;&lt;br /&gt;
57	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But I just want the id of the last object rezed. &lt;br /&gt;
Why is this so complex ? I would like to write&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	key A_id = llRezObject (A_name, .....);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This synchronous version would block your script for a long time. Think again about disk i/o. They are million times slower than you own code. Running your whole state_entry may take nanoseconds, while waiting the rez to complete may take millis. &lt;br /&gt;
&lt;br /&gt;
During the time your script will be blocked and you will be unable to respond to another event. This is especially important in the case of communications. Imagine a synchronous dialog :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	string answer = llDialog (target, &amp;quot;What will we eat tonight?&amp;quot;, &lt;br /&gt;
					[ &amp;quot;Shushis&amp;quot;, &amp;quot;Hamburger&amp;quot; ]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Surely, we would love to have the answer NOW (== at line 10). It would considerably streamline our code. But our script would be blocked for seconds, which is an eternity for the CPU.&lt;br /&gt;
&lt;br /&gt;
The event model breaks sequentiality for the sake of responsiveness. You throw events. Some time later, you must be ready to handle their completion. You have to warp your code around the flow of events, initiating the transaction in one place, completing it elsewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10	state_entry()&lt;br /&gt;
11	{&lt;br /&gt;
12		llDialog (Do you want this or that);&lt;br /&gt;
13	}&lt;br /&gt;
14&lt;br /&gt;
15	listen (integer channel, .....)&lt;br /&gt;
16	{&lt;br /&gt;
17		// This may be the answer to my question&lt;br /&gt;
18	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Clearing_a_common_misconception_about_the_event_model</id>
		<title>Clearing a common misconception about the event model</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Clearing_a_common_misconception_about_the_event_model"/>
				<updated>2024-10-14T17:17:57Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: First draft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color:#ffcc99; padding:10px; padding-bottom:5px; border: 1px solid&amp;quot;&amp;gt;DRAFT&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clearing a frequent misconception about the event model&lt;br /&gt;
&lt;br /&gt;
Sometimes, we see code like this :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00	string A_name,&lt;br /&gt;
01	key A_key;&lt;br /&gt;
02&lt;br /&gt;
03	state_entry()&lt;br /&gt;
04	{&lt;br /&gt;
05		llRezObject (A_name, .....);&lt;br /&gt;
06		DoThis();&lt;br /&gt;
07		DoThat();&lt;br /&gt;
08	}&lt;br /&gt;
09&lt;br /&gt;
10	object_rez(key id)&lt;br /&gt;
11	{&lt;br /&gt;
12		A_key = id;&lt;br /&gt;
13	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some hope that object_rez will be executed 'as soon as' llRezObject returns, or 'while' state_entry is running. This is false. Despite the fact that the environment (script engine, simulator, network, operating system) is all multi-tasking, your script is NOT.&lt;br /&gt;
&lt;br /&gt;
object_rez cannot run 'while' state_entry runs. This is concurrency, and it is the privilege of multi-tasking (or multi-threaded) languages. In a multi-threaded language, state_entry would be suspended to run object_rez, then resumed later. Like :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
05	llRezObject (A_name, .....);&lt;br /&gt;
12	A_key = id;&lt;br /&gt;
06	DoThis();&lt;br /&gt;
07	DoThat();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LSL being single-threaded, state_entry has to complete before your script can do anything else. Then, it will dequeue the next event from the event queue, that may be (but not necessarily) object_rez. The flow of execution is actually :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
05	llRezObject (A_name, .....);&lt;br /&gt;
06	DoThis();&lt;br /&gt;
07	DoThat();&lt;br /&gt;
12	A_key = id;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But it works !&lt;br /&gt;
&lt;br /&gt;
Yes, it works. Because you have only one operation pending. Imagine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
03	state_entry()&lt;br /&gt;
04	{&lt;br /&gt;
05		llRezObject (A_name, .....);&lt;br /&gt;
06		llRezObject (B_name, .....);&lt;br /&gt;
07		DoThis();&lt;br /&gt;
08		DoThat();&lt;br /&gt;
09	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
How do you differentiate between key for objectA and key for objectB ?&lt;br /&gt;
&lt;br /&gt;
The first object_rez gives A_key and the second B_key ?&lt;br /&gt;
&lt;br /&gt;
Wrong.&lt;br /&gt;
&lt;br /&gt;
llRezObject is an asynchronous operation and you have no control of what happens once initiated. objectA may take more time to rez than objectB for any reason. Think about initiating two i/o operations on DiskA and DiskB in C. Which completes first ? You cannot know. Your code must use some mechanism to bind i/o initiation to i/o completion. Then, when an operation completes, it can be bound to either DiskA or DiskB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But this is LSL, not C, and there is nothing to bind object_rez to llRezObject. Fortunately, the solution is simple : Have only one rez pending at any time. Once llRezObject is called, wait for object_rez to fire before rezing next.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
00	string object_rezed;&lt;br /&gt;
01&lt;br /&gt;
02	state_entry()&lt;br /&gt;
03	{&lt;br /&gt;
04		object_rezed = GetNextObject();&lt;br /&gt;
05		llRezObject (object_rezed, .....); 	// Prime process&lt;br /&gt;
06	}&lt;br /&gt;
07&lt;br /&gt;
08	object_rez(key id)&lt;br /&gt;
09	{&lt;br /&gt;
10		// id is key for 'object_rezed'&lt;br /&gt;
11		object_rezed = GetNextObject();&lt;br /&gt;
12		if (object_rezed == &amp;quot;&amp;quot;) return; 	// Stop process&lt;br /&gt;
13		llRezObject (object_rezed, .....); 	// Propagate process&lt;br /&gt;
14	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In line 10, id is guaranteed to be key of objet 'object_rezed'. You can now associate both. There is no risk of overflowing the event queue, as would be the case with a loop on llRezObject.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What may RezNext look like ? A simple dequeue from a list, maybe :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
50	list ObjectsToRez = [ &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;D&amp;quot; ];&lt;br /&gt;
51&lt;br /&gt;
52	string GetNextObject()&lt;br /&gt;
53	{&lt;br /&gt;
54	    string next_item = llList2List (ObjectsToRez, 0,0);&lt;br /&gt;
55	    ObjectsToRez = llDeleteSubList (ObjectsToRez, 0,0);&lt;br /&gt;
56	    return next_item;&lt;br /&gt;
57	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But I just want the id of the last object rezed. &lt;br /&gt;
Why is this so complex ? I would like to write&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	key A_id = llRezObject (A_name, .....);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This synchronous version would block your script for a long time. Think again about disk i/o. They are million times slower than you own code. Running your whole state_entry may take nanoseconds, while waiting the rez to complete may take millis. &lt;br /&gt;
&lt;br /&gt;
During the time your script will be blocked and you will be unable to respond to another event. This is especially important in the case of communications. Imagine a synchronous dialog :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	string answer = llDialog (target, &amp;quot;What will we eat tonight?&amp;quot;, &lt;br /&gt;
					[ &amp;quot;Shushis&amp;quot;, &amp;quot;Hamburger&amp;quot; ]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Surely, we would love to have the answer NOW (== at line 10). It would considerably streamline our code. But our script would be blocked for seconds, which is an eternity for the CPU.&lt;br /&gt;
&lt;br /&gt;
The event model breaks sequentiality for the sake of responsiveness. You throw events. Some time later, you must be ready to handle their completion. You have to warp your code around the flow of events, initiating the transaction in one place, completing it elsewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10	state_entry()&lt;br /&gt;
11	{&lt;br /&gt;
12		llDialog (Do you want this or that);&lt;br /&gt;
13	}&lt;br /&gt;
14&lt;br /&gt;
15	listen (integer channel, .....)&lt;br /&gt;
16	{&lt;br /&gt;
17		// This may be the answer to my question&lt;br /&gt;
18	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/User:JeffKelley</id>
		<title>User:JeffKelley</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/User:JeffKelley"/>
				<updated>2024-10-13T16:28:38Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Pages in progress, or needing refinement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Me ==&lt;br /&gt;
&lt;br /&gt;
I contribute occasionnally to this wiki, mainly in the database section.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== My links ==&lt;br /&gt;
&lt;br /&gt;
===[[Release_Notes]]===&lt;br /&gt;
===[[Database:Documentation|Database]]===&lt;br /&gt;
*[[Assets]]&lt;br /&gt;
*[[Inventoryfolders]]&lt;br /&gt;
*[[Inventoryitems]]&lt;br /&gt;
*[[Prims_(database_table)|Prims]]&lt;br /&gt;
*[[Primitems]]&lt;br /&gt;
*[[Database:Primshapes|Primshapes]]&lt;br /&gt;
&lt;br /&gt;
===[[Services]]===&lt;br /&gt;
*[[AssetService]]&lt;br /&gt;
*[[AvatarService]]&lt;br /&gt;
*[[GridService]]&lt;br /&gt;
*[[GroupsService]]&lt;br /&gt;
*[[GridUserService]]&lt;br /&gt;
*[[InventoryService]]&lt;br /&gt;
*[[PresenceService]]&lt;br /&gt;
*[[UserAccountService]]&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
*[[ClothingManipulation]]&lt;br /&gt;
*[[UserManipulation]]&lt;br /&gt;
&lt;br /&gt;
===[[Scripting]]===&lt;br /&gt;
&lt;br /&gt;
*[[ScriptEngines]]&lt;br /&gt;
*[[XEngine]]&lt;br /&gt;
*[[YEngine]]&lt;br /&gt;
*[[OSSL_Implemented]]&lt;br /&gt;
&lt;br /&gt;
===[[Monitoring]]===&lt;br /&gt;
*[[Monitoring_Module]] + [[Collectd]]&lt;br /&gt;
*[[Web_Statistics_Module]]&lt;br /&gt;
*[[User:Allen_Kerensky/JSON_User_SimStats|JSON_User_SimStats]], [[UXSimStatus]], [[XSimStatus]]&lt;br /&gt;
*[[Logging]]&lt;br /&gt;
&lt;br /&gt;
===AutoBackup===&lt;br /&gt;
*[[Feature_Proposals/AutoBackup]] (proposal)&lt;br /&gt;
*[[Autobackup]] (AutoBackupSkipAssets)&lt;br /&gt;
*[http://opensimulator.org/mantis/view.php?id=5440 MANTIS 5440] (discussion)&lt;br /&gt;
*[http://opensimulator.org/mantis/view.php?id=7240 MANTIS 7240] (AutoBackupKeepFilesForDays)&lt;br /&gt;
&lt;br /&gt;
===[[Development#Integration|Integration]]===&lt;br /&gt;
*[[REST]]&lt;br /&gt;
*[[RestConsole]]&lt;br /&gt;
*[[RemoteAdmin]]&lt;br /&gt;
*[https://github.com/justincc/opensimulator-tools/tree/master/integration/php php tools] (justincc)&lt;br /&gt;
&lt;br /&gt;
===Formats===&lt;br /&gt;
*[[Inventory_Archives|IAR]]&lt;br /&gt;
*[[OpenSim_Archives|OAR]]&lt;br /&gt;
*[[Asset_Formats|Assets]]&lt;br /&gt;
&lt;br /&gt;
===Region Modules===&lt;br /&gt;
*[[Developing_OpenSim_Addins]]&lt;br /&gt;
*[[Getting_Started_with_Region_Modules]]&lt;br /&gt;
*[[Getting_Started_with_Region_Modules/New]]&lt;br /&gt;
*[[New_Region_Modules]]&lt;br /&gt;
*[[IRegionModule]]&lt;br /&gt;
*[[OSSL_Script_Library/ModSendCommand|ModSendCommand]]&lt;br /&gt;
*[[OSSL_Script_Library/ModInvoke|ModInvoke]]&lt;br /&gt;
*[http://bluewallvirtual.com/example_region_module Example Region Module] (Bluewall)&lt;br /&gt;
&lt;br /&gt;
===[[Server_Commands]]===&lt;br /&gt;
*[[Inventory_Archives]] (IAR)&lt;br /&gt;
*[[OpenSim_Archives]] (OAR)&lt;br /&gt;
*[[Load_Oar]]&lt;br /&gt;
*[[Load_Oar_0.9.0+]]&lt;br /&gt;
&lt;br /&gt;
===Pages in progress, or needing refinement===&lt;br /&gt;
*[[OSSL_vs_LSL]]&lt;br /&gt;
*[[Accessing_Prim_Properties]]&lt;br /&gt;
*[[Streaming_Media_in_OpenSim]]&lt;br /&gt;
*[[Streaming_sound_in_OpenSim]]&lt;br /&gt;
*[[Playing_Music_files_in_OpenSim]]&lt;br /&gt;
*[[Clearing_a_frequent_misconception_about_the_event_model]]&lt;br /&gt;
*[[Artist_Home_(2023_project)]] https://omrg.org/w/index.php?title=OpenSimulator_Content_Creators_Home&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/User:JeffKelley</id>
		<title>User:JeffKelley</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/User:JeffKelley"/>
				<updated>2024-10-10T19:07:10Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Pages in progress, or needing refinement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Me ==&lt;br /&gt;
&lt;br /&gt;
I contribute occasionnally to this wiki, mainly in the database section.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== My links ==&lt;br /&gt;
&lt;br /&gt;
===[[Release_Notes]]===&lt;br /&gt;
===[[Database:Documentation|Database]]===&lt;br /&gt;
*[[Assets]]&lt;br /&gt;
*[[Inventoryfolders]]&lt;br /&gt;
*[[Inventoryitems]]&lt;br /&gt;
*[[Prims_(database_table)|Prims]]&lt;br /&gt;
*[[Primitems]]&lt;br /&gt;
*[[Database:Primshapes|Primshapes]]&lt;br /&gt;
&lt;br /&gt;
===[[Services]]===&lt;br /&gt;
*[[AssetService]]&lt;br /&gt;
*[[AvatarService]]&lt;br /&gt;
*[[GridService]]&lt;br /&gt;
*[[GroupsService]]&lt;br /&gt;
*[[GridUserService]]&lt;br /&gt;
*[[InventoryService]]&lt;br /&gt;
*[[PresenceService]]&lt;br /&gt;
*[[UserAccountService]]&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
*[[ClothingManipulation]]&lt;br /&gt;
*[[UserManipulation]]&lt;br /&gt;
&lt;br /&gt;
===[[Scripting]]===&lt;br /&gt;
&lt;br /&gt;
*[[ScriptEngines]]&lt;br /&gt;
*[[XEngine]]&lt;br /&gt;
*[[YEngine]]&lt;br /&gt;
*[[OSSL_Implemented]]&lt;br /&gt;
&lt;br /&gt;
===[[Monitoring]]===&lt;br /&gt;
*[[Monitoring_Module]] + [[Collectd]]&lt;br /&gt;
*[[Web_Statistics_Module]]&lt;br /&gt;
*[[User:Allen_Kerensky/JSON_User_SimStats|JSON_User_SimStats]], [[UXSimStatus]], [[XSimStatus]]&lt;br /&gt;
*[[Logging]]&lt;br /&gt;
&lt;br /&gt;
===AutoBackup===&lt;br /&gt;
*[[Feature_Proposals/AutoBackup]] (proposal)&lt;br /&gt;
*[[Autobackup]] (AutoBackupSkipAssets)&lt;br /&gt;
*[http://opensimulator.org/mantis/view.php?id=5440 MANTIS 5440] (discussion)&lt;br /&gt;
*[http://opensimulator.org/mantis/view.php?id=7240 MANTIS 7240] (AutoBackupKeepFilesForDays)&lt;br /&gt;
&lt;br /&gt;
===[[Development#Integration|Integration]]===&lt;br /&gt;
*[[REST]]&lt;br /&gt;
*[[RestConsole]]&lt;br /&gt;
*[[RemoteAdmin]]&lt;br /&gt;
*[https://github.com/justincc/opensimulator-tools/tree/master/integration/php php tools] (justincc)&lt;br /&gt;
&lt;br /&gt;
===Formats===&lt;br /&gt;
*[[Inventory_Archives|IAR]]&lt;br /&gt;
*[[OpenSim_Archives|OAR]]&lt;br /&gt;
*[[Asset_Formats|Assets]]&lt;br /&gt;
&lt;br /&gt;
===Region Modules===&lt;br /&gt;
*[[Developing_OpenSim_Addins]]&lt;br /&gt;
*[[Getting_Started_with_Region_Modules]]&lt;br /&gt;
*[[Getting_Started_with_Region_Modules/New]]&lt;br /&gt;
*[[New_Region_Modules]]&lt;br /&gt;
*[[IRegionModule]]&lt;br /&gt;
*[[OSSL_Script_Library/ModSendCommand|ModSendCommand]]&lt;br /&gt;
*[[OSSL_Script_Library/ModInvoke|ModInvoke]]&lt;br /&gt;
*[http://bluewallvirtual.com/example_region_module Example Region Module] (Bluewall)&lt;br /&gt;
&lt;br /&gt;
===[[Server_Commands]]===&lt;br /&gt;
*[[Inventory_Archives]] (IAR)&lt;br /&gt;
*[[OpenSim_Archives]] (OAR)&lt;br /&gt;
*[[Load_Oar]]&lt;br /&gt;
*[[Load_Oar_0.9.0+]]&lt;br /&gt;
&lt;br /&gt;
===Pages in progress, or needing refinement===&lt;br /&gt;
*[[OSSL_vs_LSL]]&lt;br /&gt;
*[[Accessing_Prim_Properties]]&lt;br /&gt;
*[[Streaming_Media_in_OpenSim]]&lt;br /&gt;
*[[Streaming_sound_in_OpenSim]]&lt;br /&gt;
*[[Playing_Music_files_in_OpenSim]]&lt;br /&gt;
*[[Clearing_a_frequent_misconception_about_the_event_system]]&lt;br /&gt;
*[[Artist_Home_(2023_project)]] https://omrg.org/w/index.php?title=OpenSimulator_Content_Creators_Home&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryKey</id>
		<title>OsGetLinkInventoryKey</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryKey"/>
				<updated>2024-06-22T10:01:05Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Edited example comment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=Script owner needs modify, copy and transfer rights&lt;br /&gt;
|delay=0&lt;br /&gt;
|function_syntax=key osGetLinkInventoryKey(integer linkNumber, string name)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// osGetLinkInventoryKey Script Example&lt;br /&gt;
//&lt;br /&gt;
// This script runs in a child prim&lt;br /&gt;
// It will paint the prim with &lt;br /&gt;
// a texture in root inventory&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        string textureName = &amp;quot;K1100RS&amp;quot;;&lt;br /&gt;
        key textureUuid = osGetLinkInventoryKey (LINK_ROOT, textureName, INVENTORY_TEXTURE);&lt;br /&gt;
        llOwnerSay (&amp;quot;Painting prim with texture &amp;quot;+textureUuid);&lt;br /&gt;
        if (textureUuid != NULL_KEY)&lt;br /&gt;
            llSetTexture (textureUuid, ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=Returns id(key) of a inventory item &amp;lt;u&amp;gt;asset&amp;lt;/u&amp;gt; within a prim inventory.&amp;lt;br&amp;gt; If name is not unique result maybe unpredictable.&amp;lt;br&amp;gt; This function extends llGetInventoryKey( string name ) to links.&amp;lt;br&amp;gt;Returns NULL_KEY if the item is not found or Owner has no rights&lt;br /&gt;
|additional_info=osGetInventoryItemKey added in 0.9.1.0 Dev, Implemented August, 16 2019 &amp;lt;br&amp;gt;&lt;br /&gt;
osGetLinkInventoryKey added in 0.9.3.0 Dev, March 2024&lt;br /&gt;
}}&lt;br /&gt;
'''See Also:'''&lt;br /&gt;
* [[osGetInventoryName]]&lt;br /&gt;
* [[osGetInventoryDesc]]&lt;br /&gt;
* [[osGetInventoryLastOwner]]&lt;br /&gt;
* [[osGetLastChangedEventKey]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryKey</id>
		<title>OsGetLinkInventoryKey</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryKey"/>
				<updated>2024-06-21T16:30:38Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Never edit a valid script before publishing.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=Script owner needs modify, copy and transfer rights&lt;br /&gt;
|delay=0&lt;br /&gt;
|function_syntax=key osGetLinkInventoryKey(integer linkNumber, string name)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// osGetLinkInventoryKey Script Example&lt;br /&gt;
//&lt;br /&gt;
// This script runs in link #2&lt;br /&gt;
// It will paint the prim with &lt;br /&gt;
// a texture in root inventory&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        string textureName = &amp;quot;K1100RS&amp;quot;;&lt;br /&gt;
        key textureUuid = osGetLinkInventoryKey (LINK_ROOT, textureName, INVENTORY_TEXTURE);&lt;br /&gt;
        llOwnerSay (&amp;quot;Painting prim with texture &amp;quot;+textureUuid);&lt;br /&gt;
        if (textureUuid != NULL_KEY)&lt;br /&gt;
            llSetTexture (textureUuid, ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=Returns id(key) of a inventory item &amp;lt;u&amp;gt;asset&amp;lt;/u&amp;gt; within a prim inventory.&amp;lt;br&amp;gt; If name is not unique result maybe unpredictable.&amp;lt;br&amp;gt; This function extends llGetInventoryKey( string name ) to links.&amp;lt;br&amp;gt;Returns NULL_KEY if the item is not found or Owner has no rights&lt;br /&gt;
|additional_info=osGetInventoryItemKey added in 0.9.1.0 Dev, Implemented August, 16 2019 &amp;lt;br&amp;gt;&lt;br /&gt;
osGetLinkInventoryKey added in 0.9.3.0 Dev, March 2024&lt;br /&gt;
}}&lt;br /&gt;
'''See Also:'''&lt;br /&gt;
* [[osGetInventoryName]]&lt;br /&gt;
* [[osGetInventoryDesc]]&lt;br /&gt;
* [[osGetInventoryLastOwner]]&lt;br /&gt;
* [[osGetLastChangedEventKey]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryKey</id>
		<title>OsGetLinkInventoryKey</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryKey"/>
				<updated>2024-06-21T15:54:39Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Example added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=Script owner needs modify, copy and transfer rights&lt;br /&gt;
|delay=0&lt;br /&gt;
|function_syntax=key osGetLinkInventoryKey(integer linkNumber, string name)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// osGetLinkInventoryKey Script Example&lt;br /&gt;
//&lt;br /&gt;
// This script runs in link #2&lt;br /&gt;
// It will paint the prim with &lt;br /&gt;
// a texture in root inventory&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        string textureName = &amp;quot;K1100RS&amp;quot;;&lt;br /&gt;
        key textureUuid = osGetLinkInventoryKey (LINK_ROOT, textureName, INVENTORY_TEXTURE);&lt;br /&gt;
        llOwnerSay (&amp;quot;Painting prim with texture &amp;quot;+textureUuid);&lt;br /&gt;
        if (textureuuid != NULL_KEY)&lt;br /&gt;
            llSetTexture (textureUuid, ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=Returns id(key) of a inventory item &amp;lt;u&amp;gt;asset&amp;lt;/u&amp;gt; within a prim inventory.&amp;lt;br&amp;gt; If name is not unique result maybe unpredictable.&amp;lt;br&amp;gt; This function extends llGetInventoryKey( string name ) to links.&amp;lt;br&amp;gt;Returns NULL_KEY if the item is not found or Owner has no rights&lt;br /&gt;
|additional_info=osGetInventoryItemKey added in 0.9.1.0 Dev, Implemented August, 16 2019 &amp;lt;br&amp;gt;&lt;br /&gt;
osGetLinkInventoryKey added in 0.9.3.0 Dev, March 2024&lt;br /&gt;
}}&lt;br /&gt;
'''See Also:'''&lt;br /&gt;
* [[osGetInventoryName]]&lt;br /&gt;
* [[osGetInventoryDesc]]&lt;br /&gt;
* [[osGetInventoryLastOwner]]&lt;br /&gt;
* [[osGetLastChangedEventKey]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryKey</id>
		<title>OsGetLinkInventoryKey</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryKey"/>
				<updated>2024-06-20T18:57:18Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Page creation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=Script owner needs modify, copy and transfer rights&lt;br /&gt;
|delay=0&lt;br /&gt;
|function_syntax=key osGetLinkInventoryKey(integer linkNumber, string name)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// osGetLinkInventoryKey Script Exemple&lt;br /&gt;
//&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=Returns id(key) of a inventory item &amp;lt;u&amp;gt;asset&amp;lt;/u&amp;gt; within a prim inventory.&amp;lt;br&amp;gt; If name is not unique result maybe unpredictable.&amp;lt;br&amp;gt; This function extends llGetInventoryKey( string name ) to links.&amp;lt;br&amp;gt;Returns NULL_KEY if the item is not found or Owner has no rights&lt;br /&gt;
|additional_info=osGetInventoryItemKey added in 0.9.1.0 Dev, Implemented August, 16 2019 &amp;lt;br&amp;gt;&lt;br /&gt;
osGetLinkInventoryKey added in 0.9.3.0 Dev, March 2024&lt;br /&gt;
}}&lt;br /&gt;
'''See Also:'''&lt;br /&gt;
* [[osGetInventoryName]]&lt;br /&gt;
* [[osGetInventoryDesc]]&lt;br /&gt;
* [[osGetInventoryLastOwner]]&lt;br /&gt;
* [[osGetLastChangedEventKey]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:OSSL_Functions</id>
		<title>Category:OSSL Functions</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:OSSL_Functions"/>
				<updated>2024-06-20T18:45:17Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Prim */ Adding osGetLinkInventoryKey&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#FFA500; padding:10px; padding-bottom:5px; border: 1px #FF544F solid&amp;quot;&amp;gt;&lt;br /&gt;
This information is relative to (almost) the last OpenSimulator Development version. In some cases it may not apply to older versions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OSSL function permissions ==&lt;br /&gt;
Several OSSL functions have execution permission control to prevent abusive or dangerous use.&lt;br /&gt;
&lt;br /&gt;
This is controlled by files osslDefaultEnable.ini and osslEnable.ini, by default in folder bin/config-include&amp;lt;br&amp;gt;&lt;br /&gt;
The use logic of these two files is identical to OpenSimDefaults.ini and OpenSim.ini&lt;br /&gt;
&lt;br /&gt;
Older OpenSimulator versions only used file osslEnable.ini.&amp;lt;br&amp;gt;&lt;br /&gt;
Some older OpenSimulator versions had checks for all OSSLfunctions.&amp;lt;br&amp;gt;&lt;br /&gt;
That made no sense for many functions, so now many are always allowed wasting no time on useless checks.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For details about these permissions, please read file OpenSimDefaults.ini&lt;br /&gt;
&lt;br /&gt;
= osslDefaultEnable.ini =&lt;br /&gt;
This file contains the defaults for OSSL execution permissions set by OpenSimulator dev team.&amp;lt;br&amp;gt;&lt;br /&gt;
Instead of changing defaults defined in code, the OpenSimulator dev team may decide to just make changes in this file.&amp;lt;br&amp;gt;&lt;br /&gt;
This file was not present on older OpenSimulator versions.&amp;lt;br&amp;gt;&lt;br /&gt;
If you need to change permissions, copy the respective entry to osslEnable.ini and modify there.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= osslEnable.ini =&lt;br /&gt;
This file contains the local overrides for OSSL permissions.&amp;lt;br&amp;gt;&lt;br /&gt;
It is read after osslDefaultEnable.ini, and any entry on it replaces the old one.&amp;lt;br&amp;gt;&lt;br /&gt;
This file is not provided on code packages, an osslEnable.ini.example is.&amp;lt;br&amp;gt;&lt;br /&gt;
At first time setup, you will need to copy the example file to osslEnable.ini and then edit it for your needs, using osslDefaults.ini as reference.&amp;lt;br&amp;gt;&lt;br /&gt;
This was the only file used on older OpenSimulator versions.&lt;br /&gt;
&lt;br /&gt;
== Current OSSL Functions Implemented  ==&lt;br /&gt;
&lt;br /&gt;
=== Avatars ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
&lt;br /&gt;
* [[osAgentSaveAppearance]]&lt;br /&gt;
* [[osAvatarName2Key]]&lt;br /&gt;
* [[osAvatarPlayAnimation]] &lt;br /&gt;
* [[osAvatarStopAnimation]] &lt;br /&gt;
* [[osAvatarType]]&lt;br /&gt;
* [[osCauseDamage]] &lt;br /&gt;
* [[osCauseHealing]]&lt;br /&gt;
* [[osDetectedCountry]]&lt;br /&gt;
* [[osDropAttachment]]&lt;br /&gt;
* [[osDropAttachmentAt]]&lt;br /&gt;
* [[osEjectFromGroup]]&lt;br /&gt;
* [[osForceAttachToAvatar]]&lt;br /&gt;
* [[osForceAttachToAvatarFromInventory]]&lt;br /&gt;
* [[osForceAttachToOtherAvatarFromInventory]]&lt;br /&gt;
* [[osForceDetachFromAvatar]]&lt;br /&gt;
* [[osForceDropAttachment]]&lt;br /&gt;
* [[osForceDropAttachmentAt]]&lt;br /&gt;
* [[osForceOtherSit]]&lt;br /&gt;
* [[osGetAgentIP]] &lt;br /&gt;
* [[osGetAgents]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetAgentCountry]]&lt;br /&gt;
* [[osGetAvatarHomeURI]]&lt;br /&gt;
* [[osGetAvatarList]] &lt;br /&gt;
* [[osGetGender]]&lt;br /&gt;
* [[osGetHealRate]]&lt;br /&gt;
* [[osGetHealth]]&lt;br /&gt;
* [[osGetNumberOfAttachments]]&lt;br /&gt;
* [[osGrantScriptPermissions]]&lt;br /&gt;
* [[osInviteToGroup]]&lt;br /&gt;
* [[osKickAvatar]]&lt;br /&gt;
* [[osOwnerSaveAppearance]]&lt;br /&gt;
* [[osRevokeScriptPermissions]]&lt;br /&gt;
* [[osSetHealRate]]&lt;br /&gt;
* [[osSetHealth]]&lt;br /&gt;
* [[osSetOwnerSpeed]]&lt;br /&gt;
* [[osSetSpeed]]&lt;br /&gt;
* [[osLocalTeleportAgent]]&lt;br /&gt;
* [[osTeleportAgent]] &lt;br /&gt;
* [[osTeleportOwner]] &lt;br /&gt;
* [[osReplaceAgentEnvironment]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== NPCs ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osIsNpc]]&lt;br /&gt;
* [[osNpcCreate]]&lt;br /&gt;
* [[osGetNpcList]]&lt;br /&gt;
* [[osNpcGetPos]]&lt;br /&gt;
* [[osNpcGetRot]]&lt;br /&gt;
* [[osNpcGetOwner]]&lt;br /&gt;
* [[osNpcLookAt]] {{E}}&lt;br /&gt;
* [[osNpcLoadAppearance]]&lt;br /&gt;
* [[osNpcMoveTo]]&lt;br /&gt;
* [[osNpcMoveToTarget]]&lt;br /&gt;
* [[osNpcPlayAnimation]]&lt;br /&gt;
* [[osNpcRemove]]&lt;br /&gt;
* [[osNpcSaveAppearance]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osNpcSay]]&lt;br /&gt;
* [[osNpcSayTo]]&lt;br /&gt;
* [[osNpcSetProfileAbout]]&lt;br /&gt;
* [[osNpcSetProfileImage]]&lt;br /&gt;
* [[osNpcSetRot]]&lt;br /&gt;
* [[osNpcShout]]&lt;br /&gt;
* [[osNpcSit]]&lt;br /&gt;
* [[osNpcStand]]&lt;br /&gt;
* [[osNpcStopMoveToTarget]]&lt;br /&gt;
* [[osNpcStopAnimation]]&lt;br /&gt;
* [[osNpcTouch]]&lt;br /&gt;
* [[osNpcWhisper]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Prim ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osClearInertia]]&lt;br /&gt;
* [[osClearObjectAnimations]]&lt;br /&gt;
* [[osDie]]&lt;br /&gt;
* [[osForceBreakAllLinks]]&lt;br /&gt;
* [[osForceBreakLink]] &lt;br /&gt;
* [[osForceCreateLink]]&lt;br /&gt;
* [[osGetInertiaData]]&lt;br /&gt;
* [[osGetInventoryItemKey]]&lt;br /&gt;
* [[osGetInventoryName]]&lt;br /&gt;
* [[osGetInventoryNames]] {{new}}&lt;br /&gt;
* [[osGetInventoryItemKeys]] {{new}}&lt;br /&gt;
* [[osGetInventoryDesc]]&lt;br /&gt;
* [[osGetInventoryLastOwner]]&lt;br /&gt;
* [[osGetLinkInventoryName]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryNames]] {{new}}&lt;br /&gt;
* [[osGetInventoryItemKey| osGetLinkInventoryItemKey]] {{new}}&lt;br /&gt;
* [[osGetInventoryItemKeys | osGetLinkInventoryItemKeys]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryKey]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryDesc]] {{new}}&lt;br /&gt;
* [[osGiveLinkInventory]] {{new}}&lt;br /&gt;
* [[osGiveLinkInventoryList]] {{new}}&lt;br /&gt;
* [[osRemoveLinkInventory]] {{new}}&lt;br /&gt;
* [[osGetLastChangedEventKey]]&lt;br /&gt;
* [[osGetLinkNumber]]&lt;br /&gt;
* [[osGetLinkPrimitiveParams]] &lt;br /&gt;
* [[osGetPrimitiveParams]] &lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetRezzingObject]]&lt;br /&gt;
* [[osGetSitActiveRange]]&lt;br /&gt;
* [[osGetLinkSitActiveRange]]&lt;br /&gt;
* [[osGetSitTargetPos]] {{new}}&lt;br /&gt;
* [[osGetSitTargetRot]] {{new}}&lt;br /&gt;
* [[osGetStandTarget]]&lt;br /&gt;
* [[osGetLinkStandTarget]]&lt;br /&gt;
* [[osLinkParticleSystem]] {{new}}&lt;br /&gt;
* [[osMessageAttachments]]&lt;br /&gt;
* [[osMessageObject]]&lt;br /&gt;
* [[osParticleSystem]] {{new}}&lt;br /&gt;
* [[osSetInertia]]&lt;br /&gt;
* [[osSetInertiaAsBox]]&lt;br /&gt;
* [[osSetInertiaAsCylinder]]&lt;br /&gt;
* [[osSetInertiaAsSphere]]&lt;br /&gt;
* [[osSetPrimitiveParams]] &lt;br /&gt;
* [[osSetProjectionParams]]&lt;br /&gt;
* [[osSetSitActiveRange]]&lt;br /&gt;
* [[osSetLinkSitActiveRange]]&lt;br /&gt;
* [[osSetStandTarget]]&lt;br /&gt;
* [[osSetLinkStandTarget]]&lt;br /&gt;
* [[osTeleportObject]]&lt;br /&gt;
* [[osVolumeDetect]]&lt;br /&gt;
* [[osGetPrimCount]] {{new}}&lt;br /&gt;
* [[osGetSittingAvatarsCount]] {{new}}&lt;br /&gt;
&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Prim Drawing / Dynamic Texture ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osDrawEllipse]]&lt;br /&gt;
* [[osDrawFilledEllipse]]&lt;br /&gt;
* [[osDrawFilledPolygon]]&lt;br /&gt;
* [[osDrawFilledRectangle]]&lt;br /&gt;
* [[osDrawImage]]&lt;br /&gt;
* [[osDrawLine]]&lt;br /&gt;
* [[osDrawPolygon]]&lt;br /&gt;
* [[osDrawRectangle]]&lt;br /&gt;
* [[osDrawResetTransform]]&lt;br /&gt;
* [[osDrawRotationTransform]]&lt;br /&gt;
* [[osDrawScaleTransform]]&lt;br /&gt;
* [[osDrawText]]&lt;br /&gt;
* [[osDrawTranslationTransform]]&lt;br /&gt;
* [[osGetDrawStringSize]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osMovePen]]&lt;br /&gt;
* [[osSetFontName]]&lt;br /&gt;
* [[osSetFontSize]]&lt;br /&gt;
* [[osSetPenCap]]&lt;br /&gt;
* [[osSetPenColor]]&lt;br /&gt;
* [[osSetPenSize]]&lt;br /&gt;
* [[osSetDynamicTextureData]]&lt;br /&gt;
* [[osSetDynamicTextureDataFace]]&lt;br /&gt;
* [[osSetDynamicTextureDataBlend]]&lt;br /&gt;
* [[osSetDynamicTextureDataBlendFace]] &lt;br /&gt;
* [[osSetDynamicTextureURL]]&lt;br /&gt;
* [[osSetDynamicTextureURLBlend]]&lt;br /&gt;
* [[osSetDynamicTextureURLBlendFace]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
* [[osGetNotecard]] &lt;br /&gt;
* [[osGetNotecardLine]] &lt;br /&gt;
* [[osGetNumberOfNotecardLines]]&lt;br /&gt;
* [[osMakeNotecard]]&lt;br /&gt;
&lt;br /&gt;
=== Sound ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osAdjustSoundVolume]]&lt;br /&gt;
* [[osCollisionSound]]&lt;br /&gt;
* [[osLoopSound]]&lt;br /&gt;
* [[osLoopSoundMaster]]&lt;br /&gt;
* [[osLoopSoundSlave]]&lt;br /&gt;
* [[osPlaySound]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osPlaySoundSlave]]&lt;br /&gt;
* [[osPreloadSound]]&lt;br /&gt;
* [[osSetSoundRadius]]&lt;br /&gt;
* [[osStopSound]]&lt;br /&gt;
* [[osTriggerSound]]&lt;br /&gt;
* [[osTriggerSoundLimited]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
* [[osRequestSecureURL]]&lt;br /&gt;
* [[osRequestURL]]&lt;br /&gt;
* [[osSetContentType]]&lt;br /&gt;
&lt;br /&gt;
=== Parcel ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osParcelJoin]] &lt;br /&gt;
* [[osParcelSubdivide]] &lt;br /&gt;
* [[osGetParcelDwell]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osSetParcelDetails]]&lt;br /&gt;
* [[osGetParcelDetails]]&lt;br /&gt;
* [[osGetParcelIDs]]&lt;br /&gt;
* [[osGetParcelID]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Terrain ===&lt;br /&gt;
* [[osGetTerrainHeight]] &lt;br /&gt;
* [[osSetTerrainHeight]] &lt;br /&gt;
* [[osSetTerrainTexture]]&lt;br /&gt;
* [[osSetTerrainTextureHeight]]&lt;br /&gt;
* [[osTerrainFlush]]&lt;br /&gt;
&lt;br /&gt;
=== Region / Parcel Environment ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osGetCurrentSunHour]] &lt;br /&gt;
* [[osGetApparentTime]]&lt;br /&gt;
* [[osGetApparentTimeString]]&lt;br /&gt;
* [[osGetApparentRegionTime]]&lt;br /&gt;
* [[osGetApparentRegionTimeString]]&lt;br /&gt;
* [[osGetWindParam]] &lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osSetRegionWaterHeight]] &lt;br /&gt;
* [[osSetWindParam]]&lt;br /&gt;
* [[osWindActiveModelPluginName]]&lt;br /&gt;
* [[osReplaceParcelEnvironment]]&lt;br /&gt;
* [[osReplaceRegionEnvironment]]&lt;br /&gt;
* [[osResetEnvironment]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Grid / Region Information ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osCheckODE]]&lt;br /&gt;
* [[osGetGridCustom]]&lt;br /&gt;
* [[osGetGridGatekeeperURI]]&lt;br /&gt;
* [[osGetGridHomeURI]]&lt;br /&gt;
* [[osGetGridLoginURI]]&lt;br /&gt;
* [[osGetGridName]] &lt;br /&gt;
* [[osGetGridNick]] &lt;br /&gt;
* [[osGetMapTexture]] &lt;br /&gt;
* [[osGetPhysicsEngineName]]&lt;br /&gt;
* [[osGetPhysicsEngineType]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetRegionMapTexture]] &lt;br /&gt;
* [[osGetRegionSize]]&lt;br /&gt;
* [[osGetRegionStats]] &lt;br /&gt;
* [[osGetScriptEngineName]] &lt;br /&gt;
* [[osGetSimulatorMemory]] &lt;br /&gt;
* [[osGetSimulatorMemoryKB]]&lt;br /&gt;
* [[osGetSimulatorVersion]] &lt;br /&gt;
* [[osLoadedCreationDate]] &lt;br /&gt;
* [[osLoadedCreationID]] &lt;br /&gt;
* [[osLoadedCreationTime]] &lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Administration ===&lt;br /&gt;
* [[osConsoleCommand]] &lt;br /&gt;
* [[osRegionNotice]]&lt;br /&gt;
* [[osRegionRestart]] &lt;br /&gt;
* [[osSetParcelMediaURL]] &lt;br /&gt;
* [[osSetParcelMusicURL]]&lt;br /&gt;
* [[osSetParcelSIPAddress]]&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
*[[osResetAllScripts]]&lt;br /&gt;
&lt;br /&gt;
=== String Manipulation ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osFormatString]]&lt;br /&gt;
* [[osListenRegex]]&lt;br /&gt;
* [[osMatchString]]&lt;br /&gt;
* [[osRegexIsMatch]]&lt;br /&gt;
* [[osReplaceString]]&lt;br /&gt;
* [[osStringSubString]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osStringStartsWith]]&lt;br /&gt;
* [[osStringEndsWith]]&lt;br /&gt;
* [[osStringIndexOf]]&lt;br /&gt;
* [[osStringLastIndexOf]]&lt;br /&gt;
* [[osStringRemove]]&lt;br /&gt;
* [[osStringReplace]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osAESEncrypt]] {{new}}&lt;br /&gt;
* [[osAESDecrypt]] {{new}}&lt;br /&gt;
* [[osAESEncryptTo]] {{new}}&lt;br /&gt;
* [[osAESDecryptFrom]] {{new}}&lt;br /&gt;
* [[osAngleBetween]]&lt;br /&gt;
* [[osApproxEquals]]&lt;br /&gt;
* [[osGetPSTWallclock]]&lt;br /&gt;
* [[osListSortInPlace]]&lt;br /&gt;
* [[osListSortInPlaceStrided]] {{new}}&lt;br /&gt;
* [[osIsUUID]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osIsNotValidNumber]]&lt;br /&gt;
* [[osKey2Name]]&lt;br /&gt;
* [[osMax]]&lt;br /&gt;
* [[osMin]]&lt;br /&gt;
* [[osRound]]&lt;br /&gt;
* [[osSHA256]]&lt;br /&gt;
* [[osSlerp]]&lt;br /&gt;
* [[osUnixTimeToTimestamp]] &lt;br /&gt;
* [[osVecDistSquare]]&lt;br /&gt;
* [[osVecMagSquare]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Deprecated ===&lt;br /&gt;
* [[osParcelSetDetails|&amp;lt;strike&amp;gt;osParcelSetDetails&amp;lt;/strike&amp;gt;]] - Use [[osSetParcelDetails]] &lt;br /&gt;
* [[osSetPenColour|&amp;lt;strike&amp;gt;osSetPenColour&amp;lt;/strike&amp;gt;]] - Use [[osSetPenColor]] &lt;br /&gt;
* [[osSunGetParam|&amp;lt;strike&amp;gt;osSunGetParam&amp;lt;/strike&amp;gt;]] - Use [[osGetSunParam]] &lt;br /&gt;
* [[osSunSetParam|&amp;lt;strike&amp;gt;osSunSetParam&amp;lt;/strike&amp;gt;]] - Use [[osSetSunParam]] &lt;br /&gt;
* [[osTerrainGetHeight|&amp;lt;strike&amp;gt;osTerrainGetHeight&amp;lt;/strike&amp;gt;]] - Use [[osGetTerrainHeight]] &lt;br /&gt;
* [[osTerrainSetHeight|&amp;lt;strike&amp;gt;osTerrainSetHeight&amp;lt;/strike&amp;gt;]] - Use [[osSetTerrainHeight]]&lt;br /&gt;
*&amp;lt;strike&amp;gt;osWindParamGet&amp;lt;/strike&amp;gt; - Use [[osGetWindParam]]&lt;br /&gt;
*&amp;lt;strike&amp;gt;osWindParamSet&amp;lt;/strike&amp;gt; - Use [[osSetWindParam]]&lt;br /&gt;
* [[osList2Double|&amp;lt;strike&amp;gt;osList2Double&amp;lt;/strike&amp;gt;]] - Use llList2Float&lt;br /&gt;
* [[osGetSunParam]]&lt;br /&gt;
* [[osSetEstateSunSettings]]&lt;br /&gt;
* [[osSetRegionSunSettings]]&lt;br /&gt;
* [[osSetSunParam]]&lt;br /&gt;
* [[osSetPrimFloatOnWater]]&lt;br /&gt;
&lt;br /&gt;
== See Also  ==&lt;br /&gt;
&lt;br /&gt;
* [[OSSL_vs_LSL|LSL&amp;amp;OSSL : Neighbour functions, similarities and differences]] &lt;br /&gt;
* [[Accessing_Prim_Properties|LSL&amp;amp;OSSL : Guide to prims addressing (by linknum, by uuid)]]&lt;br /&gt;
* [[LSL Status|LSL/OSSL Status Page]] &lt;br /&gt;
*OSSL &lt;br /&gt;
** [[OSSL_Implemented|OSSL Implemented Functions]] &lt;br /&gt;
** [[OSSL Constants|OSSL Constants]] &lt;br /&gt;
** [[OSSL Status/Types|OSSL Types Status Page]] &lt;br /&gt;
** [[OSSL Status/Events|OSSL Events Status Page]] &lt;br /&gt;
&lt;br /&gt;
** [[Dynamic_textures|OSSL osDynamicTextures Functions Index Page]]&lt;br /&gt;
** [[OSSL TextureDrawing|OSSL TextureDrawing Extended Information]]&lt;br /&gt;
** [[OSSLNPC|OSSL functions for working with NPCs]]&lt;br /&gt;
&lt;br /&gt;
** [[OSSL Proposals|OSSL Proposed Functions]] &lt;br /&gt;
** [[OSSL Enabling Functions]] &lt;br /&gt;
** [[OSSL Standards|OSSL Standards]]&lt;br /&gt;
&lt;br /&gt;
* LS&lt;br /&gt;
** [[LightShare#LightShare Scripting|LightShare Functions]]&lt;br /&gt;
&lt;br /&gt;
* MOD&lt;br /&gt;
** [[OSSL Script Library/ModSendCommand|modSendCommand()]]&lt;br /&gt;
** [[OSSL Script Library/ModInvoke|Custom functions using modInvoke()]]&lt;br /&gt;
&lt;br /&gt;
* NPC&lt;br /&gt;
** [[Appearance_Formats|Appearance Notecard Format]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
[[Category:Scripts]]&lt;br /&gt;
[[Category:OSSL]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryName</id>
		<title>OsGetLinkInventoryName</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryName"/>
				<updated>2024-05-18T20:50:10Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Missing 't'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=string osGetLinkInventoryName(integer linkNumber, key itemId)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetLinkInventoryName&lt;br /&gt;
// This script uses the osGetLinkInventoryName function to get the name of an inventory item via the key and child prim number&lt;br /&gt;
&lt;br /&gt;
// Define the child prim&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the key of the inventory item&lt;br /&gt;
key itemUUID = &amp;quot;INVENTORY_ITEM_KEY&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the inventory item name via its key and the child prim number&lt;br /&gt;
        string itemName = osGetLinkInventoryName(CHILD_PRIM_NUMBER, itemUUID);&lt;br /&gt;
&lt;br /&gt;
        // Check if the name is not empty&lt;br /&gt;
        if (itemName != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            // Output the item name to owner chat&lt;br /&gt;
            llOwnerSay(&amp;quot;Name of the inventory item with UUID &amp;quot; + (string)itemUUID + &amp;quot;: &amp;quot; + itemName);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If the name is empty or the item is not found indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;The inventory item with UUID &amp;quot; + (string)itemUUID + &amp;quot; may be empty or not found&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the name of an item located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
osGetLinkInventoryName (linkNumber, itemId) is '''not''' an extension of llGetInventoryName (integer type, integer number) to links.&amp;lt;br/&amp;gt;&lt;br /&gt;
To extend llGetInventoryName (type, number) to links, we must call osGetLinkInventoryNames (note the final 's') to get the list of&amp;lt;br/&amp;gt;&lt;br /&gt;
inventory names for this type, sort the list, then extract the item at index 'number'.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string myGetLinkInventoryName (integer linkNumber, integer type, integer number)&lt;br /&gt;
{&lt;br /&gt;
    list names = osGetLinkInventoryNames (linkNumber, type);&lt;br /&gt;
    names = llListSort (names, 1, TRUE);&lt;br /&gt;
    return llList2String (names, number);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryName</id>
		<title>OsGetLinkInventoryName</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryName"/>
				<updated>2024-05-18T20:49:24Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Missing space&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=string osGetLinkInventoryName(integer linkNumber, key itemId)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetLinkInventoryName&lt;br /&gt;
// This script uses the osGetLinkInventoryName function to get the name of an inventory item via the key and child prim number&lt;br /&gt;
&lt;br /&gt;
// Define the child prim&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the key of the inventory item&lt;br /&gt;
key itemUUID = &amp;quot;INVENTORY_ITEM_KEY&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the inventory item name via its key and the child prim number&lt;br /&gt;
        string itemName = osGetLinkInventoryName(CHILD_PRIM_NUMBER, itemUUID);&lt;br /&gt;
&lt;br /&gt;
        // Check if the name is not empty&lt;br /&gt;
        if (itemName != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            // Output the item name to owner chat&lt;br /&gt;
            llOwnerSay(&amp;quot;Name of the inventory item with UUID &amp;quot; + (string)itemUUID + &amp;quot;: &amp;quot; + itemName);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If the name is empty or the item is not found indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;The inventory item with UUID &amp;quot; + (string)itemUUID + &amp;quot; may be empty or not found&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the name of an item located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
osGetLinkInventoryName (linkNumber, itemId) is '''not''' an extension of llGetInventoryName (integer type, integer number) to links.&amp;lt;br/&amp;gt;&lt;br /&gt;
To extend llGetInventoryName (type, number) to links, we must call osGetLinkInventoryNames (note the final 's') to get the list of&amp;lt;br/&amp;gt;&lt;br /&gt;
inventory names for this type, sort the list, then extract the item a index 'number'.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string myGetLinkInventoryName (integer linkNumber, integer type, integer number)&lt;br /&gt;
{&lt;br /&gt;
    list names = osGetLinkInventoryNames (linkNumber, type);&lt;br /&gt;
    names = llListSort (names, 1, TRUE);&lt;br /&gt;
    return llList2String (names, number);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryName</id>
		<title>OsGetLinkInventoryName</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryName"/>
				<updated>2024-05-18T16:43:07Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=string osGetLinkInventoryName(integer linkNumber, key itemId)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetLinkInventoryName&lt;br /&gt;
// This script uses the osGetLinkInventoryName function to get the name of an inventory item via the key and child prim number&lt;br /&gt;
&lt;br /&gt;
// Define the child prim&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the key of the inventory item&lt;br /&gt;
key itemUUID = &amp;quot;INVENTORY_ITEM_KEY&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the inventory item name via its key and the child prim number&lt;br /&gt;
        string itemName = osGetLinkInventoryName(CHILD_PRIM_NUMBER, itemUUID);&lt;br /&gt;
&lt;br /&gt;
        // Check if the name is not empty&lt;br /&gt;
        if (itemName != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            // Output the item name to owner chat&lt;br /&gt;
            llOwnerSay(&amp;quot;Name of the inventory item with UUID &amp;quot; + (string)itemUUID + &amp;quot;: &amp;quot; + itemName);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If the name is empty or the item is not found indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;The inventory item with UUID &amp;quot; + (string)itemUUID + &amp;quot; may be empty or not found&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the name of an item located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
osGetLinkInventoryName (linkNumber, itemId) is '''not''' an extension of llGetInventoryName (integer type, integer number) to links.&amp;lt;br/&amp;gt;&lt;br /&gt;
To extend llGetInventoryName (type, number) to links, we must callosGetLinkInventoryNames (note the final 's') to get the list of&amp;lt;br/&amp;gt;&lt;br /&gt;
inventory names for this type, sort the list, then extract the item a index 'number'.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string myGetLinkInventoryName (integer linkNumber, integer type, integer number)&lt;br /&gt;
{&lt;br /&gt;
    list names = osGetLinkInventoryNames (linkNumber, type);&lt;br /&gt;
    names = llListSort (names, 1, TRUE);&lt;br /&gt;
    return llList2String (names, number);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryName</id>
		<title>OsGetLinkInventoryName</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryName"/>
				<updated>2024-05-18T16:23:28Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=string osGetLinkInventoryName(integer linkNumber, key itemId)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetLinkInventoryName&lt;br /&gt;
// This script uses the osGetLinkInventoryName function to get the name of an inventory item via the key and child prim number&lt;br /&gt;
&lt;br /&gt;
// Define the child prim&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the key of the inventory item&lt;br /&gt;
key itemUUID = &amp;quot;INVENTORY_ITEM_KEY&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the inventory item name via its key and the child prim number&lt;br /&gt;
        string itemName = osGetLinkInventoryName(CHILD_PRIM_NUMBER, itemUUID);&lt;br /&gt;
&lt;br /&gt;
        // Check if the name is not empty&lt;br /&gt;
        if (itemName != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            // Output the item name to owner chat&lt;br /&gt;
            llOwnerSay(&amp;quot;Name of the inventory item with UUID &amp;quot; + (string)itemUUID + &amp;quot;: &amp;quot; + itemName);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If the name is empty or the item is not found indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;The inventory item with UUID &amp;quot; + (string)itemUUID + &amp;quot; may be empty or not found&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the name of an item located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
osGetLinkInventoryName (linkNumber, itemId) is '''not''' an extension&amp;lt;br/&amp;gt;&lt;br /&gt;
of llGetInventoryName (integer type, integer number) to links.&amp;lt;br/&amp;gt;&lt;br /&gt;
To extend llGetInventoryName (type, number) to links, we must call&amp;lt;br/&amp;gt;&lt;br /&gt;
osGetLinkInventoryNames (note the 's') to get the list of inventory names&amp;lt;br/&amp;gt;&lt;br /&gt;
for this type, sort the list, then extract the item a index 'number'.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string myGetLinkInventoryName (integer linkNumber, integer type, integer number)&lt;br /&gt;
{&lt;br /&gt;
    list names = osGetLinkInventoryNames (linkNumber, type);&lt;br /&gt;
    names = llListSort (names, 1, TRUE);&lt;br /&gt;
    return llList2String (names, number);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Build_Instructions</id>
		<title>Build Instructions</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Build_Instructions"/>
				<updated>2024-05-15T19:39:54Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Install dotnet under Debian/Ubuntu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks|Build_Instructions}}&lt;br /&gt;
&lt;br /&gt;
This page covers building OpenSimulator from source code on multiple platforms.  Please help us keep this page up to date as the project progresses. If you just want to run OpenSimulator, [[Download]] and [[Configuration|run]] the binary build instead. In the most cases, you should be fine with binaries.&lt;br /&gt;
&lt;br /&gt;
= Obtaining the Source Code =&lt;br /&gt;
&lt;br /&gt;
Check out the [[Download]] page for instructions on obtaining an OpenSimulator source release.  If you want the current development code (i.e. the Git master branch) see [[Developer_Documentation#Source_Code_Repository_Access]].&lt;br /&gt;
&lt;br /&gt;
= Building =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Although this page is long, building is generally quite simple.  See the BUILDING.txt file in the distribution itself for simplified instructions.&lt;br /&gt;
&lt;br /&gt;
== Version 0.9.3.0 and above ==&lt;br /&gt;
Microsoft stopped the development of .Net Framework and Mono, replacing them by new dotnet&lt;br /&gt;
This is a significant breaking change that we try to follow on 0.9.3.0.&lt;br /&gt;
&lt;br /&gt;
=== Get source code ===&lt;br /&gt;
&lt;br /&gt;
get or update source from git&lt;br /&gt;
&lt;br /&gt;
 git clone git://opensimulator.org/git/opensim&lt;br /&gt;
&lt;br /&gt;
=== Building on Windows ===&lt;br /&gt;
To building under Windows, the following is required:&lt;br /&gt;
&lt;br /&gt;
* [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 dotnet 8.0 SDK]&lt;br /&gt;
&lt;br /&gt;
optionally also &lt;br /&gt;
&lt;br /&gt;
* Visual Studio .NET, version 2022 or later&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create the project files running:&lt;br /&gt;
&lt;br /&gt;
 runprebuild.bat&lt;br /&gt;
&lt;br /&gt;
Load the generated OpenSim.sln into Visual Studio and build the solution, or just run&lt;br /&gt;
 compile.bat&lt;br /&gt;
&lt;br /&gt;
to run you may also need&lt;br /&gt;
* to install the [https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170 run time files for vc++]&lt;br /&gt;
* to authorize the install of older .NetFramework 3.5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Configure, See [[Configuration]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now just run OpenSim.exe from the bin folder, and set up the region.&lt;br /&gt;
&lt;br /&gt;
=== Building on Linux / Mac ===&lt;br /&gt;
&lt;br /&gt;
you will need&lt;br /&gt;
* [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 dotnet 8.0 SDK]&lt;br /&gt;
* libgdiplus&lt;br /&gt;
**if you have mono 6.x complete, you already have libgdiplus, otherwise you need to install it using a package manager for your operating system, like apt, brew, macports, etc. For example on debian:&lt;br /&gt;
*** apt-get update &amp;amp;&amp;amp; apt-get install -y apt-utils libgdiplus libc6-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create the project files, run:&lt;br /&gt;
&lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
then run&lt;br /&gt;
 dotnet build --configuration Release OpenSim.sln&lt;br /&gt;
&lt;br /&gt;
or just&lt;br /&gt;
 ./compile.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Configure. See [[Configuration]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run ./opensim.sh from the bin folder, and set up the region&lt;br /&gt;
&lt;br /&gt;
== Older Versions ==&lt;br /&gt;
   Source for old .Net Framework 4.x and Mono is in branch Mono-Net4X &lt;br /&gt;
   This is mostly same code as 0.9.2.2 release.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
OpenSimulator 0.9.0.x requires either &lt;br /&gt;
* [http://msdn.microsoft.com/en-us/netframework/cc378097 .NET Framework 4.0] on Windows&lt;br /&gt;
* [https://www.mono-project.com/download/stable/ Mono] on Linux or Mac.  Mono 2.10.8 is the minimum version.&lt;br /&gt;
You may also need nant tool.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OpenSimulator &amp;gt;= 0.9.1 (including current master) requires&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/netframework/cc378097 .NET Framework 4.6] on Windows &lt;br /&gt;
* [https://www.mono-project.com/download/stable/ Mono] on Linux or Mac. Mono 5.12 is the minimum recommended version.&amp;lt;br&amp;gt;'''Note:''' rather than using your Linux distro's Mono packages, which may be missing required components, please [https://www.mono-project.com/download/stable/ install from the official Mono repo for your distro].&lt;br /&gt;
recommend compiling with msbuild.&lt;br /&gt;
&lt;br /&gt;
Other platforms may have own mono distributions, or may need to compile mono on them.&lt;br /&gt;
&lt;br /&gt;
Other libraries used by OpenSimulator can be found at our opensim-libs git repo:&lt;br /&gt;
&lt;br /&gt;
git clone git://opensimulator.org/git/opensim-libs&lt;br /&gt;
&lt;br /&gt;
libOpenMetaVerse used can be found at https://bitbucket.org/opensimulator/&lt;br /&gt;
&lt;br /&gt;
You may need to compile them for your platform, in particular the unmanaged ones like Bullet or ODE native code libraries&lt;br /&gt;
&lt;br /&gt;
== MS Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Supported Compilers ===&lt;br /&gt;
* [https://visualstudio.microsoft.com/downloads/ Visual Studio Community 2017]&lt;br /&gt;
* Or any version that does support the .Net version. At least VS2010 for versions prior to 0.91, VS2015 for 0.91 and after.&lt;br /&gt;
* OpenSimulator &amp;gt;=0.9.2.0 can compile for .Net Framework 4.8 using runprebuild48.bat instead of runprebuild.bat below and with VS2017/19/22&lt;br /&gt;
&lt;br /&gt;
=== Compiling in an IDE ===&lt;br /&gt;
# Run &amp;quot;runprebuild.bat&amp;quot;&lt;br /&gt;
# Open the resulting &amp;quot;OpenSim.sln&amp;quot; in Visual Studio IDE.&lt;br /&gt;
# Select Debug or Release configuration&lt;br /&gt;
# Menu Build -&amp;gt; Build Solution.&lt;br /&gt;
&lt;br /&gt;
===Compiling at the Command Prompt ===&lt;br /&gt;
# Run &amp;quot;runprebuild.bat&amp;quot;.&lt;br /&gt;
# Run the resulting &amp;quot;compile.bat&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
== Linux and Other Mono Platforms ==&lt;br /&gt;
&lt;br /&gt;
=== Install dotnet under Debian/Ubuntu ===&lt;br /&gt;
&lt;br /&gt;
For Ubuntu 22.04 LTS and higher, dotnet is available in the distribution's repos. &lt;br /&gt;
&lt;br /&gt;
For Ubuntu 20.04 LTS and lower, and for all versions of Debian, add Microsoft repository to your installation :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Get OS version info&lt;br /&gt;
source /etc/os-release&lt;br /&gt;
&lt;br /&gt;
# Download Microsoft signing key and repository&lt;br /&gt;
wget https://packages.microsoft.com/config/$ID/$VERSION_ID/packages-microsoft-prod.deb -O packages-microsoft-prod.deb&lt;br /&gt;
&lt;br /&gt;
# Install Microsoft signing key and repository&lt;br /&gt;
sudo dpkg -i packages-microsoft-prod.deb&lt;br /&gt;
&lt;br /&gt;
# Clean up&lt;br /&gt;
rm packages-microsoft-prod.deb&lt;br /&gt;
&lt;br /&gt;
# Update packages&lt;br /&gt;
sudo apt update&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install dotnet-sdk-8.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://learn.microsoft.com/en-us/dotnet/core/install/linux-ubuntu&amp;lt;br/&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/dotnet/core/install/linux-debian&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prepare to compile ===&lt;br /&gt;
To create the several project files run on the folder opensim:&lt;br /&gt;
&lt;br /&gt;
  ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
==== Compile with Nant ====&lt;br /&gt;
On some mono versions, in particular old ones may need the use of nant to proper compile OpenSimulator, in that case just run:&lt;br /&gt;
&lt;br /&gt;
  nant&lt;br /&gt;
&lt;br /&gt;
==== Compile with xbuild ====&lt;br /&gt;
&lt;br /&gt;
On mono versions you can just use xbuild. ''(msbuild is recommended for 0.9.1.0.0+)''&lt;br /&gt;
&lt;br /&gt;
  xbuild&lt;br /&gt;
&lt;br /&gt;
xbuild is no longer recommended on mono 5.x, but currently still works (5.12)&lt;br /&gt;
&lt;br /&gt;
''&amp;gt;&amp;gt;&amp;gt;&amp;gt; xbuild tool is deprecated and will be removed in future updates, use msbuild instead &amp;lt;&amp;lt;&amp;lt;&amp;lt;''&lt;br /&gt;
&lt;br /&gt;
On more recent mono versions Release configuration may give some performance gain, but you do lose some debug capabilities.&lt;br /&gt;
to compile Release configuration:&lt;br /&gt;
  xbuild /p:Configuration=Release&lt;br /&gt;
&lt;br /&gt;
==== Compile with msbuild ====&lt;br /&gt;
For Opensim 0.9.1 you can still use xbuild but Mono recommends the use of msbuild. You might need to install the package msbuild in addition to mono-complete for that. (Currently msbuild is included if you install mono-complete, on Ubuntu, from the official mono repositories. https://www.mono-project.com/download/stable/#download-lin )&lt;br /&gt;
&lt;br /&gt;
Use xbuild on the other cases as a last resort.&lt;br /&gt;
&lt;br /&gt;
Recent improvements, specially on JIT runtime, justify compiling in Release configuration, but you do lose some debug capabilities.&lt;br /&gt;
&lt;br /&gt;
to compile with Debug configuration:&lt;br /&gt;
   msbuild&lt;br /&gt;
&lt;br /&gt;
to compile with Release configuration:&lt;br /&gt;
   msbuild /p:Configuration=Release&lt;br /&gt;
&lt;br /&gt;
to compile with the debug configuration and detailed opensim.log file can then be read with a text editor:&lt;br /&gt;
   msbuild /p:Configuration=Debug /fileLogger /flp:logfile=opensim.log /v:d&lt;br /&gt;
&lt;br /&gt;
you can specify the following values for the level of detail of the opensim.log file:&lt;br /&gt;
   q [quiet], m [minimal], n [normal], d [detailed] and diag [diagnostic].&lt;br /&gt;
&lt;br /&gt;
To compile for .Net Framework 4.8 with mono &amp;gt;=6.12. you can run runprebuild48.sh instead of runprebuild.sh above. Not much gain doing that, if any.&lt;br /&gt;
&lt;br /&gt;
== Ahead of Time compilation (AOT)==&lt;br /&gt;
As you all know the files *.exe and .dll created by the compiling process above do no contain native code for the machine.&amp;lt;br&amp;gt;&lt;br /&gt;
With those files, the native code required by the cpu is created at runtime, as needed, in a process known as Just in Time (JIT)&amp;lt;br&amp;gt;&lt;br /&gt;
It is possible to do another compile stage on those files to create native code, that will ready when the program starts. This is the Ahead of time process (AOT).&amp;lt;br&amp;gt;&lt;br /&gt;
Since JIT is done at runtime, it has limited time to do extensive code optimizations, AOT on the other hand can do all.&amp;lt;br&amp;gt;&lt;br /&gt;
AOT should this way be faster to load, save some the memory needed by JIT work, and reduce latency due to code generation when a new code section is needed.&amp;lt;br&amp;gt;&lt;br /&gt;
This way AOT helps reduce the huge performance gap between C# and a more proper language like C++, even considering JIT can do some optimization dependent on current code execution state, that AOT can't. (if you think c# is as fast as competent c++ code, better change what you are smoking...)&amp;lt;br&amp;gt;&lt;br /&gt;
In fact both .net and mono do AOT on their components during install&amp;lt;br&amp;gt;&lt;br /&gt;
JIT will still be active, compiling some other code at run time. OpenSim and used .net/mono framework parts depend on it.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Linux, 0.9.2.0 now includes scripts makeaot.sh and cleanaot.sh to help testing AOT.&amp;lt;br&amp;gt;&lt;br /&gt;
Run makeaot.sh after the compile stage above, to generate the native code files. The option -O=all must be added to mono when executing opensim.exe, ex:&amp;lt;br&amp;gt;&lt;br /&gt;
 mono --desktop -O=all OpenSim.exe&lt;br /&gt;
Script cleanaot.sh removes the binary files used by AOT. You must run it if you recompile the code (to be safe even if running makeaot).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;DO NOT FORGET to run makeaot.sh or cleanaot.sh after recompile!&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
The generated files are specific for that machine. &amp;lt;b&amp;gt;Do not copy the native code files to other machine, unless it is absolutely identical&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
The original .exe and .dll are still needed&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AOT is also possible in windows, but using different tools, and those add things to central repository on the machine, harder to isolate and maintain. see [https://docs.microsoft.com/en-us/dotnet/framework/tools/ngen-exe-native-image-generator ngen]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macs are.. Macs.. Future models may totally forbid JIT, like Apple mobile products do. Mono AOT on current Macs may work as on Linux&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In practical use, don't expect much more than a bit faster loading.&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, since compilation is different, it may add new issues. So test with care&amp;lt;br&amp;gt; &lt;br /&gt;
Opensim performance issues are mostly on its own code, terrible bad communications protocols, use of bad .net/mono framework code (demo quality in same cases), etc.&amp;lt;br&amp;gt;&lt;br /&gt;
And of course eternally broken GC&amp;lt;br&amp;gt;&lt;br /&gt;
But... well every ns counts..&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
See [[Configuration]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;br /&gt;
[[Category:Users]]&lt;br /&gt;
[[Category:Getting Started]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Build_Instructions</id>
		<title>Build Instructions</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Build_Instructions"/>
				<updated>2024-05-15T19:38:51Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Linux and Other Mono Platforms */ Installing dotnet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks|Build_Instructions}}&lt;br /&gt;
&lt;br /&gt;
This page covers building OpenSimulator from source code on multiple platforms.  Please help us keep this page up to date as the project progresses. If you just want to run OpenSimulator, [[Download]] and [[Configuration|run]] the binary build instead. In the most cases, you should be fine with binaries.&lt;br /&gt;
&lt;br /&gt;
= Obtaining the Source Code =&lt;br /&gt;
&lt;br /&gt;
Check out the [[Download]] page for instructions on obtaining an OpenSimulator source release.  If you want the current development code (i.e. the Git master branch) see [[Developer_Documentation#Source_Code_Repository_Access]].&lt;br /&gt;
&lt;br /&gt;
= Building =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Although this page is long, building is generally quite simple.  See the BUILDING.txt file in the distribution itself for simplified instructions.&lt;br /&gt;
&lt;br /&gt;
== Version 0.9.3.0 and above ==&lt;br /&gt;
Microsoft stopped the development of .Net Framework and Mono, replacing them by new dotnet&lt;br /&gt;
This is a significant breaking change that we try to follow on 0.9.3.0.&lt;br /&gt;
&lt;br /&gt;
=== Get source code ===&lt;br /&gt;
&lt;br /&gt;
get or update source from git&lt;br /&gt;
&lt;br /&gt;
 git clone git://opensimulator.org/git/opensim&lt;br /&gt;
&lt;br /&gt;
=== Building on Windows ===&lt;br /&gt;
To building under Windows, the following is required:&lt;br /&gt;
&lt;br /&gt;
* [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 dotnet 8.0 SDK]&lt;br /&gt;
&lt;br /&gt;
optionally also &lt;br /&gt;
&lt;br /&gt;
* Visual Studio .NET, version 2022 or later&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create the project files running:&lt;br /&gt;
&lt;br /&gt;
 runprebuild.bat&lt;br /&gt;
&lt;br /&gt;
Load the generated OpenSim.sln into Visual Studio and build the solution, or just run&lt;br /&gt;
 compile.bat&lt;br /&gt;
&lt;br /&gt;
to run you may also need&lt;br /&gt;
* to install the [https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170 run time files for vc++]&lt;br /&gt;
* to authorize the install of older .NetFramework 3.5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Configure, See [[Configuration]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now just run OpenSim.exe from the bin folder, and set up the region.&lt;br /&gt;
&lt;br /&gt;
=== Building on Linux / Mac ===&lt;br /&gt;
&lt;br /&gt;
you will need&lt;br /&gt;
* [https://dotnet.microsoft.com/en-us/download/dotnet/8.0 dotnet 8.0 SDK]&lt;br /&gt;
* libgdiplus&lt;br /&gt;
**if you have mono 6.x complete, you already have libgdiplus, otherwise you need to install it using a package manager for your operating system, like apt, brew, macports, etc. For example on debian:&lt;br /&gt;
*** apt-get update &amp;amp;&amp;amp; apt-get install -y apt-utils libgdiplus libc6-dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create the project files, run:&lt;br /&gt;
&lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
then run&lt;br /&gt;
 dotnet build --configuration Release OpenSim.sln&lt;br /&gt;
&lt;br /&gt;
or just&lt;br /&gt;
 ./compile.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Configure. See [[Configuration]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
run ./opensim.sh from the bin folder, and set up the region&lt;br /&gt;
&lt;br /&gt;
== Older Versions ==&lt;br /&gt;
   Source for old .Net Framework 4.x and Mono is in branch Mono-Net4X &lt;br /&gt;
   This is mostly same code as 0.9.2.2 release.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
OpenSimulator 0.9.0.x requires either &lt;br /&gt;
* [http://msdn.microsoft.com/en-us/netframework/cc378097 .NET Framework 4.0] on Windows&lt;br /&gt;
* [https://www.mono-project.com/download/stable/ Mono] on Linux or Mac.  Mono 2.10.8 is the minimum version.&lt;br /&gt;
You may also need nant tool.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OpenSimulator &amp;gt;= 0.9.1 (including current master) requires&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/netframework/cc378097 .NET Framework 4.6] on Windows &lt;br /&gt;
* [https://www.mono-project.com/download/stable/ Mono] on Linux or Mac. Mono 5.12 is the minimum recommended version.&amp;lt;br&amp;gt;'''Note:''' rather than using your Linux distro's Mono packages, which may be missing required components, please [https://www.mono-project.com/download/stable/ install from the official Mono repo for your distro].&lt;br /&gt;
recommend compiling with msbuild.&lt;br /&gt;
&lt;br /&gt;
Other platforms may have own mono distributions, or may need to compile mono on them.&lt;br /&gt;
&lt;br /&gt;
Other libraries used by OpenSimulator can be found at our opensim-libs git repo:&lt;br /&gt;
&lt;br /&gt;
git clone git://opensimulator.org/git/opensim-libs&lt;br /&gt;
&lt;br /&gt;
libOpenMetaVerse used can be found at https://bitbucket.org/opensimulator/&lt;br /&gt;
&lt;br /&gt;
You may need to compile them for your platform, in particular the unmanaged ones like Bullet or ODE native code libraries&lt;br /&gt;
&lt;br /&gt;
== MS Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Supported Compilers ===&lt;br /&gt;
* [https://visualstudio.microsoft.com/downloads/ Visual Studio Community 2017]&lt;br /&gt;
* Or any version that does support the .Net version. At least VS2010 for versions prior to 0.91, VS2015 for 0.91 and after.&lt;br /&gt;
* OpenSimulator &amp;gt;=0.9.2.0 can compile for .Net Framework 4.8 using runprebuild48.bat instead of runprebuild.bat below and with VS2017/19/22&lt;br /&gt;
&lt;br /&gt;
=== Compiling in an IDE ===&lt;br /&gt;
# Run &amp;quot;runprebuild.bat&amp;quot;&lt;br /&gt;
# Open the resulting &amp;quot;OpenSim.sln&amp;quot; in Visual Studio IDE.&lt;br /&gt;
# Select Debug or Release configuration&lt;br /&gt;
# Menu Build -&amp;gt; Build Solution.&lt;br /&gt;
&lt;br /&gt;
===Compiling at the Command Prompt ===&lt;br /&gt;
# Run &amp;quot;runprebuild.bat&amp;quot;.&lt;br /&gt;
# Run the resulting &amp;quot;compile.bat&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
== Linux and Other Mono Platforms ==&lt;br /&gt;
&lt;br /&gt;
=== Install dotnet under Debian/Ubuntu ===&lt;br /&gt;
&lt;br /&gt;
For Ubuntu 22.04 LTS and higher, dotnet is available in the distribution's repos. For Ubuntu 20.04 LTS and lower, and for all versions of Debian, add Microsoft repository to your installation :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Get OS version info&lt;br /&gt;
source /etc/os-release&lt;br /&gt;
&lt;br /&gt;
# Download Microsoft signing key and repository&lt;br /&gt;
wget https://packages.microsoft.com/config/$ID/$VERSION_ID/packages-microsoft-prod.deb -O packages-microsoft-prod.deb&lt;br /&gt;
&lt;br /&gt;
# Install Microsoft signing key and repository&lt;br /&gt;
sudo dpkg -i packages-microsoft-prod.deb&lt;br /&gt;
&lt;br /&gt;
# Clean up&lt;br /&gt;
rm packages-microsoft-prod.deb&lt;br /&gt;
&lt;br /&gt;
# Update packages&lt;br /&gt;
sudo apt update&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install dotnet-sdk-8.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://learn.microsoft.com/en-us/dotnet/core/install/linux-ubuntu&amp;lt;br/&amp;gt;&lt;br /&gt;
https://learn.microsoft.com/en-us/dotnet/core/install/linux-debian&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prepare to compile ===&lt;br /&gt;
To create the several project files run on the folder opensim:&lt;br /&gt;
&lt;br /&gt;
  ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
==== Compile with Nant ====&lt;br /&gt;
On some mono versions, in particular old ones may need the use of nant to proper compile OpenSimulator, in that case just run:&lt;br /&gt;
&lt;br /&gt;
  nant&lt;br /&gt;
&lt;br /&gt;
==== Compile with xbuild ====&lt;br /&gt;
&lt;br /&gt;
On mono versions you can just use xbuild. ''(msbuild is recommended for 0.9.1.0.0+)''&lt;br /&gt;
&lt;br /&gt;
  xbuild&lt;br /&gt;
&lt;br /&gt;
xbuild is no longer recommended on mono 5.x, but currently still works (5.12)&lt;br /&gt;
&lt;br /&gt;
''&amp;gt;&amp;gt;&amp;gt;&amp;gt; xbuild tool is deprecated and will be removed in future updates, use msbuild instead &amp;lt;&amp;lt;&amp;lt;&amp;lt;''&lt;br /&gt;
&lt;br /&gt;
On more recent mono versions Release configuration may give some performance gain, but you do lose some debug capabilities.&lt;br /&gt;
to compile Release configuration:&lt;br /&gt;
  xbuild /p:Configuration=Release&lt;br /&gt;
&lt;br /&gt;
==== Compile with msbuild ====&lt;br /&gt;
For Opensim 0.9.1 you can still use xbuild but Mono recommends the use of msbuild. You might need to install the package msbuild in addition to mono-complete for that. (Currently msbuild is included if you install mono-complete, on Ubuntu, from the official mono repositories. https://www.mono-project.com/download/stable/#download-lin )&lt;br /&gt;
&lt;br /&gt;
Use xbuild on the other cases as a last resort.&lt;br /&gt;
&lt;br /&gt;
Recent improvements, specially on JIT runtime, justify compiling in Release configuration, but you do lose some debug capabilities.&lt;br /&gt;
&lt;br /&gt;
to compile with Debug configuration:&lt;br /&gt;
   msbuild&lt;br /&gt;
&lt;br /&gt;
to compile with Release configuration:&lt;br /&gt;
   msbuild /p:Configuration=Release&lt;br /&gt;
&lt;br /&gt;
to compile with the debug configuration and detailed opensim.log file can then be read with a text editor:&lt;br /&gt;
   msbuild /p:Configuration=Debug /fileLogger /flp:logfile=opensim.log /v:d&lt;br /&gt;
&lt;br /&gt;
you can specify the following values for the level of detail of the opensim.log file:&lt;br /&gt;
   q [quiet], m [minimal], n [normal], d [detailed] and diag [diagnostic].&lt;br /&gt;
&lt;br /&gt;
To compile for .Net Framework 4.8 with mono &amp;gt;=6.12. you can run runprebuild48.sh instead of runprebuild.sh above. Not much gain doing that, if any.&lt;br /&gt;
&lt;br /&gt;
== Ahead of Time compilation (AOT)==&lt;br /&gt;
As you all know the files *.exe and .dll created by the compiling process above do no contain native code for the machine.&amp;lt;br&amp;gt;&lt;br /&gt;
With those files, the native code required by the cpu is created at runtime, as needed, in a process known as Just in Time (JIT)&amp;lt;br&amp;gt;&lt;br /&gt;
It is possible to do another compile stage on those files to create native code, that will ready when the program starts. This is the Ahead of time process (AOT).&amp;lt;br&amp;gt;&lt;br /&gt;
Since JIT is done at runtime, it has limited time to do extensive code optimizations, AOT on the other hand can do all.&amp;lt;br&amp;gt;&lt;br /&gt;
AOT should this way be faster to load, save some the memory needed by JIT work, and reduce latency due to code generation when a new code section is needed.&amp;lt;br&amp;gt;&lt;br /&gt;
This way AOT helps reduce the huge performance gap between C# and a more proper language like C++, even considering JIT can do some optimization dependent on current code execution state, that AOT can't. (if you think c# is as fast as competent c++ code, better change what you are smoking...)&amp;lt;br&amp;gt;&lt;br /&gt;
In fact both .net and mono do AOT on their components during install&amp;lt;br&amp;gt;&lt;br /&gt;
JIT will still be active, compiling some other code at run time. OpenSim and used .net/mono framework parts depend on it.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Linux, 0.9.2.0 now includes scripts makeaot.sh and cleanaot.sh to help testing AOT.&amp;lt;br&amp;gt;&lt;br /&gt;
Run makeaot.sh after the compile stage above, to generate the native code files. The option -O=all must be added to mono when executing opensim.exe, ex:&amp;lt;br&amp;gt;&lt;br /&gt;
 mono --desktop -O=all OpenSim.exe&lt;br /&gt;
Script cleanaot.sh removes the binary files used by AOT. You must run it if you recompile the code (to be safe even if running makeaot).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;DO NOT FORGET to run makeaot.sh or cleanaot.sh after recompile!&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
The generated files are specific for that machine. &amp;lt;b&amp;gt;Do not copy the native code files to other machine, unless it is absolutely identical&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
The original .exe and .dll are still needed&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AOT is also possible in windows, but using different tools, and those add things to central repository on the machine, harder to isolate and maintain. see [https://docs.microsoft.com/en-us/dotnet/framework/tools/ngen-exe-native-image-generator ngen]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macs are.. Macs.. Future models may totally forbid JIT, like Apple mobile products do. Mono AOT on current Macs may work as on Linux&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In practical use, don't expect much more than a bit faster loading.&amp;lt;br&amp;gt;&lt;br /&gt;
Additionally, since compilation is different, it may add new issues. So test with care&amp;lt;br&amp;gt; &lt;br /&gt;
Opensim performance issues are mostly on its own code, terrible bad communications protocols, use of bad .net/mono framework code (demo quality in same cases), etc.&amp;lt;br&amp;gt;&lt;br /&gt;
And of course eternally broken GC&amp;lt;br&amp;gt;&lt;br /&gt;
But... well every ns counts..&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
See [[Configuration]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;br /&gt;
[[Category:Users]]&lt;br /&gt;
[[Category:Getting Started]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryNames</id>
		<title>OsGetLinkInventoryNames</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryNames"/>
				<updated>2024-03-29T11:59:48Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Note about order&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=list osGetLinkInventoryNames(integer linkNumber, integer type)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetLinkInventoryNames&lt;br /&gt;
// This script uses the osGetLinkInventoryNames function to return a list of inventory items of a specified type in a specified child prim&lt;br /&gt;
&lt;br /&gt;
// Define the child prim&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the inventory type&lt;br /&gt;
integer INVENTORY_TYPE = INVENTORY_ALL;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the list of inventory items by name&lt;br /&gt;
        list inventoryNames = osGetLinkInventoryNames(CHILD_PRIM_NUMBER, INVENTORY_TYPE);&lt;br /&gt;
&lt;br /&gt;
        // Check if the list contains items&lt;br /&gt;
        if (llGetListLength(inventoryNames) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            // Go through the list and output the names to owner chat&lt;br /&gt;
            integer numItems = llGetListLength(inventoryNames);&lt;br /&gt;
            string itemNames = &amp;quot;Inventory items:\n&amp;quot;;&lt;br /&gt;
            integer i;&lt;br /&gt;
            for (i = 0; i &amp;lt; numItems; ++i)&lt;br /&gt;
            {&lt;br /&gt;
                string itemName = llList2String(inventoryNames, i);&lt;br /&gt;
                itemNames += itemName + &amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            llOwnerSay(itemNames);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If nothing is found indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;The inventory of the child prim is empty or does not contains items of this inventory type&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return a list of items names by type (or INVENTORY_ALL) located in a child prim inventory.&lt;br /&gt;
List ordering is arbitrary. Successive calls may return different orders.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetInventoryItemKeys</id>
		<title>OsGetInventoryItemKeys</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetInventoryItemKeys"/>
				<updated>2024-03-29T11:59:00Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Note about order&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=list osGetInventoryItemKeys(integer type)&amp;lt;br&amp;gt;&lt;br /&gt;
list osGetLinkInventoryItemKeys(integer linkNumber, integer type)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetInventoryItemKeys&lt;br /&gt;
// This script uses the osGetInventoryKeys function to return a list of keys based on inventory type&lt;br /&gt;
&lt;br /&gt;
// Define the inventory type&lt;br /&gt;
integer INVENTORY_TYPE = INVENTORY_ALL;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the list of keys&lt;br /&gt;
        list itemUUIDs = osGetInventoryItemKeys(INVENTORY_TYPE);&lt;br /&gt;
&lt;br /&gt;
        // Check if the list contains items&lt;br /&gt;
        if (llGetListLength(itemUUIDs) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            // Go through the list and output it to owner chat&lt;br /&gt;
            integer numItems = llGetListLength(itemUUIDs);&lt;br /&gt;
            string uuidList = &amp;quot;UUIDs of the inventory items:\n&amp;quot;;&lt;br /&gt;
            integer i;&lt;br /&gt;
            for (i = 0; i &amp;lt; numItems; ++i)&lt;br /&gt;
            {&lt;br /&gt;
                string itemUUID = llList2String(itemUUIDs, i);&lt;br /&gt;
                uuidList += itemUUID + &amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            llOwnerSay(uuidList);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If the list is empty indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;Inventory is empty or not items of inventory type were found&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;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Example for osGetLinkInventoryItemKeys&lt;br /&gt;
// This script uses the osGetLinkInventoryItemKeys function to return a list of inventory items from a given child prim&lt;br /&gt;
&lt;br /&gt;
// Define the child prim&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the inventory type to fetch a list of&lt;br /&gt;
integer INVENTORY_TYPE = INVENTORY_ALL;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the list of keys for the inventory items of the child prim&lt;br /&gt;
        list itemUUIDs = osGetLinkInventoryItemKeys(CHILD_PRIM_NUMBER, INVENTORY_TYPE);&lt;br /&gt;
&lt;br /&gt;
        // Check if the list contains items&lt;br /&gt;
        if (llGetListLength(itemUUIDs) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            // Go through the list and output it to owner chat&lt;br /&gt;
            integer numItems = llGetListLength(itemUUIDs);&lt;br /&gt;
            string uuidList = &amp;quot;Inventory UUIDs:\n&amp;quot;;&lt;br /&gt;
            integer i;&lt;br /&gt;
            for (i = 0; i &amp;lt; numItems; ++i)&lt;br /&gt;
            {&lt;br /&gt;
                string itemUUID = llList2String(itemUUIDs, i);&lt;br /&gt;
                uuidList += itemUUID + &amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            llOwnerSay(uuidList);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If there are not returns indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;There are no items of that inventory type in the child prim&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;
|description=&lt;br /&gt;
Return a list of the items UUIDs by type (or INVENTORY_ALL) located in the host or child prim prim inventory.&lt;br /&gt;
List ordering is arbitrary. Successive calls may return different orders.&amp;lt;br/&amp;gt;&lt;br /&gt;
Note that unlike llGetInventoryKey, this function returns the item ID, not ID of its asset.&lt;br /&gt;
|additional_info=Added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetInventoryNames</id>
		<title>OsGetInventoryNames</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetInventoryNames"/>
				<updated>2024-03-29T11:56:59Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Note about order&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=list osGetInventoryNames(integer type)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetInventoryNames&lt;br /&gt;
// This script uses the function osGetInventoryNames to return a list of inventory items by name&lt;br /&gt;
// based on the inventory type (INVENTORY_ALL)&lt;br /&gt;
// The found item names are output to owner chat&lt;br /&gt;
&lt;br /&gt;
// Define the inventory type constant&lt;br /&gt;
integer INVENTORY_TYPE = INVENTORY_ALL;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Use osGetInventoryNames to fetch the list of inventory items by name&lt;br /&gt;
        list inventoryList = osGetInventoryNames(INVENTORY_TYPE);&lt;br /&gt;
&lt;br /&gt;
        // Check if the list is empty&lt;br /&gt;
        if (llGetListLength(inventoryList) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            // Go through the list and output each item to chat&lt;br /&gt;
            integer numItems = llGetListLength(inventoryList);&lt;br /&gt;
            string itemNames = &amp;quot;Inventory item(s):\n&amp;quot;;&lt;br /&gt;
            integer i;&lt;br /&gt;
            for (i = 0; i &amp;lt; numItems; ++i)&lt;br /&gt;
            {&lt;br /&gt;
                string itemName = llList2String(inventoryList, i);&lt;br /&gt;
                itemNames += itemName + &amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            llOwnerSay(itemNames);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If the list is empty give indication as such&lt;br /&gt;
            llOwnerSay(&amp;quot;Inventory is empty.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return a list of items names by type (or INVENTORY_ALL) located in the prim inventory.&lt;br /&gt;
List ordering is arbitrary. Successive calls may return different orders.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetInventoryItemKeys</id>
		<title>OsGetInventoryItemKeys</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetInventoryItemKeys"/>
				<updated>2024-03-19T05:47:24Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Clarified GetInventoryKey/GetInventoryItemKey difference&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=list osGetInventoryItemKeys(integer type)&amp;lt;br&amp;gt;&lt;br /&gt;
list osGetLinkInventoryItemKeys(integer linkNumber, integer type)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetInventoryItemKeys&lt;br /&gt;
// This script uses the osGetInventoryKeys function to return a list of keys based on inventory type&lt;br /&gt;
&lt;br /&gt;
// Define the inventory type&lt;br /&gt;
integer INVENTORY_TYPE = INVENTORY_ALL;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the list of keys&lt;br /&gt;
        list itemUUIDs = osGetInventoryItemKeys(INVENTORY_TYPE);&lt;br /&gt;
&lt;br /&gt;
        // Check if the list contains items&lt;br /&gt;
        if (llGetListLength(itemUUIDs) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            // Go through the list and output it to owner chat&lt;br /&gt;
            integer numItems = llGetListLength(itemUUIDs);&lt;br /&gt;
            string uuidList = &amp;quot;UUIDs of the inventory items:\n&amp;quot;;&lt;br /&gt;
            integer i;&lt;br /&gt;
            for (i = 0; i &amp;lt; numItems; ++i)&lt;br /&gt;
            {&lt;br /&gt;
                string itemUUID = llList2String(itemUUIDs, i);&lt;br /&gt;
                uuidList += itemUUID + &amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            llOwnerSay(uuidList);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If the list is empty indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;Inventory is empty or not items of inventory type were found&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Example for osGetLinkInventoryItemKeys&lt;br /&gt;
// This script uses the osGetLinkInventoryItemKeys function to return a list of inventory items from a given child prim&lt;br /&gt;
&lt;br /&gt;
// Define the child prim&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the inventory type to fetch a list of&lt;br /&gt;
integer INVENTORY_TYPE = INVENTORY_ALL;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the list of keys for the inventory items of the child prim&lt;br /&gt;
        list itemUUIDs = osGetLinkInventoryItemKeys(CHILD_PRIM_NUMBER, INVENTORY_TYPE);&lt;br /&gt;
&lt;br /&gt;
        // Check if the list contains items&lt;br /&gt;
        if (llGetListLength(itemUUIDs) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            // Go through the list and output it to owner chat&lt;br /&gt;
            integer numItems = llGetListLength(itemUUIDs);&lt;br /&gt;
            string uuidList = &amp;quot;Inventory UUIDs:\n&amp;quot;;&lt;br /&gt;
            integer i;&lt;br /&gt;
            for (i = 0; i &amp;lt; numItems; ++i)&lt;br /&gt;
            {&lt;br /&gt;
                string itemUUID = llList2String(itemUUIDs, i);&lt;br /&gt;
                uuidList += itemUUID + &amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            llOwnerSay(uuidList);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If there are not returns indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;There are no items of that inventory type in the child prim&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;
|description=&lt;br /&gt;
Return a list of the items UUIDs by type (or INVENTORY_ALL) located in the host or child prim prim inventory.&lt;br /&gt;
Note that unlike llGetInventoryKey, this function returns the item ID, not ID of its asset.&lt;br /&gt;
|additional_info=Added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetInventoryItemKey</id>
		<title>OsGetInventoryItemKey</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetInventoryItemKey"/>
				<updated>2024-03-19T05:47:21Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Clarified GetInventoryKey/GetInventoryItemKey difference&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=Script owner needs modify, copy and transfer rights&lt;br /&gt;
|delay=0&lt;br /&gt;
|function_syntax=key osGetInventoryItemKey(string name)&amp;lt;br&amp;gt;&lt;br /&gt;
key osGetLinkInventoryItemKey(integer linkNumber, string name)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// osGetInventoryItemKey Script Exemple&lt;br /&gt;
// Author: Ubit&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSay(PUBLIC_CHANNEL, &amp;quot;Touch me to see osGetInventoryItemKey usage.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer number)&lt;br /&gt;
    {&lt;br /&gt;
        key ItemKey = osGetInventoryItemKey(&amp;quot;MyItemName&amp;quot;);&lt;br /&gt;
        if (ItemKey != NULL_KEY)llSay(PUBLIC_CHANNEL, &amp;quot;Item key is &amp;quot; + osGetInventoryDesc(ItemKey));&lt;br /&gt;
        else llSay(PUBLIC_CHANNEL, &amp;quot;The item key is a NULL_KEY, item not found or owner has no rights ...&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Example for osGetLinkInventoryItemKey&lt;br /&gt;
// This script uses the osGetLinkInventoryKey function to fetch the key of a specified inventory item in a specified child prim&lt;br /&gt;
&lt;br /&gt;
// Define the child prim&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the inventory item name&lt;br /&gt;
string itemName = &amp;quot;INVENTORY_ITEM_NAME&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the key of the inventory item by name in child prim&lt;br /&gt;
        key itemUUID = osGetLinkInventoryItemKey(CHILD_PRIM_NUMBER, itemName);&lt;br /&gt;
&lt;br /&gt;
        // Check if the returned key is not NULL_KEY&lt;br /&gt;
        if (itemUUID != NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            // Output the key to owner chat&lt;br /&gt;
            llOwnerSay(&amp;quot;UUID of the inventory item '&amp;quot; + itemName + &amp;quot;': &amp;quot; + (string)itemUUID);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If the key is NULL_KEY then the item was not found&lt;br /&gt;
            llOwnerSay(&amp;quot;No inventory item named '&amp;quot; + itemName + &amp;quot;' was found&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=Returns id(key) of a inventory item within a prim inventory.&amp;lt;br&amp;gt; If name is not unique result maybe unpredictable.&amp;lt;br&amp;gt; Note that unlike llGetInventoryKey, this function returns the item ID, not ID of its asset..&amp;lt;br&amp;gt;Returns NULL_KEY if the item is not found or Owner has no rights&lt;br /&gt;
|additional_info=osGetInventoryItemKey added in 0.9.1.0 Dev, Implemented August, 16 2019 &amp;lt;br&amp;gt;&lt;br /&gt;
osGetLinkInventoryKey added in 0.9.3.0 Dev, March 2024&lt;br /&gt;
}}&lt;br /&gt;
'''See Also:'''&lt;br /&gt;
* [[osGetInventoryName]]&lt;br /&gt;
* [[osGetInventoryDesc]]&lt;br /&gt;
* [[osGetInventoryLastOwner]]&lt;br /&gt;
* [[osGetLastChangedEventKey]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Accessing_Prim_Properties</id>
		<title>Accessing Prim Properties</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Accessing_Prim_Properties"/>
				<updated>2024-03-09T20:20:38Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Writing accessors */ Added overloading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks|Accessing_Prim_Properties}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A bit of history==&lt;br /&gt;
&lt;br /&gt;
First, there was &amp;lt;u&amp;gt;llSetColor&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then, there was &amp;lt;u&amp;gt;llSetLinkColor&amp;lt;/u&amp;gt;. That was a huge step forward, since it was releaving you from the burden to script each and every prim in your hair. Don't laugh. You may still find such blatantly outdated scripts on the Hypergrid. Do us a favor. Don't propagate them. Trash them. Rewrite them.&lt;br /&gt;
&lt;br /&gt;
Later, it was recognized that the ability to access every property of a prim in a linkset from a master script was a Good Thing. It makes your application simpler to understand and to maintain, and helps reduce script count. &amp;lt;u&amp;gt;llSetLinkPrimitiveParams&amp;lt;/u&amp;gt; was born.&lt;br /&gt;
&lt;br /&gt;
Finally, OpenSimulator added it's own touch. Why not manipulate prims ''outside'' the linkset from a master script ? And we had &amp;lt;u&amp;gt;osSetPrimitiveParams.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
llGet/SetLinkPrimitiveParams, osGet/SetPrimitiveParams are the workhorse of prim manipulations. You can access every existing property of a prim from a centralized location. Streamlined, faster code. No more need for chat, or LinkedMessages between prims.&lt;br /&gt;
&lt;br /&gt;
A special note about &amp;lt;u&amp;gt;llGetObjectLinkKey&amp;lt;/u&amp;gt; : Introduced September, 2022, this function is the glue you need to access prims outside the linkset. Once you get the id of an external object (maybe using llSensor), you may call llGetObjectPrimCount (also consider osGetPrimCount which does not count sitting avatars) then iterate on llGetObjectLinkKey to get the id of each prim in the remote object. Finally, apply osGet/SetPrimitiveParams.&lt;br /&gt;
&lt;br /&gt;
The following tables tries to sort out the functions available to manipulate prims, for each addressing method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Target is script's host&amp;lt;br/&amp;gt;(prim containing the script)&lt;br /&gt;
! Target is link number&amp;lt;br/&amp;gt;(inside the linkset)&lt;br /&gt;
! Target is prim id&amp;lt;br/&amp;gt;(any prim you own in the scene)&lt;br /&gt;
|-&lt;br /&gt;
| llGetOwner || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetKey || llGetLinkKey(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetText || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetRot / llSetRot || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetScale / llSetScale || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetAlpha / llSetAlpha || llSetLinkAlpha(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetColor / llSetColor || llSetLinkColor(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetPos / llSetPos || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetObjectName / llSetObjectName || llGetLinkName(num) ||&lt;br /&gt;
|-(num)&lt;br /&gt;
| llGetObjectDesc / llSetObjectDesc || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetNumberOfSides || llGetLinkNumberOfSides(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetTexture / llSetTexture || llSetLinkTexture(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetTextureAnim || llSetLinkTextureAnim(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llParticleSystem || llLinkParticleSystem(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetPrimMediaParams || llSetLinkMedia(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectPrimCount(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectDetails(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectLinkKey(uuid,num)&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot; | &amp;quot;Universal&amp;quot; access (list of rules)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| llGet/SetPrimitiveParams || llGet/SetLinkPrimitiveParams(num) || osGet/SetPrimitiveParams(uuid)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example : A replicator==&lt;br /&gt;
Put this script in a box, along with a single-prim object named &amp;quot;seed&amp;quot;. It will iterate on each prim of a named object you own in the scene, then rez an identical prim at a given offset, perfectly replicating the source object, even meshes. Sleeps are here for demo. Remove them for speedy replication. CLEANUP option will get rid of rezed prims.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string targetName = &amp;quot;Example&amp;quot;; // The name of an object you own in the scene&lt;br /&gt;
string seedName = &amp;quot;seed&amp;quot;;      // Name of the seed prim &lt;br /&gt;
vector offset = &amp;lt;5,0,0&amp;gt;;       // Offset of the dupicata&lt;br /&gt;
&lt;br /&gt;
integer primcnt;&lt;br /&gt;
integer primnum;&lt;br /&gt;
key rootKey;&lt;br /&gt;
&lt;br /&gt;
integer TupleLength (integer param)&lt;br /&gt;
{&lt;br /&gt;
    if (param == PRIM_GLOW)       return 1;&lt;br /&gt;
    if (param == PRIM_COLOR)      return 2;&lt;br /&gt;
    if (param == PRIM_TEXGEN)     return 1;&lt;br /&gt;
    if (param == PRIM_TEXTURE)    return 4;&lt;br /&gt;
    if (param == PRIM_NORMAL)     return 4;&lt;br /&gt;
    if (param == PRIM_SPECULAR)   return 7;&lt;br /&gt;
    if (param == PRIM_BUMP_SHINY) return 2;&lt;br /&gt;
    if (param == PRIM_FULLBRIGHT) return 1;&lt;br /&gt;
&lt;br /&gt;
    return 0; // Not a by-side parameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list IterateFaces (list p, integer param)&lt;br /&gt;
{&lt;br /&gt;
    integer tuplelength = TupleLength (param);&lt;br /&gt;
    integer numsides =  llGetListLength(p) / tuplelength;&lt;br /&gt;
&lt;br /&gt;
    // Une seule face, retourner [ param, ALL_SIDES, p ]&lt;br /&gt;
    if (numsides == 1) return [ param, ALL_SIDES ] + p;&lt;br /&gt;
&lt;br /&gt;
    list result = [ ];&lt;br /&gt;
    for (integer s=0; s&amp;lt;numsides; s++) {&lt;br /&gt;
        list tuple = llList2List (p, s*tuplelength, (s+1)*tuplelength-1);&lt;br /&gt;
        result += [ param, s ] + tuple;&lt;br /&gt;
    }  &lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CopyParams (key srcprim, key dstprim, integer param) {&lt;br /&gt;
    if (TupleLength(param) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param ]);&lt;br /&gt;
        if (param == PRIM_POSITION) p = [ llList2Vector (p,0) + offset ];&lt;br /&gt;
        osSetPrimitiveParams (dstprim, [ param ] + p);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param, ALL_SIDES ]);&lt;br /&gt;
        p = IterateFaces (p, param);&lt;br /&gt;
        osSetPrimitiveParams (dstprim, p);&lt;br /&gt;
    }&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
RezAPrim ()&lt;br /&gt;
{&lt;br /&gt;
    if (++primnum &amp;gt; primcnt) llResetScript();&lt;br /&gt;
    llRezObject (seedName, llGetPos()+&amp;lt;0,0,1&amp;gt;, ZERO_VECTOR, ZERO_ROTATION, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PrimRezed (key dstkey)&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay (&amp;quot;Processing link &amp;quot;+(string)primnum+&amp;quot; of &amp;quot;+(string)primcnt);&lt;br /&gt;
    key srckey = llGetObjectLinkKey (rootKey, primnum);&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
    &lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_POSITION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_ROTATION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TYPE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SIZE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_COLOR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXTURE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_NORMAL);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SPECULAR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXGEN);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_BUMP_SHINY);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_FULLBRIGHT);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_PHYSICS_SHAPE_TYPE);&lt;br /&gt;
&lt;br /&gt;
    RezAPrim ();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
key OwnerOf (key id)&lt;br /&gt;
{&lt;br /&gt;
    list l = llGetObjectDetails (id, [ OBJECT_OWNER ]);&lt;br /&gt;
    return llList2Key (l, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;READY&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start (integer n)&lt;br /&gt;
    {&lt;br /&gt;
        state dialog;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer dlgchan = 99;&lt;br /&gt;
integer dlglistener;&lt;br /&gt;
state dialog&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;LISTENING&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llDialog (llGetOwner(), &amp;quot;Action?&amp;quot;, [&amp;quot;CLEANUP&amp;quot;, &amp;quot;REPLICATE&amp;quot;], dlgchan);&lt;br /&gt;
        dlglistener = llListen (dlgchan, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent (10);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen (integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == &amp;quot;CLEANUP&amp;quot;)   state cleanup;&lt;br /&gt;
        if (msg == &amp;quot;REPLICATE&amp;quot;) state replicate;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer ()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_exit ()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent (0.0);&lt;br /&gt;
        llListenRemove (dlglistener);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state cleanup&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;CLEANUP&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (seedName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        llOwnerSay (&amp;quot;Garbage collecting &amp;quot;+(string)num);&lt;br /&gt;
        for (integer i=0; i&amp;lt;num; i++) osDie (llDetectedKey(i));&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;All clean.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state replicate&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;REPLICATE&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (targetName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        rootKey = llDetectedKey (0);&lt;br /&gt;
&lt;br /&gt;
        if (OwnerOf(rootKey) != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay (&amp;quot;I don't own &amp;quot;+targetName+&amp;quot;. Aborting.&amp;quot;);&lt;br /&gt;
            state default;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        primcnt = llGetObjectPrimCount (rootKey);&lt;br /&gt;
        primnum = 0; RezAPrim ();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;Object &amp;quot;+targetName+&amp;quot; was not found.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    object_rez (key uuid) {&lt;br /&gt;
        PrimRezed (uuid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Writing accessors==&lt;br /&gt;
&lt;br /&gt;
The Get/SetPrimitiveParams family of functions is awesomely powerful. It is also [https://wiki.secondlife.com/wiki/LlSetLinkPrimitiveParamsFast quite arcane to write and decipher]. A way to get rid of these long lists of parameters cluttering your code is to encapsulate Get/SetPrimitiveParams in individual get/set accessors, actually 'filling the blanks' in the above table. Although this is much pleasant to read, note that doing so may hurt performance when you want to change many properties at once, which SetPrimitiveParams can do in one call. The following library is offered as an example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Index of properties for PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TYPE      = 0;&lt;br /&gt;
integer INDEX_HOLE      = 1;&lt;br /&gt;
integer INDEX_CUT       = 2;&lt;br /&gt;
integer INDEX_HOLLOW    = 3;&lt;br /&gt;
integer INDEX_TWIST     = 4;&lt;br /&gt;
integer INDEX_TAPER     = 5;&lt;br /&gt;
integer INDEX_SHEAR     = 6;&lt;br /&gt;
&lt;br /&gt;
// Index of properties for PRIM_TEXTURE&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TEXTURE   = 0;&lt;br /&gt;
integer INDEX_REPEATS   = 1;&lt;br /&gt;
integer INDEX_OFFSETS   = 2;&lt;br /&gt;
integer INDEX_ROTATION  = 3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//                client        script&lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
//  Taper   | -1.0 0  +1.0  |  2.0   0.0 | &lt;br /&gt;
//  Shear   | -0.5 0  +0.5  | -0.5  +0.5 |&lt;br /&gt;
//  Twist   | -180 0  +180  | -1.0  +1.0 | &lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Set accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
mySetLinkName (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_NAME, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkDesc (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_DESC, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkText (integer link, string text, vector color) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXT, text, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkColor (integer link, vector color, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_COLOR, face, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkBright (integer link, integer bright, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_FULLBRIGHT, face, bright]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkGlow (integer link, float glow, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_GLOW, face, glow]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Les 3 suivants ne marchent pas pour ALL_SIDES&lt;br /&gt;
&lt;br /&gt;
mySetLinkTexture (integer link, key texture, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [texture], INDEX_TEXTURE, INDEX_TEXTURE);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRepeat (integer link, vector repeat, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [repeat], INDEX_REPEATS, INDEX_REPEATS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkOffset (integer link, vector offset, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [offset], INDEX_OFFSETS, INDEX_OFFSETS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkPos (integer link, vector pos) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_POS_LOCAL, pos]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRot (integer link, rotation rot) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_ROT_LOCAL, rot]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkSize (integer link, vector size) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_SIZE, size]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkCut (integer link, vector cut) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [cut], INDEX_CUT, INDEX_CUT);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTwist (integer link, vector twist) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [twist], INDEX_TWIST, INDEX_TWIST);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTaper (integer link, vector taper) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [taper], INDEX_TAPER, INDEX_TAPER);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkShear (integer link, vector shear) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [shear], INDEX_SHEAR, INDEX_SHEAR);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkHollow (integer link, float hollow) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [hollow], INDEX_HOLLOW, INDEX_HOLLOW);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Get accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
string myGetLinkName (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_NAME]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkDesc (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_DESC]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkText (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXT]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkColor (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_COLOR, face]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer myGetLinkBright (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_FULLBRIGHT, face]);&lt;br /&gt;
    return llList2Integer (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkGlow (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_GLOW, face]);&lt;br /&gt;
    return llList2Float (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key myGetLinkTexture (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Key(l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkRepeat (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkOffset (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkPos (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_POS_LOCAL]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkSize (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_SIZE]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkCut (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_CUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTwist (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TWIST);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTaper (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TAPER);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkShear (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_SHEAR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkHollow (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Float (l, INDEX_HOLLOW);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
LL accessors can be effortlessly converted to OS versions. Just change prim_num to prim_key in argument list, and pick the right os/ll function. Finally, you can use function overloading to write universal routines :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
SetPrimColor (key prim, vector color, integer side)&lt;br /&gt;
{&lt;br /&gt;
    osSetPrimitiveParams (prim, [PRIM_COLOR, side, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SetPrimColor (integer prim, vector color, integer side)&lt;br /&gt;
{&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (prim, [PRIM_COLOR, side, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
[[Category:Scripts]]&lt;br /&gt;
[[Category:OSSL]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Accessing_Prim_Properties/de</id>
		<title>Accessing Prim Properties/de</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Accessing_Prim_Properties/de"/>
				<updated>2024-03-03T17:16:18Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Beispiel: Ein Replikator */ missing state transition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks|Accessing_Prim_Properties}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Zugreifen auf Prim Eigenschaften =&lt;br /&gt;
&lt;br /&gt;
==Ein wenig Geschichte==&lt;br /&gt;
&lt;br /&gt;
Zuerst gab es &amp;lt;u&amp;gt;llSetColor&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dann gab es &amp;lt;u&amp;gt;llSetLinkColor&amp;lt;/u&amp;gt;. Das war ein großer Fortschritt, da es Sie von der Last befreit hat, jedes einzelne Prim in Ihrem Haar zu skripten. Lache nicht. Möglicherweise finden Sie solche offensichtlich veralteten Skripte immer noch auf dem Hypergrid. Tun Sie uns einen Gefallen. Verbreiten Sie sie nicht. Mach sie kaputt. Schreiben Sie sie um.&lt;br /&gt;
&lt;br /&gt;
Später erkannte man, dass die Möglichkeit, über ein Masterskript auf jede Eigenschaft eines Prims in einem Linkset zuzugreifen, eine gute Sache war. Dadurch wird Ihre Anwendung einfacher zu verstehen und zu warten und die Anzahl der Skripte wird reduziert. &amp;lt;u&amp;gt;llSetLinkPrimitiveParams&amp;lt;/u&amp;gt; war geboren.&lt;br /&gt;
&lt;br /&gt;
Schließlich hat OpenSimulator seine eigene Note hinzugefügt. Warum nicht Prims ''outside'' des Linkset von einem Masterskript aus manipulieren? Und wir hatten &amp;lt;u&amp;gt;osSetPrimitiveParams.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
llGet/SetLinkPrimitiveParams, osGet/SetPrimitiveParams sind das Arbeitstier der Prim-Manipulationen. Sie können von einem zentralen Ort aus auf alle vorhandenen Eigenschaften eines Prims zugreifen. Optimierter, schnellerer Code. Kein Chat oder LinkedMessages zwischen Prims mehr erforderlich.&lt;br /&gt;
&lt;br /&gt;
Ein besonderer Hinweis zu &amp;lt;u&amp;gt;llGetObjectLinkKey&amp;lt;/u&amp;gt; : Diese Funktion wurde im September 2022 eingeführt und ist der Kleber, den Sie benötigen, um auf Prims außerhalb des Linksets zuzugreifen. Sobald Sie die ID eines externen Objekts erhalten haben (vielleicht mit llSensor), können Sie llGetObjectPrimCount aufrufen (bedenken Sie auch osGetPrimCount, das sitzende Avatare nicht zählt) und dann mit llGetObjectLinkKey iterieren, um die ID jedes Prims im Remote-Objekt zu erhalten. Wenden Sie abschließend osGet/SetPrimitiveParams an.&lt;br /&gt;
&lt;br /&gt;
In den folgenden Tabellen wird versucht, die zur Manipulation von Prims verfügbaren Funktionen für jede Adressierungsmethode zu sortieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Ziel ist der Host des Skripts&amp;lt;br/&amp;gt;(Prim, der das Skript enthält)&lt;br /&gt;
! Ziel ist die Linknummer&amp;lt;br/&amp;gt;(innerhalb des Linksets)&lt;br /&gt;
! Ziel ist die Prim-ID&amp;lt;br/&amp;gt;(jedes Prim, das Sie in der Szene besitzen)&lt;br /&gt;
|-&lt;br /&gt;
| llGetOwner || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetKey || llGetLinkKey(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetText || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetRot / llSetRot || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetScale / llSetScale || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetAlpha / llSetAlpha || llSetLinkAlpha(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetColor / llSetColor || llSetLinkColor(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetPos / llSetPos || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetObjectName / llSetObjectName || llGetLinkName(num) ||&lt;br /&gt;
|-(num)&lt;br /&gt;
| llGetObjectDesc / llSetObjectDesc || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetNumberOfSides || llGetLinkNumberOfSides(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetTexture / llSetTexture || llSetLinkTexture(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetTextureAnim || llSetLinkTextureAnim(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llParticleSystem || llLinkParticleSystem(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetPrimMediaParams || llSetLinkMedia(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectPrimCount(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectDetails(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectLinkKey(uuid,num)&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot; | &amp;quot;Universeller“ Zugriff (Regelliste)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| llGet/SetPrimitiveParams || llGet/SetLinkPrimitiveParams(num) || osGet/SetPrimitiveParams(uuid)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Beispiel: Ein Replikator==&lt;br /&gt;
Fügen Sie dieses Skript zusammen mit einem Single-Prim-Objekt namens „seed“ in eine Box ein. &lt;br /&gt;
&lt;br /&gt;
Es iteriert auf jedem Prim eines benannten Objekts, das Sie in der Szene besitzen, und rezerrt dann ein identisches Prim mit einem bestimmten Offset, &lt;br /&gt;
&lt;br /&gt;
wodurch das Quellobjekt, sogar die Netze, perfekt repliziert wird. Sleeps sind zur Demo hier. &lt;br /&gt;
&lt;br /&gt;
Entfernen Sie sie für eine schnelle Replikation. Mit der CLEANUP-Option werden gelöschte Prims entfernt.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string targetName = &amp;quot;Example&amp;quot;; // Name des Zielobjekts, das dupliziert werden soll&lt;br /&gt;
string seedName = &amp;quot;seed&amp;quot;;      // Name des Ausgangs-Prims, der dupliziert werden soll&lt;br /&gt;
vector offset = &amp;lt;5,0,0&amp;gt;;       // Versatz für die Duplikate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer primcnt;                // Anzahl der Prims im Wurzelobjekt&lt;br /&gt;
integer primnum;                // Aktuelle Nummer des zu kopierenden Prims&lt;br /&gt;
key rootKey;                    // Schlüssel des Wurzelobjekts&lt;br /&gt;
&lt;br /&gt;
// Funktion zur Bestimmung der Länge eines Tupels basierend auf dem Parameter&lt;br /&gt;
integer TupleLength (integer param)&lt;br /&gt;
{&lt;br /&gt;
    if (param == PRIM_GLOW)       return 1;&lt;br /&gt;
    if (param == PRIM_COLOR)      return 2;&lt;br /&gt;
    if (param == PRIM_TEXGEN)     return 1;&lt;br /&gt;
    if (param == PRIM_TEXTURE)    return 4;&lt;br /&gt;
    if (param == PRIM_NORMAL)     return 4;&lt;br /&gt;
    if (param == PRIM_SPECULAR)   return 7;&lt;br /&gt;
    if (param == PRIM_BUMP_SHINY) return 2;&lt;br /&gt;
    if (param == PRIM_FULLBRIGHT) return 1;&lt;br /&gt;
&lt;br /&gt;
    return 0; // Not a by-side parameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion zum Iterieren durch die Seiten (Faces) eines Prims und Rückgabe der Parametertupel für jede Seite&lt;br /&gt;
list IterateFaces (list p, integer param)&lt;br /&gt;
{&lt;br /&gt;
    integer tuplelength = TupleLength (param);&lt;br /&gt;
    integer numsides =  llGetListLength(p) / tuplelength;&lt;br /&gt;
&lt;br /&gt;
    // Une seule face, retourner [ param, ALL_SIDES, p ]&lt;br /&gt;
    if (numsides == 1) return [ param, ALL_SIDES ] + p;&lt;br /&gt;
&lt;br /&gt;
    list result = [ ];&lt;br /&gt;
    for (integer s=0; s&amp;lt;numsides; s++) {&lt;br /&gt;
        list tuple = llList2List (p, s*tuplelength, (s+1)*tuplelength-1);&lt;br /&gt;
        result += [ param, s ] + tuple;&lt;br /&gt;
    }  &lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion zum Kopieren der Parameter eines Prims von einer Quelle zu einem Ziel&lt;br /&gt;
CopyParams (key srcprim, key dstprim, integer param) {&lt;br /&gt;
    if (TupleLength(param) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param ]);&lt;br /&gt;
        if (param == PRIM_POSITION) p = [ llList2Vector (p,0) + offset ];&lt;br /&gt;
        osSetPrimitiveParams (dstprim, [ param ] + p);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param, ALL_SIDES ]);&lt;br /&gt;
        p = IterateFaces (p, param);&lt;br /&gt;
        osSetPrimitiveParams (dstprim, p);&lt;br /&gt;
    }&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion zum Erstellen eines neuen Prims&lt;br /&gt;
RezAPrim ()&lt;br /&gt;
{&lt;br /&gt;
    if (++primnum &amp;gt; primcnt) llResetScript();&lt;br /&gt;
    llRezObject (seedName, llGetPos()+&amp;lt;0,0,1&amp;gt;, ZERO_VECTOR, ZERO_ROTATION, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion, die aufgerufen wird, wenn ein Prim rezisiert wurde&lt;br /&gt;
// Kopiert die Parameter des ursprünglichen Prims auf den rezisierten Prim&lt;br /&gt;
PrimRezed (key dstkey)&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay (&amp;quot;Processing link &amp;quot;+(string)primnum+&amp;quot; of &amp;quot;+(string)primcnt);&lt;br /&gt;
    key srckey = llGetObjectLinkKey (rootKey, primnum);&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
    &lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_POSITION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_ROTATION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TYPE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SIZE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_COLOR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXTURE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_NORMAL);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SPECULAR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXGEN);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_BUMP_SHINY);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_FULLBRIGHT);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_PHYSICS_SHAPE_TYPE);&lt;br /&gt;
&lt;br /&gt;
    RezAPrim ();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion zum Abrufen des Besitzers eines Objekts anhand der Objekt-ID&lt;br /&gt;
key OwnerOf (key id)&lt;br /&gt;
{&lt;br /&gt;
    list l = llGetObjectDetails (id, [ OBJECT_OWNER ]);&lt;br /&gt;
    return llList2Key (l, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Initialisierung des Skripts&lt;br /&gt;
        llSetText (&amp;quot;READY&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start (integer n)&lt;br /&gt;
    {&lt;br /&gt;
        // Wenn das Objekt berührt wird, wechselt der Zustand in den Dialog-Modus&lt;br /&gt;
        state dialog;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer dlgchan = 99;&lt;br /&gt;
integer dlglistener;&lt;br /&gt;
state dialog&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Initialisierung des Dialog-Modus&lt;br /&gt;
        llSetText (&amp;quot;LISTENING&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llDialog (llGetOwner(), &amp;quot;Action?&amp;quot;, [&amp;quot;CLEANUP&amp;quot;, &amp;quot;REPLICATE&amp;quot;], dlgchan);&lt;br /&gt;
        dlglistener = llListen (dlgchan, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent (10);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Abhören von Dialognachrichten und Auslösen entsprechender Aktionen&lt;br /&gt;
    listen (integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == &amp;quot;CLEANUP&amp;quot;)   state cleanup;&lt;br /&gt;
        if (msg == &amp;quot;REPLICATE&amp;quot;) state replicate;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer ()&lt;br /&gt;
    {&lt;br /&gt;
        // Timer-Ereignis zum Zurückkehren in den Standardzustand nach einer bestimmten Zeit&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_exit ()&lt;br /&gt;
    {&lt;br /&gt;
        // Aufräumen beim Verlassen des Dialog-Modus&lt;br /&gt;
        llSetTimerEvent (0.0);&lt;br /&gt;
        llListenRemove (dlglistener);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state cleanup&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Zustand für die Bereinigung von Prims&lt;br /&gt;
        llSetText (&amp;quot;CLEANUP&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (seedName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        // Ereignis, das ausgelöst wird, wenn Sensoren aktiv sind&lt;br /&gt;
        llOwnerSay (&amp;quot;Garbage collecting &amp;quot;+(string)num);&lt;br /&gt;
        for (integer i=0; i&amp;lt;num; i++) osDie (llDetectedKey(i));&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        // Ereignis, das ausgelöst wird, wenn keine Sensoren aktiv sind&lt;br /&gt;
        llOwnerSay (&amp;quot;All clean.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state replicate&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Zustand für die Replikation von Prims&lt;br /&gt;
        llSetText (&amp;quot;REPLICATE&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (targetName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        // Ereignis, das ausgelöst wird, wenn Sensoren aktiv sind&lt;br /&gt;
        rootKey = llDetectedKey (0);&lt;br /&gt;
&lt;br /&gt;
        if (OwnerOf(rootKey) != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay (&amp;quot;I don't own &amp;quot;+targetName+&amp;quot;. Aborting.&amp;quot;);&lt;br /&gt;
            state default;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        primcnt = llGetObjectPrimCount (rootKey);&lt;br /&gt;
        primnum = 0; RezAPrim ();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        // Ereignis, das ausgelöst wird, wenn keine Sensoren aktiv sind&lt;br /&gt;
        llOwnerSay (&amp;quot;Object &amp;quot;+targetName+&amp;quot; was not found.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    object_rez (key uuid) {&lt;br /&gt;
        // Ereignis, das ausgelöst wird, wenn ein Objekt rezisiert wird&lt;br /&gt;
        PrimRezed (uuid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schreibzugriffsmethoden==&lt;br /&gt;
&lt;br /&gt;
Die Funktionsfamilie Get/SetPrimitiveParams ist unglaublich leistungsstark. &lt;br /&gt;
&lt;br /&gt;
Es ist auch [https://wiki.secondlife.com/wiki/LlSetLinkPrimitiveParamsFast ziemlich geheimnisvoll zu schreiben und zu entschlüsseln]. &lt;br /&gt;
&lt;br /&gt;
Eine Möglichkeit, diese langen Parameterlisten loszuwerden, die Ihren Code überladen, besteht darin, &lt;br /&gt;
&lt;br /&gt;
Get/SetPrimitiveParams in einzelne get/set-Accessoren zu kapseln und so tatsächlich die Lücken in der obigen Tabelle zu füllen. &lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr angenehm zu lesen ist, beachten Sie, dass dies die Leistung beeinträchtigen kann, &lt;br /&gt;
&lt;br /&gt;
wenn Sie viele Eigenschaften auf einmal ändern möchten, was SetPrimitiveParams in einem Aufruf tun kann. &lt;br /&gt;
&lt;br /&gt;
Als Beispiel wird die folgende Bibliothek angeboten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Indizes der Eigenschaften für PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TYPE      = 0; // Typ&lt;br /&gt;
integer INDEX_HOLE      = 1; // Lochgröße&lt;br /&gt;
integer INDEX_CUT       = 2; // Schnittgröße&lt;br /&gt;
integer INDEX_HOLLOW    = 3; // Leeregröße&lt;br /&gt;
integer INDEX_TWIST     = 4; // Verdrehung&lt;br /&gt;
integer INDEX_TAPER     = 5; // Zulauf&lt;br /&gt;
integer INDEX_SHEAR     = 6; // Scherung&lt;br /&gt;
&lt;br /&gt;
// Indizes der Eigenschaften für PRIM_TEXTURE&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TEXTURE   = 0; // Textur&lt;br /&gt;
integer INDEX_REPEATS   = 1; // Wiederholungen&lt;br /&gt;
integer INDEX_OFFSETS   = 2; // Versatz&lt;br /&gt;
integer INDEX_ROTATION  = 3; // Rotation&lt;br /&gt;
&lt;br /&gt;
// Indizes der Eigenschaften für PRIM_COLOR &lt;br /&gt;
//                client        script&lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
//  Taper   | -1.0 0  +1.0  |  2.0   0.0 | &lt;br /&gt;
//  Shear   | -0.5 0  +0.5  | -0.5  +0.5 |&lt;br /&gt;
//  Twist   | -180 0  +180  | -1.0  +1.0 | &lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Set-Methoden&lt;br /&gt;
 &lt;br /&gt;
mySetLinkName (integer link, string text) {&lt;br /&gt;
    // Setzt den Namen eines Links&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_NAME, text]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkDesc (integer link, string text) {&lt;br /&gt;
    // Setzt die Beschreibung eines Links&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_DESC, text]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkText (integer link, string text, vector color) {&lt;br /&gt;
    // Setzt den Text eines Links mit Farbe&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXT, text, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkColor (integer link, vector color, integer face) {&lt;br /&gt;
    // Setzt die Farbe eines Links für eine bestimmte Seite&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_COLOR, face, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkBright (integer link, integer bright, integer face) {&lt;br /&gt;
    // Setzt die Helligkeit eines Links für eine bestimmte Seite&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_FULLBRIGHT, face, bright]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkGlow (integer link, float glow, integer face) {&lt;br /&gt;
    // Setzt das Leuchten eines Links für eine bestimmte Seite&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_GLOW, face, glow]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Die folgenden drei funktionieren nicht für ALL_SIDES&lt;br /&gt;
 &lt;br /&gt;
mySetLinkTexture (integer link, key texture, integer face) {&lt;br /&gt;
    // Setzt die Textur eines Links für eine bestimmte Seite&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [texture], INDEX_TEXTURE, INDEX_TEXTURE);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkRepeat (integer link, vector repeat, integer face) {&lt;br /&gt;
    // Setzt die Texturwiederholungen eines Links für eine bestimmte Seite&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [repeat], INDEX_REPEATS, INDEX_REPEATS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkOffset (integer link, vector offset, integer face) {&lt;br /&gt;
    // Setzt den Texturversatz eines Links für eine bestimmte Seite&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [offset], INDEX_OFFSETS, INDEX_OFFSETS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkPos (integer link, vector pos) {&lt;br /&gt;
    // Setzt die Position eines Links relativ zum Elternobjekt&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_POS_LOCAL, pos]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkRot (integer link, rotation rot) {&lt;br /&gt;
    // Setzt die Rotation eines Links relativ zum Elternobjekt&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_ROT_LOCAL, rot]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkSize (integer link, vector size) {&lt;br /&gt;
    // Setzt die Größe eines Links&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_SIZE, size]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkCut (integer link, vector cut) {&lt;br /&gt;
    // Setzt den Schnitt eines Links (nur für Boxen, Zylinder und Prismen)&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [cut], INDEX_CUT, INDEX_CUT);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkTwist (integer link, vector twist) {&lt;br /&gt;
    // Setzt die Verdrehung eines Links (nur für Zylinder und Prismen)&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [twist], INDEX_TWIST, INDEX_TWIST);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkTaper (integer link, vector taper) {&lt;br /&gt;
    // Setzt den Zulauf eines Links (nur für Zylinder und Prismen)&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [taper], INDEX_TAPER, INDEX_TAPER);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkShear (integer link, vector shear) {&lt;br /&gt;
    // Setzt die Scherung eines Links (nur für Zylinder und Prismen)&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [shear], INDEX_SHEAR, INDEX_SHEAR);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mySetLinkHollow (integer link, float hollow) {&lt;br /&gt;
    // Setzt die Hohlheit eines Links (nur für Boxen, Zylinder und Prismen)&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [hollow], INDEX_HOLLOW, INDEX_HOLLOW);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Get-Methoden&lt;br /&gt;
 &lt;br /&gt;
string myGetLinkName (integer link) {&lt;br /&gt;
    // Gibt den Namen eines Links zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_NAME]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
string myGetLinkDesc (integer link) {&lt;br /&gt;
    // Gibt die Beschreibung eines Links zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_DESC]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
string myGetLinkText (integer link) {&lt;br /&gt;
    // Gibt den Text eines Links zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXT]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector myGetLinkColor (integer link, integer face) {&lt;br /&gt;
     // Gibt die Farbe eines Links für eine bestimmte Seite zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_COLOR, face]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
integer myGetLinkBright (integer link, integer face) {&lt;br /&gt;
    // Gibt die Helligkeit eines Links für eine bestimmte Seite zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_FULLBRIGHT, face]);&lt;br /&gt;
    return llList2Integer (l,0);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
float myGetLinkGlow (integer link, integer face) {&lt;br /&gt;
    // Gibt das Leuchten eines Links für eine bestimmte Seite zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_GLOW, face]);&lt;br /&gt;
    return llList2Float (l,0);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
key myGetLinkTexture (integer link, integer face) {&lt;br /&gt;
    // Gibt die Textur eines Links für eine bestimmte Seite zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Key(l,0);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector myGetLinkRepeat (integer link, integer face) {&lt;br /&gt;
    // Gibt die Texturwiederholungen eines Links für eine bestimmte Seite zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,1);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector myGetLinkOffset (integer link, integer face) {&lt;br /&gt;
    // Gibt den Texturversatz eines Links für eine bestimmte Seite zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,2);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector myGetLinkPos (integer link) {&lt;br /&gt;
    // Gibt die Position eines Links relativ zum Elternobjekt zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_POS_LOCAL]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector myGetLinkSize (integer link) {&lt;br /&gt;
    // Gibt die Größe eines Links zurück&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_SIZE]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector myGetLinkCut (integer link) {&lt;br /&gt;
    // Gibt den Schnitt eines Links zurück (nur für Boxen, Zylinder und Prismen)&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_CUT);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector myGetLinkTwist (integer link) {&lt;br /&gt;
    // Gibt die Verdrehung eines Links zurück (nur für Zylinder und Prismen)&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TWIST);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector myGetLinkTaper (integer link) {&lt;br /&gt;
    // Gibt den Zulauf eines Links zurück (nur für Zylinder und Prismen)&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TAPER);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
vector myGetLinkShear (integer link) {&lt;br /&gt;
    // Gibt die Scherung eines Links zurück (nur für Zylinder und Prismen)&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_SHEAR);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
float myGetLinkHollow (integer link) {&lt;br /&gt;
    // Gibt die Hohlheit eines Links zurück (nur für Boxen, Zylinder und Prismen)&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Float (l, INDEX_HOLLOW);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
[[Category:German Translations]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Accessing_Prim_Properties</id>
		<title>Accessing Prim Properties</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Accessing_Prim_Properties"/>
				<updated>2024-03-03T17:14:47Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Example : A replicator */ missing state transition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks|Accessing_Prim_Properties}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A bit of history==&lt;br /&gt;
&lt;br /&gt;
First, there was &amp;lt;u&amp;gt;llSetColor&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then, there was &amp;lt;u&amp;gt;llSetLinkColor&amp;lt;/u&amp;gt;. That was a huge step forward, since it was releaving you from the burden to script each and every prim in your hair. Don't laugh. You may still find such blatantly outdated scripts on the Hypergrid. Do us a favor. Don't propagate them. Trash them. Rewrite them.&lt;br /&gt;
&lt;br /&gt;
Later, it was recognized that the ability to access every property of a prim in a linkset from a master script was a Good Thing. It makes your application simpler to understand and to maintain, and helps reduce script count. &amp;lt;u&amp;gt;llSetLinkPrimitiveParams&amp;lt;/u&amp;gt; was born.&lt;br /&gt;
&lt;br /&gt;
Finally, OpenSimulator added it's own touch. Why not manipulate prims ''outside'' the linkset from a master script ? And we had &amp;lt;u&amp;gt;osSetPrimitiveParams.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
llGet/SetLinkPrimitiveParams, osGet/SetPrimitiveParams are the workhorse of prim manipulations. You can access every existing property of a prim from a centralized location. Streamlined, faster code. No more need for chat, or LinkedMessages between prims.&lt;br /&gt;
&lt;br /&gt;
A special note about &amp;lt;u&amp;gt;llGetObjectLinkKey&amp;lt;/u&amp;gt; : Introduced September, 2022, this function is the glue you need to access prims outside the linkset. Once you get the id of an external object (maybe using llSensor), you may call llGetObjectPrimCount (also consider osGetPrimCount which does not count sitting avatars) then iterate on llGetObjectLinkKey to get the id of each prim in the remote object. Finally, apply osGet/SetPrimitiveParams.&lt;br /&gt;
&lt;br /&gt;
The following tables tries to sort out the functions available to manipulate prims, for each addressing method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Target is script's host&amp;lt;br/&amp;gt;(prim containing the script)&lt;br /&gt;
! Target is link number&amp;lt;br/&amp;gt;(inside the linkset)&lt;br /&gt;
! Target is prim id&amp;lt;br/&amp;gt;(any prim you own in the scene)&lt;br /&gt;
|-&lt;br /&gt;
| llGetOwner || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetKey || llGetLinkKey(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetText || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetRot / llSetRot || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetScale / llSetScale || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetAlpha / llSetAlpha || llSetLinkAlpha(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetColor / llSetColor || llSetLinkColor(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetPos / llSetPos || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetObjectName / llSetObjectName || llGetLinkName(num) ||&lt;br /&gt;
|-(num)&lt;br /&gt;
| llGetObjectDesc / llSetObjectDesc || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetNumberOfSides || llGetLinkNumberOfSides(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetTexture / llSetTexture || llSetLinkTexture(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetTextureAnim || llSetLinkTextureAnim(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llParticleSystem || llLinkParticleSystem(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetPrimMediaParams || llSetLinkMedia(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectPrimCount(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectDetails(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectLinkKey(uuid,num)&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot; | &amp;quot;Universal&amp;quot; access (list of rules)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| llGet/SetPrimitiveParams || llGet/SetLinkPrimitiveParams(num) || osGet/SetPrimitiveParams(uuid)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example : A replicator==&lt;br /&gt;
Put this script in a box, along with a single-prim object named &amp;quot;seed&amp;quot;. It will iterate on each prim of a named object you own in the scene, then rez an identical prim at a given offset, perfectly replicating the source object, even meshes. Sleeps are here for demo. Remove them for speedy replication. CLEANUP option will get rid of rezed prims.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string targetName = &amp;quot;Example&amp;quot;; // The name of an object you own in the scene&lt;br /&gt;
string seedName = &amp;quot;seed&amp;quot;;      // Name of the seed prim &lt;br /&gt;
vector offset = &amp;lt;5,0,0&amp;gt;;       // Offset of the dupicata&lt;br /&gt;
&lt;br /&gt;
integer primcnt;&lt;br /&gt;
integer primnum;&lt;br /&gt;
key rootKey;&lt;br /&gt;
&lt;br /&gt;
integer TupleLength (integer param)&lt;br /&gt;
{&lt;br /&gt;
    if (param == PRIM_GLOW)       return 1;&lt;br /&gt;
    if (param == PRIM_COLOR)      return 2;&lt;br /&gt;
    if (param == PRIM_TEXGEN)     return 1;&lt;br /&gt;
    if (param == PRIM_TEXTURE)    return 4;&lt;br /&gt;
    if (param == PRIM_NORMAL)     return 4;&lt;br /&gt;
    if (param == PRIM_SPECULAR)   return 7;&lt;br /&gt;
    if (param == PRIM_BUMP_SHINY) return 2;&lt;br /&gt;
    if (param == PRIM_FULLBRIGHT) return 1;&lt;br /&gt;
&lt;br /&gt;
    return 0; // Not a by-side parameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list IterateFaces (list p, integer param)&lt;br /&gt;
{&lt;br /&gt;
    integer tuplelength = TupleLength (param);&lt;br /&gt;
    integer numsides =  llGetListLength(p) / tuplelength;&lt;br /&gt;
&lt;br /&gt;
    // Une seule face, retourner [ param, ALL_SIDES, p ]&lt;br /&gt;
    if (numsides == 1) return [ param, ALL_SIDES ] + p;&lt;br /&gt;
&lt;br /&gt;
    list result = [ ];&lt;br /&gt;
    for (integer s=0; s&amp;lt;numsides; s++) {&lt;br /&gt;
        list tuple = llList2List (p, s*tuplelength, (s+1)*tuplelength-1);&lt;br /&gt;
        result += [ param, s ] + tuple;&lt;br /&gt;
    }  &lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CopyParams (key srcprim, key dstprim, integer param) {&lt;br /&gt;
    if (TupleLength(param) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param ]);&lt;br /&gt;
        if (param == PRIM_POSITION) p = [ llList2Vector (p,0) + offset ];&lt;br /&gt;
        osSetPrimitiveParams (dstprim, [ param ] + p);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param, ALL_SIDES ]);&lt;br /&gt;
        p = IterateFaces (p, param);&lt;br /&gt;
        osSetPrimitiveParams (dstprim, p);&lt;br /&gt;
    }&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
RezAPrim ()&lt;br /&gt;
{&lt;br /&gt;
    if (++primnum &amp;gt; primcnt) llResetScript();&lt;br /&gt;
    llRezObject (seedName, llGetPos()+&amp;lt;0,0,1&amp;gt;, ZERO_VECTOR, ZERO_ROTATION, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PrimRezed (key dstkey)&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay (&amp;quot;Processing link &amp;quot;+(string)primnum+&amp;quot; of &amp;quot;+(string)primcnt);&lt;br /&gt;
    key srckey = llGetObjectLinkKey (rootKey, primnum);&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
    &lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_POSITION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_ROTATION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TYPE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SIZE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_COLOR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXTURE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_NORMAL);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SPECULAR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXGEN);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_BUMP_SHINY);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_FULLBRIGHT);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_PHYSICS_SHAPE_TYPE);&lt;br /&gt;
&lt;br /&gt;
    RezAPrim ();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
key OwnerOf (key id)&lt;br /&gt;
{&lt;br /&gt;
    list l = llGetObjectDetails (id, [ OBJECT_OWNER ]);&lt;br /&gt;
    return llList2Key (l, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;READY&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start (integer n)&lt;br /&gt;
    {&lt;br /&gt;
        state dialog;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer dlgchan = 99;&lt;br /&gt;
integer dlglistener;&lt;br /&gt;
state dialog&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;LISTENING&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llDialog (llGetOwner(), &amp;quot;Action?&amp;quot;, [&amp;quot;CLEANUP&amp;quot;, &amp;quot;REPLICATE&amp;quot;], dlgchan);&lt;br /&gt;
        dlglistener = llListen (dlgchan, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent (10);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen (integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == &amp;quot;CLEANUP&amp;quot;)   state cleanup;&lt;br /&gt;
        if (msg == &amp;quot;REPLICATE&amp;quot;) state replicate;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer ()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_exit ()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent (0.0);&lt;br /&gt;
        llListenRemove (dlglistener);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state cleanup&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;CLEANUP&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (seedName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        llOwnerSay (&amp;quot;Garbage collecting &amp;quot;+(string)num);&lt;br /&gt;
        for (integer i=0; i&amp;lt;num; i++) osDie (llDetectedKey(i));&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;All clean.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state replicate&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;REPLICATE&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (targetName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        rootKey = llDetectedKey (0);&lt;br /&gt;
&lt;br /&gt;
        if (OwnerOf(rootKey) != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay (&amp;quot;I don't own &amp;quot;+targetName+&amp;quot;. Aborting.&amp;quot;);&lt;br /&gt;
            state default;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        primcnt = llGetObjectPrimCount (rootKey);&lt;br /&gt;
        primnum = 0; RezAPrim ();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;Object &amp;quot;+targetName+&amp;quot; was not found.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    object_rez (key uuid) {&lt;br /&gt;
        PrimRezed (uuid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Writing accessors==&lt;br /&gt;
&lt;br /&gt;
The Get/SetPrimitiveParams family of functions is awesomely powerful. It is also [https://wiki.secondlife.com/wiki/LlSetLinkPrimitiveParamsFast quite arcane to write and decipher]. A way to get rid of these long lists of parameters cluttering your code is to encapsulate Get/SetPrimitiveParams in individual get/set accessors, actually 'filling the blanks' in the above table. Although this is much pleasant to read, note that doing so may hurt performance when you want to change many properties at once, which SetPrimitiveParams can do in one call. The following library is offered as an example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Index of properties for PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TYPE      = 0;&lt;br /&gt;
integer INDEX_HOLE      = 1;&lt;br /&gt;
integer INDEX_CUT       = 2;&lt;br /&gt;
integer INDEX_HOLLOW    = 3;&lt;br /&gt;
integer INDEX_TWIST     = 4;&lt;br /&gt;
integer INDEX_TAPER     = 5;&lt;br /&gt;
integer INDEX_SHEAR     = 6;&lt;br /&gt;
&lt;br /&gt;
// Index of properties for PRIM_TEXTURE&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TEXTURE   = 0;&lt;br /&gt;
integer INDEX_REPEATS   = 1;&lt;br /&gt;
integer INDEX_OFFSETS   = 2;&lt;br /&gt;
integer INDEX_ROTATION  = 3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//                client        script&lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
//  Taper   | -1.0 0  +1.0  |  2.0   0.0 | &lt;br /&gt;
//  Shear   | -0.5 0  +0.5  | -0.5  +0.5 |&lt;br /&gt;
//  Twist   | -180 0  +180  | -1.0  +1.0 | &lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Set accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
mySetLinkName (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_NAME, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkDesc (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_DESC, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkText (integer link, string text, vector color) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXT, text, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkColor (integer link, vector color, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_COLOR, face, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkBright (integer link, integer bright, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_FULLBRIGHT, face, bright]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkGlow (integer link, float glow, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_GLOW, face, glow]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Les 3 suivants ne marchent pas pour ALL_SIDES&lt;br /&gt;
&lt;br /&gt;
mySetLinkTexture (integer link, key texture, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [texture], INDEX_TEXTURE, INDEX_TEXTURE);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRepeat (integer link, vector repeat, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [repeat], INDEX_REPEATS, INDEX_REPEATS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkOffset (integer link, vector offset, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [offset], INDEX_OFFSETS, INDEX_OFFSETS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkPos (integer link, vector pos) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_POS_LOCAL, pos]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRot (integer link, rotation rot) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_ROT_LOCAL, rot]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkSize (integer link, vector size) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_SIZE, size]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkCut (integer link, vector cut) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [cut], INDEX_CUT, INDEX_CUT);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTwist (integer link, vector twist) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [twist], INDEX_TWIST, INDEX_TWIST);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTaper (integer link, vector taper) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [taper], INDEX_TAPER, INDEX_TAPER);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkShear (integer link, vector shear) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [shear], INDEX_SHEAR, INDEX_SHEAR);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkHollow (integer link, float hollow) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [hollow], INDEX_HOLLOW, INDEX_HOLLOW);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Get accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
string myGetLinkName (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_NAME]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkDesc (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_DESC]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkText (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXT]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkColor (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_COLOR, face]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer myGetLinkBright (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_FULLBRIGHT, face]);&lt;br /&gt;
    return llList2Integer (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkGlow (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_GLOW, face]);&lt;br /&gt;
    return llList2Float (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key myGetLinkTexture (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Key(l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkRepeat (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkOffset (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkPos (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_POS_LOCAL]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkSize (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_SIZE]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkCut (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_CUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTwist (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TWIST);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTaper (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TAPER);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkShear (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_SHEAR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkHollow (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Float (l, INDEX_HOLLOW);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Accessing_Prim_Properties</id>
		<title>Accessing Prim Properties</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Accessing_Prim_Properties"/>
				<updated>2024-03-02T18:22:09Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Fixed script&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==A bit of history==&lt;br /&gt;
&lt;br /&gt;
First, there was &amp;lt;u&amp;gt;llSetColor&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then, there was &amp;lt;u&amp;gt;llSetLinkColor&amp;lt;/u&amp;gt;. That was a huge step forward, since it was releaving you from the burden to script each and every prim in your hair. Don't laugh. You may still find such blatantly outdated scripts on the Hypergrid. Do us a favor. Don't propagate them. Trash them. Rewrite them.&lt;br /&gt;
&lt;br /&gt;
Later, it was recognized that the ability to access every property of a prim in a linkset from a master script was a Good Thing. It makes your application simpler to understand and to maintain, and helps reduce script count. &amp;lt;u&amp;gt;llSetLinkPrimitiveParams&amp;lt;/u&amp;gt; was born.&lt;br /&gt;
&lt;br /&gt;
Finally, OpenSimulator added it's own touch. Why not manipulate prims ''outside'' the linkset from a master script ? And we had &amp;lt;u&amp;gt;osSetPrimitiveParams.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
llGet/SetLinkPrimitiveParams, osGet/SetPrimitiveParams are the workhorse of prim manipulations. You can access every existing property of a prim from a centralized location. Streamlined, faster code. No more need for chat, or LinkedMessages between prims.&lt;br /&gt;
&lt;br /&gt;
A special note about &amp;lt;u&amp;gt;llGetObjectLinkKey&amp;lt;/u&amp;gt; : Introduced September, 2022, this function is the glue you need to access prims outside the linkset. Once you get the id of an external object (maybe using llSensor), you may call llGetObjectPrimCount (also consider osGetPrimCount which does not count sitting avatars) then iterate on llGetObjectLinkKey to get the id of each prim in the remote object. Finally, apply osGet/SetPrimitiveParams.&lt;br /&gt;
&lt;br /&gt;
The following tables tries to sort out the functions available to manipulate prims, for each addressing method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Target is script's host&amp;lt;br/&amp;gt;(prim containing the script)&lt;br /&gt;
! Target is link number&amp;lt;br/&amp;gt;(inside the linkset)&lt;br /&gt;
! Target is prim id&amp;lt;br/&amp;gt;(any prim you own in the scene)&lt;br /&gt;
|-&lt;br /&gt;
| llGetOwner || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetKey || llGetLinkKey(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetText || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetRot / llSetRot || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetScale / llSetScale || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetAlpha / llSetAlpha || llSetLinkAlpha(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetColor / llSetColor || llSetLinkColor(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetPos / llSetPos || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetObjectName / llSetObjectName || llGetLinkName(num) ||&lt;br /&gt;
|-(num)&lt;br /&gt;
| llGetObjectDesc / llSetObjectDesc || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetNumberOfSides || llGetLinkNumberOfSides(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetTexture / llSetTexture || llSetLinkTexture(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetTextureAnim || llSetLinkTextureAnim(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llParticleSystem || llLinkParticleSystem(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetPrimMediaParams || llSetLinkMedia(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectPrimCount(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectDetails(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectLinkKey(uuid,num)&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot; | &amp;quot;Universal&amp;quot; access (list of rules)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| llGet/SetPrimitiveParams || llGet/SetLinkPrimitiveParams(num) || osGet/SetPrimitiveParams(uuid)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example : A replicator==&lt;br /&gt;
Put this script in a box, along with a single-prim object named &amp;quot;seed&amp;quot;. It will iterate on each prim of a named object you own in the scene, then rez an identical prim at a given offset, perfectly replicating the source object, even meshes. Sleeps are here for demo. Remove them for speedy replication. CLEANUP option will get rid of rezed prims.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string targetName = &amp;quot;Example&amp;quot;; // The name of an object you own in the scene&lt;br /&gt;
string seedName = &amp;quot;seed&amp;quot;;      // Name of the seed prim &lt;br /&gt;
vector offset = &amp;lt;5,0,0&amp;gt;;       // Offset of the dupicata&lt;br /&gt;
&lt;br /&gt;
integer primcnt;&lt;br /&gt;
integer primnum;&lt;br /&gt;
key rootKey;&lt;br /&gt;
&lt;br /&gt;
integer TupleLength (integer param)&lt;br /&gt;
{&lt;br /&gt;
    if (param == PRIM_GLOW)       return 1;&lt;br /&gt;
    if (param == PRIM_COLOR)      return 2;&lt;br /&gt;
    if (param == PRIM_TEXGEN)     return 1;&lt;br /&gt;
    if (param == PRIM_TEXTURE)    return 4;&lt;br /&gt;
    if (param == PRIM_NORMAL)     return 4;&lt;br /&gt;
    if (param == PRIM_SPECULAR)   return 7;&lt;br /&gt;
    if (param == PRIM_BUMP_SHINY) return 2;&lt;br /&gt;
    if (param == PRIM_FULLBRIGHT) return 1;&lt;br /&gt;
&lt;br /&gt;
    return 0; // Not a by-side parameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list IterateFaces (list p, integer param)&lt;br /&gt;
{&lt;br /&gt;
    integer tuplelength = TupleLength (param);&lt;br /&gt;
    integer numsides =  llGetListLength(p) / tuplelength;&lt;br /&gt;
&lt;br /&gt;
    // Une seule face, retourner [ param, ALL_SIDES, p ]&lt;br /&gt;
    if (numsides == 1) return [ param, ALL_SIDES ] + p;&lt;br /&gt;
&lt;br /&gt;
    list result = [ ];&lt;br /&gt;
    for (integer s=0; s&amp;lt;numsides; s++) {&lt;br /&gt;
        list tuple = llList2List (p, s*tuplelength, (s+1)*tuplelength-1);&lt;br /&gt;
        result += [ param, s ] + tuple;&lt;br /&gt;
    }  &lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CopyParams (key srcprim, key dstprim, integer param) {&lt;br /&gt;
    if (TupleLength(param) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param ]);&lt;br /&gt;
        if (param == PRIM_POSITION) p = [ llList2Vector (p,0) + offset ];&lt;br /&gt;
        osSetPrimitiveParams (dstprim, [ param ] + p);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param, ALL_SIDES ]);&lt;br /&gt;
        p = IterateFaces (p, param);&lt;br /&gt;
        osSetPrimitiveParams (dstprim, p);&lt;br /&gt;
    }&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
RezAPrim ()&lt;br /&gt;
{&lt;br /&gt;
    if (++primnum &amp;gt; primcnt) llResetScript();&lt;br /&gt;
    llRezObject (seedName, llGetPos()+&amp;lt;0,0,1&amp;gt;, ZERO_VECTOR, ZERO_ROTATION, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PrimRezed (key dstkey)&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay (&amp;quot;Processing link &amp;quot;+(string)primnum+&amp;quot; of &amp;quot;+(string)primcnt);&lt;br /&gt;
    key srckey = llGetObjectLinkKey (rootKey, primnum);&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
    &lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_POSITION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_ROTATION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TYPE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SIZE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_COLOR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXTURE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_NORMAL);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SPECULAR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXGEN);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_BUMP_SHINY);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_FULLBRIGHT);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_PHYSICS_SHAPE_TYPE);&lt;br /&gt;
&lt;br /&gt;
    RezAPrim ();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
key OwnerOf (key id)&lt;br /&gt;
{&lt;br /&gt;
    list l = llGetObjectDetails (id, [ OBJECT_OWNER ]);&lt;br /&gt;
    return llList2Key (l, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;READY&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start (integer n)&lt;br /&gt;
    {&lt;br /&gt;
        state dialog;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer dlgchan = 99;&lt;br /&gt;
integer dlglistener;&lt;br /&gt;
state dialog&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;LISTENING&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llDialog (llGetOwner(), &amp;quot;Action?&amp;quot;, [&amp;quot;CLEANUP&amp;quot;, &amp;quot;REPLICATE&amp;quot;], dlgchan);&lt;br /&gt;
        dlglistener = llListen (dlgchan, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent (10);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen (integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == &amp;quot;CLEANUP&amp;quot;)   state cleanup;&lt;br /&gt;
        if (msg == &amp;quot;REPLICATE&amp;quot;) state replicate;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer ()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_exit ()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent (0.0);&lt;br /&gt;
        llListenRemove (dlglistener);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state cleanup&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;CLEANUP&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (seedName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        llOwnerSay (&amp;quot;Garbage collecting &amp;quot;+(string)num);&lt;br /&gt;
        for (integer i=0; i&amp;lt;num; i++) osDie (llDetectedKey(i));&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;All clean.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state replicate&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;REPLICATE&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (targetName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        rootKey = llDetectedKey (0);&lt;br /&gt;
&lt;br /&gt;
        if (OwnerOf(rootKey) != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay (&amp;quot;I don't own &amp;quot;+targetName+&amp;quot;. Aborting.&amp;quot;);&lt;br /&gt;
            state default;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        primcnt = llGetObjectPrimCount (rootKey);&lt;br /&gt;
        primnum = 0; RezAPrim ();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;Object &amp;quot;+targetName+&amp;quot; was not found.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    object_rez (key uuid) {&lt;br /&gt;
        PrimRezed (uuid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Writing accessors==&lt;br /&gt;
&lt;br /&gt;
The Get/SetPrimitiveParams family of functions is awesomely powerful. It is also [https://wiki.secondlife.com/wiki/LlSetLinkPrimitiveParamsFast quite arcane to write and decipher]. A way to get rid of these long lists of parameters cluttering your code is to encapsulate Get/SetPrimitiveParams in individual get/set accessors, actually 'filling the blanks' in the above table. Although this is much pleasant to read, note that doing so may hurt performance when you want to change many properties at once, which SetPrimitiveParams can do in one call. The following library is offered as an example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Index of properties for PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TYPE      = 0;&lt;br /&gt;
integer INDEX_HOLE      = 1;&lt;br /&gt;
integer INDEX_CUT       = 2;&lt;br /&gt;
integer INDEX_HOLLOW    = 3;&lt;br /&gt;
integer INDEX_TWIST     = 4;&lt;br /&gt;
integer INDEX_TAPER     = 5;&lt;br /&gt;
integer INDEX_SHEAR     = 6;&lt;br /&gt;
&lt;br /&gt;
// Index of properties for PRIM_TEXTURE&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TEXTURE   = 0;&lt;br /&gt;
integer INDEX_REPEATS   = 1;&lt;br /&gt;
integer INDEX_OFFSETS   = 2;&lt;br /&gt;
integer INDEX_ROTATION  = 3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//                client        script&lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
//  Taper   | -1.0 0  +1.0  |  2.0   0.0 | &lt;br /&gt;
//  Shear   | -0.5 0  +0.5  | -0.5  +0.5 |&lt;br /&gt;
//  Twist   | -180 0  +180  | -1.0  +1.0 | &lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Set accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
mySetLinkName (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_NAME, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkDesc (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_DESC, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkText (integer link, string text, vector color) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXT, text, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkColor (integer link, vector color, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_COLOR, face, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkBright (integer link, integer bright, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_FULLBRIGHT, face, bright]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkGlow (integer link, float glow, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_GLOW, face, glow]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Les 3 suivants ne marchent pas pour ALL_SIDES&lt;br /&gt;
&lt;br /&gt;
mySetLinkTexture (integer link, key texture, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [texture], INDEX_TEXTURE, INDEX_TEXTURE);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRepeat (integer link, vector repeat, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [repeat], INDEX_REPEATS, INDEX_REPEATS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkOffset (integer link, vector offset, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [offset], INDEX_OFFSETS, INDEX_OFFSETS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkPos (integer link, vector pos) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_POS_LOCAL, pos]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRot (integer link, rotation rot) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_ROT_LOCAL, rot]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkSize (integer link, vector size) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_SIZE, size]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkCut (integer link, vector cut) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [cut], INDEX_CUT, INDEX_CUT);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTwist (integer link, vector twist) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [twist], INDEX_TWIST, INDEX_TWIST);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTaper (integer link, vector taper) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [taper], INDEX_TAPER, INDEX_TAPER);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkShear (integer link, vector shear) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [shear], INDEX_SHEAR, INDEX_SHEAR);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkHollow (integer link, float hollow) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [hollow], INDEX_HOLLOW, INDEX_HOLLOW);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Get accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
string myGetLinkName (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_NAME]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkDesc (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_DESC]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkText (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXT]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkColor (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_COLOR, face]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer myGetLinkBright (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_FULLBRIGHT, face]);&lt;br /&gt;
    return llList2Integer (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkGlow (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_GLOW, face]);&lt;br /&gt;
    return llList2Float (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key myGetLinkTexture (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Key(l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkRepeat (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkOffset (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkPos (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_POS_LOCAL]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkSize (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_SIZE]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkCut (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_CUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTwist (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TWIST);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTaper (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TAPER);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkShear (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_SHEAR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkHollow (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Float (l, INDEX_HOLLOW);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Accessing_Prim_Properties</id>
		<title>Accessing Prim Properties</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Accessing_Prim_Properties"/>
				<updated>2024-03-01T20:02:50Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Example added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==A bit of history==&lt;br /&gt;
&lt;br /&gt;
First, there was &amp;lt;u&amp;gt;llSetColor&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then, there was &amp;lt;u&amp;gt;llSetLinkColor&amp;lt;/u&amp;gt;. That was a huge step forward, since it was releaving you from the burden to script each and every prim in your hair. Don't laugh. You may still find such blatantly outdated scripts on the Hypergrid. Do us a favor. Don't propagate them. Trash them. Rewrite them.&lt;br /&gt;
&lt;br /&gt;
Later, it was recognized that the ability to access every property of a prim in a linkset from a master script was a Good Thing. It makes your application simpler to understand and to maintain, and helps reduce script count. &amp;lt;u&amp;gt;llSetLinkPrimitiveParams&amp;lt;/u&amp;gt; was born.&lt;br /&gt;
&lt;br /&gt;
Finally, OpenSimulator added it's own touch. Why not manipulate prims ''outside'' the linkset from a master script ? And we had &amp;lt;u&amp;gt;osSetPrimitiveParams.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
llGet/SetLinkPrimitiveParams, osGet/SetPrimitiveParams are the workhorse of prim manipulations. You can access every existing property of a prim from a centralized location. Streamlined, faster code. No more need for chat, or LinkedMessages between prims.&lt;br /&gt;
&lt;br /&gt;
A special note about &amp;lt;u&amp;gt;llGetObjectLinkKey&amp;lt;/u&amp;gt; : Introduced September, 2022, this function is the glue you need to access prims outside the linkset. Once you get the id of an external object (maybe using llSensor), you may call llGetObjectPrimCount (also consider osGetPrimCount which does not count sitting avatars) then iterate on llGetObjectLinkKey to get the id of each prim in the remote object. Finally, apply osGet/SetPrimitiveParams.&lt;br /&gt;
&lt;br /&gt;
The following tables tries to sort out the functions available to manipulate prims, for each addressing method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Target is script's host&amp;lt;br/&amp;gt;(prim containing the script)&lt;br /&gt;
! Target is link number&amp;lt;br/&amp;gt;(inside the linkset)&lt;br /&gt;
! Target is prim id&amp;lt;br/&amp;gt;(any prim you own in the scene)&lt;br /&gt;
|-&lt;br /&gt;
| llGetOwner || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetKey || llGetLinkKey(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetText || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetRot / llSetRot || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetScale / llSetScale || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetAlpha / llSetAlpha || llSetLinkAlpha(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetColor / llSetColor || llSetLinkColor(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetPos / llSetPos || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetObjectName / llSetObjectName || llGetLinkName(num) ||&lt;br /&gt;
|-(num)&lt;br /&gt;
| llGetObjectDesc / llSetObjectDesc || ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetNumberOfSides || llGetLinkNumberOfSides(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llGetTexture / llSetTexture || llSetLinkTexture(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetTextureAnim || llSetLinkTextureAnim(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llParticleSystem || llLinkParticleSystem(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| llSetPrimMediaParams || llSetLinkMedia(num) ||&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectPrimCount(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectDetails(uuid)&lt;br /&gt;
|-&lt;br /&gt;
| || || llGetObjectLinkKey(uuid,num)&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot; | &amp;quot;Universal&amp;quot; access (list of rules)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| llGet/SetPrimitiveParams || llGet/SetLinkPrimitiveParams(num) || osGet/SetPrimitiveParams(uuid)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example : A replicator==&lt;br /&gt;
Put this script in a box, along with a single-prim object named &amp;quot;seed&amp;quot;. It will iterate on each prim of a named object you own in the scene, then rez an identical prim at a given offset, perfectly replicating the source object, even meshes. Sleeps are here for demo. Remove them for speedy replication. CLEANUP option will get rid of rezed prims.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
string targetName = &amp;quot;Example&amp;quot;; // The name of an object you own in the scene&lt;br /&gt;
string seedName = &amp;quot;seed&amp;quot;;      // Name of the seed prim &lt;br /&gt;
vector offset = &amp;lt;0,0,1&amp;gt;;       // Offset of the dupicata&lt;br /&gt;
&lt;br /&gt;
integer primcnt;&lt;br /&gt;
integer primnum;&lt;br /&gt;
key rootKey;&lt;br /&gt;
&lt;br /&gt;
integer TupleLength (integer param)&lt;br /&gt;
{&lt;br /&gt;
    if (param == PRIM_GLOW)       return 1;&lt;br /&gt;
    if (param == PRIM_COLOR)      return 2;&lt;br /&gt;
    if (param == PRIM_TEXGEN)     return 1;&lt;br /&gt;
    if (param == PRIM_TEXTURE)    return 4;&lt;br /&gt;
    if (param == PRIM_NORMAL)     return 4;&lt;br /&gt;
    if (param == PRIM_SPECULAR)   return 7;&lt;br /&gt;
    if (param == PRIM_BUMP_SHINY) return 2;&lt;br /&gt;
    if (param == PRIM_FULLBRIGHT) return 1;&lt;br /&gt;
&lt;br /&gt;
    return 0; // Not a by-side parameter&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list IterateFaces (list p, integer param)&lt;br /&gt;
{&lt;br /&gt;
    integer tuplelength = TupleLength (param);&lt;br /&gt;
    integer numsides =  llGetListLength(p) / tuplelength;&lt;br /&gt;
&lt;br /&gt;
    // Une seule face, retourner [ param, ALL_SIDES, p ]&lt;br /&gt;
    if (numsides == 1) return [ param, ALL_SIDES ] + p;&lt;br /&gt;
&lt;br /&gt;
    list result = [ ];&lt;br /&gt;
    for (integer s=0; s&amp;lt;numsides; s++) {&lt;br /&gt;
        list tuple = llList2List (p, s*tuplelength, (s+1)*tuplelength-1);&lt;br /&gt;
        result += [ param, s ] + tuple;&lt;br /&gt;
    }  &lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CopyParams (key srcprim, key dstprim, integer param) {&lt;br /&gt;
    if (TupleLength(param) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param ]);&lt;br /&gt;
        if (param == PRIM_POSITION) p = [ llList2Vector (p,0) + &amp;lt;5,0,0&amp;gt; ];&lt;br /&gt;
        osSetPrimitiveParams (dstprim, [ param ] + p);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        list p = osGetPrimitiveParams (srcprim, [ param, ALL_SIDES ]);&lt;br /&gt;
        p = IterateFaces (p, param);&lt;br /&gt;
        osSetPrimitiveParams (dstprim, p);&lt;br /&gt;
    }&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
RezAPrim ()&lt;br /&gt;
{&lt;br /&gt;
    if (++primnum &amp;gt; primcnt) llResetScript();&lt;br /&gt;
    llRezObject (seedName, llGetPos()+offset, ZERO_VECTOR, ZERO_ROTATION, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PrimRezed (key dstkey)&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay (&amp;quot;Processing link &amp;quot;+(string)primnum+&amp;quot; of &amp;quot;+(string)primcnt);&lt;br /&gt;
    key srckey = llGetObjectLinkKey (rootKey, primnum);&lt;br /&gt;
    llSleep (0.1);&lt;br /&gt;
    &lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_POSITION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_ROTATION);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TYPE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SIZE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_COLOR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXTURE);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_NORMAL);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_SPECULAR);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_TEXGEN);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_BUMP_SHINY);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_FULLBRIGHT);&lt;br /&gt;
    CopyParams (srckey, dstkey, PRIM_PHYSICS_SHAPE_TYPE);&lt;br /&gt;
&lt;br /&gt;
    RezAPrim ();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
key OwnerOf (key id)&lt;br /&gt;
{&lt;br /&gt;
    list l = llGetObjectDetails (id, [ OBJECT_OWNER ]);&lt;br /&gt;
    return llList2Key (l, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;READY&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start (integer n)&lt;br /&gt;
    {&lt;br /&gt;
        state dialog;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer dlgchan = 99;&lt;br /&gt;
integer dlglistener;&lt;br /&gt;
state dialog&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;LISTENING&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llDialog (llGetOwner(), &amp;quot;Action?&amp;quot;, [&amp;quot;CLEANUP&amp;quot;, &amp;quot;REPLICATE&amp;quot;], dlgchan);&lt;br /&gt;
        dlglistener = llListen (dlgchan, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent (10);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen (integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if (msg == &amp;quot;CLEANUP&amp;quot;)   state cleanup;&lt;br /&gt;
        if (msg == &amp;quot;REPLICATE&amp;quot;) state replicate;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer ()&lt;br /&gt;
    {&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_exit ()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent (0.0);&lt;br /&gt;
        llListenRemove (dlglistener);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state cleanup&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;CLEANUP&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (seedName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        llOwnerSay (&amp;quot;Garbage collecting &amp;quot;+(string)num);&lt;br /&gt;
        for (integer i=0; i&amp;lt;num; i++) osDie (llDetectedKey(i));&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;All clean.&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state replicate&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText (&amp;quot;REPLICATE&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
        llSensor (targetName, NULL_KEY, PASSIVE|SCRIPTED, 100, PI);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor (integer num) {&lt;br /&gt;
        rootKey = llDetectedKey (0);&lt;br /&gt;
&lt;br /&gt;
        if (OwnerOf(rootKey) != llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay (&amp;quot;I don't own &amp;quot;+targetName+&amp;quot;. Aborting.&amp;quot;);&lt;br /&gt;
            state default;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        primcnt = llGetObjectPrimCount (rootKey);&lt;br /&gt;
        primnum = 0; RezAPrim ();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        llOwnerSay (&amp;quot;Object &amp;quot;+targetName+&amp;quot; was not found.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    object_rez (key uuid) {&lt;br /&gt;
        PrimRezed (uuid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Writing accessors==&lt;br /&gt;
&lt;br /&gt;
The Get/SetPrimitiveParams family of functions is awesomely powerful. It is also [https://wiki.secondlife.com/wiki/LlSetLinkPrimitiveParamsFast quite arcane to write and decipher]. A way to get rid of these long lists of parameters cluttering your code is to encapsulate Get/SetPrimitiveParams in individual get/set accessors, actually 'filling the blanks' in the above table. Although this is much pleasant to read, note that doing so may hurt performance when you want to change many properties at once, which SetPrimitiveParams can do in one call. The following library is offered as an example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Index of properties for PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TYPE      = 0;&lt;br /&gt;
integer INDEX_HOLE      = 1;&lt;br /&gt;
integer INDEX_CUT       = 2;&lt;br /&gt;
integer INDEX_HOLLOW    = 3;&lt;br /&gt;
integer INDEX_TWIST     = 4;&lt;br /&gt;
integer INDEX_TAPER     = 5;&lt;br /&gt;
integer INDEX_SHEAR     = 6;&lt;br /&gt;
&lt;br /&gt;
// Index of properties for PRIM_TEXTURE&lt;br /&gt;
&lt;br /&gt;
integer INDEX_TEXTURE   = 0;&lt;br /&gt;
integer INDEX_REPEATS   = 1;&lt;br /&gt;
integer INDEX_OFFSETS   = 2;&lt;br /&gt;
integer INDEX_ROTATION  = 3;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//                client        script&lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
//  Taper   | -1.0 0  +1.0  |  2.0   0.0 | &lt;br /&gt;
//  Shear   | -0.5 0  +0.5  | -0.5  +0.5 |&lt;br /&gt;
//  Twist   | -180 0  +180  | -1.0  +1.0 | &lt;br /&gt;
//          +---------------+------------+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Set accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
mySetLinkName (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_NAME, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkDesc (integer link, string text) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_DESC, text]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkText (integer link, string text, vector color) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXT, text, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkColor (integer link, vector color, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_COLOR, face, color, 1.0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkBright (integer link, integer bright, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_FULLBRIGHT, face, bright]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkGlow (integer link, float glow, integer face) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_GLOW, face, glow]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Les 3 suivants ne marchent pas pour ALL_SIDES&lt;br /&gt;
&lt;br /&gt;
mySetLinkTexture (integer link, key texture, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [texture], INDEX_TEXTURE, INDEX_TEXTURE);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRepeat (integer link, vector repeat, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [repeat], INDEX_REPEATS, INDEX_REPEATS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkOffset (integer link, vector offset, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    l = llListReplaceList(l, [offset], INDEX_OFFSETS, INDEX_OFFSETS);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TEXTURE, face] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkPos (integer link, vector pos) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_POS_LOCAL, pos]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkRot (integer link, rotation rot) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_ROT_LOCAL, rot]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkSize (integer link, vector size) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_SIZE, size]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkCut (integer link, vector cut) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [cut], INDEX_CUT, INDEX_CUT);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTwist (integer link, vector twist) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [twist], INDEX_TWIST, INDEX_TWIST);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkTaper (integer link, vector taper) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [taper], INDEX_TAPER, INDEX_TAPER);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkShear (integer link, vector shear) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [shear], INDEX_SHEAR, INDEX_SHEAR);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mySetLinkHollow (integer link, float hollow) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    l = llListReplaceList(l, [hollow], INDEX_HOLLOW, INDEX_HOLLOW);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (link, [PRIM_TYPE] + l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Get accessors&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
string myGetLinkName (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_NAME]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkDesc (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_DESC]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string myGetLinkText (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXT]);&lt;br /&gt;
    return llList2String (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkColor (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_COLOR, face]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer myGetLinkBright (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_FULLBRIGHT, face]);&lt;br /&gt;
    return llList2Integer (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkGlow (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_GLOW, face]);&lt;br /&gt;
    return llList2Float (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key myGetLinkTexture (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Key(l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkRepeat (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkOffset (integer link, integer face) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    return llList2Vector(l,2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkPos (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_POS_LOCAL]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkSize (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_SIZE]);&lt;br /&gt;
    return llList2Vector (l,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkCut (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_CUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTwist (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TWIST);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkTaper (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_TAPER);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector myGetLinkShear (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Vector (l, INDEX_SHEAR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float myGetLinkHollow (integer link) {&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (link, [PRIM_TYPE]);&lt;br /&gt;
    return llList2Float (l, INDEX_HOLLOW);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetSitTargetPos</id>
		<title>OsGetSitTargetPos</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetSitTargetPos"/>
				<updated>2024-03-01T10:35:32Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Non-english word&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=vector osGetSitTargetPos()&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Unit test : Writing then reading SitTarget&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector write_pos = &amp;lt;1,2,3&amp;gt;;&lt;br /&gt;
        vector write_rot = &amp;lt;4,5,6&amp;gt;;&lt;br /&gt;
        &lt;br /&gt;
        llSitTarget (write_pos, llEuler2Rot(write_rot * DEG_TO_RAD));&lt;br /&gt;
        &lt;br /&gt;
        vector read_pos = osGetSitTargetPos();&lt;br /&gt;
        vector read_rot = llRot2Euler (osGetSitTargetRot()) * RAD_TO_DEG;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay (read_pos);&lt;br /&gt;
        llOwnerSay (read_rot);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[12:45] Object: &amp;lt;1.000000, 2.000000, 3.000000&amp;gt;&lt;br /&gt;
[12:45] Object: &amp;lt;4.000000, 5.000000, 6.000000&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Sit Adjuster, Jeff Kelley, 2024&lt;br /&gt;
//&lt;br /&gt;
// This script allows interactive adjustment of the sit position.&lt;br /&gt;
// Put the script in a seat, then sit. Mode (POSITION or ROTATION),&lt;br /&gt;
// avatar position and avatar rotation are displayed in green.&lt;br /&gt;
// Adjust the position using the arrow keys + PageUp/PageDown.&lt;br /&gt;
// Once satisfied, click on the seat to enter ROTATION mode&lt;br /&gt;
// and adjust the rotation. Toggle between POSITION and ROTATION&lt;br /&gt;
// as many times as necessary. Finally, standup. The new sittarget&lt;br /&gt;
// is now written, and the script deletes itself.&lt;br /&gt;
//&lt;br /&gt;
// PLEASE NOTE - It is strongly advised to disable the setting :&lt;br /&gt;
// Preferences &amp;gt; Move&amp;amp;View &amp;gt; Reset camera position on avatar movement&lt;br /&gt;
// so the camera won't jump when you hit the arrow keys.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
////////////////////&lt;br /&gt;
// Avatar ajustement&lt;br /&gt;
////////////////////&lt;br /&gt;
&lt;br /&gt;
integer MODE;&lt;br /&gt;
integer MODE_POS = 0;&lt;br /&gt;
integer MODE_ROT = 1;&lt;br /&gt;
&lt;br /&gt;
float increment = 0.005; // The smaller, the slower&lt;br /&gt;
vector DELTA_X = &amp;lt; 1, 0, 0 &amp;gt; * increment;&lt;br /&gt;
vector DELTA_Y = &amp;lt; 0, 1, 0 &amp;gt; * increment;&lt;br /&gt;
vector DELTA_Z = &amp;lt; 0, 0, 1 &amp;gt; * increment;&lt;br /&gt;
&lt;br /&gt;
vector   AvatarPos; // Memorize last position&lt;br /&gt;
rotation AvatarRot; // Memorize last rotation&lt;br /&gt;
&lt;br /&gt;
vector GetAvatarPos()&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (nprims, [PRIM_POS_LOCAL]);&lt;br /&gt;
    AvatarPos = llList2Vector (l,0);&lt;br /&gt;
    return AvatarPos;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
rotation GetAvatarRot()&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (nprims, [PRIM_ROT_LOCAL]);&lt;br /&gt;
    AvatarRot = llList2Rot (l,0);&lt;br /&gt;
    return AvatarRot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SetAvatarPos(vector pos)&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (nprims, [PRIM_POS_LOCAL, pos]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SetAvatarRot(rotation rot)&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (nprims, [PRIM_ROT_LOCAL, rot]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Move(vector deltapos, vector deltarot)&lt;br /&gt;
{&lt;br /&gt;
    if (MODE == MODE_POS)&lt;br /&gt;
        SetAvatarPos (GetAvatarPos() + deltapos);&lt;br /&gt;
&lt;br /&gt;
    if (MODE == MODE_ROT)&lt;br /&gt;
        SetAvatarRot (GetAvatarRot() * llEuler2Rot(deltarot));&lt;br /&gt;
&lt;br /&gt;
    DisplayInfos();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////&lt;br /&gt;
// Sit/Unsit, keyboard bindings&lt;br /&gt;
///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer KeysToBind = CONTROL_FWD | CONTROL_BACK | CONTROL_ROT_LEFT&lt;br /&gt;
                   | CONTROL_ROT_RIGHT | CONTROL_UP | CONTROL_DOWN;&lt;br /&gt;
vector drift;&lt;br /&gt;
&lt;br /&gt;
Sit ()&lt;br /&gt;
{&lt;br /&gt;
    key avatar =  llGetPermissionsKey();&lt;br /&gt;
    llTakeControls (KeysToBind, TRUE, FALSE);&lt;br /&gt;
    MODE = MODE_POS;&lt;br /&gt;
    DisplayUsage();&lt;br /&gt;
    DisplayInfos();&lt;br /&gt;
    drift = osGetSitTargetPos() - GetAvatarPos();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Unsit ()&lt;br /&gt;
{&lt;br /&gt;
    key avatar =  llGetPermissionsKey();&lt;br /&gt;
    llSitTarget (AvatarPos+drift, AvatarRot);&lt;br /&gt;
    llReleaseControls ();&lt;br /&gt;
    DisplayClear();&lt;br /&gt;
    &lt;br /&gt;
    llRemoveInventory (llGetScriptName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////&lt;br /&gt;
// Display&lt;br /&gt;
//////////&lt;br /&gt;
&lt;br /&gt;
DisplayClear()&lt;br /&gt;
{&lt;br /&gt;
    llSetText (&amp;quot;&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DisplayInfos()&lt;br /&gt;
{&lt;br /&gt;
    string text;&lt;br /&gt;
    vector color;&lt;br /&gt;
    GetAvatarPos();&lt;br /&gt;
    GetAvatarRot();&lt;br /&gt;
&lt;br /&gt;
    if (MODE == MODE_POS)&lt;br /&gt;
    {&lt;br /&gt;
        text = &amp;quot;MODE POSITION&amp;quot;;&lt;br /&gt;
        color = &amp;lt;0,1,0&amp;gt;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (MODE == MODE_ROT)&lt;br /&gt;
    {&lt;br /&gt;
        text = &amp;quot;MODE ROTATION&amp;quot;;&lt;br /&gt;
        color = &amp;lt;1,1,0&amp;gt;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    text += &amp;quot;\n&amp;quot; + (string) AvatarPos;&lt;br /&gt;
    text += &amp;quot;\n&amp;quot; + (string) (llRot2Euler(AvatarRot)*RAD_TO_DEG);&lt;br /&gt;
    llSetText (text, color, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DisplayUsage()&lt;br /&gt;
{&lt;br /&gt;
    llWhisper (0, &amp;quot;Use arrow keys + PageUP/PageDown&amp;quot;);&lt;br /&gt;
    llWhisper (0, &amp;quot;to adjust avatar position in X, Y and Z&amp;quot;);&lt;br /&gt;
    llWhisper (0, &amp;quot;Click the seat to toggle between position ane rotation&amp;quot;);&lt;br /&gt;
    llWhisper (0, &amp;quot;Standup to record the parameters in your seat&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/////////////////&lt;br /&gt;
// Event handlers&lt;br /&gt;
/////////////////&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // If the seat has a previous sittarget, use it as a starting point.&lt;br /&gt;
        // Else, define a random sittarget for llAvatarOnSitTarget to work.&lt;br /&gt;
        vector   sitPos = osGetSitTargetPos();&lt;br /&gt;
        rotation sitRot = osGetSitTargetRot();&lt;br /&gt;
&lt;br /&gt;
        if (sitPos == ZERO_VECTOR)&lt;br /&gt;
        {&lt;br /&gt;
            sitPos = &amp;lt;0,0,1.0&amp;gt;;&lt;br /&gt;
            sitRot = ZERO_ROTATION;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        llSitTarget (sitPos, sitRot);&lt;br /&gt;
        DisplayClear();&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_LINK)&lt;br /&gt;
        {&lt;br /&gt;
            key whosit = llAvatarOnSitTarget();&lt;br /&gt;
            if (whosit == NULL_KEY) Unsit ();&lt;br /&gt;
            else llRequestPermissions (whosit, PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    run_time_permissions(integer perms)&lt;br /&gt;
    {&lt;br /&gt;
        if (perms == PERMISSION_TAKE_CONTROLS) Sit();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start (integer n)&lt;br /&gt;
    {&lt;br /&gt;
        MODE = ! MODE;&lt;br /&gt;
        DisplayInfos();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    control (key id, integer level, integer edge)&lt;br /&gt;
    {&lt;br /&gt;
        integer start = level &amp;amp; edge;&lt;br /&gt;
        integer end = ~level &amp;amp; edge;&lt;br /&gt;
&lt;br /&gt;
        if (level &amp;amp; CONTROL_FWD)        { Move( DELTA_X,  DELTA_Y); } // Up arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_BACK)       { Move(-DELTA_X, -DELTA_Y); } // Down arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_ROT_LEFT)   { Move( DELTA_Y,  DELTA_Z); } // Left arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_ROT_RIGHT)  { Move(-DELTA_Y, -DELTA_Z); } // Right arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_UP)         { Move( DELTA_Z,  DELTA_X); } // Page up&lt;br /&gt;
        if (level &amp;amp; CONTROL_DOWN)       { Move(-DELTA_Z, -DELTA_X); } // Page down&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the sit target location as set by  llSitTarget.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetSitTargetPos</id>
		<title>OsGetSitTargetPos</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetSitTargetPos"/>
				<updated>2024-03-01T10:31:00Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: grammar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=vector osGetSitTargetPos()&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Unit test : Writing then reading SitTarget&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector write_pos = &amp;lt;1,2,3&amp;gt;;&lt;br /&gt;
        vector write_rot = &amp;lt;4,5,6&amp;gt;;&lt;br /&gt;
        &lt;br /&gt;
        llSitTarget (write_pos, llEuler2Rot(write_rot * DEG_TO_RAD));&lt;br /&gt;
        &lt;br /&gt;
        vector read_pos = osGetSitTargetPos();&lt;br /&gt;
        vector read_rot = llRot2Euler (osGetSitTargetRot()) * RAD_TO_DEG;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay (read_pos);&lt;br /&gt;
        llOwnerSay (read_rot);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[12:45] Object: &amp;lt;1.000000, 2.000000, 3.000000&amp;gt;&lt;br /&gt;
[12:45] Object: &amp;lt;4.000000, 5.000000, 6.000000&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Sit Adjuster, Jeff Kelley, 2024&lt;br /&gt;
//&lt;br /&gt;
// This script allows interactive adjustment of the sit position.&lt;br /&gt;
// Put the script in a seat, then sit. Mode (POSITION or ROTATION),&lt;br /&gt;
// avatar position and avatar rotation are displayed in green.&lt;br /&gt;
// Adjust the position using the arrow keys + PageUp/PageDown.&lt;br /&gt;
// Once satisfied, click on the seat to enter ROTATION mode&lt;br /&gt;
// and adjust the rotation. Toggle between POSITION and ROTATION&lt;br /&gt;
// as many times as necessary. Finally, standup. The new sittarget&lt;br /&gt;
// is now written, and the script deletes itself.&lt;br /&gt;
//&lt;br /&gt;
// PLEASE NOTE - It is strongly advised to disable the setting :&lt;br /&gt;
// Preferences &amp;gt; Move&amp;amp;View &amp;gt; Reset camera position on avatar movement&lt;br /&gt;
// so the camera won't jump when you hit the arrow keys.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
////////////////////&lt;br /&gt;
// Avatar ajustement&lt;br /&gt;
////////////////////&lt;br /&gt;
&lt;br /&gt;
integer MODE;&lt;br /&gt;
integer MODE_POS = 0;&lt;br /&gt;
integer MODE_ROT = 1;&lt;br /&gt;
&lt;br /&gt;
float increment = 0.005; // The smaller, the slower&lt;br /&gt;
vector DELTA_X = &amp;lt; 1, 0, 0 &amp;gt; * increment;&lt;br /&gt;
vector DELTA_Y = &amp;lt; 0, 1, 0 &amp;gt; * increment;&lt;br /&gt;
vector DELTA_Z = &amp;lt; 0, 0, 1 &amp;gt; * increment;&lt;br /&gt;
&lt;br /&gt;
vector   AvatarPos; // Memorize last position&lt;br /&gt;
rotation AvatarRot; // Memorize last rotation&lt;br /&gt;
&lt;br /&gt;
vector GetAvatarPos()&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (nprims, [PRIM_POS_LOCAL]);&lt;br /&gt;
    AvatarPos = llList2Vector (l,0);&lt;br /&gt;
    return AvatarPos;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
rotation GetAvatarRot()&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (nprims, [PRIM_ROT_LOCAL]);&lt;br /&gt;
    AvatarRot = llList2Rot (l,0);&lt;br /&gt;
    return AvatarRot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SetAvatarPos(vector pos)&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (nprims, [PRIM_POS_LOCAL, pos]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SetAvatarRot(rotation rot)&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (nprims, [PRIM_ROT_LOCAL, rot]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Move(vector deltapos, vector deltarot)&lt;br /&gt;
{&lt;br /&gt;
    if (MODE == MODE_POS)&lt;br /&gt;
        SetAvatarPos (GetAvatarPos() + deltapos);&lt;br /&gt;
&lt;br /&gt;
    if (MODE == MODE_ROT)&lt;br /&gt;
        SetAvatarRot (GetAvatarRot() * llEuler2Rot(deltarot));&lt;br /&gt;
&lt;br /&gt;
    DisplayInfos();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////&lt;br /&gt;
// Sit/Unsit, keyboard bindings&lt;br /&gt;
///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer KeysToBind = CONTROL_FWD | CONTROL_BACK | CONTROL_ROT_LEFT&lt;br /&gt;
                   | CONTROL_ROT_RIGHT | CONTROL_UP | CONTROL_DOWN;&lt;br /&gt;
vector drift;&lt;br /&gt;
&lt;br /&gt;
Sit ()&lt;br /&gt;
{&lt;br /&gt;
    key avatar =  llGetPermissionsKey();&lt;br /&gt;
    llTakeControls (KeysToBind, TRUE, FALSE);&lt;br /&gt;
    MODE = MODE_POS;&lt;br /&gt;
    DisplayUsage();&lt;br /&gt;
    DisplayInfos();&lt;br /&gt;
    drift = osGetSitTargetPos() - GetAvatarPos();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Unsit ()&lt;br /&gt;
{&lt;br /&gt;
    key avatar =  llGetPermissionsKey();&lt;br /&gt;
    llSitTarget (AvatarPos+drift, AvatarRot);&lt;br /&gt;
    llReleaseControls ();&lt;br /&gt;
    DisplayClear();&lt;br /&gt;
    &lt;br /&gt;
    llRemoveInventory (llGetScriptName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////&lt;br /&gt;
// Display&lt;br /&gt;
//////////&lt;br /&gt;
&lt;br /&gt;
DisplayClear()&lt;br /&gt;
{&lt;br /&gt;
    llSetText (&amp;quot;&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DisplayInfos()&lt;br /&gt;
{&lt;br /&gt;
    string text;&lt;br /&gt;
    vector color;&lt;br /&gt;
    GetAvatarPos();&lt;br /&gt;
    GetAvatarRot();&lt;br /&gt;
&lt;br /&gt;
    if (MODE == MODE_POS)&lt;br /&gt;
    {&lt;br /&gt;
        text = &amp;quot;MODE POSITION&amp;quot;;&lt;br /&gt;
        color = &amp;lt;0,1,0&amp;gt;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (MODE == MODE_ROT)&lt;br /&gt;
    {&lt;br /&gt;
        text = &amp;quot;MODE ROTATION&amp;quot;;&lt;br /&gt;
        color = &amp;lt;1,1,0&amp;gt;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    text += &amp;quot;\n&amp;quot; + (string) AvatarPos;&lt;br /&gt;
    text += &amp;quot;\n&amp;quot; + (string) (llRot2Euler(AvatarRot)*RAD_TO_DEG);&lt;br /&gt;
    llSetText (text, color, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DisplayUsage()&lt;br /&gt;
{&lt;br /&gt;
    llWhisper (0, &amp;quot;Use arrow keys + PageUP/PageDown&amp;quot;);&lt;br /&gt;
    llWhisper (0, &amp;quot;to adjust avatar position in X, Y et Z&amp;quot;);&lt;br /&gt;
    llWhisper (0, &amp;quot;Click the seat to toggle between position ane rotation&amp;quot;);&lt;br /&gt;
    llWhisper (0, &amp;quot;Standup to record the parameters in your seat&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/////////////////&lt;br /&gt;
// Event handlers&lt;br /&gt;
/////////////////&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // If the seat has a previous sittarget, use it as a starting point.&lt;br /&gt;
        // Else, define a random sittarget for llAvatarOnSitTarget to work.&lt;br /&gt;
        vector   sitPos = osGetSitTargetPos();&lt;br /&gt;
        rotation sitRot = osGetSitTargetRot();&lt;br /&gt;
&lt;br /&gt;
        if (sitPos == ZERO_VECTOR)&lt;br /&gt;
        {&lt;br /&gt;
            sitPos = &amp;lt;0,0,1.0&amp;gt;;&lt;br /&gt;
            sitRot = ZERO_ROTATION;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        llSitTarget (sitPos, sitRot);&lt;br /&gt;
        DisplayClear();&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_LINK)&lt;br /&gt;
        {&lt;br /&gt;
            key whosit = llAvatarOnSitTarget();&lt;br /&gt;
            if (whosit == NULL_KEY) Unsit ();&lt;br /&gt;
            else llRequestPermissions (whosit, PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    run_time_permissions(integer perms)&lt;br /&gt;
    {&lt;br /&gt;
        if (perms == PERMISSION_TAKE_CONTROLS) Sit();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start (integer n)&lt;br /&gt;
    {&lt;br /&gt;
        MODE = ! MODE;&lt;br /&gt;
        DisplayInfos();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    control (key id, integer level, integer edge)&lt;br /&gt;
    {&lt;br /&gt;
        integer start = level &amp;amp; edge;&lt;br /&gt;
        integer end = ~level &amp;amp; edge;&lt;br /&gt;
&lt;br /&gt;
        if (level &amp;amp; CONTROL_FWD)        { Move( DELTA_X,  DELTA_Y); } // Up arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_BACK)       { Move(-DELTA_X, -DELTA_Y); } // Down arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_ROT_LEFT)   { Move( DELTA_Y,  DELTA_Z); } // Left arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_ROT_RIGHT)  { Move(-DELTA_Y, -DELTA_Z); } // Right arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_UP)         { Move( DELTA_Z,  DELTA_X); } // Page up&lt;br /&gt;
        if (level &amp;amp; CONTROL_DOWN)       { Move(-DELTA_Z, -DELTA_X); } // Page down&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the sit target location as set by  llSitTarget.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetSitTargetPos</id>
		<title>OsGetSitTargetPos</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetSitTargetPos"/>
				<updated>2024-03-01T10:25:24Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Example added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=vector osGetSitTargetPos()&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Unit test : Writing then reading SitTarget&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector write_pos = &amp;lt;1,2,3&amp;gt;;&lt;br /&gt;
        vector write_rot = &amp;lt;4,5,6&amp;gt;;&lt;br /&gt;
        &lt;br /&gt;
        llSitTarget (write_pos, llEuler2Rot(write_rot * DEG_TO_RAD));&lt;br /&gt;
        &lt;br /&gt;
        vector read_pos = osGetSitTargetPos();&lt;br /&gt;
        vector read_rot = llRot2Euler (osGetSitTargetRot()) * RAD_TO_DEG;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay (read_pos);&lt;br /&gt;
        llOwnerSay (read_rot);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[12:45] Object: &amp;lt;1.000000, 2.000000, 3.000000&amp;gt;&lt;br /&gt;
[12:45] Object: &amp;lt;4.000000, 5.000000, 6.000000&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Sit Adjuster, Jeff Kelley, 2024&lt;br /&gt;
//&lt;br /&gt;
// This script allows interactive adjustment of the seat position.&lt;br /&gt;
// Put the script in a seat, then sit. Mode (POSITION or ROTATION),&lt;br /&gt;
// avatar position and avatar rotation are displayed in green.&lt;br /&gt;
// Adjust the position using the arrow keys + PageUp/PageDown.&lt;br /&gt;
// Once satisfied, click on the seat to enter ROTATION mode&lt;br /&gt;
// and adjust the rotation. Toggle between POSITION and ROTATION&lt;br /&gt;
// as many times as necessary. Finally, standup. The new sittarget&lt;br /&gt;
// is now written, and the script deletes itself.&lt;br /&gt;
//&lt;br /&gt;
// PLEASE NOTE - It is strongly advised to disable the setting :&lt;br /&gt;
// Preferences &amp;gt; Move&amp;amp;View &amp;gt; Reset camera position on avatar movement&lt;br /&gt;
// so the camera won't jump when you hit the arrow keys.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
////////////////////&lt;br /&gt;
// Avatar ajustement&lt;br /&gt;
////////////////////&lt;br /&gt;
&lt;br /&gt;
integer MODE;&lt;br /&gt;
integer MODE_POS = 0;&lt;br /&gt;
integer MODE_ROT = 1;&lt;br /&gt;
&lt;br /&gt;
float increment = 0.005; // The smaller, the slower&lt;br /&gt;
vector DELTA_X = &amp;lt; 1, 0, 0 &amp;gt; * increment;&lt;br /&gt;
vector DELTA_Y = &amp;lt; 0, 1, 0 &amp;gt; * increment;&lt;br /&gt;
vector DELTA_Z = &amp;lt; 0, 0, 1 &amp;gt; * increment;&lt;br /&gt;
&lt;br /&gt;
vector   AvatarPos; // Memorize last position&lt;br /&gt;
rotation AvatarRot; // Memorize last rotation&lt;br /&gt;
&lt;br /&gt;
vector GetAvatarPos()&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (nprims, [PRIM_POS_LOCAL]);&lt;br /&gt;
    AvatarPos = llList2Vector (l,0);&lt;br /&gt;
    return AvatarPos;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
rotation GetAvatarRot()&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    list l = llGetLinkPrimitiveParams (nprims, [PRIM_ROT_LOCAL]);&lt;br /&gt;
    AvatarRot = llList2Rot (l,0);&lt;br /&gt;
    return AvatarRot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SetAvatarPos(vector pos)&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (nprims, [PRIM_POS_LOCAL, pos]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SetAvatarRot(rotation rot)&lt;br /&gt;
{&lt;br /&gt;
    integer nprims = llGetNumberOfPrims(); // Last link = avatar&lt;br /&gt;
    llSetLinkPrimitiveParamsFast (nprims, [PRIM_ROT_LOCAL, rot]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Move(vector deltapos, vector deltarot)&lt;br /&gt;
{&lt;br /&gt;
    if (MODE == MODE_POS)&lt;br /&gt;
        SetAvatarPos (GetAvatarPos() + deltapos);&lt;br /&gt;
&lt;br /&gt;
    if (MODE == MODE_ROT)&lt;br /&gt;
        SetAvatarRot (GetAvatarRot() * llEuler2Rot(deltarot));&lt;br /&gt;
&lt;br /&gt;
    DisplayInfos();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////&lt;br /&gt;
// Sit/Unsit, keyboard bindings&lt;br /&gt;
///////////////////////////////&lt;br /&gt;
&lt;br /&gt;
integer KeysToBind = CONTROL_FWD | CONTROL_BACK | CONTROL_ROT_LEFT&lt;br /&gt;
                   | CONTROL_ROT_RIGHT | CONTROL_UP | CONTROL_DOWN;&lt;br /&gt;
vector drift;&lt;br /&gt;
&lt;br /&gt;
Sit ()&lt;br /&gt;
{&lt;br /&gt;
    key avatar =  llGetPermissionsKey();&lt;br /&gt;
    llTakeControls (KeysToBind, TRUE, FALSE);&lt;br /&gt;
    MODE = MODE_POS;&lt;br /&gt;
    DisplayUsage();&lt;br /&gt;
    DisplayInfos();&lt;br /&gt;
    drift = osGetSitTargetPos() - GetAvatarPos();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Unsit ()&lt;br /&gt;
{&lt;br /&gt;
    key avatar =  llGetPermissionsKey();&lt;br /&gt;
    llSitTarget (AvatarPos+drift, AvatarRot);&lt;br /&gt;
    llReleaseControls ();&lt;br /&gt;
    DisplayClear();&lt;br /&gt;
    &lt;br /&gt;
    llRemoveInventory (llGetScriptName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////&lt;br /&gt;
// Display&lt;br /&gt;
//////////&lt;br /&gt;
&lt;br /&gt;
DisplayClear()&lt;br /&gt;
{&lt;br /&gt;
    llSetText (&amp;quot;&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DisplayInfos()&lt;br /&gt;
{&lt;br /&gt;
    string text;&lt;br /&gt;
    vector color;&lt;br /&gt;
    GetAvatarPos();&lt;br /&gt;
    GetAvatarRot();&lt;br /&gt;
&lt;br /&gt;
    if (MODE == MODE_POS)&lt;br /&gt;
    {&lt;br /&gt;
        text = &amp;quot;MODE POSITION&amp;quot;;&lt;br /&gt;
        color = &amp;lt;0,1,0&amp;gt;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (MODE == MODE_ROT)&lt;br /&gt;
    {&lt;br /&gt;
        text = &amp;quot;MODE ROTATION&amp;quot;;&lt;br /&gt;
        color = &amp;lt;1,1,0&amp;gt;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    text += &amp;quot;\n&amp;quot; + (string) AvatarPos;&lt;br /&gt;
    text += &amp;quot;\n&amp;quot; + (string) (llRot2Euler(AvatarRot)*RAD_TO_DEG);&lt;br /&gt;
    llSetText (text, color, 1.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DisplayUsage()&lt;br /&gt;
{&lt;br /&gt;
    llWhisper (0, &amp;quot;Use arrow keys + PageUP/PageDown&amp;quot;);&lt;br /&gt;
    llWhisper (0, &amp;quot;to adjust avatar position in X, Y et Z&amp;quot;);&lt;br /&gt;
    llWhisper (0, &amp;quot;Click the seat to toggle between position ane rotation&amp;quot;);&lt;br /&gt;
    llWhisper (0, &amp;quot;Standup to record the parameters in your seat&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/////////////////&lt;br /&gt;
// Event handlers&lt;br /&gt;
/////////////////&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // If the seat has a previous sittarget, use it as a starting point.&lt;br /&gt;
        // Else, define a random sittarget for llAvatarOnSitTarget to work.&lt;br /&gt;
        vector   sitPos = osGetSitTargetPos();&lt;br /&gt;
        rotation sitRot = osGetSitTargetRot();&lt;br /&gt;
&lt;br /&gt;
        if (sitPos == ZERO_VECTOR)&lt;br /&gt;
        {&lt;br /&gt;
            sitPos = &amp;lt;0,0,1.0&amp;gt;;&lt;br /&gt;
            sitRot = ZERO_ROTATION;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        llSitTarget (sitPos, sitRot);&lt;br /&gt;
        DisplayClear();&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_LINK)&lt;br /&gt;
        {&lt;br /&gt;
            key whosit = llAvatarOnSitTarget();&lt;br /&gt;
            if (whosit == NULL_KEY) Unsit ();&lt;br /&gt;
            else llRequestPermissions (whosit, PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    run_time_permissions(integer perms)&lt;br /&gt;
    {&lt;br /&gt;
        if (perms == PERMISSION_TAKE_CONTROLS) Sit();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start (integer n)&lt;br /&gt;
    {&lt;br /&gt;
        MODE = ! MODE;&lt;br /&gt;
        DisplayInfos();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    control (key id, integer level, integer edge)&lt;br /&gt;
    {&lt;br /&gt;
        integer start = level &amp;amp; edge;&lt;br /&gt;
        integer end = ~level &amp;amp; edge;&lt;br /&gt;
&lt;br /&gt;
        if (level &amp;amp; CONTROL_FWD)        { Move( DELTA_X,  DELTA_Y); } // Up arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_BACK)       { Move(-DELTA_X, -DELTA_Y); } // Down arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_ROT_LEFT)   { Move( DELTA_Y,  DELTA_Z); } // Left arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_ROT_RIGHT)  { Move(-DELTA_Y, -DELTA_Z); } // Right arrow&lt;br /&gt;
        if (level &amp;amp; CONTROL_UP)         { Move( DELTA_Z,  DELTA_X); } // Page up&lt;br /&gt;
        if (level &amp;amp; CONTROL_DOWN)       { Move(-DELTA_Z, -DELTA_X); } // Page down&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the sit target location as set by  llSitTarget.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetSitTargetPos</id>
		<title>OsGetSitTargetPos</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetSitTargetPos"/>
				<updated>2024-03-01T08:29:55Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=vector osGetSitTargetPos()&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Unit test : Writing then reading SitTarget&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector write_pos = &amp;lt;1,2,3&amp;gt;;&lt;br /&gt;
        vector write_rot = &amp;lt;4,5,6&amp;gt;;&lt;br /&gt;
        &lt;br /&gt;
        llSitTarget (write_pos, llEuler2Rot(write_rot * DEG_TO_RAD));&lt;br /&gt;
        &lt;br /&gt;
        vector read_pos = osGetSitTargetPos();&lt;br /&gt;
        vector read_rot = llRot2Euler (osGetSitTargetRot()) * RAD_TO_DEG;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay (read_pos);&lt;br /&gt;
        llOwnerSay (read_rot);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[12:45] Object: &amp;lt;1.000000, 2.000000, 3.000000&amp;gt;&lt;br /&gt;
[12:45] Object: &amp;lt;4.000000, 5.000000, 6.000000&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the sit target location as set by  llSitTarget.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetSitTargetPos</id>
		<title>OsGetSitTargetPos</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetSitTargetPos"/>
				<updated>2024-03-01T08:25:30Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Created page with &amp;quot;{{osslfunc |threat_level=ignored |permissions=true |delay=0|function_syntax=vector osGetSitTargetPos()&amp;lt;br&amp;gt; |ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;  &amp;lt;/source&amp;gt; |description= Return th...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=vector osGetSitTargetPos()&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the sit target location as set by  llSitTarget.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetSitTargetRot</id>
		<title>OsGetSitTargetRot</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetSitTargetRot"/>
				<updated>2024-03-01T08:25:28Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Created page with &amp;quot;{{osslfunc |threat_level=ignored |permissions=true |delay=0|function_syntax=rotation osGetSitTargetRot()&amp;lt;br&amp;gt; |ossl_example=See osGetSitTargetPos |description= Return the s...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=rotation osGetSitTargetRot()&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=See [[osGetSitTargetPos]]&lt;br /&gt;
|description=&lt;br /&gt;
Return the sit target rotation as set by  llSitTarget.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:OSSL_Functions</id>
		<title>Category:OSSL Functions</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:OSSL_Functions"/>
				<updated>2024-03-01T08:09:59Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Prim */ ososGetSitTarget*&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#FFA500; padding:10px; padding-bottom:5px; border: 1px #FF544F solid&amp;quot;&amp;gt;&lt;br /&gt;
This information is relative to (almost) the last OpenSimulator Development version. In some cases it may not apply to older versions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OSSL function permissions ==&lt;br /&gt;
Several OSSL functions have execution permission control to prevent abusive or dangerous use.&lt;br /&gt;
&lt;br /&gt;
This is controlled by files osslDefaultEnable.ini and osslEnable.ini, by default in folder bin/config-include&amp;lt;br&amp;gt;&lt;br /&gt;
The use logic of these two files is identical to OpenSimDefaults.ini and OpenSim.ini&lt;br /&gt;
&lt;br /&gt;
Older OpenSimulator versions only used file osslEnable.ini.&amp;lt;br&amp;gt;&lt;br /&gt;
Some older OpenSimulator versions had checks for all OSSLfunctions.&amp;lt;br&amp;gt;&lt;br /&gt;
That made no sense for many functions, so now many are always allowed wasting no time on useless checks.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For details about these permissions, please read file OpenSimDefaults.ini&lt;br /&gt;
&lt;br /&gt;
= osslDefaultEnable.ini =&lt;br /&gt;
This file contains the defaults for OSSL execution permissions set by OpenSimulator dev team.&amp;lt;br&amp;gt;&lt;br /&gt;
Instead of changing defaults defined in code, the OpenSimulator dev team may decide to just make changes in this file.&amp;lt;br&amp;gt;&lt;br /&gt;
This file was not present on older OpenSimulator versions.&amp;lt;br&amp;gt;&lt;br /&gt;
If you need to change permissions, copy the respective entry to osslEnable.ini and modify there.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= osslEnable.ini =&lt;br /&gt;
This file contains the local overrides for OSSL permissions.&amp;lt;br&amp;gt;&lt;br /&gt;
It is read after osslDefaultEnable.ini, and any entry on it replaces the old one.&amp;lt;br&amp;gt;&lt;br /&gt;
This file is not provided on code packages, an osslEnable.ini.example is.&amp;lt;br&amp;gt;&lt;br /&gt;
At first time setup, you will need to copy the example file to osslEnable.ini and then edit it for your needs, using osslDefaults.ini as reference.&amp;lt;br&amp;gt;&lt;br /&gt;
This was the only file used on older OpenSimulator versions.&lt;br /&gt;
&lt;br /&gt;
== Current OSSL Functions Implemented  ==&lt;br /&gt;
&lt;br /&gt;
=== Avatars ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
&lt;br /&gt;
* [[osAgentSaveAppearance]]&lt;br /&gt;
* [[osAvatarName2Key]]&lt;br /&gt;
* [[osAvatarPlayAnimation]] &lt;br /&gt;
* [[osAvatarStopAnimation]] &lt;br /&gt;
* [[osAvatarType]]&lt;br /&gt;
* [[osCauseDamage]] &lt;br /&gt;
* [[osCauseHealing]]&lt;br /&gt;
* [[osDetectedCountry]]&lt;br /&gt;
* [[osDropAttachment]]&lt;br /&gt;
* [[osDropAttachmentAt]]&lt;br /&gt;
* [[osEjectFromGroup]]&lt;br /&gt;
* [[osForceAttachToAvatar]]&lt;br /&gt;
* [[osForceAttachToAvatarFromInventory]]&lt;br /&gt;
* [[osForceAttachToOtherAvatarFromInventory]]&lt;br /&gt;
* [[osForceDetachFromAvatar]]&lt;br /&gt;
* [[osForceDropAttachment]]&lt;br /&gt;
* [[osForceDropAttachmentAt]]&lt;br /&gt;
* [[osForceOtherSit]]&lt;br /&gt;
* [[osGetAgentIP]] &lt;br /&gt;
* [[osGetAgents]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetAgentCountry]]&lt;br /&gt;
* [[osGetAvatarHomeURI]]&lt;br /&gt;
* [[osGetAvatarList]] &lt;br /&gt;
* [[osGetGender]]&lt;br /&gt;
* [[osGetHealRate]]&lt;br /&gt;
* [[osGetHealth]]&lt;br /&gt;
* [[osGetNumberOfAttachments]]&lt;br /&gt;
* [[osGrantScriptPermissions]]&lt;br /&gt;
* [[osInviteToGroup]]&lt;br /&gt;
* [[osKickAvatar]]&lt;br /&gt;
* [[osOwnerSaveAppearance]]&lt;br /&gt;
* [[osRevokeScriptPermissions]]&lt;br /&gt;
* [[osSetHealRate]]&lt;br /&gt;
* [[osSetHealth]]&lt;br /&gt;
* [[osSetOwnerSpeed]]&lt;br /&gt;
* [[osSetSpeed]]&lt;br /&gt;
* [[osLocalTeleportAgent]]&lt;br /&gt;
* [[osTeleportAgent]] &lt;br /&gt;
* [[osTeleportOwner]] &lt;br /&gt;
* [[osReplaceAgentEnvironment]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== NPCs ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osIsNpc]]&lt;br /&gt;
* [[osNpcCreate]]&lt;br /&gt;
* [[osGetNpcList]]&lt;br /&gt;
* [[osNpcGetPos]]&lt;br /&gt;
* [[osNpcGetRot]]&lt;br /&gt;
* [[osNpcGetOwner]]&lt;br /&gt;
* [[osNpcLookAt]] {{E}}&lt;br /&gt;
* [[osNpcLoadAppearance]]&lt;br /&gt;
* [[osNpcMoveTo]]&lt;br /&gt;
* [[osNpcMoveToTarget]]&lt;br /&gt;
* [[osNpcPlayAnimation]]&lt;br /&gt;
* [[osNpcRemove]]&lt;br /&gt;
* [[osNpcSaveAppearance]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osNpcSay]]&lt;br /&gt;
* [[osNpcSayTo]]&lt;br /&gt;
* [[osNpcSetProfileAbout]]&lt;br /&gt;
* [[osNpcSetProfileImage]]&lt;br /&gt;
* [[osNpcSetRot]]&lt;br /&gt;
* [[osNpcShout]]&lt;br /&gt;
* [[osNpcSit]]&lt;br /&gt;
* [[osNpcStand]]&lt;br /&gt;
* [[osNpcStopMoveToTarget]]&lt;br /&gt;
* [[osNpcStopAnimation]]&lt;br /&gt;
* [[osNpcTouch]]&lt;br /&gt;
* [[osNpcWhisper]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Prim ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osClearInertia]]&lt;br /&gt;
* [[osClearObjectAnimations]]&lt;br /&gt;
* [[osDie]]&lt;br /&gt;
* [[osForceBreakAllLinks]]&lt;br /&gt;
* [[osForceBreakLink]] &lt;br /&gt;
* [[osForceCreateLink]]&lt;br /&gt;
* [[osGetInertiaData]]&lt;br /&gt;
* [[osGetInventoryItemKey]]&lt;br /&gt;
* [[osGetInventoryName]]&lt;br /&gt;
* [[osGetInventoryNames]] {{new}}&lt;br /&gt;
* [[osGetInventoryKeys]] {{new}}&lt;br /&gt;
* [[osGetInventoryDesc]]&lt;br /&gt;
* [[osGetInventoryLastOwner]]&lt;br /&gt;
* [[osGetLinkInventoryName]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryNames]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryKey]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryKeys]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryDesc]] {{new}}&lt;br /&gt;
* [[osGiveLinkInventory]] {{new}}&lt;br /&gt;
* [[osGiveLinkInventoryList]] {{new}}&lt;br /&gt;
* [[osRemoveLinkInventory]] {{new}}&lt;br /&gt;
* [[osGetLastChangedEventKey]]&lt;br /&gt;
* [[osGetLinkNumber]]&lt;br /&gt;
* [[osGetLinkPrimitiveParams]] &lt;br /&gt;
* [[osGetPrimitiveParams]] &lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetRezzingObject]]&lt;br /&gt;
* [[osGetSitActiveRange]]&lt;br /&gt;
* [[osGetLinkSitActiveRange]]&lt;br /&gt;
* [[osGetSitTargetPos]] {{new}}&lt;br /&gt;
* [[osGetSitTargetRot]] {{new}}&lt;br /&gt;
* [[osGetStandTarget]]&lt;br /&gt;
* [[osGetLinkStandTarget]]&lt;br /&gt;
* [[osLinkParticleSystem]] {{new}}&lt;br /&gt;
* [[osMessageAttachments]]&lt;br /&gt;
* [[osMessageObject]]&lt;br /&gt;
* [[osParticleSystem]] {{new}}&lt;br /&gt;
* [[osSetInertia]]&lt;br /&gt;
* [[osSetInertiaAsBox]]&lt;br /&gt;
* [[osSetInertiaAsCylinder]]&lt;br /&gt;
* [[osSetInertiaAsSphere]]&lt;br /&gt;
* [[osSetPrimitiveParams]] &lt;br /&gt;
* [[osSetProjectionParams]]&lt;br /&gt;
* [[osSetSitActiveRange]]&lt;br /&gt;
* [[osSetLinkSitActiveRange]]&lt;br /&gt;
* [[osSetStandTarget]]&lt;br /&gt;
* [[osSetLinkStandTarget]]&lt;br /&gt;
* [[osTeleportObject]]&lt;br /&gt;
* [[osVolumeDetect]]&lt;br /&gt;
* [[osGetPrimCount]] {{new}}&lt;br /&gt;
* [[osGetSittingAvatarsCount]] {{new}}&lt;br /&gt;
&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Prim Drawing / Dynamic Texture ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osDrawEllipse]]&lt;br /&gt;
* [[osDrawFilledEllipse]]&lt;br /&gt;
* [[osDrawFilledPolygon]]&lt;br /&gt;
* [[osDrawFilledRectangle]]&lt;br /&gt;
* [[osDrawImage]]&lt;br /&gt;
* [[osDrawLine]]&lt;br /&gt;
* [[osDrawPolygon]]&lt;br /&gt;
* [[osDrawRectangle]]&lt;br /&gt;
* [[osDrawResetTransform]]&lt;br /&gt;
* [[osDrawRotationTransform]]&lt;br /&gt;
* [[osDrawScaleTransform]]&lt;br /&gt;
* [[osDrawText]]&lt;br /&gt;
* [[osDrawTranslationTransform]]&lt;br /&gt;
* [[osGetDrawStringSize]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osMovePen]]&lt;br /&gt;
* [[osSetFontName]]&lt;br /&gt;
* [[osSetFontSize]]&lt;br /&gt;
* [[osSetPenCap]]&lt;br /&gt;
* [[osSetPenColor]]&lt;br /&gt;
* [[osSetPenSize]]&lt;br /&gt;
* [[osSetDynamicTextureData]]&lt;br /&gt;
* [[osSetDynamicTextureDataFace]]&lt;br /&gt;
* [[osSetDynamicTextureDataBlend]]&lt;br /&gt;
* [[osSetDynamicTextureDataBlendFace]] &lt;br /&gt;
* [[osSetDynamicTextureURL]]&lt;br /&gt;
* [[osSetDynamicTextureURLBlend]]&lt;br /&gt;
* [[osSetDynamicTextureURLBlendFace]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
* [[osGetNotecard]] &lt;br /&gt;
* [[osGetNotecardLine]] &lt;br /&gt;
* [[osGetNumberOfNotecardLines]]&lt;br /&gt;
* [[osMakeNotecard]]&lt;br /&gt;
&lt;br /&gt;
=== Sound ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osAdjustSoundVolume]]&lt;br /&gt;
* [[osCollisionSound]]&lt;br /&gt;
* [[osLoopSound]]&lt;br /&gt;
* [[osLoopSoundMaster]]&lt;br /&gt;
* [[osLoopSoundSlave]]&lt;br /&gt;
* [[osPlaySound]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osPlaySoundSlave]]&lt;br /&gt;
* [[osPreloadSound]]&lt;br /&gt;
* [[osSetSoundRadius]]&lt;br /&gt;
* [[osStopSound]]&lt;br /&gt;
* [[osTriggerSound]]&lt;br /&gt;
* [[osTriggerSoundLimited]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
* [[osRequestSecureURL]]&lt;br /&gt;
* [[osRequestURL]]&lt;br /&gt;
* [[osSetContentType]]&lt;br /&gt;
&lt;br /&gt;
=== Parcel ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osParcelJoin]] &lt;br /&gt;
* [[osParcelSubdivide]] &lt;br /&gt;
* [[osGetParcelDwell]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osSetParcelDetails]]&lt;br /&gt;
* [[osGetParcelDetails]]&lt;br /&gt;
* [[osGetParcelIDs]]&lt;br /&gt;
* [[osGetParcelID]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Terrain ===&lt;br /&gt;
* [[osGetTerrainHeight]] &lt;br /&gt;
* [[osSetTerrainHeight]] &lt;br /&gt;
* [[osSetTerrainTexture]]&lt;br /&gt;
* [[osSetTerrainTextureHeight]]&lt;br /&gt;
* [[osTerrainFlush]]&lt;br /&gt;
&lt;br /&gt;
=== Region / Parcel Environment ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osGetCurrentSunHour]] &lt;br /&gt;
* [[osGetApparentTime]]&lt;br /&gt;
* [[osGetApparentTimeString]]&lt;br /&gt;
* [[osGetApparentRegionTime]]&lt;br /&gt;
* [[osGetApparentRegionTimeString]]&lt;br /&gt;
* [[osGetWindParam]] &lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osSetRegionWaterHeight]] &lt;br /&gt;
* [[osSetWindParam]]&lt;br /&gt;
* [[osWindActiveModelPluginName]]&lt;br /&gt;
* [[osReplaceParcelEnvironment]]&lt;br /&gt;
* [[osReplaceRegionEnvironment]]&lt;br /&gt;
* [[osResetEnvironment]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Grid / Region Information ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osCheckODE]]&lt;br /&gt;
* [[osGetGridCustom]]&lt;br /&gt;
* [[osGetGridGatekeeperURI]]&lt;br /&gt;
* [[osGetGridHomeURI]]&lt;br /&gt;
* [[osGetGridLoginURI]]&lt;br /&gt;
* [[osGetGridName]] &lt;br /&gt;
* [[osGetGridNick]] &lt;br /&gt;
* [[osGetMapTexture]] &lt;br /&gt;
* [[osGetPhysicsEngineName]]&lt;br /&gt;
* [[osGetPhysicsEngineType]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetRegionMapTexture]] &lt;br /&gt;
* [[osGetRegionSize]]&lt;br /&gt;
* [[osGetRegionStats]] &lt;br /&gt;
* [[osGetScriptEngineName]] &lt;br /&gt;
* [[osGetSimulatorMemory]] &lt;br /&gt;
* [[osGetSimulatorMemoryKB]]&lt;br /&gt;
* [[osGetSimulatorVersion]] &lt;br /&gt;
* [[osLoadedCreationDate]] &lt;br /&gt;
* [[osLoadedCreationID]] &lt;br /&gt;
* [[osLoadedCreationTime]] &lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Administration ===&lt;br /&gt;
* [[osConsoleCommand]] &lt;br /&gt;
* [[osRegionNotice]]&lt;br /&gt;
* [[osRegionRestart]] &lt;br /&gt;
* [[osSetParcelMediaURL]] &lt;br /&gt;
* [[osSetParcelMusicURL]]&lt;br /&gt;
* [[osSetParcelSIPAddress]]&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
*[[osResetAllScripts]]&lt;br /&gt;
&lt;br /&gt;
=== String Manipulation ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osFormatString]]&lt;br /&gt;
* [[osListenRegex]]&lt;br /&gt;
* [[osMatchString]]&lt;br /&gt;
* [[osRegexIsMatch]]&lt;br /&gt;
* [[osReplaceString]]&lt;br /&gt;
* [[osStringSubString]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osStringStartsWith]]&lt;br /&gt;
* [[osStringEndsWith]]&lt;br /&gt;
* [[osStringIndexOf]]&lt;br /&gt;
* [[osStringLastIndexOf]]&lt;br /&gt;
* [[osStringRemove]]&lt;br /&gt;
* [[osStringReplace]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osAESEncrypt]] {{new}}&lt;br /&gt;
* [[osAESDecrypt]] {{new}}&lt;br /&gt;
* [[osAESEncryptTo]] {{new}}&lt;br /&gt;
* [[osAESDecryptFrom]] {{new}}&lt;br /&gt;
* [[osAngleBetween]]&lt;br /&gt;
* [[osApproxEquals]]&lt;br /&gt;
* [[osGetPSTWallclock]]&lt;br /&gt;
* [[osListSortInPlace]]&lt;br /&gt;
* [[osListSortInPlaceStrided]] {{new}}&lt;br /&gt;
* [[osIsUUID]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osIsNotValidNumber]]&lt;br /&gt;
* [[osKey2Name]]&lt;br /&gt;
* [[osMax]]&lt;br /&gt;
* [[osMin]]&lt;br /&gt;
* [[osRound]]&lt;br /&gt;
* [[osSHA256]]&lt;br /&gt;
* [[osSlerp]]&lt;br /&gt;
* [[osUnixTimeToTimestamp]] &lt;br /&gt;
* [[osVecDistSquare]]&lt;br /&gt;
* [[osVecMagSquare]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Deprecated ===&lt;br /&gt;
* [[osParcelSetDetails|&amp;lt;strike&amp;gt;osParcelSetDetails&amp;lt;/strike&amp;gt;]] - Use [[osSetParcelDetails]] &lt;br /&gt;
* [[osSetPenColour|&amp;lt;strike&amp;gt;osSetPenColour&amp;lt;/strike&amp;gt;]] - Use [[osSetPenColor]] &lt;br /&gt;
* [[osSunGetParam|&amp;lt;strike&amp;gt;osSunGetParam&amp;lt;/strike&amp;gt;]] - Use [[osGetSunParam]] &lt;br /&gt;
* [[osSunSetParam|&amp;lt;strike&amp;gt;osSunSetParam&amp;lt;/strike&amp;gt;]] - Use [[osSetSunParam]] &lt;br /&gt;
* [[osTerrainGetHeight|&amp;lt;strike&amp;gt;osTerrainGetHeight&amp;lt;/strike&amp;gt;]] - Use [[osGetTerrainHeight]] &lt;br /&gt;
* [[osTerrainSetHeight|&amp;lt;strike&amp;gt;osTerrainSetHeight&amp;lt;/strike&amp;gt;]] - Use [[osSetTerrainHeight]]&lt;br /&gt;
*&amp;lt;strike&amp;gt;osWindParamGet&amp;lt;/strike&amp;gt; - Use [[osGetWindParam]]&lt;br /&gt;
*&amp;lt;strike&amp;gt;osWindParamSet&amp;lt;/strike&amp;gt; - Use [[osSetWindParam]]&lt;br /&gt;
* [[osList2Double|&amp;lt;strike&amp;gt;osList2Double&amp;lt;/strike&amp;gt;]] - Use llList2Float&lt;br /&gt;
* [[osGetSunParam]]&lt;br /&gt;
* [[osSetEstateSunSettings]]&lt;br /&gt;
* [[osSetRegionSunSettings]]&lt;br /&gt;
* [[osSetSunParam]]&lt;br /&gt;
* [[osSetPrimFloatOnWater]]&lt;br /&gt;
&lt;br /&gt;
== See Also  ==&lt;br /&gt;
&lt;br /&gt;
* [[OSSL_vs_LSL|LSL&amp;amp;OSSL : Neighbour functions, similarities and differences]] &lt;br /&gt;
* [[Accessing_Prim_Properties|LSL&amp;amp;OSSL : Guide to prims addressing (by linknum, by uuid)]]&lt;br /&gt;
* [[LSL Status|LSL/OSSL Status Page]] &lt;br /&gt;
*OSSL &lt;br /&gt;
** [[OSSL_Implemented|OSSL Implemented Functions]] &lt;br /&gt;
** [[OSSL Constants|OSSL Constants]] &lt;br /&gt;
** [[OSSL Status/Types|OSSL Types Status Page]] &lt;br /&gt;
** [[OSSL Status/Events|OSSL Events Status Page]] &lt;br /&gt;
&lt;br /&gt;
** [[Dynamic_textures|OSSL osDynamicTextures Functions Index Page]]&lt;br /&gt;
** [[OSSL TextureDrawing|OSSL TextureDrawing Extended Information]]&lt;br /&gt;
** [[OSSLNPC|OSSL functions for working with NPCs]]&lt;br /&gt;
&lt;br /&gt;
** [[OSSL Proposals|OSSL Proposed Functions]] &lt;br /&gt;
** [[OSSL Enabling Functions]] &lt;br /&gt;
** [[OSSL Standards|OSSL Standards]]&lt;br /&gt;
&lt;br /&gt;
* LS&lt;br /&gt;
** [[LightShare#LightShare Scripting|LightShare Functions]]&lt;br /&gt;
&lt;br /&gt;
* MOD&lt;br /&gt;
** [[OSSL Script Library/ModSendCommand|modSendCommand()]]&lt;br /&gt;
** [[OSSL Script Library/ModInvoke|Custom functions using modInvoke()]]&lt;br /&gt;
&lt;br /&gt;
* NPC&lt;br /&gt;
** [[Appearance_Formats|Appearance Notecard Format]]&lt;br /&gt;
&lt;br /&gt;
[[Category:OSSL]]&lt;br /&gt;
[[Category:Scripts]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetInventoryNames</id>
		<title>OsGetInventoryNames</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetInventoryNames"/>
				<updated>2024-02-27T06:38:51Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: added return type&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=list osGetInventoryNames(integer type)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetInventoryNames&lt;br /&gt;
// This script uses the function osGetInventoryNames to return a list of inventory items by name&lt;br /&gt;
// based on the inventory type (INVENTORY_ALL)&lt;br /&gt;
// The found item names are output to owner chat&lt;br /&gt;
&lt;br /&gt;
// Define the inventory type constant&lt;br /&gt;
integer INVENTORY_TYPE = INVENTORY_ALL;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Use osGetInventoryNames to fetch the list of inventory items by name&lt;br /&gt;
        list inventoryList = osGetInventoryNames(INVENTORY_TYPE);&lt;br /&gt;
&lt;br /&gt;
        // Check if the list is empty&lt;br /&gt;
        if (llGetListLength(inventoryList) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            // Go through the list and output each item to chat&lt;br /&gt;
            integer numItems = llGetListLength(inventoryList);&lt;br /&gt;
            string itemNames = &amp;quot;Inventory item(s):\n&amp;quot;;&lt;br /&gt;
            integer i;&lt;br /&gt;
            for (i = 0; i &amp;lt; numItems; ++i)&lt;br /&gt;
            {&lt;br /&gt;
                string itemName = llList2String(inventoryList, i);&lt;br /&gt;
                itemNames += itemName + &amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            llOwnerSay(itemNames);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If the list is empty give indication as such&lt;br /&gt;
            llOwnerSay(&amp;quot;Inventory is empty.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return a list of items names by type (or INVENTORY_ALL) located in the prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryDesc</id>
		<title>OsGetLinkInventoryDesc</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryDesc"/>
				<updated>2024-02-27T06:38:05Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: added return type&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=string osGetLinkInventoryDesc(integer linkNumber, string itemNameorid)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetLinkInventoryDesc&lt;br /&gt;
// This script uses the osGetLinkInventoryDesc function to get the description of a specified inventory item&lt;br /&gt;
// It looks for the item via key or name in the specified linked prim&lt;br /&gt;
&lt;br /&gt;
// Define the link number in which to look&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the inventory name or key&lt;br /&gt;
string itemNameOrID = &amp;quot;INVENTORY_KEY_OR_NAME&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the description of the specified item from the linked prim&lt;br /&gt;
        string itemDescription = osGetLinkInventoryDesc(CHILD_PRIM_NUMBER, itemNameOrID);&lt;br /&gt;
&lt;br /&gt;
        // Check if the description is not empty&lt;br /&gt;
        if (itemDescription != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            // Output to owner chat channel&lt;br /&gt;
            llOwnerSay(&amp;quot;Description reads: &amp;quot; + itemDescription);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // Notify if the description is empty or the item is missing entirely&lt;br /&gt;
            llOwnerSay(&amp;quot;Description empty or item not found&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the description of an item located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryNames</id>
		<title>OsGetLinkInventoryNames</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryNames"/>
				<updated>2024-02-27T06:37:49Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: added return type&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=list osGetLinkInventoryNames(integer linkNumber, integer type)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetLinkInventoryNames&lt;br /&gt;
// This script uses the osGetLinkInventoryNames function to return a list of inventory items of a specified type in a specified child prim&lt;br /&gt;
&lt;br /&gt;
// Define the child prim&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the inventory type&lt;br /&gt;
integer INVENTORY_TYPE = INVENTORY_ALL;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the list of inventory items by name&lt;br /&gt;
        list inventoryNames = osGetLinkInventoryNames(CHILD_PRIM_NUMBER, INVENTORY_TYPE);&lt;br /&gt;
&lt;br /&gt;
        // Check if the list contains items&lt;br /&gt;
        if (llGetListLength(inventoryNames) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            // Go through the list and output the names to owner chat&lt;br /&gt;
            integer numItems = llGetListLength(inventoryNames);&lt;br /&gt;
            string itemNames = &amp;quot;Inventory items:\n&amp;quot;;&lt;br /&gt;
            integer i;&lt;br /&gt;
            for (i = 0; i &amp;lt; numItems; ++i)&lt;br /&gt;
            {&lt;br /&gt;
                string itemName = llList2String(inventoryNames, i);&lt;br /&gt;
                itemNames += itemName + &amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            llOwnerSay(itemNames);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If nothing is found indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;The inventory of the child prim is empty or does not contains items of this inventory type&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return a list of items names by type (or INVENTORY_ALL) located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryName</id>
		<title>OsGetLinkInventoryName</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryName"/>
				<updated>2024-02-27T06:37:44Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: added return type&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=string osGetLinkInventoryName(integer linkNumber, key itemId)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Example for osGetLinkInventoryName&lt;br /&gt;
// This script uses the osGetLinkInventoryName function to get the name of an inventory item via the key and child prim number&lt;br /&gt;
&lt;br /&gt;
// Define the child prim&lt;br /&gt;
integer CHILD_PRIM_NUMBER = 2;&lt;br /&gt;
// Define the key of the inventory item&lt;br /&gt;
key itemUUID = &amp;quot;INVENTORY_ITEM_KEY&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Event handler, that is executed on script start&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Get the inventory item name via its key and the child prim number&lt;br /&gt;
        string itemName = osGetLinkInventoryName(CHILD_PRIM_NUMBER, itemUUID);&lt;br /&gt;
&lt;br /&gt;
        // Check if the name is not empty&lt;br /&gt;
        if (itemName != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            // Output the item name to owner chat&lt;br /&gt;
            llOwnerSay(&amp;quot;Name of the inventory item with UUID &amp;quot; + (string)itemUUID + &amp;quot;: &amp;quot; + itemName);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // If the name is empty or the item is not found indicate as such&lt;br /&gt;
            llOwnerSay(&amp;quot;The inventory item with UUID &amp;quot; + (string)itemUUID + &amp;quot; may be empty or not found&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the name of an item located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGiveLinkInventoryList</id>
		<title>OsGiveLinkInventoryList</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGiveLinkInventoryList"/>
				<updated>2024-02-26T18:40:46Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=3|function_syntax=osGiveLinkInventoryList(integer linkNumber, key destination, string category, list inventory)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Give a group of items located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsRemoveLinkInventory</id>
		<title>OsRemoveLinkInventory</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsRemoveLinkInventory"/>
				<updated>2024-02-26T18:15:13Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Created page with &amp;quot;{{osslfunc |threat_level=ignored |permissions=true |delay=0|function_syntax=osRemoveLinkInventory(integer linkNumber, string name)&amp;lt;br&amp;gt; |ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt; &amp;lt;/sour...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=osRemoveLinkInventory(integer linkNumber, string name)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Remove an item from a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGiveLinkInventoryList</id>
		<title>OsGiveLinkInventoryList</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGiveLinkInventoryList"/>
				<updated>2024-02-26T18:14:21Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Created page with &amp;quot;{{osslfunc |threat_level=ignored |permissions=true |delay=0|function_syntax=osGiveLinkInventoryList(integer linkNumber, key destination, string category, list inventory)&amp;lt;br&amp;gt; |...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=osGiveLinkInventoryList(integer linkNumber, key destination, string category, list inventory)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Give a group of items located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:OSSL_Functions</id>
		<title>Category:OSSL Functions</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:OSSL_Functions"/>
				<updated>2024-02-26T18:12:03Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Prim */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#FFA500; padding:10px; padding-bottom:5px; border: 1px #FF544F solid&amp;quot;&amp;gt;&lt;br /&gt;
This information is relative to (almost) the last OpenSimulator Development version. In some cases it may not apply to older versions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OSSL function permissions ==&lt;br /&gt;
Several OSSL functions have execution permission control to prevent abusive or dangerous use.&lt;br /&gt;
&lt;br /&gt;
This is controlled by files osslDefaultEnable.ini and osslEnable.ini, by default in folder bin/config-include&amp;lt;br&amp;gt;&lt;br /&gt;
The use logic of these two files is identical to OpenSimDefaults.ini and OpenSim.ini&lt;br /&gt;
&lt;br /&gt;
Older OpenSimulator versions only used file osslEnable.ini.&amp;lt;br&amp;gt;&lt;br /&gt;
Some older OpenSimulator versions had checks for all OSSLfunctions.&amp;lt;br&amp;gt;&lt;br /&gt;
That made no sense for many functions, so now many are always allowed wasting no time on useless checks.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For details about these permissions, please read file OpenSimDefaults.ini&lt;br /&gt;
&lt;br /&gt;
= osslDefaultEnable.ini =&lt;br /&gt;
This file contains the defaults for OSSL execution permissions set by OpenSimulator dev team.&amp;lt;br&amp;gt;&lt;br /&gt;
Instead of changing defaults defined in code, the OpenSimulator dev team may decide to just make changes in this file.&amp;lt;br&amp;gt;&lt;br /&gt;
This file was not present on older OpenSimulator versions.&amp;lt;br&amp;gt;&lt;br /&gt;
If you need to change permissions, copy the respective entry to osslEnable.ini and modify there.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= osslEnable.ini =&lt;br /&gt;
This file contains the local overrides for OSSL permissions.&amp;lt;br&amp;gt;&lt;br /&gt;
It is read after osslDefaultEnable.ini, and any entry on it replaces the old one.&amp;lt;br&amp;gt;&lt;br /&gt;
This file is not provided on code packages, an osslEnable.ini.example is.&amp;lt;br&amp;gt;&lt;br /&gt;
At first time setup, you will need to copy the example file to osslEnable.ini and then edit it for your needs, using osslDefaults.ini as reference.&amp;lt;br&amp;gt;&lt;br /&gt;
This was the only file used on older OpenSimulator versions.&lt;br /&gt;
&lt;br /&gt;
== Current OSSL Functions Implemented  ==&lt;br /&gt;
&lt;br /&gt;
=== Avatars ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
&lt;br /&gt;
* [[osAgentSaveAppearance]]&lt;br /&gt;
* [[osAvatarName2Key]]&lt;br /&gt;
* [[osAvatarPlayAnimation]] &lt;br /&gt;
* [[osAvatarStopAnimation]] &lt;br /&gt;
* [[osAvatarType]]&lt;br /&gt;
* [[osCauseDamage]] &lt;br /&gt;
* [[osCauseHealing]]&lt;br /&gt;
* [[osDetectedCountry]]&lt;br /&gt;
* [[osDropAttachment]]&lt;br /&gt;
* [[osDropAttachmentAt]]&lt;br /&gt;
* [[osEjectFromGroup]]&lt;br /&gt;
* [[osForceAttachToAvatar]]&lt;br /&gt;
* [[osForceAttachToAvatarFromInventory]]&lt;br /&gt;
* [[osForceAttachToOtherAvatarFromInventory]]&lt;br /&gt;
* [[osForceDetachFromAvatar]]&lt;br /&gt;
* [[osForceDropAttachment]]&lt;br /&gt;
* [[osForceDropAttachmentAt]]&lt;br /&gt;
* [[osForceOtherSit]]&lt;br /&gt;
* [[osGetAgentIP]] &lt;br /&gt;
* [[osGetAgents]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetAgentCountry]]&lt;br /&gt;
* [[osGetAvatarHomeURI]]&lt;br /&gt;
* [[osGetAvatarList]] &lt;br /&gt;
* [[osGetGender]]&lt;br /&gt;
* [[osGetHealRate]]&lt;br /&gt;
* [[osGetHealth]]&lt;br /&gt;
* [[osGetNumberOfAttachments]]&lt;br /&gt;
* [[osGrantScriptPermissions]]&lt;br /&gt;
* [[osInviteToGroup]]&lt;br /&gt;
* [[osKickAvatar]]&lt;br /&gt;
* [[osOwnerSaveAppearance]]&lt;br /&gt;
* [[osRevokeScriptPermissions]]&lt;br /&gt;
* [[osSetHealRate]]&lt;br /&gt;
* [[osSetHealth]]&lt;br /&gt;
* [[osSetOwnerSpeed]]&lt;br /&gt;
* [[osSetSpeed]]&lt;br /&gt;
* [[osLocalTeleportAgent]]&lt;br /&gt;
* [[osTeleportAgent]] &lt;br /&gt;
* [[osTeleportOwner]] &lt;br /&gt;
* [[osReplaceAgentEnvironment]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== NPCs ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osIsNpc]]&lt;br /&gt;
* [[osNpcCreate]]&lt;br /&gt;
* [[osGetNpcList]]&lt;br /&gt;
* [[osNpcGetPos]]&lt;br /&gt;
* [[osNpcGetRot]]&lt;br /&gt;
* [[osNpcGetOwner]]&lt;br /&gt;
* [[osNpcLookAt]] {{E}}&lt;br /&gt;
* [[osNpcLoadAppearance]]&lt;br /&gt;
* [[osNpcMoveTo]]&lt;br /&gt;
* [[osNpcMoveToTarget]]&lt;br /&gt;
* [[osNpcPlayAnimation]]&lt;br /&gt;
* [[osNpcRemove]]&lt;br /&gt;
* [[osNpcSaveAppearance]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osNpcSay]]&lt;br /&gt;
* [[osNpcSayTo]]&lt;br /&gt;
* [[osNpcSetProfileAbout]]&lt;br /&gt;
* [[osNpcSetProfileImage]]&lt;br /&gt;
* [[osNpcSetRot]]&lt;br /&gt;
* [[osNpcShout]]&lt;br /&gt;
* [[osNpcSit]]&lt;br /&gt;
* [[osNpcStand]]&lt;br /&gt;
* [[osNpcStopMoveToTarget]]&lt;br /&gt;
* [[osNpcStopAnimation]]&lt;br /&gt;
* [[osNpcTouch]]&lt;br /&gt;
* [[osNpcWhisper]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Prim ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osClearInertia]]&lt;br /&gt;
* [[osClearObjectAnimations]]&lt;br /&gt;
* [[osDie]]&lt;br /&gt;
* [[osForceBreakAllLinks]]&lt;br /&gt;
* [[osForceBreakLink]] &lt;br /&gt;
* [[osForceCreateLink]]&lt;br /&gt;
* [[osGetInertiaData]]&lt;br /&gt;
* [[osGetInventoryItemKey]]&lt;br /&gt;
* [[osGetInventoryName]]&lt;br /&gt;
* [[osGetInventoryNames]] {{new}}&lt;br /&gt;
* [[osGetInventoryKeys]] {{new}}&lt;br /&gt;
* [[osGetInventoryDesc]]&lt;br /&gt;
* [[osGetInventoryLastOwner]]&lt;br /&gt;
* [[osGetLinkInventoryName]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryNames]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryKey]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryKeys]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryDesc]] {{new}}&lt;br /&gt;
* [[osGiveLinkInventory]] {{new}}&lt;br /&gt;
* [[osGiveLinkInventoryList]] {{new}}&lt;br /&gt;
* [[osRemoveLinkInventory]] {{new}}&lt;br /&gt;
* [[osGetLastChangedEventKey]]&lt;br /&gt;
* [[osGetLinkNumber]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetLinkPrimitiveParams]] &lt;br /&gt;
* [[osGetPrimitiveParams]] &lt;br /&gt;
* [[osGetRezzingObject]]&lt;br /&gt;
* [[osGetSitActiveRange]]&lt;br /&gt;
* [[osGetLinkSitActiveRange]]&lt;br /&gt;
* [[osGetStandTarget]]&lt;br /&gt;
* [[osGetLinkStandTarget]]&lt;br /&gt;
* [[osLinkParticleSystem]] {{new}}&lt;br /&gt;
* [[osMessageAttachments]]&lt;br /&gt;
* [[osMessageObject]]&lt;br /&gt;
* [[osParticleSystem]] {{new}}&lt;br /&gt;
* [[osSetInertia]]&lt;br /&gt;
* [[osSetInertiaAsBox]]&lt;br /&gt;
* [[osSetInertiaAsCylinder]]&lt;br /&gt;
* [[osSetInertiaAsSphere]]&lt;br /&gt;
* [[osSetPrimitiveParams]] &lt;br /&gt;
* [[osSetProjectionParams]]&lt;br /&gt;
* [[osSetSitActiveRange]]&lt;br /&gt;
* [[osSetLinkSitActiveRange]]&lt;br /&gt;
* [[osSetStandTarget]]&lt;br /&gt;
* [[osSetLinkStandTarget]]&lt;br /&gt;
* [[osTeleportObject]]&lt;br /&gt;
* [[osVolumeDetect]]&lt;br /&gt;
* [[osGetPrimCount]] {{new}}&lt;br /&gt;
* [[osGetSittingAvatarsCount]] {{new}}&lt;br /&gt;
&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Prim Drawing / Dynamic Texture ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osDrawEllipse]]&lt;br /&gt;
* [[osDrawFilledEllipse]]&lt;br /&gt;
* [[osDrawFilledPolygon]]&lt;br /&gt;
* [[osDrawFilledRectangle]]&lt;br /&gt;
* [[osDrawImage]]&lt;br /&gt;
* [[osDrawLine]]&lt;br /&gt;
* [[osDrawPolygon]]&lt;br /&gt;
* [[osDrawRectangle]]&lt;br /&gt;
* [[osDrawResetTransform]]&lt;br /&gt;
* [[osDrawRotationTransform]]&lt;br /&gt;
* [[osDrawScaleTransform]]&lt;br /&gt;
* [[osDrawText]]&lt;br /&gt;
* [[osDrawTranslationTransform]]&lt;br /&gt;
* [[osGetDrawStringSize]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osMovePen]]&lt;br /&gt;
* [[osSetFontName]]&lt;br /&gt;
* [[osSetFontSize]]&lt;br /&gt;
* [[osSetPenCap]]&lt;br /&gt;
* [[osSetPenColor]]&lt;br /&gt;
* [[osSetPenSize]]&lt;br /&gt;
* [[osSetDynamicTextureData]]&lt;br /&gt;
* [[osSetDynamicTextureDataFace]]&lt;br /&gt;
* [[osSetDynamicTextureDataBlend]]&lt;br /&gt;
* [[osSetDynamicTextureDataBlendFace]] &lt;br /&gt;
* [[osSetDynamicTextureURL]]&lt;br /&gt;
* [[osSetDynamicTextureURLBlend]]&lt;br /&gt;
* [[osSetDynamicTextureURLBlendFace]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
* [[osGetNotecard]] &lt;br /&gt;
* [[osGetNotecardLine]] &lt;br /&gt;
* [[osGetNumberOfNotecardLines]]&lt;br /&gt;
* [[osMakeNotecard]]&lt;br /&gt;
&lt;br /&gt;
=== Sound ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osAdjustSoundVolume]]&lt;br /&gt;
* [[osCollisionSound]]&lt;br /&gt;
* [[osLoopSound]]&lt;br /&gt;
* [[osLoopSoundMaster]]&lt;br /&gt;
* [[osLoopSoundSlave]]&lt;br /&gt;
* [[osPlaySound]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osPlaySoundSlave]]&lt;br /&gt;
* [[osPreloadSound]]&lt;br /&gt;
* [[osSetSoundRadius]]&lt;br /&gt;
* [[osStopSound]]&lt;br /&gt;
* [[osTriggerSound]]&lt;br /&gt;
* [[osTriggerSoundLimited]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
* [[osRequestSecureURL]]&lt;br /&gt;
* [[osRequestURL]]&lt;br /&gt;
* [[osSetContentType]]&lt;br /&gt;
&lt;br /&gt;
=== Parcel ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osParcelJoin]] &lt;br /&gt;
* [[osParcelSubdivide]] &lt;br /&gt;
* [[osGetParcelDwell]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osSetParcelDetails]]&lt;br /&gt;
* [[osGetParcelDetails]]&lt;br /&gt;
* [[osGetParcelIDs]]&lt;br /&gt;
* [[osGetParcelID]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Terrain ===&lt;br /&gt;
* [[osGetTerrainHeight]] &lt;br /&gt;
* [[osSetTerrainHeight]] &lt;br /&gt;
* [[osSetTerrainTexture]]&lt;br /&gt;
* [[osSetTerrainTextureHeight]]&lt;br /&gt;
* [[osTerrainFlush]]&lt;br /&gt;
&lt;br /&gt;
=== Region / Parcel Environment ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osGetCurrentSunHour]] &lt;br /&gt;
* [[osGetApparentTime]]&lt;br /&gt;
* [[osGetApparentTimeString]]&lt;br /&gt;
* [[osGetApparentRegionTime]]&lt;br /&gt;
* [[osGetApparentRegionTimeString]]&lt;br /&gt;
* [[osGetWindParam]] &lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osSetRegionWaterHeight]] &lt;br /&gt;
* [[osSetWindParam]]&lt;br /&gt;
* [[osWindActiveModelPluginName]]&lt;br /&gt;
* [[osReplaceParcelEnvironment]]&lt;br /&gt;
* [[osReplaceRegionEnvironment]]&lt;br /&gt;
* [[osResetEnvironment]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Grid / Region Information ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osCheckODE]]&lt;br /&gt;
* [[osGetGridCustom]]&lt;br /&gt;
* [[osGetGridGatekeeperURI]]&lt;br /&gt;
* [[osGetGridHomeURI]]&lt;br /&gt;
* [[osGetGridLoginURI]]&lt;br /&gt;
* [[osGetGridName]] &lt;br /&gt;
* [[osGetGridNick]] &lt;br /&gt;
* [[osGetMapTexture]] &lt;br /&gt;
* [[osGetPhysicsEngineName]]&lt;br /&gt;
* [[osGetPhysicsEngineType]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetRegionMapTexture]] &lt;br /&gt;
* [[osGetRegionSize]]&lt;br /&gt;
* [[osGetRegionStats]] &lt;br /&gt;
* [[osGetScriptEngineName]] &lt;br /&gt;
* [[osGetSimulatorMemory]] &lt;br /&gt;
* [[osGetSimulatorMemoryKB]]&lt;br /&gt;
* [[osGetSimulatorVersion]] &lt;br /&gt;
* [[osLoadedCreationDate]] &lt;br /&gt;
* [[osLoadedCreationID]] &lt;br /&gt;
* [[osLoadedCreationTime]] &lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Administration ===&lt;br /&gt;
* [[osConsoleCommand]] &lt;br /&gt;
* [[osRegionNotice]]&lt;br /&gt;
* [[osRegionRestart]] &lt;br /&gt;
* [[osSetParcelMediaURL]] &lt;br /&gt;
* [[osSetParcelMusicURL]]&lt;br /&gt;
* [[osSetParcelSIPAddress]]&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
*[[osResetAllScripts]]&lt;br /&gt;
&lt;br /&gt;
=== String Manipulation ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osFormatString]]&lt;br /&gt;
* [[osListenRegex]]&lt;br /&gt;
* [[osMatchString]]&lt;br /&gt;
* [[osRegexIsMatch]]&lt;br /&gt;
* [[osReplaceString]]&lt;br /&gt;
* [[osStringSubString]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osStringStartsWith]]&lt;br /&gt;
* [[osStringEndsWith]]&lt;br /&gt;
* [[osStringIndexOf]]&lt;br /&gt;
* [[osStringLastIndexOf]]&lt;br /&gt;
* [[osStringRemove]]&lt;br /&gt;
* [[osStringReplace]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osAESEncrypt]] {{new}}&lt;br /&gt;
* [[osAESDecrypt]] {{new}}&lt;br /&gt;
* [[osAESEncryptTo]] {{new}}&lt;br /&gt;
* [[osAESDecryptFrom]] {{new}}&lt;br /&gt;
* [[osAngleBetween]]&lt;br /&gt;
* [[osApproxEquals]]&lt;br /&gt;
* [[osGetPSTWallclock]]&lt;br /&gt;
* [[osListSortInPlace]]&lt;br /&gt;
* [[osListSortInPlaceStrided]] {{new}}&lt;br /&gt;
* [[osIsUUID]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osIsNotValidNumber]]&lt;br /&gt;
* [[osKey2Name]]&lt;br /&gt;
* [[osMax]]&lt;br /&gt;
* [[osMin]]&lt;br /&gt;
* [[osRound]]&lt;br /&gt;
* [[osSHA256]]&lt;br /&gt;
* [[osSlerp]]&lt;br /&gt;
* [[osUnixTimeToTimestamp]] &lt;br /&gt;
* [[osVecDistSquare]]&lt;br /&gt;
* [[osVecMagSquare]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Deprecated ===&lt;br /&gt;
* [[osParcelSetDetails|&amp;lt;strike&amp;gt;osParcelSetDetails&amp;lt;/strike&amp;gt;]] - Use [[osSetParcelDetails]] &lt;br /&gt;
* [[osSetPenColour|&amp;lt;strike&amp;gt;osSetPenColour&amp;lt;/strike&amp;gt;]] - Use [[osSetPenColor]] &lt;br /&gt;
* [[osSunGetParam|&amp;lt;strike&amp;gt;osSunGetParam&amp;lt;/strike&amp;gt;]] - Use [[osGetSunParam]] &lt;br /&gt;
* [[osSunSetParam|&amp;lt;strike&amp;gt;osSunSetParam&amp;lt;/strike&amp;gt;]] - Use [[osSetSunParam]] &lt;br /&gt;
* [[osTerrainGetHeight|&amp;lt;strike&amp;gt;osTerrainGetHeight&amp;lt;/strike&amp;gt;]] - Use [[osGetTerrainHeight]] &lt;br /&gt;
* [[osTerrainSetHeight|&amp;lt;strike&amp;gt;osTerrainSetHeight&amp;lt;/strike&amp;gt;]] - Use [[osSetTerrainHeight]]&lt;br /&gt;
*&amp;lt;strike&amp;gt;osWindParamGet&amp;lt;/strike&amp;gt; - Use [[osGetWindParam]]&lt;br /&gt;
*&amp;lt;strike&amp;gt;osWindParamSet&amp;lt;/strike&amp;gt; - Use [[osSetWindParam]]&lt;br /&gt;
* [[osList2Double|&amp;lt;strike&amp;gt;osList2Double&amp;lt;/strike&amp;gt;]] - Use llList2Float&lt;br /&gt;
* [[osGetSunParam]]&lt;br /&gt;
* [[osSetEstateSunSettings]]&lt;br /&gt;
* [[osSetRegionSunSettings]]&lt;br /&gt;
* [[osSetSunParam]]&lt;br /&gt;
* [[osSetPrimFloatOnWater]]&lt;br /&gt;
&lt;br /&gt;
== See Also  ==&lt;br /&gt;
&lt;br /&gt;
* [[OSSL_vs_LSL|LSL&amp;amp;OSSL : Neighbour functions, similarities and differences]] &lt;br /&gt;
* [[Accessing_Prim_Properties|LSL&amp;amp;OSSL : Guide to prims addressing (by linknum, by uuid)]]&lt;br /&gt;
* [[LSL Status|LSL/OSSL Status Page]] &lt;br /&gt;
*OSSL &lt;br /&gt;
** [[OSSL_Implemented|OSSL Implemented Functions]] &lt;br /&gt;
** [[OSSL Constants|OSSL Constants]] &lt;br /&gt;
** [[OSSL Status/Types|OSSL Types Status Page]] &lt;br /&gt;
** [[OSSL Status/Events|OSSL Events Status Page]] &lt;br /&gt;
&lt;br /&gt;
** [[Dynamic_textures|OSSL osDynamicTextures Functions Index Page]]&lt;br /&gt;
** [[OSSL TextureDrawing|OSSL TextureDrawing Extended Information]]&lt;br /&gt;
** [[OSSLNPC|OSSL functions for working with NPCs]]&lt;br /&gt;
&lt;br /&gt;
** [[OSSL Proposals|OSSL Proposed Functions]] &lt;br /&gt;
** [[OSSL Enabling Functions]] &lt;br /&gt;
** [[OSSL Standards|OSSL Standards]]&lt;br /&gt;
&lt;br /&gt;
* LS&lt;br /&gt;
** [[LightShare#LightShare Scripting|LightShare Functions]]&lt;br /&gt;
&lt;br /&gt;
* MOD&lt;br /&gt;
** [[OSSL Script Library/ModSendCommand|modSendCommand()]]&lt;br /&gt;
** [[OSSL Script Library/ModInvoke|Custom functions using modInvoke()]]&lt;br /&gt;
&lt;br /&gt;
* NPC&lt;br /&gt;
** [[Appearance_Formats|Appearance Notecard Format]]&lt;br /&gt;
&lt;br /&gt;
[[Category:OSSL]]&lt;br /&gt;
[[Category:Scripts]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Category:OSSL_Functions</id>
		<title>Category:OSSL Functions</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Category:OSSL_Functions"/>
				<updated>2024-02-24T14:22:50Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: /* Misc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#FFA500; padding:10px; padding-bottom:5px; border: 1px #FF544F solid&amp;quot;&amp;gt;&lt;br /&gt;
This information is relative to (almost) the last OpenSimulator Development version. In some cases it may not apply to older versions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OSSL function permissions ==&lt;br /&gt;
Several OSSL functions have execution permission control to prevent abusive or dangerous use.&lt;br /&gt;
&lt;br /&gt;
This is controlled by files osslDefaultEnable.ini and osslEnable.ini, by default in folder bin/config-include&amp;lt;br&amp;gt;&lt;br /&gt;
The use logic of these two files is identical to OpenSimDefaults.ini and OpenSim.ini&lt;br /&gt;
&lt;br /&gt;
Older OpenSimulator versions only used file osslEnable.ini.&amp;lt;br&amp;gt;&lt;br /&gt;
Some older OpenSimulator versions had checks for all OSSLfunctions.&amp;lt;br&amp;gt;&lt;br /&gt;
That made no sense for many functions, so now many are always allowed wasting no time on useless checks.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For details about these permissions, please read file OpenSimDefaults.ini&lt;br /&gt;
&lt;br /&gt;
= osslDefaultEnable.ini =&lt;br /&gt;
This file contains the defaults for OSSL execution permissions set by OpenSimulator dev team.&amp;lt;br&amp;gt;&lt;br /&gt;
Instead of changing defaults defined in code, the OpenSimulator dev team may decide to just make changes in this file.&amp;lt;br&amp;gt;&lt;br /&gt;
This file was not present on older OpenSimulator versions.&amp;lt;br&amp;gt;&lt;br /&gt;
If you need to change permissions, copy the respective entry to osslEnable.ini and modify there.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= osslEnable.ini =&lt;br /&gt;
This file contains the local overrides for OSSL permissions.&amp;lt;br&amp;gt;&lt;br /&gt;
It is read after osslDefaultEnable.ini, and any entry on it replaces the old one.&amp;lt;br&amp;gt;&lt;br /&gt;
This file is not provided on code packages, an osslEnable.ini.example is.&amp;lt;br&amp;gt;&lt;br /&gt;
At first time setup, you will need to copy the example file to osslEnable.ini and then edit it for your needs, using osslDefaults.ini as reference.&amp;lt;br&amp;gt;&lt;br /&gt;
This was the only file used on older OpenSimulator versions.&lt;br /&gt;
&lt;br /&gt;
== Current OSSL Functions Implemented  ==&lt;br /&gt;
&lt;br /&gt;
=== Avatars ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
&lt;br /&gt;
* [[osAgentSaveAppearance]]&lt;br /&gt;
* [[osAvatarName2Key]]&lt;br /&gt;
* [[osAvatarPlayAnimation]] &lt;br /&gt;
* [[osAvatarStopAnimation]] &lt;br /&gt;
* [[osAvatarType]]&lt;br /&gt;
* [[osCauseDamage]] &lt;br /&gt;
* [[osCauseHealing]]&lt;br /&gt;
* [[osDetectedCountry]]&lt;br /&gt;
* [[osDropAttachment]]&lt;br /&gt;
* [[osDropAttachmentAt]]&lt;br /&gt;
* [[osEjectFromGroup]]&lt;br /&gt;
* [[osForceAttachToAvatar]]&lt;br /&gt;
* [[osForceAttachToAvatarFromInventory]]&lt;br /&gt;
* [[osForceAttachToOtherAvatarFromInventory]]&lt;br /&gt;
* [[osForceDetachFromAvatar]]&lt;br /&gt;
* [[osForceDropAttachment]]&lt;br /&gt;
* [[osForceDropAttachmentAt]]&lt;br /&gt;
* [[osForceOtherSit]]&lt;br /&gt;
* [[osGetAgentIP]] &lt;br /&gt;
* [[osGetAgents]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetAgentCountry]]&lt;br /&gt;
* [[osGetAvatarHomeURI]]&lt;br /&gt;
* [[osGetAvatarList]] &lt;br /&gt;
* [[osGetGender]]&lt;br /&gt;
* [[osGetHealRate]]&lt;br /&gt;
* [[osGetHealth]]&lt;br /&gt;
* [[osGetNumberOfAttachments]]&lt;br /&gt;
* [[osGrantScriptPermissions]]&lt;br /&gt;
* [[osInviteToGroup]]&lt;br /&gt;
* [[osKickAvatar]]&lt;br /&gt;
* [[osOwnerSaveAppearance]]&lt;br /&gt;
* [[osRevokeScriptPermissions]]&lt;br /&gt;
* [[osSetHealRate]]&lt;br /&gt;
* [[osSetHealth]]&lt;br /&gt;
* [[osSetOwnerSpeed]]&lt;br /&gt;
* [[osSetSpeed]]&lt;br /&gt;
* [[osLocalTeleportAgent]]&lt;br /&gt;
* [[osTeleportAgent]] &lt;br /&gt;
* [[osTeleportOwner]] &lt;br /&gt;
* [[osReplaceAgentEnvironment]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== NPCs ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osIsNpc]]&lt;br /&gt;
* [[osNpcCreate]]&lt;br /&gt;
* [[osGetNpcList]]&lt;br /&gt;
* [[osNpcGetPos]]&lt;br /&gt;
* [[osNpcGetRot]]&lt;br /&gt;
* [[osNpcGetOwner]]&lt;br /&gt;
* [[osNpcLookAt]] {{E}}&lt;br /&gt;
* [[osNpcLoadAppearance]]&lt;br /&gt;
* [[osNpcMoveTo]]&lt;br /&gt;
* [[osNpcMoveToTarget]]&lt;br /&gt;
* [[osNpcPlayAnimation]]&lt;br /&gt;
* [[osNpcRemove]]&lt;br /&gt;
* [[osNpcSaveAppearance]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osNpcSay]]&lt;br /&gt;
* [[osNpcSayTo]]&lt;br /&gt;
* [[osNpcSetProfileAbout]]&lt;br /&gt;
* [[osNpcSetProfileImage]]&lt;br /&gt;
* [[osNpcSetRot]]&lt;br /&gt;
* [[osNpcShout]]&lt;br /&gt;
* [[osNpcSit]]&lt;br /&gt;
* [[osNpcStand]]&lt;br /&gt;
* [[osNpcStopMoveToTarget]]&lt;br /&gt;
* [[osNpcStopAnimation]]&lt;br /&gt;
* [[osNpcTouch]]&lt;br /&gt;
* [[osNpcWhisper]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Prim ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osClearInertia]]&lt;br /&gt;
* [[osClearObjectAnimations]]&lt;br /&gt;
* [[osDie]]&lt;br /&gt;
* [[osForceBreakAllLinks]]&lt;br /&gt;
* [[osForceBreakLink]] &lt;br /&gt;
* [[osForceCreateLink]]&lt;br /&gt;
* [[osGetInertiaData]]&lt;br /&gt;
* [[osGetInventoryItemKey]]&lt;br /&gt;
* [[osGetInventoryName]]&lt;br /&gt;
* [[osGetInventoryNames]] {{new}}&lt;br /&gt;
* [[osGetInventoryKeys]] {{new}}&lt;br /&gt;
* [[osGetInventoryDesc]]&lt;br /&gt;
* [[osGetInventoryLastOwner]]&lt;br /&gt;
* [[osGetLinkInventoryName]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryNames]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryKey]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryKeys]] {{new}}&lt;br /&gt;
* [[osGetLinkInventoryDesc]] {{new}}&lt;br /&gt;
* [[osGiveLinkInventory]] {{new}}&lt;br /&gt;
* [[osGetLastChangedEventKey]]&lt;br /&gt;
* [[osGetLinkNumber]]&lt;br /&gt;
* [[osGetLinkPrimitiveParams]] &lt;br /&gt;
* [[osGetPrimitiveParams]] &lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetRezzingObject]]&lt;br /&gt;
* [[osGetSitActiveRange]]&lt;br /&gt;
* [[osGetLinkSitActiveRange]]&lt;br /&gt;
* [[osGetStandTarget]]&lt;br /&gt;
* [[osGetLinkStandTarget]]&lt;br /&gt;
* [[osLinkParticleSystem]] {{new}}&lt;br /&gt;
* [[osMessageAttachments]]&lt;br /&gt;
* [[osMessageObject]]&lt;br /&gt;
* [[osParticleSystem]] {{new}}&lt;br /&gt;
* [[osSetInertia]]&lt;br /&gt;
* [[osSetInertiaAsBox]]&lt;br /&gt;
* [[osSetInertiaAsCylinder]]&lt;br /&gt;
* [[osSetInertiaAsSphere]]&lt;br /&gt;
* [[osSetPrimitiveParams]] &lt;br /&gt;
* [[osSetProjectionParams]]&lt;br /&gt;
* [[osSetSitActiveRange]]&lt;br /&gt;
* [[osSetLinkSitActiveRange]]&lt;br /&gt;
* [[osSetStandTarget]]&lt;br /&gt;
* [[osSetLinkStandTarget]]&lt;br /&gt;
* [[osTeleportObject]]&lt;br /&gt;
* [[osVolumeDetect]]&lt;br /&gt;
* [[osGetPrimCount]] {{new}}&lt;br /&gt;
* [[osGetSittingAvatarsCount]] {{new}}&lt;br /&gt;
&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Prim Drawing / Dynamic Texture ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osDrawEllipse]]&lt;br /&gt;
* [[osDrawFilledEllipse]]&lt;br /&gt;
* [[osDrawFilledPolygon]]&lt;br /&gt;
* [[osDrawFilledRectangle]]&lt;br /&gt;
* [[osDrawImage]]&lt;br /&gt;
* [[osDrawLine]]&lt;br /&gt;
* [[osDrawPolygon]]&lt;br /&gt;
* [[osDrawRectangle]]&lt;br /&gt;
* [[osDrawResetTransform]]&lt;br /&gt;
* [[osDrawRotationTransform]]&lt;br /&gt;
* [[osDrawScaleTransform]]&lt;br /&gt;
* [[osDrawText]]&lt;br /&gt;
* [[osDrawTranslationTransform]]&lt;br /&gt;
* [[osGetDrawStringSize]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osMovePen]]&lt;br /&gt;
* [[osSetFontName]]&lt;br /&gt;
* [[osSetFontSize]]&lt;br /&gt;
* [[osSetPenCap]]&lt;br /&gt;
* [[osSetPenColor]]&lt;br /&gt;
* [[osSetPenSize]]&lt;br /&gt;
* [[osSetDynamicTextureData]]&lt;br /&gt;
* [[osSetDynamicTextureDataFace]]&lt;br /&gt;
* [[osSetDynamicTextureDataBlend]]&lt;br /&gt;
* [[osSetDynamicTextureDataBlendFace]] &lt;br /&gt;
* [[osSetDynamicTextureURL]]&lt;br /&gt;
* [[osSetDynamicTextureURLBlend]]&lt;br /&gt;
* [[osSetDynamicTextureURLBlendFace]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
* [[osGetNotecard]] &lt;br /&gt;
* [[osGetNotecardLine]] &lt;br /&gt;
* [[osGetNumberOfNotecardLines]]&lt;br /&gt;
* [[osMakeNotecard]]&lt;br /&gt;
&lt;br /&gt;
=== Sound ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osAdjustSoundVolume]]&lt;br /&gt;
* [[osCollisionSound]]&lt;br /&gt;
* [[osLoopSound]]&lt;br /&gt;
* [[osLoopSoundMaster]]&lt;br /&gt;
* [[osLoopSoundSlave]]&lt;br /&gt;
* [[osPlaySound]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osPlaySoundSlave]]&lt;br /&gt;
* [[osPreloadSound]]&lt;br /&gt;
* [[osSetSoundRadius]]&lt;br /&gt;
* [[osStopSound]]&lt;br /&gt;
* [[osTriggerSound]]&lt;br /&gt;
* [[osTriggerSoundLimited]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
* [[osRequestSecureURL]]&lt;br /&gt;
* [[osRequestURL]]&lt;br /&gt;
* [[osSetContentType]]&lt;br /&gt;
&lt;br /&gt;
=== Parcel ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osParcelJoin]] &lt;br /&gt;
* [[osParcelSubdivide]] &lt;br /&gt;
* [[osGetParcelDwell]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osSetParcelDetails]]&lt;br /&gt;
* [[osGetParcelDetails]]&lt;br /&gt;
* [[osGetParcelIDs]]&lt;br /&gt;
* [[osGetParcelID]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Terrain ===&lt;br /&gt;
* [[osGetTerrainHeight]] &lt;br /&gt;
* [[osSetTerrainHeight]] &lt;br /&gt;
* [[osSetTerrainTexture]]&lt;br /&gt;
* [[osSetTerrainTextureHeight]]&lt;br /&gt;
* [[osTerrainFlush]]&lt;br /&gt;
&lt;br /&gt;
=== Region / Parcel Environment ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osGetCurrentSunHour]] &lt;br /&gt;
* [[osGetApparentTime]]&lt;br /&gt;
* [[osGetApparentTimeString]]&lt;br /&gt;
* [[osGetApparentRegionTime]]&lt;br /&gt;
* [[osGetApparentRegionTimeString]]&lt;br /&gt;
* [[osGetWindParam]] &lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osSetRegionWaterHeight]] &lt;br /&gt;
* [[osSetWindParam]]&lt;br /&gt;
* [[osWindActiveModelPluginName]]&lt;br /&gt;
* [[osReplaceParcelEnvironment]]&lt;br /&gt;
* [[osReplaceRegionEnvironment]]&lt;br /&gt;
* [[osResetEnvironment]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Grid / Region Information ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osCheckODE]]&lt;br /&gt;
* [[osGetGridCustom]]&lt;br /&gt;
* [[osGetGridGatekeeperURI]]&lt;br /&gt;
* [[osGetGridHomeURI]]&lt;br /&gt;
* [[osGetGridLoginURI]]&lt;br /&gt;
* [[osGetGridName]] &lt;br /&gt;
* [[osGetGridNick]] &lt;br /&gt;
* [[osGetMapTexture]] &lt;br /&gt;
* [[osGetPhysicsEngineName]]&lt;br /&gt;
* [[osGetPhysicsEngineType]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osGetRegionMapTexture]] &lt;br /&gt;
* [[osGetRegionSize]]&lt;br /&gt;
* [[osGetRegionStats]] &lt;br /&gt;
* [[osGetScriptEngineName]] &lt;br /&gt;
* [[osGetSimulatorMemory]] &lt;br /&gt;
* [[osGetSimulatorMemoryKB]]&lt;br /&gt;
* [[osGetSimulatorVersion]] &lt;br /&gt;
* [[osLoadedCreationDate]] &lt;br /&gt;
* [[osLoadedCreationID]] &lt;br /&gt;
* [[osLoadedCreationTime]] &lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Administration ===&lt;br /&gt;
* [[osConsoleCommand]] &lt;br /&gt;
* [[osRegionNotice]]&lt;br /&gt;
* [[osRegionRestart]] &lt;br /&gt;
* [[osSetParcelMediaURL]] &lt;br /&gt;
* [[osSetParcelMusicURL]]&lt;br /&gt;
* [[osSetParcelSIPAddress]]&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
*[[osResetAllScripts]]&lt;br /&gt;
&lt;br /&gt;
=== String Manipulation ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osFormatString]]&lt;br /&gt;
* [[osListenRegex]]&lt;br /&gt;
* [[osMatchString]]&lt;br /&gt;
* [[osRegexIsMatch]]&lt;br /&gt;
* [[osReplaceString]]&lt;br /&gt;
* [[osStringSubString]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osStringStartsWith]]&lt;br /&gt;
* [[osStringEndsWith]]&lt;br /&gt;
* [[osStringIndexOf]]&lt;br /&gt;
* [[osStringLastIndexOf]]&lt;br /&gt;
* [[osStringRemove]]&lt;br /&gt;
* [[osStringReplace]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
{{multicol}}&lt;br /&gt;
* [[osAESEncrypt]] {{new}}&lt;br /&gt;
* [[osAESDecrypt]] {{new}}&lt;br /&gt;
* [[osAESEncryptTo]] {{new}}&lt;br /&gt;
* [[osAESDecryptFrom]] {{new}}&lt;br /&gt;
* [[osAngleBetween]]&lt;br /&gt;
* [[osApproxEquals]]&lt;br /&gt;
* [[osGetPSTWallclock]]&lt;br /&gt;
* [[osListSortInPlace]]&lt;br /&gt;
* [[osListSortInPlaceStrided]] {{new}}&lt;br /&gt;
* [[osIsUUID]]&lt;br /&gt;
{{multicol-break}}&lt;br /&gt;
* [[osIsNotValidNumber]]&lt;br /&gt;
* [[osKey2Name]]&lt;br /&gt;
* [[osMax]]&lt;br /&gt;
* [[osMin]]&lt;br /&gt;
* [[osRound]]&lt;br /&gt;
* [[osSHA256]]&lt;br /&gt;
* [[osSlerp]]&lt;br /&gt;
* [[osUnixTimeToTimestamp]] &lt;br /&gt;
* [[osVecDistSquare]]&lt;br /&gt;
* [[osVecMagSquare]]&lt;br /&gt;
{{multicol-end}}&lt;br /&gt;
&lt;br /&gt;
=== Deprecated ===&lt;br /&gt;
* [[osParcelSetDetails|&amp;lt;strike&amp;gt;osParcelSetDetails&amp;lt;/strike&amp;gt;]] - Use [[osSetParcelDetails]] &lt;br /&gt;
* [[osSetPenColour|&amp;lt;strike&amp;gt;osSetPenColour&amp;lt;/strike&amp;gt;]] - Use [[osSetPenColor]] &lt;br /&gt;
* [[osSunGetParam|&amp;lt;strike&amp;gt;osSunGetParam&amp;lt;/strike&amp;gt;]] - Use [[osGetSunParam]] &lt;br /&gt;
* [[osSunSetParam|&amp;lt;strike&amp;gt;osSunSetParam&amp;lt;/strike&amp;gt;]] - Use [[osSetSunParam]] &lt;br /&gt;
* [[osTerrainGetHeight|&amp;lt;strike&amp;gt;osTerrainGetHeight&amp;lt;/strike&amp;gt;]] - Use [[osGetTerrainHeight]] &lt;br /&gt;
* [[osTerrainSetHeight|&amp;lt;strike&amp;gt;osTerrainSetHeight&amp;lt;/strike&amp;gt;]] - Use [[osSetTerrainHeight]]&lt;br /&gt;
*&amp;lt;strike&amp;gt;osWindParamGet&amp;lt;/strike&amp;gt; - Use [[osGetWindParam]]&lt;br /&gt;
*&amp;lt;strike&amp;gt;osWindParamSet&amp;lt;/strike&amp;gt; - Use [[osSetWindParam]]&lt;br /&gt;
* [[osList2Double|&amp;lt;strike&amp;gt;osList2Double&amp;lt;/strike&amp;gt;]] - Use llList2Float&lt;br /&gt;
* [[osGetSunParam]]&lt;br /&gt;
* [[osSetEstateSunSettings]]&lt;br /&gt;
* [[osSetRegionSunSettings]]&lt;br /&gt;
* [[osSetSunParam]]&lt;br /&gt;
* [[osSetPrimFloatOnWater]]&lt;br /&gt;
&lt;br /&gt;
== See Also  ==&lt;br /&gt;
&lt;br /&gt;
* [[OSSL_vs_LSL|LSL&amp;amp;OSSL : Neighbour functions, similarities and differences]] &lt;br /&gt;
* [[Accessing_Prim_Properties|LSL&amp;amp;OSSL : Guide to prims addressing (by linknum, by uuid)]]&lt;br /&gt;
* [[LSL Status|LSL/OSSL Status Page]] &lt;br /&gt;
*OSSL &lt;br /&gt;
** [[OSSL_Implemented|OSSL Implemented Functions]] &lt;br /&gt;
** [[OSSL Constants|OSSL Constants]] &lt;br /&gt;
** [[OSSL Status/Types|OSSL Types Status Page]] &lt;br /&gt;
** [[OSSL Status/Events|OSSL Events Status Page]] &lt;br /&gt;
&lt;br /&gt;
** [[Dynamic_textures|OSSL osDynamicTextures Functions Index Page]]&lt;br /&gt;
** [[OSSL TextureDrawing|OSSL TextureDrawing Extended Information]]&lt;br /&gt;
** [[OSSLNPC|OSSL functions for working with NPCs]]&lt;br /&gt;
&lt;br /&gt;
** [[OSSL Proposals|OSSL Proposed Functions]] &lt;br /&gt;
** [[OSSL Enabling Functions]] &lt;br /&gt;
** [[OSSL Standards|OSSL Standards]]&lt;br /&gt;
&lt;br /&gt;
* LS&lt;br /&gt;
** [[LightShare#LightShare Scripting|LightShare Functions]]&lt;br /&gt;
&lt;br /&gt;
* MOD&lt;br /&gt;
** [[OSSL Script Library/ModSendCommand|modSendCommand()]]&lt;br /&gt;
** [[OSSL Script Library/ModInvoke|Custom functions using modInvoke()]]&lt;br /&gt;
&lt;br /&gt;
* NPC&lt;br /&gt;
** [[Appearance_Formats|Appearance Notecard Format]]&lt;br /&gt;
&lt;br /&gt;
[[Category:OSSL]]&lt;br /&gt;
[[Category:Scripts]]&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGiveLinkInventory</id>
		<title>OsGiveLinkInventory</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGiveLinkInventory"/>
				<updated>2024-02-22T07:16:23Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=3|function_syntax=osGiveLinkInventory(integer linkNumber, key destination, string inventory)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Give an item located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OsGetLinkInventoryName</id>
		<title>OsGetLinkInventoryName</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OsGetLinkInventoryName"/>
				<updated>2024-02-22T07:13:11Z</updated>
		
		<summary type="html">&lt;p&gt;JeffKelley: Created page with &amp;quot;{{osslfunc |threat_level=ignored |permissions=true |delay=0|function_syntax=osGetLinkInventoryName(integer linkNumber, key itemId)&amp;lt;br&amp;gt; |ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt; &amp;lt;/sour...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{osslfunc&lt;br /&gt;
|threat_level=ignored&lt;br /&gt;
|permissions=true&lt;br /&gt;
|delay=0|function_syntax=osGetLinkInventoryName(integer linkNumber, key itemId)&amp;lt;br&amp;gt;&lt;br /&gt;
|ossl_example=&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|description=&lt;br /&gt;
Return the name of an item located in a child prim inventory.&lt;br /&gt;
|additional_info=This function was added in 0.9.3.0&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JeffKelley</name></author>	</entry>

	</feed>