https://wiki.secondlife.com/w/api.php?action=feedcontributions&user=Tapple+Gao&feedformat=atomSecond Life Wiki - User contributions [en]2024-03-28T17:01:02ZUser contributionsMediaWiki 1.36.1https://wiki.secondlife.com/w/index.php?title=LlGetNotecardLineSync&diff=1216359LlGetNotecardLineSync2024-03-16T01:13:15Z<p>Tapple Gao: </p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/negative_index|false|line}}{{LSL_Function/notecard|name|uuid=true}}<br />
|func_id=|func_sleep=0.0|func_energy=10.0<br />
|sort=GetNotecardLineSync<br />
|func=llGetNotecardLineSync<br />
|return_type=string<br />
|p1_type=string|p1_name=name<br />
|p2_type=integer|p2_name=line|p2_desc=Line number in a notecard (the index starts at zero).<br />
|func_desc=Gets the line {{LSLP|line}} of the notecard {{LSLP|name}} immediately, if it is present in sim memory.<br />
|Return_text=containing the text of the requested line from the notecard.<br />
|func_footnote=Returns [[EOF]] if {{LSLP|line}} is past the end of the notecard.<br />
|spec=<br />
This function returns a string containing the requested line from a notecard in prim inventory, without the need for an asynchronous dataserver event, if the notecard is cached/known in its entirety by the simulator. This speeds up acessing notecard lines tremendously, and allows for near instantaneous random access.<br />
<br />
If the notecard does not exist it returns the constant [[NAK]] and will shout a message to the debug channel. If the notecard has not been previously cached on the simulator it will return the [[NAK]] constant.<br />
<br />
It is not safe to assume a notecard has been previously cached. Data for a previously cached notecard may be dropped from the cache at any time, especially on a busy server.<br />
<br />
|caveats=* If notecard contains embedded inventory items (such as textures and landmarks), [[EOF]] will be returned, regardless of the line requested.<br />
*If the requested line is longer than 1024 bytes the returned string will be truncated to the first 1024 bytes of the line.<br />
*A dataserver event does '''not''' get raised. Therefore, other scripts in the linkset are unaware of the processed notecard lines.<br />
|constants<br />
|examples=<br />
<syntaxhighlight lang="lsl2"><br />
string NOTECARD_NAME = "notecard";<br />
key READ_KEY = NULL_KEY;<br />
<br />
default<br />
{<br />
<br />
touch_start(integer total_number)<br />
{<br />
READ_KEY = llGetNumberOfNotecardLines(NOTECARD_NAME);<br />
}<br />
<br />
dataserver(key request, string data)<br />
{<br />
if (request == READ_KEY)<br />
{<br />
integer count = (integer)data;<br />
integer index;<br />
<br />
for (index = 0; index < count; ++index)<br />
{<br />
string line = llGetNotecardLineSync(NOTECARD_NAME, index);<br />
if (line == NAK)<br />
{<br />
llOwnerSay("---NAK---");<br />
}<br />
else if (line == EOF)<br />
{<br />
llOwnerSay("---EOF---");<br />
}<br />
else<br />
{<br />
llOwnerSay(line);<br />
}<br />
}<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
|also_functions={{LSL DefineRow||[[llGetNumberOfNotecardLines]]|}}<br />
{{LSL DefineRow||[[llGetNotecardLine]]|}}<br />
|also_events<br />
|also_articles<br />
|also_tests<br />
|permission<br />
|cat1=Notecard<br />
|cat2=<br />
|cat3=<br />
|cat4=<br />
|history=<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGetNotecardLineSync&diff=1216358LlGetNotecardLineSync2024-03-16T01:10:41Z<p>Tapple Gao: fixed the text about returning EOF from dataserver</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/negative_index|false|line}}{{LSL_Function/notecard|name|uuid=true}}<br />
|func_id=|func_sleep=0.0|func_energy=10.0<br />
|sort=GetNotecardLineSync<br />
|func=llGetNotecardLineSync<br />
|return_type=string<br />
|p1_type=string|p1_name=name<br />
|p2_type=integer|p2_name=line|p2_desc=Line number in a notecard (the index starts at zero).<br />
|func_desc=Requests the line {{LSLP|line}} of the notecard {{LSLP|name}} from the dataserver.<br />
|Return_text=containing the text of the requested line from the notecard.<br />
|func_footnote=Returns [[EOF]] if {{LSLP|line}} is past the end of the notecard.<br />
|spec=<br />
This function returns a string containing the requested line from a notecard in prim inventory, without the need for an asynchronous dataserver event, if the notecard is cached/known in its entirety by the simulator. This speeds up acessing notecard lines tremendously, and allows for near instantaneous random access.<br />
<br />
If the notecard does not exist it returns the constant [[NAK]] and will shout a message to the debug channel. If the notecard has not been previously cached on the simulator it will return the [[NAK]] constant.<br />
<br />
It is not safe to assume a notecard has been previously cached. Data for a previously cached notecard may be dropped from the cache at any time, especially on a busy server.<br />
<br />
|caveats=* If notecard contains embedded inventory items (such as textures and landmarks), [[EOF]] will be returned, regardless of the line requested.<br />
*If the requested line is longer than 1024 bytes the returned string will be truncated to the first 1024 bytes of the line.<br />
*A dataserver event does '''not''' get raised. Therefore, other scripts in the linkset are unaware of the processed notecard lines.<br />
|constants<br />
|examples=<br />
<syntaxhighlight lang="lsl2"><br />
string NOTECARD_NAME = "notecard";<br />
key READ_KEY = NULL_KEY;<br />
<br />
default<br />
{<br />
<br />
touch_start(integer total_number)<br />
{<br />
READ_KEY = llGetNumberOfNotecardLines(NOTECARD_NAME);<br />
}<br />
<br />
dataserver(key request, string data)<br />
{<br />
if (request == READ_KEY)<br />
{<br />
integer count = (integer)data;<br />
integer index;<br />
<br />
for (index = 0; index < count; ++index)<br />
{<br />
string line = llGetNotecardLineSync(NOTECARD_NAME, index);<br />
if (line == NAK)<br />
{<br />
llOwnerSay("---NAK---");<br />
}<br />
else if (line == EOF)<br />
{<br />
llOwnerSay("---EOF---");<br />
}<br />
else<br />
{<br />
llOwnerSay(line);<br />
}<br />
}<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
|also_functions={{LSL DefineRow||[[llGetNumberOfNotecardLines]]|}}<br />
{{LSL DefineRow||[[llGetNotecardLine]]|}}<br />
|also_events<br />
|also_articles<br />
|also_tests<br />
|permission<br />
|cat1=Notecard<br />
|cat2=<br />
|cat3=<br />
|cat4=<br />
|history=<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGetTime&diff=1216326LlGetTime2024-03-08T15:52:30Z<p>Tapple Gao: corrected the floating point thresholds mentioned in the paragraph before the table</p>
<hr />
<div>{{Issues/SVC-3293}}{{LSL_Function<br />
|func_id=82|func_sleep=0.0|func_energy=10.0<br />
|func=llGetTime|sort=GetTime<br />
|return_type=float<br />
|return_text=that is script time in seconds with subsecond precision since the script started, was last reset, or call to either [[llResetTime]] or [[llGetAndResetTime]].<br />
|func_footnote<br />
|spec=Script time matches normal time, it is unaffected by time dilation. For example, if you call llResetTime on two objects in separate simulators at the same time, and later call llGetTime on both at the same time, their values will be equal regardless of differences in dilation.<br />
|caveats=<br />
*Script time is the amount of real-world time that the script has been in a running state. It is unaffected by time dilation, but it does not count time while the script is suspended, the user is offline (when in an attachment), the object is in inventory rather than rezzed, etc.<br />
*Script time resets when...<br />
**Script reset (user or [[llResetScript]] or [[llResetOtherScript]])<br />
**Call to either [[llResetTime]] or [[llGetAndResetTime]]<br />
* Due to (32 bit) floating point number limitations, the accuracy of this function is 1</sup>/<sub>64</sub>sec up to ~3 days, 1</sup>/<sub>32</sub>sec up to ~6 days, etc... doubling each time, e.g. it's only 1 second at ~194 days. Use [[llResetTime]] or [[llGetAndResetTime]] whenever practical to maintain the accuracy you require:<br />
{{{!}} class="wikitable" style="text-align:right"<br />
{{!}}+ Floating Point Precision Thesholds<br />
{{!}}-<br />
! Precision !! Up to Seconds !! Hours !! Days<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.016=2<sup>-6</sup> {{!}}{{!}} 262144=2<sup>18</sup> {{!}}{{!}} 72.82 {{!}}{{!}} 3.03<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.022=<sup>1</sup>/<sub>45</sub> {{!}}{{!}} colspan="3" style="text-align:center" {{!}} 1 simulator frame<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.031=2<sup>-5</sup> {{!}}{{!}} 524288=2<sup>19</sup> {{!}}{{!}} 145.63 {{!}}{{!}} 6.06<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.063=2<sup>-4</sup> {{!}}{{!}} 1048576=2<sup>20</sup> {{!}}{{!}} 291.27 {{!}}{{!}} 12.13<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.125=2<sup>-3</sup> {{!}}{{!}} 2097152=2<sup>21</sup> {{!}}{{!}} 582.54 {{!}}{{!}} 24.27<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.250=2<sup>-2</sup> {{!}}{{!}} 4194304=2<sup>22</sup> {{!}}{{!}} 1165.08 {{!}}{{!}} 48.54<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.500=2<sup>-1</sup> {{!}}{{!}} 8388608=2<sup>23</sup> {{!}}{{!}} 2330.16 {{!}}{{!}} 97.09<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 1.000=2<sup>-0</sup> {{!}}{{!}} 16777216=2<sup>24</sup> {{!}}{{!}} 4660.33 {{!}}{{!}} 194.18<br />
{{!}}}<br />
<br />
|examples=<syntaxhighlight lang="lsl2"><br />
default {<br />
state_entry()<br />
{<br />
llResetTime();<br />
}<br />
touch_start(integer num_touch)<br />
{<br />
float time = llGetTime(); //Instead getting, and then resetting the time, we could use llGetAndResetTime() to accomplish the same thing.<br />
llResetTime();<br />
llSay(0,(string)time + " seconds have elapsed since the last touch." );<br />
}<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang="lsl2"><br />
// Distinguish between a single click and a double click<br />
<br />
float gHoldTime;<br />
<br />
default<br />
{<br />
touch_start(integer total_number)<br />
{<br />
float now = llGetTime();<br />
if (now - gHoldTime < 0.3)<br />
{<br />
llSay(PUBLIC_CHANNEL,"Double clicked");<br />
// Trigger one sequence of actions<br />
}<br />
else<br />
{<br />
llSetTimerEvent(0.32);<br />
}<br />
gHoldTime = now;<br />
}<br />
<br />
timer()<br />
{<br />
llSetTimerEvent(0.0);<br />
if (llGetTime()-gHoldTime > 0.3)<br />
{<br />
llSay(PUBLIC_CHANNEL,"Single clicked.");<br />
// Trigger a different sequence of actions<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang="lsl2"><br />
// To do time-dependant loops of whatever:<br />
// for example move 2 meters within 5.0 seconds<br />
<br />
float time = 5.0;<br />
float i;<br />
llResetTime();<br />
do<br />
{<br />
i = llGetTime()/time;<br />
// move2meters*i<br />
}<br />
while (llGetTime() < time);<br />
</syntaxhighlight><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llResetTime]]}}<br />
{{LSL DefineRow||[[llGetAndResetTime]]}}<br />
{{LSL DefineRow||[[llGetRegionTimeDilation]]}}<br />
|also<br />
|issues<br />
|cat1=Time<br />
|cat2=Script<br />
|cat3<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGetTime&diff=1216325LlGetTime2024-03-08T15:41:22Z<p>Tapple Gao: floating point table format</p>
<hr />
<div>{{Issues/SVC-3293}}{{LSL_Function<br />
|func_id=82|func_sleep=0.0|func_energy=10.0<br />
|func=llGetTime|sort=GetTime<br />
|return_type=float<br />
|return_text=that is script time in seconds with subsecond precision since the script started, was last reset, or call to either [[llResetTime]] or [[llGetAndResetTime]].<br />
|func_footnote<br />
|spec=Script time matches normal time, it is unaffected by time dilation. For example, if you call llResetTime on two objects in separate simulators at the same time, and later call llGetTime on both at the same time, their values will be equal regardless of differences in dilation.<br />
|caveats=<br />
*Script time is the amount of real-world time that the script has been in a running state. It is unaffected by time dilation, but it does not count time while the script is suspended, the user is offline (when in an attachment), the object is in inventory rather than rezzed, etc.<br />
*Script time resets when...<br />
**Script reset (user or [[llResetScript]] or [[llResetOtherScript]])<br />
**Call to either [[llResetTime]] or [[llGetAndResetTime]]<br />
* Due to (32 bit) floating point number limitations, the accuracy of this function is 1/32sec up to ~3 days, 1/16sec up to ~6 days, etc... doubling each time, e.g. it's only 1 second at ~194 days. Use [[llResetTime]] or [[llGetAndResetTime]] whenever practical to maintain the accuracy you require:<br />
{{{!}} class="wikitable" style="text-align:right"<br />
{{!}}+ Floating Point Precision Thesholds<br />
{{!}}-<br />
! Precision !! Up to Seconds !! Hours !! Days<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.016=2<sup>-6</sup> {{!}}{{!}} 262144=2<sup>18</sup> {{!}}{{!}} 72.82 {{!}}{{!}} 3.03<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.022=<sup>1</sup>/<sub>45</sub> {{!}}{{!}} colspan="3" style="text-align:center" {{!}} 1 simulator physics frame<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.031=2<sup>-5</sup> {{!}}{{!}} 524288=2<sup>19</sup> {{!}}{{!}} 145.63 {{!}}{{!}} 6.06<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.044=<sup>2</sup>/<sub>45</sub> {{!}}{{!}} colspan="3" style="text-align:center" {{!}} 1 simulator script frame<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.063=2<sup>-4</sup> {{!}}{{!}} 1048576=2<sup>20</sup> {{!}}{{!}} 291.27 {{!}}{{!}} 12.13<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.125=2<sup>-3</sup> {{!}}{{!}} 2097152=2<sup>21</sup> {{!}}{{!}} 582.54 {{!}}{{!}} 24.27<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.250=2<sup>-2</sup> {{!}}{{!}} 4194304=2<sup>22</sup> {{!}}{{!}} 1165.08 {{!}}{{!}} 48.54<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.500=2<sup>-1</sup> {{!}}{{!}} 8388608=2<sup>23</sup> {{!}}{{!}} 2330.16 {{!}}{{!}} 97.09<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 1.000=2<sup>-0</sup> {{!}}{{!}} 16777216=2<sup>24</sup> {{!}}{{!}} 4660.33 {{!}}{{!}} 194.18<br />
{{!}}}<br />
<br />
|examples=<syntaxhighlight lang="lsl2"><br />
default {<br />
state_entry()<br />
{<br />
llResetTime();<br />
}<br />
touch_start(integer num_touch)<br />
{<br />
float time = llGetTime(); //Instead getting, and then resetting the time, we could use llGetAndResetTime() to accomplish the same thing.<br />
llResetTime();<br />
llSay(0,(string)time + " seconds have elapsed since the last touch." );<br />
}<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang="lsl2"><br />
// Distinguish between a single click and a double click<br />
<br />
float gHoldTime;<br />
<br />
default<br />
{<br />
touch_start(integer total_number)<br />
{<br />
float now = llGetTime();<br />
if (now - gHoldTime < 0.3)<br />
{<br />
llSay(PUBLIC_CHANNEL,"Double clicked");<br />
// Trigger one sequence of actions<br />
}<br />
else<br />
{<br />
llSetTimerEvent(0.32);<br />
}<br />
gHoldTime = now;<br />
}<br />
<br />
timer()<br />
{<br />
llSetTimerEvent(0.0);<br />
if (llGetTime()-gHoldTime > 0.3)<br />
{<br />
llSay(PUBLIC_CHANNEL,"Single clicked.");<br />
// Trigger a different sequence of actions<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang="lsl2"><br />
// To do time-dependant loops of whatever:<br />
// for example move 2 meters within 5.0 seconds<br />
<br />
float time = 5.0;<br />
float i;<br />
llResetTime();<br />
do<br />
{<br />
i = llGetTime()/time;<br />
// move2meters*i<br />
}<br />
while (llGetTime() < time);<br />
</syntaxhighlight><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llResetTime]]}}<br />
{{LSL DefineRow||[[llGetAndResetTime]]}}<br />
{{LSL DefineRow||[[llGetRegionTimeDilation]]}}<br />
|also<br />
|issues<br />
|cat1=Time<br />
|cat2=Script<br />
|cat3<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGetTime&diff=1216324LlGetTime2024-03-08T15:39:08Z<p>Tapple Gao: Floating Point Table formatting improvements</p>
<hr />
<div>{{Issues/SVC-3293}}{{LSL_Function<br />
|func_id=82|func_sleep=0.0|func_energy=10.0<br />
|func=llGetTime|sort=GetTime<br />
|return_type=float<br />
|return_text=that is script time in seconds with subsecond precision since the script started, was last reset, or call to either [[llResetTime]] or [[llGetAndResetTime]].<br />
|func_footnote<br />
|spec=Script time matches normal time, it is unaffected by time dilation. For example, if you call llResetTime on two objects in separate simulators at the same time, and later call llGetTime on both at the same time, their values will be equal regardless of differences in dilation.<br />
|caveats=<br />
*Script time is the amount of real-world time that the script has been in a running state. It is unaffected by time dilation, but it does not count time while the script is suspended, the user is offline (when in an attachment), the object is in inventory rather than rezzed, etc.<br />
*Script time resets when...<br />
**Script reset (user or [[llResetScript]] or [[llResetOtherScript]])<br />
**Call to either [[llResetTime]] or [[llGetAndResetTime]]<br />
* Due to (32 bit) floating point number limitations, the accuracy of this function is 1/32sec up to ~3 days, 1/16sec up to ~6 days, etc... doubling each time, e.g. it's only 1 second at ~194 days. Use [[llResetTime]] or [[llGetAndResetTime]] whenever practical to maintain the accuracy you require:<br />
{{{!}} class="wikitable" style="text-align:right"<br />
{{!}}+ Floating Point Precision Thesholds<br />
{{!}}-<br />
! Precision !! Up to Seconds !! Hours !! Days<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.016=2<sup>-6</sup> {{!}}{{!}} 262144=2<sup>18</sup> {{!}}{{!}} 72.82 {{!}}{{!}} 3.03<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.022=<sup>1</sup>/<sub>45</sub> {{!}}{{!}} colspan="3" style="text-align:left" {{!}} 1 simulator physics frame<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.031=2<sup>-5</sup> {{!}}{{!}} 524288=2<sup>19</sup> {{!}}{{!}} 145.63 {{!}}{{!}} 6.06<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.044=<sup>2</sup>/<sub>45</sub> {{!}}{{!}} colspan="3" style="text-align:left" {{!}} 1 simulator script frame<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.063=2<sup>-4</sup> {{!}}{{!}} 1048576=2<sup>20</sup> {{!}}{{!}} 291.27 {{!}}{{!}} 12.13<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.125=2<sup>-3</sup> {{!}}{{!}} 2097152=2<sup>21</sup> {{!}}{{!}} 582.54 {{!}}{{!}} 24.27<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.250=2<sup>-2</sup> {{!}}{{!}} 4194304=2<sup>22</sup> {{!}}{{!}} 1165.08 {{!}}{{!}} 48.54<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 0.500=2<sup>-1</sup> {{!}}{{!}} 8388608=2<sup>23</sup> {{!}}{{!}} 2330.16 {{!}}{{!}} 97.09<br />
{{!}}-<br />
{{!}} style="text-align:left" {{!}} 1.000=2<sup>-0</sup> {{!}}{{!}} 16777216=2<sup>24</sup> {{!}}{{!}} 4660.33 {{!}}{{!}} 194.18<br />
{{!}}}<br />
<br />
|examples=<syntaxhighlight lang="lsl2"><br />
default {<br />
state_entry()<br />
{<br />
llResetTime();<br />
}<br />
touch_start(integer num_touch)<br />
{<br />
float time = llGetTime(); //Instead getting, and then resetting the time, we could use llGetAndResetTime() to accomplish the same thing.<br />
llResetTime();<br />
llSay(0,(string)time + " seconds have elapsed since the last touch." );<br />
}<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang="lsl2"><br />
// Distinguish between a single click and a double click<br />
<br />
float gHoldTime;<br />
<br />
default<br />
{<br />
touch_start(integer total_number)<br />
{<br />
float now = llGetTime();<br />
if (now - gHoldTime < 0.3)<br />
{<br />
llSay(PUBLIC_CHANNEL,"Double clicked");<br />
// Trigger one sequence of actions<br />
}<br />
else<br />
{<br />
llSetTimerEvent(0.32);<br />
}<br />
gHoldTime = now;<br />
}<br />
<br />
timer()<br />
{<br />
llSetTimerEvent(0.0);<br />
if (llGetTime()-gHoldTime > 0.3)<br />
{<br />
llSay(PUBLIC_CHANNEL,"Single clicked.");<br />
// Trigger a different sequence of actions<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang="lsl2"><br />
// To do time-dependant loops of whatever:<br />
// for example move 2 meters within 5.0 seconds<br />
<br />
float time = 5.0;<br />
float i;<br />
llResetTime();<br />
do<br />
{<br />
i = llGetTime()/time;<br />
// move2meters*i<br />
}<br />
while (llGetTime() < time);<br />
</syntaxhighlight><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llResetTime]]}}<br />
{{LSL DefineRow||[[llGetAndResetTime]]}}<br />
{{LSL DefineRow||[[llGetRegionTimeDilation]]}}<br />
|also<br />
|issues<br />
|cat1=Time<br />
|cat2=Script<br />
|cat3<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGetTime&diff=1216323LlGetTime2024-03-08T15:22:41Z<p>Tapple Gao: Added a table of floating point precision thresholds</p>
<hr />
<div>{{Issues/SVC-3293}}{{LSL_Function<br />
|func_id=82|func_sleep=0.0|func_energy=10.0<br />
|func=llGetTime|sort=GetTime<br />
|return_type=float<br />
|return_text=that is script time in seconds with subsecond precision since the script started, was last reset, or call to either [[llResetTime]] or [[llGetAndResetTime]].<br />
|func_footnote<br />
|spec=Script time matches normal time, it is unaffected by time dilation. For example, if you call llResetTime on two objects in separate simulators at the same time, and later call llGetTime on both at the same time, their values will be equal regardless of differences in dilation.<br />
|caveats=<br />
*Script time is the amount of real-world time that the script has been in a running state. It is unaffected by time dilation, but it does not count time while the script is suspended, the user is offline (when in an attachment), the object is in inventory rather than rezzed, etc.<br />
*Script time resets when...<br />
**Script reset (user or [[llResetScript]] or [[llResetOtherScript]])<br />
**Call to either [[llResetTime]] or [[llGetAndResetTime]]<br />
* Due to (32 bit) floating point number limitations, the accuracy of this function is 1/32sec up to ~3 days, 1/16sec up to ~6 days, etc... doubling each time, e.g. it's only 1 second at ~194 days. Use [[llResetTime]] or [[llGetAndResetTime]] whenever practical to maintain the accuracy you require:<br />
{{{!}} class="wikitable" style="text-align:right"<br />
{{!}}+ Floating Point Precision Thesholds<br />
{{!}}-<br />
! Precision !! Seconds !! Hours !! Days<br />
{{!}}-<br />
{{!}} 2<sup>-6</sup>=0.016 {{!}}{{!}} 2<sup>18</sup>= 262144 {{!}}{{!}} 72.82 {{!}}{{!}} 3.03<br />
{{!}}-<br />
{{!}} 1/45=0.022 {{!}}{{!}} colspan="3" style="text-align:left" {{!}} 1 simulator physics frame<br />
{{!}}-<br />
{{!}} 2<sup>-5</sup>=0.031 {{!}}{{!}} 2<sup>19</sup>= 524288 {{!}}{{!}} 145.63 {{!}}{{!}} 6.06<br />
{{!}}-<br />
{{!}} 2/45=0.044 {{!}}{{!}} colspan="3" style="text-align:left" {{!}} 1 simulator script frame<br />
{{!}}-<br />
{{!}} 2<sup>-4</sup>=0.063 {{!}}{{!}} 2<sup>20</sup>= 1048576 {{!}}{{!}} 291.27 {{!}}{{!}} 12.13<br />
{{!}}-<br />
{{!}} 2<sup>-3</sup>=0.125 {{!}}{{!}} 2<sup>21</sup>= 2097152 {{!}}{{!}} 582.54 {{!}}{{!}} 24.27<br />
{{!}}-<br />
{{!}} 2<sup>-2</sup>=0.250 {{!}}{{!}} 2<sup>22</sup>= 4194304 {{!}}{{!}} 1165.08 {{!}}{{!}} 48.54<br />
{{!}}-<br />
{{!}} 2<sup>-1</sup>=0.500 {{!}}{{!}} 2<sup>23</sup>= 8388608 {{!}}{{!}} 2330.16 {{!}}{{!}} 97.09<br />
{{!}}-<br />
{{!}} 2<sup> 0</sup>=1.000 {{!}}{{!}} 2<sup>24</sup>=16777216 {{!}}{{!}} 4660.33 {{!}}{{!}} 194.18<br />
{{!}}}<br />
<br />
|examples=<syntaxhighlight lang="lsl2"><br />
default {<br />
state_entry()<br />
{<br />
llResetTime();<br />
}<br />
touch_start(integer num_touch)<br />
{<br />
float time = llGetTime(); //Instead getting, and then resetting the time, we could use llGetAndResetTime() to accomplish the same thing.<br />
llResetTime();<br />
llSay(0,(string)time + " seconds have elapsed since the last touch." );<br />
}<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang="lsl2"><br />
// Distinguish between a single click and a double click<br />
<br />
float gHoldTime;<br />
<br />
default<br />
{<br />
touch_start(integer total_number)<br />
{<br />
float now = llGetTime();<br />
if (now - gHoldTime < 0.3)<br />
{<br />
llSay(PUBLIC_CHANNEL,"Double clicked");<br />
// Trigger one sequence of actions<br />
}<br />
else<br />
{<br />
llSetTimerEvent(0.32);<br />
}<br />
gHoldTime = now;<br />
}<br />
<br />
timer()<br />
{<br />
llSetTimerEvent(0.0);<br />
if (llGetTime()-gHoldTime > 0.3)<br />
{<br />
llSay(PUBLIC_CHANNEL,"Single clicked.");<br />
// Trigger a different sequence of actions<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight lang="lsl2"><br />
// To do time-dependant loops of whatever:<br />
// for example move 2 meters within 5.0 seconds<br />
<br />
float time = 5.0;<br />
float i;<br />
llResetTime();<br />
do<br />
{<br />
i = llGetTime()/time;<br />
// move2meters*i<br />
}<br />
while (llGetTime() < time);<br />
</syntaxhighlight><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llResetTime]]}}<br />
{{LSL DefineRow||[[llGetAndResetTime]]}}<br />
{{LSL DefineRow||[[llGetRegionTimeDilation]]}}<br />
|also<br />
|issues<br />
|cat1=Time<br />
|cat2=Script<br />
|cat3<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGroundRepel&diff=1216224LlGroundRepel2024-02-18T04:44:27Z<p>Tapple Gao: </p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/physical}}<br />
{{LSL_Function/damping|tau}}<br />
|func=llGroundRepel<br />
|func_id=230|func_sleep=0.0|func_energy=10.0<br />
|p1_type=float|p1_name=height|p1_desc=Distance above the ground<br />
|p2_type=integer|p2_name=water|p2_desc=boolean, if [[TRUE]] then hover above water too.<br />
|p3_type=float|p3_name=tau<br />
|func_footnote=Do not use with vehicles.<br />
|func_desc=Critically damps to {{LSLP|height}} if within <code>{{LSLPT|height}} * 0.5</code> of ground or water level (which ever is higher). <br />
|return_text<br />
|spec=Does not pull the object down if it is stuck higher than that, unlike the similar [[llSetHoverHeight]].<br />
<br />
To stop llGroundRepel, this seems to work: <code>llGroundRepel(0.0, FALSE, 0.0)</code><br />
|caveats=<br />
* This is not a prim property; stopping or resetting the script stops llGroundRepel; same with the similar [[llSetHoverHeight]]<br />
* Crossing a sim border will cancel llGroundRepel, unlike [[llSetHoverHeight]]<br />
* A negative height value allows you to hover underwater, same as [[llSetHoverHeight]]<br />
* A previous version of this page suggested that [[llStopHover]] will stop llGroundRepel, but it does not<br />
|constants<br />
|examples=<source lang="lsl2">default<br />
{<br />
state_entry()<br />
{<br />
llSetStatus(STATUS_PHYSICS, TRUE);<br />
llGroundRepel(0.5, TRUE, 0.2); // In a 1/2 meter cube this is roughly the minimum height for any noticeable effect.<br />
// to<br />
llGroundRepel(4096.0, TRUE, 0.2); // There is no restrictive maximum.<br />
// However as the prim reaches 4096 meters (bear in mind the prim height will be (float height + ground height))<br />
// it will be too high to be allowed to exist.<br />
}<br />
}// This is actually a remarkably fast way to go straight up!!</source><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llSetHoverHeight]]| Similar to llGroundRepel, but also pulls down}}<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=Hover<br />
|cat2=Movement<br />
|cat3=Physics<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGroundRepel&diff=1216223LlGroundRepel2024-02-18T04:42:09Z<p>Tapple Gao: noted what happens with negative height</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/physical}}<br />
{{LSL_Function/damping|tau}}<br />
|func=llGroundRepel<br />
|func_id=230|func_sleep=0.0|func_energy=10.0<br />
|p1_type=float|p1_name=height|p1_desc=Distance above the ground<br />
|p2_type=integer|p2_name=water|p2_desc=boolean, if [[TRUE]] then hover above water too.<br />
|p3_type=float|p3_name=tau<br />
|func_footnote=Do not use with vehicles.<br />
|func_desc=Critically damps to {{LSLP|height}} if within <code>{{LSLPT|height}} * 0.5</code> of ground or water level (which ever is higher). <br />
|return_text<br />
|spec=Does not pull the object down if it is stuck higher than that, unlike the similar [[llSetHoverHeight]].<br />
<br />
To stop llGroundRepel, this seems to work: <code>llGroundRepel(0.0, FALSE, 0.0)</code><br />
|caveats=<br />
* This is not a prim property; stopping or resetting the script stops llGroundRepel; same with the similar [[llSetHoverHeight]]<br />
* Crossing a sim border will cancel llGroundRepel, unlike [[llSetHoverHeight]]<br />
* A negative height value seems to disable llGroundRepel, unlike [[llSetHoverHeight]], where that allows objects to hover under water/terrain<br />
* A previous version of this page suggested that [[llStopHover]] will stop llGroundRepel, but it does not<br />
|constants<br />
|examples=<source lang="lsl2">default<br />
{<br />
state_entry()<br />
{<br />
llSetStatus(STATUS_PHYSICS, TRUE);<br />
llGroundRepel(0.5, TRUE, 0.2); // In a 1/2 meter cube this is roughly the minimum height for any noticeable effect.<br />
// to<br />
llGroundRepel(4096.0, TRUE, 0.2); // There is no restrictive maximum.<br />
// However as the prim reaches 4096 meters (bear in mind the prim height will be (float height + ground height))<br />
// it will be too high to be allowed to exist.<br />
}<br />
}// This is actually a remarkably fast way to go straight up!!</source><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llSetHoverHeight]]| Similar to llGroundRepel, but also pulls down}}<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=Hover<br />
|cat2=Movement<br />
|cat3=Physics<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlSetHoverHeight&diff=1216222LlSetHoverHeight2024-02-18T04:38:50Z<p>Tapple Gao: noted that this stops on script reset</p>
<hr />
<div>{{LSL_Function<br />
|inject-2=<br />
{{LSL_Function/physical}}<br />
{{LSL_Function/damping|tau}}<br />
|inject-3=<br />
{{LSL_Function/boolean|water|bool=*|if=*|td=then hover above water too (or below if {{LSLP|height}} is negative)|th=then hover above water too (or below if height is negative)|fd=ignore water like it isn't there}}<br />
|func_id=123|func_sleep=0.0|func_energy=10.0<br />
|func=llSetHoverHeight<br />
|p1_type=float|p1_name=height|p1_desc=Distance to hover above the ground (if negative, hovers below ground)<br />
|p2_type=integer|p2_subtype=boolean|p2_name=water<br />
|p3_type=float|p3_name=tau<br />
|func_footnote=Do not use with vehicles.<br/>Use [[llStopHover]] to stop hovering.<br />
|func_desc=Critically damps to a {{LSLP|height}} above the ground (or water) in {{LSLP|tau}} seconds.<br />
|return_text<br />
|spec<br />
|caveats=*Do not rely on built-in limits. In the past, the difference between the object's initial position and the hover height was limited to 64 meters. Under SL Server 1.26.2 the limit is 4096 meters above the ground level.<br />
* This is not a prim property; stopping or resetting the script stops llSetHoverHeight; same with the similar [[llGroundRepel]]<br />
* If the object tries to go above the height (like, walking up a prim ramp), llSetHoverHeight will pull it back down, unlike the similar [[llGroundRepel]]<br />
|constants<br />
|examples=<br />
<source lang="lsl2"><br />
// Put in an attached prim and touch to start floating in air without flying.<br />
// Touch again to drop to the ground.<br />
<br />
integer gHovering = FALSE; // are we supposd to be hovering now?<br />
<br />
default {<br />
touch_start(integer total_number) {<br />
if (!llGetAttached()) {<br />
llWhisper(0, "Wear me to play.");<br />
return;<br />
}<br />
<br />
if (gHovering) {<br />
llOwnerSay("Releasing you.");<br />
llStopHover();<br />
}<br />
else {<br />
llOwnerSay("Making you float...");<br />
<br />
// Start hovering 5 meters over our current location.<br />
vector myPosition = llGetPos();<br />
llSetHoverHeight(myPosition.z - llGround(ZERO_VECTOR) + 5.0, FALSE, 1.0);<br />
}<br />
<br />
gHovering = !gHovering; // flip the switch<br />
}<br />
}<br />
</source><br />
|notes=* It is possible to assign '''height''' a negative value. If '''water''' is [[TRUE]], this will make the object hover below the water level.<br />
* Unless [[llVolumeDetect|volume detect]] is enabled, negative '''height''' values when '''water''' is [[FALSE]] will not move the object below the ground level and may cause it to be dragged down the local incline to the nearest low point. Enabling [[llVolumeDetect|volume detect]] will cause negative '''height''' settings to move the object below the ground level.<br />
* Assigning '''height''' a value of zero will have the same effect as [[llStopHover]].<br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llGroundRepel]]| Same as llSetHoverHeight but does not hover all the time}}<br />
{{LSL DefineRow||[[llStopHover]]|To stop hovering}}<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=Hover<br />
|cat2=Movement<br />
|cat3=Physics<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGroundRepel&diff=1216221LlGroundRepel2024-02-18T04:37:43Z<p>Tapple Gao: </p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/physical}}<br />
{{LSL_Function/damping|tau}}<br />
|func=llGroundRepel<br />
|func_id=230|func_sleep=0.0|func_energy=10.0<br />
|p1_type=float|p1_name=height|p1_desc=Distance above the ground<br />
|p2_type=integer|p2_name=water|p2_desc=boolean, if [[TRUE]] then hover above water too.<br />
|p3_type=float|p3_name=tau<br />
|func_footnote=Do not use with vehicles.<br />
|func_desc=Critically damps to {{LSLP|height}} if within <code>{{LSLPT|height}} * 0.5</code> of ground or water level (which ever is higher). <br />
|return_text<br />
|spec=Does not pull the object down if it is stuck higher than that, unlike the similar [[llSetHoverHeight]].<br />
<br />
To stop llGroundRepel, this seems to work: <code>llGroundRepel(0.0, FALSE, 0.0)</code><br />
|caveats=<br />
* This is not a prim property; stopping or resetting the script stops llGroundRepel; same with the similar [[llSetHoverHeight]]<br />
* Crossing a sim border will cancel llGroundRepel, unlike [[llSetHoverHeight]]<br />
* A previous version of this page suggested that [[llStopHover]] will stop llGroundRepel, but it does not<br />
|constants<br />
|examples=<source lang="lsl2">default<br />
{<br />
state_entry()<br />
{<br />
llSetStatus(STATUS_PHYSICS, TRUE);<br />
llGroundRepel(0.5, TRUE, 0.2); // In a 1/2 meter cube this is roughly the minimum height for any noticeable effect.<br />
// to<br />
llGroundRepel(4096.0, TRUE, 0.2); // There is no restrictive maximum.<br />
// However as the prim reaches 4096 meters (bear in mind the prim height will be (float height + ground height))<br />
// it will be too high to be allowed to exist.<br />
}<br />
}// This is actually a remarkably fast way to go straight up!!</source><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llSetHoverHeight]]| Similar to llGroundRepel, but also pulls down}}<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=Hover<br />
|cat2=Movement<br />
|cat3=Physics<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGroundRepel&diff=1216220LlGroundRepel2024-02-18T04:35:09Z<p>Tapple Gao: specifically pointed out the differences with llSetHoverHeight</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/physical}}<br />
{{LSL_Function/damping|tau}}<br />
|func=llGroundRepel<br />
|func_id=230|func_sleep=0.0|func_energy=10.0<br />
|p1_type=float|p1_name=height|p1_desc=Distance above the ground<br />
|p2_type=integer|p2_name=water|p2_desc=boolean, if [[TRUE]] then hover above water too.<br />
|p3_type=float|p3_name=tau<br />
|func_footnote=Do not use with vehicles.<br />
|func_desc=Critically damps to {{LSLP|height}} if within <code>{{LSLPT|height}} * 0.5</code> of ground or water level (which ever is higher). <br />
|return_text<br />
|spec=Does not pull the object down if it is stuck higher than that, unlike the similar [[llSetHoverHeight]].<br />
<br />
To stop llGroundRepel, this seems to work: <code>llGroundRepel(0.0, FALSE, 0.0)</code><br />
|caveats=<br />
* This is not a prim property; stopping or resetting the script stops llGroundRepel, unlike the similar [[llSetHoverHeight]]<br />
* Crossing a sim border will cancel llGroundRepel, unlike [[llSetHoverHeight]]<br />
* A previous version of this page suggested that [[llStopHover]] will stop llGroundRepel, but it does not<br />
|constants<br />
|examples=<source lang="lsl2">default<br />
{<br />
state_entry()<br />
{<br />
llSetStatus(STATUS_PHYSICS, TRUE);<br />
llGroundRepel(0.5, TRUE, 0.2); // In a 1/2 meter cube this is roughly the minimum height for any noticeable effect.<br />
// to<br />
llGroundRepel(4096.0, TRUE, 0.2); // There is no restrictive maximum.<br />
// However as the prim reaches 4096 meters (bear in mind the prim height will be (float height + ground height))<br />
// it will be too high to be allowed to exist.<br />
}<br />
}// This is actually a remarkably fast way to go straight up!!</source><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llSetHoverHeight]]| Similar to llGroundRepel, but also pulls down}}<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=Hover<br />
|cat2=Movement<br />
|cat3=Physics<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGroundRepel&diff=1216219LlGroundRepel2024-02-18T04:30:05Z<p>Tapple Gao: </p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/physical}}<br />
{{LSL_Function/damping|tau}}<br />
|func=llGroundRepel<br />
|func_id=230|func_sleep=0.0|func_energy=10.0<br />
|p1_type=float|p1_name=height|p1_desc=Distance above the ground<br />
|p2_type=integer|p2_name=water|p2_desc=boolean, if [[TRUE]] then hover above water too.<br />
|p3_type=float|p3_name=tau<br />
|func_footnote=Do not use with vehicles.<br />
|func_desc=Critically damps to {{LSLP|height}} if within <code>{{LSLPT|height}} * 0.5</code> of ground or water level (which ever is higher). <br />
|return_text<br />
|spec=Does not pull the object down if it is stuck higher than that, unlike the similar [[llSetHoverHeight]].<br />
<br />
To stop llGroundRepel, this seems to work: <code>llGroundRepel(0.0, FALSE, 0.0)</code><br />
|caveats=<br />
* This is not a prim property; stopping or resetting the script stops llGroundRepel<br />
* Crossing a sim border will cancel llGroundRepel<br />
* A previous version of this page suggested that [[llStopHover]] will stop llGroundRepel, but it does not<br />
|constants<br />
|examples=<source lang="lsl2">default<br />
{<br />
state_entry()<br />
{<br />
llSetStatus(STATUS_PHYSICS, TRUE);<br />
llGroundRepel(0.5, TRUE, 0.2); // In a 1/2 meter cube this is roughly the minimum height for any noticeable effect.<br />
// to<br />
llGroundRepel(4096.0, TRUE, 0.2); // There is no restrictive maximum.<br />
// However as the prim reaches 4096 meters (bear in mind the prim height will be (float height + ground height))<br />
// it will be too high to be allowed to exist.<br />
}<br />
}// This is actually a remarkably fast way to go straight up!!</source><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llSetHoverHeight]]| Similar to llGroundRepel, but also pulls down}}<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=Hover<br />
|cat2=Movement<br />
|cat3=Physics<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlSetHoverHeight&diff=1216218LlSetHoverHeight2024-02-18T04:23:17Z<p>Tapple Gao: Noted that this will pull down as well as push up</p>
<hr />
<div>{{LSL_Function<br />
|inject-2=<br />
{{LSL_Function/physical}}<br />
{{LSL_Function/damping|tau}}<br />
|inject-3=<br />
{{LSL_Function/boolean|water|bool=*|if=*|td=then hover above water too (or below if {{LSLP|height}} is negative)|th=then hover above water too (or below if height is negative)|fd=ignore water like it isn't there}}<br />
|func_id=123|func_sleep=0.0|func_energy=10.0<br />
|func=llSetHoverHeight<br />
|p1_type=float|p1_name=height|p1_desc=Distance to hover above the ground (if negative, hovers below ground)<br />
|p2_type=integer|p2_subtype=boolean|p2_name=water<br />
|p3_type=float|p3_name=tau<br />
|func_footnote=Do not use with vehicles.<br/>Use [[llStopHover]] to stop hovering.<br />
|func_desc=Critically damps to a {{LSLP|height}} above the ground (or water) in {{LSLP|tau}} seconds.<br />
|return_text<br />
|spec<br />
|caveats=*Do not rely on built-in limits. In the past, the difference between the object's initial position and the hover height was limited to 64 meters. Under SL Server 1.26.2 the limit is 4096 meters above the ground level.<br />
* If the object tries to go above the height (like, walking up a prim ramp), llSetHoverHeight will pull it back down, unlike the similar [[llGroundRepel]]<br />
|constants<br />
|examples=<br />
<source lang="lsl2"><br />
// Put in an attached prim and touch to start floating in air without flying.<br />
// Touch again to drop to the ground.<br />
<br />
integer gHovering = FALSE; // are we supposd to be hovering now?<br />
<br />
default {<br />
touch_start(integer total_number) {<br />
if (!llGetAttached()) {<br />
llWhisper(0, "Wear me to play.");<br />
return;<br />
}<br />
<br />
if (gHovering) {<br />
llOwnerSay("Releasing you.");<br />
llStopHover();<br />
}<br />
else {<br />
llOwnerSay("Making you float...");<br />
<br />
// Start hovering 5 meters over our current location.<br />
vector myPosition = llGetPos();<br />
llSetHoverHeight(myPosition.z - llGround(ZERO_VECTOR) + 5.0, FALSE, 1.0);<br />
}<br />
<br />
gHovering = !gHovering; // flip the switch<br />
}<br />
}<br />
</source><br />
|notes=* It is possible to assign '''height''' a negative value. If '''water''' is [[TRUE]], this will make the object hover below the water level.<br />
* Unless [[llVolumeDetect|volume detect]] is enabled, negative '''height''' values when '''water''' is [[FALSE]] will not move the object below the ground level and may cause it to be dragged down the local incline to the nearest low point. Enabling [[llVolumeDetect|volume detect]] will cause negative '''height''' settings to move the object below the ground level.<br />
* Assigning '''height''' a value of zero will have the same effect as [[llStopHover]].<br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llGroundRepel]]| Same as llSetHoverHeight but does not hover all the time}}<br />
{{LSL DefineRow||[[llStopHover]]|To stop hovering}}<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=Hover<br />
|cat2=Movement<br />
|cat3=Physics<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGroundRepel&diff=1216217LlGroundRepel2024-02-18T04:19:30Z<p>Tapple Gao: </p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/physical}}<br />
{{LSL_Function/damping|tau}}<br />
|func=llGroundRepel<br />
|func_id=230|func_sleep=0.0|func_energy=10.0<br />
|p1_type=float|p1_name=height|p1_desc=Distance above the ground<br />
|p2_type=integer|p2_name=water|p2_desc=boolean, if [[TRUE]] then hover above water too.<br />
|p3_type=float|p3_name=tau<br />
|func_footnote=Do not use with vehicles.<br />
|func_desc=Critically damps to {{LSLP|height}} if within <code>{{LSLPT|height}} * 0.5</code> of ground or water level (which ever is higher). <br />
|return_text<br />
|spec=Does not pull the object down if it is stuck higher than that, unlike the similar [[llSetHoverHeight]].<br />
<br />
To stop llGroundRepel, this seems to work: <code>llGroundRepel(0.0, FALSE, 0.0)</code><br />
|caveats=<br />
* This is not a prim property; stopping or resetting the script stops llGroundRepel<br />
* Crossing a sim border will cancel llGroundRepel<br />
* A previous version of this page suggested that [[llStopHover]] will stop llGroundRepel, but it does not<br />
|constants<br />
|examples=<source lang="lsl2">default<br />
{<br />
state_entry()<br />
{<br />
llSetStatus(STATUS_PHYSICS, TRUE);<br />
llGroundRepel(0.5, TRUE, 0.2); // In a 1/2 meter cube this is roughly the minimum height for any noticeable effect.<br />
// to<br />
llGroundRepel(4096.0, TRUE, 0.2); // There is no restrictive maximum.<br />
// However as the prim reaches 4096 meters (bear in mind the prim height will be (float height + ground height))<br />
// it will be too high to be allowed to exist.<br />
}<br />
}// This is actually a remarkably fast way to go straight up!!</source><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llSetHoverHeight]]| Similar to llGroundRepel, but is not terrain-dependent}}<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=Hover<br />
|cat2=Movement<br />
|cat3=Physics<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGroundRepel&diff=1216216LlGroundRepel2024-02-18T04:17:30Z<p>Tapple Gao: This function was poorly documented. I added some notes I found while testing it</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/physical}}<br />
{{LSL_Function/damping|tau}}<br />
|func=llGroundRepel<br />
|func_id=230|func_sleep=0.0|func_energy=10.0<br />
|p1_type=float|p1_name=height|p1_desc=Distance above the ground<br />
|p2_type=integer|p2_name=water|p2_desc=boolean, if [[TRUE]] then hover above water too.<br />
|p3_type=float|p3_name=tau<br />
|func_footnote=Do not use with vehicles.<br />
|func_desc=Critically damps to {{LSLP|height}} if within <code>{{LSLPT|height}} * 0.5</code> of ground or water level (which ever is higher). Does not pull the object down if it is stuck higher than that, unlike the similar [[llSetHoverHeight]].<br />
<br />
To stop llGroundRepel, this seems to work: <code>llGroundRepel(0.0, FALSE, 0.0)</code><br />
|return_text<br />
|spec<br />
|caveats=<br />
* This is not a prim property; stopping or resetting the script stops llGroundRepel<br />
* Crossing a sim border will cancel llGroundRepel<br />
* A previous version of this page suggested that [[llStopHover]] will stop llGroundRepel, but it does not<br />
|constants<br />
|examples=<source lang="lsl2">default<br />
{<br />
state_entry()<br />
{<br />
llSetStatus(STATUS_PHYSICS, TRUE);<br />
llGroundRepel(0.5, TRUE, 0.2); // In a 1/2 meter cube this is roughly the minimum height for any noticeable effect.<br />
// to<br />
llGroundRepel(4096.0, TRUE, 0.2); // There is no restrictive maximum.<br />
// However as the prim reaches 4096 meters (bear in mind the prim height will be (float height + ground height))<br />
// it will be too high to be allowed to exist.<br />
}<br />
}// This is actually a remarkably fast way to go straight up!!</source><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llSetHoverHeight]]| Similar to llGroundRepel, but is not terrain-dependent}}<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=Hover<br />
|cat2=Movement<br />
|cat3=Physics<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LSL_States&diff=1214612LSL States2023-09-21T17:05:28Z<p>Tapple Gao: mentioned timer is persisted across state changes</p>
<hr />
<div>{{LSL Header|ml=*}}<br />
In LSL, most scripts sit idle until they receive some input, or detect some change in their environment. At any moment, the script is in some '''state''', and will react to events or inputs according to some scheme defined by the programmer. However, a script can also contain two or more different '''state'''s, and react differently to events or inputs depending on what state it is in.<br />
<br />
One common abstract model that is used in such cases is called a ''Finite State Machine'' (see Wikipedia[http://en.wikipedia.org/wiki/Finite_state_machine])].<br />
<br />
For example, a door might be in a ''waiting'' state, and ignore all inputs except being touched. Once touched, it goes to the ''open'' state, in which it ignores being touched, but monitors which avatars pass through it. After a while, it changes to the ''closing'' state during which it closes, and then it returns to the ''waiting'' state.<br />
<br />
States are not the only way to represent this kind of behavior, but in some cases they are a very good way.<br />
<br />
In LSL, a '''state''' is a specified section of code within which all {{LSLGC|Events}} are specified. The main state that is required by all LSL scripts is called ''default''; all scripts must have a default state, and every state must have at least one event.<br />
<br />
To add another state add an entry like this:<br />
<br />
state my_state<br />
{<br />
state_entry()<br />
{<br />
// What should happen when we enter this state<br />
}<br />
<br />
// other events and code<br />
}<br />
<br />
To switch from one state to another add a line like this:<br />
<br />
state my_state;<br />
<br />
When this line of code is executed, it will run anything in the [[state_exit]] event, and then switch to the new state.<br />
<br />
When switching states, all event queues are cleared, and events requiring setup are disabled such as [[sensor]] and [[listen]]. Surprisingly, [[timer]] is persisted across state changes<br />
<br />
The state_entry event is run when the code enters that state. There is sometimes confusion in thinking that the state_entry event will run when a scripted object is rezzed from inventory. This is not the case as scripts are frozen when taken into inventory in the state they are in, and resume operation in that state when rezzed. The event first called when an object is rezzed out of inventory is [[on_rez]].<br />
<br />
== See also ==<br />
<br />
For more information, see [[State]].</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Template:LSL_Constants/Perm_Flags&diff=1214447Template:LSL Constants/Perm Flags2023-09-04T00:38:54Z<p>Tapple Gao: Undo revision 1214444 by Tapple Gao (talk)</p>
<hr />
<div>{{{!}} class="sortable" {{Prettytable|style=margin-top:0;}}<br />
{{!}}-{{Hl2}}<br />
! title="Permissions" {{!}} Permissions<br />
! title="Value" {{!}} Value<br />
! class="unsortable" {{!}} Description<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_ALL|integer|hex=0x7FFFFFFF|c=Move/Modify/Copy/Transfer permissions}}<br />
{{!}} style="font-family:monospace;font-size:124%" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_COPY|integer|hex=0x00008000|c=Copy permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_MODIFY|integer|hex=0x00004000|c=Modify permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}-<br />
{{!}} {{LSL_Const|PERM_MOVE|integer|hex=0x00080000|c=Move permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_TRANSFER|integer|hex=0x00002000|c=Transfer permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- {{#if:{{{all|}}}<noinclude>*</noinclude>|<br />
{{!}}-<br />
{{!}} <s>{{LSL_Const|PERM_ENTER|integer|hex=0x00010000|c=[Deprecated] parcels, allow entry|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_TERRAFORM|integer|hex=0x00020000|c=[Deprecated] parcels, allow terraform|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_OWNER_DEBIT|integer|hex=0x00040000|c=[Deprecated] object, can debit money|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_DAMAGE |integer|hex=0x00100000|c=[Deprecated] parcels, avatars take damage|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
}}<br />
{{!}}- <br />
{{!}}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Template:LSL_Constants/Perm_Flags&diff=1214446Template:LSL Constants/Perm Flags2023-09-04T00:38:31Z<p>Tapple Gao: Undo revision 1214445 by Tapple Gao (talk)</p>
<hr />
<div>{{{!}} class="sortable" {{Prettytable|style=margin-top:0;}}<br />
{{!}}-{{Hl2}}<br />
! title="Permissions" {{!}} Permissions<br />
! title="Value" {{!}} Value<br />
! class="unsortable" {{!}} Description<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_ALL|integer|hex=0x7FFFFFFF|c=Move/Modify/Copy/Transfer permissions}}<br />
{{!}} style="font-family:monospace;font-size:124%" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_COPY|integer|hex=0x00008000|c=Copy permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_MODIFY|integer|hex=0x00004000|c=Modify permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}-<br />
{{!}} {{LSL_Const|PERM_MOVE|integer|hex=0x00080000|c=Move permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_TRANSFER|integer|hex=0x00002000|c=Transfer permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|<s>PERM_SHARE</s>|integer|hex=0x00080000|c=Share with group permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- {{#if:{{{all|}}}<noinclude>*</noinclude>|<br />
{{!}}-<br />
{{!}} <s>{{LSL_Const|PERM_ENTER|integer|hex=0x00010000|c=[Deprecated] parcels, allow entry|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_TERRAFORM|integer|hex=0x00020000|c=[Deprecated] parcels, allow terraform|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_OWNER_DEBIT|integer|hex=0x00040000|c=[Deprecated] object, can debit money|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_DAMAGE |integer|hex=0x00100000|c=[Deprecated] parcels, avatars take damage|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
}}<br />
{{!}}- <br />
{{!}}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Template:LSL_Constants/Perm_Flags&diff=1214445Template:LSL Constants/Perm Flags2023-09-04T00:23:34Z<p>Tapple Gao: fixed bad formatting</p>
<hr />
<div>{{{!}} class="sortable" {{Prettytable|style=margin-top:0;}}<br />
{{!}}-{{Hl2}}<br />
! title="Permissions" {{!}} Permissions<br />
! title="Value" {{!}} Value<br />
! class="unsortable" {{!}} Description<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_ALL|integer|hex=0x7FFFFFFF|c=Move/Modify/Copy/Transfer permissions}}<br />
{{!}} style="font-family:monospace;font-size:124%" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_COPY|integer|hex=0x00008000|c=Copy permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_MODIFY|integer|hex=0x00004000|c=Modify permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}-<br />
{{!}} {{LSL_Const|PERM_MOVE|integer|hex=0x00080000|c=Move permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_TRANSFER|integer|hex=0x00002000|c=Transfer permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_SHARE|integer|hex=0x00080000|c=[Unnamed] Share with group permission|nolink=*}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- {{#if:{{{all|}}}<noinclude>*</noinclude>|<br />
{{!}}-<br />
{{!}} <s>{{LSL_Const|PERM_ENTER|integer|hex=0x00010000|c=[Deprecated] parcels, allow entry|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_TERRAFORM|integer|hex=0x00020000|c=[Deprecated] parcels, allow terraform|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_OWNER_DEBIT|integer|hex=0x00040000|c=[Deprecated] object, can debit money|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_DAMAGE |integer|hex=0x00100000|c=[Deprecated] parcels, avatars take damage|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
}}<br />
{{!}}- <br />
{{!}}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Template:LSL_Constants/Perm_Flags&diff=1214444Template:LSL Constants/Perm Flags2023-09-04T00:20:00Z<p>Tapple Gao: added undocumented flag 0x8000 share with group</p>
<hr />
<div>{{{!}} class="sortable" {{Prettytable|style=margin-top:0;}}<br />
{{!}}-{{Hl2}}<br />
! title="Permissions" {{!}} Permissions<br />
! title="Value" {{!}} Value<br />
! class="unsortable" {{!}} Description<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_ALL|integer|hex=0x7FFFFFFF|c=Move/Modify/Copy/Transfer permissions}}<br />
{{!}} style="font-family:monospace;font-size:124%" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_COPY|integer|hex=0x00008000|c=Copy permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_MODIFY|integer|hex=0x00004000|c=Modify permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}-<br />
{{!}} {{LSL_Const|PERM_MOVE|integer|hex=0x00080000|c=Move permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|PERM_TRANSFER|integer|hex=0x00002000|c=Transfer permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} {{LSL_Const|<s>PERM_SHARE</s>|integer|hex=0x00080000|c=Share with group permission}}<br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- {{#if:{{{all|}}}<noinclude>*</noinclude>|<br />
{{!}}-<br />
{{!}} <s>{{LSL_Const|PERM_ENTER|integer|hex=0x00010000|c=[Deprecated] parcels, allow entry|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_TERRAFORM|integer|hex=0x00020000|c=[Deprecated] parcels, allow terraform|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_OWNER_DEBIT|integer|hex=0x00040000|c=[Deprecated] object, can debit money|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
{{!}} <s>{{LSL_Const|PERM_DAMAGE |integer|hex=0x00100000|c=[Deprecated] parcels, avatars take damage|nolink=*}}</s><br />
{{!}} style="font-family:monospace;font-size:124%;" {{!}} {{#var:value}}<br />
{{!}} {{#var:comment}}<br />
{{!}}- <br />
}}<br />
{{!}}- <br />
{{!}}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Internal_Animation_Format&diff=1214391Internal Animation Format2023-08-26T14:55:20Z<p>Tapple Gao: removed blender-anim-exporter; the owner took it down</p>
<hr />
<div>{{KBtip|You may find the contents of [[Anim File Format]] page helpful in addition to this page.}}<br />
== Tools ==<br />
If you're coming here to find out about how to take advantage of Second Life's internal animation format (.anim), you may find the below tools of use.<br />
<br />
{| class="wikitable" style="margin:auto; width: 85%; text-align: center;"<br />
|+ .anim file format utilities<br />
|-<br />
! scope="col" style="background-color:#A7C1F2" | Name<br />
! scope="col" style="background-color:#A7C1F2" | Notes<br />
|-<br />
| [https://gitlab.com/Quillia/anim-converter '''Anim-converter''']<br />
| Converts .bvh files into Second Life .anim files.<br />
|-<br />
| [https://github.com/Gina43/anim-2-bvh '''Anim2BVH''']<br />
| Inverse of the above, converts .anim files into .bvh files.<br />
|-<br />
| [https://community.secondlife.com/forums/topic/468179-anim-hacker/ '''Anim Hacker''']<br />
| Tool for manipulating .anim files. Can be used to edit joint priorities, add constraints, and more!<br />
|-<br />
| [https://github.com/tapple/tanimbomb '''tanimbomb''']<br />
| Python CLI tool for making simple bulk-edits to multiple anim files at once, especially joint removal and animation mirroring<br />
|-<br />
| [https://github.com/LGGGreg/par/releases/tag/v1 '''AnimMaker''']<br />
| Older tool, equivalent to AnimHacker. ([http://web.archive.org/web/20100526180459/http://code.google.com/p/par/source/browse#svn/branches/AnimMaker Source Code available in archive])<br />
|}<br />
<br />
==Overview==<br />
<br />
From a programming perspective, there are several steps to uploading an [[Animation|animation]] from a BVH (BioVision Hierarchy) file:<br />
<br />
# Read and parse the BVH file, creating an LLKeyframeMotion object containing the motion data.<br />
# Gather input from the user (via the upload preview floater) for things like animation priority, facial expression, and looping; these settings are stored in the LLKeyframeMotion object.<br />
# Serialize the LLKeyframeMotion object as [[LLSD]].<br />
# Upload the serialized data to the asset server.<br />
<br />
Before other viewers can play an animation, they must:<br />
<br />
# Download the serialized data from the asset server.<br />
# Deserialize it to an LLKeyframeMotion object.<br />
<br />
Relevant source files:<br />
* [https://github.com/secondlife/viewer/blob/main/indra/llcharacter/llbvhloader.cpp llbvhloader.cpp]<br />
* [https://github.com/secondlife/viewer/blob/main/indra/llcharacter/llkeyframemotion.cpp#L1229 llkeyframemotion.cpp:deserialize()]<br />
<br />
Note: the binary file is little endian.<br />
<br />
{{KBwarning|1=The asset uploader enforces a {{HoverText|250,000 byte|250 KB (decimal), 244 KB (binary)}} limit on .anim files. Files larger than this will fail to upload, and will return an error. <br> {{HoverText|Simplify your animation|Remove triplicate keyframes, remove unused joints, remove keyframes for small movements, etc.}}, then retry uploading.<br>'''Blender Users:''' You can use a built-in function called "''Decimate''" to simplify your animation. See [https://www.youtube.com/watch?v=lScwEYJZy1M this tutorial].}}<br />
<br />
==Header==<br />
<br />
The first part of the animation data is a header describing various details about the animation as a whole. The elements, in order, are:<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=version|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=sub_version|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=base_priority|llsd=integer|cpp=S32|note=Is informational only, and does not affect the animation. The animation system always follows individual joint priority; Except for animations making use of constraints, in which case the constraint will be applied at priority defined by this value.}}<br />
{{LLSD Field Entry|name=duration|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=emote_name|llsd=string|cpp=char *|note=NULL-terminated character sequence}}<br />
{{LLSD Field Entry|name=loop_in_point|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=loop_out_point|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=loop|llsd=integer|cpp=S32|note=0: not looped, 1: looped}}<br />
{{LLSD Field Entry|name=ease_in_duration|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_out_duration|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=hand_pose|llsd=integer|cpp=U32|note=Enum defined in [https://github.com/secondlife/viewer/blob/main/indra/llcharacter/llhandmotion.h#L45]}}<br />
{{LLSD Field Entry|name=num_joints|llsd=integer|cpp=U32}}<br />
|}<br />
<br />
==Joint Data==<br />
<br />
After the header is data for each joint in the skeleton:<br />
Note: Unused bones need not be included in the file.<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=joint_name|llsd=string|cpp=char *|note=NULL-terminated character sequence}}<br />
{{LLSD Field Entry|name=joint_priority|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
===Joint Rotation Keys===<br />
<br />
At the start of the rotation data for each bone is the total number of rotation keys:<br />
If the bone has no rotation based keyframes, this value must be 0.<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=num_rot_keys|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
Then, for each rotation key:<br />
<br />
Note: These three values X Y Z appear to be the first three values of a truncated quaternion with the W term being calculated afterwards. <br />
Since a quaternion is X<sup>2</sup> + Y<sup>2</sup> + Z<sup>2</sup> + W<sup>2</sup> = 1 as long as you assume the W term has a consistent sign the X Y Z terms will be accurate.<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=time|llsd=integer|cpp=U16|note=0: first frame, 65535: last frame}}<br />
{{LLSD Field Entry|name=rot_x|llsd=integer|cpp=U16|note= 0:-1, 32767:0, 65535:+1 }}<br />
{{LLSD Field Entry|name=rot_y|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=rot_z|llsd=integer|cpp=U16}}<br />
|}<br />
<br />
===Joint Position Keys===<br />
<br />
At the start of the position data is the total number of position keys:<br />
If the bone has no position based animations, this value must be 0.<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=num_pos_keys|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
<br />
Then, for each position key, position data is measured from Avatar Center ( mPelvis ), not joint resting position<br />
( IE [0,0,0] is not joint resting position, it'll be the bone's position in parent coordinate space)<br />
with the exception of the mPelvis bone which is stored in world space coordinates.:<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=time|llsd=integer|cpp=U16|note=0: first frame, 65535: last frame}}<br />
{{LLSD Field Entry|name=pos_x|llsd=integer|cpp=U16|desc=position measured from avatar root, not joint offset|note=0:-5m, 32767:0m, 65535:+5m (m for metres)}}<br />
{{LLSD Field Entry|name=pos_y|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=pos_z|llsd=integer|cpp=U16}}<br />
|}<br />
<br />
==Constraints==<br />
<br />
After the joint data are a number of entries for joint constraints. Constraints can target an avatar's parts in relation to each other or the ground (IK).<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=num_constraints|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
Then, for each joint constraint:<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=chain_length|llsd=integer|cpp=U8|note=number of attached joints to include}}<br />
{{LLSD Field Entry|name=constraint_type|llsd=integer|cpp=U8|note=0: point'''*''', 1: plane}}<br />
{{LLSD Field Entry|name=source_volume|llsd=string |cpp=char[16]|desc=skeleton collision volume name|note=Always 16 bytes, but if shorter, it's interpreted as NULL-terminated and the remaining bytes ignored.}}<br />
{{LLSD Field Entry|name=source_offset|llsd=string (?)|cpp=LLVector3}}<br />
{{LLSD Field Entry|name=target_volume|llsd=string|cpp=char[16]|desc=skeleton collision volume name|note=Always 16 bytes, but if shorter, it's interpreted as NULL-terminated and the remaining bytes ignored.}}<br />
{{LLSD Field Entry|name=target_offset|llsd=string (?)|cpp=LLVector3}}<br />
{{LLSD Field Entry|name=target_dir|llsd=string (?)|cpp=LLVector3|note=value is currently ignored}}<br />
{{LLSD Field Entry|name=ease_in_start|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_in_stop|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_out_start|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_out_stop|llsd=real|cpp=F32}}<br />
|}<br />
'''*''' The implementation of constraint type '''Point''' is incomplete, and is considered non-functional. Until further notice, all constraints should use the '''Plane''' type.<br />
:The above does not seem to be true, both types would seem to be working. ([[User:Jenna Huntsman |Jenna Huntsman]] tested {{#time: d F Y|8/12/2022}} )<br />
=== [[User:Jenna Huntsman |Jenna's]] notes on constraints ===<br />
* ''chain_length'' is '''not''' inclusive of the source bone itself, so for example, if the source bone is R_HAND, setting a ''chain_length'' of 2 will use R_LOWER_ARM (elbow joint) and R_UPPER_ARM (shoulder joint).<br />
** Setting a ''chain_length'' of more than 4 will prevent the animation from playing - the animation will upload, but will not play.<br />
** Setting a ''chain_length'' of 4 (both constraint types) will cause the viewer to crash.<br />
* ''target_offset'' uses an axis layout of X+ forward, Y+ left, Z+ up.<br />
** Constraints only seem to work reliably if ''target_offset'' has a value of 1 on the Z axis. The values on the X and Y axis can be anything however.<br />
* ''source_offset'' uses an axis layout of X+ forward, Y+ left, Z+ up.<br />
** <s>The distance units expected are of an unknown unit, however it does not seem to be meters or inches. (Also true of ''target_offset'')</s><br />
** '''llkeyframemotion.cpp''' would seem to suggest that constraints are inherited from a BVH upon conversion to .anim, which would make the units be inches (as is standard for BVH animations in SL); <s>however in-world testing casts doubt upon this.</s><br />
* ''target_dir'' is unused, however is likely a unit vector relative to the armature root.<br />
** As such, bone rotations can be manipulated by rot keys as normal, however the rotation will not be relative to the target volume.<br />
** It seems that while ''target_dir'' is present in the file format for constraints, it was never implemented (As per '''llkeyframemotion.cpp''').<br />
* While ''GROUND'' is a recognized and implemented target volume, server-side checks prevent uploads of animations making use of this constraint target.<br />
* There seems to be a hard limit of 10 constraints per animation (as per '''llkeyframemotion.cpp''').<br />
* Constraints always follow the shortest path from their source to their destination, irrespective of 'legal' joint rotations. (Meaning to say, constraints can cause bones to move in an odd way (e.g. an arm clipping inside your body) if that is the shortest path.)<br />
* Unlike regular animations, Constraints seem to require an intact armature from the skeleton root (mPelvis) to the source and target bones; Otherwise the animation will not play.<br />
** The bones do not need to be animated, they only need to be present in the .anim file.<br />
* Constraints '''do''' respect animation priority (The ''global'' animation priority, as defined by ''base_priority'', '''not''' the ''per joint'' priority), meaning it's possible to stack constraints, but not within the same animation.</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Template:LSL_Constants/PrimitiveParams/type&diff=1214316Template:LSL Constants/PrimitiveParams/type2023-08-13T16:26:16Z<p>Tapple Gao: fixed sculpt rowspan</p>
<hr />
<div>{{#if:<br />
<br />
{{#vardefine:CPPt_sortable|{{#if:{{{simple|}}}<noinclude>1</noinclude>|{{#if:{{{sortable|}}}<noinclude>1</noinclude>|1}}}}}}<br />
<br />
}}{{#if:{{{table|}}}<noinclude>1</noinclude>|<br />
{{{!}} {{#if:{{#var:CPPt_sortable}}|class="sortable"}} {{Prettytable|style={{{style|}}}}}}}<br />
{{!}}- {{#if:{{{table|}}}<noinclude>1</noinclude>|{{Hl2}}}}<br />
! {{#if:{{#var:CPPt_sortable}}||colspan="2"}} {{!}} {{HoverText|flag|PRIM_TYPE_* flag}}&nbsp;Constants<br />
{{#if:{{#var:CPPt_sortable}}|! title="Value" style="width:2em;" {{!}}}}<br />
! colspan="6" id="PRIM_TYPE_flag_parameters" {{!}} {{#switch:{{{1|}}}|get|set|={{GetSet|{{{1|}}}|Additional&nbsp;Return&nbsp;Values|Flag&nbsp;Parameters}}|#default={{{1|}}}}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_BOX|integer|0|s2=style="text-align: center;"}}<br />
{{!}} colspan="6" {{!}} [ [[integer]]&nbsp;{{LSL Param|hole_shape}}, [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[vector]]&nbsp;{{LSL Param|twist_box|twist}}, [[vector]]&nbsp;{{LSL Param|z_taper|top_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_CYLINDER|integer|1|s2=style="text-align: center;"}}<br />
{{!}} colspan="6" {{!}} [ [[integer]]&nbsp;{{LSL Param|hole_shape}}, [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[vector]]&nbsp;{{LSL Param|twist_box|twist}}, [[vector]]&nbsp;{{LSL Param|z_taper|top_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_PRISM|integer|2|s2=style="text-align: center;"}}<br />
{{!}} colspan="6" {{!}} [ [[integer]]&nbsp;{{LSL Param|hole_shape}}, [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[vector]]&nbsp;{{LSL Param|twist_box|twist}}, [[vector]]&nbsp;{{LSL Param|z_taper|top_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_SPHERE|integer|3|s2=style="text-align: center;"}}<br />
{{!}} colspan="6" {{!}} [ [[integer]]&nbsp;{{LSL Param|hole_shape}}, [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[vector]]&nbsp;{{LSL Param|twist_torus|twist}}, [[vector]]&nbsp;{{LSL Param|cut|dimple}}]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_TORUS|integer|4|s2=style="text-align: center;"}}<br />
{{!}} colspan="6" {{!}} [ [[integer]]&nbsp;{{LSL Param|hole_shape}}, [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[vector]]&nbsp;{{LSL Param|twist_torus|twist}}, [[vector]]&nbsp;{{LSL Param|hole_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}, [[vector]]&nbsp;{{LSL Param|cut|advanced_cut}}, [[vector]]&nbsp;{{LSL Param|taper}}, [[float]]&nbsp;{{LSL Param|revolutions}}, [[float]]&nbsp;{{LSL Param|radius_offset}}, [[float]]&nbsp;{{LSL Param|skew}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_TUBE|integer|5|s2=style="text-align: center;"}}<br />
{{!}} colspan="6" {{!}} [ [[integer]]&nbsp;{{LSL Param|hole_shape}}, [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[vector]]&nbsp;{{LSL Param|twist_torus|twist}}, [[vector]]&nbsp;{{LSL Param|hole_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}, [[vector]]&nbsp;{{LSL Param|cut|advanced_cut}}, [[vector]]&nbsp;{{LSL Param|taper}}, [[float]]&nbsp;{{LSL Param|revolutions}}, [[float]]&nbsp;{{LSL Param|radius_offset}}, [[float]]&nbsp;{{LSL Param|skew}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_RING|integer|6|s2=style="text-align: center;"}}<br />
{{!}} colspan="6" {{!}} [ [[integer]]&nbsp;{{LSL Param|hole_shape}}, [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[vector]]&nbsp;{{LSL Param|twist_torus|twist}}, [[vector]]&nbsp;{{LSL Param|hole_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}, [[vector]]&nbsp;{{LSL Param|cut|advanced_cut}}, [[vector]]&nbsp;{{LSL Param|taper}}, [[float]]&nbsp;{{LSL Param|revolutions}}, [[float]]&nbsp;{{LSL Param|radius_offset}}, [[float]]&nbsp;{{LSL Param|skew}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_SCULPT|integer|7|s2=style="text-align: center;"}}<br />
{{!}} colspan="6" {{!}} [ [[string]]&nbsp;{{LSL Param|map}},&nbsp;[[integer]]&nbsp;{{LSL Param|type}}&nbsp;] {{#if:{{{simple|}}}<noinclude>1</noinclude>||[[Sculpted_Prims:_FAQ]]}}<br />
{{!}}-{{#if:{{{simple|}}}<noinclude>1</noinclude>||<br />
{{!}}-<br />
{{!}} rowspan="13" colspan="2" {{!}} &nbsp;<br />
! colspan="2" {{!}} {{LSL Param|hole_shape}}&nbsp;Flags<br />
!{{!}} Shape<br />
! colspan="2" {{!}} {{LSL Param|hole_shape}}&nbsp;Flags<br />
!{{!}} Shape<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_HOLE_DEFAULT|integer|hex=0x00|ihex=0|c=Default|m=3}}<br />
{{LSL ConstTB|PRIM_HOLE_SQUARE|integer|hex=0x20|ihex=32|c=Square|m=3}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_HOLE_CIRCLE|integer|hex=0x10|ihex=16|c=Circle|m=3}}<br />
{{LSL ConstTB|PRIM_HOLE_TRIANGLE|integer|hex=0x30|ihex=48|c=Triangle|m=3}}<br />
{{!}}-<br />
{{LSL Constants/PrimitiveParams/sculpt types}}<br />
{{!}}-}}<br />
{{!}}-<br />
{{#if:{{{table|}}}<noinclude>1</noinclude>|{{!}}} }}<br />
<noinclude><br />
{| {{Prettytable}}<br />
{{LSL_Constants/PrimitiveParams/type}}<br />
|}<br />
{| {{Prettytable}}<br />
{{LSL_Constants/PrimitiveParams/type|simple=*}}<br />
|}<br />
{| class="sortable" {{Prettytable}}<br />
{{LSL_Constants/PrimitiveParams/type|simple=*|sortable=*}}<br />
|}<br />
{{LSL_Constants/PrimitiveParams/type|table=*}}<br />
{{LSL_Constants/PrimitiveParams/type|table=*|simple=*}}<br />
{{LSL_Constants/PrimitiveParams/type|table=*|simple=*|sortable=*}}<br />
</noinclude></div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlGetNotecardLine&diff=1214006LlGetNotecardLine2023-06-03T23:26:03Z<p>Tapple Gao: note that the notecard needs to be full perm in the first example</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/negative_index|false|line}}{{LSL_Function/notecard|name|uuid=true}}<br />
|func_id=217|func_sleep=0.1|func_energy=10.0<br />
|sort=GetNotecardLine<br />
|func=llGetNotecardLine<br />
|return_type=key<br />
|return_subtype=handle<br />
|p1_type=string|p1_name=name<br />
|p2_type=integer|p2_name=line|p2_desc=Line number in a notecard (the index starts at zero).<br />
|func_desc=Requests the line {{LSLP|line}} of the notecard {{LSLP|name}} from the dataserver.<br />
|Return_text=for a [[dataserver]] event response.<br />
|func_footnote=If {{LSLP|line}} is past the end of the notecard [[EOF]] is returned by the [[dataserver]].<br />
|spec<br />
|caveats=* If notecard contains embedded inventory items (such as textures and landmarks), [[EOF]] will be returned, regardless of the line requested.<br />
*If the requested line is longer than 1024 bytes the [[dataserver]] will return the first 1024 bytes of the line.<br />
*The byte return for this function was increased from 255 bytes to 1024 bytes with server version [https://releasenotes.secondlife.com/simulator/2021-10-25.565008.html 2021-10-25.565008]<br />
*The notecard read can be full perm, no-modify, or no-modify/no copy.<br />
|constants<br />
|examples=<br />
<source lang="lsl2"><br />
key notecardQueryId; //Identifier for the dataserver event<br />
<br />
string notecardName = "MyNotecard"; //Name of a notecard in the object's inventory. Needs to be Full Perm for key checking for changed contents to work<br />
<br />
integer notecardLine; //Initialize the counter value at 0<br />
<br />
key notecardKey; //Store the notecard's key, so we don't read it again by accident.<br />
<br />
list notecardData; //List to store data read from the notecard.<br />
<br />
ReadNotecard()<br />
{<br />
if (llGetInventoryKey(notecardName) == NULL_KEY)<br />
{ //Check if the notecard exists in inventory, and is has been saved since it's creation (newly created notecards that are yet to be saved are assigned NULL_KEY).<br />
llOwnerSay( "Notecard '" + notecardName + "' is missing, unwritten, or not full permission."); //Notify user.<br />
return; //Don't do anything else.<br />
}<br />
else if (llGetInventoryKey(notecardName) == notecardKey) return;<br />
//This notecard has already been read - call to read was made in error, so don't do anything. (Notecards are assigned a new key each time they are saved.)<br />
<br />
llOwnerSay("Began reading notecard: " + notecardName); //Notify user that read has started.<br />
notecardData = []; //Clear the memory of the previous notecard.<br />
notecardKey = llGetInventoryKey(notecardName); //Remember the key of this iteration of the notecard, so we don't read it again by accident.<br />
notecardQueryId = llGetNotecardLine(notecardName, notecardLine);<br />
}<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
ReadNotecard(); //Pass off to the read function.<br />
}<br />
<br />
changed(integer change)<br />
{<br />
if(change & CHANGED_INVENTORY)<br />
{ //The object's inventory just changed - the notecard could have been modified!<br />
ReadNotecard();<br />
}<br />
}<br />
<br />
dataserver(key query_id, string data)<br />
{<br />
if (query_id == notecardQueryId)<br />
{<br />
if (data == EOF) //Reached end of notecard (End Of File).<br />
{<br />
llOwnerSay("Done reading notecard, read " + (string) notecardLine + " notecard lines."); //Notify user.<br />
llSay(DEBUG_CHANNEL,"=== READ FROM NOTECARD: " + notecardName + " ===\n" + llDumpList2String(notecardData,"\n"));<br />
//Dump the contents of the notecard (for testing purposes).<br />
}<br />
else<br />
{<br />
notecardData += data; //Add the line being read to a new entry on the list.<br />
++notecardLine; //Increment line number (read next line).<br />
notecardQueryId = llGetNotecardLine(notecardName, notecardLine); //Query the dataserver for the next notecard line.<br />
}<br />
}<br />
}<br />
}<br />
</source><br />
|helpers=<br />
<source lang="lsl2"><br />
/////<br />
// Generic Multi Notecard reader by Brangus Weir<br />
// Given freely and published on wiki.secondlife.com<br />
//<br />
// This script will read three note cards and store the results into three lists.<br />
// It can be modified and extended to as many (or few) cards as you'd like to read. <br />
//<br />
<br />
list gOneCard; // All the lines from from the first card<br />
list gTwoCard; // All the lines from from the second card<br />
list gThreeCard; // All the lines from from the third card<br />
<br />
string gsCardOneName = "One"; //Set these to the name of the invetory item.<br />
string gsCardTwoName = "Two";<br />
string gsCardThreeName = "Three";<br />
<br />
//Temporary variables for processing<br />
string g_sNoteCardName; // Name of the card to be read.<br />
list g_lTempLines; // The resulting data pushed into a list<br />
integer g_iLine; // The line count for the card reader<br />
key g_kQuery; // The key of the card being read<br />
<br />
<br />
initialize(string _action) {<br />
// Due to the execution order when using dataserver, this function sets the first card to <br />
// be read, and the excetuion finishes when called again with the _action set to "finish".<br />
if (_action == "") {<br />
loadNoteCard(gsCardOneName);<br />
} else if (_action == "finish") {<br />
// All cards have been read into the lists... now you can do any kind of string<br />
// manipulations to get the data you need to set your script.<br />
// But here we will prove that the cards have been read with a loop<br />
<br />
g_lTempLines = []; // lets not forget to delete this global, or it will be dead weight.<br />
<br />
integer len = llGetListLength(gOneCard); //Always evaluate this once, don't do it<br />
//INSIDE the for loop like noob programers will.<br />
//Reduce lag, THINK ABOUT MACHINE CYCLES!<br />
integer i = 0;<br />
for (; i< len; ++i)<br />
llSay(0, llList2String(gOneCard,i));<br />
<br />
len = llGetListLength(gTwoCard);<br />
for (i = 0; i< len; ++i)<br />
llSay(0, llList2String(gTwoCard,i));<br />
<br />
len = llGetListLength(gThreeCard);<br />
for (i = 0; i< len; ++i)<br />
llSay(0, llList2String(gThreeCard,i));<br />
} <br />
<br />
}<br />
<br />
loadNoteCard( string _notecard ) {<br />
g_lTempLines = []; //clear the temp lines<br />
g_sNoteCardName = _notecard;<br />
g_iLine = 0;<br />
g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine); <br />
<br />
}<br />
<br />
notecardFinished(string _notecard){<br />
// Called at the end of each notecard as it is read. The temp results are stored<br />
// and the next card is commanded to be read.<br />
if (_notecard == gsCardOneName) {<br />
gOneCard = g_lTempLines;<br />
loadNoteCard(gsCardTwoName);<br />
} else if (_notecard == gsCardTwoName) {<br />
gTwoCard = g_lTempLines;<br />
loadNoteCard(gsCardThreeName);<br />
} else if (_notecard == gsCardThreeName) {<br />
gThreeCard = g_lTempLines;<br />
initialize("finish"); // Finally pass execution to finish the initialization. <br />
} <br />
}<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
}<br />
<br />
touch_start(integer _num_det){<br />
initialize("");<br />
}<br />
<br />
dataserver(key _query_id, string _data) <br />
{<br />
if (_query_id == g_kQuery) {<br />
// this is a line of our notecard<br />
if (_data != EOF) { <br />
g_lTempLines += _data;<br />
//request a next line<br />
++g_iLine; // increment line count<br />
g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine);<br />
} else {<br />
//The notecard has been read <br />
//notify end of read<br />
notecardFinished(g_sNoteCardName);<br />
}<br />
}<br />
}<br />
}<br />
</source><br />
<br />
<source lang="lsl2"><br />
/////<br />
// Generic Multi Notecard reader by Randur Source<br />
// Given freely and published on wiki.secondlife.com<br />
//<br />
// This script will read all note cards in sequence and dump the results into chat as an example.<br />
// It can be modified and extended to do other things to the data. <br />
//<br />
<br />
integer inventorycnt;<br />
integer notecardlinecnt;<br />
integer notecardlinenumber;<br />
string notecardname;<br />
key linenumberid;<br />
key lineid;<br />
<br />
getnextnotecardlinenumber()<br />
{<br />
// first get the number of lines from the notecard<br />
inventorycnt++;<br />
if (inventorycnt < llGetInventoryNumber(INVENTORY_NOTECARD))<br />
{<br />
notecardname = llGetInventoryName(INVENTORY_NOTECARD,inventorycnt);<br />
linenumberid = llGetNumberOfNotecardLines(notecardname);<br />
}<br />
else<br />
llOwnerSay("Done.");<br />
}<br />
<br />
getnextnotecardline()<br />
{<br />
// get the next line from the notecard or skip to the next notecard<br />
notecardlinecnt++;<br />
if (notecardlinecnt < notecardlinenumber)<br />
lineid = llGetNotecardLine(notecardname,notecardlinecnt);<br />
else<br />
getnextnotecardlinenumber();<br />
}<br />
<br />
default<br />
{<br />
touch_start(integer total_number)<br />
{<br />
if (llDetectedKey(0) != llGetOwner()) return; // allow owner only<br />
<br />
inventorycnt = -1;<br />
getnextnotecardlinenumber();<br />
}<br />
<br />
dataserver(key queryid,string data)<br />
{<br />
if (queryid == linenumberid) // this was a line number lookup<br />
{<br />
linenumberid = NULL_KEY;<br />
notecardlinenumber = (integer)data;<br />
if (notecardlinenumber == 0)<br />
getnextnotecardlinenumber();<br />
else<br />
{<br />
notecardlinecnt = -1;<br />
getnextnotecardline();<br />
}<br />
}<br />
else if (queryid == lineid) // this was a data line lookup<br />
{<br />
lineid = NULL_KEY;<br />
<br />
// Example of what to do with the data:<br />
// Test for valid avatar names, possibly multiple names on each line, separated by ,<br />
// and say them in chat to the owner<br />
list names = llParseString2List(data,[","],[]); // split lines on ,<br />
integer len = llGetListLength(names); // I wouldn't dare to put this inside the for loop<br />
integer cnt;<br />
for (cnt = 0; cnt < len; cnt++)<br />
{<br />
string name = llDumpList2String(llParseString2List(llList2String(names,cnt),[" "],[])," "); // remove extra spaces<br />
if (llGetListLength(llParseString2List(name,[" "],[])) == 2) // check for first + lastname<br />
llOwnerSay(notecardname + ": " + name);<br />
}<br />
<br />
getnextnotecardline();<br />
}<br />
}<br />
}<br />
<br />
</source><br />
|also_functions={{LSL DefineRow||[[llGetNumberOfNotecardLines]]|}}<br />
|also_events={{LSL DefineRow||[[dataserver]]|}}<br />
|also_articles<br />
|also_tests<br />
|permission<br />
|cat1=Notecard<br />
|cat2=Dataserver<br />
|cat3=<br />
|cat4=<br />
|history={{LSL Added|0.6.0|remote=http://secondlife.wikia.com/wiki/Version_0.6.0}}<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Project_Bento_Skeleton_Guide&diff=1213886Project Bento Skeleton Guide2023-05-02T16:32:13Z<p>Tapple Gao: Cheek bones were misnamed. Thanks aglaia for noticing</p>
<hr />
<div>{{#vardefine:bgcolor|"e3e3e3"}}<br />
{{Navbox/Bento}}<br />
The following is a brief summary of the updates to the skeleton for the [[Project_Bento_Testing|Bento project]].<br />
<br />
<br />
= Partial Skeletons =<br />
<br />
Upload of rigged content no longer needs all the bones specified in the DAE file for convenience purposes. For rigged content, simply omitting unused/missing bones from the skinning data is now is allowed.<br />
<br />
= New Bones =<br />
<br />
There are 106 new bones added for Bento. The largest number are for support of facial expressions and finger movement.<br />
<br />
The numbers in bones names are ordered such the bone that is closest to the root has the lower number.<br />
<br />
== Hands ==<br />
<br />
There are 30 finger joints, 15 on each hand - 3 joints per finger times 5 fingers.<br />
They are named as follows: <code>mHand<finger><number><side></code>, where fingers are Thumb, Middle, Index, Ring, and Pinky, number is 1,2 or 3, and side is Left or Right.<br />
<br />
{| border="1" cellpadding="3" width="66%"<br />
|+ '''List of hand bones'''<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHandThumb1Left||mHandThumb1Right<br />
|-<br />
|mHandThumb2Left||mHandThumb2Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHandThumb3Left||mHandThumb3Right<br />
|-<br />
|mHandIndex1Left||mHandIndex1Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHandIndex2Left||mHandIndex2Right<br />
|-<br />
|mHandIndex3Left||mHandIndex3Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHandMiddle1Left||mHandMiddle1Right<br />
|-<br />
|mHandMiddle2Left||mHandMiddle2Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHandMiddle3Left||mHandMiddle3Right<br />
|-<br />
|mHandRing1Left||mHandRing1Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHandRing2Left||mHandRing2Right<br />
|-<br />
|mHandRing3Left||mHandRing3Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHandPinky1Left||mHandPinky1Right<br />
|-<br />
|mHandPinky2Left||mHandPinky2Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHandPinky3Left||mHandPinky3Right<br />
|}<br />
<br />
== Face ==<br />
<br />
The following new joints have been added to the head and face:<br />
<br />
{| border="1" cellpadding="3" width=66%<br />
|+ '''List of face bones'''<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceForeheadLeft<br />
|rowspan="3"|For animating the forehead<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceForeheadCenter<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceForeheadRight<br />
|-<br />
|mFaceEyebrowOuterLeft<br />
|rowspan="6"|For animating the eyebrows<br />
|-<br />
|mFaceEyebrowCenterLeft<br />
|-<br />
|mFaceEyebrowInnerLeft<br />
|-<br />
|mFaceEyebrowOuterRight<br />
|-<br />
|mFaceEyebrowCenterRight<br />
|-<br />
|mFaceEyebrowInnerRight<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceEyeLidUpperLeft<br />
|rowspan="4"|For controlling the upper and lower eyelids<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceEyeLidLowerLeft<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceEyeLidUpperRight<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceEyeLidLowerRight<br />
|-<br />
|mFaceEyeAltLeft<br />
|rowspan="2"|By default, these are in the same location as the default mEyeLeft and mEyeRight bones. They could be used to control additional eyes, or to control eye orientation via animations. The default eye bones are not suitable for use in animations because they are controlled directly by the Second Life viewer.<br />
|-<br />
|mFaceEyeAltRight<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceEyecornerInnerLeft<br />
|rowspan="2"|<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceEyecornerInnerRight<br />
|-<br />
|mFaceEar1Left<br />
|rowspan="4"|These allow ears, antennas, or any other head appendages of your choice to be animated.<br />
|-<br />
|mFaceEar2Left<br />
|-<br />
|mFaceEar1Right<br />
|-<br />
|mFaceEar2Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceNoseLeft<br />
|rowspan="5"|For animations involving the nose<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceNoseCenter<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceNoseRight<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceNoseBase<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceNoseBridge<br />
|-<br />
|mFaceCheekUpperLeft<br />
|rowspan="4"|For animations involving the cheeks<br />
|-<br />
|mFaceCheekLowerLeft<br />
|-<br />
|mFaceCheekUpperRight<br />
|-<br />
|mFaceCheekLowerRight<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceJaw<br />
|For opening and closing the mouth.<br />
|-<br />
|mFaceLipUpperLeft<br />
|rowspan="5"|For controlling the upper lips and mouth corners<br />
|-<br />
|mFaceLipUpperCenter<br />
|-<br />
|mFaceLipUpperRight<br />
|-<br />
|mFaceLipCornerLeft<br />
|-<br />
|mFaceLipCornerRight<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceTongueBase<br />
|rowspan="2"|For animating the tongue<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceTongueTip<br />
|-<br />
|mFaceLipLowerLeft<br />
|rowspan="3"|For animating the lower lip<br />
|-<br />
|mFaceLipLowerCenter<br />
|-<br />
|mFaceLipLowerRight<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceTeethLower<br />
|rowspan="2"|For positioning the teeth<br />
|-bgcolor={{#var:bgcolor}}<br />
|mFaceTeethUpper<br />
|-<br />
|mFaceChin<br />
|For positioning the chin<br />
|<br />
|}<br />
<br />
== Spine ==<br />
Additional joints have been added to the spine to allow more flexible models. By default these are "folded up" inside the original spine and will not have any affect, so they would need to be re-positioned in any models that use them.<br />
<br />
{| border="1" cellpadding="3" width="66%"<br />
|+ '''List of spine bones'''<br />
|-bgcolor={{#var:bgcolor}}<br />
|mSpine1<br />
|rowspan="2"|Between mPelvis and mTorso<br />
|-bgcolor={{#var:bgcolor}}<br />
|mSpine2<br />
|-<br />
|mSpine3<br />
|rowspan="2"|Between mTorso and mChest<br />
|-<br />
|mSpine4<br />
|}<br />
<br />
== Wings ==<br />
<br />
{| border="1" cellpadding="3" width="66%"<br />
|+ '''List of wing bones'''<br />
|-bgcolor={{#var:bgcolor}}<br />
|mWingsRoot<br />
|This joint lies at the base of the wings, and is intended to make it easier to move and potentially repurpose the wing joints.<br />
|-<br />
|mWing1Left<br />
|rowspan="8"|For controlling the wings<br />
|-<br />
|mWing2Left<br />
|-<br />
|mWing3Left<br />
|-<br />
|mWing4Left<br />
|-<br />
|mWing1Right<br />
|-<br />
|mWing2Right<br />
|-<br />
|mWing3Right<br />
|-<br />
|mWing4Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mWing4FanRight<br />
|rowspan="2"|These branch off from the main chain of the wings, to help with applications like bat wings.<br />
|-bgcolor={{#var:bgcolor}}<br />
|mWing4FanLeft<br />
|}<br />
<br />
== Hind Limbs ==<br />
By default, these bones are positioned behind the original legs and can be used as and additional set of legs in that position. If repositioned, they can also be used for a second set of arms or wings.<br />
<br />
{| border="1" cellpadding="3" width="66%"<br />
|+ '''List of hind limb bones'''<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHindLimbsRoot<br />
|<br />
|-<br />
|mHindLimb1Left<br />
|rowspan="4"| Bones in the left hind leg.<br />
|-<br />
|mHindLimb2Left<br />
|-<br />
|mHindLimb3Left<br />
|-<br />
|mHindLimb4Left<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHindLimb1Right<br />
|rowspan="4"| Bones in the right hind leg<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHindLimb2Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHindLimb3Right<br />
|-bgcolor={{#var:bgcolor}}<br />
|mHindLimb4Right<br />
|}<br />
<br />
== Tail ==<br />
<br />
{| border="1" cellpadding="3" width="66%"<br />
|+ '''List of tail bones'''<br />
|-<br />
|mTail1<br />
|base<br />
|rowspan="6"|For animating a tail<br />
|-<br />
|mTail2<br />
|<br />
|-<br />
|mTail3<br />
|<br />
|-<br />
|mTail4<br />
|<br />
|-<br />
|mTail5<br />
|<br />
|-<br />
|mTail6<br />
|tip<br />
|}<br />
<br />
== Other ==<br />
<br />
{|border="1" cellpadding="3" width="66%"<br />
|+ '''List of other joints'''<br />
|-<br />
|mGroin<br />
|For animating any groin-related appendages<br />
|}<br />
<br />
= New Attachment Points =<br />
<br />
{|border="1" cellpadding="3" width="66%"<br />
|+ '''List of new attachment points'''<br />
|- {{Hl2}}<br />
! Location<br />
! {{LSLGC|Attachment|Number}}<br />
! Description<br />
|-bgcolor={{#var:bgcolor}}<br />
|Left Ring Finger<br />
|41<br />
|rowspan="2"|Linked to the mHandRing1Left and mHandRing1Right joints, suitable for rings and such.<br />
|-bgcolor={{#var:bgcolor}}<br />
|Right Ring Finger<br />
|42<br />
|-<br />
|Tail Base<br />
|43<br />
|Linked to the first tail joint, mTail1.<br />
|-bgcolor={{#var:bgcolor}}<br />
|Tail Tip<br />
|44<br />
|Linked to the last tail joint, mTail6<br />
|-<br />
|Left Wing<br />
|45<br />
|rowspan="2"|Linked to the wing joints mWing4Left and mWing4Right<br />
|-<br />
|Right Wing<br />
|46<br />
|-bgcolor={{#var:bgcolor}}<br />
|Jaw<br />
|47<br />
|Linked to the mFaceJaw joint.<br />
|-<br />
|Alt Left Ear<br />
|48<br />
|rowspan="2"|Linked to the new mFaceEarLeft and mFaceEarRight joints. Called "Alt" ears because there are already ear attachment points connected to the head.<br />
|-<br />
|Alt Right Ear<br />
|49<br />
|-bgcolor={{#var:bgcolor}}<br />
|Alt Left Eye<br />
|50<br />
|rowspan="2"|Linked to the new Alt eye joints mFaceEyeAltLeft and mFaceEyeAltRight.<br />
|-bgcolor={{#var:bgcolor}}<br />
|Alt Right Eye<br />
|51<br />
|-<br />
|Tongue<br />
|52<br />
|Linked to mFaceTongueTip<br />
|-bgcolor={{#var:bgcolor}}<br />
|Groin<br />
|53<br />
|Linked to mGroin<br />
|-<br />
|Left Hind Foot<br />
|54<br />
|Linked to mHindLimb4Left<br />
|-<br />
|Right Hind Foot<br />
|55<br />
|Linked to mHindLimb4Right<br />
|}<br />
<br />
= Slider Support =<br />
<br />
We support most of the shape controls found under "Edit Shape". However, some of the controls are supported only by the use of collision volume bones (Fitted Mesh), and some controls cannot be supported due to technical constraints. <br />
<br />
=== Controls supported via Fitted Mesh ===<br />
The following slider controls are supported, but only by the use of collision volume bones (Fitted Mesh)<br />
<br />
* Body Fat<br />
* Torso Muscles<br />
* Breast Size<br />
* Breast Buoyancy<br />
* Breast Cleavage<br />
* Love Handles<br />
* Belly Size<br />
* Leg Muscles<br />
* Butt Size<br />
* Saddle Bags<br />
* Knee Angle<br />
* Foot Size<br />
<br />
=== Unsupported controls ===<br />
The following slider controls are not supported due to technical constraints.<br />
<br />
* Head shape<br />
* Eyelash length<br />
* Eye Pop<br />
* Ear Angle<br />
* Attached Earlobe<br />
* Jowls<br />
* Chin Cleft<br />
* Upper Chin Cleft<br />
<br />
=== Bones Currently Affected By Positional Sliders === <br />
The following bones are influenced by sliders that affect their POSITION. This means they run the risk of having the influence they have on the avatar shape being partially or completely overridden by animations that use positions.<br />
<br />
* mWing1Right<br />
* mWing1Left<br />
* mWing2Left<br />
* mWing3Left<br />
* mWing4Left<br />
* mWing4FanLeft<br />
* mWing2Right<br />
* mWing3Right<br />
* mWing4Right<br />
* mWing4FanRight<br />
* mTail1<br />
* mTail2<br />
* mTail3<br />
* mTail4<br />
* mTail5<br />
* mTail6<br />
* mCollarLeft<br />
* mCollarRight<br />
* mHipLeft<br />
* mHipRight<br />
* mHindLimb1Left<br />
* mHindLimb1Right<br />
* mEyeLeft<br />
* mEyeRight<br />
* mFaceEyeAltLeft<br />
* mFaceEyeAltRight<br />
* mFaceEyeLidLowerLeft<br />
* mFaceEyeLidLowerRight<br />
* mFaceEyeLidUpperLeft<br />
* mFaceEyeLidUpperRight<br />
* mFaceEyebrowInnerLeft<br />
* mFaceEyebrowInnerRight<br />
* mFaceEyebrowCenterLeft<br />
* mFaceEyebrowCenterRight<br />
* mFaceEyebrowOuterLeft<br />
* mFaceEyebrowOuterRight<br />
* mFaceEyecornerInnerLeft<br />
* mFaceEyecornerInnerRight<br />
* mFaceNoseRight<br />
* mFaceNoseLeft<br />
* mFaceEar1Left<br />
* mFaceEar1Right<br />
* mFaceLipUpperLeft<br />
* mFaceLipUpperRight<br />
* mFaceLipLowerLeft<br />
* mFaceLipLowerRight<br />
* mFaceLipCornerRight<br />
* mFaceLipCornerLeft<br />
* mFaceCheekLowerLeft<br />
* mFaceCheekLowerRight<br />
* mFaceCheekUpperLeft<br />
* mFaceCheekUpperRight<br />
* mFaceForeheadLeft<br />
* mFaceForeheadRight<br />
* mSkull<br />
* mFootRight<br />
* mFootLeft<br />
* mHindLimb4Left<br />
* mHindLimb4Right<br />
* mFaceNoseBridge<br />
* mFaceNoseCenter<br />
* mFaceNoseBase<br />
* mFaceLipUpperCenter<br />
* mFaceTeethUpper<br />
* mFaceLipLowerCenter<br />
* mFaceTeethLower<br />
* mFaceEar2Left<br />
* mFaceEar2Right<br />
* mFaceJawShaper<br />
* mFaceChin<br />
* mFaceForeheadCenter<br />
* mFaceRoot<br />
* mFaceTongueTip<br />
* BELLY<br />
* PELVIS<br />
* LEFT_PEC<br />
* RIGHT_PEC<br />
* L_CLAVICLE<br />
* L_UPPER_ARM<br />
* L_LOWER_ARM<br />
* R_CLAVICLE<br />
* R_UPPER_ARM<br />
* R_LOWER_ARM<br />
* CHEST<br />
* UPPER_BACK<br />
* LOWER_BACK<br />
* LEFT_HANDLE<br />
* RIGHT_HANDLE<br />
* HEAD<br />
* BUTT<br />
* L_UPPER_LEG<br />
* L_LOWER_LEG<br />
* R_UPPER_LEG<br />
* R_LOWER_LEG<br />
* L_FOOT<br />
* R_FOOT<br />
<br />
=== Sliders that affect Bones === <br />
<br />
These are sliders that can be controlled interactively and affect bone position or scale. The neutral value is the fraction of the way along the slider range (from 0-1) at which the slider has no effect, and so leaves the skeleton in its default state.<br />
<br />
{|border="1" cellpadding="3" width="66%"<br />
|- {{Hl2}}<br />
! ID<br />
! Name<br />
! Neutral value<br />
! Bones<br />
|-bgcolor={{#var:bgcolor}}<br />
<br />
<!-- Contents from skel_tool.py --skel_slider_info --><br />
| 1<br />
| Big_Brow<br />
| 0.1304<br />
| mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight, mFaceForeheadCenter<br />
|-<br />
| 2<br />
| Nose_Big_Out<br />
| 0.2424<br />
| mFaceNoseBridge, mFaceNoseCenter, mFaceNoseLeft, mFaceNoseRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 4<br />
| Broad_Nostrils<br />
| 0.3333<br />
| mFaceNoseLeft, mFaceNoseRight<br />
|-<br />
| 6<br />
| Bulbous_Nose_Tip<br />
| 0.2308<br />
| mFaceNoseCenter<br />
|-bgcolor={{#var:bgcolor}}<br />
| 7<br />
| Weak_Chin<br />
| 0.5000<br />
| mFaceChin<br />
|-<br />
| 8<br />
| Double_Chin<br />
| 0.2500<br />
| mFaceJawShaper<br />
|-bgcolor={{#var:bgcolor}}<br />
| 10<br />
| Sunken_Cheeks<br />
| 0.3333<br />
| mFaceCheekLowerLeft, mFaceCheekLowerRight<br />
|-<br />
| 11<br />
| Noble_Nose_Bridge<br />
| 0.2500<br />
| mFaceForeheadCenter, mFaceNoseBridge<br />
|-bgcolor={{#var:bgcolor}}<br />
| 14<br />
| High_Cheek_Bones<br />
| 0.3333<br />
| mFaceCheekUpperLeft, mFaceCheekUpperRight<br />
|-<br />
| 15<br />
| Ears_Out<br />
| 0.2500<br />
| mFaceEar1Left, mFaceEar1Right<br />
|-bgcolor={{#var:bgcolor}}<br />
| 16<br />
| Pointy_Eyebrows<br />
| 0.1429<br />
| mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight<br />
|-<br />
| 17<br />
| Square_Jaw<br />
| 0.3333<br />
| mFaceChin<br />
|-bgcolor={{#var:bgcolor}}<br />
| 18<br />
| Puffy_Upper_Cheeks<br />
| 0.3750<br />
| mFaceCheekUpperLeft, mFaceCheekUpperRight<br />
|-<br />
| 19<br />
| Upturned_Nose_Tip<br />
| 0.6000<br />
| mFaceNoseBase, mFaceNoseCenter, mFaceNoseLeft, mFaceNoseRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 20<br />
| Bulbous_Nose<br />
| 0.2500<br />
| mFaceNoseCenter, mFaceNoseLeft, mFaceNoseRight<br />
|-<br />
| 21<br />
| Upper_Eyelid_Fold<br />
| 0.1333<br />
| mFaceEyeLidUpperLeft, mFaceEyeLidUpperRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 23<br />
| Baggy_Eyes<br />
| 0.2500<br />
| mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight<br />
|-<br />
| 24<br />
| Wide_Eyes<br />
| 0.4286<br />
| mFaceEyeAltLeft, mFaceEyeAltRight, mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight, mFaceEyeLidUpperLeft, mFaceEyeLidUpperRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 25<br />
| Wide_Lip_Cleft<br />
| 0.3478<br />
| mFaceLipCornerLeft, mFaceLipCornerRight, mFaceLipUpperLeft, mFaceLipUpperRight<br />
|-<br />
| 27<br />
| Wide_Nose_Bridge<br />
| 0.5200<br />
| mFaceNoseBridge<br />
|-bgcolor={{#var:bgcolor}}<br />
| 31<br />
| Arced_Eyebrows<br />
| 0.0000<br />
| mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight<br />
|-<br />
| 33<br />
| Height<br />
| 0.5349<br />
| mChest, mCollarLeft, mCollarRight, mElbowLeft, mElbowRight, mHindLimb1Left, mHindLimb1Right, mHindLimb2Left, mHindLimb2Right, mHipLeft, mHipRight, mKneeLeft, mKneeRight, mNeck, mShoulderLeft, mShoulderRight, mSpine3, mSpine4, mTail1, mTail2, mTail3, mTail4, mTail5, mTail6, mTorso, mWing1Left, mWing1Right, mWing2Left, mWing2Right, mWing3Left, mWing3Right, mWing4FanLeft, mWing4FanRight, mWing4Left, mWing4Right<br />
|-bgcolor={{#var:bgcolor}}<br />
| 34<br />
| Thickness<br />
| 0.3182<br />
| mChest, mCollarLeft, mCollarRight, mElbowLeft, mElbowRight, mHindLimb1Left, mHindLimb1Right, mHindLimb2Left, mHindLimb2Right, mHindLimbsRoot, mHipLeft, mHipRight, mKneeLeft, mKneeRight, mNeck, mPelvis, mShoulderLeft, mShoulderRight, mSpine1, mSpine2, mSpine3, mSpine4, mTail1, mTail2, mTail3, mTail4, mTail5, mTail6, mTorso, mWing1Left, mWing1Right<br />
|-<br />
| 35<br />
| Big_Ears<br />
| 0.3333<br />
| mFaceEar1Left, mFaceEar1Right<br />
|-bgcolor={{#var:bgcolor}}<br />
| 36<br />
| Shoulders<br />
| 0.5625<br />
| mChest, mCollarLeft, mCollarRight, mNeck, mWing1Left, mWing1Right<br />
|-<br />
| 37<br />
| Hip Width<br />
| 0.5333<br />
| mHindLimb1Left, mHindLimb1Right, mHindLimbsRoot, mHipLeft, mHipRight, mPelvis, mSpine1, mSpine2, mTail1, mTail2, mTail3<br />
|-bgcolor={{#var:bgcolor}}<br />
| 38<br />
| Torso Length<br />
| 0.5000<br />
| mHindLimb1Left, mHindLimb1Right, mHindLimb2Left, mHindLimb2Right, mHindLimbsRoot, mHipLeft, mHipRight, mKneeLeft, mKneeRight, mPelvis, mSpine1, mSpine2, mSpine3, mSpine4, mTorso<br />
|-<br />
| 80<br />
| male<br />
| 0.0000<br />
| mChest, mCollarLeft, mCollarRight, mElbowLeft, mElbowRight, mHindLimb1Left, mHindLimb1Right, mHindLimb2Left, mHindLimb2Right, mHipLeft, mHipRight, mKneeLeft, mKneeRight, mNeck, mShoulderLeft, mShoulderRight, mSpine3, mSpine4, mTorso, mWing1Left, mWing1Right, mWingsRoot<br />
|-bgcolor={{#var:bgcolor}}<br />
| 119<br />
| Eyebrow Size<br />
| 0.0000<br />
| mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight<br />
|-<br />
| 155<br />
| Lip Width<br />
| 0.4091<br />
| mFaceLipCornerLeft, mFaceLipCornerRight, mFaceLipLowerLeft, mFaceLipLowerRight, mFaceLipUpperLeft, mFaceLipUpperRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 185<br />
| Deep_Chin<br />
| 0.5000<br />
| mFaceChin<br />
|-<br />
| 193<br />
| Head Shape<br />
| 0.0000<br />
| mFaceCheekLowerLeft, mFaceCheekLowerRight, mFaceChin, mFaceForeheadLeft, mFaceForeheadRight, mFaceJawShaper, mFaceRoot<br />
|-bgcolor={{#var:bgcolor}}<br />
| 196<br />
| Eye Spacing<br />
| 0.6667<br />
| mEyeLeft, mEyeRight, mFaceEyeAltLeft, mFaceEyeAltRight, mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight, mFaceEyeLidUpperLeft, mFaceEyeLidUpperRight, mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight, mFaceEyecornerInnerLeft, mFaceEyecornerInnerRight<br />
|-<br />
| 198<br />
| Heel Height<br />
| 0.0000<br />
| mFootLeft, mFootRight, mHindLimb4Left, mHindLimb4Right<br />
|-bgcolor={{#var:bgcolor}}<br />
| 503<br />
| Platform Height<br />
| 0.0000<br />
| mFootLeft, mFootRight, mHindLimb4Left, mHindLimb4Right<br />
|-<br />
| 505<br />
| Lip Thickness<br />
| 0.0000<br />
| mFaceLipCornerLeft, mFaceLipCornerRight, mFaceLipLowerCenter, mFaceLipLowerLeft, mFaceLipLowerRight, mFaceLipUpperCenter, mFaceLipUpperLeft, mFaceLipUpperRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 506<br />
| Mouth_Height<br />
| 0.5000<br />
| mFaceNoseBase, mFaceTeethLower, mFaceTeethUpper<br />
|-<br />
| 517<br />
| Wide_Nose<br />
| 0.3333<br />
| mFaceNoseCenter, mFaceNoseLeft, mFaceNoseRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 629<br />
| Forehead Angle<br />
| 0.0000<br />
| mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceForeheadCenter, mFaceForeheadLeft, mFaceForeheadRight<br />
|-<br />
| 646<br />
| Egg_Head<br />
| 0.5652<br />
| mFaceCheekLowerLeft, mFaceCheekLowerRight, mFaceCheekUpperLeft, mFaceCheekUpperRight, mFaceChin, mFaceEyeAltLeft, mFaceEyeAltRight, mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight, mFaceEyeLidUpperLeft, mFaceEyeLidUpperRight, mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight, mFaceEyecornerInnerLeft, mFaceEyecornerInnerRight, mFaceForeheadCenter, mFaceForeheadLeft, mFaceForeheadRight, mFaceJawShaper, mFaceLipLowerCenter, mFaceLipLowerLeft, mFaceLipLowerRight, mFaceNoseBase, mFaceNoseCenter, mFaceNoseLeft, mFaceNoseRight, mFaceRoot, mFaceTeethLower, mFaceTeethUpper, mFaceTongueBase<br />
|-bgcolor={{#var:bgcolor}}<br />
| 647<br />
| Squash_Stretch_Head<br />
| 0.3333<br />
| mFaceCheekLowerLeft, mFaceCheekLowerRight, mFaceCheekUpperLeft, mFaceCheekUpperRight, mFaceChin, mFaceEyeAltLeft, mFaceEyeAltRight, mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight, mFaceEyeLidUpperLeft, mFaceEyeLidUpperRight, mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight, mFaceEyecornerInnerLeft, mFaceEyecornerInnerRight, mFaceForeheadCenter, mFaceNoseBase, mFaceNoseBridge, mFaceNoseLeft, mFaceNoseRight, mFaceRoot, mFaceTeethLower, mFaceTeethUpper<br />
|-<br />
| 650<br />
| Eyelid_Corner_Up<br />
| 0.5200<br />
| mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 653<br />
| Tall_Lips<br />
| 0.3333<br />
| mFaceLipCornerLeft, mFaceLipCornerRight, mFaceLipLowerCenter, mFaceLipLowerLeft, mFaceLipLowerRight, mFaceLipUpperCenter, mFaceLipUpperLeft, mFaceLipUpperRight<br />
|-<br />
| 656<br />
| Crooked_Nose<br />
| 0.5000<br />
| mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyecornerInnerLeft, mFaceEyecornerInnerRight, mFaceLipCornerLeft, mFaceLipCornerRight, mFaceLipUpperCenter, mFaceLipUpperLeft, mFaceLipUpperRight, mFaceNoseBase, mFaceNoseBridge, mFaceNoseCenter, mFaceNoseLeft, mFaceNoseRight, mFaceTeethUpper<br />
|-bgcolor={{#var:bgcolor}}<br />
| 659<br />
| Mouth Corner<br />
| 0.0000<br />
| mFaceLipCornerLeft, mFaceLipCornerRight, mFaceLipLowerCenter, mFaceLipLowerLeft, mFaceLipLowerRight, mFaceLipUpperCenter, mFaceLipUpperLeft, mFaceLipUpperRight<br />
|-<br />
| 662<br />
| Face Shear<br />
| 0.0000<br />
| mEyeLeft, mEyeRight, mFaceCheekLowerLeft, mFaceCheekLowerRight, mFaceCheekUpperLeft, mFaceCheekUpperRight, mFaceEar1Left, mFaceEar1Right, mFaceEyeAltLeft, mFaceEyeAltRight, mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight, mFaceEyeLidUpperLeft, mFaceEyeLidUpperRight, mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight, mFaceEyecornerInnerLeft, mFaceEyecornerInnerRight, mFaceForeheadLeft, mFaceForeheadRight, mFaceLipCornerLeft, mFaceLipCornerRight, mFaceLipLowerLeft, mFaceLipLowerRight, mFaceLipUpperLeft, mFaceLipUpperRight, mFaceNoseLeft, mFaceNoseRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 663<br />
| Shift_Mouth<br />
| 0.5000<br />
| mFaceNoseBase, mFaceNoseCenter, mFaceNoseLeft, mFaceNoseRight, mFaceTeethLower, mFaceTeethUpper<br />
|-<br />
| 665<br />
| Jaw_Jut<br />
| 0.5000<br />
| mFaceChin, mFaceTeethLower<br />
|-bgcolor={{#var:bgcolor}}<br />
| 675<br />
| Hand Size<br />
| 0.5000<br />
| mHandIndex1Left, mHandIndex1Right, mHandIndex2Left, mHandIndex2Right, mHandIndex3Left, mHandIndex3Right, mHandMiddle1Left, mHandMiddle1Right, mHandMiddle2Left, mHandMiddle2Right, mHandMiddle3Left, mHandMiddle3Right, mHandPinky1Left, mHandPinky1Right, mHandPinky2Left, mHandPinky2Right, mHandPinky3Left, mHandPinky3Right, mHandRing1Left, mHandRing1Right, mHandRing2Left, mHandRing2Right, mHandRing3Left, mHandRing3Right, mHandThumb1Left, mHandThumb1Right, mHandThumb2Left, mHandThumb2Right, mHandThumb3Left, mHandThumb3Right, mWristLeft, mWristRight<br />
|-<br />
| 682<br />
| Head Size<br />
| 0.0000<br />
| mEyeLeft, mEyeRight, mFaceCheekLowerLeft, mFaceCheekLowerRight, mFaceCheekUpperLeft, mFaceCheekUpperRight, mFaceChin, mFaceEyeAltLeft, mFaceEyeAltRight, mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight, mFaceEyeLidUpperLeft, mFaceEyeLidUpperRight, mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight, mFaceEyecornerInnerLeft, mFaceEyecornerInnerRight, mFaceForeheadCenter, mFaceForeheadLeft, mFaceForeheadRight, mFaceJaw, mFaceJawShaper, mFaceLipCornerLeft, mFaceLipCornerRight, mFaceLipLowerCenter, mFaceLipLowerLeft, mFaceLipLowerRight, mFaceLipUpperCenter, mFaceLipUpperLeft, mFaceLipUpperRight, mFaceNoseBase, mFaceNoseBridge, mFaceNoseCenter, mFaceNoseLeft, mFaceNoseRight, mFaceRoot, mFaceTeethLower, mFaceTeethUpper, mFaceTongueBase, mFaceTongueTip, mHead, mSkull<br />
|-bgcolor={{#var:bgcolor}}<br />
| 683<br />
| Neck Thickness<br />
| 0.6667<br />
| mNeck<br />
|-<br />
| 690<br />
| Eye Size<br />
| 0.0000<br />
| mEyeLeft, mEyeRight, mFaceEyeAltLeft, mFaceEyeAltRight, mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight, mFaceEyeLidUpperLeft, mFaceEyeLidUpperRight, mFaceEyecornerInnerLeft, mFaceEyecornerInnerRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 692<br />
| Leg Length<br />
| 0.5000<br />
| mHindLimb1Left, mHindLimb1Right, mHindLimb2Left, mHindLimb2Right, mHipLeft, mHipRight, mKneeLeft, mKneeRight<br />
|-<br />
| 693<br />
| Arm Length<br />
| 0.5000<br />
| mElbowLeft, mElbowRight, mShoulderLeft, mShoulderRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 756<br />
| Neck Length<br />
| 0.5000<br />
| mNeck<br />
|-<br />
| 757<br />
| Lower_Eyebrows<br />
| 0.6667<br />
| mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 758<br />
| Lower_Bridge_Nose<br />
| 0.5000<br />
| mFaceNoseBridge, mFaceNoseCenter<br />
|-<br />
| 759<br />
| Low_Septum_Nose<br />
| 0.4000<br />
| mFaceNoseBase<br />
|-bgcolor={{#var:bgcolor}}<br />
| 760<br />
| Jaw_Angle<br />
| 0.3750<br />
| mFaceJawShaper<br />
|-<br />
| 764<br />
| Lip_Cleft_Deep<br />
| 0.2941<br />
| mFaceLipUpperCenter, mFaceLipUpperLeft, mFaceLipUpperRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 765<br />
| Puffy_Lower_Lids<br />
| 0.1071<br />
| mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight, mFaceEyecornerInnerLeft, mFaceEyecornerInnerRight<br />
|-<br />
| 769<br />
| Eye Depth<br />
| 0.0000<br />
| mEyeLeft, mEyeRight, mFaceEyeAltLeft, mFaceEyeAltRight, mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight, mFaceEyeLidUpperLeft, mFaceEyeLidUpperRight, mFaceEyebrowCenterLeft, mFaceEyebrowCenterRight, mFaceEyebrowInnerLeft, mFaceEyebrowInnerRight, mFaceEyebrowOuterLeft, mFaceEyebrowOuterRight, mFaceEyecornerInnerLeft, mFaceEyecornerInnerRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 773<br />
| Head Length<br />
| 0.0000<br />
| mEyeLeft, mEyeRight, mFaceCheekLowerLeft, mFaceCheekLowerRight, mFaceChin, mFaceEyeAltLeft, mFaceEyeAltRight, mFaceEyeLidLowerLeft, mFaceEyeLidLowerRight, mFaceEyeLidUpperLeft, mFaceEyeLidUpperRight, mFaceLipCornerLeft, mFaceLipCornerRight, mFaceLipLowerCenter, mFaceLipLowerLeft, mFaceLipLowerRight, mFaceLipUpperCenter, mFaceLipUpperLeft, mFaceLipUpperRight, mFaceNoseBase, mFaceNoseCenter, mFaceNoseLeft, mFaceNoseRight, mFaceRoot, mFaceTeethLower, mFaceTeethUpper, mFaceTongueBase, mFaceTongueTip<br />
|-<br />
| 796<br />
| Pointy_Ears<br />
| 0.1176<br />
| mFaceEar2Left, mFaceEar2Right<br />
|-bgcolor={{#var:bgcolor}}<br />
| 799<br />
| Lip Ratio<br />
| 0.0000<br />
| mFaceLipCornerLeft, mFaceLipCornerRight, mFaceLipLowerCenter, mFaceLipLowerLeft, mFaceLipLowerRight, mFaceLipUpperCenter, mFaceLipUpperLeft, mFaceLipUpperRight<br />
|-<br />
| 842<br />
| Hip Length<br />
| 0.5000<br />
| mHindLimbsRoot, mPelvis, mSpine1, mSpine2<br />
|-bgcolor={{#var:bgcolor}}<br />
| 879<br />
| Male_Package<br />
| 0.2000<br />
| mGroin<br />
|-<br />
| 880<br />
| Eyelid_Inner_Corner_Up<br />
| 0.5200<br />
| mFaceEyecornerInnerLeft, mFaceEyecornerInnerRight<br />
|-bgcolor={{#var:bgcolor}}<br />
| 11001<br />
| Hover<br />
| 0.5000<br />
| None (Changes vertical positioning)<br />
|-<br />
<br />
|}<br />
<br />
=== Sliders that affect Collision Volumes === <br />
<br />
These are sliders that can be controlled interactively and affect collision volume position or scale. The neutral value is the fraction of the way along the slider range (from 0-1) at which the slider has no effect, and so leaves the skeleton in its default state. Some sliders affect both bones and collision volumes, and so will appear in both tables.<br />
{|border="1" cellpadding="3" width="66%"<br />
|- {{Hl2}}<br />
! ID<br />
! Name<br />
! Neutral value<br />
! Collision Volumes<br />
|-bgcolor={{#var:bgcolor}}<br />
<br />
| 80<br />
| male<br />
| 0.0000<br />
| BELLY, CHEST, HEAD, LEFT_PEC, L_CLAVICLE, L_LOWER_ARM, L_UPPER_ARM, NECK, RIGHT_PEC, R_CLAVICLE, R_LOWER_ARM, R_UPPER_ARM<br />
|-<br />
| 105<br />
| Breast Size<br />
| 0.0000<br />
| LEFT_PEC, RIGHT_PEC<br />
|-bgcolor={{#var:bgcolor}}<br />
| 157<br />
| Belly Size<br />
| 0.0000<br />
| BELLY, PELVIS<br />
|-<br />
| 507<br />
| Breast_Gravity<br />
| 0.4286<br />
| LEFT_PEC, RIGHT_PEC<br />
|-bgcolor={{#var:bgcolor}}<br />
| 515<br />
| Foot_Size<br />
| 0.2500<br />
| L_FOOT, R_FOOT<br />
|-<br />
| 637<br />
| Body Fat<br />
| 0.0000<br />
| BELLY, CHEST, HEAD, LEFT_HANDLE, LEFT_PEC, LOWER_BACK, L_CLAVICLE, L_LOWER_ARM, L_LOWER_LEG, L_UPPER_ARM, L_UPPER_LEG, NECK, PELVIS, RIGHT_HANDLE, RIGHT_PEC, R_CLAVICLE, R_LOWER_ARM, R_LOWER_LEG, R_UPPER_ARM, R_UPPER_LEG, UPPER_BACK<br />
|-bgcolor={{#var:bgcolor}}<br />
| 647<br />
| Squash_Stretch_Head<br />
| 0.3333<br />
| HEAD<br />
|-<br />
| 649<br />
| Torso Muscles<br />
| 0.0000<br />
| BELLY, CHEST, L_CLAVICLE, L_LOWER_ARM, L_UPPER_ARM, R_CLAVICLE, R_LOWER_ARM, R_UPPER_ARM, UPPER_BACK<br />
|-bgcolor={{#var:bgcolor}}<br />
| 652<br />
| Leg Muscles<br />
| 0.0000<br />
| L_LOWER_LEG, L_UPPER_LEG, R_LOWER_LEG, R_UPPER_LEG<br />
|-<br />
| 676<br />
| Love_Handles<br />
| 0.3333<br />
| BELLY, LEFT_HANDLE, LOWER_BACK, RIGHT_HANDLE<br />
|-bgcolor={{#var:bgcolor}}<br />
| 678<br />
| Torso Muscles<br />
| 0.0000<br />
| BELLY, CHEST, L_CLAVICLE, L_LOWER_ARM, L_UPPER_ARM, R_CLAVICLE, R_LOWER_ARM, R_UPPER_ARM, UPPER_BACK<br />
|-<br />
| 684<br />
| Breast_Female_Cleavage<br />
| 0.1875<br />
| LEFT_PEC, RIGHT_PEC<br />
|-bgcolor={{#var:bgcolor}}<br />
| 685<br />
| Chest_Male_No_Pecs<br />
| 0.3125<br />
| LEFT_PEC, RIGHT_PEC<br />
|-<br />
| 753<br />
| Saddlebags<br />
| 0.1429<br />
| PELVIS<br />
|-bgcolor={{#var:bgcolor}}<br />
| 773<br />
| Head Length<br />
| 0.0000<br />
| HEAD<br />
|-<br />
| 795<br />
| Butt Size<br />
| 0.0000<br />
| BUTT, PELVIS<br />
|-bgcolor={{#var:bgcolor}}<br />
| 841<br />
| Bowed_Legs<br />
| 0.5000<br />
| L_LOWER_LEG, L_UPPER_LEG, R_LOWER_LEG, R_UPPER_LEG<br />
|-<br />
|}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Internal_Animation_Format&diff=1213882Internal Animation Format2023-04-25T12:03:31Z<p>Tapple Gao: added blender-anim-exporter</p>
<hr />
<div>{{KBtip|You may find the contents of [[Anim File Format]] page helpful in addition to this page.}}<br />
== Tools ==<br />
If you're coming here to find out about how to take advantage of Second Life's internal animation format (.anim), you may find the below tools of use.<br />
<br />
{| class="wikitable" style="margin:auto; width: 85%; text-align: center;"<br />
|+ .anim file format utilities<br />
|-<br />
! scope="col" style="background-color:#A7C1F2" | Name<br />
! scope="col" style="background-color:#A7C1F2" | Notes<br />
|-<br />
| [https://gitlab.com/Quillia/anim-converter '''Anim-converter''']<br />
| Converts .bvh files into Second Life .anim files.<br />
|-<br />
| [https://github.com/Gina43/anim-2-bvh '''Anim2BVH''']<br />
| Inverse of the above, converts .anim files into .bvh files.<br />
|-<br />
| [https://community.secondlife.com/forums/topic/468179-anim-hacker/ '''Anim Hacker''']<br />
| Tool for manipulating .anim files. Can be used to edit joint priorities, add constraints, and more!<br />
|-<br />
| [https://github.com/tapple/tanimbomb '''tanimbomb''']<br />
| Python CLI tool for making simple bulk-edits to multiple anim files at once, especially joint removal and animation mirroring<br />
|-<br />
| [https://github.com/LGGGreg/par/releases/tag/v1 '''AnimMaker''']<br />
| Older tool, equivalent to AnimHacker. ([http://web.archive.org/web/20100526180459/http://code.google.com/p/par/source/browse#svn/branches/AnimMaker Source Code available in archive])<br />
|-<br />
| [https://github.com/aglaia-resident/blender-anim-exporter '''blender-anim-exporter''']<br />
| blender plugin for exporting animations to .anim format<br />
|}<br />
<br />
==Overview==<br />
<br />
From a programming perspective, there are several steps to uploading an [[Animation|animation]] from a BVH (BioVision Hierarchy) file:<br />
<br />
# Read and parse the BVH file, creating an LLKeyframeMotion object containing the motion data.<br />
# Gather input from the user (via the upload preview floater) for things like animation priority, facial expression, and looping; these settings are stored in the LLKeyframeMotion object.<br />
# Serialize the LLKeyframeMotion object as [[LLSD]].<br />
# Upload the serialized data to the asset server.<br />
<br />
Before other viewers can play an animation, they must:<br />
<br />
# Download the serialized data from the asset server.<br />
# Deserialize it to an LLKeyframeMotion object.<br />
<br />
Relevant source files:<br />
* [https://github.com/secondlife/viewer/blob/main/indra/llcharacter/llbvhloader.cpp llbvhloader.cpp]<br />
* [https://github.com/secondlife/viewer/blob/main/indra/llcharacter/llkeyframemotion.cpp#L1229 llkeyframemotion.cpp:deserialize()]<br />
<br />
Note: the binary file is little endian.<br />
<br />
{{KBwarning|1=The asset uploader enforces a {{HoverText|250,000 byte|250 KB (decimal), 244 KB (binary)}} limit on .anim files. Files larger than this will fail to upload, and will return an error. <br> {{HoverText|Simplify your animation|Remove triplicate keyframes, remove unused joints, remove keyframes for small movements, etc.}}, then retry uploading.<br>'''Blender Users:''' You can use a built-in function called "''Decimate''" to simplify your animation. See [https://www.youtube.com/watch?v=lScwEYJZy1M this tutorial].}}<br />
<br />
==Header==<br />
<br />
The first part of the animation data is a header describing various details about the animation as a whole. The elements, in order, are:<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=version|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=sub_version|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=base_priority|llsd=integer|cpp=S32|note=Is informational only, and does not affect the animation. The animation system always follows individual joint priority; Except for animations making use of constraints, in which case the constraint will be applied at priority defined by this value.}}<br />
{{LLSD Field Entry|name=duration|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=emote_name|llsd=string|cpp=char *|note=NULL-terminated character sequence}}<br />
{{LLSD Field Entry|name=loop_in_point|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=loop_out_point|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=loop|llsd=integer|cpp=S32|note=0: not looped, 1: looped}}<br />
{{LLSD Field Entry|name=ease_in_duration|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_out_duration|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=hand_pose|llsd=integer|cpp=U32|note=Enum defined in [https://github.com/secondlife/viewer/blob/main/indra/llcharacter/llhandmotion.h#L45]}}<br />
{{LLSD Field Entry|name=num_joints|llsd=integer|cpp=U32}}<br />
|}<br />
<br />
==Joint Data==<br />
<br />
After the header is data for each joint in the skeleton:<br />
Note: Unused bones need not be included in the file.<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=joint_name|llsd=string|cpp=char *|note=NULL-terminated character sequence}}<br />
{{LLSD Field Entry|name=joint_priority|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
===Joint Rotation Keys===<br />
<br />
At the start of the rotation data for each bone is the total number of rotation keys:<br />
If the bone has no rotation based keyframes, this value must be 0.<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=num_rot_keys|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
Then, for each rotation key:<br />
<br />
Note: These three values X Y Z appear to be the first three values of a truncated quaternion with the W term being calculated afterwards. <br />
Since a quaternion is X<sup>2</sup> + Y<sup>2</sup> + Z<sup>2</sup> + W<sup>2</sup> = 1 as long as you assume the W term has a consistent sign the X Y Z terms will be accurate.<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=time|llsd=integer|cpp=U16|note=0: first frame, 65535: last frame}}<br />
{{LLSD Field Entry|name=rot_x|llsd=integer|cpp=U16|note= 0:-1, 32767:0, 65535:+1 }}<br />
{{LLSD Field Entry|name=rot_y|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=rot_z|llsd=integer|cpp=U16}}<br />
|}<br />
<br />
===Joint Position Keys===<br />
<br />
At the start of the position data is the total number of position keys:<br />
If the bone has no position based animations, this value must be 0.<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=num_pos_keys|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
<br />
Then, for each position key, position data is measured from Avatar Center ( mPelvis ), not joint resting position<br />
( IE [0,0,0] is not joint resting position, it'll be the bone's position in parent coordinate space)<br />
with the exception of the mPelvis bone which is stored in world space coordinates.:<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=time|llsd=integer|cpp=U16|note=0: first frame, 65535: last frame}}<br />
{{LLSD Field Entry|name=pos_x|llsd=integer|cpp=U16|desc=position measured from avatar root, not joint offset|note=0:-5m, 32767:0m, 65535:+5m (m for metres)}}<br />
{{LLSD Field Entry|name=pos_y|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=pos_z|llsd=integer|cpp=U16}}<br />
|}<br />
<br />
==Constraints==<br />
<br />
After the joint data are a number of entries for joint constraints. Constraints can target an avatar's parts in relation to each other or the ground (IK).<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=num_constraints|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
Then, for each joint constraint:<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=chain_length|llsd=integer|cpp=U8|note=number of attached joints to include}}<br />
{{LLSD Field Entry|name=constraint_type|llsd=integer|cpp=U8|note=0: point'''*''', 1: plane}}<br />
{{LLSD Field Entry|name=source_volume|llsd=string |cpp=char[16]|desc=skeleton collision volume name|note=Always 16 bytes, but if shorter, it's interpreted as NULL-terminated and the remaining bytes ignored.}}<br />
{{LLSD Field Entry|name=source_offset|llsd=string (?)|cpp=LLVector3}}<br />
{{LLSD Field Entry|name=target_volume|llsd=string|cpp=char[16]|desc=skeleton collision volume name|note=Always 16 bytes, but if shorter, it's interpreted as NULL-terminated and the remaining bytes ignored.}}<br />
{{LLSD Field Entry|name=target_offset|llsd=string (?)|cpp=LLVector3}}<br />
{{LLSD Field Entry|name=target_dir|llsd=string (?)|cpp=LLVector3|note=value is currently ignored}}<br />
{{LLSD Field Entry|name=ease_in_start|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_in_stop|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_out_start|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_out_stop|llsd=real|cpp=F32}}<br />
|}<br />
'''*''' The implementation of constraint type '''Point''' is incomplete, and is considered non-functional. Until further notice, all constraints should use the '''Plane''' type.<br />
:The above does not seem to be true, both types would seem to be working. ([[User:Jenna Huntsman |Jenna Huntsman]] tested {{#time: d F Y|8/12/2022}} )<br />
=== [[User:Jenna Huntsman |Jenna's]] notes on constraints ===<br />
* ''chain_length'' is '''not''' inclusive of the source bone itself, so for example, if the source bone is R_HAND, setting a ''chain_length'' of 2 will use R_LOWER_ARM (elbow joint) and R_UPPER_ARM (shoulder joint).<br />
** Setting a ''chain_length'' of more than 4 will prevent the animation from playing - the animation will upload, but will not play.<br />
** Setting a ''chain_length'' of 4 (both constraint types) will cause the viewer to crash.<br />
* ''target_offset'' uses an axis layout of X+ forward, Y+ left, Z+ up.<br />
** Constraints only seem to work reliably if ''target_offset'' has a value of 1 on the Z axis. The values on the X and Y axis can be anything however.<br />
* ''source_offset'' uses an axis layout of X+ forward, Y+ left, Z+ up.<br />
** <s>The distance units expected are of an unknown unit, however it does not seem to be meters or inches. (Also true of ''target_offset'')</s><br />
** '''llkeyframemotion.cpp''' would seem to suggest that constraints are inherited from a BVH upon conversion to .anim, which would make the units be inches (as is standard for BVH animations in SL); <s>however in-world testing casts doubt upon this.</s><br />
* ''target_dir'' is unused, however is likely a unit vector relative to the armature root.<br />
** As such, bone rotations can be manipulated by rot keys as normal, however the rotation will not be relative to the target volume.<br />
** It seems that while ''target_dir'' is present in the file format for constraints, it was never implemented (As per '''llkeyframemotion.cpp''').<br />
* While ''GROUND'' is a recognized and implemented target volume, server-side checks prevent uploads of animations making use of this constraint target.<br />
* There seems to be a hard limit of 10 constraints per animation (as per '''llkeyframemotion.cpp''').<br />
* Constraints always follow the shortest path from their source to their destination, irrespective of 'legal' joint rotations. (Meaning to say, constraints can cause bones to move in an odd way (e.g. an arm clipping inside your body) if that is the shortest path.)<br />
* Unlike regular animations, Constraints seem to require an intact armature from the skeleton root (mPelvis) to the source and target bones; Otherwise the animation will not play.<br />
** The bones do not need to be animated, they only need to be present in the .anim file.<br />
* Constraints '''do''' respect animation priority (The ''global'' animation priority, as defined by ''base_priority'', '''not''' the ''per joint'' priority), meaning it's possible to stack constraints, but not within the same animation.</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlTakeControls&diff=1213870LlTakeControls2023-04-13T20:45:21Z<p>Tapple Gao: added links to viewer source</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{Issues/SVC-3187}}{{Issues/SCR-97}}{{LSL_Function/permission|PERMISSION_TAKE_CONTROLS}}{{LSL_Function/boolean|}}{{LSL_Function/boolean|}}accept pass_on FIXME!!!<br />
|func_id=111|func_sleep=0.0|func_energy=10.0<br />
|sort=TakeControls|func=llTakeControls<br />
|p1_type=integer|p1_name=controls|p1_desc=bitfield of CONTROL_* flags<br />
|p2_type=integer|p2_subtype=boolean|p2_name=accept|p2_desc=boolean, determines whether [[control]] events are generated<br />
|p3_type=integer|p3_subtype=boolean|p3_name=pass_on|p3_desc=boolean, determines whether controls perform their normal functions<br />
|func_footnote=If {{LSLP|accept}} is [[FALSE]] and {{LSLP|pass_on}} is [[FALSE]], the behavior is not intuitive. In this case, the complement of the specified controls do not generate events and do not perform their normal functions. They are effectively disabled. Certain control bits (e.g. CONTROL_ROT_LEFT) are also disabled when specified, in this case.<br /><br />
If {{LSLP|accept}} is [[FALSE]] and {{LSLP|pass_on}} is [[TRUE]], then the specified controls do not generate events but perform their normal functions.<br/><br />
If {{LSLP|accept}} is [[TRUE]] and {{LSLP|pass_on}} is [[FALSE]], then the specified controls generate events but do not perform their normal functions.<br /><br />
If {{LSLP|accept}} is [[TRUE]] and {{LSLP|pass_on}} is [[TRUE]], then the specified controls generate events and perform their normal functions.<br />
|func_desc=Allows for intercepting of keyboard and mouse clicks, specifically those specified by {{LSLP|controls}}, from the agent the script has permissions for.<br />
|return_text<br />
|spec<br />
|caveats=<br />
* There appears to be no penalty for using {{LSLP|accept}} = TRUE, {{LSLP|pass_on}} = TRUE when there is no [[control]] event in the script (such as is used in AO's to ensure they work on no-script land)<br />
** There is a bug in some permissions that prevents left clicks from working in mouselook if they are set to {{LSLP|accept}} = FALSE, {{LSLP|pass_on}} = TRUE<br />
* If you sit/are sitting on the object that has taken your controls using {{LSLP|accept}} = [[TRUE]] and {{LSLP|pass_on}} = [[TRUE]], then [[CONTROL_FWD]], [[CONTROL_BACK]], [[CONTROL_ROT_LEFT]], and [[CONTROL_ROT_RIGHT]] will never generate events; instead these controls will only perform their normal functions.<br />
* if the undocumented controls 0x02000000 or 0x04000000 are taken with {{LSLP|pass_on}} = FALSE, then [[llGetAnimation]] will never be "Turning Left" or "Turning Right", respectively, and those animations set by [[llSetAnimationOverride]] will never play<br />
** all control flags documented in [https://github.com/openmetaversefoundation/libopenmetaverse/blob/master/OpenMetaverse/AgentManagerMovement.cs#L42 libopenmetaverse] [https://github.com/secondlife/viewer/blob/c7053a6928fd5eafdc935453742e92951ae4e0c1/indra/llcommon/indra_constants.h#L255 secondlife viewer]<br />
|constants={{LSL_Constants/Controls}}<br />
|examples=<source lang="lsl2">default<br />
{<br />
state_entry()<br />
{<br />
llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);<br />
}<br />
run_time_permissions(integer perm)<br />
{<br />
if(PERMISSION_TAKE_CONTROLS & perm)<br />
{<br />
llTakeControls(<br />
CONTROL_FWD |<br />
CONTROL_BACK |<br />
CONTROL_LEFT |<br />
CONTROL_RIGHT |<br />
CONTROL_ROT_LEFT |<br />
CONTROL_ROT_RIGHT |<br />
CONTROL_UP |<br />
CONTROL_DOWN |<br />
CONTROL_LBUTTON |<br />
CONTROL_ML_LBUTTON ,<br />
TRUE, TRUE);<br />
<br />
}<br />
}<br />
control(key id, integer level, integer edge)<br />
{<br />
integer start = level & edge;<br />
integer end = ~level & edge;<br />
integer held = level & ~edge;<br />
integer untouched = ~(level | edge);<br />
llOwnerSay(llList2CSV([level, edge, start, end, held, untouched]));<br />
}<br />
}</source><br />
|helpers<br />
|also_functions={{LSL DefineRow||[[llReleaseControls]]}}<br />
|also_events={{LSL DefineRow||[[control]]}}<br />
|also_articles<br />
|also_tests<br />
|notes=If a script has taken controls, it and other scripts in the same prim will not be stopped if the Agent enters a "No Outside Scripts" parcel. This is done to keep vehicle control alive and AOs functional. This is an intentional feature. <br />
|cat1=Controls<br />
|cat2<br />
|cat3<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlSay&diff=1213775LlSay2023-03-26T17:45:39Z<p>Tapple Gao: </p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/chat|channel|msg}}<br />
|func_id=23<br />
|func_sleep=0.0<br />
|func_energy=10.0<br />
|func=llSay<br />
|sort=Say<br />
|p1_type=integer|p1_name=channel<br />
|p2_type=string|p2_name=msg<br />
|func_desc=Says the text supplied in string {{LSLP|msg}} on channel supplied in integer {{LSLP|channel}}. The message can be heard 20m away, usually (see caveats)<br />
|return_text<br />
|spec<br />
|constants<br />
|caveats=<br />
*{{LSLP|msg}} can only be heard within 20 meters of the speaking prim (rather than the root). This is contrary to how the event [[listen]] works, where a {{LSLP|msg}} can only be heard by any prim in the object if and only if the root prim is capable of hearing it.<br />
*Some simulators (mostly event sims or linden-owned ones) have <code>[[llGetEnv]]("chat_range")</code> set to a value other than 20. On these sims:<br />
** <code>llSay(0, msg)</code> can be heard in a radius of <code>[[llGetEnv]]("chat_range")</code><br />
** <code>llSay(any_other_channel, msg)</code> can be heard in a radius of 20m<br />
** as of 2023-03-26, [http://maps.secondlife.com/secondlife/Hippotropolis/67/188/28 Hippotropolis] (a linden meeting sim) has a chat range of 40m<br />
*{{LSLP|msg}} can be a maximum of 1024 bytes. This can convey 1024 ASCII characters, or 512 UTF-8 characters such as <code>á</code>.<br />
*A prim can '''not''' hear itself, this to prevent problems with recursion. It can however hear other prims within the same object.<br />
|examples=<br />
<syntaxhighlight lang="lsl2"><br />
default<br />
{<br />
state_entry()<br />
{<br />
llSay(0, "Hello, Avatar!");<br />
}<br />
}<br />
</syntaxhighlight><br />
To avoid making your object spam its neighborhood, use [[llInstantMessage]], [[llOwnerSay]] or [[llRegionSayTo]].<br />
|helpers<br />
|also_events=<br />
{{LSL DefineRow||[[listen]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Receives chat}}<br />
|also_functions=<br />
{{LSL DefineRow||[[llListen]]|Ask for listen events}}<br />
{{LSL DefineRow||[[llInstantMessage]]|Sends chat to the owner only (or to some other user only) to avoid spamming the [[PUBLIC_CHANNEL]]}}<br />
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only to avoid spamming the [[PUBLIC_CHANNEL]]}}<br />
{{LSL DefineRow||[[llRegionSay]]|Sends chat region wide}}<br />
{{LSL DefineRow||[[llRegionSayTo]]|Sends chat region wide to a specific avatar, or their attachments, or to a rezzed object of known UUID}}<br />
{{LSL DefineRow||[[llShout]]|Sends chat limited to 100 meters}}<br />
{{LSL DefineRow||[[llWhisper]]|Sends chat limited to 10 meters}}<br />
|also_tests<br />
|also_articles=<br />
{{LSL DefineRow||[[Hello Avatar]]}}<br />
|notes=<br />
* Channel {{HoverText|0|Zero}} is the [[PUBLIC_CHANNEL]]. Everyone can hear chat transmitted on this channel. All other channels are private channels (not sent to users, with the exception of [[DEBUG_CHANNEL]]).<br />
* Consider using [[llInstantMessage]], [[llOwnerSay]], or the [[DEBUG_CHANNEL]] for debugging purposes. If [[DEBUG_CHANNEL]] is used as {{LSLP|channel}}, the script will say {{LSLP|msg}} to the Script Warning/Error window.<br />
** Note, however, that when using [[DEBUG_CHANNEL]], what ''you'' consider to be 'debugging messages' will still be seen by others as ''scripting errors'' indicated by the floating 'script error' icon.<br />
* If one object 'says' something to another object (''e.g.'', a button that, when touched, turns on a lamp), it is a good idea to use a very negative channel, ''e.g.'', <code>-5243212</code> but don't just use any number take a look at the [[User-Defined Protocols & APIs]] and choose one that won't interfere with other protocols. If you are going to sell your script widely, please add it to the appropriate [[LSL_Protocol#Known_negative_chat_channels|known chat channels list]] so others won't interfere with your product (do keep in mind you should build your product so that it handles interference appropriately).<br />
<syntaxhighlight lang="lsl2"><br />
llSay(-5243212,"turn on");<br />
</syntaxhighlight><br />
:From at least September 2016 (see [[Release Notes/Second Life Release/4.0.9.320038]]), viewers have been able to chat on negative channels, although chat is [https://jira.secondlife.com/browse/BUG-41541 limited to 254 characters]. Negative channels have been popular for script communications because the standard SL client was unable to chat directly on those channels (<code>/-xxxx message</code> would not chat <code>message</code> on channel <code>-xxxx</code>). The only way for a viewer to generate chat on negative channels prior to [[llTextBox]] was to use [[llDialog]] which was limited to 24 bytes.<br />
* Be aware that if you mistakenly use an integer bigger than the maximum or smaller than the minimum, SL will treat the literal number as a {{LSLP|float}} and convert it implicitly to an out-of-range integer, resulting in <code>1</code>, ''without'' giving a script/syntax error (since this implicit conversion is legitimate). This means that all scripts listening to an out-of-range integer will be listening to channel 1 instead! (see also [[llListen]]).<br />
|cat1<br />
|cat2<br />
|haiku={{Haiku|Oh say, can you see?|Can you see what I say if|You're not far away?}}<br />
|cat3<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlSay&diff=1213774LlSay2023-03-26T17:44:22Z<p>Tapple Gao: </p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/chat|channel|msg}}<br />
|func_id=23<br />
|func_sleep=0.0<br />
|func_energy=10.0<br />
|func=llSay<br />
|sort=Say<br />
|p1_type=integer|p1_name=channel<br />
|p2_type=string|p2_name=msg<br />
|func_desc=Says the text supplied in string {{LSLP|msg}} on channel supplied in integer {{LSLP|channel}}. The message can be heard 20m away, usually (see caveats)<br />
|return_text<br />
|spec<br />
|constants<br />
|caveats=<br />
*{{LSLP|msg}} can only be heard within 20 meters of the speaking prim (rather than the root). This is contrary to how the event [[listen]] works, where a {{LSLP|msg}} can only be heard by any prim in the object if and only if the root prim is capable of hearing it.<br />
*Some simulators (mostly event sims or linden-owned ones) have llGetEnv("chat_range") set to a value other than 20. On these sims:<br />
** <code>llSay(0, msg)</code> can be heard in a radius of llGetEnv("chat_range")<br />
** <code>llSay(any_other_channel, msg)</code> can be heard in a radius of 20m<br />
** as of 2023-03-26, [http://maps.secondlife.com/secondlife/Hippotropolis/67/188/28 Hippotropolis] (a linden meeting sim) has a chat range of 40m<br />
*{{LSLP|msg}} can be a maximum of 1024 bytes. This can convey 1024 ASCII characters, or 512 UTF-8 characters such as <code>á</code>.<br />
*A prim can '''not''' hear itself, this to prevent problems with recursion. It can however hear other prims within the same object.<br />
|examples=<br />
<syntaxhighlight lang="lsl2"><br />
default<br />
{<br />
state_entry()<br />
{<br />
llSay(0, "Hello, Avatar!");<br />
}<br />
}<br />
</syntaxhighlight><br />
To avoid making your object spam its neighborhood, use [[llInstantMessage]], [[llOwnerSay]] or [[llRegionSayTo]].<br />
|helpers<br />
|also_events=<br />
{{LSL DefineRow||[[listen]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Receives chat}}<br />
|also_functions=<br />
{{LSL DefineRow||[[llListen]]|Ask for listen events}}<br />
{{LSL DefineRow||[[llInstantMessage]]|Sends chat to the owner only (or to some other user only) to avoid spamming the [[PUBLIC_CHANNEL]]}}<br />
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only to avoid spamming the [[PUBLIC_CHANNEL]]}}<br />
{{LSL DefineRow||[[llRegionSay]]|Sends chat region wide}}<br />
{{LSL DefineRow||[[llRegionSayTo]]|Sends chat region wide to a specific avatar, or their attachments, or to a rezzed object of known UUID}}<br />
{{LSL DefineRow||[[llShout]]|Sends chat limited to 100 meters}}<br />
{{LSL DefineRow||[[llWhisper]]|Sends chat limited to 10 meters}}<br />
|also_tests<br />
|also_articles=<br />
{{LSL DefineRow||[[Hello Avatar]]}}<br />
|notes=<br />
* Channel {{HoverText|0|Zero}} is the [[PUBLIC_CHANNEL]]. Everyone can hear chat transmitted on this channel. All other channels are private channels (not sent to users, with the exception of [[DEBUG_CHANNEL]]).<br />
* Consider using [[llInstantMessage]], [[llOwnerSay]], or the [[DEBUG_CHANNEL]] for debugging purposes. If [[DEBUG_CHANNEL]] is used as {{LSLP|channel}}, the script will say {{LSLP|msg}} to the Script Warning/Error window.<br />
** Note, however, that when using [[DEBUG_CHANNEL]], what ''you'' consider to be 'debugging messages' will still be seen by others as ''scripting errors'' indicated by the floating 'script error' icon.<br />
* If one object 'says' something to another object (''e.g.'', a button that, when touched, turns on a lamp), it is a good idea to use a very negative channel, ''e.g.'', <code>-5243212</code> but don't just use any number take a look at the [[User-Defined Protocols & APIs]] and choose one that won't interfere with other protocols. If you are going to sell your script widely, please add it to the appropriate [[LSL_Protocol#Known_negative_chat_channels|known chat channels list]] so others won't interfere with your product (do keep in mind you should build your product so that it handles interference appropriately).<br />
<syntaxhighlight lang="lsl2"><br />
llSay(-5243212,"turn on");<br />
</syntaxhighlight><br />
:From at least September 2016 (see [[Release Notes/Second Life Release/4.0.9.320038]]), viewers have been able to chat on negative channels, although chat is [https://jira.secondlife.com/browse/BUG-41541 limited to 254 characters]. Negative channels have been popular for script communications because the standard SL client was unable to chat directly on those channels (<code>/-xxxx message</code> would not chat <code>message</code> on channel <code>-xxxx</code>). The only way for a viewer to generate chat on negative channels prior to [[llTextBox]] was to use [[llDialog]] which was limited to 24 bytes.<br />
* Be aware that if you mistakenly use an integer bigger than the maximum or smaller than the minimum, SL will treat the literal number as a {{LSLP|float}} and convert it implicitly to an out-of-range integer, resulting in <code>1</code>, ''without'' giving a script/syntax error (since this implicit conversion is legitimate). This means that all scripts listening to an out-of-range integer will be listening to channel 1 instead! (see also [[llListen]]).<br />
|cat1<br />
|cat2<br />
|haiku={{Haiku|Oh say, can you see?|Can you see what I say if|You're not far away?}}<br />
|cat3<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlSay&diff=1213773LlSay2023-03-26T17:33:49Z<p>Tapple Gao: </p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/chat|channel|msg}}<br />
|func_id=23<br />
|func_sleep=0.0<br />
|func_energy=10.0<br />
|func=llSay<br />
|sort=Say<br />
|p1_type=integer|p1_name=channel<br />
|p2_type=string|p2_name=msg<br />
|func_desc=Says the text supplied in string {{LSLP|msg}} on channel supplied in integer {{LSLP|channel}}. The message can be heard 20m away, usually (see caveats)<br />
|return_text<br />
|spec<br />
|constants<br />
|caveats=<br />
*{{LSLP|msg}} can only be heard within 20 meters of the speaking prim (rather than the root). This is contrary to how the event [[listen]] works, where a {{LSLP|msg}} can only be heard by any prim in the object if and only if the root prim is capable of hearing it.<br />
*Some simulators (mostly event sims or linden-owned ones) have llGetEnv("chat_range") set to a value other than 20. On these sims:<br />
** {{LSLP|llSay(0, msg)}} can be heard in a radius of llGetEnv("chat_range")<br />
** {{LSLP|llSay(any_other_channel, msg)}} can be heard in a radius of 20m<br />
** as of 2023-03-26, [http://maps.secondlife.com/secondlife/Hippotropolis/67/188/28 Hippotropolis] (a linden meeting sim) has a chat range of 40m<br />
*{{LSLP|msg}} can be a maximum of 1024 bytes. This can convey 1024 ASCII characters, or 512 UTF-8 characters such as <code>á</code>.<br />
*A prim can '''not''' hear itself, this to prevent problems with recursion. It can however hear other prims within the same object.<br />
|examples=<br />
<syntaxhighlight lang="lsl2"><br />
default<br />
{<br />
state_entry()<br />
{<br />
llSay(0, "Hello, Avatar!");<br />
}<br />
}<br />
</syntaxhighlight><br />
To avoid making your object spam its neighborhood, use [[llInstantMessage]], [[llOwnerSay]] or [[llRegionSayTo]].<br />
|helpers<br />
|also_events=<br />
{{LSL DefineRow||[[listen]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Receives chat}}<br />
|also_functions=<br />
{{LSL DefineRow||[[llListen]]|Ask for listen events}}<br />
{{LSL DefineRow||[[llInstantMessage]]|Sends chat to the owner only (or to some other user only) to avoid spamming the [[PUBLIC_CHANNEL]]}}<br />
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only to avoid spamming the [[PUBLIC_CHANNEL]]}}<br />
{{LSL DefineRow||[[llRegionSay]]|Sends chat region wide}}<br />
{{LSL DefineRow||[[llRegionSayTo]]|Sends chat region wide to a specific avatar, or their attachments, or to a rezzed object of known UUID}}<br />
{{LSL DefineRow||[[llShout]]|Sends chat limited to 100 meters}}<br />
{{LSL DefineRow||[[llWhisper]]|Sends chat limited to 10 meters}}<br />
|also_tests<br />
|also_articles=<br />
{{LSL DefineRow||[[Hello Avatar]]}}<br />
|notes=<br />
* Channel {{HoverText|0|Zero}} is the [[PUBLIC_CHANNEL]]. Everyone can hear chat transmitted on this channel. All other channels are private channels (not sent to users, with the exception of [[DEBUG_CHANNEL]]).<br />
* Consider using [[llInstantMessage]], [[llOwnerSay]], or the [[DEBUG_CHANNEL]] for debugging purposes. If [[DEBUG_CHANNEL]] is used as {{LSLP|channel}}, the script will say {{LSLP|msg}} to the Script Warning/Error window.<br />
** Note, however, that when using [[DEBUG_CHANNEL]], what ''you'' consider to be 'debugging messages' will still be seen by others as ''scripting errors'' indicated by the floating 'script error' icon.<br />
* If one object 'says' something to another object (''e.g.'', a button that, when touched, turns on a lamp), it is a good idea to use a very negative channel, ''e.g.'', <code>-5243212</code> but don't just use any number take a look at the [[User-Defined Protocols & APIs]] and choose one that won't interfere with other protocols. If you are going to sell your script widely, please add it to the appropriate [[LSL_Protocol#Known_negative_chat_channels|known chat channels list]] so others won't interfere with your product (do keep in mind you should build your product so that it handles interference appropriately).<br />
<syntaxhighlight lang="lsl2"><br />
llSay(-5243212,"turn on");<br />
</syntaxhighlight><br />
:From at least September 2016 (see [[Release Notes/Second Life Release/4.0.9.320038]]), viewers have been able to chat on negative channels, although chat is [https://jira.secondlife.com/browse/BUG-41541 limited to 254 characters]. Negative channels have been popular for script communications because the standard SL client was unable to chat directly on those channels (<code>/-xxxx message</code> would not chat <code>message</code> on channel <code>-xxxx</code>). The only way for a viewer to generate chat on negative channels prior to [[llTextBox]] was to use [[llDialog]] which was limited to 24 bytes.<br />
* Be aware that if you mistakenly use an integer bigger than the maximum or smaller than the minimum, SL will treat the literal number as a {{LSLP|float}} and convert it implicitly to an out-of-range integer, resulting in <code>1</code>, ''without'' giving a script/syntax error (since this implicit conversion is legitimate). This means that all scripts listening to an out-of-range integer will be listening to channel 1 instead! (see also [[llListen]]).<br />
|cat1<br />
|cat2<br />
|haiku={{Haiku|Oh say, can you see?|Can you see what I say if|You're not far away?}}<br />
|cat3<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlSay&diff=1213772LlSay2023-03-26T17:27:49Z<p>Tapple Gao: I added info about what happens on sims with a non-default chat range</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/chat|channel|msg}}<br />
|func_id=23<br />
|func_sleep=0.0<br />
|func_energy=10.0<br />
|func=llSay<br />
|sort=Say<br />
|p1_type=integer|p1_name=channel<br />
|p2_type=string|p2_name=msg<br />
|func_desc=Says the text supplied in string {{LSLP|msg}} on channel supplied in integer {{LSLP|channel}}. The message can be heard 20m away, usually (see caveats)<br />
|return_text<br />
|spec<br />
|constants<br />
|caveats=<br />
*{{LSLP|msg}} can only be heard within 20 meters of the speaking prim (rather than the root). This is contrary to how the event [[listen]] works, where a {{LSLP|msg}} can only be heard by any prim in the object if and only if the root prim is capable of hearing it.<br />
*Some simulators (mostly event sims or linden-owned ones) have llGetEnv("chat_range") set to a value other than 20. On these sims:<br />
** llSay(0, msg) can be heard in a radius of llGetEnv("chat_range")<br />
** llSay(any_other_channel, msg) can be heard in a radius of 20m<br />
** as of 2023-03-26, [http://maps.secondlife.com/secondlife/Hippotropolis/67/188/28 Hippotropolis] (a linden meeting sim) has a chat range of 40m<br />
*{{LSLP|msg}} can be a maximum of 1024 bytes. This can convey 1024 ASCII characters, or 512 UTF-8 characters such as <code>á</code>.<br />
*A prim can '''not''' hear itself, this to prevent problems with recursion. It can however hear other prims within the same object.<br />
|examples=<br />
<syntaxhighlight lang="lsl2"><br />
default<br />
{<br />
state_entry()<br />
{<br />
llSay(0, "Hello, Avatar!");<br />
}<br />
}<br />
</syntaxhighlight><br />
To avoid making your object spam its neighborhood, use [[llInstantMessage]], [[llOwnerSay]] or [[llRegionSayTo]].<br />
|helpers<br />
|also_events=<br />
{{LSL DefineRow||[[listen]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Receives chat}}<br />
|also_functions=<br />
{{LSL DefineRow||[[llListen]]|Ask for listen events}}<br />
{{LSL DefineRow||[[llInstantMessage]]|Sends chat to the owner only (or to some other user only) to avoid spamming the [[PUBLIC_CHANNEL]]}}<br />
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only to avoid spamming the [[PUBLIC_CHANNEL]]}}<br />
{{LSL DefineRow||[[llRegionSay]]|Sends chat region wide}}<br />
{{LSL DefineRow||[[llRegionSayTo]]|Sends chat region wide to a specific avatar, or their attachments, or to a rezzed object of known UUID}}<br />
{{LSL DefineRow||[[llShout]]|Sends chat limited to 100 meters}}<br />
{{LSL DefineRow||[[llWhisper]]|Sends chat limited to 10 meters}}<br />
|also_tests<br />
|also_articles=<br />
{{LSL DefineRow||[[Hello Avatar]]}}<br />
|notes=<br />
* Channel {{HoverText|0|Zero}} is the [[PUBLIC_CHANNEL]]. Everyone can hear chat transmitted on this channel. All other channels are private channels (not sent to users, with the exception of [[DEBUG_CHANNEL]]).<br />
* Consider using [[llInstantMessage]], [[llOwnerSay]], or the [[DEBUG_CHANNEL]] for debugging purposes. If [[DEBUG_CHANNEL]] is used as {{LSLP|channel}}, the script will say {{LSLP|msg}} to the Script Warning/Error window.<br />
** Note, however, that when using [[DEBUG_CHANNEL]], what ''you'' consider to be 'debugging messages' will still be seen by others as ''scripting errors'' indicated by the floating 'script error' icon.<br />
* If one object 'says' something to another object (''e.g.'', a button that, when touched, turns on a lamp), it is a good idea to use a very negative channel, ''e.g.'', <code>-5243212</code> but don't just use any number take a look at the [[User-Defined Protocols & APIs]] and choose one that won't interfere with other protocols. If you are going to sell your script widely, please add it to the appropriate [[LSL_Protocol#Known_negative_chat_channels|known chat channels list]] so others won't interfere with your product (do keep in mind you should build your product so that it handles interference appropriately).<br />
<syntaxhighlight lang="lsl2"><br />
llSay(-5243212,"turn on");<br />
</syntaxhighlight><br />
:From at least September 2016 (see [[Release Notes/Second Life Release/4.0.9.320038]]), viewers have been able to chat on negative channels, although chat is [https://jira.secondlife.com/browse/BUG-41541 limited to 254 characters]. Negative channels have been popular for script communications because the standard SL client was unable to chat directly on those channels (<code>/-xxxx message</code> would not chat <code>message</code> on channel <code>-xxxx</code>). The only way for a viewer to generate chat on negative channels prior to [[llTextBox]] was to use [[llDialog]] which was limited to 24 bytes.<br />
* Be aware that if you mistakenly use an integer bigger than the maximum or smaller than the minimum, SL will treat the literal number as a {{LSLP|float}} and convert it implicitly to an out-of-range integer, resulting in <code>1</code>, ''without'' giving a script/syntax error (since this implicit conversion is legitimate). This means that all scripts listening to an out-of-range integer will be listening to channel 1 instead! (see also [[llListen]]).<br />
|cat1<br />
|cat2<br />
|haiku={{Haiku|Oh say, can you see?|Can you see what I say if|You're not far away?}}<br />
|cat3<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlDetachFromAvatar&diff=1213754LlDetachFromAvatar2023-03-16T23:50:00Z<p>Tapple Gao: </p>
<hr />
<div>{{Issues/VWR-12525}}{{Issues/VWR-16294}}{{LSL_Function/permission|PERMISSION_ATTACH|grant=the owner}}{{LSL_Function<br />
|func_id=114|func_sleep=0.0|func_energy=10.0<br />
|sort=DetachFromAvatar|func=llDetachFromAvatar<br />
|func_footnote=The detached object remains in the user's inventory (unless it was a temporary attachment, in which case it will be destroyed).<br />
|func_footnote=The detached object is no longer present in the sim. There is no lsl equivilent of the "Drop" command that moves an attachment onto the ground. Use [[llRezObject]] if you need similar behavior<br />
|func_desc=Detach object from avatar.<br />
|return_text<br />
|spec<br />
|caveats=<br />
* Only works in the root prim of the attachment; calling it from a script in a child prim will cause it to fail silently.<br />
* If the attachment was attached using [[llAttachToAvatarTemp]], the [[attach]]() [[event]] will ''not'' be called because the object will be destroyed before the event gets processed.<br />
|constants<br />
|examples=<br />
<source lang="lsl2"><br />
default<br />
{<br />
attach(key AvatarKey)<br />
{//give instructions for use and prevent item from being attached to avatar<br />
if(AvatarKey)<br />
{//event is called on both attach and detatch, but Key is only valid on attach<br />
llOwnerSay ("<br />
We hope you will enjoy your purchase, <br />
but if you really want to use this item properly, you should: <br />
1) drag it from your inventory to the ground <br />
2) Right click on it and select \"open\"<br />
3) copy its contents to inventory.");<br />
<br />
llRequestPermissions(AvatarKey, PERMISSION_ATTACH );<br />
}<br />
}<br />
run_time_permissions(integer perm)<br />
{<br />
if(perm & PERMISSION_ATTACH)<br />
{<br />
llDetachFromAvatar( );<br />
}<br />
}<br />
}<br />
</source><br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llAttachToAvatar]]|}}<br />
{{LSL DefineRow||[[llGetAttached]]|}}<br />
|also_events=<br />
{{LSL DefineRow||[[attach]]|}}<br />
|also_articles<br />
|notes=There is no way to delete an attachment with a script or to drop it to the ground.<br />
|cat1=Attachment<br />
|cat2=Avatar<br />
|cat3=Stop<br />
|cat4=Cleanup<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlDetachFromAvatar&diff=1213753LlDetachFromAvatar2023-03-16T23:48:23Z<p>Tapple Gao: </p>
<hr />
<div>{{Issues/VWR-12525}}{{Issues/VWR-16294}}{{LSL_Function/permission|PERMISSION_ATTACH|grant=the owner}}{{LSL_Function<br />
|func_id=114|func_sleep=0.0|func_energy=10.0<br />
|sort=DetachFromAvatar|func=llDetachFromAvatar<br />
|func_footnote=The detached object remains in the user's inventory (unless it was a temporary attachment, in which case it will be destroyed).<br />
|func_footnote=The detached object is no longer present in the sim. There is no lsl equivilent of the "Drop" command that moves an attachment onto the ground. Use [[llRezObject]] instead<br />
|func_desc=Detach object from avatar.<br />
|return_text<br />
|spec<br />
|caveats=<br />
* Only works in the root prim of the attachment; calling it from a script in a child prim will cause it to fail silently.<br />
* If the attachment was attached using [[llAttachToAvatarTemp]], the [[attach]]() [[event]] will ''not'' be called because the object will be destroyed before the event gets processed.<br />
|constants<br />
|examples=<br />
<source lang="lsl2"><br />
default<br />
{<br />
attach(key AvatarKey)<br />
{//give instructions for use and prevent item from being attached to avatar<br />
if(AvatarKey)<br />
{//event is called on both attach and detatch, but Key is only valid on attach<br />
llOwnerSay ("<br />
We hope you will enjoy your purchase, <br />
but if you really want to use this item properly, you should: <br />
1) drag it from your inventory to the ground <br />
2) Right click on it and select \"open\"<br />
3) copy its contents to inventory.");<br />
<br />
llRequestPermissions(AvatarKey, PERMISSION_ATTACH );<br />
}<br />
}<br />
run_time_permissions(integer perm)<br />
{<br />
if(perm & PERMISSION_ATTACH)<br />
{<br />
llDetachFromAvatar( );<br />
}<br />
}<br />
}<br />
</source><br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llAttachToAvatar]]|}}<br />
{{LSL DefineRow||[[llGetAttached]]|}}<br />
|also_events=<br />
{{LSL DefineRow||[[attach]]|}}<br />
|also_articles<br />
|notes=There is no way to delete an attachment with a script or to drop it to the ground.<br />
|cat1=Attachment<br />
|cat2=Avatar<br />
|cat3=Stop<br />
|cat4=Cleanup<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlDetachFromAvatar&diff=1213752LlDetachFromAvatar2023-03-16T23:47:55Z<p>Tapple Gao: noted that this is not "drop"</p>
<hr />
<div>{{Issues/VWR-12525}}{{Issues/VWR-16294}}{{LSL_Function/permission|PERMISSION_ATTACH|grant=the owner}}{{LSL_Function<br />
|func_id=114|func_sleep=0.0|func_energy=10.0<br />
|sort=DetachFromAvatar|func=llDetachFromAvatar<br />
|func_footnote=The detached object remains in the user's inventory (unless it was a temporary attachment, in which case it will be destroyed).<br />
|func_footnote=The detached object is no longer present in the sim. There is no lsl equivilent of the "Drop" command that moves an attachment onto the ground. use [[llRezObject]] instead<br />
|func_desc=Detach object from avatar.<br />
|return_text<br />
|spec<br />
|caveats=<br />
* Only works in the root prim of the attachment; calling it from a script in a child prim will cause it to fail silently.<br />
* If the attachment was attached using [[llAttachToAvatarTemp]], the [[attach]]() [[event]] will ''not'' be called because the object will be destroyed before the event gets processed.<br />
|constants<br />
|examples=<br />
<source lang="lsl2"><br />
default<br />
{<br />
attach(key AvatarKey)<br />
{//give instructions for use and prevent item from being attached to avatar<br />
if(AvatarKey)<br />
{//event is called on both attach and detatch, but Key is only valid on attach<br />
llOwnerSay ("<br />
We hope you will enjoy your purchase, <br />
but if you really want to use this item properly, you should: <br />
1) drag it from your inventory to the ground <br />
2) Right click on it and select \"open\"<br />
3) copy its contents to inventory.");<br />
<br />
llRequestPermissions(AvatarKey, PERMISSION_ATTACH );<br />
}<br />
}<br />
run_time_permissions(integer perm)<br />
{<br />
if(perm & PERMISSION_ATTACH)<br />
{<br />
llDetachFromAvatar( );<br />
}<br />
}<br />
}<br />
</source><br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llAttachToAvatar]]|}}<br />
{{LSL DefineRow||[[llGetAttached]]|}}<br />
|also_events=<br />
{{LSL DefineRow||[[attach]]|}}<br />
|also_articles<br />
|notes=There is no way to delete an attachment with a script or to drop it to the ground.<br />
|cat1=Attachment<br />
|cat2=Avatar<br />
|cat3=Stop<br />
|cat4=Cleanup<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=How_Puppetry_Works&diff=1213011How Puppetry Works2023-01-27T15:59:09Z<p>Tapple Gao: added bitbucket links to all mentioned filenames</p>
<hr />
<div>[[Category:Puppetry]]<br />
{{distinguish|Puppeteering}}<br />
<h2>How Puppetry Works</h2><br />
<br />
The new Puppetry technology in Second Life is intended for real-time animation control of avatars without the need for pre-computed animation assets. A Puppetry Viewer runs a plug-in which supplies joint movement instructions. The movement data is converted to animation format and applied to the local Avatar, streamed to the Second Life server and relayed to other nearby Viewers who apply the same animation conversion.<br />
<br />
Puppetry is still an experimental feature and is not yet deployed everywhere. It is only available when using a Puppetry Viewer connected to a Puppetry enabled Region. The Viewer can be obtained from the [https://releasenotes.secondlife.com/viewer.html alternative viewer download page], or since it is open-source it can be [[Puppetry Development|built from scratch]]. The Puppetry feature is only enabled on [[Preview Grid|the Preview grid]] in a few regions: '''Bunraku''' , '''Marionette''' or '''Castelet'''.<br />
<br />
<h2>Try It Out</h2><br />
<br />
Example Puppetry plugins can be found in the [https://bitbucket.org/lindenlab/leap/ LEAP git repository]. Clone that repo to your local filesystem, or download it as a zip file, and follow the instructions in the [https://bitbucket.org/lindenlab/leap/src/main/puppetry/README.md puppetry README.md] for installing required Python modules.<br />
<br />
Start up the Puppetry Viewer, log into [[Preview Grid|the Preview grid]], and go to one of the aforementioned regions. Open up the '''Advanced''' menu, and you should see '''Puppetry''' listed there. Open that sub-menu (you may want to tear off that menu - click on the sub-menu top bar and drag it to a spot on your screen)<br />
<br />
[[File:howitworks.png|center]]<br />
<br />
<br />
Select '''Launch plug-in...''' and navigate to the puppetry modules in the {{abbr|LEAP|LLSD Event API Plug-in}} repository you downloaded to your local filesystem earlier. In your copy of the LEAP repository find <code>[https://bitbucket.org/lindenlab/leap/src/main/puppetry/examples/ leap/puppetry/examples/]</code> directory and select <code>[https://bitbucket.org/lindenlab/leap/src/main/puppetry/examples/arm_wave.py arm_wave.py]</code>. Your avatar should raise up their left arm, and move it slowly back and forth.<br />
<br />
The <code>[https://bitbucket.org/lindenlab/leap/src/main/puppetry/examples/arm_wave.py arm_wave.py]</code> movement might not look exciting, and the wrist might be bent strangely, but it is new at a very fundamental level. That Python program you selected is running on your local machine and is moving your avatar from outside the Second Life application.<br />
<br />
The plug-in supplies data as a series of Puppetry events. Each event is a target position and/or orientation for a named joint. The Viewer uses {{Wikipedia|Inverse Kinematics}} (IK) to compute the transforms of the connecting bones that would allow the named joint to reach its goal (or get as close as possible) and blends that data onto the Avatar like an animation. The Puppetry events are streamed to the Second Life server which relays them to other nearby Viewers who apply the same logic to animate the Avatars in view. Anyone standing nearby will be able to see your Puppetry animation, but only if they are also running a Puppetry Viewer.<br />
<br />
The "Send" and "Receive" menu checkboxes control whether your Viewer sends and receives Puppetry data: each direction of the data stream can be enabled/disabled independently.<br />
<br />
Some of the selections on the Puppetry menu are placeholders and don't do much now. The "Face " and "Fingers " checks, for example, are intended to enable or disable Puppetry animations for those body parts, but aren't functional yet.<br />
<br />
The <code>[https://bitbucket.org/lindenlab/leap/src/main/puppetry/webcam/webcam_puppetry.py leap/puppetry/webcam/webcam_puppetry.py]</code> script is another plugin which uses several python modules to capture video from your webcam and try to compute Puppetry events to provide real-time Puppetry data. You may need to select different camera numbers from the menu to get this feature to start. This is a complex module, and the performance isn't as accurate or as smooth as we would like it to be. It's a great hint, however, of the potential of this new feature.<br />
<br />
<br />
<h2>Known Issues - The Broken Bits</h2><br />
<br />
This feature is experimental and sometimes experiments go wrong and fail and crash and burn<br />
<br />
. <br />
<br />
* Your avatar may not look best as it's manipulated by a plug-in, or positioned with Inverse Kinematics.<br />
* The project viewer occasionally crashes when using Puppetry<br />
* Correct hand tracking by <code>[https://bitbucket.org/lindenlab/leap/src/main/puppetry/webcam/webcam_puppetry.py webcam_puppetry.py]</code> is still a work in progress<br />
* Lip, facial, and finger Puppetry requires a bento avatar<br />
* IK does not work well on fingers<br />
<br />
<br />
<br />
<h2>LEAP Puppetry API</h2><br />
<br />
This describes how a Puppetry plug-in connects and exchanges information with the Second Life viewer. The LEAP (LLSD Event API Plug-in) layer provides event-driven communication between the Second Life Viewer and another application (the plug-in) on the same host.<br />
<br />
Puppetry LEAP commands are defined in two locations which this document shall refer to as inbound and outbound communication relative to the viewer.<br />
<br />
<br><br />
Inbound commands are sent by the plug-in to the viewer and may be found in the viewer source code in the {{code|LLPuppetModule}} constructor. There are only two: '''set''' and '''get'''.<br />
<br />
Outbound commands are sent by the viewer to the plug-in. They are defined in <code>[https://bitbucket.org/lindenlab/leap/src/main/puppetry/__init__.py puppetry.py]</code> with the @registerCommand decorator. As of this writing, they are: '''stop''', '''set_camera''', '''enable_parts''', and '''set_skeleton'''<br />
<br />
Please note that plug-ins which issue blocking commands (taking too much time) will drop LEAP commands. In the examples, <code>[https://bitbucket.org/lindenlab/leap/src/main/puppetry/webcam/webcam_puppetry.py webcam_puppetry.py]</code> contains code working around this issue while waiting for the startup of the pose recognition software.<br />
<br />
<h2>Inbound Commands (plug-in to viewer)</h2><br />
<br />
{| class="wikitable" style="margin:auto"<br />
|-<br />
! Command !! Description <br />
|-<br />
| '''set''' || Update Puppetry configuration with new values. (e.g. '''{'command':'set','data':{'inverse_kinematics':{'mWristLeft':{'position':[x,y,z]}}}}''')<br />
|-<br />
| '''get''' || Query Puppetry for info: (e.g. '''{'command':'get','data':["camera", "skeleton"]}''') <br />
|}<br />
<br />
There are two modes for setting joint transforms '''inverse_kinematics''' (avatar-frame) and '''joint_state''' (parent-frame). They can be used simultaneously, even on the same joint, because they represent different things.<br />
<br />
{| class="wikitable" style="margin:auto"<br />
|-<br />
! Mode !! Terse name !! Description <br />
|-<br />
| '''inverse_kinematics''' || '''i''' || Use to set '''position''' and '''rotation''' of a Joint's IK target transform in the avatar-frame<br />
|-<br />
| '''joint_state''' || '''j''' || Specify '''position''', '''rotation''', and '''scale''' of Joint in its parent-frame <br />
|}<br />
<br />
In either mode you can specify the '''position''' or '''rotation''' of the joint. In the parent-frame ('''joint_state''') mode you can also adjust the '''scale'''.<br />
<br />
{| class="wikitable" style="margin:auto"<br />
|-<br />
! Param !! Terse name !! Format !! Description<br />
|-<br />
| '''position''' || '''p''' || '''[x, y, z]''' || Array of three floats representing Cartesian position<br />
|-<br />
| '''rotation''' || '''r''' || '''[x, y, z]''' || Array of three floats representing the imaginary ('''xyz''') components of a unitary Quaternion whose real component ('''w''') is positive<br />
|-<br />
| '''scale''' || '''s''' || '''[x, y, z]''' || Array of three floats representing Cartesian scale to be applied to Joint's '''position''' in its parent-frame, and also to Joint bone length<br />
|}<br />
<h2>Outbound Commands (viewer to plug-in)</h2><br />
<br />
<br />
{| class="wikitable" style="margin:auto"<br />
|-<br />
! Command !! Description <br />
|-<br />
| '''enable_parts''' || Passed an integer representing a mask of which parts of the skeleton are to be controlled by the script. This matches the Puppetry menu selections.<br />
|-<br />
| Head || 0x01 <br />
|-<br />
| Face || 0x02 <br />
|-<br />
| Left Hand || 0x04 <br />
|-<br />
| Right Hand || 0x08 <br />
|-<br />
| Fingers || 0x10 <br />
|-<br />
| '''set_camera''' || Contains the tag camera_id which is an integer which identifies which camera to use. This matches the Puppetry menu selection. <br />
|-<br />
| '''set_skeleton''' || Contains the list of joints in the current skeleton with the joint ID and parent ID, the normalized parent-relative position of this joint and the normalized position of its trailing end. The trailing end position is typically but not always the parent-relative position of the immediate child.Note: mPelvis is the root of the avatar and thus does not have a parent-relative position or parent_id Example mJoint:Joint_id: int Parent_id: int Tip_relative_position: 3 floats X,Y,Z (in arm-length normalized space relative the pelvis)Parent_relative_position: 3 floats X,Y,Z (in arm-length normalized space relative the pelvis) <br />
|-<br />
| '''stop''' || No params, ends plug-in puppetry control of avatar. <br />
|}<br />
<br />
<br />
<h2>Show Bones</h2><br />
<br />
The Develop Menu's Avatar options includes "Show Bones", which draws lines showing the position and length of the skeleton parts. Any bones that are moved with Puppetry data will be drawn with dark blue. By turning on this option, you can observe how the bones are actually moving. This helps demonstrate how your avatar's rigging works to alter the actual appearance.<br />
<br />
[[File:ShowPuppetryBones.png|600px|center]]</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Internal_Animation_Format&diff=1213009Internal Animation Format2023-01-26T22:33:22Z<p>Tapple Gao: added tanimbomb link</p>
<hr />
<div>{{KBtip|You may find the contents of [[Anim File Format]] page helpful in addition to this page.}}<br />
== Tools ==<br />
If you're coming here to find out about how to take advantage of Second Life's internal animation format (.anim), you may find the below tools of use.<br />
<br />
{| class="wikitable" style="margin:auto; width: 85%; text-align: center;"<br />
|+ .anim file format utilities<br />
|-<br />
! scope="col" style="background-color:#A7C1F2" | Name<br />
! scope="col" style="background-color:#A7C1F2" | Notes<br />
|-<br />
| [https://gitlab.com/Quillia/anim-converter '''Anim-converter''']<br />
| Converts .bvh files into Second Life .anim files.<br />
|-<br />
| [https://github.com/Gina43/anim-2-bvh '''Anim2BVH''']<br />
| Inverse of the above, converts .anim files into .bvh files.<br />
|-<br />
| [https://community.secondlife.com/forums/topic/468179-anim-hacker/ '''Anim Hacker''']<br />
| Tool for manipulating .anim files. Can be used to edit joint priorities, add constraints, and more!<br />
|-<br />
| [https://github.com/tapple/tanimbomb '''tanimbomb''']<br />
| Python CLI tool for making simple bulk-edits to multiple anim files at once, especially joint removal and animation mirroring<br />
|-<br />
| [https://github.com/LGGGreg/par/releases/tag/v1 '''AnimMaker''']<br />
| Older tool, equivalent to AnimHacker. ([http://web.archive.org/web/20100526180459/http://code.google.com/p/par/source/browse#svn/branches/AnimMaker Source Code available in archive])<br />
|}<br />
<br />
==Overview==<br />
<br />
From a programming perspective, there are several steps to uploading an [[Animation|animation]] from a BVH (BioVision Hierarchy) file:<br />
<br />
# Read and parse the BVH file, creating an LLKeyframeMotion object containing the motion data.<br />
# Gather input from the user (via the upload preview floater) for things like animation priority, facial expression, and looping; these settings are stored in the LLKeyframeMotion object.<br />
# Serialize the LLKeyframeMotion object as [[LLSD]].<br />
# Upload the serialized data to the asset server.<br />
<br />
Before other viewers can play an animation, they must:<br />
<br />
# Download the serialized data from the asset server.<br />
# Deserialize it to an LLKeyframeMotion object.<br />
<br />
Relevant source files:<br />
* [https://bitbucket.org/lindenlab/viewer/src/master/indra/llcharacter/llbvhloader.cpp llbvhloader.cpp]<br />
* [https://bitbucket.org/lindenlab/viewer/src/04c473ab46041133ea6a87dbe0d43e662472adf5/indra/llcharacter/llkeyframemotion.cpp#lines-1231 llkeyframemotion.cpp:deserialize()]<br />
<br />
Note: the binary file is little endian.<br />
<br />
{{KBwarning|1=The asset uploader enforces a {{HoverText|250,000 byte|250 KB (decimal), 244 KB (binary)}} limit on .anim files. Files larger than this will fail to upload, and will return an error. <br> {{HoverText|Simplify your animation|Remove triplicate keyframes, remove unused joints, remove keyframes for small movements, etc.}}, then retry uploading.<br>'''Blender Users:''' You can use a built-in function called "''Decimate''" to simplify your animation. See [https://www.youtube.com/watch?v=lScwEYJZy1M this tutorial].}}<br />
<br />
==Header==<br />
<br />
The first part of the animation data is a header describing various details about the animation as a whole. The elements, in order, are:<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=version|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=sub_version|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=base_priority|llsd=integer|cpp=S32|note=Is informational only, and does not affect the animation. The animation system always follows individual joint priority; Except for animations making use of constraints, in which case the constraint will be applied at priority defined by this value.}}<br />
{{LLSD Field Entry|name=duration|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=emote_name|llsd=string|cpp=char *|note=NULL-terminated character sequence}}<br />
{{LLSD Field Entry|name=loop_in_point|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=loop_out_point|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=loop|llsd=integer|cpp=S32|note=0: not looped, 1: looped}}<br />
{{LLSD Field Entry|name=ease_in_duration|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_out_duration|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=hand_pose|llsd=integer|cpp=U32|note=Enum defined in [https://bitbucket.org/lindenlab/viewer-release/src/536fef12ab37/indra/llcharacter/llhandmotion.h?at=default#llhandmotion.h-45]}}<br />
{{LLSD Field Entry|name=num_joints|llsd=integer|cpp=U32}}<br />
|}<br />
<br />
==Joint Data==<br />
<br />
After the header is data for each joint in the skeleton:<br />
Note: Unused bones need not be included in the file.<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=joint_name|llsd=string|cpp=char *|note=NULL-terminated character sequence}}<br />
{{LLSD Field Entry|name=joint_priority|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
===Joint Rotation Keys===<br />
<br />
At the start of the rotation data for each bone is the total number of rotation keys:<br />
If the bone has no rotation based keyframes, this value must be 0.<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=num_rot_keys|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
Then, for each rotation key:<br />
<br />
Note: These three values X Y Z appear to be the first three values of a truncated quaternion with the W term being calculated afterwards. <br />
Since a quaternion is X<sup>2</sup> + Y<sup>2</sup> + Z<sup>2</sup> + W<sup>2</sup> = 1 as long as you assume the W term has a consistent sign the X Y Z terms will be accurate.<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=time|llsd=integer|cpp=U16|note=0: first frame, 65535: last frame}}<br />
{{LLSD Field Entry|name=rot_x|llsd=integer|cpp=U16|note= 0:-1, 32767:0, 65535:+1 }}<br />
{{LLSD Field Entry|name=rot_y|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=rot_z|llsd=integer|cpp=U16}}<br />
|}<br />
<br />
===Joint Position Keys===<br />
<br />
At the start of the position data is the total number of position keys:<br />
If the bone has no position based animations, this value must be 0.<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=num_pos_keys|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
<br />
Then, for each position key, position data is measured from Avatar Center ( mPelvis ), not joint resting position<br />
( IE [0,0,0] is not joint resting position, it'll be the bone's position in parent coordinate space)<br />
with the exception of the mPelvis bone which is stored in world space coordinates.:<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=time|llsd=integer|cpp=U16|note=0: first frame, 65535: last frame}}<br />
{{LLSD Field Entry|name=pos_x|llsd=integer|cpp=U16|desc=position measured from avatar root, not joint offset|note=0:-5m, 32767:0m, 65535:+5m (m for metres)}}<br />
{{LLSD Field Entry|name=pos_y|llsd=integer|cpp=U16}}<br />
{{LLSD Field Entry|name=pos_z|llsd=integer|cpp=U16}}<br />
|}<br />
<br />
==Constraints==<br />
<br />
After the joint data are a number of entries for joint constraints. Constraints can target an avatar's parts in relation to each other or the ground (IK).<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=num_constraints|llsd=integer|cpp=S32}}<br />
|}<br />
<br />
Then, for each joint constraint:<br />
<br />
{|{{LLSD Field Table}}<br />
{{LLSD Field Entry|name=chain_length|llsd=integer|cpp=U8|note=number of attached joints to include}}<br />
{{LLSD Field Entry|name=constraint_type|llsd=integer|cpp=U8|note=0: point'''*''', 1: plane}}<br />
{{LLSD Field Entry|name=source_volume|llsd=string |cpp=char[16]|desc=skeleton collision volume name|note=Always 16 bytes, but if shorter, it's interpreted as NULL-terminated and the remaining bytes ignored.}}<br />
{{LLSD Field Entry|name=source_offset|llsd=string (?)|cpp=LLVector3}}<br />
{{LLSD Field Entry|name=target_volume|llsd=string|cpp=char[16]|desc=skeleton collision volume name|note=Always 16 bytes, but if shorter, it's interpreted as NULL-terminated and the remaining bytes ignored.}}<br />
{{LLSD Field Entry|name=target_offset|llsd=string (?)|cpp=LLVector3}}<br />
{{LLSD Field Entry|name=target_dir|llsd=string (?)|cpp=LLVector3|note=value is currently ignored}}<br />
{{LLSD Field Entry|name=ease_in_start|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_in_stop|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_out_start|llsd=real|cpp=F32}}<br />
{{LLSD Field Entry|name=ease_out_stop|llsd=real|cpp=F32}}<br />
|}<br />
'''*''' The implementation of constraint type '''Point''' is incomplete, and is considered non-functional. Until further notice, all constraints should use the '''Plane''' type.<br />
:The above does not seem to be true, both types would seem to be working. ([[User:Jenna Huntsman |Jenna Huntsman]] tested {{#time: d F Y|8/12/2022}} )<br />
=== [[User:Jenna Huntsman |Jenna's]] notes on constraints ===<br />
* ''chain_length'' is '''not''' inclusive of the source bone itself, so for example, if the source bone is R_HAND, setting a ''chain_length'' of 2 will use R_LOWER_ARM (elbow joint) and R_UPPER_ARM (shoulder joint).<br />
** Setting a ''chain_length'' of more than 4 will prevent the animation from playing - the animation will upload, but will not play.<br />
** Setting a ''chain_length'' of 4 (both constraint types) will cause the viewer to crash.<br />
* ''target_offset'' uses an axis layout of X+ forward, Y+ left, Z+ up.<br />
** Constraints only seem to work reliably if ''target_offset'' has a value of 1 on the Z axis. The values on the X and Y axis can be anything however.<br />
* ''source_offset'' uses an axis layout of X+ forward, Y+ left, Z+ up.<br />
** <s>The distance units expected are of an unknown unit, however it does not seem to be meters or inches. (Also true of ''target_offset'')</s><br />
** '''llkeyframemotion.cpp''' would seem to suggest that constraints are inherited from a BVH upon conversion to .anim, which would make the units be inches (as is standard for BVH animations in SL); <s>however in-world testing casts doubt upon this.</s><br />
* ''target_dir'' is unused, however is likely a unit vector relative to the armature root.<br />
** As such, bone rotations can be manipulated by rot keys as normal, however the rotation will not be relative to the target volume.<br />
** It seems that while ''target_dir'' is present in the file format for constraints, it was never implemented (As per '''llkeyframemotion.cpp''').<br />
* While ''GROUND'' is a recognized and implemented target volume, server-side checks prevent uploads of animations making use of this constraint target.<br />
* There seems to be a hard limit of 10 constraints per animation (as per '''llkeyframemotion.cpp''').<br />
* Constraints always follow the shortest path from their source to their destination, irrespective of 'legal' joint rotations. (Meaning to say, constraints can cause bones to move in an odd way (e.g. an arm clipping inside your body) if that is the shortest path.)<br />
* Unlike regular animations, Constraints seem to require an intact armature from the skeleton root (mPelvis) to the source and target bones; Otherwise the animation will not play.<br />
** The bones do not need to be animated, they only need to be present in the .anim file.<br />
* Constraints '''do''' respect animation priority (The ''global'' animation priority, as defined by ''base_priority'', '''not''' the ''per joint'' priority), meaning it's possible to stack constraints, but not within the same animation.</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Limits&diff=1212497Limits2022-10-01T14:22:35Z<p>Tapple Gao: added 3.5m attachment distance limit</p>
<hr />
<div><noinclude>{{KBmaster}}</noinclude><br />
== Summary ==<br />
{{RightToc}}<br />
The Second Life Viewer and simulators have a division of labor, keeping track of the data that makes Second Life run. The Viewer's job is to:<br />
<br />
* Handle locations of objects.<br />
* Get velocities and other physics information, and does simple physics to keep track of what is moving where.<br />
<br />
The simulator's job is to:<br />
<br />
* Run the physics engine.<br />
* Detect collisions.<br />
* Keep track of where everything is<br />
* Send locations of content to the Viewer along with updates when certain changes occur.<br />
<br />
Limits are necessary for all of these components to work together. The list below outlines many of the '''Second Life numerical limits that affect your inworld experience'''. Some of these will likely change over time, so if you spot something incorrect/outdated, please take a moment to update it.<br />
<br />
{{KBcaution|1=The scope of this page is focused on Linden Lab's official Viewers, keeping in mind [[Third_Party_Viewer_Directory|3rd-party viewers may differ]]. Cite sources and provide substantiation for limits that aren't provided by Linden Lab. Also, unconfirmed speculation [[Talk:Limits|goes on this discussion page]]. Don't add data without a hard limit, and don't add obscure trivia that doesn't practically affect the general inworld experience.|width=80%}}<br />
<br />
== [[Avatar]] ==<br />
<br />
* '''Max. # of attachments''' - 38 combined [[HUD]] or body attachments.<br />
** They can be viewed by right-clicking your avatar and choosing '''Edit My Outfit'''.<br />
** With the formal introduction of [[multiple attachments|multiple attachments to a single point]] in Viewer 2.4, you can attach up to 38 total objects, and they can all be attached to a single point. <br />
** With the introduction of the Bento armature, there are 47 attachment points available.<br />
** With the introduction of Animesh, there is a limit of 1 Animesh attachment, 2 if the resident has premium.<br />
* '''Max. attachment position''' - 3.5m in a sphere around <0, 0, 0>.<br />
* '''Max. # of clothing layers''' - 60 including alpha, tattoo, shoe base, physics, socks, gloves, undershirt, underpants, shirt, pants, jacket, skirt<br />
** On viewers before Second Life Release 3.7.29.301305, the potential total was still 60, but limited to 5 items of each type.<br />
** In any case, only one each of shape, skin, eyes and hair base may be worn. These 4 basic body parts are in addition to the 60 clothing layers.<br />
* '''Max Clothing Texture''' - 1024x1024 px (except 128x128 px for eyes) - Server Side Appearance (and legacy baking on outside grids) will downsize larger textures.<br />
* '''Max. unassisted fly height''' - Stable hover at current ground elevation ''plus'' 5020m.<br />
** You can easily acquire a flight attachment to fly high. Also see [[flight limit]] and [[Limits#Navigation|the Navigation section]] below.<br />
* '''Common shoe sizes''' - Traditionally, most women's shoes were designed for a size 0 (zero) foot. Men's generally scale up to 14. Newer items (mesh and some sculpted) replace the system feet or conform to the avatar's shape, so adjustments may be necessary.<br />
** You can check this by going to Edit menu > Appearance and clicking on the Shape > Legs tab.<br />
<!--Can someone verify the following?<br />
* '''Min. length of avatar name''' - 2 for the first name, 2 for the last name, 5 in total (including the space).--><br />
* '''Max. length of avatar name''' - 31 for first name, 31 for last name, 63 in total (including the space).<br />
<br />
* '''Max. length of {{LSLGC|Username}}''' - All lower case and a maximum of 63 including the '.'(eg; firstname.lastname)<br />
**Older account user names are a combination of the First and last name in lower case separated by a period(.)(eg; lilmix.pixelmaid)<br />
**Modern user names are a single name(no period)(eg; john1234) - '''Max.''' length is 31 characters<br />
**The {{LSLGC|Legacy Name}}s for modern user names always shows Resident as the last name. So the Max is 40 characters in total for a new avatar's legacy name(including the space and last name 'Resident')<br />
*'''Min. length of [[Display_Names]]''' - At least one script character<br />
*'''Max. length of Display Names''' - 31 characters<br />
**Display Names can include most Unicode script characters, spaces, and some punctuation.<br />
<br />
* '''Max. avatar speed''' - 250m/s (with only attachments to assist)<br />
* '''Max. teleport speed''' - 6 teleports per minute<br />
<br />
== [[Animation]] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Length of animation<br />
| n/a<br />
| {{no|60.0 seconds}}<br />
| Limited by length or Size, whichever is reached first<br />
| n/a<br />
|-<br />
||Size of Animation<br />
| n/a<br />
| {{no|{{HoverText|250,000 bytes|250 KB (decimal), 244 KB (binary)}}}}<br />
| Limited by length or Size, whichever is reached first. Size is after conversion to [[Internal Animation Format|.anim]]. {{KBtip|custom=Tip for Blender users:|1=You can use a built-in function called "''Decimate''" to simplify your animation. See [https://www.youtube.com/watch?v=lScwEYJZy1M this tutorial]}}<br />
| [[Internal Animation Format]]<br />
|-<br />
||Distance an Animation Can Travel<br />
| {{no|-5 meters (per axis)}}<br />
| {{no|+5 meters (per axis)}}<br />
| 10 meters per axis cumulatively (travelling from -5 to +5).<br />
| n/a<br />
<br />
|-<br />
||animation priority<br />
| {{no|0}}<br />
| {{no|.bvh: 4, [[Internal Animation Format|.anim]]: 6}}<br />
| [[Internal Animation Format|.anim]] uses per-joint priorities, meaning it's possible to have a mix of joint priorities in the same animation.<br />
| [[Animation_Priority|Animation Priority]]<br />
|-<br />
||Number of unique joints per animation<br />
| n/a<br />
| {{no|216}}<br />
| [[Internal Animation Format|.anim]], unlike .bvh, uses a flat structure, meaning that only the bones animated are stored, and bones which would otherwise be kept by .bvh (to keep hierarchy structure) are deleted.<br />
| n/a<br />
|-<br />
||Number of simultaneous animations playing<br />
| n/a<br />
| {{no|30}}<br />
| n/a<br />
| n/a<br />
|}<br />
<br />
== [http://community.secondlife.com/t5/English-Knowledge-Base/Build-Tools/ta-p/700039 Building] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||[[Prim]] dimensions<br />
| {{no|<0.01,&nbsp;0.01,&nbsp;0.01>}}<br />
| {{no|<64.0, 64.0, 64.0>}}<br />
| Used to be <10.0, 10.0, 10.0> prior to Second Life Server version 11.08.17.238770<br />
| [[llSetScale]], [[PRIM_SIZE]] and [[Megaprim]]<br />
|-<br />
||Number of prims in a linkset<br />
| n/a<br />
| {{no|256 prims}}<br />
| Used to be 255 prior to Second Life Server version 1.26<br />
| n/a<br />
|-<br />
||Linking distance<br />
| n/a<br />
| {{no|[[Linkability_Rules|Linkability Rules]]}}<br />
| n/a<br />
| n/a<br />
|-<br />
||[[Mesh/Mesh_physics#Physics_Resource_Cost|Physics cost]] for a physical object<br />
| n/a<br />
| {{no|32.0}}<br />
||Additional notes:<br />
* If you try to link more, it'll either say "Can't enable physics for objects with more than 32 primitives" or "Object has too many primitives -- its dynamics have been disabled.".<br />
* On server versions 1.38 and below, each sitting avatar counted as 1 prim. From 1.40.2 the limit is only on actual prims.<br />
| [[OBJECT_PHYSICS_COST]]<br />
|-<br />
||Build or rez height<br />
| n/a<br />
| {{no|4096.0 meters}}<br />
| 768.0 meters for Viewers prior to version 1.20<br />
| n/a<br />
|-<br />
||Prim name length<br />
| n/a<br />
| {{no|63 bytes UTF-8 [[String|string]]}}<br />
| same limit for {{LSLGC|Avatar/Name|avatar names}}, although the character set for avatar names is significantly limited.<br />
| n/a<br />
|-<br />
||Prim description length<br />
| n/a<br />
| {{no|127 bytes UTF-8 [[String|string]]}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Temporary prims' lifetime<br />
| n/a<br />
| {{no|up to around 60 seconds}}<br />
| depends upon when the next garbage collector cycle is<br />
| n/a<br />
|-<br />
||Number of temporary prims<br />
| n/a<br />
| {{no|RegionPrimLimit - NumberOfPrimsInRegion + Minimum(0.5*RegionPrimLimit, 1000)}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Length of hovertext<br />
| n/a<br />
| {{no|254 bytes UTF-8 [[String|string]]}}<br />
| n/a<br />
| [[llSetText]] and [[PRIM_TEXT]]<br />
|}<br />
<br />
== [https://community.secondlife.com/knowledgebase/english/lighting-and-shadows-r331/ Lighting] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Number of projectors rendered at full detail<br />
| n/a<br />
| {{no|2}}<br />
| Only the 2 projectors closest to an object will cause it to cast shadows. <br />
| [https://community.secondlife.com/knowledgebase/english/lighting-and-shadows-r331/#Projectors Knowledge Base > Lighting > Projectors]<br />
|-<br />
||Number of lights rendered on Alpha Blended surfaces<br />
| n/a<br />
| {{no|8}}<br />
| 8 including the Sun and Moon. The viewer will attempt to select the "most significant" lights to render, however these blended surfaces will look different as a result of these lighting limitations.<br />
| [[Alpha Modes Do's and Don'ts#Alpha_blending|Alpha Blending]]<br />
<br />
<br />
|}<br />
<br />
== [[Communication]] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Whisper distance<br />
| n/a<br />
| {{no|10 meters}}<br />
| <code>/whisper</code> as the first few characters in a message can be used in viewer-2-code based viewers in local chat.<br />
| n/a<br />
|-<br />
||Chat distance<br />
| n/a<br />
| {{no|20 meters}}<br />
| text spoken as a "chat" step '''within gestures''' cannot be shouted or whispered. /whisper and /shout ''can'' be used in the "Replace with" field.<br />
| n/a<br />
|-<br />
||Shout distance<br />
| n/a<br />
| {{no|100 meters}}<br />
| <code>/shout</code> as the first few characters in a message can be used in viewer-2-code based viewers in local chat.<br />
| n/a<br />
|-<br />
||Length of a chat message and whether or not it is truncated<br />
| {{no|1 byte or single-byte character}}<br />
| {{no|1024 bytes or single-byte characters}}<br />
| Limit does not apply to instant messages via [[llInstantMessage]] and communication between IM and email, the limit there is 1023 bytes or single-byte characters.<br />
The viewer-to-server communication on ''negative'' channels is truncated to 254 bytes, and on ''positive'' channels, to 1023 bytes. These limits do not affect communication between scripts.<br />
| [[llInstantMessage]]<br />
|-<br />
||Maximum events<br />
| n/a<br />
| {{no|64 events}}<br />
| Events are stored in a 64 bit bitmap. Events happening when the bitmap is full, will get discarded.<br />
| n/a<br />
|-<br />
||Number of offline messages<br />
| n/a<br />
| {{no|Capped at 15 messages, unless the account has a Premium Subscription, in which case the cap raises to 80 or 160 messages, depending on the user's subscription level.}}<br />
| Number of offline messages (involving [[IM|IMs]], inventory offers, group notices, group invitations) received before messages get capped. Note: If autoAcceptNewInventory (debug setting) is set to TRUE (the default is FALSE), then all inventory offers, even above 15 (or 80 in the case of Premium members), go directly to inventory and do not count against the cap on offline messages. <br />
| [[IM]] - [https://community.secondlife.com/blogs/entry/2559-group-limits-update-no-changes-for-basic-members/ Blog Post]<br />
|-<br />
||Length of a properly delivered email reply to an [[IM]]<br />
| n/a<br />
| {{no|1023 bytes or single-byte characters}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Time after which a reply to an [[IM]] can be sent via email.<br />
| {{no|when receiving the IM via email.}}<br />
| {{no|5 days after receiving the offline IM via email.}}<br />
| n/a<br />
| [https://blogs.secondlife.com/community/features/blog/2007/02/06/im-to-e-mail-return-addresses-changing Second Life Blogs]<br />
|-<br />
||Time period for which [[IM|IMs]] are stored within Second Life.<br />
| n/a<br />
| {{no|31 days after receiving the [[IM]]}}<br />
| [[User:Torley_Linden|Torley Linden]] confirmed this with [[User:Kelly_Linden|Kelly Linden]]<br />
| n/a<br />
|-<br />
||Number of [[IM|IMs]] sent by an object within an hour<br />
| n/a<br />
| {{no|5000 per hour}}<br />
| n/a<br />
| n/a<br />
|}<br />
<br />
== [[Gesture]]s ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Shortcut key mappings<br />
| n/a<br />
| {{no|33 unique combinations, since {{K|F2}}&ndash;{{K|F12}} can be used with the {{K|Ctrl}} or {{K|Shift}} modifiers.}}<br />
| n/a<br />
| [[All_keyboard_shortcut_keys]] and [http://community.secondlife.com/t5/English-Knowledge-Base/Keyboard-shortcuts/ta-p/1086557 the knowledge base]<br />
|-<br />
||Chat step length<br />
| n/a<br />
| {{no|127 bytes or single-byte characters}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Wait time<br />
| n/a<br />
| {{no|3600 seconds (which is one hour)}}<br />
| n/a<br />
| n/a<br />
|-<br />
| Maximum steps data<br />
| n/a<br />
| {{no|1000 bytes}} of packed data; saving with more data returns the message "Gesture save failed. This gesture has too many steps. Try removing some steps, then save again." Shorter text, for example, will allow more steps.<br />
| n/a<br />
| n/a<br />
|-<br />
||Length of included assets<br />
| n/a<br />
| see sections for [[#Animation|animation]], [[#Sound|sound]]<br />
| n/a<br />
| n/a<br />
|}<br />
<br />
== [[Group]]s ==<br />
<br />
* '''Maximum number of groups you can belong to:''' 42 for Basic accounts, 70 for Premium accounts, 140 for Premium Plus accounts.<br />
** After downgrading from a Premium account to a Basic account, you may not join any new groups until you are a member of fewer than 42 groups.<br />
** Roles within groups are sort of like sub-groups. In many cases, you can use them instead of creating new groups.<br />
* '''Minimum number of members in a group:''' 2<br />
** A group with only 1 person for 48 hours will be disbanded (cancelled). Unless the group owns land.<br />
* '''Maximum number of roles allowed in a group:''' 10 (including "Owners" and "Everyone", which cannot be deleted)<br />
* '''Maximum Group Name:''' 35 single-byte characters.<br />
* '''Maximum Group Title:''' 20 single-byte characters.<br />
* '''Maximum Length of a Group Notice:''' 512 single-byte characters.<br />
* '''Maximum Age of a Group Notice:''' 14 days.<br />
<br />
== [[Inventory]] ==<br />
<br />
* '''Maximum number of inventory items that can be sent in a folder:''' 42<br />
** Folders count as items too. This has more to do with packet size limits than cheeky Douglas Adams references.<br />
* '''Maximum number of inventory items that can be contained in a prim:''' 10,000<br />
* '''Maximum characters in an inventory item name:''' 63<br />
* '''Maximum notecard line:''' None, but scripts can only read the first 1024 bytes (was 255 bytes before server version [https://releasenotes.secondlife.com/simulator/2021-10-25.565008.html 2021-10-25.565008]).<br />
* '''Maximum notecard size:''' 65,536 bytes<br />
<!--<br />
* '''Number of items in the Library:''' 1,248 as of 2010-06-17<br />
* '''Number of items in the Library:''' 2,210 as of 2012-11-04 --><br />
* '''Number of items in the Library:''' 3,500 as of 2019-08-10<br />
** Verified by [[How_does_the_Library_work|hiding the Library]] and counting the difference.<br />
* '''Maximum number of inventory items displayed in a single inventory folder:''' Several thousand. <!-- not a specific item count, because the data is variable size, but still useful to document that there is a limit. --><br />
** This was discussed during [http://wiki.secondlife.com/wiki/Simulator_User_Group/Transcripts/2011.03.08] "the folder will load up to the limit number of items, and remaining ones won't show up in the viewer. you still own them, they aren't lost, but they will be hidden until the folder size is reduced."<br />
** There is no specified limit for total avatar inventory, very large folders can be split.<br />
** There was discussion in the Third Party Developers' UG (4/10/2015) meeting about new inventory and login problems from having large numbers of items in a single folder. AISv3 ''removed'' server-side limits on the number of items in a folder. Flat inventories are bad. No one is certain at what number of items in a folder cause a login problem. The fix is to clear the inventory cache (not the viewer cache) and log into a deserted, empty region then move inventory items into folders and sub-folders. - The problem appears at different a number of items depending on your computer and connection speed. Hopefully being on an empty region will give one enough edge to get logged in and do some corrective work before being dropped. If not, you will need to contact support for help. They will divide large folders into smaller groups so you can log in.<br />
<br />
== [[Land]] ==<br />
<br />
* '''Maximum [[Land#Parcel|parcel]] size:''' 65,536 meters²<br />
** Covering a whole region, or square on the World Map.<br />
* '''Minimum parcel size:''' 16 meters²<br />
* '''Maximum parcel name length:''' 63 single-byte characters<br />
* '''Maximum parcel description length:''' 255 characters<br />
* '''Region name length:''' Linden Concierge policy states a minimum of 3 characters, and a maximum of 25 characters (including spaces). See [[Linden Lab Official:Guidelines for Private Region Naming|Guidelines for Private Region Naming]]. However, the technical maximum limit is 35 characters, and exceptions to the concierge policy do exist (e.g [http://maps.secondlife.com/secondlife/Sandbox%20-%20Weapons%20testing%20%28no%20damag/128/128/2 Sandbox - Weapons testing (no damag] and [http://slurl.com/secondlife/X/128/128/24 X])<br />
* '''Ban line height for "no entry" or "pay to access"''' (in other words, "allow public access" is turned off, or "allow group access" is turned on, in the parcel options) is the parcel's ground elevation ''plus'' 50 meters (except, if the region has been set to "Block Parcel Fly Over" in which case the access controls extend to at least 4096 meters). If a user is '''explicitly banned by name''', the height is the parcel's ground elevation ''plus'' 5000 meters. On current viewers this is visible to the full extent.<br />
* '''Maximum prims in a [[Land#Region|region]]:'''<br />
** "Mainland / Full Region" and "Linden Homes / Full Region": 22,500<br />
** Full Regions in private estates: 20,000 with an [https://community.secondlife.com/t5/Featured-News/Upgrade-Your-Full-Private-Region-to-30-000-Land-Impact-Today/ba-p/3086162 option for 30,000]<br />
** Homestead: 5,000<br />
** Openspace : 1,000<br />
:: To check a region's capacity, use <tt>[[llGetEnv]]("region_max_prims")</tt>.<br />
::''(Region types are as found in the General tab of World > About Land, or returned by ''<tt>llGetEnv("region_product_name")</tt>'')''<br />
* '''Maximum auto return value''': Besides "0" (which means ''never''), {{HoverText|999,999|Almost 23 months}} minutes is the highest auto return value.<br />
* '''Terraforming limits:'''<br />
** Most mainland can be raised/lowered by 4 meters (+/-).<br />
** Some mainland cannot be terraformed, including: Bay City regions, Boardman, Brown, De Haro, Horizons, Kama City regions, Nautilus City regions, Nova Albion regions, and Shermerville regions.<br />
** [http://community.secondlife.com/t5/English-Knowledge-Base/Linden-Homes/ta-p/700103 Linden Homes] do not allow terraforming.<br />
** A few, very old mainland Regions like Da Boom have a terraform range of 40 meters (+/-).<br />
** Estate (private island) terraformability is settable to a maximum of 100 meters (+/-) by the estate owner or managers.<br />
* '''Maximum water height:''' 100 meters using inworld controls, 255 meters by using a *.raw file upload.<br />
** Region water height is usually 20 meters, and adjacent regions should have the same water height, or else they will look discontinuous.<br />
* '''Maximum terrain height:''' 255 meters using inworld controls (mainland limit), 510 meters by using a *.raw file upload.<br />
* '''Miscellaneous estate limits:''' You can have a maximum of 15 estate managers, 500 allowed Residents, 63 allowed groups, and 500 banned Residents.<br />
** See World menu > Region/Estate > Estate tab.<br />
* '''Maximum number of agents'''<br />
** Full region: 100 (Typically set to 40 on mainland, 55 on Linden Homes regions, but this does vary. Some meeting areas have this set to 60 and higher.)<br />
*** Recent server performance improvements make regions with 60 agents in them perform quite well.<br />
** [[Land#Homestead|Homestead]]: 20<br />
** [[Land#Openspace|Openspace]]: 10<br />
* '''Freeze Time:''' Land owners can [[freeze]] other Residents for up to 30 seconds. Members of land owning groups can also be granted this ability.<br />
* '''Minimum parcel that can be listed in Places or All search:''' 144 meters² <!-- 128 and under are disabled --><br />
* '''Minimum parcel that can be listed in Events:''' 512 meters²<br />
* '''Maximum altitude for event listings:''' 768 meters ({{JIRA|WEB-814}})<br />
* '''Maximum heights that objects can be seen on the [[World Map]]:''' 400.005m<br />
<br />
== [[Mesh]] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Number of vertices<br />
| n/a<br />
| {{no|65536 vertices per LOD}}<br />
| per [[mesh]] - See [[Talk:Limits#Mesh_Limits|discussion page]]<br />
| n/a<br />
|-<br />
||COLLADA file size<br />
| n/a<br />
| {{no|8 MB}}<br />
| Maximum mesh asset size after compression, roughly equivalent to a 256 MB Raw COLLADA file.<br />
| n/a<br />
|-<br />
||Bone influence weights per vertex<br />
| n/a<br />
| {{no|4}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Bone influence weights per mesh<br />
| n/a<br />
| {{no|110}}<br />
| some folk have reported needing to go as low as about 99 in rare cases<br />
| n/a<br />
|-<br />
||Number of materials per mesh<br />
| n/a<br />
| {{no|8}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Number of materials per face<br />
| n/a<br />
| {{no|1}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Physics weight for a vehicle<br />
| n/a<br />
| {{no|32.0}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Maximum number of triangles for Animesh<br />
| n/a<br />
| {{no|100,000}}<br />
| Server uses estimated triangles(streaming cost calculated), not visual triangles.<br />
| [[Animesh User Guide|Animesh_User_Guide]]<br />
|}<br />
<br />
===User Found Temporary Mesh limits:===<br />
''Because of an apparent bug in the importer stay within these limits.''<br />
* 174,752 triangles, beyond which additional triangles will appear as holes.<br />
* The 64k vertices per material is pre-empted by a limit of 21,844 triangles per material, which is presently reported as {{Jira|BUG-1001}}. (4/2014 - See [[Talk:Limits#Mesh_Limits|discussion page]])<br />
<br />
<br />
:: The import process will continue making new materials beyond 8 x 21,844 (=174,752) triangles, but the extra triangles then get dropped by the limitation to 8 materials, causing holes in the resulting object. Over the 21,844 triangle limit, the vertex count will start to climb steeply, even with smooth shading, because the materials get highly interspersed. So the same vertices have to appear in multiple material lists. So the moral of the story is to stay below 21,844 triangles per material, for now, if you want to avoid some unexpected effects.<br />
<br />
::Since viewer release 3.8.4, processing of meshes in the Collada file that have faces assigned to more than 8 materials has changed. Instead of simply dropping the extra material faces, the uploader now creates a new object to accommodate them. The result is that the single mesh is divided into multiple objects (prims) in a linkset. Thus the limitation to 8 materials is removed as far as input is concerned, but still applies to each of the resulting linked objects actually uploaded. As a consequence it is now possible to upload a mesh with more than 174,752 triangles, although it will be divided into multiple objects.<br />
<br />
== Misc. ==<br />
<br />
*'''[https://secondlife.com/currency/describe-limits.php Billing and Trading Limits]''' - Includes [https://secondlife.com/whatis/economy-market.php LindeX] currency exchange limits.<br />
<br />
== Navigation ==<br />
<br />
[[File:Max Alt.jpg|thumb|right|435px|'''Height counter error above 2147483647 meters''']]<br />
* '''Absolute height limit:''' [http://en.wikipedia.org/wiki/2147483647#2147483647_in_computing 2147483647]&nbsp;=&nbsp;2<sup>31</sup>&nbsp;−&nbsp;1 meters, which causes the altitude counter to roll over. Altitudes well below this cause graphics errors probably due to limited floating point number precision.<br />
* '''Highest z-value of an [[SLurl]], that will still teleport you to a positive altitude:''' 4096<br />
** This used to be much higher, but is clamped in late model viewers.<br />
<br />
== [[Profile]] ==<br />
<br />
Each 7-bit ASCII character is encoded in one byte. International characters might need more bytes. When pasting text instead of typing, you can get in one byte more into each of the below.<br />
<br />
* '''2nd Life tab's About field''' - 510 bytes<br />
* '''Picks tab''' - 10 picks with 1022 bytes each<br />
* '''1st Life tab's Info field''' - 253 bytes<br />
* '''Classified tab''' - 100 listings with x bytes each<br />
* '''My Notes''' - 1022 bytes<br />
<br />
== [[Lag|Performance]] ==<br />
<br />
* '''Healthy Viewer FPS''' - Generally, FPS equal to or above 24 is good. The higher it gets, the smoother'''*'''. You can check via [[Advanced]] menu > Performance Tools > Lag Meter, or for more advanced usage, see Advanced > Performance Tools > Statistics Bar.<br />
* '''Avatar Rendering Cost scores''' - [[Avatar Rendering Cost|Learn all about it!]]<br />
<br />
'''*''' Only until your framerate reaches your monitor's refresh rate, after this point there will be very little benefit.<br />
<br />
== [[Scripting]] == <!-- Important scripting limits should be placed here, less important ones should be in the articles Caveats or Specification sections --><br />
<br />
* '''Height at which scripts reactivate on a no-script parcel''' - 50 m above terrain mesh. Scripted objects that take controls will keep running when you fly down or enter a no-script parcel. (If scripts are disabled in the region debug panel, they will not run at any height.)<br />
* '''Maximum height where scripts can run''' - none, as long as the object remains rezzed or attached.<br />
* '''Maximum script source code size''' - 65536 single byte characters (that's a viewer limit and can be changed in the config file 'panel_script_ed.xml').<br />
* '''Maximum script memory size (LSO)''' - 16384 bytes.<br />
* '''Maximum script memory size (Mono)''' - 65536 bytes (the maximum memory available to Mono scripts can be constrained via [[llSetMemoryLimit]]).<br />
* '''Maximum active [[llListen|listeners]] per script''' - 65.<br />
** '''Usable channel for each listener''' - ''min.'' -2147483648, ''max.'' 2147483647, including the following special channels: [[PUBLIC_CHANNEL]] ''and'' [[DEBUG_CHANNEL]].<br />
* For specific scripting limits, look up calls in the '''[[LSL Portal]]'''.<br />
<br />
== [[Sound]] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Sound length<br />
| n/a<br />
| {{no|30.00000 seconds}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Bitrate<br />
| n/a<br />
| {{no|44,100 samples}}<br />
| 44,101 samples (30.00002 seconds) won't work. Most media players won't show accurate duration, so it's advised that you cut slightly below the maximum duration if you're having trouble '''[https://community.secondlife.com/knowledgebase/english/uploading-assets-r75/ uploading]''' sound assets.<br />
| n/a<br />
|-<br />
||Audio channels<br />
| n/a<br />
| {{no|1 channel (mono)}}<br />
| Conversion will be done automatically for dual-channel (stereo) audio.<br />
| n/a<br />
|}<br />
<br />
== [[Textures]] ==<br />
* '''[http://en.wikipedia.org/wiki/Aspect_ratio Aspect ratios]''' of profile, place, etc. pictures — all of these were measured at UI size (Edit menu > Preferences > General tab > UI Size) = 1.000:<br />
<br />
=== Second Life Viewer 3.6 ===<br />
<br />
* '''Search > Classifieds thumbnail''' - ~3:2 (101&times;69 pixels)<br />
* '''Search > Classifieds expanded''' - ~4:3 (159&times;120 pixels)<br />
* '''Search > Classifieds expanded > More Info''' - native aspect ratio<br />
* '''Search > Destination Guide thumbnail''' - ~3:2 (101&times;69 pixels) <br />
* '''Search > Destination Guide expanded''' - ~4:3 (159&times;120 pixels)<br />
* '''Search > People''' - 1:1 (100&times;100 pixels)<br />
* '''Search > Places expanded''' ~4:3 (159&times;120 pixels)<br />
* '''Place Profile''' - ~3:2 (290&times;197 pixels)<br />
* '''About Land > Options tab''' - ~4:3 (195&times;150 pixels)<br />
* '''Profile > Picture''' - native aspect ratio; thumbnail cropped to 72&times;72 pixels; zoomed uncropped up to 300&times;300 pixels<br />
* '''Profile > Real world picture''' - native aspect ratio; thumbnail cropped to 45&times;45 pixels; zoomed uncropped up to 300&times;300 pixels<br />
* '''Profile > Picks thumbnail''' - 4:3 (60&times;45 pixels)<br />
* '''Profile > Pick expanded''' - 4:3 (320&times;240 pixels)<br />
<br />
=== 1.x Series Viewers ===<br />
(official Viewer up to 1.23.5, still used by some [[Alternate viewers|Third Party Viewers]])<br />
* '''Search > All for "Classifieds", "People", and "Places"''' - 4:3 (256&times;192 pi&times;els)<br />
* '''Search > Places and Classified tabs''' - ~7:5 (398&times;282 pixels)<br />
* '''Search > Land tab''' - ~7:5 (358&times;252 pixels)<br />
* '''Profile > 2nd Life tab''' - ~4:3 (178&times;133 pixels)<br />
* '''Profile > Picks tab''' - 16:9 (288&times;162 pixels)<br />
* '''Profile > 1st Life tab''' - 1:1 (133&times;133 pixels)<br />
* '''Profile > Classifieds tab''' - ~3:2 (206&times;137 pixels)<br />
* '''Profile > Web tab''' - 1:1 (400&times;400 pixels)<br />
** A scrollbar uses 15 pixels on the right-hand side.<br />
* '''About Land > Options tab''' - ~3:2 (178&times;117 pixels)<br />
* '''Group Information > General tab's "Group Insignia"''' - 1:1 (126&times;126 pixels)<br />
** Some of these textures are shared (for example, Search > All place pages, Search > Places, and About Land > Options use the same image), so you should pick a well-balanced ratio and size.<br />
** [[Texture_aspect_ratios|Learn how to get correct texture aspect ratios when editing images.]]<br />
<br />
=== All Viewers ===<br />
<br />
* '''Maximum texture size''' - 1024&times;1024 pixels<br />
** All Second Life textures are constrained to [http://en.wikipedia.org/wiki/Power_of_2 powers of 2] (e.g., 128, 256, 512).<br />
** Some textures inworld have a resolution as high as 2048&times;2048; this is due to a previous limit that was higher.<br />
** We strongly recommend you use as small textures as possible because larger ones consume more memory and take substantially longer to load.<br />
** Where large textures are being forced by import to only 512&times;512, lower your ...> Preferences >...> UI Size under 1.0, to increase import size to the max 1024&times;1024.<br />
<br />
* '''Minimum texture size''' - 4&times;4 pixels<br />
** This means that there are nine possible image dimensions: 4, 8, 16, 32, 64, 128, 256, 512, and 1024 pixels, either horizontal or vertical.<br />
<br />
[[Category:Creation]] [[Category:Tutorials]] [[Category:Lists]]<br />
<br />
=== Notes ===<br />
In general 1 byte is enough to contain one character.</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Internal_Animations&diff=1211171Internal Animations2022-09-03T01:17:41Z<p>Tapple Gao: corrected the priority of turnleft and turnright; they have priority 3 components</p>
<hr />
<div>{{LSL Header|ml=*}}<br />
This is a complete listing of the [[Animation|animations]] built into Second Life. The name and UUID information was extracted from the Second Life client source code([ Your directory where is the sources of SecondLife]\indra\llcharacter\llanimationstates.cpp, llanimationstates.h and from the Second Life client installation folder <strike>viewerart.ini</strike> [ Your directory where is installed SecondLife]\app_settings\viewerart.xml) with some missing file names filled in from in-world testing. It should be complete as of January 2013. Looped animations are those that need to be explicitly stopped. <br />
__TOC__<br />
==About Animation Priority==<br />
Priorities reported are those from the viewer version 1.19.1.4 (but they haven't changed in several years), and are the animation's global priority. Animations also have priorities for each bone in the animation, which will override the animation's global priority for that bone. When uploading an animations there is no interface to set individual bone priorities; they default to the animations global priority (which is configurable).<br />
<br />
==User-playable animations==<br />
These animations can be triggered by the simulator, viewer, or scripts. Corresponding [[BVH]] files may be downloaded from [http://static-secondlife-com.s3.amazonaws.com/downloads/avatar/bvh_files.zip here] (ZIP format, 926k), you may also want [http://static-secondlife-com.s3.amazonaws.com/downloads/avatar/avatar_mesh.zip .obj files for the SL avatar mesh]. These animations and avatar mesh are available under the [http://creativecommons.org/licenses/by/3.0/ Creative Commons 3.0] license.<br />
{| class="sortable" {{prettytable}}<br />
|-{{Hl2}}<br />
!Animation Name<br />
![[UUID]]<br />
!Filename<br />
!Priority<br />
!Looped<br />
!Description<br />
|- <!-- ANIM_AGENT_AFRAID --><br />
|express_afraid<br />
|6b61c8e8-4747-0d75-12d7-e49ff207a4ca<br />
|avatar_express_afraid.bvh<br />
|2<br />
|No<br />
|Also triggers express_afraid_emote<br />
|- <!-- ANIM_AGENT_AIM_BAZOOKA_R --><br />
|aim_r_bazooka<br />
|b5b4a67d-0aee-30d2-72cd-77b333e932ef<br />
|avatar_aim_r_bazooka.bvh<br />
|2<br />
|Yes<br />
|Also triggers targeting<br />
|- <!-- ANIM_AGENT_AIM_BOW_L --><br />
|aim_l_bow<br />
|46bb4359-de38-4ed8-6a22-f1f52fe8f506<br />
|avatar_aim_l_bow.bvh<br />
|2<br />
|Yes<br />
|Also triggers targeting<br />
|- <!-- ANIM_AGENT_AIM_HANDGUN_R --><br />
|aim_r_handgun<br />
|3147d815-6338-b932-f011-16b56d9ac18b<br />
|avatar_aim_r_handgun.bvh<br />
|2<br />
|Yes<br />
|Also triggers targeting<br />
|- <!-- ANIM_AGENT_AIM_RIFLE_R --><br />
|aim_r_rifle<br />
|ea633413-8006-180a-c3ba-96dd1d756720<br />
|avatar_aim_r_rifle.bvh<br />
|2<br />
|Yes<br />
|Also triggers targeting<br />
|- <!-- ANIM_AGENT_ANGRY --><br />
|express_anger<br />
|5747a48e-073e-c331-f6f3-7c2149613d3e<br />
|avatar_express_anger.bvh<br />
|2<br />
|No<br />
|Also triggers express_anger_emote<br />
|- <!-- ANIM_AGENT_AWAY --><br />
|away<br />
|fd037134-85d4-f241-72c6-4f42164fedee<br />
|avatar_away.bvh<br />
|2<br />
|Yes<br />
|Places avatar in Away mode.<br />
|- <!-- ANIM_AGENT_BACKFLIP --><br />
|backflip<br />
|c4ca6188-9127-4f31-0158-23c4e2f93304<br />
|avatar_backflip.bvh<br />
|2<br />
|No<br />
|Also triggers express_laugh_emote<br />
|- <!-- ANIM_AGENT_BELLY_LAUGH --><br />
|express_laugh<br />
|18b3a4b5-b463-bd48-e4b6-71eaac76c515<br />
|avatar_express_laugh.bvh<br />
|2<br />
|No<br />
|Also triggers express_laugh_emote<br />
|- <!-- ANIM_AGENT_BLOW_KISS --><br />
|blowkiss<br />
|db84829b-462c-ee83-1e27-9bbee66bd624<br />
|avatar_blowkiss.bvh<br />
|2<br />
|No<br />
|Also triggers express_kiss<br />
|- <!-- ANIM_AGENT_BORED --><br />
|express_bored<br />
|b906c4ba-703b-1940-32a3-0c7f7d791510<br />
|avatar_express_bored.bvh<br />
|2<br />
|No<br />
|Also triggers express_bored_emote<br />
|- <!-- ANIM_AGENT_BOW --><br />
|bow<br />
|82e99230-c906-1403-4d9c-3889dd98daba<br />
|avatar_bow.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_BRUSH --><br />
|brush<br />
|349a3801-54f9-bf2c-3bd0-1ac89772af01<br />
|avatar_brush.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_BUSY --><br />
|busy<br />
|efcf670c-2d18-8128-973a-034ebc806b67<br />
|<br />
|2<br />
|Yes<br />
|No actual animation. Causes [[llGetAgentInfo]] to return [[AGENT_BUSY]] and adds "(Busy)" to avatar's title. Triggered by the viewer's busy mode, but does not fully set that mode by itself.<br />
|- <!-- ANIM_AGENT_CLAP --><br />
|clap<br />
|9b0c1c4e-8ac7-7969-1494-28c874c4f668<br />
|avatar_clap.bvh<br />
|2<br />
|No<br />
|Also triggers express_toothsmile<br />
|- <!-- ANIM_AGENT_COURTBOW --><br />
|courtbow<br />
|9ba1c942-08be-e43a-fb29-16ad440efc50<br />
|avatar_courtbow.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_CROUCH --><br />
|crouch<br />
|201f3fdf-cb1f-dbec-201f-7333e328ae7c<br />
|avatar_crouch.bvh<br />
|0<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_CROUCHWALK --><br />
|crouchwalk<br />
|47f5f6fb-22e5-ae44-f871-73aaaf4a6022<br />
|avatar_crouchwalk.bvh<br />
|0<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_CRY --><br />
|express_cry<br />
|92624d3e-1068-f1aa-a5ec-8244585193ed<br />
|avatar_express_cry.bvh<br />
|2<br />
|No<br />
|Also triggers express_cry_emote<br />
|- <!-- ANIM_AGENT_CUSTOMIZE --><br />
|turn_180<br />
|038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53<br />
|avatar_turn_180.bvh<br />
|5<br />
|Yes<br />
|Adds "(Editing Appearance)" to avatar's title <br />
|- <!-- ANIM_AGENT_CUSTOMIZE_DONE --><br />
|turnback_180<br />
|6883a61a-b27b-5914-a61e-dda118a9ee2c<br />
|avatar_turnback_180.bvh<br />
|3<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_DANCE1 --><br />
|dance1<br />
|b68a3d7c-de9e-fc87-eec8-543d787e5b0d<br />
|avatar_dance1.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_DANCE2 --><br />
|dance2<br />
|928cae18-e31d-76fd-9cc9-2f55160ff818<br />
|avatar_dance2.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_DANCE3 --><br />
|dance3<br />
|30047778-10ea-1af7-6881-4db7a3a5a114<br />
|avatar_dance3.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_DANCE4 --><br />
|dance4<br />
|951469f4-c7b2-c818-9dee-ad7eea8c30b7<br />
|avatar_dance4.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_DANCE5 --><br />
|dance5<br />
|4bd69a1d-1114-a0b4-625f-84e0a5237155<br />
|avatar_dance5.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_DANCE6 --><br />
|dance6<br />
|cd28b69b-9c95-bb78-3f94-8d605ff1bb12<br />
|avatar_dance6.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_DANCE7 --><br />
|dance7<br />
|a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6<br />
|avatar_dance7.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_DANCE8 --><br />
|dance8<br />
|b0dc417c-1f11-af36-2e80-7e7489fa7cdc<br />
|avatar_dance8.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_DEAD --><br />
|dead<br />
|57abaae6-1d17-7b1b-5f98-6d11a6411276<br />
|avatar_dead.bvh<br />
|4<br />
|Yes<br />
|Also triggers express_surprise_emote<br />
|- <!-- ANIM_AGENT_DRINK --><br />
|drink<br />
|0f86e355-dd31-a61c-fdb0-3a96b9aad05f<br />
|avatar_drink.bvh<br />
|2<br />
|No<br />
|Also triggers express_laugh_emote<br />
|- <!-- ANIM_AGENT_EMBARRASSED --><br />
|express_embarrased<br />
|514af488-9051-044a-b3fc-d4dbf76377c6<br />
|avatar_express_embarrased.bvh<br />
|2<br />
|No<br />
|Also triggers express_embarrassed_emote<br />
|- <!-- ANIM_AGENT_EXPRESS_AFRAID --><br />
|express_afraid_emote<br />
|aa2df84d-cf8f-7218-527b-424a52de766e<br />
|avatar_express_afraid_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_ANGER --><br />
|express_anger_emote<br />
|1a03b575-9634-b62a-5767-3a679e81f4de<br />
|avatar_express_anger_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_BORED --><br />
|express_bored_emote<br />
|214aa6c1-ba6a-4578-f27c-ce7688f61d0d<br />
|avatar_express_bored_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_CRY --><br />
|express_cry_emote<br />
|d535471b-85bf-3b4d-a542-93bea4f59d33<br />
|avatar_express_cry_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_DISDAIN --><br />
|express_disdain<br />
|d4416ff1-09d3-300f-4183-1b68a19b9fc1<br />
|avatar_express_disdain_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_EMBARRASSED --><br />
|express_embarrassed_emote<br />
|0b8c8211-d78c-33e8-fa28-c51a9594e424<br />
|avatar_express_embarrassed_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_FROWN --><br />
|express_frown<br />
|fee3df48-fa3d-1015-1e26-a205810e3001<br />
|avatar_express_frown.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_KISS --><br />
|express_kiss<br />
|1e8d90cc-a84e-e135-884c-7c82c8b03a14<br />
|avatar_express_kiss.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_LAUGH --><br />
|express_laugh_emote<br />
|62570842-0950-96f8-341c-809e65110823<br />
|avatar_express_laugh_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_OPEN_MOUTH --><br />
|express_open_mouth<br />
|d63bc1f9-fc81-9625-a0c6-007176d82eb7<br />
|avatar_express_open_mouth.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_REPULSED --><br />
|express_repulsed_emote<br />
|f76cda94-41d4-a229-2872-e0296e58afe1<br />
|avatar_express_repulsed_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_SAD --><br />
|express_sad_emote<br />
|eb6ebfb2-a4b3-a19c-d388-4dd5c03823f7<br />
|avatar_express_sad_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_SHRUG --><br />
|express_shrug_emote<br />
|a351b1bc-cc94-aac2-7bea-a7e6ebad15ef<br />
|avatar_express_shrug_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_SMILE --><br />
|express_smile<br />
|b7c7c833-e3d3-c4e3-9fc0-131237446312<br />
|avatar_express_smile.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_SURPRISE --><br />
|express_surprise_emote<br />
|728646d9-cc79-08b2-32d6-937f0a835c24<br />
|avatar_express_surprise.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_TONGUE_OUT --><br />
|express_tongue_out<br />
|835965c6-7f2f-bda2-5deb-2478737f91bf<br />
|avatar_express_tongue_out.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_TOOTHSMILE --><br />
|express_toothsmile<br />
|b92ec1a5-e7ce-a76b-2b05-bcdb9311417e<br />
|avatar_express_toothsmile.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_WINK --><br />
|express_wink_emote<br />
|da020525-4d94-59d6-23d7-81fdebf33148<br />
|avatar_express_wink_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_EXPRESS_WORRY --><br />
|express_worry_emote<br />
|9c05e5c7-6f07-6ca4-ed5a-b230390c3950<br />
|avatar_express_worry_emote.bvh<br />
|1<br />
|No<br />
|Facial expression<br />
|- <!-- ANIM_AGENT_FALLDOWN --><br />
|falldown<br />
|666307d9-a860-572d-6fd4-c3ab8865c094<br />
|avatar_falldown.bvh<br />
|3<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_FEMALE_WALK --><br />
|female_walk<br />
|f5fc7433-043d-e819-8298-f519a119b688<br />
|avatar_female_walk.bvh<br />
|3 & 0<br />
|Yes<br />
|(priority 3 for pelvis and legs, 0 for everything else)<br />
|- <!-- ANIM_AGENT_FINGER_WAG --><br />
|angry_fingerwag<br />
|c1bc7f36-3ba0-d844-f93c-93be945d644f<br />
|avatar_angry_fingerwag.bvh<br />
|2<br />
|No<br />
|Also triggers express_frown<br />
|- <!-- ANIM_AGENT_FIST_PUMP --><br />
|fist_pump<br />
|7db00ccd-f380-f3ee-439d-61968ec69c8a<br />
|avatar_fist_pump.bvh<br />
|2<br />
|No<br />
|Also triggers express_toothsmile<br />
|- <!-- ANIM_AGENT_FLY --><br />
|fly<br />
|aec4610c-757f-bc4e-c092-c6e9caf18daf<br />
|avatar_fly.bvh<br />
|0<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_FLYSLOW --><br />
|flyslow<br />
|2b5a38b2-5e00-3a97-a495-4c826bc443e6<br />
|avatar_flyslow.bvh<br />
|0<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_HELLO --><br />
|hello<br />
|9b29cd61-c45b-5689-ded2-91756b8d76a9<br />
|avatar_hello.bvh<br />
|2<br />
|No<br />
|Also triggers express_toothsmile<br />
|- <!-- ANIM_AGENT_HOLD_BAZOOKA_R --><br />
|hold_r_bazooka<br />
|ef62d355-c815-4816-2474-b1acc21094a6<br />
|avatar_hold_r_bazooka.bvh<br />
|2<br />
|Yes<br />
|Automatically replaced by aim_r_bazooka in [[mouselook]]<br />
|- <!-- ANIM_AGENT_HOLD_BOW_L --><br />
|hold_l_bow<br />
|8b102617-bcba-037b-86c1-b76219f90c88<br />
|avatar_hold_l_bow.bvh<br />
|2<br />
|Yes<br />
|Automatically replaced by aim_l_bow in [[mouselook]]<br />
|- <!-- ANIM_AGENT_HOLD_HANDGUN_R --><br />
|hold_r_handgun<br />
|efdc1727-8b8a-c800-4077-975fc27ee2f2<br />
|avatar_hold_r_handgun.bvh<br />
|2<br />
|Yes<br />
|Automatically replaced by aim_r_handgun in [[mouselook]]<br />
|- <!-- ANIM_AGENT_HOLD_RIFLE_R --><br />
|hold_r_rifle<br />
|3d94bad0-c55b-7dcc-8763-033c59405d33<br />
|avatar_hold_r_rifle.bvh<br />
|2<br />
|Yes<br />
|Automatically replaced by aim_r_rifle in [[mouselook]]<br />
|- <!-- ANIM_AGENT_HOLD_THROW_R --><br />
|hold_throw_r<br />
|7570c7b5-1f22-56dd-56ef-a9168241bbb6<br />
|avatar_hold_throw_r.bvh<br />
|?<br />
|?<br />
|(Missing as of 2008-06-12)<br />
|- <!-- ANIM_AGENT_HOVER --><br />
|hover<br />
|4ae8016b-31b9-03bb-c401-b1ea941db41d<br />
|avatar_hover.bvh<br />
|0<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_HOVER_DOWN --><br />
|hover_down<br />
|20f063ea-8306-2562-0b07-5c853b37b31e<br />
|avatar_hover_down.bvh<br />
|0<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_HOVER_UP --><br />
|hover_up<br />
|62c5de58-cb33-5743-3d07-9e4cd4352864<br />
|avatar_hover_up.bvh<br />
|0<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_IMPATIENT --><br />
|impatient<br />
|5ea3991f-c293-392e-6860-91dfa01278a3<br />
|avatar_impatient.bvh<br />
|2<br />
|No<br />
|Also triggers express_frown<br />
|- <!-- ANIM_AGENT_JUMP --><br />
|jump<br />
|2305bd75-1ca9-b03b-1faa-b176b8a8c49e<br />
|avatar_jump.bvh<br />
|0<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_JUMP_FOR_JOY --><br />
|jumpforjoy<br />
|709ea28e-1573-c023-8bf8-520c8bc637fa<br />
|avatar_jumpforjoy.bvh<br />
|2<br />
|No<br />
|Also triggers express_laugh_emote<br />
|- <!-- ANIM_AGENT_KISS_MY_BUTT --><br />
|kissmybutt<br />
|19999406-3a3a-d58c-a2ac-d72e555dcf51<br />
|avatar_kissmybutt.bvh<br />
|2<br />
|No<br />
|Also triggers express_kiss<br />
|- <!-- ANIM_AGENT_LAND --><br />
|land<br />
|7a17b059-12b2-41b1-570a-186368b6aa6f<br />
|avatar_land.bvh<br />
|0<br />
|Yes<br />
|Stopped automatically by viewer<br />
|- <!-- ANIM_AGENT_LAUGH_SHORT --><br />
|laugh_short<br />
|ca5b3f14-3194-7a2b-c894-aa699b718d1f<br />
|avatar_laugh_short.bvh<br />
|2<br />
|No<br />
|Also triggers express_laugh_emote<br />
|- <!-- ANIM_AGENT_MEDIUM_LAND --><br />
|soft_land<br />
|f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57<br />
|avatar_soft_land.bvh<br />
|2<br />
|Yes<br />
|Stopped automatically by viewer<br />
|- <!-- ANIM_AGENT_MOTORCYCLE_SIT --><br />
|motorcycle_sit<br />
|08464f78-3a8e-2944-cba5-0c94aff3af29<br />
|avatar_motorcycle_sit.bvh<br />
|4<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_MUSCLE_BEACH --><br />
|musclebeach<br />
|315c3a41-a5f3-0ba4-27da-f893f769e69b<br />
|avatar_musclebeach.bvh<br />
|2<br />
|No<br />
|Also triggers express_anger_emote<br />
|- <!-- ANIM_AGENT_NO --><br />
|no_head<br />
|5a977ed9-7f72-44e9-4c4c-6e913df8ae74<br />
|avatar_no_head.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_NO_UNHAPPY --><br />
|no_unhappy<br />
|d83fa0e5-97ed-7eb2-e798-7bd006215cb4<br />
|avatar_no_unhappy.bvh<br />
|2<br />
|No<br />
|Also triggers express_frown<br />
|- <!-- ANIM_AGENT_NYAH_NYAH --><br />
|nyanya<br />
|f061723d-0a18-754f-66ee-29a44795a32f<br />
|avatar_nyanya.bvh<br />
|2<br />
|No<br />
|Also triggers express_tongue_out<br />
|- <!-- ANIM_AGENT_ONETWO_PUNCH --><br />
|punch_onetwo<br />
|eefc79be-daae-a239-8c04-890f5d23654a<br />
|avatar_punch_onetwo.bvh<br />
|2<br />
|No<br />
|Also triggers express_frown<br />
|- <!-- ANIM_AGENT_PEACE --><br />
|peace<br />
|b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9<br />
|avatar_peace.bvh<br />
|2<br />
|No<br />
|Also triggers express_smile<br />
|- <!-- ANIM_AGENT_POINT_ME --><br />
|point_me<br />
|17c024cc-eef2-f6a0-3527-9869876d7752<br />
|avatar_point_me.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_POINT_YOU --><br />
|point_you<br />
|ec952cca-61ef-aa3b-2789-4d1344f016de<br />
|avatar_point_you.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_PRE_JUMP --><br />
|prejump<br />
|7a4e87fe-de39-6fcb-6223-024b00893244<br />
|avatar_prejump.bvh<br />
|0<br />
|Yes<br />
|Stopped automatically by viewer {{JIRA|SVC-3860}}<br />
|- <!-- ANIM_AGENT_PUNCH_LEFT --><br />
|punch_l<br />
|f3300ad9-3462-1d07-2044-0fef80062da0<br />
|avatar_punch_l.bvh<br />
|2<br />
|No<br />
|Also triggers express_frown<br />
|- <!-- ANIM_AGENT_PUNCH_RIGHT --><br />
|punch_r<br />
|c8e42d32-7310-6906-c903-cab5d4a34656<br />
|avatar_punch_r.bvh<br />
|2<br />
|No<br />
|Also triggers express_frown<br />
|- <!-- ANIM_AGENT_REPULSED --><br />
|express_repulsed<br />
|36f81a92-f076-5893-dc4b-7c3795e487cf<br />
|avatar_express_repulsed.bvh<br />
|2<br />
|No<br />
|Also triggers express_repulsed_emote<br />
|- <!-- ANIM_AGENT_ROUNDHOUSE_KICK --><br />
|kick_roundhouse_r<br />
|49aea43b-5ac3-8a44-b595-96100af0beda<br />
|avatar_kick_roundhouse_r.bvh<br />
|2<br />
|No<br />
|also triggers express_anger_emote<br />
|- <!-- ANIM_AGENT_RPS_COUNTDOWN --><br />
|rps_countdown<br />
|35db4f7e-28c2-6679-cea9-3ee108f7fc7f<br />
|avatar_rps_countdown.bvh<br />
|2<br />
|No<br />
|Also triggers express_toothsmile<br />
|- <!-- ANIM_AGENT_RPS_PAPER --><br />
|rps_paper<br />
|0836b67f-7f7b-f37b-c00a-460dc1521f5a<br />
|avatar_rps_paper.bvh<br />
|2<br />
|No<br />
|Also triggers express_surprise_emote<br />
|- <!-- ANIM_AGENT_RPS_ROCK --><br />
|rps_rock<br />
|42dd95d5-0bc6-6392-f650-777304946c0f<br />
|avatar_rps_rock.bvh<br />
|2<br />
|No<br />
|Also triggers express_surprise_emote<br />
|- <!-- ANIM_AGENT_RPS_SCISSORS --><br />
|rps_scissors<br />
|16803a9f-5140-e042-4d7b-d28ba247c325<br />
|avatar_rps_scissors.bvh<br />
|2<br />
|No<br />
|Also triggers express_surprise_emote<br />
|- <!-- ANIM_AGENT_RUN --><br />
|run<br />
|05ddbff8-aaa9-92a1-2b74-8fe77a29b445<br />
|avatar_run.bvh<br />
|0<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_SAD --><br />
|express_sad<br />
|0eb702e2-cc5a-9a88-56a5-661a55c0676a<br />
|avatar_express_sad.bvh<br />
|2<br />
|No<br />
|Also triggers express_sad_emote<br />
|- <!-- ANIM_AGENT_SALUTE --><br />
|salute<br />
|cd7668a6-7011-d7e2-ead8-fc69eff1a104<br />
|avatar_salute.bvh<br />
|2<br />
|No<br />
|Also triggers express_frown<br />
|- <!-- ANIM_AGENT_SHOOT_BOW_L --><br />
|shoot_l_bow<br />
|e04d450d-fdb5-0432-fd68-818aaf5935f8<br />
|avatar_shoot_l_bow.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_SHOUT --><br />
|shout<br />
|6bd01860-4ebd-127a-bb3d-d1427e8e0c42<br />
|avatar_shout.bvh<br />
|2<br />
|No<br />
|Also triggers express_laugh_emote. Sent with "shout" volume chat from viewer<br />
|- <!-- ANIM_AGENT_SHRUG --><br />
|express_shrug<br />
|70ea714f-3a97-d742-1b01-590a8fcd1db5<br />
|avatar_express_shrug.bvh<br />
|2<br />
|No<br />
|Also triggers express_shrug_emote<br />
|- <!-- ANIM_AGENT_SIT --><br />
|sit<br />
|1a5fe8ac-a804-8a5d-7cbd-56bd83184568<br />
|avatar_sit.bvh<br />
|4<br />
|Yes<br />
|Automatically replaced by sit_female if female shape is worn<br />
|- <!-- ANIM_AGENT_SIT_FEMALE --><br />
|sit_female<br />
|b1709c8d-ecd3-54a1-4f28-d55ac0840782<br />
|avatar_sit_female.bvh<br />
|4<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_SIT_GROUND --><br />
|sit_ground<br />
|1c7600d6-661f-b87b-efe2-d7421eb93c86<br />
|avatar_sit_ground.bvh<br />
|3<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_SIT_GROUND_CONSTRAINED --><br />
|sit_ground_constrained<br />
|1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e<br />
|avatar_sit_ground_constrained.bvh<br />
|3<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_SIT_GENERIC --><br />
|sit_generic<br />
|245f3c54-f1c0-bf2e-811f-46d8eeb386e7<br />
|avatar_sit_generic.bvh<br />
|4<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_SIT_TO_STAND --><br />
|sit_to_stand<br />
|a8dee56f-2eae-9e7a-05a2-6fb92b97e21e<br />
|avatar_sit_to_stand.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_SLEEP --><br />
|sleep<br />
|f2bed5f9-9d44-39af-b0cd-257b2a17fe40<br />
|avatar_sleep.bvh<br />
|4<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_SMOKE_IDLE --><br />
|smoke_idle<br />
|d2f2ee58-8ad1-06c9-d8d3-3827ba31567a<br />
|avatar_smoke_idle.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_SMOKE_INHALE --><br />
|smoke_inhale<br />
|6802d553-49da-0778-9f85-1599a2266526<br />
|avatar_smoke_inhale.bvh<br />
|2<br />
|No<br />
|Also triggers express_kiss<br />
|- <!-- ANIM_AGENT_SMOKE_THROW_DOWN --><br />
|smoke_throw_down<br />
|0a9fb970-8b44-9114-d3a9-bf69cfe804d6<br />
|avatar_smoke_throw_down.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_SNAPSHOT --><br />
|snapshot<br />
|eae8905b-271a-99e2-4c0e-31106afd100c<br />
|avatar_snapshot.bvh<br />
|2<br />
|No<br />
|Also triggers express_toothsmile<br />
|- <!-- ANIM_AGENT_STAND --><br />
|stand<br />
|2408fe9e-df1d-1d7d-f4ff-1384fa7b350f<br />
|avatar_stand.bvh<br />
|0<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_STANDUP --><br />
|standup<br />
|3da1d753-028a-5446-24f3-9c9b856d9422<br />
|avatar_standup.bvh<br />
|3<br />
|Yes<br />
|Stopped automatically by viewer. Viewer also randomly triggers brush on stop.<br />
|- <!-- ANIM_AGENT_STAND_1 --><br />
|stand_1<br />
|15468e00-3400-bb66-cecc-646d7c14458e<br />
|avatar_stand_1.bvh<br />
|0<br />
|Yes<br />
|Stopped automatically by viewer<br />
|- <!-- ANIM_AGENT_STAND_2 --><br />
|stand_2<br />
|370f3a20-6ca6-9971-848c-9a01bc42ae3c<br />
|avatar_stand_2.bvh<br />
|0<br />
|Yes<br />
|Stopped automatically by viewer<br />
|- <!-- ANIM_AGENT_STAND_3 --><br />
|stand_3<br />
|42b46214-4b44-79ae-deb8-0df61424ff4b<br />
|avatar_stand_3.bvh<br />
|0<br />
|Yes<br />
|Stopped automatically by viewer<br />
|- <!-- ANIM_AGENT_STAND_4 --><br />
|stand_4<br />
|f22fed8b-a5ed-2c93-64d5-bdd8b93c889f<br />
|avatar_stand_4.bvh<br />
|0<br />
|Yes<br />
|Stopped automatically by viewer<br />
|- <!-- ANIM_AGENT_STRETCH --><br />
|stretch<br />
|80700431-74ec-a008-14f8-77575e73693f<br />
|avatar_stretch.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_STRIDE --><br />
|stride<br />
|1cb562b0-ba21-2202-efb3-30f82cdf9595<br />
|avatar_stride.bvh<br />
|1<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_SURF --><br />
|surf<br />
|41426836-7437-7e89-025d-0aa4d10f1d69<br />
|avatar_surf.bvh<br />
|4<br />
|Yes<br />
|<br />
|- <!-- ANIM_AGENT_SURPRISE --><br />
|express_surprise<br />
|313b9881-4302-73c0-c7d0-0e7a36b6c224<br />
|avatar_express_surprise.bvh<br />
|2<br />
|No<br />
|Also triggers express_surprise_emote<br />
|- <!-- ANIM_AGENT_SWORD_STRIKE --><br />
|sword_strike_r<br />
|85428680-6bf9-3e64-b489-6f81087c24bd<br />
|avatar_sword_strike_r.bvh<br />
|2<br />
|No<br />
|Also triggers express_frown<br />
|- <!-- ANIM_AGENT_TALK --><br />
|talk<br />
|5c682a95-6da4-a463-0bf6-0f5b7be129d1<br />
|avatar_talk.bvh<br />
|1<br />
|No<br />
|Nod sent with "say" volume chat from viewer<br />
|- <!-- ANIM_AGENT_TANTRUM --><br />
|angry_tantrum<br />
|11000694-3f41-adc2-606b-eee1d66f3724<br />
|avatar_angry_tantrum.bvh<br />
|2<br />
|No<br />
|Also triggers express_anger_remote<br />
|- <!-- ANIM_AGENT_THROW_R --><br />
|throw_r<br />
|aa134404-7dac-7aca-2cba-435f9db875ca<br />
|avatar_throw_r.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_TRYON_SHIRT --><br />
|tryon_shirt<br />
|83ff59fe-2346-f236-9009-4e3608af64c1<br />
|avatar_tryon_shirt.bvh<br />
|1<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_TURNLEFT --><br />
|turnleft<br />
|56e0ba0d-4a9f-7f27-6117-32f2ebbf6135<br />
|avatar_turnleft.bvh<br />
|3 & 1<br />
|Yes<br />
|(priority 3 for pelvis and legs, 1 for everything else)<br />
|- <!-- ANIM_AGENT_TURNRIGHT --><br />
|turnright<br />
|2d6daa51-3192-6794-8e2e-a15f8338ec30<br />
|avatar_turnright.bvh<br />
|3 & 1<br />
|Yes<br />
|(priority 3 for pelvis and legs, 1 for everything else)<br />
|- <!-- ANIM_AGENT_TYPE --><br />
|type<br />
|c541c47f-e0c0-058b-ad1a-d6ae3a4584d9<br />
|avatar_type.bvh<br />
|2<br />
|Yes<br />
|Also plays the typing sound when started<br />
|- <!-- ANIM_AGENT_WALK --><br />
|walk<br />
|6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0<br />
|avatar_walk.bvh<br />
|3 & 0<br />
|Yes{{Footnote|"walk" is treated specially in the viewer. The animation played standalone is not looped, the viewer does the looping so it can adjust for walking speed. Since viewer 2.1, the walk loop rate is fixed so it behaves like a normal looped animation. If you want to use the default walk in a scripted device with a sitting avatar, female_walk will give better results.}}<br />
|Automatically replaced by female_walk if female shape is worn (priority 3 for pelvis and legs, 0 for everything else)<br />
|- <!-- ANIM_AGENT_WHISPER --><br />
|whisper<br />
|7693f268-06c7-ea71-fa21-2b30d6533f8f<br />
|avatar_whisper.bvh<br />
|0<br />
|No<br />
|Also triggers express_wink_emote. Sent with "whisper" volume chat from viewer<br />
|- <!-- ANIM_AGENT_WHISTLE --><br />
|whistle<br />
|b1ed7982-c68e-a982-7561-52a88a5298c0<br />
|avatar_whistle.bvh<br />
|2<br />
|No<br />
|Also triggers express_kiss<br />
|- <!-- ANIM_AGENT_WINK --><br />
|express_wink<br />
|869ecdad-a44b-671e-3266-56aef2e3ac2e<br />
|avatar_express_wink.bvh<br />
|2<br />
|No<br />
|Also triggers express_wink_emote<br />
|- <!-- ANIM_AGENT_WINK_HOLLYWOOD --><br />
|wink_hollywood<br />
|c0c4030f-c02b-49de-24ba-2331f43fe41c<br />
|avatar_wink_hollywood.bvh<br />
|2<br />
|No<br />
|Also triggers express_wink_emote<br />
|- <!-- ANIM_AGENT_WORRY --><br />
|express_worry<br />
|9f496bd2-589a-709f-16cc-69bf7df1d36c<br />
|avatar_express_worry.bvh<br />
|2<br />
|No<br />
|Also triggers express_worry_emote<br />
|- <!-- ANIM_AGENT_YES --><br />
|yes_head<br />
|15dd911d-be82-2856-26db-27659b142875<br />
|avatar_yes_head.bvh<br />
|2<br />
|No<br />
|<br />
|- <!-- ANIM_AGENT_YES_HAPPY --><br />
|yes_happy<br />
|b8c8b2a3-9008-1771-3bfc-90924955ab2d<br />
|avatar_yes_happy.bvh<br />
|2<br />
|No<br />
|Also triggers express_toothsmile<br />
|- <!-- ANIM_AGENT_YOGA_FLOAT --><br />
|yoga_float<br />
|42ecd00b-9947-a97c-400a-bbc9174c7aeb<br />
|avatar_yoga_float.bvh<br />
|2<br />
|No<br />
|Also triggers express_bored_remote<br />
|}<br />
===Facial expressions===<br />
[[Image:SL face expressions.jpg|200px|thumb|left|Samples of the facial expressions from the table above, click to enlarge.]]<br />
<div style="clear:both;"></div><br />
<br />
==Viewer-generated motions==<br />
Some types of movement are generated at run time by the viewer, in response to the environment. Like regular animations most have names and UUIDs, but they are not available to be stopped, started or even seen by scripts. These motions do have priorities and can be overridden. Names and UUIDs are defined in newview/llvoavatar.h.<br />
{| class="sortable" {{prettytable}}<br />
|-{{Hl2}}<br />
!Animation Name<br />
![[UUID]]<br />
!Source<br />
!Priority<br />
!class="unsortable"|Description<br />
|- <!-- ANIM_AGENT_BODY_NOISE --><br />
|body_noise<br />
|9aa8b0a6-0c6f-9518-c7c3-4f41f2c001ad<br />
|LLBodyNoiseMotion in newview/llvoavatar.cpp<br />
|2<br />
|Minor body turns. Joints moved: torso.<br />
|- <!-- ANIM_AGENT_BREATHE_ROT --><br />
|breathe_rot<br />
|4c5a103e-b830-2f1c-16bc-224aa0ad5bc8<br />
|LLBreatheMotionRot in newview/llvoavatar.cpp<br />
|1<br />
|Breathing simulation. Joints moved: chest<br />
|- <!-- ANIM_AGENT_EDITING --><br />
|editing<br />
|2a8eba1d-a7f8-5596-d44a-b4977bf8c8bb<br />
|LLEditingMotion in llcharacter/lleditingmotion.cpp<br />
|2<br />
|Left arm follows selected and edited objects. Joints moved: left shoulder, left elbow, left wrist, torso.<br />
|- <!-- ANIM_AGENT_EYE --><br />
|eye<br />
|5c780ea8-1cd1-c463-a128-48c023f6fbea<br />
|LLEyeMotion in llcharacter/llheadrotmotion.cpp<br />
|1<br />
|Eye rotation and blinking. Joints moved: head, left eye, right eye<br />
|- <!-- ANIM_AGENT_FLY_ADJUST --><br />
|fly_adjust<br />
|db95561f-f1b0-9f9a-7224-b12f71af126e<br />
|LLFlyAdjustMotion in llcharacter/llkeyframewalkmotion.cpp<br />
|3<br />
|Add body roll during flight. Joints moved: pelvis<br />
|- <!-- ANIM_AGENT_HAND_MOTION --><br />
|hand_motion<br />
|ce986325-0ba7-6e6e-cc24-b17c4b795578<br />
|LLHandMotion in llcharacter/llhandmotion.cpp<br />
|1<br />
|Sets standard hand poses defined in other animations<br />
|- <!-- ANIM_AGENT_HEAD_ROT --><br />
|head_rot<br />
|e6e8d1dd-e643-fff7-b238-c6b4b056a68d<br />
|LLHeadRotMotion in llcharacter/llheadrotmotion.cpp<br />
|1<br />
|Moves head and torso to follow the avatar's look at position (cursor, camera). Joints moved: torso, neck, head<br />
|- <!-- ANIM_AGENT_PELVIS_FIX --><br />
|pelvis_fix<br />
|0c5dd2a2-514d-8893-d44d-05beffad208b<br />
|LLPelvisFixMotion in newview/llvoavatar.cpp<br />
|0<br />
|Makes corrections to keep avatar standing upright. Joints moved: pelvis<br />
|- <!-- ANIM_AGENT_TARGET --><br />
|target<br />
|0e4896cb-fba4-926c-f355-8720189d5b55<br />
|LLTargetingMotion in llcharacter/lltargetingmotion.cpp<br />
|2<br />
|Move body with look at position, used during aim_* animations above. Joints moved: pelvis, torso, right wrist<br />
|- <!-- ANIM_AGENT_WALK_ADJUST --><br />
|walk_adjust<br />
|829bc85b-02fc-ec41-be2e-74cc6dd7215d<br />
|LLWalkAdjustMotion in llcharacter/llkeyframewalkmotion.cpp<br />
|2<br />
|Makes walking corrections for terrain, turns. Joints moved: pelvis, left ankle, right ankle<br />
|- <!-- Oo --><br />
| Lipsync_Ooh Lipsync_Aah<br />
|(none assigned)<br />
|character/avatar_lad.xml<br />
|<br />
|Mouth movement for voice [[LipSync|lip sync]] feature<br />
|}<br />
<br />
==Footnotes==<br />
{{Footnotes}}<br />
[[Category:LSL_Animation]]</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlTeleportAgent&diff=1210406LlTeleportAgent2022-01-23T04:32:22Z<p>Tapple Gao: the description of lookAt was wrong when a landmark is provided</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL Function/avatar|avatar|region=*}}{{LSL Function/inventory|landmark|type=landmark|uuid=false|empty=(for teleporting within the same region)}}{{Issues/BUG-4062}}{{Issues/SVC-7987}}<br />
|inject-3={{LSL_Function/permission|PERMISSION_TELEPORT|grant={{LSLP|avatar}}}}<br />
|func=llTeleportAgent<br />
|sort=TeleportAgent<br />
|p1_type=key|p1_name=avatar|p1_desc=&#32;(the avatar to teleport, must be the [[llGetOwner|owner]])|p1_hover=&#32;(the avatar to teleport, must be the owner)<br />
|p2_type=string|p2_name=landmark|p2_desc<br />
|p3_type=vector|p3_name=position|p3_desc=The position within the local region to teleport the avatar to if no landmark was provided.<br />
|p4_type=vector|p4_subtype=direction|p4_name=look_at|p4_desc=If landmark is provided, a ''direction'' to face (same as in [[llTeleportAgentGlobalCoords]]). If landmark is not provided, the position within the region that the avatar should be turned to face upon arrival.<br />
|func_desc=Requests a teleport of {{LSLP|avatar}} to a {{LSLP|landmark}} stored in the object's inventory. If no landmark is provided (an empty string), the avatar is teleported to the location {{LSLP|position}} in the current region. In either case, the avatar is turned to face the direction given by {{LSLP|look_at}}.<br />
|func_footnote<br />
|caveats=<br />
* '''This function can only teleport the owner of the object''' (unless part of an [[:Category:Experience Tools|Experience]]).<br />
* Teleports are throttled<br />
* This function cannot be used in a script in an object attached using [[llAttachToAvatarTemp]].<br />
* Sitting avatars cannot be teleported using this function. You must [[llUnSit]] them first.<br />
* This function does not override a parcel's teleport settings, i.e. if the parcel has a landing zone enabled the agent will be teleported there.<br />
* If the script is part of an experience that the avatar has granted permission, then this function may teleport them without being the owner and it will override parcel teleport routing. See the example below.<br />
|examples=<br />
'''Without a landmark in the object's inventory'''<br />
<source lang="lsl2">key teleportee;<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llSay(0, "Touch to teleport");<br />
}<br />
<br />
touch_start(integer total_num)<br />
{<br />
teleportee = llDetectedKey(0);<br />
llRequestPermissions(teleportee, PERMISSION_TELEPORT);<br />
}<br />
<br />
run_time_permissions(integer perm)<br />
{<br />
if(PERMISSION_TELEPORT & perm)<br />
{<br />
llTeleportAgent(teleportee, "", <13.0, 38.0, 23.5>, <13.0, 12.0, 23.5>);<br />
}<br />
}<br />
}<br />
</source><br />
'''With a landmark in the objects inventory'''<br />
<source lang="lsl2"><br />
key teleportee;<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llSay(0, "Touch to teleport");<br />
}<br />
<br />
touch_start(integer total_num)<br />
{<br />
teleportee = llDetectedKey(0);<br />
llRequestPermissions(teleportee, PERMISSION_TELEPORT);<br />
}<br />
<br />
run_time_permissions(integer perm)<br />
{<br />
if(PERMISSION_TELEPORT & perm)<br />
{<br />
llTeleportAgent(teleportee, "Experience Tools 1", <0.0, 0.0, 0.0>, <0.0, 0.0, 0.0>);<br />
}<br />
}<br />
}<br />
</source><br />
'''How to use this function in an Experience'''<br />
<source lang="lsl2"><br />
// A SIMPLE SCRIPT that implements an Experience based teleport.<br />
// Compile with the "Use Experience" box cnecked and an experience key you own selected.<br />
// The prim containing this script must contain a landmark named "Landmark" in its contents<br />
//<br />
// If the person touching this box has not previously accepted an invitation to your experience,<br />
// that person will be offered that opportunity when this prim is touched, and if the invitations<br />
// is accepted, will be immediately teleported to the target of the landmark.<br />
//<br />
// If the toucher has previously accepted an invitation, the person will be immediately teleported<br />
// with no interruption.<br />
//<br />
// The script has no safety features, e.g., will simply fail if the prim contains no landmark.<br />
//<br />
// Thanks to Rolig Loon for her help in figuring out how to do this<br />
// See https://community.secondlife.com/t5/English-Knowledge-Base/Experiences-in-Second-Life/ta-p/2744686<br />
// to read what the Lindens think is an adequate explanation of all this.<br />
<br />
<br />
default<br />
{<br />
touch_start(integer n)<br />
{<br />
llRequestExperiencePermissions(llDetectedKey(0), "");<br />
}<br />
<br />
experience_permissions(key av)<br />
{<br />
llTeleportAgent(av, "Landmark", ZERO_VECTOR, ZERO_VECTOR);<br />
}<br />
<br />
}<br />
</source><br />
|also_functions=<br />
{{LSL DefineRow||[[llTeleportAgentGlobalCoords]]|Teleports an agent to a global position.}}<br />
|notes=<br />
|cat1=Teleport<br />
|cat2<br />
|cat3<br />
|history = Date of Release [[ Release_Notes/Second_Life_Server/12#12.07.24.262437 | 24/07/2012 ]]<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Limits&diff=1210372Limits2021-11-26T22:53:29Z<p>Tapple Gao: /* Inventory */ updated the notecard limit</p>
<hr />
<div><noinclude>{{KBmaster}}</noinclude><br />
== Summary ==<br />
{{RightToc}}<br />
The Second Life Viewer and simulators have a division of labor, keeping track of the data that makes Second Life run. The Viewer's job is to:<br />
<br />
* Handle locations of objects.<br />
* Get velocities and other physics information, and does simple physics to keep track of what is moving where.<br />
<br />
The simulator's job is to:<br />
<br />
* Run the physics engine.<br />
* Detect collisions.<br />
* Keep track of where everything is<br />
* Send locations of content to the Viewer along with updates when certain changes occur.<br />
<br />
Limits are necessary for all of these components to work together. The list below outlines many of the '''Second Life numerical limits that affect your inworld experience'''. Some of these will likely change over time, so if you spot something incorrect/outdated, please take a moment to update it.<br />
<br />
{{KBcaution|1=The scope of this page is focused on Linden Lab's official Viewers, keeping in mind [[Third_Party_Viewer_Directory|3rd-party viewers may differ]]. Cite sources and provide substantiation for limits that aren't provided by Linden Lab. Also, unconfirmed speculation [[Talk:Limits|goes on this discussion page]]. Don't add data without a hard limit, and don't add obscure trivia that doesn't practically affect the general inworld experience.|width=80%}}<br />
<br />
== [[Avatar]] ==<br />
<br />
* '''Max. # of attachments''' - 38 combined [[HUD]] or body attachments.<br />
** They can be viewed by right-clicking your avatar and choosing '''Edit My Outfit'''.<br />
** With the formal introduction of [[multiple attachments|multiple attachments to a single point]] in Viewer 2.4, you can attach up to 38 total objects, and they can all be attached to a single point. <br />
** With the introduction of the Bento armature, there are 47 attachment points available.<br />
** With the introduction of Animesh, there is a limit of 1 Animesh attachment, 2 if the resident has premium.<br />
* '''Max. # of clothing layers''' - 60 including alpha, tattoo, shoe base, physics, socks, gloves, undershirt, underpants, shirt, pants, jacket, skirt<br />
** On viewers before Second Life Release 3.7.29.301305, the potential total was still 60, but limited to 5 items of each type.<br />
** In any case, only one each of shape, skin, eyes and hair base may be worn. These 4 basic body parts are in addition to the 60 clothing layers.<br />
* '''Max Clothing Texture''' - 1024x1024 px (except 128x128 px for eyes) - Server Side Appearance (and legacy baking on outside grids) will downsize larger textures.<br />
* '''Max. unassisted fly height''' - Stable hover at current ground elevation ''plus'' 5020m.<br />
** You can easily acquire a flight attachment to fly high. Also see [[flight limit]] and [[Limits#Navigation|the Navigation section]] below.<br />
* '''Common shoe sizes''' - Traditionally, most women's shoes were designed for a size 0 (zero) foot. Men's generally scale up to 14. Newer items (mesh and some sculpted) replace the system feet or conform to the avatar's shape, so adjustments may be necessary.<br />
** You can check this by going to Edit menu > Appearance and clicking on the Shape > Legs tab.<br />
<!--Can someone verify the following?<br />
* '''Min. length of avatar name''' - 2 for the first name, 2 for the last name, 5 in total (including the space).--><br />
* '''Max. length of avatar name''' - 31 for first name, 31 for last name, 63 in total (including the space).<br />
<br />
* '''Max. length of {{LSLGC|Username}}''' - All lower case and a maximum of 63 including the '.'(eg; firstname.lastname)<br />
**Older account user names are a combination of the First and last name in lower case separated by a period(.)(eg; lilmix.pixelmaid)<br />
**Modern user names are a single name(no period)(eg; john1234) - '''Max.''' length is 31 characters<br />
**The {{LSLGC|Legacy Name}}s for modern user names always shows Resident as the last name. So the Max is 40 characters in total for a new avatar's legacy name(including the space and last name 'Resident')<br />
*'''Min. length of [[Display_Names]]''' - At least one script character<br />
*'''Max. length of Display Names''' - 31 characters<br />
**Display Names can include most Unicode script characters, spaces, and some punctuation.<br />
<br />
* '''Max. avatar speed''' - 250m/s (with only attachments to assist)<br />
* '''Max. teleport speed'''<!-- - 3 teleports per 15 seconds (server 1.27.0) and 10 teleports per 15 seconds (server 1.27.1)--> - 10 teleports per 15 seconds, since SL server 1.27.1<br />
<br />
== [[Animation]] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Length of animation<br />
| n/a<br />
| {{no|60.0 seconds}}<br />
| Limited by length or Size, whichever is reached first<br />
| n/a<br />
|-<br />
||Size of Animation<br />
| n/a<br />
| {{no|250k bytes}}<br />
| Limited by length or Size, whichever is reached first. Size is after conversion to SL [[Internal Animation Format|internal animaton format]], not BVH source which can be much larger.<br />
| n/a<br />
|-<br />
||Distance an Animation Can Travel<br />
| n/a<br />
| {{no|10 meters}}<br />
| n/a<br />
| n/a<br />
<br />
|-<br />
||animation priority<br />
| {{no|0}}<br />
| {{no|4, with custom tools 6}}<br />
| n/a<br />
| [[Animation_Priority]]<br />
|-<br />
||Number of unique joints per animation<br />
| n/a<br />
| {{no|216}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Number of simultaneous animations playing<br />
| n/a<br />
| {{no|30}}<br />
| n/a<br />
| n/a<br />
|}<br />
<br />
== [http://community.secondlife.com/t5/English-Knowledge-Base/Build-Tools/ta-p/700039 Building] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||[[Prim]] dimensions<br />
| {{no|<0.01,&nbsp;0.01,&nbsp;0.01>}}<br />
| {{no|<64.0, 64.0, 64.0>}}<br />
| Used to be <10.0, 10.0, 10.0> prior to Second Life Server version 11.08.17.238770<br />
| [[llSetScale]], [[PRIM_SIZE]] and [[Megaprim]]<br />
|-<br />
||Number of prims in a linkset<br />
| n/a<br />
| {{no|256 prims}}<br />
| Used to be 255 prior to Second Life Server version 1.26<br />
| n/a<br />
|-<br />
||Linking distance<br />
| n/a<br />
| {{no|[[Linkability_Rules]]}}<br />
| n/a<br />
| n/a<br />
|-<br />
||[[Mesh/Mesh_physics#Physics_Resource_Cost|Physics cost]] for a physical object<br />
| n/a<br />
| {{no|32.0}}<br />
||Additional notes:<br />
* If you try to link more, it'll either say "Can't enable physics for objects with more than 32 primitives" or "Object has too many primitives -- its dynamics have been disabled.".<br />
* On server versions 1.38 and below, each sitting avatar counted as 1 prim. From 1.40.2 the limit is only on actual prims.<br />
| [[OBJECT_PHYSICS_COST]]<br />
|-<br />
||Build or rez height<br />
| n/a<br />
| {{no|4096.0 meters}}<br />
| 768.0 meters for Viewers prior to version 1.20<br />
| n/a<br />
|-<br />
||Prim name length<br />
| n/a<br />
| {{no|63 bytes UTF-8 [[String|string]]}}<br />
| same limit for {{LSLGC|Avatar/Name|avatar names}}, although the character set for avatar names is significantly limited.<br />
| n/a<br />
|-<br />
||Prim description length<br />
| n/a<br />
| {{no|127 bytes UTF-8 [[String|string]]}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Temporary prims' lifetime<br />
| n/a<br />
| {{no|up to around 60 seconds}}<br />
| depends upon when the next garbage collector cycle is<br />
| n/a<br />
|-<br />
||Number of temporary prims<br />
| n/a<br />
| {{no|RegionPrimLimit - NumberOfPrimsInRegion + Minimum(0.5*RegionPrimLimit, 1000)}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Length of hovertext<br />
| n/a<br />
| {{no|254 bytes UTF-8 [[String|string]]}}<br />
| n/a<br />
| [[llSetText]] and [[PRIM_TEXT]]<br />
|}<br />
<br />
== [https://community.secondlife.com/knowledgebase/english/lighting-and-shadows-r331/ Lighting] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Number of projectors rendered at full detail<br />
| n/a<br />
| 2<br />
| Only the 2 projectors closest to an object will cause it to cast shadows. <br />
| [https://community.secondlife.com/knowledgebase/english/lighting-and-shadows-r331/#Projectors Knowledge Base > Lighting > Projectors]<br />
<br />
<br />
|}<br />
<br />
== [[Communication]] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Whisper distance<br />
| n/a<br />
| {{no|10 meters}}<br />
| <code>/whisper</code> as the first few characters in a message can be used in viewer-2-code based viewers in local chat.<br />
| n/a<br />
|-<br />
||Chat distance<br />
| n/a<br />
| {{no|20 meters}}<br />
| text spoken as a "chat" step '''within gestures''' cannot be shouted or whispered. /whisper and /shout ''can'' be used in the "Replace with" field.<br />
| n/a<br />
|-<br />
||Shout distance<br />
| n/a<br />
| {{no|100 meters}}<br />
| <code>/shout</code> as the first few characters in a message can be used in viewer-2-code based viewers in local chat.<br />
| n/a<br />
|-<br />
||Length of a chat message and whether or not it is truncated<br />
| {{no|1 byte or single-byte character}}<br />
| {{no|1024 bytes or single-byte characters}}<br />
| Limit does not apply to instant messages via [[llInstantMessage]] and communication between IM and email, the limit there is 1023 bytes or single-byte characters.<br />
The viewer-to-server communication on ''negative'' channels is truncated to 254 bytes, and on ''positive'' channels, to 1023 bytes. These limits do not affect communication between scripts.<br />
| [[llInstantMessage]]<br />
|-<br />
||Maximum events<br />
| n/a<br />
| {{no|64 events}}<br />
| Events are stored in a 64 bit bitmap. Events happening when the bitmap is full, will get discarded.<br />
| n/a<br />
|-<br />
||Number of offline messages<br />
| n/a<br />
| {{no|Capped at 15 messages, unless the account has a Premium Subscription, in which case the cap raises to 80 messages.}}<br />
| Number of offline messages (involving [[IM|IMs]], inventory offers, group notices, group invitations) received before messages get capped. Note: If autoAcceptNewInventory (debug setting) is set to TRUE (the default is FALSE), then all inventory offers, even above 15 (or 80 in the case of Premium members), go directly to inventory and do not count against the cap on offline messages. <br />
| [[IM]] - [https://community.secondlife.com/blogs/entry/2559-group-limits-update-no-changes-for-basic-members/ Blog Post]<br />
|-<br />
||Length of a properly delivered email reply to an [[IM]]<br />
| n/a<br />
| {{no|1023 bytes or single-byte characters}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Time after which a reply to an [[IM]] can be sent via email.<br />
| {{no|when receiving the IM via email.}}<br />
| {{no|5 days after receiving the offline IM via email.}}<br />
| n/a<br />
| [https://blogs.secondlife.com/community/features/blog/2007/02/06/im-to-e-mail-return-addresses-changing Second Life Blogs]<br />
|-<br />
||Time period for which [[IM|IMs]] are stored within Second Life.<br />
| n/a<br />
| {{no|31 days after receiving the [[IM]]}}<br />
| [[User:Torley_Linden|Torley Linden]] confirmed this with [[User:Kelly_Linden|Kelly Linden]]<br />
| n/a<br />
|-<br />
||Number of [[IM|IMs]] sent by an object within an hour<br />
| n/a<br />
| {{no|5000 per hour}}<br />
| n/a<br />
| n/a<br />
|}<br />
<br />
== [[Gesture]]s ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Shortcut key mappings<br />
| n/a<br />
| {{no|33 unique combinations, since {{K|F2}}&ndash;{{K|F12}} can be used with the {{K|Ctrl}} or {{K|Shift}} modifiers.}}<br />
| n/a<br />
| [[All_keyboard_shortcut_keys]] and [http://community.secondlife.com/t5/English-Knowledge-Base/Keyboard-shortcuts/ta-p/1086557 the knowledge base]<br />
|-<br />
||Chat step length<br />
| n/a<br />
| {{no|127 bytes or single-byte characters}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Wait time<br />
| n/a<br />
| {{no|3600 seconds (which is one hour)}}<br />
| n/a<br />
| n/a<br />
|-<br />
| Maximum steps data<br />
| n/a<br />
| {{no|1000 bytes}} of packed data; saving with more data returns the message "Gesture save failed. This gesture has too many steps. Try removing some steps, then save again." Shorter text, for example, will allow more steps.<br />
| n/a<br />
| n/a<br />
|-<br />
||Length of included assets<br />
| n/a<br />
| see sections for [[#Animation|animation]], [[#Sound|sound]]<br />
| n/a<br />
| n/a<br />
|}<br />
<br />
== [[Group]]s ==<br />
<br />
* '''Maximum number of groups you can belong to:''' 42 for Basic accounts, 70 for Premium accounts.<br />
** After downgrading from a Premium account to a Basic account, you may not join any new groups until you are a member of fewer than 42 groups.<br />
** Roles within groups are sort of like sub-groups. In many cases, you can use them instead of creating new groups.<br />
* '''Minimum number of members in a group:''' 2<br />
** A group with only 1 person for 48 hours will be disbanded (cancelled). Unless the group owns land.<br />
* '''Maximum number of roles allowed in a group:''' 10 (including "Owners" and "Everyone", which cannot be deleted)<br />
* '''Maximum Group Name:''' 35 single-byte characters.<br />
* '''Maximum Group Title:''' 20 single-byte characters.<br />
* '''Maximum Length of a Group Notice:''' 512 single-byte characters.<br />
* '''Maximum Age of a Group Notice:''' 14 days.<br />
<br />
== [[Inventory]] ==<br />
<br />
* '''Maximum number of inventory items that can be sent in a folder:''' 42<br />
** Folders count as items too. This has more to do with packet size limits than cheeky Douglas Adams references.<br />
* '''Maximum number of inventory items that can be contained in a prim:''' 10,000<br />
* '''Maximum characters in an inventory item name:''' 63<br />
* '''Maximum notecard line:''' None, but scripts can only read the first 1024 bytes (was 255 bytes before server version [https://releasenotes.secondlife.com/simulator/2021-10-25.565008.html 2021-10-25.565008]).<br />
* '''Maximum notecard size:''' 65,536 bytes<br />
<!--<br />
* '''Number of items in the Library:''' 1,248 as of 2010-06-17<br />
* '''Number of items in the Library:''' 2,210 as of 2012-11-04 --><br />
* '''Number of items in the Library:''' 3,500 as of 2019-08-10<br />
** Verified by [[How_does_the_Library_work|hiding the Library]] and counting the difference.<br />
* '''Maximum number of inventory items displayed in a single inventory folder:''' Several thousand. <!-- not a specific item count, because the data is variable size, but still useful to document that there is a limit. --><br />
** This was discussed during [http://wiki.secondlife.com/wiki/Simulator_User_Group/Transcripts/2011.03.08] "the folder will load up to the limit number of items, and remaining ones won't show up in the viewer. you still own them, they aren't lost, but they will be hidden until the folder size is reduced."<br />
** There is no specified limit for total avatar inventory, very large folders can be split.<br />
** There was discussion in the Third Party Developers' UG (4/10/2015) meeting about new inventory and login problems from having large numbers of items in a single folder. AISv3 ''removed'' server-side limits on the number of items in a folder. Flat inventories are bad. No one is certain at what number of items in a folder cause a login problem. The fix is to clear the inventory cache (not the viewer cache) and log into a deserted, empty region then move inventory items into folders and sub-folders. - The problem appears at different a number of items depending on your computer and connection speed. Hopefully being on an empty region will give one enough edge to get logged in and do some corrective work before being dropped. If not, you will need to contact support for help. They will divide large folders into smaller groups so you can log in.<br />
<br />
== [[Land]] ==<br />
<br />
* '''Maximum [[Land#Parcel|parcel]] size:''' 65,536 meters²<br />
** Covering a whole region, or square on the World Map.<br />
* '''Minimum parcel size:''' 16 meters²<br />
* '''Maximum parcel name length:''' 63 single-byte characters<br />
* '''Maximum parcel description length:''' 255 characters<br />
* '''Region name length:''' Linden Concierge policy states a minimum of 3 characters, and a maximum of 25 characters (including spaces). See [[Linden Lab Official:Guidelines for Private Region Naming|Guidelines for Private Region Naming]]. However, the technical maximum limit is 35 characters, and exceptions to the concierge policy do exist (e.g [http://maps.secondlife.com/secondlife/Sandbox%20-%20Weapons%20testing%20%28no%20damag/128/128/2 Sandbox - Weapons testing (no damag] and [http://slurl.com/secondlife/X/128/128/24 X])<br />
* '''Ban line height for "no entry" or "pay to access"''' (in other words, "allow public access" is turned off, or "allow group access" is turned on, in the parcel options) is the parcel's ground elevation ''plus'' 50 meters (except, if the region has been set to "Block Parcel Fly Over" in which case the access controls extend to at least 4096 meters). If a user is '''explicitly banned by name''', the height is the parcel's ground elevation ''plus'' 5000 meters. On current viewers this is visible to the full extent.<br />
* '''Maximum prims in a [[Land#Region|region]]:'''<br />
** "Mainland / Full Region" and "Linden Homes / Full Region": 22,500<br />
** Full Regions in private estates: 20,000 with an [https://community.secondlife.com/t5/Featured-News/Upgrade-Your-Full-Private-Region-to-30-000-Land-Impact-Today/ba-p/3086162 option for 30,000]<br />
** Homestead: 5,000<br />
** Openspace : 1,000<br />
:: To check a region's capacity, use <tt>[[llGetEnv]]("region_max_prims")</tt>.<br />
::''(Region types are as found in the General tab of World > About Land, or returned by ''<tt>llGetEnv("region_product_name")</tt>'')''<br />
* '''Maximum auto return value''': Besides "0" (which means ''never''), {{HoverText|999,999|Almost 23 months}} minutes is the highest auto return value.<br />
* '''Terraforming limits:'''<br />
** Most mainland can be raised/lowered by 4 meters (+/-).<br />
** Some mainland cannot be terraformed, including: Bay City regions, Boardman, Brown, De Haro, Horizons, Kama City regions, Nautilus City regions, Nova Albion regions, and Shermerville regions.<br />
** [http://community.secondlife.com/t5/English-Knowledge-Base/Linden-Homes/ta-p/700103 Linden Homes] do not allow terraforming.<br />
** A few, very old mainland Regions like Da Boom have a terraform range of 40 meters (+/-).<br />
** Estate (private island) terraformability is settable to a maximum of 100 meters (+/-) by the estate owner or managers.<br />
* '''Maximum water height:''' 100 meters using inworld controls, 255 meters by using a *.raw file upload.<br />
** Region water height is usually 20 meters, and adjacent regions should have the same water height, or else they will look discontinuous.<br />
* '''Maximum terrain height:''' 255 meters using inworld controls (mainland limit), 510 meters by using a *.raw file upload.<br />
* '''Miscellaneous estate limits:''' You can have a maximum of 15 estate managers, 500 allowed Residents, 63 allowed groups, and 500 banned Residents.<br />
** See World menu > Region/Estate > Estate tab.<br />
* '''Maximum number of agents'''<br />
** Full region: 100 (Typically set to 40 on mainland, 55 on Linden Homes regions, but this does vary. Some meeting areas have this set to 60 and higher.)<br />
*** Recent server performance improvements make regions with 60 agents in them perform quite well.<br />
** [[Land#Homestead|Homestead]]: 20<br />
** [[Land#Openspace|Openspace]]: 10<br />
* '''Freeze Time:''' Land owners can [[freeze]] other Residents for up to 30 seconds. Members of land owning groups can also be granted this ability.<br />
* '''Minimum parcel that can be listed in Places or All search:''' 144 meters² <!-- 128 and under are disabled --><br />
* '''Minimum parcel that can be listed in Events:''' 512 meters²<br />
* '''Maximum altitude for event listings:''' 768 meters ({{JIRA|WEB-814}})<br />
* '''Maximum heights that objects can be seen on the [[World Map]]:''' 400.005m<br />
<br />
== [[Mesh]] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Number of vertices<br />
| n/a<br />
| {{no|65536 vertices per LOD}}<br />
| per [[mesh]] - See [[Talk:Limits#Mesh_Limits|discussion page]]<br />
| n/a<br />
|-<br />
||COLLADA file size<br />
| n/a<br />
| {{no|8 MB}}<br />
| Maximum mesh asset size after compression, roughly equivalent to a 256 MB Raw COLLADA file.<br />
| n/a<br />
|-<br />
||Bone influence weights per vertex<br />
| n/a<br />
| {{no|4}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Bone influence weights per mesh<br />
| n/a<br />
| {{no|110}}<br />
| some folk have reported needing to go as low as about 99 in rare cases<br />
| n/a<br />
|-<br />
||Number of materials per mesh<br />
| n/a<br />
| {{no|8}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Number of materials per face<br />
| n/a<br />
| {{no|1}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Physics weight for a vehicle<br />
| n/a<br />
| {{no|32.0}}<br />
| n/a<br />
| n/a<br />
|-<br />
||Maximum number of triangles for Animesh<br />
| n/a<br />
| {{no|100,000}}<br />
| Server uses estimated triangles(streaming cost calculated), not visual triangles.<br />
| [[Animesh User Guide|Animesh_User_Guide]]<br />
|}<br />
<br />
===User Found Temporary Mesh limits:===<br />
''Because of an apparent bug in the importer stay within these limits.''<br />
* 174,752 triangles, beyond which additional triangles will appear as holes.<br />
* The 64k vertices per material is pre-empted by a limit of 21,844 triangles per material, which is presently reported as {{Jira|BUG-1001}}. (4/2014 - See [[Talk:Limits#Mesh_Limits|discussion page]])<br />
<br />
<br />
:: The import process will continue making new materials beyond 8 x 21,844 (=174,752) triangles, but the extra triangles then get dropped by the limitation to 8 materials, causing holes in the resulting object. Over the 21,844 triangle limit, the vertex count will start to climb steeply, even with smooth shading, because the materials get highly interspersed. So the same vertices have to appear in multiple material lists. So the moral of the story is to stay below 21,844 triangles per material, for now, if you want to avoid some unexpected effects.<br />
<br />
::Since viewer release 3.8.4, processing of meshes in the Collada file that have faces assigned to more than 8 materials has changed. Instead of simply dropping the extra material faces, the uploader now creates a new object to accommodate them. The result is that the single mesh is divided into multiple objects (prims) in a linkset. Thus the limitation to 8 materials is removed as far as input is concerned, but still applies to each of the resulting linked objects actually uploaded. As a consequence it is now possible to upload a mesh with more than 174,752 triangles, although it will be divided into multiple objects.<br />
<br />
== Misc. ==<br />
<br />
*'''[https://secondlife.com/currency/describe-limits.php Billing and Trading Limits]''' - Includes [https://secondlife.com/whatis/economy-market.php LindeX] currency exchange limits.<br />
<br />
== Navigation ==<br />
<br />
[[File:Max Alt.jpg|thumb|right|435px|'''Height counter error above 2147483647 meters''']]<br />
* '''Absolute height limit:''' [http://en.wikipedia.org/wiki/2147483647#2147483647_in_computing 2147483647]&nbsp;=&nbsp;2<sup>31</sup>&nbsp;−&nbsp;1 meters, which causes the altitude counter to roll over. Altitudes well below this cause graphics errors probably due to limited floating point number precision.<br />
* '''Highest z-value of an [[SLurl]], that will still teleport you to a positive altitude:''' 4096<br />
** This used to be much higher, but is clamped in late model viewers.<br />
<br />
== [[Profile]] ==<br />
<br />
Each 7-bit ASCII character is encoded in one byte. International characters might need more bytes. When pasting text instead of typing, you can get in one byte more into each of the below.<br />
<br />
* '''2nd Life tab's About field''' - 510 bytes<br />
* '''Picks tab''' - 10 picks with 1022 bytes each<br />
* '''1st Life tab's Info field''' - 253 bytes<br />
* '''Classified tab''' - 100 listings with x bytes each<br />
* '''My Notes''' - 1022 bytes<br />
<br />
== Performance ==<br />
<br />
* '''Healthy Viewer FPS''' - Generally, FPS above 15 is good. The higher it gets, the smoother. You can check via [[Advanced]] menu > Performance Tools > Lag Meter, or for more advanced usage, see Advanced > Performance Tools > Statistics Bar.<br />
* '''Avatar Rendering Cost scores''' - [[Avatar Rendering Cost|Learn all about it!]]<br />
<br />
== [[Scripting]] == <!-- Important scripting limits should be placed here, less important ones should be in the articles Caveats or Specification sections --><br />
<br />
* '''Height at which scripts reactivate on a no-script parcel''' - 50 m above terrain mesh. Scripted objects that take controls will keep running when you fly down or enter a no-script parcel. (If scripts are disabled in the region debug panel, they will not run at any height.)<br />
* '''Maximum height where scripts can run''' - none, as long as the object remains rezzed or attached.<br />
* '''Maximum script source code size''' - 65536 single byte characters (that's a viewer limit and can be changed in the config file 'panel_script_ed.xml').<br />
* '''Maximum script memory size (LSO)''' - 16384 bytes.<br />
* '''Maximum script memory size (Mono)''' - 65536 bytes (the maximum memory available to Mono scripts can be constrained via [[llSetMemoryLimit]]).<br />
* '''Maximum active [[llListen|listeners]] per script''' - 65.<br />
** '''Usable channel for each listener''' - ''min.'' -2147483648, ''max.'' 2147483647, including the following special channels: [[PUBLIC_CHANNEL]] ''and'' [[DEBUG_CHANNEL]].<br />
* For specific scripting limits, look up calls in the '''[[LSL Portal]]'''.<br />
<br />
== [[Sound]] ==<br />
<br />
{| class="sortable" width="100%" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Limit affects'''<br />
! '''Lower limit'''<br />
! '''Upper limit'''<br />
! '''Comment'''<br />
! '''More coverage'''<br />
|-<br />
||Sound length<br />
| n/a<br />
| {{no|10.00000 seconds (441,000 samples)}}<br />
| 441,001 samples (10.00002 seconds) won't work. You're advised to cut longer sounds into 9.9-second-pieces.<br />
| n/a<br />
|}<br />
<br />
== [[Textures]] ==<br />
* '''[http://en.wikipedia.org/wiki/Aspect_ratio Aspect ratios]''' of profile, place, etc. pictures — all of these were measured at UI size (Edit menu > Preferences > General tab > UI Size) = 1.000:<br />
<br />
=== Second Life Viewer 3.6 ===<br />
<br />
* '''Search > Classifieds thumbnail''' - ~3:2 (101&times;69 pixels)<br />
* '''Search > Classifieds expanded''' - ~4:3 (159&times;120 pixels)<br />
* '''Search > Classifieds expanded > More Info''' - native aspect ratio<br />
* '''Search > Destination Guide thumbnail''' - ~3:2 (101&times;69 pixels) <br />
* '''Search > Destination Guide expanded''' - ~4:3 (159&times;120 pixels)<br />
* '''Search > People''' - 1:1 (100&times;100 pixels)<br />
* '''Search > Places expanded''' ~4:3 (159&times;120 pixels)<br />
* '''Place Profile''' - ~3:2 (290&times;197 pixels)<br />
* '''About Land > Options tab''' - ~4:3 (195&times;150 pixels)<br />
* '''Profile > Picture''' - native aspect ratio; thumbnail cropped to 72&times;72 pixels; zoomed uncropped up to 300&times;300 pixels<br />
* '''Profile > Real world picture''' - native aspect ratio; thumbnail cropped to 45&times;45 pixels; zoomed uncropped up to 300&times;300 pixels<br />
* '''Profile > Picks thumbnail''' - 4:3 (60&times;45 pixels)<br />
* '''Profile > Pick expanded''' - 4:3 (320&times;240 pixels)<br />
<br />
=== 1.x Series Viewers ===<br />
(official Viewer up to 1.23.5, still used by some [[Alternate viewers|Third Party Viewers]])<br />
* '''Search > All for "Classifieds", "People", and "Places"''' - 4:3 (256&times;192 pi&times;els)<br />
* '''Search > Places and Classified tabs''' - ~7:5 (398&times;282 pixels)<br />
* '''Search > Land tab''' - ~7:5 (358&times;252 pixels)<br />
* '''Profile > 2nd Life tab''' - ~4:3 (178&times;133 pixels)<br />
* '''Profile > Picks tab''' - 16:9 (288&times;162 pixels)<br />
* '''Profile > 1st Life tab''' - 1:1 (133&times;133 pixels)<br />
* '''Profile > Classifieds tab''' - ~3:2 (206&times;137 pixels)<br />
* '''Profile > Web tab''' - 1:1 (400&times;400 pixels)<br />
** A scrollbar uses 15 pixels on the right-hand side.<br />
* '''About Land > Options tab''' - ~3:2 (178&times;117 pixels)<br />
* '''Group Information > General tab's "Group Insignia"''' - 1:1 (126&times;126 pixels)<br />
** Some of these textures are shared (for example, Search > All place pages, Search > Places, and About Land > Options use the same image), so you should pick a well-balanced ratio and size.<br />
** [[Texture_aspect_ratios|Learn how to get correct texture aspect ratios when editing images.]]<br />
<br />
=== All Viewers ===<br />
<br />
* '''Maximum texture size''' - 1024&times;1024 pixels<br />
** All Second Life textures are constrained to [http://en.wikipedia.org/wiki/Power_of_2 powers of 2] (e.g., 128, 256, 512).<br />
** Some textures inworld have a resolution as high as 2048&times;2048; this is due to a previous limit that was higher.<br />
** We strongly recommend you use as small textures as possible because larger ones consume more memory and take substantially longer to load.<br />
** Where large textures are being forced by import to only 512&times;512, lower your ...> Preferences >...> UI Size under 1.0, to increase import size to the max 1024&times;1024.<br />
<br />
* '''Minimum texture size''' - 4&times;4 pixels<br />
** This means that there are nine possible image dimensions: 4, 8, 16, 32, 64, 128, 256, 512, and 1024 pixels, either horizontal or vertical.<br />
<br />
[[Category:Creation]] [[Category:Tutorials]] [[Category:Lists]]<br />
<br />
=== Notes ===<br />
In general 1 byte is enough to contain one character.</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlSetCameraParams&diff=1210371LlSetCameraParams2021-11-26T17:08:30Z<p>Tapple Gao: added that CAMERA_FOCUS always matches avatar's llGetPos()</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{Issues/SCR-325}}{{Issues/SCR-326}}{{Issues/SCR-327}}{{LSL_Function/permission|PERMISSION_CONTROL_CAMERA}}<br />
|func_id=313|func_sleep=0.0|func_energy=10.0<br />
|func=llSetCameraParams<br />
|p1_type=list|p1_subtype=instructions|p1_name=rules|p1_desc=Format is [ rule1, data1, rule2, data2 . . . rulen, datan ]<br />
|func_footnote<br />
|func_desc=Sets multiple camera parameters at once.<br />
|return_text<br />
|spec<br />
|caveats=*Camera control currently (server 1.38) only supported for attachments and objects on which you are sitting. An attempt otherwise will result in an error being shouted on [[DEBUG_CHANNEL]].<br />
*Scripted camera parameters will not set for the agent if the last controls they used were their camera controls. Manual camera control will override set parameters too.<br />
*A CAMERA_FOCUS_OFFSET of <0, 0, 0> will always look at the same position as returned by llGetPos() for the avatar<br />
**When seated, this is also the position of "Avatar Center" when hover height is 0<br />
**When standing, this has a shape-dependent z-offset from "Avatar Center". (currently investigating [[User:Tapple Gao|Tapple Gao]] ([[User talk:Tapple Gao|talk]]))<br />
|examples=<br />
<br />
You can either set the camera in region relative coordinates or you can make the camera follow your avatar.<br />
<br />
'''Region relative coordinates, an example:'''<br />
<br />
<source lang="lsl2">lookAtMe( integer perms )<br />
{<br />
if ( perms & PERMISSION_CONTROL_CAMERA )<br />
{<br />
vector camPos = llGetPos() + (relCamP * llGetRot() * turnOnChair) ;<br />
vector camFocus = llGetPos() ;<br />
llClearCameraParams(); // reset camera to default<br />
llSetCameraParams([<br />
CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive<br />
CAMERA_FOCUS, camFocus, // region relative position<br />
CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)<br />
CAMERA_POSITION, camPos, // region relative position<br />
CAMERA_POSITION_LOCKED, TRUE // (TRUE or FALSE)<br />
]);<br />
}<br />
}</source><br />
Note that Focus and Position are both locked. This first example makes the camera look at ''camFocus'' from ''camPos''. <br />
<br />
'''Camera follow avatar, an example:'''<br />
<br />
<source lang="lsl2">lookAtMe( integer perms )<br />
{<br />
if ( perms & PERMISSION_CONTROL_CAMERA )<br />
{<br />
llClearCameraParams(); // reset camera to default<br />
llSetCameraParams([<br />
CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive<br />
CAMERA_BEHINDNESS_ANGLE, 30.0, // (0 to 180) degrees<br />
CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds<br />
CAMERA_DISTANCE, 10.0, // ( 0.5 to 10) meters<br />
//CAMERA_FOCUS, <0,0,5>, // region relative position<br />
CAMERA_FOCUS_LAG, 0.05 , // (0 to 3) seconds<br />
CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)<br />
CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters<br />
CAMERA_PITCH, 10.0, // (-45 to 80) degrees<br />
//CAMERA_POSITION, <0,0,0>, // region relative position<br />
CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds<br />
CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)<br />
CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters<br />
CAMERA_FOCUS_OFFSET, <2.0, 0.0, 0.0> // <-10,-10,-10> to <10,10,10> meters<br />
]);<br />
}<br />
}<br />
</source><br />
Note that in this second example Focus and Position are NOT locked and not even set. This is appropriate for making the camera follow a pilot on a vehicle.<br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llClearCameraParams]]}}<br />
{{LSL DefineRow||[[llGetCameraPos]]}}<br />
{{LSL DefineRow||[[llGetCameraRot]]}}<br />
|also_events<br />
|also_tests=<br />
{{LSL DefineRow||[[llSetCameraParams Test]]}}<br />
|also_articles=<br />
{{LSL DefineRow||[[FollowCam]]}}<br />
|notes<br />
|cat1=Camera<br />
|cat2<br />
|cat3<br />
|cat4<br />
|constants={{{!}} class="sortable" {{Prettytable|style=margin-top:0;}}<br />
{{!}}- {{Hl2}}<br />
! Rule<br />
!<br />
! Parameter<br />
!class="unsortable"{{!}} Default<br />
!class="unsortable"{{!}} Value Range<br />
!class="unsortable"{{!}} Description<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_ACTIVE|integer|12}}<br />
{{!}} {{#var:cvalue}}&nbsp;&nbsp;<br />
{{!}} [[integer]]&nbsp;isActive<br />
{{!}} {{LSL Const|FALSE|integer|0}}<br />
{{!}} {{LSL Const|TRUE|integer|1}} or {{LSL Const|FALSE|integer|0}}<br />
{{!}} Turns on or off [[script|scripted]] control of the camera.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_BEHINDNESS_ANGLE|integer|8}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;degrees<br />
{{!}} 10.0<br />
{{!}} 0 to 180<br />
{{!}} Sets the angle in degrees within which the camera is not constrained by changes in target rotation.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_BEHINDNESS_LAG|integer|9}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;seconds<br />
{{!}} 0.0<br />
{{!}} 0 to 3<br />
{{!}} Sets how strongly the camera is forced to stay behind the target if outside of behindness angle.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_DISTANCE|integer|7}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;meters<br />
{{!}} 3.0<br />
{{!}} 0.5 to 50<br />
{{!}} Sets how far away the camera wants to be from its target.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_FOCUS|integer|17}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[vector]]&nbsp;position<br />
{{!}} n/a<br />
{{!}} n/a<br />
{{!}} Sets camera focus (target position) in [[Viewer coordinate frames#Region|region coordinates]].<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_FOCUS_LAG|integer|6}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;seconds<br />
{{!}} 0.1<br />
{{!}} 0 to 3<br />
{{!}} How much the camera lags as it tries to aim towards the target.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_FOCUS_LOCKED|integer|22}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[integer]]&nbsp;isLocked<br />
{{!}} {{LSL Const|FALSE|integer|0}}<br />
{{!}} {{LSL Const|TRUE|integer|1}} or {{LSL Const|FALSE|integer|0}}<br />
{{!}} Locks the camera focus so it will not move.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_FOCUS_OFFSET|integer|1}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[vector]]&nbsp;[[meter|meters]]<br />
{{!}} <0.0,0.0,0.0><br />
{{!}} <-10,-10,-10> to <10,10,10><br />
{{!}} Adjusts the camera focus [[position]] relative to the target.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_FOCUS_THRESHOLD|integer|11}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;meters<br />
{{!}} 1.0<br />
{{!}} 0 to 4<br />
{{!}} Sets the radius of a sphere around the camera's target position within which its focus is not affected by target motion.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_PITCH|integer|0}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;degrees<br />
{{!}} 0.0<br />
{{!}} -45 to 80<br />
{{!}} Adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance; analogous to 'incidence'."<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_POSITION|integer|13}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[vector]]&nbsp;position<br />
{{!}} n/a<br />
{{!}} n/a<br />
{{!}} Sets camera position in [[Viewer coordinate frames#Region|region coordinates]].<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_POSITION_LAG|integer|5}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;seconds<br />
{{!}} 0.1<br />
{{!}} 0 to 3<br />
{{!}} How much the camera lags as it tries to move towards its 'ideal' position.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_POSITION_LOCKED|integer|21}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[integer]]&nbsp;isLocked<br />
{{!}} {{LSL Const|FALSE|integer|0}}<br />
{{!}} {{LSL Const|TRUE|integer|1}} or {{LSL Const|FALSE|integer|0}}<br />
{{!}} Locks the camera position so it will not move.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_POSITION_THRESHOLD|integer|10}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;meters<br />
{{!}} 1.0<br />
{{!}} 0 to 4<br />
{{!}} Sets the radius of a sphere around the camera's ideal position within which it is not affected by target motion.<br />
{{!}}}<br />
|}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlSetCameraParams&diff=1210370LlSetCameraParams2021-11-26T16:46:09Z<p>Tapple Gao: Wrote what I currently know about CAMERA_FOCUS_OFFSET</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{Issues/SCR-325}}{{Issues/SCR-326}}{{Issues/SCR-327}}{{LSL_Function/permission|PERMISSION_CONTROL_CAMERA}}<br />
|func_id=313|func_sleep=0.0|func_energy=10.0<br />
|func=llSetCameraParams<br />
|p1_type=list|p1_subtype=instructions|p1_name=rules|p1_desc=Format is [ rule1, data1, rule2, data2 . . . rulen, datan ]<br />
|func_footnote<br />
|func_desc=Sets multiple camera parameters at once.<br />
|return_text<br />
|spec<br />
|caveats=*Camera control currently (server 1.38) only supported for attachments and objects on which you are sitting. An attempt otherwise will result in an error being shouted on [[DEBUG_CHANNEL]].<br />
*Scripted camera parameters will not set for the agent if the last controls they used were their camera controls. Manual camera control will override set parameters too.<br />
*When seated, CAMERA_FOCUS_OFFSET of <0, 0, 0> will look at position the avatar is seated at, which is also the position of "Avatar Center" when hover height is 0<br />
*When standing, CAMERA_FOCUS_OFFSET of <0, 0, 0> will look at a position that is shape-dependent (currently investigating [[User:Tapple Gao|Tapple Gao]] ([[User talk:Tapple Gao|talk]]))<br />
|examples=<br />
<br />
You can either set the camera in region relative coordinates or you can make the camera follow your avatar.<br />
<br />
'''Region relative coordinates, an example:'''<br />
<br />
<source lang="lsl2">lookAtMe( integer perms )<br />
{<br />
if ( perms & PERMISSION_CONTROL_CAMERA )<br />
{<br />
vector camPos = llGetPos() + (relCamP * llGetRot() * turnOnChair) ;<br />
vector camFocus = llGetPos() ;<br />
llClearCameraParams(); // reset camera to default<br />
llSetCameraParams([<br />
CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive<br />
CAMERA_FOCUS, camFocus, // region relative position<br />
CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)<br />
CAMERA_POSITION, camPos, // region relative position<br />
CAMERA_POSITION_LOCKED, TRUE // (TRUE or FALSE)<br />
]);<br />
}<br />
}</source><br />
Note that Focus and Position are both locked. This first example makes the camera look at ''camFocus'' from ''camPos''. <br />
<br />
'''Camera follow avatar, an example:'''<br />
<br />
<source lang="lsl2">lookAtMe( integer perms )<br />
{<br />
if ( perms & PERMISSION_CONTROL_CAMERA )<br />
{<br />
llClearCameraParams(); // reset camera to default<br />
llSetCameraParams([<br />
CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive<br />
CAMERA_BEHINDNESS_ANGLE, 30.0, // (0 to 180) degrees<br />
CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds<br />
CAMERA_DISTANCE, 10.0, // ( 0.5 to 10) meters<br />
//CAMERA_FOCUS, <0,0,5>, // region relative position<br />
CAMERA_FOCUS_LAG, 0.05 , // (0 to 3) seconds<br />
CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)<br />
CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters<br />
CAMERA_PITCH, 10.0, // (-45 to 80) degrees<br />
//CAMERA_POSITION, <0,0,0>, // region relative position<br />
CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds<br />
CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)<br />
CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters<br />
CAMERA_FOCUS_OFFSET, <2.0, 0.0, 0.0> // <-10,-10,-10> to <10,10,10> meters<br />
]);<br />
}<br />
}<br />
</source><br />
Note that in this second example Focus and Position are NOT locked and not even set. This is appropriate for making the camera follow a pilot on a vehicle.<br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llClearCameraParams]]}}<br />
{{LSL DefineRow||[[llGetCameraPos]]}}<br />
{{LSL DefineRow||[[llGetCameraRot]]}}<br />
|also_events<br />
|also_tests=<br />
{{LSL DefineRow||[[llSetCameraParams Test]]}}<br />
|also_articles=<br />
{{LSL DefineRow||[[FollowCam]]}}<br />
|notes<br />
|cat1=Camera<br />
|cat2<br />
|cat3<br />
|cat4<br />
|constants={{{!}} class="sortable" {{Prettytable|style=margin-top:0;}}<br />
{{!}}- {{Hl2}}<br />
! Rule<br />
!<br />
! Parameter<br />
!class="unsortable"{{!}} Default<br />
!class="unsortable"{{!}} Value Range<br />
!class="unsortable"{{!}} Description<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_ACTIVE|integer|12}}<br />
{{!}} {{#var:cvalue}}&nbsp;&nbsp;<br />
{{!}} [[integer]]&nbsp;isActive<br />
{{!}} {{LSL Const|FALSE|integer|0}}<br />
{{!}} {{LSL Const|TRUE|integer|1}} or {{LSL Const|FALSE|integer|0}}<br />
{{!}} Turns on or off [[script|scripted]] control of the camera.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_BEHINDNESS_ANGLE|integer|8}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;degrees<br />
{{!}} 10.0<br />
{{!}} 0 to 180<br />
{{!}} Sets the angle in degrees within which the camera is not constrained by changes in target rotation.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_BEHINDNESS_LAG|integer|9}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;seconds<br />
{{!}} 0.0<br />
{{!}} 0 to 3<br />
{{!}} Sets how strongly the camera is forced to stay behind the target if outside of behindness angle.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_DISTANCE|integer|7}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;meters<br />
{{!}} 3.0<br />
{{!}} 0.5 to 50<br />
{{!}} Sets how far away the camera wants to be from its target.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_FOCUS|integer|17}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[vector]]&nbsp;position<br />
{{!}} n/a<br />
{{!}} n/a<br />
{{!}} Sets camera focus (target position) in [[Viewer coordinate frames#Region|region coordinates]].<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_FOCUS_LAG|integer|6}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;seconds<br />
{{!}} 0.1<br />
{{!}} 0 to 3<br />
{{!}} How much the camera lags as it tries to aim towards the target.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_FOCUS_LOCKED|integer|22}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[integer]]&nbsp;isLocked<br />
{{!}} {{LSL Const|FALSE|integer|0}}<br />
{{!}} {{LSL Const|TRUE|integer|1}} or {{LSL Const|FALSE|integer|0}}<br />
{{!}} Locks the camera focus so it will not move.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_FOCUS_OFFSET|integer|1}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[vector]]&nbsp;[[meter|meters]]<br />
{{!}} <0.0,0.0,0.0><br />
{{!}} <-10,-10,-10> to <10,10,10><br />
{{!}} Adjusts the camera focus [[position]] relative to the target.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_FOCUS_THRESHOLD|integer|11}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;meters<br />
{{!}} 1.0<br />
{{!}} 0 to 4<br />
{{!}} Sets the radius of a sphere around the camera's target position within which its focus is not affected by target motion.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_PITCH|integer|0}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;degrees<br />
{{!}} 0.0<br />
{{!}} -45 to 80<br />
{{!}} Adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance; analogous to 'incidence'."<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_POSITION|integer|13}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[vector]]&nbsp;position<br />
{{!}} n/a<br />
{{!}} n/a<br />
{{!}} Sets camera position in [[Viewer coordinate frames#Region|region coordinates]].<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_POSITION_LAG|integer|5}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;seconds<br />
{{!}} 0.1<br />
{{!}} 0 to 3<br />
{{!}} How much the camera lags as it tries to move towards its 'ideal' position.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_POSITION_LOCKED|integer|21}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[integer]]&nbsp;isLocked<br />
{{!}} {{LSL Const|FALSE|integer|0}}<br />
{{!}} {{LSL Const|TRUE|integer|1}} or {{LSL Const|FALSE|integer|0}}<br />
{{!}} Locks the camera position so it will not move.<br />
{{!}}- <br />
{{!}} {{LSL Const|CAMERA_POSITION_THRESHOLD|integer|10}}<br />
{{!}} {{#var:cvalue}}<br />
{{!}} [[float]]&nbsp;meters<br />
{{!}} 1.0<br />
{{!}} 0 to 4<br />
{{!}} Sets the radius of a sphere around the camera's ideal position within which it is not affected by target motion.<br />
{{!}}}<br />
|}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&diff=1210351Category:LSL Library2021-10-24T17:24:16Z<p>Tapple Gao: added landmark2slurl</p>
<hr />
<div>{{LSL Header|ml=*}}{{RightToc}}<br />
==Script Library==<br />
<br />
<div id="box"><br />
<div style="padding: 0.5em 0.5em 1.5em"><br />
NOTE: Please add your scripts to this page and then add them to a category on the [[:Category:LSL Categorized Library|Categorized Library]] page.<br />
<br />
Come to this page to see complex examples that show how to combine parts of LSL.<br />
<br />
Go to the [[:Category:LSL Examples|LSL Examples]] page to see brief examples of how to use parts of LSL.<br />
<br />
Why collect complex examples here? Well, ...<br />
<br />
There is a treasure trove of user developed scripts that have become hard to find over time throughout Second Life's web server revisions and redesigns. The [http://community.secondlife.com/t5/Community-General/Upgrading-the-Forums/bc-p/77385 Huge Leap] to the new [http://www.jivesoftware.com/ Jive software], while traumatic and disruptive, has failed to dispose of what's come before at the moment of your reading. These valuable community generated resources do indeed still remain and can be browsed/retrieved from several disjointed and disparate locations. While some links may point to duplicated, revised, or downright ancient wisdom, you may derive some enlightened perspective researching their hard won, timely solutions we encounter day to day.<br />
<br />
# [[Old forum Scripting Library index| Old Forums -Scripting Library index (wiki)]],<br />
# [http://community.secondlife.com/t5/Scripting/bd-p/2108 Old Forums -Scripting Forum Archive],<br />
# [http://forums-archive.secondlife.com/15/1.html Old Forums -Scripting Library],<br />
# [http://community.secondlife.com/t5/Scripting-Library/bd-p/2122 new Forums -Archives > Scripting Library],<br />
# [http://community.secondlife.com/t5/LSL-Scripting-Library/bd-p/LSLScriptingLibrary new Forums -LSL Library].<br />
<br />
<br />
The wiki medium is well-suited for a script library due to its revision based historical foundation. If you feel inclined to release your scripts to the entire community, there's no better place to preserve your work/love/energy/gift as a unified and cohesive repository. Feel free to add your script page links here as well as adding it to the [[:Category:LSL Categorized Library|Categorized Library]].<br />
</div><br />
</div><br />
<br />
<div id="box"><br />
<br />
== Rules for posting: ==<br />
<div style="padding: 0.5em"><br />
#Your script must be tested and working. If it's not, stick it in your user-space until it is. This is a list of working, usable scripts.<br />
#Add a link to your script's page here. Link back to this page from your script's page. Start your page with <code><nowiki>{{LSL Header}}</nowiki></code>.<br />
#Do not add scripts that duplicate the same functionality as an existing script or built in {{LSLGC|Functions|function}}. If yours does, explain why.<br />
#Do not list simple scripts here. Include those among the [[:Category:LSL Examples|LSL Examples]] instead.<br />
</div></div><br />
<br />
<div id="box"><br />
<br />
==LSL Script Library==<br />
<br />
{| class="sortable" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Name'''<br />
! '''Creator'''<br />
! '''Description'''<br />
|-<br />
||[[User:Daemonika_Nightfire/Scripts/AppLinks|<nowiki>secondlife:///app/...</nowiki>]]<br />
||[[User:Daemonika Nightfire|Daemonika Nightfire]]<br />
||useful <nowiki>secondlife:///app/...</nowiki> commands for scripts, local chat, instant message, group chat, group notice & profiles.<br />
|-<br />
|[[Teleporter_Anywhere]]<br />
|{{User|Luxen Resident}}<br />
|Zx Teleporter Anywhere v5.1.<br />
|-<br />
|[[Ultimate_Radar]]<br />
|{{User|Luxen Resident}}<br />
|Zx Ultimate Radar v5.<br />
|-<br />
|[[Language_Scanner]]<br />
|{{User|Luxen Resident}}<br />
|Zx Language Scanner v5.<br />
|-<br />
|[[Visitor_Counter_Tracker]]<br />
|{{User|Luxen Resident}}<br />
|Zx Visitor Counter - Tracker v3.1.<br />
|-<br />
|[[Notecard_Configuration_Reader_by_Maddox_Deluxe]]<br />
|{{User2|Maddox Deluxe}}<br />
|Notecard Multi-line Entries Configuration Reader v1.6.<br />
|-<br />
|[[User:Yumi Murakami/Addiction Moderator|Addiction Moderator and World Clock]]<br />
|{{User|Yumi Murakami}}<br />
|Keep tabs on usage of SL and easily share local times with other users.<br />
|-<br />
|[[User:Yumi Murakami/Bijocam And Other Camera Scripts|Bijocam and Other Camera Scripts]]<br />
|{{User|Yumi Murakami}}<br />
|Various camera control systems for machinima, security, and other effects.<br />
|-<br />
|[[Recent Avatar Scanner]]<br />
|[[User:Ackley Bing|Ackley]]<br />
|Recent Avatar Scanner notifies you as it collects avatar names. Touch it to see a list of recently collected names.<br />
|-<br />
|[[Target Crosshair HUD]]<br />
|[[User:Ackley Bing|Ackley]]<br />
|A 2 prim HUD with crosshair targets nearby players names, profiles and user key<br />
|-<br />
|[[User:Ackley Bing/Basic Sim Status Button Indicator HUD|Basic Sim Status Button Indicator HUD]]<br />
|[[User:Ackley Bing|Ackley]]<br />
|A single prim HUD. Color indicates sim status changes.<br />
|-<br />
|[[Basic Target Scanner HUD]]<br />
|[[User:Ackley Bing|Ackley]]<br />
|A single prim HUD. Scrolls through nearby players names, photos and user key.<br />
|-<br />
<br />
|[[StringIsNum|(Function) StringIsNum]]<br />
|{{User|Zion Tristan}}<br />
|A User Made Function to return TRUE if a string based input consists entirely of a whole number, and return FALSE otherwise.<br />
|-<br />
|[[Remove all scripts from a linkset]]<br />
|{{User2|Dahlia Orfan}}<br />
|Remove all scripts from a linkset.<br />
|-<br />
|[[RLV Viewer Titler]]<br />
||[[User:Jenna_Felton|Jenna_Felton]]<br />
|Titler displaying viewer and it's version, revealed via RLV interface.<br />
|-<br />
|[[Sim Restart Notifyer]]<br />
||[[User:Jenna_Felton|Jenna_Felton]]<br />
|On region restart, notifyes registered residents about the sim is online and the current sim version<br />
|-<br />
|[[Script Vitality plug-in]]<br />
||[[User:Jenna_Felton|Jenna_Felton]]<br />
|Uses vehicle technology to allow scripts (in same prim) to run in 'dead', i.e. no-script areas.<br />
|-<br />
|[[Chat Painter]]<br />
||[[User:Jenna_Felton|Jenna_Felton]]<br />
|Changes texture and collor properties of named prims in a linkset by using chat commands.<br />
|-<br />
|[[1st necessity of SL]]<br />
|{{User|Beer Dailey}}<br />
|Monitors for avatars and (de)activates scripts states to control script performance/lag.<br />
|-<br />
|[[3D Radar]]<br />
|{{User|Jesse Barnett}}<br />
|Rezzes a ball for each avatar in range. Each ball tracks its own AV and displays distance.<br />
|-<br />
|[[RegionSitTeleport]]<br />
|{{User|Vincent Nacon}}<br />
|A very simple and clean sit/unsit teleporter.<br />
|-<br />
|[[Avatar Position Adjustement to Avatar Height When Sitting]]<br />
|{{User|Cay Trudeau}}<br />
|Animation Adjustement According to Avatar Height. A simple snippet to calculate avatar position upwards.<br />
|-<br />
|[[AbcText]]<br />
|{{User|Ange Capalini}}<br />
|EXPERIMENTAL Hyper low prim Display. only 2 prims for 25char.<br />
|-<br />
|[[Access (NewAge)]]<br />
|{{User|Asia Snowfall}}<br />
|An easy to use script for permissions on who can use the script, Public/Group/Owner<br />
|-<br />
|[[User:Daemonika_Nightfire/Scripts/Access_Tutorial_EN|Access Tutorial (EN)]]<br />
|{{User|Daemonika Nightfire}}<br />
|Short examples about permission to executable commands.<br />
|-<br />
|[[Aim Detection]]<br />
|{{User2|Han Shuffle|Dugley Reanimator}}<br />
|Monitors for avatars and reports back to owner about who is aiming at them.<br />
|-<br />
|[[User:Daemonika_Nightfire/Scripts/Anti_copy_trans|Anti (copy & transfer)]]<br />
|{{User|Daemonika Nightfire}}<br />
|This funktion allows you to give away scripts with copy & transfer permissions and force the reseller to change the permission.<br />
|-<br />
|[[User:Daemonika_Nightfire/Scripts/Anti_Rezz|Anti Rezz]]<br />
|{{User|Daemonika Nightfire}}<br />
|This script delete the complete object by rezzing on ground and detach it after 5 minutes from avatar. <br />
|-<br />
|[[AnkleLock]]<br />
|[[Wizardry and Steamworks]]<br />
|An ankle lock script and attached animation to fix your displaced shoes. This will help if your shoes look displaced when you sit in certain poses or when your animation overrider is active.<br />
|-<br />
|[[AntiDelay Node]]<br />
|{{User|Xaviar Czervik}}<br />
|Uses [[llMessageLinked]] to stop those pesky delays.<br />
|-<br />
|[[Artillery]]<br />
|[[Wizardry and Steamworks]]<br />
|An artillery gun script, performing the necessary calculations based on a user-chosen velocity, in order to hit a designated target avatar.<br />
|-<br />
|[[AO Overriding Pose Ball]]<br />
|{{User|Jesse Barnett}}<br />
|No more turning your AO off and on when you sit down<br />
|-<br />
|[[ARCFOUR Strong Encryption Implementation]]<br />
|{{User2|Nekow42 Zarf}}<br />
|An LSL implementation of ARCFOUR, the most popular stream cipher still in use.<br />
|-<br />
|[[Assembly Programming Language|Assembly-Like Programming Language]]<br />
|{{User|Xaviar Czervik}}<br />
|A compiler that runs assembly-like programs.<br />
|-<br />
|[[Associative Array Emulator|Associative Array (Dictionary) Emulator]]<br />
|{{User2|Alynna Vixen}}<br />
|This library provides a set of functions for using a list as an associative array where string based keys can refer to one or more variant elements.<br />
|-<br />
|[[AvatarFollower]]<br />
|{{User|Dale Innis}}<br />
|Allows one avatar to automatically follow another.<br />
|-<br />
|[[Avatar Radar (NewAge)]]<br />
|{{User|Asia Snowfall}}<br />
|Version 1.2; A nice new avatar radar script i just finish that you can place in your hud, Also features avatar locator<br />
|-<br />
|[[Base2Dec]]<br />
|{{User|Siann Beck}}<br />
|Convert a number to decimal from any base.<br />
|-<br />
|[[BaseN]]<br />
|{{User|Nexii Malthus}}<br />
|Variable base compression, dynamically maps to usable UTF code points.<br />
|-<br />
|[[Basic Encryption Modules]]<br />
|{{User|Beverly Larkin}}<br />
|Basic encryption scripts, allows you to encrypt a float and shout it to another prim on a randomly chosen channel.<br />
|-<br />
|[[Be happy]]<br />
|{{User|Emmas Seetan}}<br />
|Basic smile attachment script, makes your avatar smile.<br />
|-<br />
|[[Beat The Average Vendor]]<br />
|{{User2|Kristen Giano}}<br />
|A vendor script based on humblebundle.com<br />
|-<br />
|[[Best Neighbor Ad Hiding Script|Best Neighbor]]<br />
|{{User2|Doran Zemlja}}<br />
|Reduce ad clutter by hiding ads when users are on their own land nearby.<br />
|-<br />
|[[BigNum|BigNum Library (RSA Encryption)]]<br />
|{{User|Xaviar Czervik}}<br />
|A BigNum Library for dealing with big numbers! Specialized for modular multiplication, and RSA encryption.<br />
|-<br />
|[[Binary Clock v1.1|Binary Clock]]<br />
|{{User|Fox Diller}}<br />
|A Binary Clock.<br />
|-<br />
|[[BinaryDecimalConverter]]<br />
|{{User2|Soundless Smalls}}<br />
|Converts a binary value to a decimal value and vice versa.<br />
|-<br />
|[[Blacklist and Remote Kill|Blacklist and Remote Kill]]<br />
|{{User|Chase Quinnell}}<br />
|Blacklist(denial of use) or a creator kill script(can delete someone's item by command on private channel)<br />
|-<br />
|[[User_talk:Rolig_Loon/Bookmark_URLs|Bookmark URLs]]<br />
|{{User|Rolig Loon}}<br />
|Dialog driven HUD reads bookmarked URLs from notecards and navigates directly to them with user's in-world browser.<br />
|-<br />
|[[Bubble Gum]]<br />
|[[Wizardry and Steamworks]]<br />
|A script to create a bubble gum effect with sounds and animations.<br />
|-<br />
|[[Bubble Trapper]]<br />
|[[Wizardry and Steamworks]]<br />
|A script that rezzes a bubble and surrounds a dialog-chosen avatar, exploding 2 seconds after it has reached the avatar. The article also explains how to hash a name to a number or a key to a number and thereby avoiding to block the rezzer's [[timer]] [[event]] or using [[llRegionSay]].<br />
|-<br />
|[[Builders Buddy|Builder's Buddy Tool]]<br />
|{{User|Newfie Pendragon}}<br />
|Script to easily move/rotate large builds that exceed the linkable size [[limits]].<br />
|-<br />
|[[Button Click Detector]]<br />
|{{User2|Sendao Goodman}}<br />
|Use [[llDetectedTouchUV]] to determine which button was pressed on a texture.<br />
|-<br />
|[[Camera following prim]]<br />
|{{User|Dale Innis}}<br />
|Pair of scripts to make a prim follow your camera position around (for lights etc).<br />
|-<br />
|[[Camera Sync]]<br />
|{{User|Meyermagic Salome}} and {{User2|Nomad Padar}}<br />
|A system to synchronize the cameras of two avatars.<br />
|-<br />
|[[Chatbot]]<br />
|Anonymous<br />
|Compile and run the LSL you type on a channel, faster than you can thru the 2007-08 SL GUI.<br />
|-<br />
|[[Chat Logger (GPL)]]<br />
|{{User|Nobody Fugazi}}<br />
|Chat logger which requests permission from participants before recording them.<br />
|-<br />
|[[Chat_Relay|Chat Relay]]<br />
|{{User|grumble Loudon}}<br />
|A Chat relay which can be routed using a path header and won't echo.<br />
|-<br />
|[[ClickAndDrag]]<br />
|{{User|Nexii Malthus}}<br />
| Click and Drag user interface elements using dynamic feedback<br />
|-<br />
|[[User:Lou_Netizen/HTTP_GET_Example_(GridSurvey)|HTTP Get Example (GridSurvey)]]<br />
|[[User:Lou_Netizen|Lou Netizen]]<br />
|Shows how to use LSL to perform an HTTP GET to retreive the name of a random online region from GridSurvey.<br />
|-<br />
|[[Code Racer]]<br />
|Anonymous<br />
|Race two versions of code forever, to see which runs faster.<br />
|-<br />
|[[Code Sizer]]<br />
|Anonymous<br />
|Count the bytes compiled from source code, to measure how to write small code.<br />
|-<br />
|[[Collision message sender]]<br />
|{{User2|Taff Nouvelle}}<br />
|Give a message to an avatar on collision if the message has not been sent in the last 10 minutes.<br />
|-<br />
|[[User:Void_Singer/Programs#v7-D_Enh._Color_Picker|Color Changer]]<br />
|{{User|Void Singer}}<br />
|Dialog driven color changer. Supports 16million+ colors, web color codes, multiple targeted prims, with save and recall.<br />
|-<br />
|[[Color Changer|Color Changer Plus]]<br />
|{{User2|Neo Calcutt}}<br />
|A color changer with 14 colors, a random function, and a custom vector function.<br />
|-<br />
|[[Color conversion scripts|Color Conversion]]<br />
|{{User|Sally LaSalle}}<br />
|Convert between Red Green Blue (RGB) and Hue Saturation Value (HSV).<br />
|-<br />
|[[ColorConvert]]<br />
|{{User|Siann Beck}}<br />
|Convert color values to vector from RGB, hex or HTML color name.<br />
|-<br />
|[[Color script]]<br />
|{{User2|Masakazu Kojima}}<br />
|Script for changing colors trough a listener with pre-defined colors.<br />
|-<br />
|[[Library Combined Library|Combined Library]]<br />
|{{User|Strife Onizuka}}<br />
|Library of mostly encoding and decoding functions, some more useful then others.<br />
* String functions: Replace / Trim right / Trim left / Trim both<br />
* Unicode conversion: UTF8 to Unicode / Unicode to UTF8<br />
* List functions: Replace / Compare<br />
|-<br />
|[[Computer:jaycoonlanguage]]<br />
|{{User|jayco121 Bing}}<br />
| A language written in LSL that is meant for my computer (available at the shop).<br />
|-<br />
|[[Read Note Card Configuration|Configuration Notecard Reader]]<br />
|{{User|Dedric Mauriac}}<br />
|A script to read configuration information from a notecard. Parses notecard to extract key words and their assigned values. Allows for comment lines and many more useful features.<br />
|-<br />
|[[AdvancedNotecardReader|Configuration Notecard Reader (advanced)]]<br />
|[[Lear Cale|Lear Cale]]<br />
|Robust configuration notecard reader; supports multiple notecards with same suffix, handles reconfig on inventory change, and does not usurp the default state.<br />
|-<br />
|[[Library_Chat_Relay|Conversation Relay]]<br />
|{{User|Jippen Faddoul}}<br />
|Chat relay which requests permission from participants before relaying their messages. Also includes their attachments. (ToS compliant).<br />
|-<br />
|[[Curtain script]]<br />
|{{User|Zilla Larsson}}<br />
|A simple script to retract/stretch curtains, blinds, bedcovers and more<br />
|-<br />
|[[Library_Cycle_Dialog_Items|Cycle Dialog Items w/ Callback]]<br />
|{{User|Hawkster Westmoreland}}<br />
|A customizable way to cycle dialog items with pagination<br />
|-<br />
|[[Dataserver API]]<br />
|{{User|Revolution Perenti}}<br />
|Dataserver Framework for Notecards.<br />
|-<br />
|[[Date Library]]<br />
|{{User|Corto Maltese}}<br />
| Date library, based on number of day since march 3rd 1600, can be used to calculate weekday, date differences, and date offset, and date formating.<br />
|-<br />
|[[Day of the Week]]<br />
|{{User|DoteDote Edison}}<br />
|Function to get day of the week from [[llGetUnixTime]].<br />
|-<br />
|[[Days in Month]]<br />
|{{User|IntLibber Brautigan}}<br />
|Clicking on it returns the number of days in the present month. Useful for scripting calendars and tier systems that need to know the number of days in the month at hand or to calculate for any month. Even adjusts for leap years.<br />
|-<br />
|[[Deed Tools]]<br />
|{{User|Falados Kapuskas}}<br />
|Tools that allow the creator to modify Group-Owned (Deeded) Objects via chat.<br />
|-<br />
|[[User:Daemonika_Nightfire/Scripts/DEMO_Shield|DEMO_Shield]]<br />
|{{User|Daemonika Nightfire}}<br />
|With this script, it is impossible to use these scripts in copied (Copybot) object.<br />
|-<br />
|[[Describe Chatter]]<br />
|Anonymous<br />
|Chat to see yourself as others do.<br />
|-<br />
|[[Dialog Control]]<br />
|{{User|Nargus Asturias}}<br />
| A (not-so) simple dialog & menu control script. Call dialog and receive selected value via [[link_message]], with built-in timer and [[link_message]] notification on time out. Supports multi-pages dialog and numeric property dialog. Button text and dialog's returned value can differ.<br />
Latest version also has [[Dialog Menus Control]] built-in; which allow multi-level menus through SL dialog system.<br />
|-<br />
|[[Dispenser Vendor]]<br />
|[[Wizardry and Steamworks]]<br />
| A twist on [[Vendor]] that dispenses one object and then removes it from the list of objects.<br />
|-<br />
|[[MultiUser_Dialog_Handler|Dialog Menus (multiuser)]]<br />
|{{User|SimonT Quinnell}}<br />
| Menu dialog handler that supports multiple menus open at once from the single script. Displays multi-page menus if necessary as well as allowing for fixed header and footer buttons. Timeouts as well as Text and button size limits are handled.<br />
|-<br />
|[[Dialog NumberPad|Dialog Number Pad]]<br />
|{{User|DoteDote Edison}}<br />
|Use a dialog to accept positive integer input from users.<br />
|-<br />
|[[Display Names Radar]]<br />
|{{User|Cerise Sorbet}}<br />
|Simple HUD type avatar radar that can show [[display names]] and script memory usage<br />
|-<br />
|[[Display Names to Key]]<br />
|{{User|Joran Yoshikawa}}<br />
|Simple way to get UUIDs from displaynames<br />
|-<br />
|[[User:Daemonika_Nightfire/Scripts/DS_Display-Username_Online_Indicator|Display-Username_Online_Indicator]]<br />
|{{User|Daemonika Nightfire}}<br />
|This simple hover text-based script is used to shop owners in Second Life, customers at the current display name and user name to display publicly. Additionally shows the status of the Userkey and online. Furthermore, there are click of a chat link that opens the profile owner.<br />
|-<br />
|[[Displayer Script]]<br />
|{{User|Akinori Kimagawa}}<br />
|Display Words On Top Of An Object<br />
|-<br />
|[[Distributed Primitive Database]]<br />
|[[Wizardry and Steamworks]]<br />
|The distributed primitive database (DPD) is a database which is meant to survive entirely in SL by using redundancy, replication and time synchronisation to maintain the consistency of the dataset contained in the DPD node/primitives spread out between regions and even grids. Similarly to the [[Intercom]], the robustness of the theory would allow users to maintain a cross-grid database; as of 30 of August 2011 I have managed to couple and replicate data between the two grids by using the methodology described in the script article.<br />
|-<br />
|[[Drink script]]<br />
|{{User|Emmas Seetan}}<br />
|Used mainly for food and drink in Second Life.<br />
|-<br />
|[[Donut Dance]]<br />
|[[Wizardry and Steamworks]]<br />
|Err, a script that makes you dance and say something on the local chat once you attach an object (good example for conditional re-entry flipping).<br />
|-<br />
|[[User:Daemonika_Nightfire/Scripts/DS_Single_AO-Sit|Single_AO-Sit]]<br />
|{{User|Daemonika Nightfire}}<br />
|Posescript for use with or without AO and with or without Animation. With the menu it is possible the seated Avatar to move.<br />
|-<br />
|[[TOXDropBox|DropBox]]<br />
|{{User|Dimentox Travanti}}<br />
| This is a Drop box which allows people to drop certain items in a object & has many config options.<br />
|-<br />
|[[Efficiency Tester]]<br />
|{{User|Xaviar Czervik}}<br />
|Tests the speed of a function.<br />
|-<br />
|[[Email-to-IM|Email2IM]]<br />
|{{User|DoteDote Edison}}<br />
|Send IMs to SL friends via [[email]].<br />
|-<br />
|-<br />
|[[User:Kireji_Haiku/SIMchat_headset|Encrypted Region-wide chat]]<br />
|{{User|Kireji Haiku}}<br />
|Encrypted Region-wide chat<br />
|-<br />
|[[ExplodingObjects]]<br />
|{{User|Dale Innis}}<br />
|Causes an object (of the appropriate type) to explode on command.<br />
|-<br />
|[[FadeEasy]]<br />
|{{User2|Nika Rugani}}<br />
|The easy way of fading objects in or out (Using llSetLinkAlpha)<br />
|-<br />
|[[FastConeSpread]]<br />
|{{User|Nexii Malthus}}<br />
| Fast Algorithmn to achieve cone spread, main use in weaponry systems.<br />
|-<br />
|[[User:PixelProphet Lane/Scripts#Fast List Prim Contents|Fast List Prim Contents]]<br />
|{{User|PixelProphet Lane}}<br />
|Fast and efficient method to print Object Inventory (Name, Type and next Owner permissions)<br />
|-<br />
|[[User:PixelProphet_Lane/Scripts#Grid_Status_Feed|Grid Status Feed]]<br />
|{{User|PixelProphet Lane}}<br />
|Receive important Grid information in-world<br />
|-<br />
|[[Find Avatar Key|Find Avatar Key]]<br />
|{{User2|Huney Jewell}}<br />
|Explores [[UUID]] of avatar whose name is said in local chat or who touches the prim.<br />
|-<br />
|[[First Name Letter Prize]]<br />
|{{User|RaithSphere Whybrow}}<br />
|Gives a prize if the person who sits on it's first letter of first name matches the random letter!<br />
|-<br />
|[[Fix Small Prims|Fix_Small_Prims]]<br />
|{{User|Emma Nowhere}}<br />
|Finds and adjusts the smallest prims in a linkset so that it can be scaled down further.<br />
|-<br />
|[[Flight Assist]]<br />
|[[Wizardry and Steamworks]]<br />
|Flight feather / flight band implementation supporting various commands and allowing you to fly above the clouds.<br />
|-<br />
|[[Float2Hex]]<br />
|{{User|Strife Onizuka}}<br />
|Very useful for transporting [[float|floats]].<br />
|-<br />
|[[Float Box Contents]]<br />
|{{User|Rolig Loon}}<br />
|Displays object inventory in hover text, identified by type and updated marquee-style.<br />
|-<br />
|[[Follower (script)|Follower]]<br />
|Unknown, uploaded by {{User|Slik Swindlehurst}}<br />
|Makes an object follow the nearest person. Do not use for [[grief|griefing]].<br />
|-<br />
|[[FURWARE_text]]<br />
|{{User|Ochi Wolfe}}<br />
|Versatile text-on-prim script, open source under the MIT license<br />
|-<br />
|[[GA Event Notifier]]<br />
|{{User|Victor Hua}}<br />
|Gathers seven days event data from a Google calendar and display it through a simple interface. The lsl script can access several calendars at once through seperate php files. One file per calendar. Host the included php on your own web server.<br />
|-<br />
|[[Geometric|Geometric Library]]<br />
|Community Project<br />
|A substantial amount of various geometric functions for intersection and other purposes of 3D maths.<br />
|-<br />
|[[Get Profile Picture]]<br />
|{{User2|Valentine Foxdale}}<br />
|Sets the texture of the object to profile picture of the person that touches ot<br />
|-<br />
|[[GetTimestampOffset]]<br />
|[[User:Siann_Beck|Siann Beck]]<br />
|Returns [[llGetTimestamp]] with an hour offset.<br />
|-<br />
|[[Give InvItem every n hours]]<br />
|{{User|Criz Collins}}<br />
|Will give an inventory item on touch only every n hours, even if somebody touches the object more than once.<br />
|-<br />
|[[Give random object]]<br />
|{{User|Emmas Seetan}}<br />
|Touch to receive a random object in the prim's inventory<br />
|-<br />
|[[Giver]]<br />
|[[Wizardry and Steamworks]]<br />
|A menu-driven script that will hand out the objects in a prim. Supports multiple pages.<br />
|-<br />
|[[User:Yumi Murakami/Golden Vendor|Golden Vendor]]<br />
|{{User|Yumi Murakami}}<br />
|A cross between a vendor and a game.<br />
|-<br />
|[[Google Charts]]<br />
|{{User|Dedric Mauriac}}<br />
|Create links to display raw data as a chart image.<br />
|-<br />
|[[Google_Translator]]<br />
|{{User|Ugleh Ulrik}}<br />
|Translates spanish to english, and its simple to make it any other way.<br />
|-<br />
|[[Go transparent when walking]]<br />
|{{User|Emmas Seetan}}<br />
|An attachment that goes invisible when you walk and visible when you don't walk.<br />
|-<br />
|[[Great Wanderer]]<br />
|[[Wizardry and Steamworks]]<br />
|A movement system based on [[Wizardry and Steamworks|State Machines]] which provides free roaming.<br />
|-<br />
|[[Greeter]]<br />
|[[Wizardry and Steamworks]]<br />
|A multi-purpose greeter with multiple options (IM, landmark, notecard, URL, visitor statistics, shared access and compatible with the [[Mail]] system) that could work for shops, clubs, galleries and any other public place.<br />
|-<br />
|[[Group Authorization]]<br />
|{{User|Chase Quinnell}}<br />
|Checks to see if object is set to appropriate group (checks by [[Group key finder|group key]])<br />
|-<br />
|[[Group key finder]]<br />
|{{User|Emmas Seetan}}<br />
|Touch to find the key of the group<br />
|-<br />
|[[Group Privacy]]<br />
|{{User|Chance Unknown}}<br />
|Security device to insure members of a group can have a private area. Deactivates when nobody present.<br />
|-<br />
|[[Hello Avatar]]<br />
|Linden Lab<br />
|SL's default script.<br />
|-<br />
|[[Hello Avatar Companion]]<br />
|[[Chase Quinnell]]<br />
|Companion to the original [[Hello Avatar]] script<br />
|-<br />
|[[HexText]]<br />
|{{User|Hexadeci Mole}}<br />
|Unicode display script. Roughly 28,000 characters supported. Open source under the MIT license<br />
|-<br />
|[[Hierarchics]]<br />
|{{User|Nexii Malthus}}<br />
| Advanced script to create an efficient self-aware hierarchic structure.<br />
|-<br />
|[[Hierarchics2]]<br />
|{{User|Nexii Malthus}}<br />
| Second generation, one script per object. Only two functions, can be embedded in others. Uses the new [[llSetLinkPrimitiveParamsFast]]/[[llGetLinkPrimitiveParams]] functions.<br />
|-<br />
|[[User:Rolig_Loon/High-Capacity_Greeter-Counter|High-Capacity Greeter-Counter]]<br />
|{{User|Rolig Loon}}<br />
|Uses a memory compression algorithm to store hashed visitor UUID's in a string instead of using a list.<br />
|-<br />
|[[Holodeck]]<br />
|{{User|Revolution Perenti}}<br />
|Home Rezzing System.<br />
|-<br />
|[[HUD Dots Radar]]<br />
|[[User:Cerise Sorbet|Cerise]]<br />
|HUD target example, draws dots on the HUD over avatars in view.<br />
|-<br />
|[[I Got It]]<br />
|[[Wizardry and Steamworks]]<br />
|Educational tool to provide feedback from students.<br />
|-<br />
|[[Intercom|Intercom]]<br />
|[[Wizardry and Steamworks]]<br />
|A system allowing region-wide and grid-wide (as of 30 of August 2011, it also works grid-wide, a test was performed by linking up the chat between the OSGrid and SecondLife) mass chat relay. By using this you can relay a main chat across multiple regions or grids. The script was initially meant as a mid-way project in order to test and gather information for the [[Distributed Primitive Database]].<br />
|-<br />
|[[Interpolation|Interpolation Library]]<br />
|{{User|Nexii Malthus}}<br />
|A small set of interpolation functions.<br />
|-<br />
|[[Intra-Region Update Server]]<br />
|[[User:Emma_Nowhere|Emma Nowhere]]<br />
|Centrally update objects such as Freeview screens or teleport pads within a region that are configured by notecards or contain modifiable objects or media assets.<br />
|-<br />
|[[Inventory_Based_Menu]]<br />
|{{User|Revolution Perenti}}<br />
|Inventory Based Menu System.<br />
|-<br />
|[[iTunes RPC Email|iTunes RPC]]<br />
|{{User|Fox Diller}}<br />
|iTunes RPC via LSL [[llEmail]] and [[llRemoteDataReply]].<br />
|-<br />
|[[Jingle]]<br />
|[[Wizardry and Steamworks]]<br />
|A script that will make a primitive emit a sound when you wear it and walk around. Ideal for bells, footsteps and so on...<br />
|-<br />
|[[Key Frame Animator|Keyframe Animator]]<br />
|{{User|Jasper Flossberg}}<br />
| This is a KeyFrame Animator Script to simplify construction of keyframed animations.<br />
|-<br />
|[[Key Pad Door|Keypad Door]]<br />
|{{User|Tdub Dowler}}<br />
| Door and keypad with changeable code. Follow instructions carefully!<br />
|-<br />
|[[Key2Name]]<br />
|{{User2|Nika Rugani}}<br />
| Key2Name service where a user no longer needs to be in the same region to get users name<br />
|-<br />
|[[Kilt Editor|Kilt / Skirt Editor]]<br />
|{{User|Brangus Weir}}<br />
| This changes all the parameters of all the flexis in the link set in one swell foop!<br />
|-<br />
|[[Kira Warp Core Drive]]<br />
|[[Wizardry and Steamworks]]<br />
|Scripts and instructions on how to create a vehicle that teleports an avatar and a vehicle to any region on the grid. You can [http://www.youtube.com/watch?v=xQkBRD7HBvw watch the YouTube video showing the prototype] I created to demonstrate how it works.<br />
|-<br />
|[[landmark2slurl]]<br />
|{{User|Tapple Gao}}<br />
|Convert all landmarks in inventory to slurls<br />
|-<br />
|[[Last Sound System]]<br />
|Babbage Linden<br />
|An LSL [http://Last.fm Last.fm] client.<br />
|-<br />
|[[LibObj]]<br />
|{{User|Ochi Wolfe}}<br />
|A library to manage state in LSL using an object-oriented approach.<br />
|-<br />
|[[LibraryDisplayLandScreenshot]]<br />
|{{User|Jon Desmoulins}}<br />
|A modified version of LibraryDisplayProfilePic using the new [[PARCEL_DETAILS_ID]] Implemented in Server v1.36<br />
|-<br />
|[[User:Daemonika_Nightfire/Scripts/LinkNumber-List_in_llSetLinkPrimitiveParamsFast|LinkNumber-List_in_llSetLinkPrimitiveParamsFast]]<br />
|{{User|Daemonika Nightfire}}<br />
|Changed several prims in linkset with the same parameters, with a list. Without separate llSetLinkPrimitiveParams for each prim. (ideal for show/hide effects)<br />
|-<br />
|[[Limit Vendor]]<br />
|[[Wizardry and Steamworks]]<br />
|This is a vendor supporting any number of items with different prices which will only dispense a certain number of individual items by setting limits for each item based on a notecard configuration.<br />
|-<br />
|[[Linkset resizer]]<br />
|Maestro Linden<br />
|Systematically rescales a linkset by moving and resizing each prim (by using [[llGetLinkPrimitiveParams]] and [[llSetLinkPrimitiveParamsFast]])<br />
|-<br />
|[[Linkset resizer with menu]]<br />
|{{User|Brilliant Scientist}}<br />
|A menu-driven script that rescales a linkset by moving and resizing the prims using [[llGetLinkPrimitiveParams]] and [[llSetLinkPrimitiveParamsFast]] functions. Based on [[Linkset resizer]].<br />
|-<br />
|[[User:Daemonika_Nightfire/Scripts/*DS*_Resize_Script|Resize Script (m/c/t) v2.0.01]]<br />
|{{User|Daemonika Nightfire}}<br />
|Single resize script for a complete linkset with save and restore option.<br />
|-<br />
|[[Pointing Stick]]<br />
|{{User|rhonin Nissondorf}}<br />
|A device that takes controls of your arrow keys and directs the device in the relative direction its pointing, forward and back of course.<br />
|-<br />
|[[Gun Script]]<br />
|[[User:rhonin Nissondorf| rhonin Nissondorf]]<br />
|Shoots out "ammo" from the root prim of your "gun".<br />
|-<br />
|[[Grenade Script]]<br />
|[[User:rhonin Nissondorf| rhonin Nissondorf]]<br />
|Uses a timed factor to add influence to the velocity of a throw object.<br />
|-<br />
|[[Linkset Resizer 2]]<br />
|{{User|Emma Nowhere}}<br />
|A more user-friendly resizer script designed for either drop-in use by the end-user or builder or for use in products. Based on [[Fix Small Prims]].<br />
|-<br />
|[[List2CSV]]<br />
|{{User|Kunnis Basiat}}<br />
|Similar to [[llList2CSV]] & [[llCSV2List]] which includes preserving type and escaping characters.<br />
|-<br />
|[[list_cast]]<br />
|{{User2|Fractured Crystal}}<br />
|Casts a list of strings into the type they appear to be. Designed for preprocessing user input for feeding into [[llSetPrimitiveParams]]<br />
|-<br />
|[[Listener Script]]<br />
|{{User|Emmas Seetan}}<br />
|Use to [[listen]] to other people's conversations (Like spying)<br />
|-<br />
|[[User:Void_Singer/Functions#List:_Find_Last_Index|List: Find Last Index]]<br />
|{{User|Void Singer}}<br />
|Returns the last index of searched item in a source list. (backwards version of [[llListFindList]])<br />
|-<br />
|[[User:Void_Singer/Functions#List:_Multi-Find_Index_.28First_or_Last.29|List: Multi Find]]<br />
|{{User|Void Singer}}<br />
|Returns the first found index of multiple search items in a list. (Multi-item version of [[llListFindList]]. Fwd and Rev versions included)<br />
|-<br />
|[[User:Void_Singer/Functions#List:_Get_Reverse_Order|List: Reverse]]<br />
|{{User|Void Singer}}<br />
|Returns an input List in reverse order<br />
|-<br />
|[[LinksetIndexing]]<br />
|{{User|Nexii Malthus}}<br />
|Functions for indexing a linkset by patterns or names down to their linkset numbers.<br />
|-<br />
|[[llGetAgentList Sim-Wide Radar]]<br />
|{{User|Tiaeld Tolsen}}<br />
|Simple radar implementation using the new [[llGetAgentList]] LSL Function.<br />
|-<br />
|[[Live Event Timeout]]<br />
|[[Wizardry and Steamworks]]<br />
|A script which will set the the music URL back to a radio station of your liking when a DJ leaves or forgets to switch back the URL after a live event. It takes multiple DJs, using a notecard and several configuration parameters.<br />
|-<br />
|[[LOGO Turtle]]<br />
|[[Wizardry and Steamworks]]<br />
|A script that interprets basic LOGO commands, extending the directions to 3D.<br />
|-<br />
|[[User:Kephra_Nurmi/lsDancemachine|lsDancemachine]]<br />
|[[User:Kephra_Nurmi|Kephra Nurmi]]<br />
| Low lag client server dancemachine.<br />
|-<br />
|[[User:Kephra_Nurmi/lsDeejay|lsDeejay Home Edition]]<br />
|[[User:Kephra_Nurmi|Kephra Nurmi]]<br />
| Client server media control for music, video, youtube, pictures, and texture animations.<br />
|-<br />
|[[User:Kephra_Nurmi/lsDialog|lsDialog]]<br />
|[[User:Kephra_Nurmi|Kephra Nurmi]]<br />
| Universal notecard driven menu dialog system.<br />
|-<br />
|[[User:Kephra_Nurmi/lsDisplay|lsDisplay]]<br />
|[[User:Kephra_Nurmi|Kephra Nurmi]]<br />
| Picture cycler with preloader.<br />
|-<br />
|[[User:Kephra_Nurmi/lsDistributor|lsDistributor]]<br />
|[[User:Kephra_Nurmi|Kephra Nurmi]]<br />
| Simple 'try' and 'buy' vendor system.<br />
|-<br />
|[[Wizardry_and_Steamworks/LSL|LSL FUSS]]<br />
|[[Wizardry and Steamworks]]<br />
|FUSS (Frequently Used Short Snippets) is an collection of short snippets provided by [[Wizardry and Steamworks]]. They range from functions to one-liners and are provided for LSL developers.<br />
|-<br />
|[[LSL_languageAPI]]<br />
|{{User|Gypsy Paz}}<br />
|Multi-lingual API from notecard based language files<br />
|-<br />
|[[Mail]]<br />
|[[Wizardry and Steamworks]]<br />
|An system for sending objects to multiple recipients automatically supporting shared access and [[Greeter]] compatible auto-subscriptions.<br />
|-<br />
|[[Mandelbrot Explorer]]<br />
|Babbage Linden<br />
|An interactive fractal explorer.<br />
|-<br />
|[[Materialization Effects]]<br />
|{{User|Overbrain Unplugged}}<br />
| Special effects to add to rezzing events to simulate a teleportation or materialization.<br />
|-<br />
|[[Materialization Effects 2]]<br />
|{{User2|Nika Rugani}}<br />
| More efficient and faster version of Materialization Effects by Overbrain Unplugged.<br />
|-<br />
|[[Matrix Functions]]<br />
|{{User|KyleFlynn}}<br />
| A set of 3x3 matrix functions, multiplication, division, inversion, transposition, etc.<br />
|-<br />
|[[Memory Module]]<br />
|[[Wizardry and Steamworks]]<br />
|An example of pseudo-persistent variable in-world storage.<br />
|-<br />
|[[Merge Sort]]<br />
|{{User|Xaviar Czervik}}<br />
|Implements a Merge Sort in LSL, however this code is 300(ish) times slower than [[llListSort]]. Don't use this in a script!<br />
|-<br />
|[[Minesweeper]]<br />
|{{User|Xaviar Czervik}}<br />
|A simple minesweeper game.<br />
|-<br />
|[[Mood Color Changer]]<br />
|[[Wizardry and Steamworks]]<br />
|A script that changes the color of all primitives in a linkset depending on the smileys the owner types on the main chat.<br />
|-<br />
|[[Morse Code]]<br />
|{{User|Bobbyb30 Swashbuckler}}<br />
|A script that allows for the conversion to and from morse code and can "play" morse code.<br />
|-<br />
|[[Multi-displays Texture Cycler]]<br />
|{{User|Nargus Asturias}}<br />
|A simple texture rotator designed for multiple display screens. With delay between each screen AND delay between each loop.<br />
|-<br />
|[[Multi Item Rezzer|Multi Item Rezzer]]<br />
|{{User|Jesse Barnett}}<br />
|A rework of my old High Altitude Rezzer. Place the objects that you wish to choose from to be rezzed inside. Sit on the rezzer and pick the item and the height. It will go to target height and rez the object.<br />
|-<br />
|[[Multirezzer|Multirezzer (on collision)]]<br />
|{{User2|Beet Streeter}}<br />
|Spawns up to 10 objects when the object containing the script collides with a user.<br />
|-<br />
|[[User:Allen_Kerensky/Myriad_Lite_Preview_5|Myriad Lite Preview 5 RPG System]]<br />
|[[User:Allen_Kerensky|Allen Kerensky]]<br />
|Working preview of the Myriad Universal RPG System by Ashok Desai, converted to LSL as a roleplay meter with quest NPC and goals, hand-to-hand and melee close combat, ranged combat, armor, healing, bullet, firearm, holster, practice target, and much more<br />
|-<br />
|[[N2K]]<br />
|[[Wizardry and Steamworks]]<br />
|A Name To Key (Name2Key) implementation that does not use third-party databases, nor relies on the uptime of not well known websites but rather uses the World Wide Web Consortium to fetch the key of avatars while trying to alert the developers of the consequences of using Name2Key third-party providers as well as trying to refrain from sales pitch terminology such as "best", "newest" and "fastest".<br />
|-<br />
|[[Name2Key in LSL]]<br />
|{{User|Maeva Anatine}}<br />
|Get the Name2Key feature inside your scripts. Works even on lastly subscribed avatars.<br />
|-<br />
|[[Name2Key]]<br />
|{{User2|Nika Rugani}}<br />
|Newest and fastest Name2Key search, While the database is small it is also connected to Second Life's search.<br />
|-<br />
|[[NexiiText]]<br />
|{{User|Nexii Malthus}}<br />
| Text Renderer, specialised in features, performance and a compact nature. It features unique per character control, such as Colour, Bold, Italics, Underline, Stroke, Icons. The high performance means it comes in at a 5 char / prim ratio, but it is perfect where highly dynamic and rich text is required.<br />
|-<br />
|[[NexiiText2]]<br />
|{{User|Nexii Malthus}}<br />
| Second Gen Text Renderer. Same as above but features use of [[PRIM_LINK_TARGET]] and an awesome dynamic prim allocation architecture.<br />
|-<br />
|[[No Auto-Return]]<br />
|{{User|Bellla Clarity}}<br />
|To stop your long and hard builds from getting returned in sandboxes (''only single prims, though!'').<br />
|-<br />
|[[No Auto-Return NR]]<br />
|{{User|Jor3l Boa}}<br />
|This really works (29-05-09), needs a nearby region to do the trick and avoid auto return. (Tested on Blue and Rausch)<br />
|-<br />
|[[No Auto-Return (Multi)]]<br />
|{{User|Xaviar Czervik}}<br />
|A revision of Bella's that works for multi-prim objects.<br />
|-<br />
|[[No Limit Teleporter]]<br />
|{{User|Morgam Biedermann}}<br />
|Teleport to infinite altitudes (up to 4096m)<br />
|-<br />
|[[Object Size]]<br />
|{{User|Chase Quinnell}}<br />
|Gets the dimensions and footprint of a linkset<br />
|-<br />
|[[Object to Data v1.4|Object to Data]]<br />
|{{User|Xaviar Czervik}}<br />
|Turns an object into text (and back). Allows people to transfer objects through notecards (or otherwise).<br />
|-<br />
|[[Online Indicator|Online Indicator]]<br />
|{{User|Kristy Fanshaw}}<br />
|Will show if the user is online or not. Displays users profile picture and allows to send IM's to user. Also gives a link to open the users profile<br />
|-<br />
|[[Open Group Join]]<br />
|{{User|Alicia Stella}}<br />
|User Touches Object to Join Group from Group Info window, (no bot.)<br />
|-<br />
|[[Open Prim Animator]]<br />
|{{User|Todd Borst}}<br />
|Single script prim animation tool. Menu driven, easy to use.<br />
|-<br />
|[[Open Zyngo Skin Installer]]<br />
|{{User2|Tmzasz Luminos}}<br />
|A Simple Script designed to install skins on the popular Skill machines.<br />
|-<br />
|[[Orbitor]]<br />
|[[Wizardry and Steamworks]]<br />
|Based on [[Wanderer]], we create [[Orbitor]] which allows a primitive to orbit around an origin point.<br />
|-<br />
|[[One Script, many doors]]<br />
|{{User|Kyrah Abattoir}}<br />
|Door script able to manage more than 50 linked doors from a single script instance.<br />
|-<br />
|[[ParseString2List]]<br />
|{{User|Strife Onizuka}}<br />
|Same as [[llParseString2List]] and [[llParseStringKeepNulls]], but not limited to 8 spacers or separators. Thus substitute a call to the [[llParseString2List]] and [[llParseStringKeepNulls]] functions by a call to [[Parse_String_To_List|ParseString2List]] whenever you have more than 8 separators or more than 8 spacers.<br />
|-<br />
|[[Password Generator]]<br />
|{{User2|Syntrax Canucci}}<br />
|This is an over-complicated, semi-complex password generator, which goes through multiple steps.<br />
|-<br />
|[[Pathfinder]]<br />
|Babbage Linden<br />
|A potential field based pathfinding library.<br />
|-<br />
|[[Pay to Strip]]<br />
|[[Wizardry and Steamworks]]<br />
|This script is mainly meant for dancers and uses RLV to allow people to strip an avatar by making every clothes and attachment piece removable, respectively detachable for a settable price.<br />
|-<br />
|[[Permanent Primitive URL]]<br />
|[[Wizardry and Steamworks]]<br />
|A script that uses [http://tiny.cc http://tiny.cc] REST API to update a SIM URL and make it permanent. Full description on how to register and set up a "nice" URL, like: http://tiny.cc/Kira. Should work with most URL shortening services (I'm not affiliated with tiny.cc except for having a pass at them for not allowing OpenSIM-style generated URLs).<br />
|-<br />
|[[Personal ATM Machine]]<br />
|{{User|Jessikiti Nikitin}}<br />
|Allows deposits and withdrawals into another of your accounts, without the account being logged in.<br />
|-<br />
|[[Phantom Child]]<br />
|{{User|Aeron Kohime}}<br />
|Causes a child in a link set to become phantom without the entire object becoming phantom.<br />
|-<br />
|[[PHP_RegionFunctions]]<br />
|{{User|Gypsy Paz}} and {{User2|Zayne Exonar}}<br />
|Three useful PHP functions to get region info<br />
|-<br />
|[[PhysicsLib]]<br />
|{{User|Nexii Malthus}}<br />
| Interesting set of fun physics functions.<br />
|-<br />
|[[Planar Tile Generator]]<br />
|[[Wizardry and Steamworks]]<br />
|A script to generate perfectly aligned tiles.<br />
|-<br />
|[[Play and Loop Sound]]<br />
|{{User|Bellla Clarity}}<br />
|Very short and simple script; plays and loops a sound in an object.<br />
|-<br />
|[[Posing stand|Posing Stand]]<br />
|{{User|Bellla Clarity}}<br />
|Just a pose script to edit [[attachments]] more easily.<br />
|-<br />
|[[PosJump]]<br />
|{{User|Uchi Desmoulins}}<br />
|A much more efficient alternative to the popular [[warpPos]] function for bypassing 10m distance-moved limitations.<br />
|-<br />
|[[Puppeteer]]<br />
|[[Wizardry and Steamworks]]<br />
|A simple puppeteer script that will allow you to record and animate prim movements and rotations.<br />
|-<br />
|[[Primitive Name Changer]]<br />
|[[Wizardry and Steamworks]]<br />
| A script that changes the primitive's name based on an user-configurable interval and a notecard list containing possible names.<br />
|-<br />
|[[Prefix Calculator]]<br />
|{{User|Xaviar Czervik}}<br />
| A calculator that evaluates expressions in prefix notation.<br />
<code>+ 3 4 = 5. * + 1 2 + 3 4 = 14.</code><br />
|-<br />
|[[Profile Generator]]<br />
|[[Wizardry and Steamworks]]<br />
|A cynical script for generating boilerplate profiles by based on cliches and profile memes.<br />
|-<br />
|[[Profile Picture]]<br />
|[[User: Jor3l Boa|Jor3l Boa]]<br />
|A working profile picture script with the new SecondLife API (1/11/2011)<br />
|-<br />
|[[Progress Bar]]<br />
|{{User|Nexii Malthus}}<br />
| Flexible and powerful little function for creating progress bars useful in hovertext.<br />
|-<br />
|[[Pseudo-random Number Generator]]<br />
|{{User|Xaviar Czervik}}<br />
|Generates a Pseudo-random number between -0x7FFFFFFF and 0x7FFFFFFF<br />
|-<br />
|[[Quick Collar]]<br />
|[[Wizardry and Steamworks]]<br />
|A simple, no-bulk, no external database and essential feature-packed RLV collar script for your pleasures.<br />
|-<br />
|[[Quicksort]]<br />
|[[Wizardry and Steamworks]]<br />
|LSL implementation of the Quicksort algorithm.<br />
|-<br />
|[[User:Rolig_Loon/Quiz_From_Notecard|Quiz From Notecard]]<br />
|{{User|Rolig Loon}}<br />
|A multiple-choice testing script that reads questions and answer choices from a notecard and presents them in dialog boxes.<br />
|-<br />
|[[Racter]]<br />
|[[Wizardry and Steamworks]]<br />
|In-world, multi-purpose chatterbot (Eliza/A.L.I.C.E. inspired) supporting multiple configurable hot-swappable brain-files with a wide range of applications.<br />
|-<br />
|[[Rainbow_palette]]<br />
|{{User|Rui Clary}}<br />
|Build a color picker, using only one prim, and a few lines of code.<br />
|-<br />
|[[Random Gaussian Number Generator]]<br />
|{{User2|Vlad Davidson}}<br />
|Generates a random number drawn from a normal (Gaussian; bell-curve) distribution, based on a specified mean/stdev<br />
|-<br />
|[[Random AV Profile Projector]]<br />
|{{User|Debbie Trilling}}<br />
|Randomly selects an AV from a crowd & then projects their profile picture as a 'holographic' image<br />
|-<br />
|[[Random Object Vendor]]<br />
|{{User|CodeBastard Redgrave}}<br />
|Simple vendor that gives out random objects when paid the right amount<br />
|-<br />
|[[Random Password Generator]]<br />
|{{User|Jor3l Boa}}<br />
|Generate Random passwords based on String Length.<br />
|-<br />
|[[RandomPrimParams]]<br />
|{{User|Xintar Citron}}<br />
|Simple script which randoms Prim Parameteres, in this example i used color, but you can use everything.<br />
|-<br />
|[[RavText]]<br />
|{{User|Ravenous Dingo}}<br />
|An alternate to XyText. This is a lightweight, multiple font 10 character text display system. It only supports uppercase alphanumeric text and a few special characters, but it is very fast, renders quickly and supports multiple fonts. It is meant for specialized use when all that is desired is basic, fast text display and the extra "bells and whistles" are not needed.<br />
|-<br />
|[[User:PixelProphet Lane/Scripts#Real Object Inventory To Dialog|Real Object Inventory To Dialog]]<br />
|{{User|PixelProphet Lane}}<br />
|Display any amount of items contained in an Object in a Dialog, regardless of item name length.<br />
|-<br />
|[[RentalBoxv1|Rental Box, Simply]]<br />
|{{User2|Sendao Goodman}}<br />
|Simple explanation of how to make rental boxes.<br />
|-<br />
|[[Rental Cube]]<br />
|{{User|Hank Ramos}}<br />
|Simple cube for renting out a space.<br />
|-<br />
|[[User:Daemonika_Nightfire/Scripts/*DS*_Rental-Cube|Rental-Cube]]<br />
|{{User|Daemonika Nightfire}}<br />
|This is an Open-Source version of a Rental-Cube from Daemonika Nightfire. Just copy/paste this script into a inworld lsl-script and add one notecard called Info/Rules to the content of your cube.<br />
|-<br />
|[[User:Ackley Bing/Textbox2Hovertext|Textbox2Hovertext]]<br />
|[[User:Ackley Bing|Ackley]]<br />
|A simple script to allow hovertext to be set with a dialog text box.<br />
|-<br />
|[[Remote Texture Loader]]<br />
|{{User|Bobbyb30 Swashbuckler}}<br />
|A set of scripts for remotely loading textures within a sim. This means that a single "texture server" can manage multiple changing billboards within a sim.<br />
|-<br />
|[[Say Region Frames Per Second|Region Frames Per Second]]<br />
|{{User2|Heymeriou Mystakidou}}<br />
| Says the region name and frames per second out loud on command.<br />
|-<br />
|[[Security Orb|Security Orb]]<br />
|[[Wizardry and Steamworks]]<br />
|A regular security orb that ejects people from a land parcel supporting a menu configuration and a notecard based access list.<br />
|-<br />
|[[Resizer multi-prims|Resizer multi-prims]]<br />
|{{User2|Christy Mansbridge}}<br />
|1 Mono script to resize object (1 to 256 prims) by blue menu. Avoid risk to break the build by increasing link distance.<br />
|-<br />
|[[RLV Collision Grabber]]<br />
|[[User:Vala_Vella|Vala Vella]]<br />
|Grab people colliding with the object and sit them on a set target using RLV<br />
|-<br />
|[[sbDialog]]<br />
|[[User:Siann_Beck|Siann Beck]]<br />
|A simple replacement function for [[llDialog]]. It re-orders the button list so that the button values, as passed to it, display left-to-right, top-to-bottom. It also opens a [[llListen|listen]] on the specified channel, and returns the handle.<br />
|-<br />
|[[Scheduled Payments]]<br />
|[[Wizardry and Steamworks]]<br />
|A script that will allow you to make scheduled (and reoccurring) payments to multiple avatars via a notecard.<br />
|-<br />
|[[Scheduler]]<br />
|{{User|Haravikk Mistral}}<br />
|Schedule multiple events using a single script timer<br />
|-<br />
|[[Scheme_Interpreter|Scheme Interpreter]]<br />
|{{User|Xaviar Czervik}}<br />
|A scheme interpreter capable of handling most scheme expressions, including lambda and lists.<br />
|-<br />
|[[Script Override Functions]]<br />
|{{User|Revolution Perenti}}<br />
|bypass default strings, integer etc in chat channel.<br />
|-<br />
|[[User:Toady_Nakamura/Scrubber_Script|Script Scrubber]]<br />
|{{User|Toady Nakamura}}<br />
|Script scrubs memory resident script functions from prim and self-deletes the script. Does not damage the prim, or remove other scripts. Use this to kill bling or other particle effects!<br />
|-<br />
|[[Scripted Attachment Detector.lsl|Scripted Attachment Detector]]<br />
|{{User|Bobbyb30 Swashbuckler}}<br />
|A script that will display avatars wearing scripted attatchments in hovertext. This may be worn as an hud or rezzed.<br />
|-<br />
|[[Self Upgrading Script Enhanced]]<br />
|{{User|Cron Stardust}}<br />
|Keeps only latest version of the script on prim (even with multiple adds of the same script!)<br />
|-<br />
|[[Sensor Visualizer]]<br />
|{{User|Cerise Sorbet}}<br />
|Shows the size and shape you get with [[llSensor]] range and arc parameters<br />
|-<br />
|[[Serverless Key Exchange]]<br />
|{{User2|Sendao Goodman}}<br />
|Maintains a network of object keys without using an external server.<br />
|-<br />
|[[SetLinkText]]<br />
|{{User2|Tacusin Memo}}<br />
|Custom function like [[llSetText]] only applying to linked sets.<br />
|-<br />
|[[SHA-1|SHA-1 Hash]]<br />
|{{User|Strife Onizuka}}<br />
|Performs a SHA-1 Hash on an input text. Similar to MD5 only (slightly) more secure.<br />
|-<br />
|[[SHA-2|SHA-2 Hash]]<br />
|{{User|Strife Onizuka}}<br />
|Performs a SHA-2 Hash on an input text. Similar to SHA-1 only (slightly) more secure.<br />
|-<br />
|[[Shoutcast - radio controller v0.3 (remake of similar scripts)]]<br />
|{{User|Flennan Roffo}}<br />
|Control your shoutcast radio stations with this shoutcast controller. Uses notecard for info about genres and stations and menu to select the station. Sends info to Xytext display.<br />
|-<br />
|[[User:PixelProphet Lane/Scripts#Show Agent Script Count and memory|Show Agent Script Count and memory]]<br />
|{{User|PixelProphet Lane}}<br />
|Fast and efficient method to display the amount of scripts and memory usage for an agent<br />
|-<br />
|[[Sim Map Particle Projector]]<br />
|{{User|Jesse Barnett}}<br />
|Displays a floating map of the sim the script is in.<br />
|-<br />
|[[Sim Performance Collector (Web-based]]<br />
|{{User2|DeniseHoorn Slade}}<br />
|Makes some graphs for your website on the sim-performance (DIL,FPS, PING). PHP and Round Robin Database on Server needed!<br />
|-<br />
|[[Sim Restart Logger]]<br />
|{{User|Kyrah Abattoir}}<br />
|Counts region restarts and displays log of last 9 restarts together with region FPS and dilation.<br />
|-<br />
|[[SIM status]]<br />
|[[Wizardry and Steamworks]]<br />
|A script that will scan and display the status of SIMs (up, down, starting, stopping, unknown, crashed) from a notecard in the same prim as the script.<br />
|-<br />
|[[Simple Elevator in a Box]]<br />
|{{User|Hank Ramos}}<br />
|Simple elevator example.<br />
|-<br />
|[[Simple Pay Door]]<br />
|{{User|Giygas Static}}<br />
|Simple door you pay to get access.<br />
|-<br />
|[[Skillingo AntiHack Script]]<br />
|{{User2|Tmzasz Luminos}}<br />
|A simple Protection script for skillingo thats modifyable to work with other machines.<br />
|-<br />
|[[Skunk Money]]<br />
|{{User|Hank Ramos}}<br />
|Fun gambling machine of yesteryear, which only supports freeplay now due to SL regulations against gambling.<br />
|-<br />
|[[SLateIt]]<br />
|Babbage Linden<br />
|An augmented virtual reality HUD.<br />
|-<br />
|[[SLetanque]]<br />
|Babbage Linden<br />
|An LSL petanque game.<br />
|-<br />
|[[SLURL HUD]]<br />
|{{User|CodeBastard Redgrave}}<br />
|Touch this HUD to get a SLURL through IM, email and floating text.<br />
|-<br />
|[[BuildSlurl (NewAge)]]<br />
|{{User2|Archile Azalee}}<br />
|A way to create a SLurl in a single function BuildSlurl<br />
|-<br />
|[[SL Mail V1.2]]<br />
|{{User|Flennan Roffo}}<br />
|Second Life mail client V1.2 (released sept'07). Send and receive mail from within Second Life from and to any address. With Address Book function and many chat commands. V1.3 is upcoming soon!<br />
|-<br />
|[[SL_NTPoHTTP_v1.1_client|SL NTPoHTTP client]]<br />
|{{User|SignpostMarv Martin}}<br />
|Second Life Needs Time Parsing over Hyper Text Transfer Protocol<br />
Emulates the function of [[llGetWallclock]] for any timezone by using SLOpenID's SLNTPoHTTP service. Also supports ISO 8601 and RFC 2822 timestamps. Script is dependent upon an external service operated by the author!<br />
|-<br />
|[[Slide Display]]<br />
|[[Wizardry and Steamworks]]<br />
|A display for presentations or talks supporting multiple slides as well as zooming-in on the slides.<br />
|-<br />
|[[Smile]]<br />
|[[Wizardry and Steamworks]]<br />
|An extended smile script supporting two smiles (extendable via a list) and a time delay triggering them at random.<br />
|-<br />
|[[Smooth Rotating Door]]<br />
|{{User|Toy Wylie}}<br />
|A script for doors that open and close smoothly using llTargetOmega<br />
|-<br />
|[[Smooth Rotating Linked Door With Hinge]]<br />
|{{User2|Lyn Mimistrobell}}<br />
|A script for linked uncut (mesh) doors that smoothly rotates around a virtual hinge without the use of timers<br />
|-<br />
|[[Smooth Sliding Door]]<br />
|{{User|SimonT Quinnell}}<br />
|A script for sliding doors that open and close smoothly using [[llMoveToTarget]]. Asjusts for prim orientation.<br />
|-<br />
|[[Snake Game]]<br />
|[[Wizardry and Steamworks]]<br />
|The game of snake in Second Life.<br />
|-<br />
|[[Song Requests]]<br />
|[[Wizardry and Steamworks]]<br />
|Helper script for DJs, allowing listeners to request songs and make dedications.<br />
|-<br />
||[[Sound Preloader]]<br />
|[[User:Trinity Dejavu|Trinity Dejavu]]<br />
||A tripwire that preloads a selection of sound files when avatar collides with prim.<br />
|-<br />
|[[Speed Tester]]<br />
|{{User|Bobbyb30 Swashbuckler}}<br />
|Similar to the [[Efficiency Tester]], this script allows you to test the speed of a particular function or snippet with multiple trials giving min/max/avg/median and the standard deviation.<br />
|-<br />
|[[Spiral Staircase Generator]]<br />
|{{User|Meyermagic Salome}}<br />
|Generates nice looking spiral staircases without much hassle.<br />
|-<br />
|[[String Compare]]<br />
|{{User|Xaviar Czervik}}<br />
|Compares two strings and reliably returns either 1, -1, or 0 if they are the same.<br />
|-<br />
|[[Synchronize]]<br />
|{{User|Cay Trudeau}}<br />
|Makes synchronized start to a task on even/odd seconds<br />
|-<br />
|[[User:Void_Singer/Functions#String:_Find_Last_Index|String: Reverse]]<br />
|{{User|Void Singer}}<br />
|Returns an input string in reverse order<br />
|-<br />
|[[User:Void_Singer/Functions#String:_Get_Reverse_Order|String: Last Index]]<br />
|{{User|Void Singer}}<br />
|Returns the last index of search found in string (the backward equivalent of [[llSubStringIndex]])<br />
|-<br />
|[[Tail Messages (NewAge)]]<br />
|{{User|Asia Snowfall}}<br />
|A super nice easy to use script for those non-scripters out there! NewAge coding has done it again where you no longer need to scroll up and down adding buttons and adding messages, Features a tag system (you'll see what i mean :P)<br />
|-<br />
|[[Taper Door (minimalistic)]]<br />
|{{User2|Kopilo Hallard}}<br />
|A basic script for doors which open and close using taper.<br />
|-<br />
|[[Teleport HUD]]<br />
|{{User|Jesse Barnett}}<br />
|WORKS TO 4096 METERS!! Very user friendly teleport HUD. Add destinations by touching "Add" & naming destination in chat. Automatically gets sim name and coordinates. Will only display the destinations in the sim you are currently in. Demonstrates more advanced list manipulation and stride functions.<br />
|-<br />
|[[User:Void_Singer/Programs#v7-D_Enh._Landmark-2-Map|Teleporter (landmark based)]]<br />
|{{User|Void Singer}}<br />
|Uses Landmarks to offer map teleports. Works as Hud or inworld objects, just drop in landmarks and go.<br />
|-<br />
|[[Text_Scroller|Text Scroller]]<br />
|[[User:Fred_Gandt|Fred Gandt]]<br />
|A simple text display object that scrolls text (applied as a texture) from right to left (like ''those'' LED signs) in a continuous loop.<br />
|-<br />
|[[Bobbyb's texture changer|Texture Changers]]<br />
|{{User|Bobbyb30 Swashbuckler}}<br />
|A collection of texture changing scripts.<br />
|-<br />
|[[Texture Menu Management|Texture Management]]<br />
|{{User|Revolution Perenti}}<br />
|Dialog Menu based Texture Selection.<br />
|-<br />
|[[Texture Particle Poofer|Texture Particle Poofer]]<br />
|[[Wizardry and Steamworks]]<br />
|This is a generic dialog-based particle poofer, emitting textures towards an avatar for a configurable amount of time.<br />
|-<br />
|[[User:Xen_Lisle/Texture_Slide|Texture Slide]]<br />
|{{User|Xen Lisle}}<br />
|Slides a texture on mouse movement<br />
|-<br />
|[[Tic Tac Toe]]<br />
|CG Linden<br />
|Step by step demo on how to implement a larger scripting project<br />
|-<br />
|[[TightList]]<br />
|{{User|Strife Onizuka}}<br />
|Tight List is a family of functions for encoding lists as strings and then decoding them back into lists.<br />
There are two flavors: TightList and TightListType. TightListType preserves types and uses a 6 char header, while TightList uses a 1 char header that doesn't preserve type.<br />
|-<br />
|[[Timer Module]]<br />
|{{User|Isabelle Aquitaine}}<br />
|Manage multiple timers via linked messages.<br />
|-<br />
|[[Two Avatars on single prim]]<br />
|{{User2|Pale Janus|Cay Trudeau}}<br />
|Allow two (or more) avatars to sit on same prim<br />
|-<br />
|[[User:Void_Singer/Functions#Unix_time_code_to_list_format|Timestamp:<br>Unix time code to list format]]<br />
|{{User|Void Singer}}<br />
|converts Unix timestamps to their [Y, M, D, h, m, s] equivalents (ex: 1234567890 to [2009, 2, 13, 3, 31, 30])<br />
|-<br />
|[[User:Void_Singer/Functions#List_format_to_Unix_time_code.|Timestamp:<br>List format to Unix time code]]<br />
|{{User|Void Singer}}<br />
|converts [Y, M, D, h, m, s] timestamps to their Unix equivalents (ex: [2009, 2, 13, 3, 31, 30] to 1234567890)<br />
|-<br />
|[[User:Void_Singer/Functions#Weekday_from_Unix_timestamp|Timestamp:<br>Weekday from Unix timestamp]]<br />
|{{User|Void Singer}}<br />
|Gets weekday from Unix timestamps (ex: "Friday" from 1234567890)<br />
|-<br />
|[[Texture Repeater]]<br />
|{{User2|Jenna Felton}}<br />
|Observes textures and texture parameters on the prim. If changed, bulk-updates other prims in linkset.<br />
|-<br />
|[[The Stash (Bank)]]<br />
|[[Wizardry and Steamworks]]<br />
|This is a depositing system to link your secondary account (alt) to a prim in-world so you can retrieve money without switching back and forth between accounts. It supports setting an upper limit, sharing the stash if you wish, logging everybody who deposited money and retrieved money, sending money to a list of bookmarked avatars and getting a status of your current holdings. It also explains some tricks for developers, for example, how to get another timer() if your current timer() is used up already.<br />
|-<br />
|[[Tipjar]]<br />
|[[Wizardry and Steamworks]]<br />
|This is a fully fledged tipjar supporting shared access, split profits, inviting to group, handing over gifts, maintaining statistics of who tipped most and who tipped in general, eliminating deed to group and comes with an innovative feature: it periodically moves around from avatar to avatar in the room and returns back to its initial position after a sweep. This way your tijpar will not be static, but participate in the party!<br />
|-<br />
|[[User:Void_Singer/Functions#Weekday_from_.28_Y.2C_M.2C_D_.29_format|Timestamp:<br>Weekday from (Y, M, D) format]]<br />
|{{User|Void Singer}}<br />
|Gets weekday from (Y, M, D) timestamps (ex: "Friday" from (2009, 2, 13))<br />
|-<br />
|[[Touch A Quote]]<br />
|{{User|CodeBastard Redgrave}}<br />
|Touch an object to read quotes sequentially from a notecard<br />
|-<br />
|[[Touring Balloon]]<br />
|{{User|Hank Ramos}}<br />
|Automated touring balloon with many options from long ago. Always seems to work on one SL release, and not the other.<br />
|-<br />
|[[Towncrier]]<br />
|[[Wizardry and Steamworks]]<br />
|A simple towncrier to be used in role-play SIMs or wherever there is a need to broadcast news in random intervals.<br />
|-<br />
|[[Trivia]]<br />
|[[Wizardry and Steamworks]]<br />
|A trivia game engine with provided ready-made notecards.<br />
|-<br />
|[[Under Age Boot]]<br />
|{{User|Chance Unknown}}<br />
|Security device example to teleport home accounts below a minimum age limit; can be useful in combating free griefer accounts.<br />
|-<br />
|[[User:Rolig_Loon/UNDO_PosRot|UNDO_PosRot]]<br />
|{{User|Rolig Loon}}<br />
|Allows user to undo position and rotation changes that have been made "manually" to any or all prims in a linkset.<br />
|-<br />
|[[Universal Translator]]<br />
|{{User|Hank Ramos}}<br />
|Chat listener that handles seamless translation of public chat between 50+ written languages without the need for configuration. Handles numerous avatars, auto-detects languages, and works together with multiple copies of translators to spread-workload using a sophisticated back-end communications sub-system.<br />
|-<br />
|[[Unix2DateTime]]<br />
|{{User|Flennan Roffo}}<br />
|Conversion from Unix time ([[llGetUnixTime]]()) to date and time string and vice versa.<br />
|-<br />
|[[Unmutable Descript Nagger]]<br />
|{{User|Bobbyb30 Zohari}}<br />
|To nag avatars to take off their scripted attatchments.<br />
|-<br />
|[[Unpacker On Rez (NewAge)]]<br />
|{{User|Asia Snowfall}}<br />
|A very simple to use script for all you creators out there, This script will enable you to send out boxed items and make it easier for users to unpack, Also features auto die on completion. Very simple to configure!<br />
|-<br />
|[[Unpacker On Touch (NewAge)]]<br />
|{{User|Asia Snowfall}}<br />
|Exactly like Unpacker On Rez, But changed some things about to make it Unpack On Touch<br />
|-<br />
|[[Update distributor]]<br />
|{{User|Dale Innis}}<br />
|Distribute an object (like a project update) to a list of people named in a notecard.<br />
|-<br />
|[[UUID2Channel]]<br />
|{{User|Project Neox}}<br />
|Optimised version of the original key2channel generators.<br />
|-<br />
|[[UUID Song Generator]]<br />
|{{User2|Sendao Goodman}}<br />
|Translates a UUID into a simple song and plays it.<br />
|-<br />
|[[User:Void_Singer/Programs#v7-D_Advanced_Visitor_Greeter|Visitor Greeter]]<br />
|{{User|Void Singer}}<br />
|Reduced spam visitor greeter, highly configurable, easy to modify.<br />
|-<br />
|[[VariText]]<br />
|[[User:Geneko Nemeth|Geneko Nemeth (Kakurady)]]<br />
|Display text on a prim, without looking like from a typewriter<br />
|-<br />
|[[Visitor Logger (Web/Basic) ]]<br />
|{{User|Buddy Sprocket}}<br />
|A very basic visitor logger - log visitors in SL to a text file on your web-site.<br />
|-<br />
|[[Visitors]]<br />
|[[Wizardry and Steamworks]]<br />
|A series of scripts to hold lists of visitors taking into account display names and supporting tracking multiple visits.<br />
|-<br />
|[[Volleyball Game (Kira's Artillery Variations)]]<br />
|[[Wizardry and Steamworks]]<br />
|The game of Volleyball in SecondLife, based on the [[Artillery]] script and freefall theory. Full build instructions, scripts, import archive and marketplace freebie product. All full permission.<br />
|-<br />
|[[Vote Simple]]<br />
|{{User|JB Kraft}}<br />
|Simple vote collector. One avi, one vote.<br />
|-<br />
|[[Walking Sound (NewAge)]]<br />
|{{User|Asia Snowfall}}<br />
|Very powerful walking sound script, Featuring customer ability to add their own sounds with the API Sound Feature!<br />
|-<br />
|[[Wanderer]]<br />
|[[Wizardry and Steamworks]]<br />
|A script that can be used to randomly move a prim around relative to its origin point. Can be used for breeders, robots, birds and other applications where a primitive has to move around by itself.<br />
|-<br />
|[[WarpPos]]<br />
|{{User2|Keknehv Psaltery}}<br />
|Non-physical movement without the 10m limit.<br />
|-<br />
|[[Watchdog]]<br />
|{{User|Tika Oberueng}}<br />
|LSL Watchdog scripts to monitor other scripts in the prim and restart them if they crash or stop running.<br />
|-<br />
|[[Wiki3DBuilder]] [[Wiki3DBuilder1.0]]<br />
|{{User|Salahzar Stenvaag}}<br />
|Allows a group of people to collectively build up complex 3D mindmaps with connected concepts. Uses particles for connections and low prim usage. Nodes can be textured, colored, changed form size moved collectively by everybody and can distribute notecards, landmarks, URL, objects, textures. I provide two version 0.1 and 1.0 and probably next version will communicate with moodle and sloodle external websites.<br />
|-<br />
|[[Window Control]]<br />
|{{User|Emmas Seetan}}<br />
|For window opacity, helpful for buildings.<br />
|-<br />
|[[XTEA Strong Encryption Implementation]]<br />
|{{User|Morse Dillon}}<br />
|An LSL implementation of XTEA (eXtended Tiny Encryption Algorithm). This is the first known public release of a 'real' strong encryption implementation in LSL and is released under the GNU General Public License (GPL).<br />
|-<br />
|[[XyText 1.5|XyText]]<br />
|{{User2|Xylor Baysklef}}<br />
| Display text (up to 10 characters) on a prim. Use as many prims as desired.<br />
|-<br />
|[[XyyyyzText|XyyyyzText]]<br />
|{{User|Criz Collins}}<br />
| Display text (up to 10 characters) on a prim. Displays different text for each line instead of one single text, that will be broken into the next lines. Watch here for what that means: http://screencast.com/t/1wMLujLcEO<br />
|-<br />
|[[XyzzyText|XyzzyText]]<br />
|{{User|Thraxis Epsilon}} and {{User|Gigs Taggart}}<br />
| Display text (up to 10 characters) on a prim. Way more efficient than XyText.<br />
|-<br />
|[[Youtube TV]]<br />
|{{User|Morgam Biedermann}}<br />
|Watch your favorite Youtube videos / auto set the texture to the parcel media texture.<br />
|-<br />
|[[Input number of seconds, get a string back that shows days, hours, minutes, seconds]]<br />
|{{User|Fire Centaur}}<br />
|Returns a string that displays days, hours, seconds<br />
|-<br />
|[[Presenter with Timer]]<br />
|[[User:Fire Centaur]]<br />
|Yet another texture presenter with a timer, lock, next/prev etc<br />
|-<br />
|[[Random Giver Prim]]<br />
|{{User|Damian Darkwyr}}<br />
|A randomized item giver with a game-like twist<br />
|-<br />
|[[Client Specific Contents Giver]]<br />
|{{User|Damian Darkwyr}}<br />
|Give Contents only to users of a specific Client. Such as Phoenix, CoolVL or 2.0<br />
|-<br />
|[[User:Void_Singer/v7-D_Zen_Resizer|Zen Resizer]]<br />
|{{User|Void Singer}}<br />
|Single script object resizer w/ multi-language & multi-menu support, + many other features for simple or advanced use.<br />
|-<br />
|[[User:Yumi Murakami/Weaver Spell Grid|Weaver Spell Grid]]<br />
|{{User|Yumi Murakami}}<br />
|Designs simple objects and creates them with magic words.<br />
|-<br />
|[[Zero Lag Poseball]]<br />
|{{User|Jippen Faddoul}} and {{User|Daemonika Nightfire}}<br />
|A simple poseball with no lag<br />
|-<br />
|[[User:Dora_Gustafson/bezier_toy|Bézier Toy]]<br />
|{{User|Dora Gustafson}}<br />
|Strictly for fun! The toy is made by one prim and a script. The prim will move along a smooth closed Bézier curve in space until it is stopped.<br />
|}<br />
<br />
==Support Script Library==<br />
These are scripts in other languages, intended to be run on other systems that support scripts written in LSL<br />
<br />
{| class="sortable" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Name'''<br />
! '''Creator'''<br />
! '''Description'''<br />
|-<br />
|[https://github.com/Nexii-Malthus/phpPathfinding phpPathfinding]<br />
|{{User|Nexii Malthus}}<br />
|PHP script for offloading complex pathfinding operations away from heavy use simulators onto external servers. Primarily A* Algorithm. Flexible -- works with any type of node graph. Public Domain. Clean and minimalistic code.<br />
|-<br />
|[[User:Ina Centaur/UUID/calimg.api|Calendar Image UUID API]]<br />
|{{User|Ina Centaur}}<br />
|API that gives the UUID of an image of a calendar image give month and year arguments.<br />
|-<br />
|[[HTTP Post request to a PHP server]]<br />
|{{User|Corto Maltese}}<br />
|This small library allows you to make simple POST requests to your website. The libraries allow you to get your request through the variable $_POST on the server. It also include a basic security mechanism aimed to stop hacking. Comprises of LSL client script and PHP server script.<br />
|-<br />
|[[User:Ina Centaur/PHP/k2n.php|Key2Name.php]]<br />
|{{User|Ina Centaur}}<br />
|Get Avatar's Name using Second Life search service. (like in LSL Key2Name)<br />
|-<br />
|[[User:Darien_Caldwell/HTTP-DNS|HTTP-IN DNS]]<br />
|{{User|Darien Caldwell}}<br />
|Public Domain DNS and HTTP-IN URL Distribution system running on GAE (the original). Deploy your own for maximum utility and security.<br />
|-<br />
|[[Lame_Object_DNS_and_Cross_Sim_Messaging|Lame Object DNS and Cross Sim Messaging]]<br />
|{{User2|Liandra Ceawlin}}<br />
|Simple, cheeseball method of doing cross-sim communications with http-in and an external object DNS service.<br />
|-<br />
|[[Minify|LSL Minify]]<br />
|[[Wizardry and Steamworks]]<br />
|LSL Minification and obfuscation tool written in JavaScript. Contains a form on the wiki using a widget where you can post LSL scripts to be minified as well as the source-code. For another full-screen demo you may [http://eva.comaroski.me/lslclean.html check it on my website]. To use, paste any LSL code and press ctrl+alt+enter to get the minified version.<br />
|-<br />
|[[User:SignpostMarv Martin/PHP/llXorBase64StringsCorrect|llXorBase64StringsCorrect]]<br />
|{{User|SignpostMarv Martin}}<br />
|An implementation of [[llXorBase64StringsCorrect]] in PHP- should be useful if you're using llXorBase64StringsCorrect to do cryptography work in LSL2 and posting it out to the web via [[llHTTPRequest]].<br />
|-<br />
|[[User:SignpostMarv Martin/PHP/lsl fu.php|lsl_fu.php]]<br />
|{{User|SignpostMarv Martin}}<br />
|A basic OOP'd PHP Class containing VeloxSeverine's $_POST fixer and Marv's own eccentric ideas for "fixing" things.<br />
|-<br />
|[[User:Jor3l Boa/PHP/n2k.php|Name2Key.php]]<br />
|{{User|Jor3l Boa}}<br />
|Get Avatar's UUID using Second Life search service. (like in LSL Name2Key)<br />
|-<br />
|[[Public_Object_DNS|Public Object DNS]]<br />
|{{User2|Liandra Ceawlin}}<br />
|Public object DNS-like system running on GAE, for http-in. Hopefully scalable enough for wide-spread usage.<br />
|-<br />
|[[Rake|Rake]]<br />
|[[Wizardry and Steamworks]]<br />
|A C# utility meant to create full inventory backups to your local hard-drive including Textures/Sculpts, Animations, Notecards and Scripts.<br />
|-<br />
|Silo<br />
|{{User2|Zero Linden}}<br />
|General purpose data store in PHP. Use this to persist arbitrary data from LSL via [[llHTTPRequest]]. See:<br />
* [http://www.notabene-sl.com/misc/silo-README.txt README] file<br />
* [http://www.notabene-sl.com/misc/silo.tgz silo.tgz] tarball<br />
* forum post [http://forums-archive.secondlife.com/54/69/119570/1.html Announcement].<br />
|-<br />
|[[Silverday ObjectDNS]]<br />
|{{User|Till Stirling}}<br />
|Dynamic Object-DNS-System to provide dynamic mapping of LSL-URLs to persistent domains. Features include redirect service, password protected domains, write protected domains, LSL-API for all necessary functions, optional web-interface.<br />
|-<br />
|[https://github.com/jgpippin/sldb SLDB]<br />
|{{User2|Luc Aubret}}<br />
|Flexible web database storage using PHP/MySQL. Used to store per-user field/value pairs from in-world objects using [[llHTTPRequest]].<br />
|-<br />
|[https://tlabsfoundry.atlassian.net/wiki/display/SLAD/SL+Asset+Data SL Asset Data]<br />
|{{User|Trimda Hedges}}<br />
|A set of Java classes to retrieve information about Groups, Parcels and Agents/Avatars based on their key (UUID). Includes caching of requests and results and example application. Copyright under Eclipse Public License v1<br />
* [https://tlabsfoundry.atlassian.net/wiki/display/SLAD/Downloads Downloads]<br />
* [http://trimda.com/javadocs/slassetdata/1.1.0/ JavaDocs]<br />
* [https://tlabsfoundry.atlassian.net/wiki/display/TF/TLabs+Foundry Other Projects]<br />
|}<br />
<br />
== See Also ==<br />
<div style="padding: 0.5em"><br />
'''Articles'''<br />
*[[:Category:LSL Examples| Examples]]<br />
<br />
</div></div><br />
<br />
{{LSLC|}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlRequestInventoryData&diff=1210350LlRequestInventoryData2021-10-24T17:17:43Z<p>Tapple Gao: move the landmark2slurl script to its own page</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/inventory|name|uuid=false}}<br />
|func_id=156|func_sleep=1.0|func_energy=10.0<br />
|func=llRequestInventoryData<br />
|return_type=key<br />
|return_subtype=handle<br />
|p1_type=string|p1_name=name|p1_desc<br />
|func_footnote<br />
|func_desc=Requests data about the item {{LSLP|name}} in the prim's inventory. When data is available the [[dataserver]] event will be raised.<br />
|Return_text=that is used to identify the [[dataserver]] event when it is raised.<br />
|spec<br />
|caveats=<br />
* This function only returns data for landmark items in inventory. Other item types are not supported.<br />
* The description of the vector returned in the [[dataserver]] event above implies the value is a region coordinate; it in fact represents the distance in meters of the landmark's location relative to <0,0,0> in the region in which the script is running. For a landmark pointing to a location in the current region, that's the same as a region coordinate; however, when used with a landmark pointing to a different region the vector's x and y values can be quite large (and/or negative). The vector is suitable for use in calculating a global coordinate (as above) or a landmark's distance from the object containing the script in the current region or across the entire Second Life grid.<br />
|constants=<br />
{{{!}} {{Prettytable}}<br />
{{!}}-{{Hl2}}<br />
! colspan="2"{{!}} {{LSLPT|name}}'s Inventory Type <br />
!{{!}} [[dataserver]]<br />
!{{!}} Description<br />
{{!}}-<br />
{{LSL Constants/llRequestInventoryData}}<br />
{{!}}}<br />
|examples=<br />
<source lang="lsl2">//-- Open map for owner to 1st landmark in object inventory on touch<br />
//-- *MUST* be in an attached object (llMapDestination Requirement for non-touch use)<br />
key vgKeyOwner;<br />
<br />
default<br />
{<br />
touch_start( integer vIntNull )<br />
{<br />
if (llDetectedKey( 0 ) == vgKeyOwner)<br />
{<br />
integer vIntLMcount = llGetInventoryNumber( INVENTORY_LANDMARK );<br />
//-- make sure we have a landmark in invetory<br />
if (vIntLMcount)<br />
{<br />
llRequestInventoryData( llGetInventoryName( INVENTORY_LANDMARK, 0 ) );<br />
}<br />
}<br />
}<br />
<br />
dataserver( key vKeyNull, string vStrData )<br />
{<br />
//-- because we don't know who touched us in this event, this<br />
//-- only works for the owner when called from the dataserver<br />
llMapDestination( llGetRegionName(), (vector)vStrData, ZERO_VECTOR );<br />
}<br />
<br />
on_rez( integer vIntNull )<br />
{<br />
llResetScript();<br />
}<br />
<br />
state_entry()<br />
{<br />
vgKeyOwner = llGetOwner();<br />
}<br />
}</source><br />
<source lang="lsl2">//An easily-configurable teleporter that sets its destination by getting it from a landmark in the prim's inventory<br />
//Note: this teleporter is subject to the 300m distance limit for llSitTarget<br />
//by Ilse Mannonen<br />
<br />
//on state entry, request inventory data and set text for first landmark found in inventory. <br />
//If none, complain<br />
//on getting data, set sit target<br />
//on change in inventory, reset script<br />
//on sit, TP the person and unsit<br />
<br />
//Thanks to Pol Tabla, who wrote the simple sit-teleport script I have adapted here<br />
<br />
key requestid;<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
//complain if there are no landmarks<br />
if (llGetInventoryNumber(INVENTORY_LANDMARK) == 0)<br />
{<br />
llSay(0, "There are no landmarks in me. You need to put a landmark in me for me to work.");<br />
}<br />
else<br />
{<br />
//set floating text according to the LM name<br />
llSetText("Teleport to " + llGetInventoryName(INVENTORY_LANDMARK, 0), <1.0, 1.0, 1.0>, 1.0);<br />
//request the LM data<br />
requestid = llRequestInventoryData(llGetInventoryName(INVENTORY_LANDMARK, 0));<br />
}<br />
}<br />
<br />
dataserver(key id, string data)<br />
{<br />
if (id == requestid)<br />
{<br />
//data will be in vector format<br />
rotation rot = ZERO_ROTATION / llGetRot();<br />
vector dest = (vector)data;<br />
vector offset = (dest - llGetPos()) * rot;<br />
llSitTarget(offset, rot);<br />
}<br />
}<br />
<br />
changed(integer change)<br />
{<br />
if (change & CHANGED_LINK) <br />
{ // and it was a link change<br />
llSleep(0.5); // llUnSit works better with this delay<br />
key user = llAvatarOnSitTarget();<br />
if (user) { // somebody is sitting on me<br />
llUnSit(user); // unsit him<br />
}<br />
}<br />
//when doing "ifs" on bitwise things, it's best to do them separate instead of using else..if,<br />
//in case you hit the one in a billion chance when the inventory and link changes are reported in the same event.<br />
if (change & CHANGED_INVENTORY)<br />
{<br />
//reset on inventory change, so people don't have to manually reset when they add a new LM<br />
llResetScript();<br />
}<br />
}<br />
<br />
on_rez(integer param)<br />
{<br />
llResetScript();<br />
}<br />
}</source><br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llMapDestination]]|}}<br />
{{LSL DefineRow||[[Linden_Lab_Official:Map_API_Reference#Region_name_from_global_coordinates]]|}}<br />
|also_tests<br />
|also_events=<br />
{{LSL DefineRow||[[dataserver]]|}}<br />
|also_articles=<br />
{{LSL DefineRow||[[landmark2slurl]]|}}<br />
|notes<br />
|deprecated<br />
|cat1=Inventory<br />
|cat2=Dataserver<br />
|cat3=Landmark<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=CatSLURL&diff=1210349CatSLURL2021-10-24T17:13:41Z<p>Tapple Gao: added landmark2slurl</p>
<hr />
<div>{{LSL Header|ml=*}}{{RightToc}}<br />
==SLURL==<br />
<br />
{| class="sortable" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Name'''<br />
! '''Creator'''<br />
! '''Description'''<br />
|-<br />
||[[SLURL HUD]]<br />
||[[User:CodeBastard Redgrave|CodeBastard Redgrave]]<br />
||Touch this HUD to get a SLURL through IM, email and floating text.<br />
|-<br />
||[[BuildSlurl (NewAge)]]<br />
||[[User:Archile Azalee|Archile Azalee]]<br />
||A way to create a SLurl in a single function BuildSlurl<br />
|-<br />
||[[landmark2slurl]]<br />
||[[User:Tapple Gao|Tapple Gao]]<br />
||Convert all landmarks in inventory to slurls<br />
|}<br />
<br />
{{LSLC|}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Landmark2slurl&diff=1210348Landmark2slurl2021-10-24T17:12:11Z<p>Tapple Gao: added header</p>
<hr />
<div>{{LSL Header}}<br />
<source lang="lsl2"><br />
// Click to print slurl for every landmark in inventory.<br />
// Uses llRequestInventoryData() to get coordinates<br />
// Uses http://wiki.secondlife.com/wiki/Linden_Lab_Official:Map_API_Reference#Region_name_from_global_coordinates to get region name<br />
integer landmarkIndex;<br />
vector landmarkCoords;<br />
string landmarkRegion;<br />
string landmarkSlurl;<br />
key inventoryRequestId;<br />
key mapRequestId;<br />
<br />
requestLandmarkInfo(integer inventoryIndex) {<br />
if (inventoryIndex >= llGetInventoryNumber(INVENTORY_LANDMARK)) return;<br />
landmarkIndex = inventoryIndex;<br />
string landmarkName = llGetInventoryName(INVENTORY_LANDMARK, landmarkIndex);<br />
inventoryRequestId = llRequestInventoryData(landmarkName);<br />
}<br />
<br />
default {<br />
touch_start(integer count) {<br />
requestLandmarkInfo(0);<br />
}<br />
<br />
dataserver(key requestId, string data) {<br />
if (requestId != inventoryRequestId) return;<br />
if ((vector)data == ZERO_VECTOR) return;<br />
// landmark request<br />
landmarkCoords = llGetRegionCorner() + (vector)data;<br />
// http://wiki.secondlife.com/wiki/Linden_Lab_Official:Map_API_Reference#Region_name_from_global_coordinates<br />
mapRequestId = llHTTPRequest(<br />
"https://cap.secondlife.com/cap/0/b713fe80-283b-4585-af4d-a3b7d9a32492?var=region"<br />
+ "&grid_x=" + (string)((integer)landmarkCoords.x / 256)<br />
+ "&grid_y=" + (string)((integer)landmarkCoords.y / 256), [], "");<br />
}<br />
<br />
http_response(key requestId, integer status, list metadata, string body) {<br />
if (requestId != mapRequestId) return;<br />
landmarkRegion = llList2String(llParseString2List(body, ["var region='", "';"], []), 0);<br />
landmarkSlurl = "http://maps.secondlife.com/secondlife/" + llEscapeURL(landmarkRegion) +<br />
"/" + (string)((integer)landmarkCoords.x % 256) +<br />
"/" + (string)((integer)landmarkCoords.y % 256) +<br />
"/" + (string)((integer)landmarkCoords.z);<br />
llOwnerSay(llGetInventoryName(INVENTORY_LANDMARK, landmarkIndex) + ": "<br />
+ landmarkSlurl + " <nolink>" + landmarkSlurl + "</nolink>");<br />
requestLandmarkInfo(landmarkIndex + 1);<br />
}<br />
}</source></div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Landmark2slurl&diff=1210347Landmark2slurl2021-10-24T17:10:51Z<p>Tapple Gao: Added the script</p>
<hr />
<div><source lang="lsl2"><br />
// Click to print slurl for every landmark in inventory.<br />
// Uses llRequestInventoryData() to get coordinates<br />
// Uses http://wiki.secondlife.com/wiki/Linden_Lab_Official:Map_API_Reference#Region_name_from_global_coordinates to get region name<br />
integer landmarkIndex;<br />
vector landmarkCoords;<br />
string landmarkRegion;<br />
string landmarkSlurl;<br />
key inventoryRequestId;<br />
key mapRequestId;<br />
<br />
requestLandmarkInfo(integer inventoryIndex) {<br />
if (inventoryIndex >= llGetInventoryNumber(INVENTORY_LANDMARK)) return;<br />
landmarkIndex = inventoryIndex;<br />
string landmarkName = llGetInventoryName(INVENTORY_LANDMARK, landmarkIndex);<br />
inventoryRequestId = llRequestInventoryData(landmarkName);<br />
}<br />
<br />
default {<br />
touch_start(integer count) {<br />
requestLandmarkInfo(0);<br />
}<br />
<br />
dataserver(key requestId, string data) {<br />
if (requestId != inventoryRequestId) return;<br />
if ((vector)data == ZERO_VECTOR) return;<br />
// landmark request<br />
landmarkCoords = llGetRegionCorner() + (vector)data;<br />
// http://wiki.secondlife.com/wiki/Linden_Lab_Official:Map_API_Reference#Region_name_from_global_coordinates<br />
mapRequestId = llHTTPRequest(<br />
"https://cap.secondlife.com/cap/0/b713fe80-283b-4585-af4d-a3b7d9a32492?var=region"<br />
+ "&grid_x=" + (string)((integer)landmarkCoords.x / 256)<br />
+ "&grid_y=" + (string)((integer)landmarkCoords.y / 256), [], "");<br />
}<br />
<br />
http_response(key requestId, integer status, list metadata, string body) {<br />
if (requestId != mapRequestId) return;<br />
landmarkRegion = llList2String(llParseString2List(body, ["var region='", "';"], []), 0);<br />
landmarkSlurl = "http://maps.secondlife.com/secondlife/" + llEscapeURL(landmarkRegion) +<br />
"/" + (string)((integer)landmarkCoords.x % 256) +<br />
"/" + (string)((integer)landmarkCoords.y % 256) +<br />
"/" + (string)((integer)landmarkCoords.z);<br />
llOwnerSay(llGetInventoryName(INVENTORY_LANDMARK, landmarkIndex) + ": "<br />
+ landmarkSlurl + " <nolink>" + landmarkSlurl + "</nolink>");<br />
requestLandmarkInfo(landmarkIndex + 1);<br />
}<br />
}</source></div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlRequestInventoryData&diff=1210346LlRequestInventoryData2021-10-24T17:03:12Z<p>Tapple Gao: Add sample script to convert landmark to slurl</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{LSL_Function/inventory|name|uuid=false}}<br />
|func_id=156|func_sleep=1.0|func_energy=10.0<br />
|func=llRequestInventoryData<br />
|return_type=key<br />
|return_subtype=handle<br />
|p1_type=string|p1_name=name|p1_desc<br />
|func_footnote<br />
|func_desc=Requests data about the item {{LSLP|name}} in the prim's inventory. When data is available the [[dataserver]] event will be raised.<br />
|Return_text=that is used to identify the [[dataserver]] event when it is raised.<br />
|spec<br />
|caveats=<br />
* This function only returns data for landmark items in inventory. Other item types are not supported.<br />
* The description of the vector returned in the [[dataserver]] event above implies the value is a region coordinate; it in fact represents the distance in meters of the landmark's location relative to <0,0,0> in the region in which the script is running. For a landmark pointing to a location in the current region, that's the same as a region coordinate; however, when used with a landmark pointing to a different region the vector's x and y values can be quite large (and/or negative). The vector is suitable for use in calculating a global coordinate (as above) or a landmark's distance from the object containing the script in the current region or across the entire Second Life grid.<br />
|constants=<br />
{{{!}} {{Prettytable}}<br />
{{!}}-{{Hl2}}<br />
! colspan="2"{{!}} {{LSLPT|name}}'s Inventory Type <br />
!{{!}} [[dataserver]]<br />
!{{!}} Description<br />
{{!}}-<br />
{{LSL Constants/llRequestInventoryData}}<br />
{{!}}}<br />
|examples=<br />
<source lang="lsl2">//-- Open map for owner to 1st landmark in object inventory on touch<br />
//-- *MUST* be in an attached object (llMapDestination Requirement for non-touch use)<br />
key vgKeyOwner;<br />
<br />
default<br />
{<br />
touch_start( integer vIntNull )<br />
{<br />
if (llDetectedKey( 0 ) == vgKeyOwner)<br />
{<br />
integer vIntLMcount = llGetInventoryNumber( INVENTORY_LANDMARK );<br />
//-- make sure we have a landmark in invetory<br />
if (vIntLMcount)<br />
{<br />
llRequestInventoryData( llGetInventoryName( INVENTORY_LANDMARK, 0 ) );<br />
}<br />
}<br />
}<br />
<br />
dataserver( key vKeyNull, string vStrData )<br />
{<br />
//-- because we don't know who touched us in this event, this<br />
//-- only works for the owner when called from the dataserver<br />
llMapDestination( llGetRegionName(), (vector)vStrData, ZERO_VECTOR );<br />
}<br />
<br />
on_rez( integer vIntNull )<br />
{<br />
llResetScript();<br />
}<br />
<br />
state_entry()<br />
{<br />
vgKeyOwner = llGetOwner();<br />
}<br />
}</source><br />
<source lang="lsl2">//An easily-configurable teleporter that sets its destination by getting it from a landmark in the prim's inventory<br />
//Note: this teleporter is subject to the 300m distance limit for llSitTarget<br />
//by Ilse Mannonen<br />
<br />
//on state entry, request inventory data and set text for first landmark found in inventory. <br />
//If none, complain<br />
//on getting data, set sit target<br />
//on change in inventory, reset script<br />
//on sit, TP the person and unsit<br />
<br />
//Thanks to Pol Tabla, who wrote the simple sit-teleport script I have adapted here<br />
<br />
key requestid;<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
//complain if there are no landmarks<br />
if (llGetInventoryNumber(INVENTORY_LANDMARK) == 0)<br />
{<br />
llSay(0, "There are no landmarks in me. You need to put a landmark in me for me to work.");<br />
}<br />
else<br />
{<br />
//set floating text according to the LM name<br />
llSetText("Teleport to " + llGetInventoryName(INVENTORY_LANDMARK, 0), <1.0, 1.0, 1.0>, 1.0);<br />
//request the LM data<br />
requestid = llRequestInventoryData(llGetInventoryName(INVENTORY_LANDMARK, 0));<br />
}<br />
}<br />
<br />
dataserver(key id, string data)<br />
{<br />
if (id == requestid)<br />
{<br />
//data will be in vector format<br />
rotation rot = ZERO_ROTATION / llGetRot();<br />
vector dest = (vector)data;<br />
vector offset = (dest - llGetPos()) * rot;<br />
llSitTarget(offset, rot);<br />
}<br />
}<br />
<br />
changed(integer change)<br />
{<br />
if (change & CHANGED_LINK) <br />
{ // and it was a link change<br />
llSleep(0.5); // llUnSit works better with this delay<br />
key user = llAvatarOnSitTarget();<br />
if (user) { // somebody is sitting on me<br />
llUnSit(user); // unsit him<br />
}<br />
}<br />
//when doing "ifs" on bitwise things, it's best to do them separate instead of using else..if,<br />
//in case you hit the one in a billion chance when the inventory and link changes are reported in the same event.<br />
if (change & CHANGED_INVENTORY)<br />
{<br />
//reset on inventory change, so people don't have to manually reset when they add a new LM<br />
llResetScript();<br />
}<br />
}<br />
<br />
on_rez(integer param)<br />
{<br />
llResetScript();<br />
}<br />
}</source><br />
<source lang="lsl2">// Click to print slurl for every landmark in inventory.<br />
// Uses llRequestInventoryData() to get coordinates<br />
// Uses http://wiki.secondlife.com/wiki/Linden_Lab_Official:Map_API_Reference#Region_name_from_global_coordinates to get region name<br />
integer landmarkIndex;<br />
vector landmarkCoords;<br />
string landmarkRegion;<br />
string landmarkSlurl;<br />
key inventoryRequestId;<br />
key mapRequestId;<br />
<br />
requestLandmarkInfo(integer inventoryIndex) {<br />
if (inventoryIndex >= llGetInventoryNumber(INVENTORY_LANDMARK)) return;<br />
landmarkIndex = inventoryIndex;<br />
string landmarkName = llGetInventoryName(INVENTORY_LANDMARK, landmarkIndex);<br />
inventoryRequestId = llRequestInventoryData(landmarkName);<br />
}<br />
<br />
default {<br />
touch_start(integer count) {<br />
requestLandmarkInfo(0);<br />
}<br />
<br />
dataserver(key requestId, string data) {<br />
if (requestId != inventoryRequestId) return;<br />
if ((vector)data == ZERO_VECTOR) return;<br />
// landmark request<br />
landmarkCoords = llGetRegionCorner() + (vector)data;<br />
// http://wiki.secondlife.com/wiki/Linden_Lab_Official:Map_API_Reference#Region_name_from_global_coordinates<br />
mapRequestId = llHTTPRequest(<br />
"https://cap.secondlife.com/cap/0/b713fe80-283b-4585-af4d-a3b7d9a32492?var=region"<br />
+ "&grid_x=" + (string)((integer)landmarkCoords.x / 256)<br />
+ "&grid_y=" + (string)((integer)landmarkCoords.y / 256), [], "");<br />
}<br />
<br />
http_response(key requestId, integer status, list metadata, string body) {<br />
if (requestId != mapRequestId) return;<br />
landmarkRegion = llList2String(llParseString2List(body, ["var region='", "';"], []), 0);<br />
landmarkSlurl = "http://maps.secondlife.com/secondlife/" + llEscapeURL(landmarkRegion) +<br />
"/" + (string)((integer)landmarkCoords.x % 256) +<br />
"/" + (string)((integer)landmarkCoords.y % 256) +<br />
"/" + (string)((integer)landmarkCoords.z);<br />
llOwnerSay(llGetInventoryName(INVENTORY_LANDMARK, landmarkIndex) + ": "<br />
+ landmarkSlurl + " <nolink>" + landmarkSlurl + "</nolink>");<br />
requestLandmarkInfo(landmarkIndex + 1);<br />
}<br />
}</source><br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llMapDestination]]|}}<br />
{{LSL DefineRow||[[Linden_Lab_Official:Map_API_Reference#Region_name_from_global_coordinates]]|}}<br />
|also_tests<br />
|also_events=<br />
{{LSL DefineRow||[[dataserver]]|}}<br />
|also_articles<br />
|notes<br />
|deprecated<br />
|cat1=Inventory<br />
|cat2=Dataserver<br />
|cat3=Landmark<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlInstantMessage&diff=1210340LlInstantMessage2021-10-18T01:56:26Z<p>Tapple Gao: Made note of how bundling multiple messages into a single email works</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{Issues/SVC-92}}{{LSL_Function/avatar|user}}{{LSL_Function/chat||message}}<br />
|func_id=118|func_sleep=2.0|func_energy=10.0<br />
|func=llInstantMessage<br />
|p1_type=key|p1_name=user|p1_desc<br />
|p2_type=string|p2_name=message|p2_desc<br />
|func_desc=Sends an Instant Message specified in the string {{LSLP|message}} to the user specified by {{LSLP|user}}.<br />
|func_footer=To send a message directly to an object, use [[llRegionSayTo]].<br />
|return_text<br />
|spec<br />
|caveats=<br />
* All object IM's are throttled at a maximum of 2500 per 30mins, per owner, per region in a rolling window. this includes IM's sent after the throttle is in place<br />
** Throttled IM's are dropped. for implementation see [[llInstantMessage#notes|notes]] below<br />
* Messages longer than 1175 bytes will be truncated to 1175 bytes. This can convey 1175 ASCII characters, or fewer if non-ASCII characters are present.<br />
{{KBcaution|width=100%|The 1175 byte limit is changing. As of Feb 26th, 2013 in all sims, Instant messages are now truncated to 1023 bytes to prevent certain types of delivery failure. (see https://wiki.secondlife.com/wiki/Release_Notes/Second_Life_Server/13#13.02.15.270481 ).}}<br />
*If the specified user is logged in, {{LSLP|message}} will appear in the chat window and will not logged by the InstantMessage logging facility.<br />
*If the specified user is not signed in, the messages will be delivered to their email just like a regular instant message, if the user has enabled email for their account.<br />
** If messages are sent to the same user by the same object within about 65 seconds, they will be bundled together in a single email<br />
<br />
|examples=Tell the owner somebody touched the object:<br />
<source lang="lsl2"><br />
default<br />
{<br />
touch_start( integer total_num )<br />
{ <br />
llInstantMessage( llGetOwner(), "Someone touched me" );<br />
}<br />
}</source><br />
Send an IM to a detected avatar only<br />
<source lang="lsl2"><br />
default<br />
{<br />
touch_start( integer total_num )<br />
{<br />
llInstantMessage( llDetectedKey(0), "Hands Off!");<br />
}<br />
}<br />
</source><br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llOwnerSay]]|Sends chat region wide to owner}}<br />
{{LSL DefineRow||[[llRegionSay]]|Sends chat region wide}}<br />
{{LSL DefineRow||[[llRegionSayTo]]|Sends chat region wide to a specific prim/avatar}}<br />
{{LSL DefineRow||[[llWhisper]]|Sends chat limited to 10 meters}}<br />
{{LSL DefineRow||[[llSay]]|Sends chat limited to 20 meters}}<br />
{{LSL DefineRow||[[llShout]]|Sends chat limited to 100 meters}}<br />
|also_tests<br />
|also_articles<br />
|also_events<br />
|notes=<br />
* [[llRegionSayTo]] may be a better choice if the target is in the same region as the object sending the message, as it has no built-in delay and can communicate directly with objects, as well as with avatars and their attachments.<br />
* Instant Messaging allows communication from an object to an avatar anywhere on the Grid. However, an object cannot receive an Instant Message. <br />
* Using [[llInstantMessage]] from one or more child scripts will avoid delays in the main script. Child scripts will still be subject to delays, [[LSL Event Queue|message queue]] limits, and region throttles.<br />
* Throttling Implementation (Kelly Linden):<br />
** The throttle is on all IMs from the object owner. It does not disable all IMs in the region, but does disable all IMs from the owner of the object.<br />
** The throttle is not per object, but per owner. Splitting the spamming object into multiple objects will not help unless owned by different people. This also means that owning multiple almost too spammy objects will cause you to hit the limit.<br />
** 2500 IMs in 30 minutes will trigger the block.<br />
** IMs that are blocked continue to count against the throttle. The IM count must drop below 2500 before any IMs will be delivered.<br />
** The IM count of the previous window is used to approximate the rolling window. If it is 20% into the current window the IM count will be the current count + 80% of the previous count. This allows us to approximate a rolling average, however it has the behavior that a flood of IMs can have an effect on the throttle for double the window length. This is why in practice the throttle behaves more like 5k in 1hr than 2.5k in 30min.<br />
<br />
|cat1=Communications<br />
|cat2=Instant Message<br />
|cat3<br />
|cat4<br />
}}</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=Viewer_URI_Name_Space&diff=1210304Viewer URI Name Space2021-10-02T23:06:35Z<p>Tapple Gao: document brackets and <nolink></p>
<hr />
<div>{{ProtocolNav}}<br />
<br />
== Overview ==<br />
<br />
The SL client supports links of the format secondlife://Region/123/45/67/, which have traditionally specified a region name and x/y/z location. This means "run Second Life viewer and show Region on the world map".<br />
<br />
The new URL scheme has 3 slashes, and allows direct control of the user interface and login. For example, secondlife:///app/login<br />
<br />
Most secondlife:///app URLs only work from browser instances running inside Second Life because of a denial-of-service attack using secondlife:///app/teleport links to force repeated teleports. SLURLs that work with external browsers include:<br />
* <nowiki>secondlife://<region name></nowiki><br />
* secondlife:///app/login<br />
<br />
In chat, dialogs and other user interface elements, these URLs will be highlighted as clickable links, often with custom formatting including icons. The full functionality is available in Viewer 2.0 and up. Clickable links without formatting were available only in older versions' chat and IM history.<br />
<br />
These links also may be known as ''Viewer URL Namespace'', ''SLAPP URLs'' or ''Application SLURL''.<br />
<br />
Enclose your links in squared brackets to change the displayed text. Example: <br />
<br />
&#91;secondlife&#58;&#47;&#47;&#47;app&#47;objectim&#47;190f571d-fdf1-8f6c-4e9d-973e9b5e0566?name=ObjectName&owner=c93c3129-2250-4c79-a5f7-8c755ca2707e&groupowned=true&slurl=Location&#47;128&#47;128&#47;27 ObjectName&#93;<br />
<br />
will display as <br />
<br />
ObjectName<br />
<br />
To<br />
<br />
. In this case you will also need to ensure the object name has been escaped.<br />
<br />
To display the uri itself without making it clickable, surround it with <nolink></nolink>. For example<br />
<br />
'''<nowiki><nolink>secondlife:///app/group/e670ea83-782e-ba7d-0843-ca63a687ffcf/about</nolink></nowiki>'''<br />
<br />
will display as<br />
<br />
'''<nowiki>secondlife:///app/group/e670ea83-782e-ba7d-0843-ca63a687ffcf/about</nowiki>'''<br />
<br />
wheras<br />
<br />
'''<nowiki>secondlife:///app/group/e670ea83-782e-ba7d-0843-ca63a687ffcf/about</nowiki>'''<br />
<br />
will display as<br />
<br />
*~ NISA ~*<br />
<br />
== Syntax ==<br />
<br />
'''<nowiki>secondlife://</nowiki>'''<br />
: '''<region_name>''' log in to this region or, if logged in, show information and offer teleport<br />
:: '''/<local_x>''' optional X position, defaults to 128<br />
::: '''/<local_y>''' optional Y position, defaults to 128<br />
:::: '''/<local_z>''' optional Z position, defaults to 0<br />
<br />
: '''/app'''<br />
:: '''/agent'''<br />
::: '''/<agent_id>'''<br />
:::: '''/about''' open agent's profile, with 2nd Life tab selected<br />
:::: '''/inspect''' display info dialog for agent (2.0)<br />
:::: '''/im''' start an IM session with the agent (2.0)<br />
:::: '''/offerteleport''' display teleport offer dialog (2.0)<br />
:::: '''/pay''' display pay resident dialog (2.0)<br />
:::: '''/requestfriend''' display friendship offer dialog (2.0)<br />
:::: '''/mute''' add to block list (2.0)<br />
:::: '''/unmute''' remove from block list (2.0)<br />
:::: '''/completename''' replace the URL with the avatar's display and user names,<br />
:::::e.g., "hmm <nowiki>secondlife:///app/agent/eea40b5a-553d-4a07-b1ca-9f6e2f867814/complete</nowiki> wow" in chat becomes "hmm Cerise (cerise.sorbet) wow" (2.4); see {{LSLGC|Avatar/Name}} for more details.<br />
:::: '''/displayname''' replace the URL with the avatar's display name (2.4)<br />
:::: '''/username''' replace the URL with the avatar's username e.g. "user.name" (2.4)<br />
:: '''/appearance'''<br />
::: '''/show''' display the sidebar appearance tab (2.0)<br />
:: '''/balance'''<br />
::: '''/request''' request a L$ balance update from the server (2.0)<br />
:: '''/chat'''<br />
::: '''/<channel>''' any channel number greater than 0 except [[DEBUG_CHANNEL]]<br />
:::: '''/&lt;text>'''<br />
:: '''/classified'''<br />
::: '''/<classified_id>'''<br />
:::: '''/about''' open floater describing classified<br />
:: '''/event'''<br />
::: '''/<event_id>'''<br />
:::: '''/about''' open floater describing event<br />
:: '''/experience'''<br />
::: '''/<experience_id>'''<br />
:::: '''/profile''' open floater describing experience<br />
:: '''/group'''<br />
::: '''/<group_id>'''<br />
:::: '''/about''' open floater describing group<br />
:::: '''/inspect''' display info dialog for group (2.0)<br />
::: '''/create''' open the create group dialog (1.20)<br />
::: '''/list'''<br />
:::: '''/show''' open the list of groups to which user belongs (1.20)<br />
:: '''/help'''<br />
::: '''/<help_query>''' optional help topic (2.0)<br />
:: '''/inventory'''<br />
::: '''/<inventory_id>'''<br />
:::: '''/select''' inventory offer (2.0)<br />
::: '''/show''' open the inventory sidebar tab (2.0)<br />
:: '''/login''' log in on launch. External and internal browsers.<br />
::: see below for query parameters, of course, values are URL escaped<br />
:: '''/maptrackavatar'''<br />
::: '''/<friend_id>''' find a friend on the world map, requires permission (2.4)<br />
:: '''/objectim'''<br />
::: '''/<object_id>''' display an info dialog for the object sending this message (2.0)<br />
:::: '''?name=<object_name>'''<br />
:::: '''&owner=<owner_id>'''<br />
:::: '''&groupowned=true''' (add if the object is deeded to a group)<br />
:::: '''&slurl=<region>/<x>/<y>/<z>'''<br />
:: '''/openfloater'''<br />
::: '''/<floater_name>''' e.g. "preferences", "people", "places", "picks", "destinations", "profile"<br />
:: '''/parcel'''<br />
::: '''/<parcel_id>'''<br />
:::: '''/about''' open floater describing place<br />
:: '''<strike>/region'''<br />
::: '''/<region_id>'''<br />
:::: '''/about''' information from database about that region? list of parcels? covenant?</strike><br />
:: '''/search'''<br />
::: '''/<category>''' "all", "people", "places", "events", "groups", "wiki", "destinations", "classifieds"<br />
:::: '''/<search_term>''' open a search floater with matching results (2.0)<br />
:: '''/sharewithavatar'''<br />
::: '''/<agent_id>''' open an inventory share/IM window for agent (2.4)<br />
:: '''/teleport'''<br />
::: '''/<region_name>''' teleport instantly to this region, no dialog<br />
:::: '''/<local_x>''' optional X position, defaults to 128<br />
::::: '''/<local_y>''' optional Y position, defaults to 128<br />
:::::: '''/<local_z>''' optional Z position, defaults to 0<br />
:: '''/voicecallavatar'''<br />
::: '''/<agent_id>''' start a private voice session (2.4)<br />
:: '''/wear_folder'''<br />
::: '''/?folder_id=<inventory_folder_uuid>''' replace outfit with contents of specified folder (2.6)<br />
::: '''/?folder_name=<library_folder_name>''' replace outfit with contents of named Library folder<br />
:: '''/worldmap''' open the map with this destination selected (2.0)<br />
::: '''/<region_name>'''<br />
:::: '''/<local_x>''' optional X position, defaults to 128<br />
::::: '''/<local_y>''' optional Y position, defaults to 128<br />
:::::: '''/<local_z>''' optional Z position, defaults to 0<br />
<br />
This could be extended to things like:<br />
: '''/app/event/<event_id>/subscribe''' to register for notifications<br />
: '''/app/parcel/<parcel_id>/teleport''' to teleport to a specific location<br />
<br />
== Login Query Parameters ==<br />
{| border="1"<br />
|- <br />
| first || the account first name<br />
|-<br />
| last || the account last name<br />
|-<br />
| session || the secure session id<br />
|-<br />
| location || login location, format TBD, optional<br />
|}<br />
<br />
== Examples ==<br />
<br />
<source lang="lsl2"><br />
string Who(key id)<br />
{<br />
return "secondlife:///app/agent/" + (string)id + "/inspect";<br />
}<br />
<br />
default<br />
{<br />
touch_start(integer num)<br />
{<br />
llSay(0, "Touched by " + Who(llDetectedKey(0)) + "." );<br />
}<br />
}<br />
</source><br />
<br />
[[Category:Name Spaces]]<br />
[[Category:Search]]<br />
[[Category:LSL Chat]]<br />
[[Category:LSL_Dialog]]</div>Tapple Gaohttps://wiki.secondlife.com/w/index.php?title=LlLoopSound&diff=1210121LlLoopSound2021-06-30T14:01:57Z<p>Tapple Gao: added a note about calling from different prims</p>
<hr />
<div>{{LSL_Function<br />
|inject-2={{Issues/SVC-4897}}{{LSL_Function/inventory|sound|uuid=true|type=sound|volume=volume}}<br />
|func_id=87|func_sleep=0.0|func_energy=10.0<br />
|func=llLoopSound<br />
|p1_type=string|p1_name=sound<br />
|p2_type=float|p2_name=volume<br />
|func_footnote<br />
|func_desc=Plays attached {{LSLP|sound}} looping indefinitely at {{LSLP|volume}}<br />
|return_text<br />
|spec<br />
|caveats=*A call to llLoopSound replaces any other sound (so that only one sound can be played at the same time from the same prim, except sounds started with the deprecated [[llSound]] which always plays sound files till the end. An object can play 2 sounds with llLoopSound if the function is called from different prims<br />
*If a second call to loop the same sound at a different volume is made from within the same script NO volume change is made.<br />
**[[llStopSound]] set just previous to the second call for a new volume allows the volume change with no discernible pause.<br />
*When call made from HUD attachment sound is only heard by agent the task is attached to. <br />
|constants<br />
|examples=<br />
<source lang="lsl2"><br />
llLoopSound("ambient.wav", 0.5);<br />
</source><br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llLoopSoundMaster]]|3=Plays a sound {{HoverText|attached|The sound moves with the prim}} indefinitely.}}<br />
{{LSL DefineRow||[[llLoopSoundSlave]]}}<br />
{{LSL DefineRow||[[llStopSound]]|3=Stops playing a looped sound.}}<br />
{{LSL DefineRow||[[llPlaySound]]|3=Plays a sound {{HoverText|attached|The sound moves with the prim}} once.}}<br />
{{LSL DefineRow||[[llTriggerSound]]|3=Plays a sound {{HoverText|unattached|The sound does not moves with the prim}}.}}<br />
{{LSL DefineRow||[[llTriggerSoundLimited]]}}<br />
|also_events<br />
|also_tests<br />
|also_articles<br />
|notes<br />
|sort=LoopSound<br />
|cat1=Sound<br />
|cat2<br />
|cat3<br />
|cat4<br />
|history={{LSL Added|0.2.0|remote=http://secondlife.wikia.com/wiki/Version_0.2.0}}<br />
}}</div>Tapple Gao