https://wiki.secondlife.com/w/api.php?action=feedcontributions&user=Cenji+Neutra&feedformat=atomSecond Life Wiki - User contributions [en]2024-03-28T11:32:47ZUser contributionsMediaWiki 1.36.1https://wiki.secondlife.com/w/index.php?title=VirtualID_URLMap_(Broken)&diff=448402VirtualID URLMap (Broken)2009-08-04T19:02:09Z<p>Cenji Neutra: </p>
<hr />
<div>{{LSL Header}}<br />
[http://www.apez.biz Apez Corp] is please to offer a free URL redirection service: '''VirtualID URlMap''' - tailored for use with HTTP-in.<br />
<br />
It uses a very simple REST-based API and is implemented using Amazon's cloud computing services (AWS).<br />
<br />
<br />
It simply allows you to map a user-defined alias (a subdomain of .obj.virtualid.info) to a target URL (http[s]). For example, you might map http://my-counter.obj.virtualid.info to your script's HTTP-in URL and keep it updated. An alias can be setup and updated with a single GET (or POST) request.<br />
<br />
<br />
First, we'll show the simplest way to use it - save the details for the [http://wiki.apez.biz/Development docs].<br />
<br />
<br />
To create a new alias (or update an existing one), simply make a HTTP request like this in your script:<br />
<br />
<code><br />
llHTTPRequest("http://api.virtualid.info/?op=set&a=my-visitors&t=http://sim3015.aditi.lindenlab.com:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c", [], "");<br />
</code><br />
<br />
The part after <tt>op=</tt> is the operation - <tt>set</tt> in this case, which is used to create or update a mapping between an alias and a target URL. The alias is the subdomain used to access the object before the <tt>.obj.virtualid.info</tt> part.<br />
<br />
Obviously, the string after <tt>a=</tt> is the alias - which you can choose. Note that they're global - so you'll need to choose one nobody else has used ''(alphanumeric or "-" characters, can't start with a digit or "-")''.<br />
<br />
Finally, the string after <tt>t=</tt> is the target URL - where you wish the alias to be redirected.<br />
<br />
<br />
Now, when you access <tt>http://my-visitors.obj.virtualid.info</tt> the service issues a standard HTTP 302 Redirect code to the accesing client. If that is a browser, for example, it will automatically and instantly access the target URL.<br />
(Note that if you're using this for inter-object communication in-world, be aware that llHTTPRequest() doesn't handle 302 Redirect, so you'll need to access the location and make an additional request to the supplied target)<br />
<br />
Once you've created an alias the first time, you 'own' it and are the only one that can set it to a different value until either you delete it or it expires (see below for details). The default expiry is 30days from the last time is was updated.<br />
<br />
There are several other parameters, but that's about it to get started!<br />
Copy and paste the example script text below to try it out.<br />
<br />
<br />
Please refer to http://wiki.apez.biz/Development for full documentation to all the extra parameters and features.<br />
<br />
--<br />
<br />
The following example script maintains a static alias URL for an object's HTTP service which just returns some simple information about the object when accessed. It serves as a simple usage example.<br />
<br />
<lsl><br />
// Apez Corp Example LSL script <br />
// This script is hereby placed in the public domain.<br />
//<br />
// {"obj":"Apez DevKit", "ver":"2.3", "src":"devkit/Apez-urlmap-example.lsl"}<br />
// $Revision$<br />
<br />
<br />
//<br />
// This is an example of how to use the Apez URL mapping Affiliate Services REST API<br />
// The URLmap service is convenient for having a static URL that can be updated in response<br />
// to a changing target URL - such as those generated by the http_request event.<br />
// For details see http://wiki.apez.biz/Development<br />
<br />
<br />
// This script creates a HTTP server for this object and maps a static alias which it<br />
// keeps up-to-date so that the object can always be accessed via the alias URL<br />
<br />
<br />
key url_req_key;<br />
key map_req_id;<br />
string url;<br />
string alias;<br />
string aliasurl;<br />
integer alias_last_updated; // unixtime<br />
integer expiry_secs;<br />
integer touch_count = 0;<br />
<br />
<br />
// obtain a URL <br />
setup()<br />
{<br />
// Request a HTTP URL for this object<br />
url_req_key = llRequestURL(); <br />
}<br />
<br />
<br />
// setup URL alias from <alias>.obj.virtualid.info -> targetURL<br />
setAlias(string alias, string targetURL)<br />
{<br />
// every alias has an expiry period (in seconds), which cannot be greater than 3 months.<br />
// The script needs to update it before then to renew the period<br />
expiry_secs = 48*60*60; // only going to ask for 48hours for this example<br />
llSetTimerEvent(expiry_secs-60*60); // set URL again before it expires (1hr early)<br />
<br />
map_req_id = llHTTPRequest("http://api.virtualid.info/?op=set&a="+alias<br />
+"&t="+llEscapeURL(targetURL)+"&exp="+(string)expiry_secs, [], "");<br />
}<br />
<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
setup();<br />
}<br />
<br />
on_rez(integer passed)<br />
{<br />
setup();<br />
} <br />
<br />
http_request(key id, string method, string body)<br />
{<br />
if (method == URL_REQUEST_GRANTED)<br />
{<br />
url = body;<br />
llOwnerSay("SL assigned us the URL: " + url);<br />
<br />
// the user-defined alias/subdomain we want to map to this object<br />
// must be a string of alphanumeric characters, can't start with a digit and must be <64 chars in length<br />
// (for this example we append the first few chars of the object key to make it different for each tester)<br />
alias = "myalias"+llGetSubString((string)llGetKey(),0,2);<br />
aliasurl = alias+".obj.virtualid.info";<br />
<br />
llOwnerSay("Requesting URL alias \""+aliasurl+"\" ...");<br />
<br />
setAlias(alias, url);<br />
<br />
}<br />
else if (method == URL_REQUEST_DENIED)<br />
{<br />
llSay(0, "Something went wrong, no url. " + body);<br />
}<br />
else if (method == "GET")<br />
{<br />
string rsp = "Hello from object "+llGetObjectName()+"!\n"<br />
+" owner: "+llKey2Name(llGetOwner())+"\n"<br />
+" key: "+(string)llGetKey()+"\n"<br />
+" touch count since reset: "+(string)touch_count;<br />
<br />
llHTTPResponse(id,200,rsp);<br />
}<br />
else<br />
{<br />
llHTTPResponse(id,405,"Unsupported Method");<br />
}<br />
}<br />
<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id == map_req_id)<br />
{<br />
llOwnerSay("Apez URLmap service said:"+body+" (status "+(string)status+")");<br />
<br />
if ((status >= 200) && (status < 300)) { // success<br />
llOwnerSay("You can now access this object via the URL http://"+aliasurl+" (try it in your browser!)");<br />
alias_last_updated = llGetUnixTime();<br />
}<br />
}<br />
}<br />
<br />
changed(integer c)<br />
{<br />
if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )<br />
{<br />
setup();<br />
}<br />
}<br />
<br />
timer()<br />
{<br />
if (llGetUnixTime() - alias_last_updated > expiry_secs - 65*60)<br />
setAlias(alias, url);<br />
}<br />
<br />
touch(integer num_detected)<br />
{<br />
touch_count++;<br />
}<br />
<br />
}<br />
</lsl><br />
<br />
Back to [[LSL_Library]]<br />
<br />
{{#vardefine:sort|HTTP-in VirtualID URLMap redirect}}{{LSLC|Library}}{{LSLC|Examples}}<br />
{{LSLC|Tutorials}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=VirtualID_URLMap_(Broken)&diff=442493VirtualID URLMap (Broken)2009-07-28T18:29:29Z<p>Cenji Neutra: </p>
<hr />
<div>{{LSL Header}}<br />
[http://www.apez.biz Apez Corp] is please to offer a free URL redirection service: '''VirtualID URlMap''' - tailored for use with HTTP-in.<br />
<br />
It uses a very simple REST-based API and is implemented using Amazon's cloud computing services (AWS).<br />
<br />
<br />
It simply allows you to map a user-defined alias (a subdomain of .obj.virtualid.info) to a target URL (http[s]). For example, you might map http://my-counter.obj.virtualid.info to your script's HTTP-in URL and keep it updated. An alias can be setup and updated with a single GET (or POST) request.<br />
<br />
<br />
First, we'll show the simplest way to use it - save the details for the [http://wiki.apez.biz/Development docs].<br />
<br />
<br />
To create a new alias (or update an existing one), simply make a HTTP request like this in your script:<br />
<br />
<code><br />
llHTTPRequest("http://api.virtualid.info/?op=set&a=my-visitors&t=http://sim3015.aditi.lindenlab.com:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c", [], "");<br />
</code><br />
<br />
The part after <tt>op=</tt> is the operation - <tt>set</tt> in this case, which is used to create or update a mapping between an alias and a target URL. The alias is the subdomain used to access the object before the <tt>.obj.virtualid.info</tt> part.<br />
<br />
Obviously, the string after <tt>a=</tt> is the alias - which you can choose. Note that they're global - so you'll need to choose one nobody else has used ''(alphanumeric or "-" characters, can't start with a digit or "-")''.<br />
<br />
Finally, the string after <tt>t=</tt> is the target URL - where you wish the alias to be redirected.<br />
<br />
<br />
Now, when you access <tt>http://my-visitors.obj.virtualid.info</tt> the service issues a standard HTTP 302 Redirect code to the accesing client. If that is a browser, for example, it will automatically and instantly access the target URL.<br />
(Note that if you're using this for inter-object communication in-world, be aware that llHTTPRequest() doesn't handle 302 Redirect, so you'll need to access the location and make an additional request to the supplied target)<br />
<br />
Once you've created an alias the first time, you 'own' it and are the only one that can set it to a different value until either you delete it or it expires (see below for details). The default expiry is 30days from the last time is was updated.<br />
<br />
There are several other parameters, but that's about it to get started!<br />
Copy and paste the example script text below to try it out.<br />
<br />
<br />
Please refer to http://wiki.apez.biz/Development for full documentation to all the extra parameters and features.<br />
<br />
--<br />
<br />
The following example script maintains a static alias URL for an object's HTTP service which just returns some simple information about the object when accessed. It serves as a simple usage example.<br />
<br />
<lsl><br />
// Apez Corp Example LSL script <br />
// This script is hereby placed in the public domain.<br />
//<br />
// {"obj":"Apez DevKit", "ver":"2.3", "src":"devkit/Apez-urlmap-example.lsl"}<br />
// $Revision$<br />
<br />
<br />
//<br />
// This is an example of how to use the Apez URL mapping Affiliate Services REST API<br />
// The URLmap service is convenient for having a static URL that can be updated in response<br />
// to a changing target URL - such as those generated by the http_request event.<br />
// For details see http://wiki.apez.biz/Development<br />
<br />
<br />
// This script creates a HTTP server for this object and maps a static alias which it<br />
// keeps up-to-date so that the object can always be accessed via the alias URL<br />
<br />
<br />
key url_req_key;<br />
key map_req_id;<br />
string url;<br />
string alias;<br />
string aliasurl;<br />
integer alias_last_updated; // unixtime<br />
integer expiry_secs;<br />
integer touch_count = 0;<br />
<br />
<br />
// obtain a URL <br />
setup()<br />
{<br />
// Request a HTTP URL for this object<br />
url_req_key = llRequestURL(); <br />
}<br />
<br />
<br />
// setup URL alias from <alias>.obj.virtualid.info -> targetURL<br />
setAlias(string alias, string targetURL)<br />
{<br />
// every alias has an expiry period (in seconds), which cannot be greater than 3 months.<br />
// The script needs to update it before then to renew the period<br />
expiry_secs = 48*60*60; // only going to ask for 48hours for this example<br />
llSetTimerEvent(expiry_secs-60*60); // set URL again before it expires (1hr early)<br />
<br />
map_req_id = llHTTPRequest("http://api.virtualid.info/?op=set&a="+alias<br />
+"&t="+llEscapeURL(targetURL)+"&exp="+(string)expiry_secs, [], "");<br />
}<br />
<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
setup();<br />
}<br />
<br />
on_rez(integer passed)<br />
{<br />
setup();<br />
} <br />
<br />
http_request(key id, string method, string body)<br />
{<br />
if (method == URL_REQUEST_GRANTED)<br />
{<br />
url = body;<br />
llOwnerSay("SL assigned us the URL: " + url);<br />
<br />
// the user-defined alias/subdomain we want to map to this object<br />
// must be a string of alphanumeric characters, can't start with a digit and must be <64 chars in length<br />
// (for this example we append the first few chars of the object key to make it different for each tester)<br />
alias = "myalias"+llGetSubString((string)llGetKey(),0,2);<br />
aliasurl = alias+".obj.virtualid.info";<br />
<br />
llOwnerSay("Requesting URL alias \""+aliasurl+"\" ...");<br />
<br />
setAlias(alias, url);<br />
<br />
}<br />
else if (method == URL_REQUEST_DENIED)<br />
{<br />
llSay(0, "Something went wrong, no url. " + body);<br />
}<br />
else if (method == "GET")<br />
{<br />
string rsp = "Hello from object "+llGetObjectName()+"!\n"<br />
+" owner: "+llKey2Name(llGetOwner())+"\n"<br />
+" key: "+(string)llGetKey()+"\n"<br />
+" touch count since reset: "+(string)touch_count;<br />
<br />
llHTTPResponse(id,200,rsp);<br />
}<br />
else<br />
{<br />
llHTTPResponse(id,405,"Unsupported Method");<br />
}<br />
}<br />
<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id == map_req_id)<br />
{<br />
llOwnerSay("Apez URLmap service said:"+body+" (status "+(string)status+")");<br />
<br />
if ((status >= 200) && (status < 300)) { // success<br />
llOwnerSay("You can now access this object via the URL http://"+aliasurl+" (try it in your browser!)");<br />
alias_last_updated = llGetUnixTime();<br />
}<br />
}<br />
}<br />
<br />
changed(integer c)<br />
{<br />
if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )<br />
{<br />
setup();<br />
}<br />
}<br />
<br />
timer()<br />
{<br />
if (llGetUnixTime() - alias_last_updated > expiry_secs - 60*60)<br />
setAlias(alias, url);<br />
}<br />
<br />
touch(integer num_detected)<br />
{<br />
touch_count++;<br />
}<br />
<br />
}<br />
</lsl><br />
<br />
Back to [[LSL_Library]]<br />
<br />
{{#vardefine:sort|HTTP-in VirtualID URLMap redirect}}{{LSLC|Library}}{{LSLC|Examples}}<br />
{{LSLC|Tutorials}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=LSL_HTTP_server&diff=439913LSL HTTP server2009-07-27T17:54:52Z<p>Cenji Neutra: </p>
<hr />
<div>{{LSL Header|ml=*}}<br />
== Intro ==<br />
This is the counterpart to [[llHTTPRequest]]. While llHTTPRequest lets scripts in Second Life request data from HTTP-accessible sources, this HTTP-in enables outside sources to request data from scripts in Second Life. The key difference is that llHTTPRequest exchanges data when the script in SL wants; HTTP-in allows outside sources to determine when they need to communicate with scripts in SL.<br />
<br />
Prior to HTTP-in, similar functionality could be achieved by polling with [[llHTTPRequest]], [[llEmail]] and [[:Category:LSL_XML-RPC|XML-RPC]]. All three are cumbersome and the latter two have serious scalability bottlenecks.<br />
<br />
It is important to note that LSL HTTP Servers cannot use HTML. See "Other Limitations" for more details.<br />
<br />
== Uses ==<br />
* Easily get data from LSL scripts to outside viewers, scripts or servers.<br />
** Web front end for a visitor counter or other statistics accumulator.<br />
* Easily get data into LSL scripts from outside viewers, scripts or servers.<br />
** A store with a web front end that communicates to an in-world object to exchange L$ and inventory items.<br />
** A game in-world where the primary game logic is handled by an external program which needs to manipulate in world items.<br />
<br />
Gory Technical Details follow. Or jump straight to the [[LSL_http_server/examples | Script Examples]].<br />
<br />
== Script API ==<br />
* '''[[LlRequestURL|key llRequestURL()]]'''<br />
: Request a new LSL Server public URL. <br />
: An http_request event will be triggered with success or failure and include the returned key<br />
<lsl>request_id = llRequestURL();</lsl><br />
* '''[[LlRequestSecureURL|key llRequestSecureURL()]]'''<br />
: Similar to ''llRequestURL'' except requests an HTTPS / SSL URL.<br />
: An http_request event will be triggered with success or failure and include the returned key<br />
<lsl>request_id = llRequestSecureURL();</lsl><br />
* '''[[LlReleaseURL|llReleaseURL(string url)]]'''<br />
: Clear the specific URL, used for both secure and non-secure URLs.<br />
<lsl>llReleaseURL("http://sim3015.aditi.lindenlab.com:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c");</lsl><br />
* '''[[Http_request|http_request(key id, string method, string body)]]'''<br />
: Event triggered when an URL is hit:<br />
:* id is unique to this request<br />
:* Supported methods are GET/POST/PUT/DELETE<br />
:* body: The body of the request.<br />
: Event also triggered with response to ''llRequestURL'' and ''llRequestSecureURL''<br />
:* id matches the key returned by ''llRequestURL'' or ''llRequestSecureURL''<br />
:* method == [[URL_REQUEST_GRANTED]] for success, [[URL_REQUEST_DENIED]] for failure to get an URL<br />
:* body is the public URL. If unable to get a public URL body will be empty.<br />
* '''[[LlHTTPResponse|llHTTPResponse(key id, integer status, string body)]]'''<br />
: Send ''body'' to the requester with status code ''status''<br />
:* id is the id from http_request that maps to the specific request<br />
:* sending a response to the requestor will clear the request and delete information associated with it<br />
* '''[[LlGetHTTPHeader|string llGetHTTPHeader(key id, string header)]]'''<br />
: Returns the string for the specified header in the specified request. All received headers are converted to lower case and this function is case-sensitive. The returned string is limited to 255 characters.<br />
:* Supported headers are:<br />
::* "x-script-url": The base url, as originally received from [[llRequestURL]] or [[llRequestSecureURL]].<br />
::* "x-path-info": Any trailing path information from the requested url<br />
::* "x-query-string": Any query arguments, the text past a ? in the url<br />
::* "x-remote-ip": IP address of the host that made the request<br />
::* "user-agent": The user-agent header as reported by the requester<br />
:* Supported headers sent by '''[[LlHTTPRequest|llHTTPRequest()]]'''<br />
::* "x-secondlife-shard"<br />
::* "x-secondlife-object-name"<br />
::* "x-secondlife-object-key"<br />
::* "x-secondlife-region"<br />
::* "x-secondlife-local-position"<br />
::* "x-secondlife-local-rotation"<br />
::* "x-secondlife-local-velocity"<br />
::* "x-secondlife-owner-name"<br />
::* "x-secondlife-owner-key"<br />
requested url: ''https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322/foo/bar?arg=gra''<br />
x-script-url: ''https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322''<br />
x-path-info: ''/foo/bar''<br />
x-query-string: ''arg=gra''<br />
: This header information is valid for 30 seconds, or until [[llHTTPResponse]] is called.<br />
* '''[[Changed|changed(integer change)]]'''<br />
:* [[CHANGED_REGION_START]]: New changed() event triggered on region startup.<br />
* '''[[LlGetFreeURLs|integer llGetFreeURLs()]]'''<br />
: Returns the number of URLs available to this script.<br />
<br />
== URL Lifetime Limitations ==<br />
* URLs are '''temporary'''!<br />
* URLs will be lost in the following cases, all detectable by the script events listed with them.<br />
** On object derez/rez: [[on_rez]]<br />
** On script save/reset: ''[[default]] [[state_entry]]() (trickier in multi-state scripts)<br />
** On region cross or TP(attachments): [[changed]]() {{LSLGC|Events|event}}, [[CHANGED_REGION]] and [[CHANGED_TELEPORT]]<br />
** On region restart: [[changed]]() event, ''new'' flag [[CHANGED_REGION_START]]<br />
* When urls are 'lost' it means that all public urls for that script are gone, new ones will need to be requested and the new urls will '''''not''''' resemble the old ones.<br />
* Maintaining persistent URLs will require building or using an external service similar to how [http://en.wikipedia.org/wiki/Dynamic_DNS Dynamic DNS] services work for tying domain names to dynamic IP addresses.<br />
<br />
Contributed HTTP-in URL mapping implementations and services:<br />
* A Dynamic DNS service running on Google App Engine (contributed as an example) can be found in the forums here: http://forums.secondlife.com/showthread.php?t=323981<br />
* Static URL service for HTTP-Server with API (under development),can be found [http://lsl.sltools.biz/ here]. (free by SLTools)<br />
* The [http://wiki.apez.biz/URLMap_API Virtual ID URLMap service] provides mapping from a static subdomain of your choice via a REST API (part of the free [http://www.apez.biz Apez Corp] [http://wiki.apez.biz/Development web-services API]).<br />
<br />
== Resource Limitations ==<br />
* There are a limited number of URLs available in each region, split by land ownership exactly like prim limits.<br />
** Use [[llGetFreeURLs]] to get the exact number of available URLs for the script.<br />
** The number of allowed URLs is the same as the number of allowed prims on the parcel the object is over.<br />
**: ''Object owner does not matter, all objects over a parcel will use the resource pool for that parcel.''<br />
**: ''Like prims, all the parcels owned by the same owner and in the same region share the same pool of resources.''<br />
**: ''If you have two parcels in a region that each support 100 URLs, then you could use all 200 in object(s) on a single parcel.''<br />
** The region's object bonus factor does not apply to available URLs.<br />
**: ''If a parcel has a max of 300 prims in a region with a 2x bonus factor there will only be 150 urls allowed.''<br />
* Each resident has their own unique pool of available URLs with a max of 38 URLs per resident.<br />
** This is 1 per attachment point, but all 38 could be used by a single attachment for example.<br />
* Vehicles are special and lazily moved to resident pools by the following logic:<br />
** Any object that has a resident sitting on it is a 'vehicle'<br />
** Vehicles will use the url resources from the parcel they are over until the cross a parcel border.<br />
**: ''Specifically this prevents anyone from breaking your vending machine by sitting on it and making it a 'vehicle'.''<br />
** When any object using URL resources with a resident sitting on it crosses a parcel boundary the resources will switch to the first sitting resident with enough resources. If no sitting agents have enough resources then the resources from the parcel being moved onto will be used. If even then there are not enough resources to use then the vehicle will be blocked from moving.<br />
**: ''In short we do everything we can to find a pool to host the resources needed by the vehicle, but will block movement if we can't.''<br />
* Parcel Sale: When a parcel is sold such that it changes the total available URLs in the region for either resident (seller or buyer) such that more URLs are being used than are available some objects will be returned. <br />
** The objects returned will be from youngest object to oldest object of those using URLs in each category in order of object category: Temporary, Other, Group, Owner, Selected/Sat upon.<br />
**: ''The '''only''' time objects are possibly returned is when parcels change owner, and only if more resources are being used than allowed.''<br />
**: ''We return youngest temporary objects before older temporary objects before younger 'other' (owned by non-group, non-parcel-owner) objects etc.''<br />
<br />
== Other Limitations ==<br />
* Size of the body of the requests will be [[limit]]ed to 2k [[bytes]].<br />
* Size of headers of requests will be limited to 255 bytes. This is per header, not total.<br />
* The size of responses to requests is not currently limited, but this is subject to review during testing.<br />
* The content type of the returned data is always 'text/plain; utf-8'<br />
*: ''Allowing more content type options is a possibility for the future, but not guaranteed.''<br />
* There is a cap of 64 in flight requests per script. This is based on the maximum number of pending events in LSL.<br />
* ''We may throttle the rate we accept hits at the CAP server level as well. This is possible, but has not yet been decided.''<br />
* HTML cannot be used without an external parser, as all output is plain text only. If making such a parser, remember that you should probably restrict access to only Linden Lab HTML URLs as to not have your bandwith stolen.<br />
<br />
== Links ==<br />
* [[LSL_http_server/examples | Script Examples]]<br />
* [[LSL_http_server/design | Design Document]]<br />
* Design Jira:{{jira|SVC-1086}}<br />
<br />
{{LSLC|HTTP}}<br />
{{LSLC|Communications}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=HTTP-in_URLMap_redirector&diff=438143HTTP-in URLMap redirector2009-07-25T01:09:56Z<p>Cenji Neutra: Redirected page to VirtualID URLMap</p>
<hr />
<div>#REDIRECT [[VirtualID_URLMap]]<br />
{{#vardefine:sort|HTTP-in URLMap redirector}}{{LSLC|Library}}{{LSLC|Examples}}<br />
{{LSLC|Tutorials}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=VirtualID_URLMap_(Broken)&diff=438133VirtualID URLMap (Broken)2009-07-25T01:06:23Z<p>Cenji Neutra: </p>
<hr />
<div>{{LSL Header}}<br />
[http://www.apez.biz Apez Corp] is please to offer a free URL redirection service: '''VirtualID URlMap''' - tailored for use with HTTP-in.<br />
<br />
It uses a very simple REST-based API and is implemented using Amazon's cloud computing services (AWS).<br />
<br />
<br />
It simply allows you to map a user-defined alias (a subdomain of .obj.virtualid.info) to a target URL (http[s]). For example, you might map http://my-counter.obj.virtualid.info to your script's HTTP-in URL and keep it updated. An alias can be setup and updated with a single GET (or POST) request.<br />
<br />
<br />
First, we'll show the simplest way to use it - save the details for the [http://wiki.apez.biz/Development docs].<br />
<br />
<br />
To create a new alias (or update an existing one), simply make a HTTP request like this in your script:<br />
<br />
<code><br />
llHTTPRequest("http://api.virtualid.info/?op=set&a=my-visitors&t=http://sim3015.aditi.lindenlab.com:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c", [], "");<br />
</code><br />
<br />
The part after <tt>op=</tt> is the operation - <tt>set</tt> in this case, which is used to create or update a mapping between an alias and a target URL. The alias is the subdomain used to access the object before the <tt>.obj.virtualid.info</tt> part.<br />
<br />
Obviously, the string after <tt>a=</tt> is the alias - which you can choose. Note that they're global - so you'll need to choose one nobody else has used ''(alphanumeric or "-" characters, can't start with a digit or "-")''.<br />
<br />
Finally, the string after <tt>t=</tt> is the target URL - where you wish the alias to be redirected.<br />
<br />
<br />
Now, when you access <tt>http://my-visitors.obj.virtualid.info</tt> the service issues a standard HTTP 302 Redirect code to the accesing client. If that is a browser, for example, it will automatically and instantly access the target URL.<br />
(Note that if you're using this for inter-object communication in-world, be aware that llHTTPRequest() doesn't handle 302 Redirect, so you'll need to access the location and make an additional request to the supplied target)<br />
<br />
Once you've created an alias the first time, you 'own' it and are the only one that can set it to a different value until either you delete it or it expires (see below for details). The default expiry is 30days from the last time is was updated.<br />
<br />
There are several other parameters, but that's about it to get started!<br />
Copy and paste the example script text below to try it out.<br />
<br />
<br />
Please refer to http://wiki.apez.biz/Development for full documentation to all the extra parameters and features.<br />
<br />
--<br />
<br />
The following example script maintains a static alias URL for an object's HTTP service which just returns some simple information about the object when accessed. It serves as a simple usage example.<br />
<br />
<lsl><br />
// Apez Corp Example LSL script <br />
// This script is hereby placed in the public domain.<br />
//<br />
// {"obj":"Apez DevKit", "ver":"2.3", "src":"devkit/Apez-urlmap-example.lsl"}<br />
// $Revision$<br />
<br />
<br />
//<br />
// This is an example of how to use the Apez URL mapping Affiliate Services REST API<br />
// The URLmap service is convenient for having a static URL that can be updated in response<br />
// to a changing target URL - such as those generated by the http_request event.<br />
// For details see http://wiki.apez.biz/Development<br />
<br />
<br />
// This script creates a HTTP server for this object and maps a static alias which it<br />
// keeps up-to-date so that the object can always be accessed via the alias URL<br />
<br />
<br />
key url_req_key;<br />
key map_req_id;<br />
string url;<br />
string alias;<br />
string aliasurl;<br />
integer alias_last_updated; // unixtime<br />
integer expiry_secs;<br />
integer touch_count = 0;<br />
<br />
<br />
// obtain a URL <br />
setup()<br />
{<br />
// Request a HTTP URL for this object<br />
url_req_key = llRequestURL(); <br />
}<br />
<br />
<br />
// setup URL alias from <alias>.obj.virtualid.info -> targetURL<br />
setAlias(string alias, string targetURL)<br />
{<br />
// every alias has an expiry period (in seconds), which cannot be greater than 3 months.<br />
// The script needs to update it before then to renew the period<br />
expiry_secs = 48*60*60; // only going to ask for 48hours for this example<br />
llSetTimerEvent(expiry_secs-1); // set URL again before it expires<br />
<br />
map_req_id = llHTTPRequest("http://api.virtualid.info/?op=set&a="+alias<br />
+"&t="+llEscapeURL(targetURL)+"&exp="+(string)expiry_secs, [], "");<br />
}<br />
<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
setup();<br />
}<br />
<br />
on_rez(integer passed)<br />
{<br />
setup();<br />
} <br />
<br />
http_request(key id, string method, string body)<br />
{<br />
if (method == URL_REQUEST_GRANTED)<br />
{<br />
url = body;<br />
llOwnerSay("SL assigned us the URL: " + url);<br />
<br />
// the user-defined alias/subdomain we want to map to this object<br />
// must be a string of alphanumeric characters, can't start with a digit and must be <64 chars in length<br />
// (for this example we append the first few chars of the object key to make it different for each tester)<br />
alias = "myalias"+llGetSubString((string)llGetKey(),0,2);<br />
aliasurl = alias+".obj.virtualid.info";<br />
<br />
llOwnerSay("Requesting URL alias \""+aliasurl+"\" ...");<br />
<br />
setAlias(alias, url);<br />
<br />
}<br />
else if (method == URL_REQUEST_DENIED)<br />
{<br />
llSay(0, "Something went wrong, no url. " + body);<br />
}<br />
else if (method == "GET")<br />
{<br />
string rsp = "Hello from object "+llGetObjectName()+"!\n"<br />
+" owner: "+llKey2Name(llGetOwner())+"\n"<br />
+" key: "+(string)llGetKey()+"\n"<br />
+" touch count since reset: "+(string)touch_count;<br />
<br />
llHTTPResponse(id,200,rsp);<br />
}<br />
else<br />
{<br />
llHTTPResponse(id,405,"Unsupported Method");<br />
}<br />
}<br />
<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id = map_req_id)<br />
{<br />
llOwnerSay("Apez URLmap service said:"+body+" (status "+(string)status+")");<br />
<br />
if ((status >= 200) && (status < 300)) { // success<br />
llOwnerSay("You can now access this object via the URL http://"+aliasurl+" (try it in your browser!)");<br />
alias_last_updated = llGetUnixTime();<br />
}<br />
}<br />
}<br />
<br />
changed(integer c)<br />
{<br />
if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )<br />
{<br />
setup();<br />
}<br />
}<br />
<br />
timer()<br />
{<br />
if (llGetUnixTime() - alias_last_updated > expiry_secs)<br />
setAlias(alias, url);<br />
}<br />
<br />
touch(integer num_detected)<br />
{<br />
touch_count++;<br />
}<br />
<br />
}<br />
</lsl><br />
<br />
Back to [[LSL_Library]]<br />
<br />
{{#vardefine:sort|HTTP-in VirtualID URLMap redirect}}{{LSLC|Library}}{{LSLC|Examples}}<br />
{{LSLC|Tutorials}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=VirtualID_URLMap_(Broken)&diff=438123VirtualID URLMap (Broken)2009-07-25T01:05:17Z<p>Cenji Neutra: </p>
<hr />
<div>{{LSL Header}}<br />
[http://www.apez.biz Apez Corp] is please to offer a free URL redirection service: '''VirtualID URlMap''' - tailored for use with HTTP-in.<br />
<br />
It uses a very simple REST-based API and is implemented using Amazon's cloud computing services (AWS).<br />
<br />
<br />
It simply allows you to map a user-defined alias (a subdomain of .obj.virtualid.info) to a target URL (http[s]). For example, you might map http://my-counter.obj.virtualid.info to your script's HTTP-in URL and keep it updated. An alias can be setup and updated with a single GET (or POST) request.<br />
<br />
<br />
First, we'll show the simplest way to use it - save the details for the [http://wiki.apez.biz/Development docs].<br />
<br />
<br />
To create a new alias (or update an existing one), simply make a HTTP request like this in your script:<br />
<br />
<code><br />
llHTTPRequest("http://api.virtualid.info/?op=set&a=my-visitors&t=http://sim3015.aditi.lindenlab.com:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c", [], "");<br />
</code><br />
<br />
The part after <tt>op=</tt> is the operation - <tt>set</tt> in this case, which is used to create or update a mapping between an alias and a target URL. The alias is the subdomain used to access the object before the <tt>.obj.virtualid.info</tt> part.<br />
<br />
Obviously, the string after <tt>a=</tt> is the alias - which you can choose. Note that they're global - so you'll need to choose one nobody else has used ''(alphanumeric or "-" characters, can't start with a digit or "-")''.<br />
<br />
Finally, the string after <tt>t=</tt> is the target URL - where you wish the alias to be redirected.<br />
<br />
<br />
Now, when you access <tt>http://my-visitors.obj.virtualid.info</tt> the service issues a standard HTTP 302 Redirect code to the accesing client. If that is a browser, for example, it will automatically and instantly access the target URL.<br />
(Note that if you're using this for inter-object communication in-world, be aware that llHTTPRequest() doesn't handle 302 Redirect, so you'll need to access the location and make an additional request to the supplied target)<br />
<br />
Once you've created an alias the first time, you 'own' it and are the only one that can set it to a different value until either you delete it or it expires (see below for details). The default expiry is 30days from the last time is was updated.<br />
<br />
There are several other parameters, but that's about it to get started!<br />
Copy and paste the example script text below to try it out.<br />
<br />
<br />
Please refer to http://wiki.apez.biz/Development for full documentation to all the extra parameters and features.<br />
<br />
--<br />
<br />
The following example script maintains a static alias URL for an object's HTTP service which just returns some simple information about the object when accessed. It serves as a simple usage example.<br />
<br />
<lsl><br />
// Apez Corp Example LSL script <br />
// This script is hereby placed in the public domain.<br />
//<br />
// {"obj":"Apez DevKit", "ver":"2.3", "src":"devkit/Apez-urlmap-example.lsl"}<br />
// $Revision$<br />
<br />
<br />
//<br />
// This is an example of how to use the Apez URL mapping Affiliate Services REST API<br />
// The URLmap service is convenient for having a static URL that can be updated in response<br />
// to a changing target URL - such as those generated by the http_request event.<br />
// For details see http://wiki.apez.biz/Development<br />
<br />
<br />
// This script creates a HTTP server for this object and maps a static alias which it<br />
// keeps up-to-date so that the object can always be accessed via the alias URL<br />
<br />
<br />
key url_req_key;<br />
key map_req_id;<br />
string url;<br />
string alias;<br />
string aliasurl;<br />
integer alias_last_updated; // unixtime<br />
integer expiry_secs;<br />
integer touch_count = 0;<br />
<br />
<br />
// obtain a URL <br />
setup()<br />
{<br />
// Request a HTTP URL for this object<br />
url_req_key = llRequestURL(); <br />
}<br />
<br />
<br />
// setup URL alias from <alias>.obj.virtualid.info -> targetURL<br />
setAlias(string alias, string targetURL)<br />
{<br />
// every alias has an expiry period (in seconds), which cannot be greater than 3 months.<br />
// The script needs to update it before then to renew the period<br />
expiry_secs = 48*60*60; // only going to ask for 48hours for this example<br />
llSetTimerEvent(expiry_secs-1); // set URL again before it expires<br />
<br />
map_req_id = llHTTPRequest("http://api.virtualid.info/?op=set&a="+alias<br />
+"&t="+llEscapeURL(targetURL)+"&exp="+(string)expiry_secs, [], "");<br />
}<br />
<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
setup();<br />
}<br />
<br />
on_rez(integer passed)<br />
{<br />
setup();<br />
} <br />
<br />
http_request(key id, string method, string body)<br />
{<br />
if (method == URL_REQUEST_GRANTED)<br />
{<br />
url = body;<br />
llOwnerSay("SL assigned us the URL: " + url);<br />
<br />
// the user-defined alias/subdomain we want to map to this object<br />
// must be a string of alphanumeric characters, can't start with a digit and must be <64 chars in length<br />
// (for this example we append the first few chars of the object key to make it different for each tester)<br />
alias = "myalias"+llGetSubString((string)llGetKey(),0,2);<br />
aliasurl = alias+".obj.virtualid.info";<br />
<br />
llOwnerSay("Requesting URL alias \""+aliasurl+"\" ...");<br />
<br />
setAlias(alias, url);<br />
<br />
}<br />
else if (method == URL_REQUEST_DENIED)<br />
{<br />
llSay(0, "Something went wrong, no url. " + body);<br />
}<br />
else if (method == "GET")<br />
{<br />
string rsp = "Hello from object "+llGetObjectName()+"!\n"<br />
+" owner: "+llKey2Name(llGetOwner())+"\n"<br />
+" key: "+(string)llGetKey()+"\n"<br />
+" touch count since reset: "+(string)touch_count;<br />
<br />
llHTTPResponse(id,200,rsp);<br />
}<br />
else<br />
{<br />
llHTTPResponse(id,405,"Unsupported Method");<br />
}<br />
}<br />
<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id = map_req_id)<br />
{<br />
llOwnerSay("Apez URLmap service said:"+body+" (status "+(string)status+")");<br />
<br />
if ((status >= 200) && (status < 300)) { // success<br />
llOwnerSay("You can now access this object via the URL http://"+aliasurl+" (try it in your browser!)");<br />
alias_last_updated = llGetUnixTime();<br />
}<br />
}<br />
}<br />
<br />
changed(integer c)<br />
{<br />
if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )<br />
{<br />
setup();<br />
}<br />
}<br />
<br />
timer()<br />
{<br />
if (llGetUnixTime() - alias_last_updated > expiry_secs)<br />
setAlias(alias, url);<br />
}<br />
<br />
touch(integer num_detected)<br />
{<br />
touch_count++;<br />
}<br />
<br />
}<br />
</lsl><br />
<br />
Back to [[LSL_Library]]<br />
<br />
{{#vardefine:sort|VirtualID URL map/redirect HTTP-in}}{{LSLC|Library}}{{LSLC|Examples}}<br />
{{LSLC|Tutorials}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=VirtualID_URLMap_(Broken)&diff=438113VirtualID URLMap (Broken)2009-07-25T00:59:20Z<p>Cenji Neutra: </p>
<hr />
<div>{{LSL Header}}<br />
[http://www.apez.biz Apez Corp] is please to offer a free URL redirection service: '''VirtualID URlMap''' - tailored for use with HTTP-in.<br />
<br />
It uses a very simple REST-based API and is implemented using Amazon's cloud computing services (AWS).<br />
<br />
<br />
It simply allows you to map a user-defined alias (a subdomain of .obj.virtualid.info) to a target URL (http[s]). For example, you might map http://my-counter.obj.virtualid.info to your script's HTTP-in URL and keep it updated. An alias can be setup and updated with a single GET (or POST) request.<br />
<br />
<br />
First, we'll show the simplest way to use it - save the details for the [http://wiki.apez.biz/Development docs].<br />
<br />
<br />
To create a new alias (or update an existing one), simply make a HTTP request like this in your script:<br />
<br />
<code><br />
llHTTPRequest("http://api.virtualid.info/?op=set&a=my-visitors&t=http://sim3015.aditi.lindenlab.com:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c", [], "");<br />
</code><br />
<br />
The part after <tt>op=</tt> is the operation - <tt>set</tt> in this case, which is used to create or update a mapping between an alias and a target URL. The alias is the subdomain used to access the object before the <tt>.obj.virtualid.info</tt> part.<br />
<br />
Obviously, the string after <tt>a=</tt> is the alias - which you can choose. Note that they're global - so you'll need to choose one nobody else has used ''(alphanumeric or "-" characters, can't start with a digit or "-")''.<br />
<br />
Finally, the string after <tt>t=</tt> is the target URL - where you wish the alias to be redirected.<br />
<br />
<br />
Now, when you access <tt>http://my-visitors.obj.virtualid.info</tt> the service issues a standard HTTP 302 Redirect code to the accesing client. If that is a browser, for example, it will automatically and instantly access the target URL.<br />
(Note that if you're using this for inter-object communication in-world, be aware that llHTTPRequest() doesn't handle 302 Redirect, so you'll need to access the location and make an additional request to the supplied target)<br />
<br />
Once you've created an alias the first time, you 'own' it and are the only one that can set it to a different value until either you delete it or it expires (see below for details). The default expiry is 30days from the last time is was updated.<br />
<br />
There are several other parameters, but that's about it to get started!<br />
Copy and paste the example script text below to try it out.<br />
<br />
<br />
Please refer to http://wiki.apez.biz/Development for full documentation to all the extra parameters and features.<br />
<br />
--<br />
<br />
The following example script maintains a static alias URL for an object's HTTP service which just returns some simple information about the object when accessed. It serves as a simple usage example.<br />
<br />
<lsl><br />
// Apez Corp Example LSL script <br />
// This script is hereby placed in the public domain.<br />
//<br />
// {"obj":"Apez DevKit", "ver":"2.3", "src":"devkit/Apez-urlmap-example.lsl"}<br />
// $Revision$<br />
<br />
<br />
//<br />
// This is an example of how to use the Apez URL mapping Affiliate Services REST API<br />
// The URLmap service is convenient for having a static URL that can be updated in response<br />
// to a changing target URL - such as those generated by the http_request event.<br />
// For details see http://wiki.apez.biz/Development<br />
<br />
<br />
// This script creates a HTTP server for this object and maps a static alias which it<br />
// keeps up-to-date so that the object can always be accessed via the alias URL<br />
<br />
<br />
key url_req_key;<br />
key map_req_id;<br />
string url;<br />
string alias;<br />
string aliasurl;<br />
integer alias_last_updated; // unixtime<br />
integer expiry_secs;<br />
integer touch_count = 0;<br />
<br />
<br />
// obtain a URL <br />
setup()<br />
{<br />
// Request a HTTP URL for this object<br />
url_req_key = llRequestURL(); <br />
}<br />
<br />
<br />
// setup URL alias from <alias>.obj.virtualid.info -> targetURL<br />
setAlias(string alias, string targetURL)<br />
{<br />
// every alias has an expiry period (in seconds), which cannot be greater than 3 months.<br />
// The script needs to update it before then to renew the period<br />
expiry_secs = 48*60*60; // only going to ask for 48hours for this example<br />
llSetTimerEvent(expiry_secs-1); // set URL again before it expires<br />
<br />
map_req_id = llHTTPRequest("http://api.virtualid.info/?op=set&a="+alias<br />
+"&t="+llEscapeURL(targetURL)+"&exp="+(string)expiry_secs, [], "");<br />
}<br />
<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
setup();<br />
}<br />
<br />
on_rez(integer passed)<br />
{<br />
setup();<br />
} <br />
<br />
http_request(key id, string method, string body)<br />
{<br />
if (method == URL_REQUEST_GRANTED)<br />
{<br />
url = body;<br />
llOwnerSay("SL assigned us the URL: " + url);<br />
<br />
// the user-defined alias/subdomain we want to map to this object<br />
// must be a string of alphanumeric characters, can't start with a digit and must be <64 chars in length<br />
// (for this example we append the first few chars of the object key to make it different for each tester)<br />
alias = "myalias"+llGetSubString((string)llGetKey(),0,2);<br />
aliasurl = alias+".obj.virtualid.info";<br />
<br />
llOwnerSay("Requesting URL alias \""+aliasurl+"\" ...");<br />
<br />
setAlias(alias, url);<br />
<br />
}<br />
else if (method == URL_REQUEST_DENIED)<br />
{<br />
llSay(0, "Something went wrong, no url. " + body);<br />
}<br />
else if (method == "GET")<br />
{<br />
string rsp = "Hello from object "+llGetObjectName()+"!\n"<br />
+" owner: "+llKey2Name(llGetOwner())+"\n"<br />
+" key: "+(string)llGetKey()+"\n"<br />
+" touch count since reset: "+(string)touch_count;<br />
<br />
llHTTPResponse(id,200,rsp);<br />
}<br />
else<br />
{<br />
llHTTPResponse(id,405,"Unsupported Method");<br />
}<br />
}<br />
<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id = map_req_id)<br />
{<br />
llOwnerSay("Apez URLmap service said:"+body+" (status "+(string)status+")");<br />
<br />
if ((status >= 200) && (status < 300)) { // success<br />
llOwnerSay("You can now access this object via the URL http://"+aliasurl+" (try it in your browser!)");<br />
alias_last_updated = llGetUnixTime();<br />
}<br />
}<br />
}<br />
<br />
changed(integer c)<br />
{<br />
if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )<br />
{<br />
setup();<br />
}<br />
}<br />
<br />
timer()<br />
{<br />
if (llGetUnixTime() - alias_last_updated > expiry_secs)<br />
setAlias(alias, url);<br />
}<br />
<br />
touch(integer num_detected)<br />
{<br />
touch_count++;<br />
}<br />
<br />
}<br />
</lsl><br />
<br />
Back to [[LSL_Library]]</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&diff=438103Category:LSL Library2009-07-25T00:54:48Z<p>Cenji Neutra: /* LSL Script Library */</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 />
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 are many [[script|scripts]] that have become buried in the [http://forums.secondlife.com/forumdisplay.php?f=15 Scripting Library forum], were lost with the death of the scripting forums, or sit idle in [[inventory|inventories]] that could be useful and should be more accessible.<br />
<br />
Other scripters may be in the same situation. This wiki is a well-suited medium for a script library. Feel free to add your scripts to the script library by creating new pages for them and linking to those pages here.<br />
<br />
Note that there are many more scripts in the LSL Library here, but you can't get to them if you don't know they exist, because they are subpages now, instead of an automatically updated category. Good luck searching.<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 <nowiki>{{LSL Header}}</nowiki>.<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 />
==LSL Script Library==<br />
<br />
{| class="sortable" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Name'''<br />
! '''Creator'''<br />
! '''Description'''<br />
|-<br />
||[[3D Radar]]<br />
||[[User:Jesse Barnett|Jesse Barnett]]<br />
||Rezzes a ball for each avatar in range. Each ball tracks its own AV and displays distance.<br />
|-<br />
||[[AdvancedNotecardReader]]<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 />
||[[AntiDelay Node]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||Uses llMessageLinked to stop those pesky delays.<br />
|-<br />
||[[AO Overriding Pose Ball]]<br />
||[[User:Jesse Barnett|Jesse Barnett]]<br />
||No more turning your AO off and on when you sit down<br />
|-<br />
||[[ARCFOUR Strong Encryption Implementation]]<br />
||[[User:Nekow42 Zarf|Nekow42 Zarf]]<br />
||An LSL implementation of ARCFOUR, the most popular stream cipher still in use. It is licensed under a Creative Commons Attribution 3.0 license.<br />
|-<br />
||[[Assembly Programming Language|Assembly-Like Programming Language]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||A compiler that runs assembly-like programs.<br />
|-<br />
||[[Associative Array Emulator|Associative Array (Dictionary) Emulator]]<br />
||[[User:Alynna Vixen|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|Dale Innis]]<br />
||Allows one avatar to automatically follow another.<br />
|-<br />
||[[Base2Dec]]<br />
||[[User:Siann Beck|Siann Beck]]<br />
||Convert a number to decimal from any base.<br />
|-<br />
||[[Basic Encryption Modules]]<br />
||[[User:Beverly Larkin|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 />
||[[BigNum|BigNum Library (RSA Encryption)]]<br />
||[[User:Xaviar Czervik|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|Fox Diller]]<br />
||A Binary Clock.<br />
|-<br />
||[[Be happy]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||Basic smile attachment script, makes your avatar smile.<br />
|-<br />
||[[Best Neighbor Ad Hiding Script|Best Neighbor]]<br />
||[[User:Doran Zemlja|Doran Zemlja]]<br />
||Reduce ad clutter by hiding ads when users are on their own land nearby.<br />
|-<br />
||[[Builders Buddy|Builder's Buddy Tool]]<br />
||[[User:Newfie Pendragon|Newfie Pendragon]]<br />
||Script to easily move/rotate large builds that exceed the linkable size limit (30 meters).<br />
|-<br />
||[[Camera Sync]]<br />
||[[User:Meyermagic Salome|Meyermagic Salome]] and [[User:Nomad Padar|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|Nobody Fugazi]]<br />
||Chat logger which requests permission from participants before recording them.<br />
|-<br />
||[[Chat_Relay|Chat Relay]]<br />
||[[User:grumble Loudon|grumble Loudon]]<br />
||A Chat relay which can be routed using a path header and won't echo.<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 />
||[[Color Changer|Color Changer Plus]]<br />
||[[User:Neo Calcutt|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|Sally LaSalle]]<br />
||Convert between Red Green Blue (RGB) and Hue Saturation Value (HSV).<br />
|-<br />
||[[ColorConvert]]<br />
||[[User:Siann Beck|Siann Beck]]<br />
||Convert color values to vector from RGB, hex or HTML color name.<br />
|-<br />
||[[Color script]]<br />
||[[User:Masakazu Kojima|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|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|jayco121 Bing]]<br />
|| A language written in LSL that is meant for my computer (available at the shop).<br />
|-<br />
||[[Library_Chat_Relay|Conversation Relay]]<br />
||[[User:Jippen Faddoul|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|Zilla Larsson]]<br />
||A simple script to retract/stretch curtains, blinds, bedcovers and more<br />
|-<br />
||[[Dataserver API]]<br />
||[[User:Revolution Perenti|Revolution Perenti]]<br />
||Dataserver Framework for Notecards.<br />
|-<br />
||[[Date Library]]<br />
||[[User:Corto Maltese|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 />
||[[Days in Month]]<br />
||[[User:IntLibber Brautigan|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 />
||[[Day of the Week]]<br />
||[[User:DoteDote Edison|DoteDote Edison]]<br />
||Function to get day of the week from [[llGetUnixTime]].<br />
|-<br />
||[[Deed Tools]]<br />
||[[User:Falados Kapuskas|Falados Kapuskas]]<br />
||Tools that allow the creator to modify Group-Owned (Deeded) Objects via chat.<br />
|-<br />
||[[Describe Chatter]]<br />
||Anonymous<br />
||Chat to see yourself as others do.<br />
|-<br />
||[[Drink script]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||Used mainly for food and drink in Second Life.<br />
|-<br />
||[[ClickAndDrag]]<br />
||[[User:Nexii Malthus|Nexii Malthus]]<br />
|| Click and Drag user interface elements using dynamic feedback<br />
|-<br />
||[[First Name Letter Prize]]<br />
||[[User:RaithSphere Whybrow|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 />
||[[Hierarchics]]<br />
||[[User:Nexii Malthus|Nexii Malthus]]<br />
|| Advanced script to create an efficient self-aware hierarchic structure.<br />
|-<br />
||[[Basic A-Star Pathfinder]]<br />
||[[User:Nexii Malthus|Nexii Malthus]]<br />
|| My own interpretation of A Star into a highly efficient algorithmn<br />
|-<br />
||[[PhysicsLib]]<br />
||[[User:Nexii Malthus|Nexii Malthus]]<br />
|| Interesting set of fun physics functions.<br />
|-<br />
||[[FastConeSpread]]<br />
||[[User:Nexii Malthus|Nexii Malthus]]<br />
|| Fast Algorithmn to achieve cone spread, main use in weaponry systems.<br />
|-<br />
||[[Dialog Control]]<br />
||[[User:Nargus Asturias|Nargus Asturias]]<br />
|| A (not-so) simple dialog control script. Call dialog and receive selected value via link_message(), with built-in timer and link_message() notification on time out. Supports multi-pages dialog and numeric property dialog. Button text and dialog's returned value can differ.<br />
|-<br />
||[[Dialog Menus Control]]<br />
||[[User:Nargus Asturias|Nargus Asturias]]<br />
|| An extension to Nargus Dialog Control. This menus control allow multi-level menus through SL dialog system. It can also recall last used menus. Menus are saved and pre-formatted for faster access. Though it is not the fastest, nor most memory efficient, but it should make it easier to use.<br />
|-<br />
||[[Dialog NumberPad|Dialog Number Pad]]<br />
||[[User:DoteDote Edison|DoteDote Edison]]<br />
||Use a dialog to accept positive integer input from users.<br />
|-<br />
||[[Efficiency Tester]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||Tests the speed of a function.<br />
|-<br />
||[[Email-to-IM|Email2IM]]<br />
||[[User:DoteDote Edison|DoteDote Edison]]<br />
||Send IMs to SL friends via email (translate emails from friends into IMs).<br />
|-<br />
||[[ExplodingObjects]]<br />
||[[User:Dale Innis|Dale Innis]]<br />
||Causes an object (of the appropriate type) to explode on command.<br />
|-<br />
||[[Fix Small Prims|Fix_Small_Prims]]<br />
||[[User:Emma Nowhere|Emma Nowhere]]<br />
||Finds and adjusts the smallest prims in a linkset so that it can be scaled down further.<br />
|-<br />
||[[Float2Hex]]<br />
||[[User:Strife Onizuka|Strife Onizuka]]<br />
||Very useful for transporting [[float|floats]].<br />
|-<br />
||[[Follower (script)|Follower]]<br />
||Unknown, uploaded by [[User:Slik Swindlehurst|Slik Swindlehurst]]<br />
||Makes an object follow the nearest person. Do not use for [[grief|griefing]].<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 />
||[[User:Valentine Foxdale|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|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|Emmas Seetan]]<br />
||Touch to recieve a random object in the prim's inventory<br />
|-<br />
||[[Google Charts]]<br />
||[[User:Dedric Mauriac|Dedric Mauriac]]<br />
||Create links to display raw data as a chart image.<br />
|-<br />
||[[Go transparent when walking]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||An attachment that goes invisble when you walk and visible when you don't walk.<br />
|-<br />
||[[Group Information v1.0]]<br />
||[[User:Tyrennic Rivera|Tyrennic Rivera]]<br />
||When clicked the prim will show group information (set on the prim) from the official Second Life Search page.<br />
|-<br />
||[[Group Privacy]]<br />
||[[User:Chance Unknown|Chance Unknown]]<br />
||Security device to insure members of a group can have a private area. Deactivates when nobody present.<br />
|-<br />
||[[Group key finder]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||Touch to find the key of the group<br />
|-<br />
||[[Hello Avatar]]<br />
||Linden Lab<br />
||SL's default script.<br />
|-<br />
||[[Holodeck]]<br />
||[[User:Revolution Perenti|Revolution Perenti]]<br />
||Home Rezzing System (Open Source).<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 />
||[[Interpolation|Interpolation Library]]<br />
||[[User:Nexii_Malthus|Nexii Malthus]]<br />
||A small set of interpolation functions.<br />
|-<br />
||[[Inventory Menu]]<br />
||[[User:Revolution Perenti|Revolution Perenti]]<br />
||Inventory Based Menu System.<br />
|-<br />
||[[iTunes RPC Email|iTunes RPC]]<br />
||[[User:Fox Diller|Fox Diller]]<br />
||iTunes RPC via LSL [[llEmail]] and [[llRemoteDataReply]].<br />
|-<br />
||[[Key Pad Door|Keypad Door]]<br />
||[[User:Tdub Dowler|Tdub Dowler]]<br />
|| Door and keypad with changeable code. Follow instructions carefully!<br />
|-<br />
||[[LSL_languageAPI]]<br />
||[[User:Gypsy paz|Gypsy Paz]]<br />
||Multi-lingual API from notecard based language files<br />
|-<br />
||[[Last Sound System]]<br />
||[[User:Babbage Linden|Babbage Linden]]<br />
||An LSL Last.fm client.<br />
|-<br />
||[[Listener Script]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||Use to listen to other people's conversations (Like spying)<br />
|-<br />
||[[List2CSV]]<br />
||[[User:Kunnis Basiat|Kunnis Basiat]]<br />
||List2CSV & CSV2List that include perserving type and escaping characters.<br />
|-<br />
||[[Load URL]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||Touch to get a dialog to visit the URL inside the script.<br />
|-<br />
||[[Mandelbrot Explorer]]<br />
||[[User:Babbage Linden|Babbage Linden]]<br />
||An interactive fractal explorer.<br />
|-<br />
||[[Merge Sort]]<br />
||[[User:Xaviar Czervik|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|Xaviar Czervik]]<br />
||A simple minesweeper game.<br />
|-<br />
||[[Multi Item Rezzer|Multi Item Rezzer]]<br />
||[[User:Jesse Barnett|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 />
||[[User:Beet Streeter|Beet Streeter]]<br />
||Spawns up to 10 objects when the object containing the script collides with a user.<br />
|-<br />
||[[Name2Key in LSL]]<br />
||[[User:Maeva Anatine|Maeva Anatine]]<br />
||Get the Name2Key feature inside your scripts. Works even on lastly subscribed avatars.<br />
|-<br />
||[[No Auto-Return]]<br />
||[[User:Bellla Clarity|Bella 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|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|Xaviar Czervik]]<br />
||A revision of Bella's that works for multi-prim objects.<br />
|-<br />
||[[No Limit Teleporter]]<br />
||[[User:Morgam Biedermann|Morgam Biedermann]]<br />
||Teleport to infinite altitudes (up to 4096m)<br />
|-<br />
||[[Object to Data v1.3|Object to Data]]<br />
||[[User:Xaviar Czervik|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|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|Alicia Stella]]<br />
||User Touches Object to Join Group from Group Info window, (no bot.)<br />
|-<br />
||[[ParseString2List]]<br />
||[[User:Strife Onizuka|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 />
||[[User:Syntrax Canucci|Syntrax Canucci]]<br />
||This is an over-complicated, semi-complex password generator, which goes through multiple steps.<br />
|-<br />
||[[Pathfinder]]<br />
||[[User:Babbage Linden|Babbage Linden]]<br />
||A potential field based pathfinding library.<br />
|-<br />
||[[Phantom Child]]<br />
||[[User:Aeron Kohime|Aeron Kohime]]<br />
||Causes a child in a link set to become phantom without the entire object becoming phantom.<br />
|-<br />
||[[Phantom Maker]]<br />
||[[User:Xaviar_Czervik|Xaviar Czervik]]<br />
||An object that turns avatars into phantoms, without having to remain sitting.<br />
|-<br />
||[[PosJump]]<br />
||[[User:Uchi Desmoulins|Uchi Desmoulins]]<br />
||A much more efficient alternative to the popular [[warpPos]] function for bypassing 10m distance-moved limitations.<br />
|-<br />
||[[Posing stand|Posing Stand]]<br />
||[[User:Bellla Clarity|Bella Clarity]]<br />
||Just a pose script to edit [[attachments]] more easily.<br />
|-<br />
||[[Prefix Calculator]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
|| A calculator that evaluates expressions in prefix notation. <br />
<code>+ 3 4 = 5. * + 1 2 + 3 4 = 14.</code><br />
|-<br />
||[[Pseudo-random Number Generator]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||Generates a Pseudo-random number between -0x7FFFFFFF and 0x7FFFFFFF<br />
|-<br />
||[[Play and Loop Sound]]<br />
||[[User:Bellla Clarity|Bella Clarity]]<br />
||Very short and simple script; plays and loops a sound in an object.<br />
|-<br />
||[[Rainbow_palette]]<br />
||[[User:Rui Clary|Rui Clary]]<br />
||Build a color picker, using only one prim, and a few lines of code.<br />
|-<br />
||[[Random AV Profile Projector]]<br />
||[[User:Debbie Trilling|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|CodeBastard Redgrave]]<br />
||Simple vendor that gives out random objects when paid the right amount <br />
|-<br />
||[[Random Password Generator]]<br />
||[[User:Jor3l Boa|Jor3l Boa]]<br />
||Generate Random passwords based on String Length.<br />
|-<br />
||[[RavText]]<br />
||[[User:Ravenous Dingo|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 />
||[[Say Region Frames Per Second|Region Frames Per Second]]<br />
||[[User:Heymeriou Mystakidou|Heymariou Mystakidou]]<br />
|| Says the region name and frames per second out loud on command.<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 />
||[[Scheduler]]<br />
||[[User:Haravikk Mistral|Haravikk Mistral]]<br />
||Schedule multiple events using a single script timer<br />
|-<br />
||[[Script Override Functions]]<br />
||[[User:Revolution Perenti|Revolution Perenti]]<br />
||bypass default strings, integer etc in chat channel.<br />
|-<br />
||[[Self Upgrading Script Enhanced]]<br />
||[[User:Cron Stardust|Cron Stardust]]<br />
||Keeps only latest version of the script on prim (even with multiple adds of the same script!)<br />
|-<br />
||[[SHA1|SHA1 Hash]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||Preforms a SHA1 Hash on an input text. Similar to MD5 only (slightly) more secure.<br />
|-<br />
||[[Sim Map Particle Projector]]<br />
||[[User:Jesse Barnett|Jesse Barnett]]<br />
||Displays a floating map of the sim the script is in.<br />
|-<br />
||[[Sim Restart Logger]]<br />
||[[User:Kyrah Abattoir|Kyrah Abattoir]]<br />
||Counts region restarts and displays log of last 9 restarts together with region FPS and dilation. <br />
|-<br />
||[[SLateIt]]<br />
||[[User:Babbage Linden|Babbage Linden]]<br />
||An augmented virtual reality HUD.<br />
|-<br />
||[[SLetanque]]<br />
||[[User:Babbage Linden|Babbage Linden]]<br />
||An LSL petanque game.<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 />
||[[SL Mail V1.2]]<br />
||[[User:Flennan Roffo|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|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 />
||[[Smooth Rotating Door]]<br />
|[[User:Toy Wylie|Toy Wylie]]<br />
||A script for doors that open and close smoothly using llTargetOmega<br />
|-<br />
|-<br />
||[[Smooth Sliding Door]]<br />
|[[User:SimonT Quinnell|SimonT Quinnell]]<br />
||A script for sliding doors that open and close smoothly using llMoveToTarget. Asjusts for prim orientation.<br />
|-<br />
||[[Spiral Staircase Generator]]<br />
|[[User:Meyermagic Salome|Meyermagic Salome]]<br />
||Generates nice looking spiral staircases without much hassle.<br />
|-<br />
||[[String Compare]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||Compares two strings and reliably returns either 1, -1, or 0 if they are the same.<br />
|-<br />
||[[Teleport HUD]]<br />
||[[User:Jesse Barnett|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 />
||[[Texture Menu Management|Texture Management]]<br />
||[[User:Revolution Perenti|Revolution Perenti]]<br />
||Dialog Menu based Texture Selection.<br />
|-<br />
||[[Tic Tac Toe]]<br />
||[[User:CG Linden|CG Linden]]<br />
||Step by step demo on how to implement a larger scripting project<br />
|-<br />
||[[TightList]]<br />
||[[User:Strife Onizuka|Revolution Perenti]]<br />
||Tight List is a family of functions for encoding lists as strings and then decoding them back into lists. <br />
<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|Isabelle Aquitaine]]<br />
||Manage multiple timers via linked messages.<br />
|-<br />
||[[Touch A Quote]]<br />
||[[User:CodeBastard Redgrave|CodeBastard Redgrave]]<br />
||Touch an object to read quotes sequentially from a notecard<br />
|-<br />
||[[Unix2DateTime]]<br />
|[[User:Flennan Roffo|Flennan Roffo]]<br />
||Conversion from Unix time (llGetUnixTime()) to date and time string and vice versa.<br />
|-<br />
||[[Under Age Boot]]<br />
|[[User:Chance Unknown|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 />
||[[Unmutable Descript Nagger]]<br />
|[[User:Bobbyb30 Zohari|Bobbyb30 Zohari]]<br />
||To nag avatars to take off their scripted attatchments.<br />
|-<br />
||[[VirtualID_URLMap|VirtualID URL Mapper for HTTP-in]]<br />
|[[User:Cenji Neutra|Cenji Neutra]]<br />
||A script showing how to setup a static URL of the form <your-alias>.obj.virtualid.info which maps to the dynamic HTTP-in URL LSL generates and keeps it up-to-date.<br />
|-<br />
||[[Visitor Logger (Web/Basic) ]]<br />
|[[User:Buddy Sprocket|Buddy Sprocket]]<br />
||A very basic visitor logger - log visitors in SL to a text file on your web-site.<br />
|-<br />
||[[Vote Simple]]<br />
|[[User:JB_Kraft|JB Kraft]]<br />
||Simple vote collector. One avi, one vote.<br />
|-<br />
||[[WarpPos]]<br />
|[[User:Keknehv Psaltery|Keknehv Psaltery]]<br />
||Non-physical movement without the 10m limit.<br />
|-<br />
||[[Window Control]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||For window opacity, helpful for buildings.<br />
|-<br />
||[[WHMcs SecondLife plugin]]<br />
|[[User:Alicia Sautereau|Alicia Sautereau]]<br />
||Linden Dollar payment plugin for the WHMcs hosting portal.<br />
|-<br />
||[[XTEA Strong Encryption Implementation]]<br />
||[[User:Morse Dillon|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 />
||[[User:Xylor Baysklef|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|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|Thraxis Epsilon]] and [[User:Gigs Taggart|Gigs Taggart]]<br />
|| Display text (up to 10 characters) on a prim. Way more efficient than XyText.<br />
|-<br />
||[[Wiki3DBuilder]]<br />
||[[User:Salahzar Stenvaag|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. This is only Version 0.1 but will be soon enhanced to integrate with other tools like sloodle or external websites.<br />
|-<br />
||[[Zero Lag Poseball]]<br />
||[[User:Jippen Faddoul|Jippen Faddoul]]<br />
||A simple poseball with no lag<br />
|}<br />
<br />
</div><br />
<div id="box"><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 />
||[[HTTP Post request to a PHP server]]<br />
||[[User:Corto Maltese|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 />
|| Silo<br />
|| [[User:Zero_Linden|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.secondlife.com/showthread.php?t=119570 Announcement].<br />
|-<br />
|| [http://aubretec.com/products/sldb SLDB]<br />
|| [[User:Luc Aubret|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 />
* [http://aubretec.com/support/manuals/sldbkit/ Implementation Guide]<br />
* [http://aubretec.com/wp-content/uploads/2009/05/sldb.zip Download] (.zip, 12kb)<br />
|-<br />
|| [[User:SignpostMarv Martin/PHP/llXorBase64StringsCorrect|llXorBase64StringsCorrect]]<br />
|| [[User:SignpostMarv Martin|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|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|Jor3l Boa]]<br />
|| Get Avatars UUID using Second Life search service. (like in LSL Name2Key)<br />
|-<br />
|| [[Lame_Object_DNS_and_Cross_Sim_Messaging|Lame Object DNS and Cross Sim Messaging]]<br />
|| [[User:Liandra Ceawlin|Liandra Ceawlin]]<br />
|| Simple, cheeseball method of doing cross-sim communications with http-in and an external object DNS service.<br />
|-<br />
|| [[Public_Object_DNS|Public Object DNS]]<br />
|| [[User:Liandra Ceawlin|Liandra Ceawlin]]<br />
|| Public object DNS-like system running on GAE, for http-in. Hopefully scalable enough for wide-spread usage.<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>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=VirtualID_URLMap_(Broken)&diff=438093VirtualID URLMap (Broken)2009-07-25T00:52:00Z<p>Cenji Neutra: </p>
<hr />
<div>[http://www.apez.biz Apez Corp] is please to offer a free URL redirection service: '''VirtualID URlMap''' - tailored for use with HTTP-in.<br />
<br />
It uses a very simple REST-based API and is implemented using Amazon's cloud computing services (AWS).<br />
<br />
<br />
It simply allows you to map a user-defined alias (a subdomain of .obj.virtualid.info) to a target URL (http[s]). For example, you might map http://my-counter.obj.virtualid.info to your script's HTTP-in URL and keep it updated. An alias can be setup and updated with a single GET (or POST) request.<br />
<br />
<br />
First, we'll show the simplest way to use it - save the details for the [http://wiki.apez.biz/Development docs].<br />
<br />
<br />
To create a new alias (or update an existing one), simply make a HTTP request like this in your script:<br />
<br />
<code><br />
llHTTPRequest("http://api.virtualid.info/?op=set&a=my-visitors&t=http://sim3015.aditi.lindenlab.com:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c", [], "");<br />
</code><br />
<br />
The part after <tt>op=</tt> is the operation - <tt>set</tt> in this case, which is used to create or update a mapping between an alias and a target URL. The alias is the subdomain used to access the object before the <tt>.obj.virtualid.info</tt> part.<br />
<br />
Obviously, the string after <tt>a=</tt> is the alias - which you can choose. Note that they're global - so you'll need to choose one nobody else has used ''(alphanumeric or "-" characters, can't start with a digit or "-")''.<br />
<br />
Finally, the string after <tt>t=</tt> is the target URL - where you wish the alias to be redirected.<br />
<br />
<br />
Now, when you access <tt>http://my-visitors.obj.virtualid.info</tt> the service issues a standard HTTP 302 Redirect code to the accesing client. If that is a browser, for example, it will automatically and instantly access the target URL.<br />
(Note that if you're using this for inter-object communication in-world, be aware that llHTTPRequest() doesn't handle 302 Redirect, so you'll need to access the location and make an additional request to the supplied target)<br />
<br />
Once you've created an alias the first time, you 'own' it and are the only one that can set it to a different value until either you delete it or it expires (see below for details). The default expiry is 30days from the last time is was updated.<br />
<br />
There are several other parameters, but that's about it to get started!<br />
Copy and paste the example script text below to try it out.<br />
<br />
<br />
Please refer to http://wiki.apez.biz/Development for full documentation to all the extra parameters and features.<br />
<br />
--<br />
<br />
The following example script maintains a static alias URL for an object's HTTP service which just returns some simple information about the object when accessed. It serves as a simple usage example.<br />
<br />
<lsl><br />
// Apez Corp Example LSL script <br />
// This script is hereby placed in the public domain.<br />
//<br />
// {"obj":"Apez DevKit", "ver":"2.3", "src":"devkit/Apez-urlmap-example.lsl"}<br />
// $Revision$<br />
<br />
<br />
//<br />
// This is an example of how to use the Apez URL mapping Affiliate Services REST API<br />
// The URLmap service is convenient for having a static URL that can be updated in response<br />
// to a changing target URL - such as those generated by the http_request event.<br />
// For details see http://wiki.apez.biz/Development<br />
<br />
<br />
// This script creates a HTTP server for this object and maps a static alias which it<br />
// keeps up-to-date so that the object can always be accessed via the alias URL<br />
<br />
<br />
key url_req_key;<br />
key map_req_id;<br />
string url;<br />
string alias;<br />
string aliasurl;<br />
integer alias_last_updated; // unixtime<br />
integer expiry_secs;<br />
integer touch_count = 0;<br />
<br />
<br />
// obtain a URL <br />
setup()<br />
{<br />
// Request a HTTP URL for this object<br />
url_req_key = llRequestURL(); <br />
}<br />
<br />
<br />
// setup URL alias from <alias>.obj.virtualid.info -> targetURL<br />
setAlias(string alias, string targetURL)<br />
{<br />
// every alias has an expiry period (in seconds), which cannot be greater than 3 months.<br />
// The script needs to update it before then to renew the period<br />
expiry_secs = 48*60*60; // only going to ask for 48hours for this example<br />
llSetTimerEvent(expiry_secs-1); // set URL again before it expires<br />
<br />
map_req_id = llHTTPRequest("http://api.virtualid.info/?op=set&a="+alias<br />
+"&t="+llEscapeURL(targetURL)+"&exp="+(string)expiry_secs, [], "");<br />
}<br />
<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
setup();<br />
}<br />
<br />
on_rez(integer passed)<br />
{<br />
setup();<br />
} <br />
<br />
http_request(key id, string method, string body)<br />
{<br />
if (method == URL_REQUEST_GRANTED)<br />
{<br />
url = body;<br />
llOwnerSay("SL assigned us the URL: " + url);<br />
<br />
// the user-defined alias/subdomain we want to map to this object<br />
// must be a string of alphanumeric characters, can't start with a digit and must be <64 chars in length<br />
// (for this example we append the first few chars of the object key to make it different for each tester)<br />
alias = "myalias"+llGetSubString((string)llGetKey(),0,2);<br />
aliasurl = alias+".obj.virtualid.info";<br />
<br />
llOwnerSay("Requesting URL alias \""+aliasurl+"\" ...");<br />
<br />
setAlias(alias, url);<br />
<br />
}<br />
else if (method == URL_REQUEST_DENIED)<br />
{<br />
llSay(0, "Something went wrong, no url. " + body);<br />
}<br />
else if (method == "GET")<br />
{<br />
string rsp = "Hello from object "+llGetObjectName()+"!\n"<br />
+" owner: "+llKey2Name(llGetOwner())+"\n"<br />
+" key: "+(string)llGetKey()+"\n"<br />
+" touch count since reset: "+(string)touch_count;<br />
<br />
llHTTPResponse(id,200,rsp);<br />
}<br />
else<br />
{<br />
llHTTPResponse(id,405,"Unsupported Method");<br />
}<br />
}<br />
<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id = map_req_id)<br />
{<br />
llOwnerSay("Apez URLmap service said:"+body+" (status "+(string)status+")");<br />
<br />
if ((status >= 200) && (status < 300)) { // success<br />
llOwnerSay("You can now access this object via the URL http://"+aliasurl+" (try it in your browser!)");<br />
alias_last_updated = llGetUnixTime();<br />
}<br />
}<br />
}<br />
<br />
changed(integer c)<br />
{<br />
if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )<br />
{<br />
setup();<br />
}<br />
}<br />
<br />
timer()<br />
{<br />
if (llGetUnixTime() - alias_last_updated > expiry_secs)<br />
setAlias(alias, url);<br />
}<br />
<br />
touch(integer num_detected)<br />
{<br />
touch_count++;<br />
}<br />
<br />
}<br />
</lsl></div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Category:LSL_Library&diff=438083Category:LSL Library2009-07-25T00:49:55Z<p>Cenji Neutra: /* LSL Script Library */</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 />
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 are many [[script|scripts]] that have become buried in the [http://forums.secondlife.com/forumdisplay.php?f=15 Scripting Library forum], were lost with the death of the scripting forums, or sit idle in [[inventory|inventories]] that could be useful and should be more accessible.<br />
<br />
Other scripters may be in the same situation. This wiki is a well-suited medium for a script library. Feel free to add your scripts to the script library by creating new pages for them and linking to those pages here.<br />
<br />
Note that there are many more scripts in the LSL Library here, but you can't get to them if you don't know they exist, because they are subpages now, instead of an automatically updated category. Good luck searching.<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 <nowiki>{{LSL Header}}</nowiki>.<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 />
==LSL Script Library==<br />
<br />
{| class="sortable" {{Prettytable}}<br />
|- {{Hl2}}<br />
! '''Name'''<br />
! '''Creator'''<br />
! '''Description'''<br />
|-<br />
||[[3D Radar]]<br />
||[[User:Jesse Barnett|Jesse Barnett]]<br />
||Rezzes a ball for each avatar in range. Each ball tracks its own AV and displays distance.<br />
|-<br />
||[[AdvancedNotecardReader]]<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 />
||[[AntiDelay Node]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||Uses llMessageLinked to stop those pesky delays.<br />
|-<br />
||[[AO Overriding Pose Ball]]<br />
||[[User:Jesse Barnett|Jesse Barnett]]<br />
||No more turning your AO off and on when you sit down<br />
|-<br />
||[[ARCFOUR Strong Encryption Implementation]]<br />
||[[User:Nekow42 Zarf|Nekow42 Zarf]]<br />
||An LSL implementation of ARCFOUR, the most popular stream cipher still in use. It is licensed under a Creative Commons Attribution 3.0 license.<br />
|-<br />
||[[Assembly Programming Language|Assembly-Like Programming Language]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||A compiler that runs assembly-like programs.<br />
|-<br />
||[[Associative Array Emulator|Associative Array (Dictionary) Emulator]]<br />
||[[User:Alynna Vixen|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|Dale Innis]]<br />
||Allows one avatar to automatically follow another.<br />
|-<br />
||[[Base2Dec]]<br />
||[[User:Siann Beck|Siann Beck]]<br />
||Convert a number to decimal from any base.<br />
|-<br />
||[[Basic Encryption Modules]]<br />
||[[User:Beverly Larkin|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 />
||[[BigNum|BigNum Library (RSA Encryption)]]<br />
||[[User:Xaviar Czervik|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|Fox Diller]]<br />
||A Binary Clock.<br />
|-<br />
||[[Be happy]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||Basic smile attachment script, makes your avatar smile.<br />
|-<br />
||[[Best Neighbor Ad Hiding Script|Best Neighbor]]<br />
||[[User:Doran Zemlja|Doran Zemlja]]<br />
||Reduce ad clutter by hiding ads when users are on their own land nearby.<br />
|-<br />
||[[Builders Buddy|Builder's Buddy Tool]]<br />
||[[User:Newfie Pendragon|Newfie Pendragon]]<br />
||Script to easily move/rotate large builds that exceed the linkable size limit (30 meters).<br />
|-<br />
||[[Camera Sync]]<br />
||[[User:Meyermagic Salome|Meyermagic Salome]] and [[User:Nomad Padar|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|Nobody Fugazi]]<br />
||Chat logger which requests permission from participants before recording them.<br />
|-<br />
||[[Chat_Relay|Chat Relay]]<br />
||[[User:grumble Loudon|grumble Loudon]]<br />
||A Chat relay which can be routed using a path header and won't echo.<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 />
||[[Color Changer|Color Changer Plus]]<br />
||[[User:Neo Calcutt|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|Sally LaSalle]]<br />
||Convert between Red Green Blue (RGB) and Hue Saturation Value (HSV).<br />
|-<br />
||[[ColorConvert]]<br />
||[[User:Siann Beck|Siann Beck]]<br />
||Convert color values to vector from RGB, hex or HTML color name.<br />
|-<br />
||[[Color script]]<br />
||[[User:Masakazu Kojima|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|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|jayco121 Bing]]<br />
|| A language written in LSL that is meant for my computer (available at the shop).<br />
|-<br />
||[[Library_Chat_Relay|Conversation Relay]]<br />
||[[User:Jippen Faddoul|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|Zilla Larsson]]<br />
||A simple script to retract/stretch curtains, blinds, bedcovers and more<br />
|-<br />
||[[Dataserver API]]<br />
||[[User:Revolution Perenti|Revolution Perenti]]<br />
||Dataserver Framework for Notecards.<br />
|-<br />
||[[Date Library]]<br />
||[[User:Corto Maltese|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 />
||[[Days in Month]]<br />
||[[User:IntLibber Brautigan|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 />
||[[Day of the Week]]<br />
||[[User:DoteDote Edison|DoteDote Edison]]<br />
||Function to get day of the week from [[llGetUnixTime]].<br />
|-<br />
||[[Deed Tools]]<br />
||[[User:Falados Kapuskas|Falados Kapuskas]]<br />
||Tools that allow the creator to modify Group-Owned (Deeded) Objects via chat.<br />
|-<br />
||[[Describe Chatter]]<br />
||Anonymous<br />
||Chat to see yourself as others do.<br />
|-<br />
||[[Drink script]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||Used mainly for food and drink in Second Life.<br />
|-<br />
||[[ClickAndDrag]]<br />
||[[User:Nexii Malthus|Nexii Malthus]]<br />
|| Click and Drag user interface elements using dynamic feedback<br />
|-<br />
||[[First Name Letter Prize]]<br />
||[[User:RaithSphere Whybrow|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 />
||[[Hierarchics]]<br />
||[[User:Nexii Malthus|Nexii Malthus]]<br />
|| Advanced script to create an efficient self-aware hierarchic structure.<br />
|-<br />
||[[Basic A-Star Pathfinder]]<br />
||[[User:Nexii Malthus|Nexii Malthus]]<br />
|| My own interpretation of A Star into a highly efficient algorithmn<br />
|-<br />
||[[PhysicsLib]]<br />
||[[User:Nexii Malthus|Nexii Malthus]]<br />
|| Interesting set of fun physics functions.<br />
|-<br />
||[[FastConeSpread]]<br />
||[[User:Nexii Malthus|Nexii Malthus]]<br />
|| Fast Algorithmn to achieve cone spread, main use in weaponry systems.<br />
|-<br />
||[[Dialog Control]]<br />
||[[User:Nargus Asturias|Nargus Asturias]]<br />
|| A (not-so) simple dialog control script. Call dialog and receive selected value via link_message(), with built-in timer and link_message() notification on time out. Supports multi-pages dialog and numeric property dialog. Button text and dialog's returned value can differ.<br />
|-<br />
||[[Dialog Menus Control]]<br />
||[[User:Nargus Asturias|Nargus Asturias]]<br />
|| An extension to Nargus Dialog Control. This menus control allow multi-level menus through SL dialog system. It can also recall last used menus. Menus are saved and pre-formatted for faster access. Though it is not the fastest, nor most memory efficient, but it should make it easier to use.<br />
|-<br />
||[[Dialog NumberPad|Dialog Number Pad]]<br />
||[[User:DoteDote Edison|DoteDote Edison]]<br />
||Use a dialog to accept positive integer input from users.<br />
|-<br />
||[[Efficiency Tester]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||Tests the speed of a function.<br />
|-<br />
||[[Email-to-IM|Email2IM]]<br />
||[[User:DoteDote Edison|DoteDote Edison]]<br />
||Send IMs to SL friends via email (translate emails from friends into IMs).<br />
|-<br />
||[[ExplodingObjects]]<br />
||[[User:Dale Innis|Dale Innis]]<br />
||Causes an object (of the appropriate type) to explode on command.<br />
|-<br />
||[[Fix Small Prims|Fix_Small_Prims]]<br />
||[[User:Emma Nowhere|Emma Nowhere]]<br />
||Finds and adjusts the smallest prims in a linkset so that it can be scaled down further.<br />
|-<br />
||[[Float2Hex]]<br />
||[[User:Strife Onizuka|Strife Onizuka]]<br />
||Very useful for transporting [[float|floats]].<br />
|-<br />
||[[Follower (script)|Follower]]<br />
||Unknown, uploaded by [[User:Slik Swindlehurst|Slik Swindlehurst]]<br />
||Makes an object follow the nearest person. Do not use for [[grief|griefing]].<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 />
||[[User:Valentine Foxdale|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|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|Emmas Seetan]]<br />
||Touch to recieve a random object in the prim's inventory<br />
|-<br />
||[[Google Charts]]<br />
||[[User:Dedric Mauriac|Dedric Mauriac]]<br />
||Create links to display raw data as a chart image.<br />
|-<br />
||[[Go transparent when walking]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||An attachment that goes invisble when you walk and visible when you don't walk.<br />
|-<br />
||[[Group Information v1.0]]<br />
||[[User:Tyrennic Rivera|Tyrennic Rivera]]<br />
||When clicked the prim will show group information (set on the prim) from the official Second Life Search page.<br />
|-<br />
||[[Group Privacy]]<br />
||[[User:Chance Unknown|Chance Unknown]]<br />
||Security device to insure members of a group can have a private area. Deactivates when nobody present.<br />
|-<br />
||[[Group key finder]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||Touch to find the key of the group<br />
|-<br />
||[[Hello Avatar]]<br />
||Linden Lab<br />
||SL's default script.<br />
|-<br />
||[[Holodeck]]<br />
||[[User:Revolution Perenti|Revolution Perenti]]<br />
||Home Rezzing System (Open Source).<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 />
||[[Interpolation|Interpolation Library]]<br />
||[[User:Nexii_Malthus|Nexii Malthus]]<br />
||A small set of interpolation functions.<br />
|-<br />
||[[Inventory Menu]]<br />
||[[User:Revolution Perenti|Revolution Perenti]]<br />
||Inventory Based Menu System.<br />
|-<br />
||[[iTunes RPC Email|iTunes RPC]]<br />
||[[User:Fox Diller|Fox Diller]]<br />
||iTunes RPC via LSL [[llEmail]] and [[llRemoteDataReply]].<br />
|-<br />
||[[Key Pad Door|Keypad Door]]<br />
||[[User:Tdub Dowler|Tdub Dowler]]<br />
|| Door and keypad with changeable code. Follow instructions carefully!<br />
|-<br />
||[[LSL_languageAPI]]<br />
||[[User:Gypsy paz|Gypsy Paz]]<br />
||Multi-lingual API from notecard based language files<br />
|-<br />
||[[Last Sound System]]<br />
||[[User:Babbage Linden|Babbage Linden]]<br />
||An LSL Last.fm client.<br />
|-<br />
||[[Listener Script]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||Use to listen to other people's conversations (Like spying)<br />
|-<br />
||[[List2CSV]]<br />
||[[User:Kunnis Basiat|Kunnis Basiat]]<br />
||List2CSV & CSV2List that include perserving type and escaping characters.<br />
|-<br />
||[[Load URL]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||Touch to get a dialog to visit the URL inside the script.<br />
|-<br />
||[[Mandelbrot Explorer]]<br />
||[[User:Babbage Linden|Babbage Linden]]<br />
||An interactive fractal explorer.<br />
|-<br />
||[[Merge Sort]]<br />
||[[User:Xaviar Czervik|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|Xaviar Czervik]]<br />
||A simple minesweeper game.<br />
|-<br />
||[[Multi Item Rezzer|Multi Item Rezzer]]<br />
||[[User:Jesse Barnett|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 />
||[[User:Beet Streeter|Beet Streeter]]<br />
||Spawns up to 10 objects when the object containing the script collides with a user.<br />
|-<br />
||[[Name2Key in LSL]]<br />
||[[User:Maeva Anatine|Maeva Anatine]]<br />
||Get the Name2Key feature inside your scripts. Works even on lastly subscribed avatars.<br />
|-<br />
||[[No Auto-Return]]<br />
||[[User:Bellla Clarity|Bella 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|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|Xaviar Czervik]]<br />
||A revision of Bella's that works for multi-prim objects.<br />
|-<br />
||[[No Limit Teleporter]]<br />
||[[User:Morgam Biedermann|Morgam Biedermann]]<br />
||Teleport to infinite altitudes (up to 4096m)<br />
|-<br />
||[[Object to Data v1.3|Object to Data]]<br />
||[[User:Xaviar Czervik|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|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|Alicia Stella]]<br />
||User Touches Object to Join Group from Group Info window, (no bot.)<br />
|-<br />
||[[ParseString2List]]<br />
||[[User:Strife Onizuka|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 />
||[[User:Syntrax Canucci|Syntrax Canucci]]<br />
||This is an over-complicated, semi-complex password generator, which goes through multiple steps.<br />
|-<br />
||[[Pathfinder]]<br />
||[[User:Babbage Linden|Babbage Linden]]<br />
||A potential field based pathfinding library.<br />
|-<br />
||[[Phantom Child]]<br />
||[[User:Aeron Kohime|Aeron Kohime]]<br />
||Causes a child in a link set to become phantom without the entire object becoming phantom.<br />
|-<br />
||[[Phantom Maker]]<br />
||[[User:Xaviar_Czervik|Xaviar Czervik]]<br />
||An object that turns avatars into phantoms, without having to remain sitting.<br />
|-<br />
||[[PosJump]]<br />
||[[User:Uchi Desmoulins|Uchi Desmoulins]]<br />
||A much more efficient alternative to the popular [[warpPos]] function for bypassing 10m distance-moved limitations.<br />
|-<br />
||[[Posing stand|Posing Stand]]<br />
||[[User:Bellla Clarity|Bella Clarity]]<br />
||Just a pose script to edit [[attachments]] more easily.<br />
|-<br />
||[[Prefix Calculator]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
|| A calculator that evaluates expressions in prefix notation. <br />
<code>+ 3 4 = 5. * + 1 2 + 3 4 = 14.</code><br />
|-<br />
||[[Pseudo-random Number Generator]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||Generates a Pseudo-random number between -0x7FFFFFFF and 0x7FFFFFFF<br />
|-<br />
||[[Play and Loop Sound]]<br />
||[[User:Bellla Clarity|Bella Clarity]]<br />
||Very short and simple script; plays and loops a sound in an object.<br />
|-<br />
||[[Rainbow_palette]]<br />
||[[User:Rui Clary|Rui Clary]]<br />
||Build a color picker, using only one prim, and a few lines of code.<br />
|-<br />
||[[Random AV Profile Projector]]<br />
||[[User:Debbie Trilling|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|CodeBastard Redgrave]]<br />
||Simple vendor that gives out random objects when paid the right amount <br />
|-<br />
||[[Random Password Generator]]<br />
||[[User:Jor3l Boa|Jor3l Boa]]<br />
||Generate Random passwords based on String Length.<br />
|-<br />
||[[RavText]]<br />
||[[User:Ravenous Dingo|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 />
||[[Say Region Frames Per Second|Region Frames Per Second]]<br />
||[[User:Heymeriou Mystakidou|Heymariou Mystakidou]]<br />
|| Says the region name and frames per second out loud on command.<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 />
||[[Scheduler]]<br />
||[[User:Haravikk Mistral|Haravikk Mistral]]<br />
||Schedule multiple events using a single script timer<br />
|-<br />
||[[Script Override Functions]]<br />
||[[User:Revolution Perenti|Revolution Perenti]]<br />
||bypass default strings, integer etc in chat channel.<br />
|-<br />
||[[Self Upgrading Script Enhanced]]<br />
||[[User:Cron Stardust|Cron Stardust]]<br />
||Keeps only latest version of the script on prim (even with multiple adds of the same script!)<br />
|-<br />
||[[SHA1|SHA1 Hash]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||Preforms a SHA1 Hash on an input text. Similar to MD5 only (slightly) more secure.<br />
|-<br />
||[[Sim Map Particle Projector]]<br />
||[[User:Jesse Barnett|Jesse Barnett]]<br />
||Displays a floating map of the sim the script is in.<br />
|-<br />
||[[Sim Restart Logger]]<br />
||[[User:Kyrah Abattoir|Kyrah Abattoir]]<br />
||Counts region restarts and displays log of last 9 restarts together with region FPS and dilation. <br />
|-<br />
||[[SLateIt]]<br />
||[[User:Babbage Linden|Babbage Linden]]<br />
||An augmented virtual reality HUD.<br />
|-<br />
||[[SLetanque]]<br />
||[[User:Babbage Linden|Babbage Linden]]<br />
||An LSL petanque game.<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 />
||[[SL Mail V1.2]]<br />
||[[User:Flennan Roffo|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|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 />
||[[Smooth Rotating Door]]<br />
|[[User:Toy Wylie|Toy Wylie]]<br />
||A script for doors that open and close smoothly using llTargetOmega<br />
|-<br />
|-<br />
||[[Smooth Sliding Door]]<br />
|[[User:SimonT Quinnell|SimonT Quinnell]]<br />
||A script for sliding doors that open and close smoothly using llMoveToTarget. Asjusts for prim orientation.<br />
|-<br />
||[[Spiral Staircase Generator]]<br />
|[[User:Meyermagic Salome|Meyermagic Salome]]<br />
||Generates nice looking spiral staircases without much hassle.<br />
|-<br />
||[[String Compare]]<br />
||[[User:Xaviar Czervik|Xaviar Czervik]]<br />
||Compares two strings and reliably returns either 1, -1, or 0 if they are the same.<br />
|-<br />
||[[Teleport HUD]]<br />
||[[User:Jesse Barnett|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 />
||[[Texture Menu Management|Texture Management]]<br />
||[[User:Revolution Perenti|Revolution Perenti]]<br />
||Dialog Menu based Texture Selection.<br />
|-<br />
||[[Tic Tac Toe]]<br />
||[[User:CG Linden|CG Linden]]<br />
||Step by step demo on how to implement a larger scripting project<br />
|-<br />
||[[TightList]]<br />
||[[User:Strife Onizuka|Revolution Perenti]]<br />
||Tight List is a family of functions for encoding lists as strings and then decoding them back into lists. <br />
<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|Isabelle Aquitaine]]<br />
||Manage multiple timers via linked messages.<br />
|-<br />
||[[Touch A Quote]]<br />
||[[User:CodeBastard Redgrave|CodeBastard Redgrave]]<br />
||Touch an object to read quotes sequentially from a notecard<br />
|-<br />
||[[Unix2DateTime]]<br />
|[[User:Flennan Roffo|Flennan Roffo]]<br />
||Conversion from Unix time (llGetUnixTime()) to date and time string and vice versa.<br />
|-<br />
||[[Under Age Boot]]<br />
|[[User:Chance Unknown|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 />
||[[Unmutable Descript Nagger]]<br />
|[[User:Bobbyb30 Zohari|Bobbyb30 Zohari]]<br />
||To nag avatars to take off their scripted attatchments.<br />
|-<br />
||[[VirtualID_URLMap|VirtualID URL Mapper for HTTP-in]]<br />
|[[User:Cenji Neutra|Cenji Neutra]]<br />
||A simple script showing how to setup a static URL of the form <your-alias>.obj.virtualid.info which maps to the dynamic HTTP-in URL LSL generates and keeps it up-to-date.<br />
|-<br />
||[[Visitor Logger (Web/Basic) ]]<br />
|[[User:Buddy Sprocket|Buddy Sprocket]]<br />
||A very basic visitor logger - log visitors in SL to a text file on your web-site.<br />
|-<br />
||[[Vote Simple]]<br />
|[[User:JB_Kraft|JB Kraft]]<br />
||Simple vote collector. One avi, one vote.<br />
|-<br />
||[[WarpPos]]<br />
|[[User:Keknehv Psaltery|Keknehv Psaltery]]<br />
||Non-physical movement without the 10m limit.<br />
|-<br />
||[[Window Control]]<br />
||[[User:Emmas Seetan|Emmas Seetan]]<br />
||For window opacity, helpful for buildings.<br />
|-<br />
||[[WHMcs SecondLife plugin]]<br />
|[[User:Alicia Sautereau|Alicia Sautereau]]<br />
||Linden Dollar payment plugin for the WHMcs hosting portal.<br />
|-<br />
||[[XTEA Strong Encryption Implementation]]<br />
||[[User:Morse Dillon|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 />
||[[User:Xylor Baysklef|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|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|Thraxis Epsilon]] and [[User:Gigs Taggart|Gigs Taggart]]<br />
|| Display text (up to 10 characters) on a prim. Way more efficient than XyText.<br />
|-<br />
||[[Wiki3DBuilder]]<br />
||[[User:Salahzar Stenvaag|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. This is only Version 0.1 but will be soon enhanced to integrate with other tools like sloodle or external websites.<br />
|-<br />
||[[Zero Lag Poseball]]<br />
||[[User:Jippen Faddoul|Jippen Faddoul]]<br />
||A simple poseball with no lag<br />
|}<br />
<br />
</div><br />
<div id="box"><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 />
||[[HTTP Post request to a PHP server]]<br />
||[[User:Corto Maltese|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 />
|| Silo<br />
|| [[User:Zero_Linden|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.secondlife.com/showthread.php?t=119570 Announcement].<br />
|-<br />
|| [http://aubretec.com/products/sldb SLDB]<br />
|| [[User:Luc Aubret|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 />
* [http://aubretec.com/support/manuals/sldbkit/ Implementation Guide]<br />
* [http://aubretec.com/wp-content/uploads/2009/05/sldb.zip Download] (.zip, 12kb)<br />
|-<br />
|| [[User:SignpostMarv Martin/PHP/llXorBase64StringsCorrect|llXorBase64StringsCorrect]]<br />
|| [[User:SignpostMarv Martin|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|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|Jor3l Boa]]<br />
|| Get Avatars UUID using Second Life search service. (like in LSL Name2Key)<br />
|-<br />
|| [[Lame_Object_DNS_and_Cross_Sim_Messaging|Lame Object DNS and Cross Sim Messaging]]<br />
|| [[User:Liandra Ceawlin|Liandra Ceawlin]]<br />
|| Simple, cheeseball method of doing cross-sim communications with http-in and an external object DNS service.<br />
|-<br />
|| [[Public_Object_DNS|Public Object DNS]]<br />
|| [[User:Liandra Ceawlin|Liandra Ceawlin]]<br />
|| Public object DNS-like system running on GAE, for http-in. Hopefully scalable enough for wide-spread usage.<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>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=VirtualID_URLMap_(Broken)&diff=438072VirtualID URLMap (Broken)2009-07-24T23:34:51Z<p>Cenji Neutra: Created page with '[http://www.apez.biz Apez Corp] is please to offer a free URL redirection service: '''VirtualID URlMap''' - tailored for use with HTTP-in. It uses a very simple REST-based API ...'</p>
<hr />
<div>[http://www.apez.biz Apez Corp] is please to offer a free URL redirection service: '''VirtualID URlMap''' - tailored for use with HTTP-in. <br />
It uses a very simple REST-based API and it implemented using Amazon's cloud computing services (AWS).<br />
<br />
<br />
It simply allows you to map a user-defined alias (a subdomain of .obj.virtualid.info) to a target URL (http[s]). For example, you might map http://my-counter.obj.virtualid.info to your script's HTTP-in URL and keep it updated. An alias can be setup and updated with a single GET (or POST) request.<br />
<br />
<br />
First, we'll show the simplest way to use it - save the details for the [http://wiki.apez.biz/Development docs].<br />
<br />
<br />
To create a new alias (or update an existing one), simply make a HTTP request like this in your script:<br />
<br />
<code><br />
llHTTPRequest("http://api.virtualid.info/?op=set&a=my-visitors&t=http://sim3015.aditi.lindenlab.com:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c", [], "");<br />
</code><br />
<br />
The part after <tt>op=</tt> is the operation - <tt>set</tt> in this case, which is used to create or update a mapping between an alias and a target URL. The alias is the subdomain used to access the object before the <tt>.obj.virtualid.info</tt> part.<br />
<br />
Obviously, the string after <tt>a=</tt> is the alias - which you can choose. Note that they're global - so you'll need to choose one nobody else has used ''(alphanumeric or "-" characters, can't start with a digit or "-")''.<br />
<br />
Finally, the string after <tt>t=</tt> is the target URL - where you wish the alias to be redirected.<br />
<br />
<br />
Now, when you access <tt>http://my-visitors.obj.virtualid.info</tt> the service issues a standard HTTP 302 Redirect code to the accesing client. If that is a browser, for example, it will automatically and instantly access the target URL.<br />
(Note that if you're using this for inter-object communication in-world, be aware that llHTTPRequest() doesn't handle 302 Redirect, so you'll need to access the location and make an additional request to the supplied target)<br />
<br />
Once you've created an alias the first time, you 'own' it and are the only one that can set it to a different value until either you delete it or it expires (see below for details). The default expiry is 30days from the last time is was updated.<br />
<br />
There are several other parameters, but that's about it to get started!<br />
Copy and paste the example script text below to try it out.<br />
<br />
<br />
Please refer to http://wiki.apez.biz/Development for full documentation to all the extra parameters and features.<br />
<br />
--<br />
<br />
The following example script maintains a static alias URL for an object's HTTP service which just returns some simple information about the object when accessed. It serves as a simple usage example.<br />
<br />
<lsl><br />
// Apez Corp Example LSL script <br />
// This script is hereby placed in the public domain.<br />
//<br />
// {"obj":"Apez DevKit", "ver":"2.3", "src":"devkit/Apez-urlmap-example.lsl"}<br />
// $Revision$<br />
<br />
<br />
//<br />
// This is an example of how to use the Apez URL mapping Affiliate Services REST API<br />
// The URLmap service is convenient for having a static URL that can be updated in response<br />
// to a changing target URL - such as those generated by the http_request event.<br />
// For details see http://wiki.apez.biz/Development<br />
<br />
<br />
// This script creates a HTTP server for this object and maps a static alias which it<br />
// keeps up-to-date so that the object can always be accessed via the alias URL<br />
<br />
<br />
key url_req_key;<br />
key map_req_id;<br />
string url;<br />
string alias;<br />
string aliasurl;<br />
integer alias_last_updated; // unixtime<br />
integer expiry_secs;<br />
integer touch_count = 0;<br />
<br />
<br />
// obtain a URL <br />
setup()<br />
{<br />
// Request a HTTP URL for this object<br />
url_req_key = llRequestURL(); <br />
}<br />
<br />
<br />
// setup URL alias from <alias>.obj.virtualid.info -> targetURL<br />
setAlias(string alias, string targetURL)<br />
{<br />
// every alias has an expiry period (in seconds), which cannot be greater than 3 months.<br />
// The script needs to update it before then to renew the period<br />
expiry_secs = 48*60*60; // only going to ask for 48hours for this example<br />
llSetTimerEvent(expiry_secs-1); // set URL again before it expires<br />
<br />
map_req_id = llHTTPRequest("http://api.virtualid.info/?op=set&a="+alias<br />
+"&t="+llEscapeURL(targetURL)+"&exp="+(string)expiry_secs, [], "");<br />
}<br />
<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
setup();<br />
}<br />
<br />
on_rez(integer passed)<br />
{<br />
setup();<br />
} <br />
<br />
http_request(key id, string method, string body)<br />
{<br />
if (method == URL_REQUEST_GRANTED)<br />
{<br />
url = body;<br />
llOwnerSay("SL assigned us the URL: " + url);<br />
<br />
// the user-defined alias/subdomain we want to map to this object<br />
// must be a string of alphanumeric characters, can't start with a digit and must be <64 chars in length<br />
// (for this example we append the first few chars of the object key to make it different for each tester)<br />
alias = "myalias"+llGetSubString((string)llGetKey(),0,2);<br />
aliasurl = alias+".obj.virtualid.info";<br />
<br />
llOwnerSay("Requesting URL alias \""+aliasurl+"\" ...");<br />
<br />
setAlias(alias, url);<br />
<br />
}<br />
else if (method == URL_REQUEST_DENIED)<br />
{<br />
llSay(0, "Something went wrong, no url. " + body);<br />
}<br />
else if (method == "GET")<br />
{<br />
string rsp = "Hello from object "+llGetObjectName()+"!\n"<br />
+" owner: "+llKey2Name(llGetOwner())+"\n"<br />
+" key: "+(string)llGetKey()+"\n"<br />
+" touch count since reset: "+(string)touch_count;<br />
<br />
llHTTPResponse(id,200,rsp);<br />
}<br />
else<br />
{<br />
llHTTPResponse(id,405,"Unsupported Method");<br />
}<br />
}<br />
<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id = map_req_id)<br />
{<br />
llOwnerSay("Apez URLmap service said:"+body+" (status "+(string)status+")");<br />
<br />
if ((status >= 200) && (status < 300)) { // success<br />
llOwnerSay("You can now access this object via the URL http://"+aliasurl+" (try it in your browser!)");<br />
alias_last_updated = llGetUnixTime();<br />
}<br />
}<br />
}<br />
<br />
changed(integer c)<br />
{<br />
if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )<br />
{<br />
setup();<br />
}<br />
}<br />
<br />
timer()<br />
{<br />
if (llGetUnixTime() - alias_last_updated > expiry_secs)<br />
setAlias(alias, url);<br />
}<br />
<br />
touch(integer num_detected)<br />
{<br />
touch_count++;<br />
}<br />
<br />
}<br />
</lsl></div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=LlKey2Name&diff=340782LlKey2Name2009-04-30T15:15:28Z<p>Cenji Neutra: Added reference to bugs causing incorrect results to alert developers</p>
<hr />
<div>{{LSL_Function/object|id|prim or avatar|sim=*}}{{LSL_Function<br />
|func_id=210|func_sleep=0.0|func_energy=10.0<br />
|sort=Key2Name|func=llKey2Name<br />
|return_type=string|p1_type=key|p1_name=id<br />
|func_footnote='''id''' must specify a valid rezzed prim or avatar key, present in or otherwise known to the sim in which the script is running, otherwise an empty string is returned. In the case of an avatar, this function will still return a valid name if the avatar is a child agent of the sim (i.e., in an adjacent sim, but presently able to see into the one the script is in), or for a short period after the avatar leaves the sim (specifically, when the client completely disconnects from the sim, either as a main or child agent).<br /><br /><br />
Keys of inventory items will not work; in the case of these, use [[llGetInventoryName]] instead.<br />
|func_desc<br />
|return_text=that is the name of the prim or avatar specified by '''id'''.<br />
|spec<br />
|caveats=* It is difficult to tell the difference between a prim that has a name that is an empty string and a prim that is not in the sim, or because an invalid key was specified.<br />
* To get around the "avatar must be present" limitation, you can use the [[llRequestAgentData]] function and the [[dataserver]] event to obtain the avatar's name from a key.<br />
* There is no opposite function ([[llName2Key]]) available. However, there are third-party websites which can be queried using the [[llHTTPRequest]] function and the [[http_response]] event.<br />
* Due to bugs ([http://jira.secondlife.com/browse/SVC-4170 SVC-4170] and [http://jira.secondlife.com/browse/SVC-3935 SVC-3935]) the function sometimes erroneously returns the string "(Loading...)" and sometimes the avatar name with two spaces between the first and last names.<br />
|constants<br />
|examples=<lsl>// Best viewed in Chat History (ctrl-h)<br />
default<br />
{<br />
collision_start(integer a)//Announce who collided<br />
{<br />
llSay(0, "llKey2Name: " + llKey2Name(llDetectedKey(0)) +<br />
"\nllDetectedName: " + llDetectedName(0));<br />
}<br />
touch_start(integer a)<br />
{<br />
llSay(0,"llKey2Name: " + llKey2Name(llDetectedKey(0)) +<br />
"\nllDetectedName: " + llDetectedName(0));<br />
}<br />
}</lsl><br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llGetObjectDetails]]}}<br />
{{LSL DefineRow||[[llRequestAgentData]]|Uses the [[dataserver]] to request avatar information}}<br />
|also_events<br />
|also_articles=<br />
{{LSL DefineRow||[[Prim Attribute Overloading]]}}<br />
|also_tests<br />
|notes='''Active Name2Key Databases:'''<br />
*http://w-hat.com/name2key<br />
*http://kdc.ethernia.net/sys/name2key.php<br />
*http://wiki.apez.biz/Development (web-service API functions getAvatarKey and getAvatarName)<br />
<br />
'''Dead Name2Key Databases:'''<br />
*<s>http://www.libsecondlife.org/protocol/index.php/Name2key</s><font color=red>(Appears to be gone as of Apr 2008, but search for name2key on that site for more information)</font><br />
*<s>http://www.ulrikasheim.org/tools/name2key.html</s><font color=red>(Appears to be gone as of Apr 2008)</font><br />
<br />
'''Name2Key Libraries:'''<br />
*[[Name2Key_in_LSL]]<br />
<br />
|cat1=Avatar<br />
|cat2=Prim<br />
|cat3=Key<br />
|cat4<br />
}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=LlKey2Name&diff=340772LlKey2Name2009-04-30T15:10:57Z<p>Cenji Neutra: Added Apez Corp web-service API link for key/name database</p>
<hr />
<div>{{LSL_Function/object|id|prim or avatar|sim=*}}{{LSL_Function<br />
|func_id=210|func_sleep=0.0|func_energy=10.0<br />
|sort=Key2Name|func=llKey2Name<br />
|return_type=string|p1_type=key|p1_name=id<br />
|func_footnote='''id''' must specify a valid rezzed prim or avatar key, present in or otherwise known to the sim in which the script is running, otherwise an empty string is returned. In the case of an avatar, this function will still return a valid name if the avatar is a child agent of the sim (i.e., in an adjacent sim, but presently able to see into the one the script is in), or for a short period after the avatar leaves the sim (specifically, when the client completely disconnects from the sim, either as a main or child agent).<br /><br /><br />
Keys of inventory items will not work; in the case of these, use [[llGetInventoryName]] instead.<br />
|func_desc<br />
|return_text=that is the name of the prim or avatar specified by '''id'''.<br />
|spec<br />
|caveats=* It is difficult to tell the difference between a prim that has a name that is an empty string and a prim that is not in the sim, or because an invalid key was specified.<br />
* To get around the "avatar must be present" limitation, you can use the [[llRequestAgentData]] function and the [[dataserver]] event to obtain the avatar's name from a key.<br />
* There is no opposite function ([[llName2Key]]) available. However, there are third-party websites which can be queried using the [[llHTTPRequest]] function and the [[http_response]] event.<br />
|constants<br />
|examples=<lsl>// Best viewed in Chat History (ctrl-h)<br />
default<br />
{<br />
collision_start(integer a)//Announce who collided<br />
{<br />
llSay(0, "llKey2Name: " + llKey2Name(llDetectedKey(0)) +<br />
"\nllDetectedName: " + llDetectedName(0));<br />
}<br />
touch_start(integer a)<br />
{<br />
llSay(0,"llKey2Name: " + llKey2Name(llDetectedKey(0)) +<br />
"\nllDetectedName: " + llDetectedName(0));<br />
}<br />
}</lsl><br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llGetObjectDetails]]}}<br />
{{LSL DefineRow||[[llRequestAgentData]]|Uses the [[dataserver]] to request avatar information}}<br />
|also_events<br />
|also_articles=<br />
{{LSL DefineRow||[[Prim Attribute Overloading]]}}<br />
|also_tests<br />
|notes='''Active Name2Key Databases:'''<br />
*http://w-hat.com/name2key<br />
*http://kdc.ethernia.net/sys/name2key.php<br />
*http://wiki.apez.biz/Development (web-service API functions getAvatarKey and getAvatarName)<br />
<br />
'''Dead Name2Key Databases:'''<br />
*<s>http://www.libsecondlife.org/protocol/index.php/Name2key</s><font color=red>(Appears to be gone as of Apr 2008, but search for name2key on that site for more information)</font><br />
*<s>http://www.ulrikasheim.org/tools/name2key.html</s><font color=red>(Appears to be gone as of Apr 2008)</font><br />
<br />
'''Name2Key Libraries:'''<br />
*[[Name2Key_in_LSL]]<br />
<br />
|cat1=Avatar<br />
|cat2=Prim<br />
|cat3=Key<br />
|cat4<br />
}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=LlGetObjectDesc&diff=100893LlGetObjectDesc2008-10-16T16:02:48Z<p>Cenji Neutra: </p>
<hr />
<div>{{LSL_Function<br />
|func_id=270|func_sleep=0.0|func_energy=10.0<br />
|func=llGetObjectDesc<br />
|return_type=string<br />
|func_footnote<br />
|func_desc<br />
|return_text=that is the description of the prim the script is attached to<br />
|spec<br />
|caveats=*The prim description is limited to 127 bytes, any string longer then that will be truncated. This truncation does not always happen when the attribute is set or read.<br />
*Note that when people have Hover Tips on All Objects selected in the viewer's View menu, they'll see the object description pop-up for any object under their mouse pointer. For that reason, it is good practice to only set human-friendly information in the description (e.g. keys and such).<br />
|constants<br />
|examples=<lsl>default<br />
{<br />
state_entry()<br />
{<br />
llSay(PUBLIC_CHANNEL, llGetObjectDesc() );<br />
}<br />
}</lsl><br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llSetObjectDesc]]|Sets the prim description.}}<br />
{{LSL DefineRow||[[llGetObjectName]]|Gets the prim name.}}<br />
{{LSL DefineRow||[[llSetObjectName]]|Sets the prim name.}}<br />
{{LSL DefineRow||[[llGetObjectDetails]]}}<br />
|also_events<br />
|also_articles=<br />
{{LSL DefineRow||[[Prim Attribute Overloading]]}}<br />
|notes<br />
|cat1=Prim<br />
|cat2=Object<br />
|cat3<br />
|cat4<br />
}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=How_to_use_vendors&diff=89710How to use vendors2008-09-05T05:35:32Z<p>Cenji Neutra: </p>
<hr />
<div>{{help<br />
|Avatar=<br />
|Object=*<br />
|Communication=<br />
|Community=<br />
|Viewer=<br />
|Wiki=<br />
|Land=<br />
|Misc=<br />
|Glossary=<br />
}}<br />
All vending machines look and work slightly differently, but most have a commonly understood set of behaviors. Typically they have arrow buttons to navigate forward and backward. The vending machine will usually indicate the price of the current object you are viewing. <br />
<br />
In most situations, you right click and Pay the vending machine the specified amount to buy the shown object. After doing so, the object will be dispensed to you, but you must be sure to click Accept to take the object into your inventory. If you do not Accept the object (i.e. accidentally hit Decline), the vending machine will not know. In that case, you'll need to use the vendor's 'redeliver' feature to ask for it again (if it has one) or you will have to contact the item's creator to receive the copy you just paid for.<br />
<br />
The item you purchased will be delivered to your inventory in one of two ways: a folder most likely named for the item you bought, or a box in your Object folder. Check both locations.<br />
<br />
Due to the prevalence of re-sale vendors, be sure you know who the item's creator is before contacting someone with product questions, as it is quite likely that neither the vendor creator nor the vendor owner will know anything about the items the vendor sells.<br />
<br />
<br />
For help with specific brands of vendors, refer to the vendor creator's documentation. Some are listed below for your convenience:<br />
<br />
* Apez.iVend - [http://wiki.apez.biz/help-iVend wiki.apez.biz/help-iVend]<br />
* hippoVEND - [http://www.hippo-technologies.co.uk www.hippo-technologies.co.uk]</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Advertising_in_Second_Life&diff=81006Advertising in Second Life2008-07-28T17:37:24Z<p>Cenji Neutra: </p>
<hr />
<div>Advertising in Second Life<br />
<br />
==Introduction==<br />
Linden Lab does not provide any advertising capabilities other than our Search listings in Second Life. In general, it's important to understand that Linden Lab views Second Life as a platform and focuses its efforts on development and improvements of the platform. We do not create content or services within Second Life. <br />
<br />
Here are some suggestions of ways to use Second Life as an advertising medium.<br />
<br />
==Second Life to drive blog coverage.==<br />
One way to advertise is by simply creating a presence in Second Life and publicizing it. Many Second Life Residents are active in blogs and other internet activities. Many companies have found their activities in Second Life generate significant mentions in web and blog postings. Images in Flickr and videos involving Second Life on YouTube are additional ways to activate buzz from Second Life. Examples are American Apparel [http://www.google.com/search?client=safari&rls=en&q=%22american+apparel%22+%22second+life%22&ie=UTF-8&oe=UTF-8 108K Google hits] and Addidas (87K impressions from their Second Life presence).<br />
<br />
==Presence in Second Life==<br />
Some companies have found success with an ongoing presence in Second Life and driving visitors though related or unrelated events - technical talks (Intel), or concerts, for example. The key, as with a web site, is to provide fresh content that gives Residents a reason to visit and interact with you. Others have created places with activities to engage residents (Vodaphone and Weather Channel). As with real world properties (whether web or physical), to be successful you'll need to promote your presence and activity to the Second Life community through group notices, event notices, articles and ads in Second Life related periodicals, or any other means appropriate.<br />
<br />
==Active advertising in Second Life==<br />
The most difficult, but probably the most rewarding in the long term, is to create an active presence in Second Life that drives the message or experience you are trying to promote for your product or brand. If it's a product, you can script ways for people to interact with the Second Life version of the product. For example, while avatars don't need to eat or drink, if your product was a soft drink, you could provide a script that had people laugh and dance around whenever they took a 'virtual' drink. You could also provide a hat with your logo which people could give to others, creating viral distribution of your brand. The hat could be scripted so giving it to someone opened a website or a Second Life notecard with more information about the product, or a coupon for a discount on the product. <br />
<br />
==Distributed Advertising in Second Life==<br />
There are many popular venues in Second Life, from malls to clubs. Many of them will put up posters or kiosks that can distribute information, links, objects, or provide teleports to the sponsoring location, for a small fee.<br />
<br />
==Advertising networks in Second Life==<br />
There are a number of businesses that have built distributed advertising systems in Second Life, so you can pay by location and time to have your ad displayed. Some of the systems are limited to images, while others enable some level of interaction with content (link to a website, teleport to a location, a notecard with additional information and links). You'll find some of them listed in the [http://secondlife.com/solution_providers/listings.php?category=ToolDeveloper Tools] section of the Solution Provider Directory on the [http://secondlifegrid.net Second Life Grid] website.<br />
<br />
==Person-to-person advertising==<br />
One company has been very successful in using avatars as a promotional vehicle. Their avatars engage people in conversation and offer links to websites, coupons, or other direct follow-up actions. Their per-lead cost has been comparable or lower than other media, and the quality of leads has been very high. [http://www.virtualworldsnews.com/2007/08/order-of-the-ph.html Imax] was successful with this approach.<br />
<br />
==Media in Second Life==<br />
Every parcel in Second Life can incorporate an audio and video stream. You can simply publish a streaming URL for audio or video and any land owner can add your URL to their land to enable the stream. You will need to provide them with a reason to do that - good content, or payment, as well as publicizing your stream so residents konw about it. In addition, there are radio and tv stations in Second Life which provide streaming broadcasts. These streams can incorporate advertising, as radio and tv do in real life. <br />
<br />
==Articles about advertising in Second Life==<br />
*[http://www.news2life.com/process/news.html?id=71 New E2L Program Guarantees Visitors to Your Business]<br />
*[http://secondthoughts.typepad.com/second_thoughts/2006/10/advertising_in_.html Advertising in Second Life]<br />
*[http://www.clickz.com/showPage.html?page=3503316 In 'Second Life,' a Virtual Ad Agency Arises]<br />
*While not exactly about advertising, this article has some ideas about advertising in Second Life:<br />
[http://secondthoughts.typepad.com/second_thoughts/2006/10/dos_and_donts_f.html Advertising Dos and Don'ts]<br />
<br />
==Advertising networks in Second Life==<br />
These are links to companies with ad networks in Second Life. Some of these are listed in the [http://secondlifegrid.net/solution_providers/listings.php?category=ToolDeveloper Tools directory] on the Second Life Grid website.<br />
*[http://www.vedrashko.com/advertising/2006/02/second-life-advertising-networks-and_14.html Second Life advertising networks listing]<br />
* [http://secondlife.com/community/classifieds.php Search in SLClassifieds under Services]<br />
* [http://www.sl-investors-bank.com/mainostaulu.php Mainostaulu Network]<br />
* [http://www.my-slads.com/ My SLAds]<br />
* [http://www.subscribeomatic.com/ Subscribeomatic]<br />
* [http://theslagency.com/second-life-advertising.html The SL Agency]<br />
* [http://www.slcontextads.co.uk/ SLContext Ads]<br />
* [http://www.slbiz2life.com/ Second Life Business Directory]<br />
* [http://www.apez.biz Apez.promote advertising service]<br />
<br />
==See also==<br />
*[[Second_Life_Radio_%26_TV | Second Life Radio & TV]]<br />
* [http://www.technorati.com/search/headcount?from=http://nwn.blogs.com&sub=searchlet A listing of resident traffic to commercial properties (Tateru's Mixed Reality Headcount]<br />
*[https://wiki.secondlife.com/wiki/Marketing_Your_Products_In_Second_Life Marketing your products in Second Life]<br />
<br />
[[Marketing]]<br />
[[Category: Marketing]]</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Talk:LSL_HTTP_server&diff=78744Talk:LSL HTTP server2008-07-16T15:17:30Z<p>Cenji Neutra: /* Landowner only usage? */</p>
<hr />
<div>{{Talk}}<br />
<br />
I believe one of the worst-case scenarios from XML-RPC today is the InnerLife / Mandala Web Temple architecture. Last I experimented (with an early format) we got stable results at 4 second intervals (this was back in mid-2006); We wanted faster (not enough for a proper biofeedback interface) so most dropped the project. Be aware that we wanted something that could be sustained for long intervals (3-4 hours straight, possibly with multiple avatars contributing toward 'merged' results). I'm not certain what the current request load is today, you can check with 'Carlos Tapioca' in-world as he is still actively perusing this. I'll also direct him here. [[User:Alan Kiesler|Alan Kiesler]] 22:42, 6 April 2008 (PDT)<br />
<br />
== URL_REQUEST_TIMEOUT ==<br />
I think there should be a URL_REQUEST_TIMEOUT method. That way the script has a chance to catch the event and send the user some meaningful information before the connection actually cut. A user could have two scripts, one that handles the HTTP serving while the other gathers data. If the data gathering sends the data as it receives it then the HTTP script can cache the data and when it receives all of it or the timeout is thrown it can send the data it has. If the script misses the window on the connection and the event was queued then it should be dequeued and not triggered. -- [[User:Strife Onizuka|Strife Onizuka]] 16:53, 16 May 2008 (PDT)<br />
<br />
- ''There are no plans for such an event. Requests will time out which will send a timed out error / status (504 Gateway Timeout) to the requester. Events are a scarce resource in LSL, also anything that lets you do 'one last thing' before a time out either creates a time out loophole or is already too late. If you find your requests are frequently timing out you will need to adjust your code to return smaller result sets more frequently. - [[User:Kelly Linden|Kelly Linden]] 10:55, 13 June 2008 (PDT)''<br />
<br />
== HTTP_STATUS_* ==<br />
<br />
Might be beneficial to have HTTP_STATUS_* code constants. -- [[User:Strife Onizuka|Strife Onizuka]] 20:34, 16 May 2008 (PDT)<br />
<br />
- ''Specifically which codes do you want defined this way? I'd like to keep the number of constants to a minimum, would _OK (200), _MISSING (404) and _ERROR (500) be enough? - [[User:Kelly Linden|Kelly Linden]] 10:47, 13 June 2008 (PDT)''<br />
<br />
: Those sound good. -- [[User:Strife Onizuka|Strife Onizuka]] 11:42, 13 June 2008 (PDT)<br />
: Should have one for that evil Linden error 499 (for use with the [[llHTTPRequest]] side of things). -- [[User:Strife Onizuka|Strife Onizuka]] 23:30, 16 June 2008 (PDT)<br />
<br />
== robots.txt ==<br />
Do we want google spidering the caps urls? -- [[User:Strife Onizuka|Strife Onizuka]] 20:34, 16 May 2008 (PDT)<br />
<br />
- ''This is a good point, and probably not. - [[User:Kelly Linden|Kelly Linden]] 10:56, 13 June 2008 (PDT)''<br />
<br />
== Payload Size Limits / Content ==<br />
<br />
Will the data payload size be similar to the current http_response limits? And will we be able to implement something like reverse http with it?<br />
<br />
Thanks,<br />
<br />
BlueWall <j><br />
<br />
- ''There will be payload size limits for PUT and POST, and a max lengh for x-untrusted-argument. And no, you will not be able to implement something like reverse http. There is no provision for 'upgrade' and requests time out rather quickly (<25 seconds) which will make any long poll mechanism difficult - [[User:Kelly Linden|Kelly Linden]] 15:10, 17 June 2008 (PDT)''<br />
<br />
== Content-Type ==<br />
<br />
What about the content-type and more importantly charset? Will it be utf-8? Are URLs in utf-8? Is it "text/plain; charset=utf-8" then? - [[User:Thomas Shikami|Thomas Shikami]] 20:31, 16 June 2008 (PDT)<br />
<br />
- ''Yes, responsees will be "text/plain; charset=utf-8". We will attempt to transcode the body of POST and PUT actions to UTF-8 before they hit the script. URLs will be url encoded - including the 'x-untrusted-argument' which will remain url encoded until (if) the scripter uses llUnescapeURL. - [[User:Kelly Linden|Kelly Linden]] 15:01, 17 June 2008 (PDT) ''<br />
<br />
I vote for a mechanism to set the response content-type arbitrarily (except the charset, where UTF-8 is fine). If worried about arbitrary response content-types, perhaps the initial implementation could limit the allowable content-types to the set ["text/plain","text/xml","application/json", ...]. Then a future implementation could expand the allowed types without changing the function API. <br />
<br />
Consequently, it would also be useful to be able to accept "text/xml", "application/json" and perhaps others. <br />
<br />
In order to discourage phishing, the implementation could automatically set the response content-type to text/plain if the user agent sent identifies any of the major web browsers (IE/Mozilla/Webkit..). - [[User:Cenji Neutra|Cenji Neutra]] 08:09, 16 July 2008 (PDT)<br />
<br />
== Landowner only usage? ==<br />
<br />
:* Not all requests for an url will succeed, the scripter is expected to handle the failure case.<br />
:* The number of available urls will be based on the amount of land owned in the region<br />
<br />
As the majority of my work is placed on land I don't own, does this mean I'm going to be in "last place" when it comes to getting URLs? And if it fails, am I then left to using XML-RPC and email again? Seems pointless to build this in if I still need to have the script set up the other systems, with their associated timers and failsafes. Also, what kind of limits are we talking about per sim? I'm thinking of a rental system I made with approx 40-50 rental units on a sim. Each one would need to be updated from the web - and http in would be perfect, but only if the limits make it feasible and reliable. ~~ {{User|Hippyjim Starbrook‎}} 15:37, 15 July 2008 (PDT)<br />
<br />
I would say that the vast majority of objects in SL that communicate with other objects and external services are owned by residents that either don't own land or are on parcels not owned by the object owner. In our case we have 100s-of-thousands of vendors, lease devices etc., deployed by our customers, usually on land they don't own.<br />
<br />
Would I be correct in assuming the number of available URLs for all the objects on a parcel is limited by the amount of land owned in the region by the parcel owners - independently of who owns the object that contains the script? (i.e. by allowing a scripted object on their land a land owner is giving implicit permission for use of URLs from their quota - shared between all the other objects on the owners land in that region). Correct? - [[User:Cenji Neutra|Cenji Neutra]] 08:17, 16 July 2008 (PDT)</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Talk:LSL_HTTP_server&diff=78741Talk:LSL HTTP server2008-07-16T15:09:02Z<p>Cenji Neutra: /* Content-Type */</p>
<hr />
<div>{{Talk}}<br />
<br />
I believe one of the worst-case scenarios from XML-RPC today is the InnerLife / Mandala Web Temple architecture. Last I experimented (with an early format) we got stable results at 4 second intervals (this was back in mid-2006); We wanted faster (not enough for a proper biofeedback interface) so most dropped the project. Be aware that we wanted something that could be sustained for long intervals (3-4 hours straight, possibly with multiple avatars contributing toward 'merged' results). I'm not certain what the current request load is today, you can check with 'Carlos Tapioca' in-world as he is still actively perusing this. I'll also direct him here. [[User:Alan Kiesler|Alan Kiesler]] 22:42, 6 April 2008 (PDT)<br />
<br />
== URL_REQUEST_TIMEOUT ==<br />
I think there should be a URL_REQUEST_TIMEOUT method. That way the script has a chance to catch the event and send the user some meaningful information before the connection actually cut. A user could have two scripts, one that handles the HTTP serving while the other gathers data. If the data gathering sends the data as it receives it then the HTTP script can cache the data and when it receives all of it or the timeout is thrown it can send the data it has. If the script misses the window on the connection and the event was queued then it should be dequeued and not triggered. -- [[User:Strife Onizuka|Strife Onizuka]] 16:53, 16 May 2008 (PDT)<br />
<br />
- ''There are no plans for such an event. Requests will time out which will send a timed out error / status (504 Gateway Timeout) to the requester. Events are a scarce resource in LSL, also anything that lets you do 'one last thing' before a time out either creates a time out loophole or is already too late. If you find your requests are frequently timing out you will need to adjust your code to return smaller result sets more frequently. - [[User:Kelly Linden|Kelly Linden]] 10:55, 13 June 2008 (PDT)''<br />
<br />
== HTTP_STATUS_* ==<br />
<br />
Might be beneficial to have HTTP_STATUS_* code constants. -- [[User:Strife Onizuka|Strife Onizuka]] 20:34, 16 May 2008 (PDT)<br />
<br />
- ''Specifically which codes do you want defined this way? I'd like to keep the number of constants to a minimum, would _OK (200), _MISSING (404) and _ERROR (500) be enough? - [[User:Kelly Linden|Kelly Linden]] 10:47, 13 June 2008 (PDT)''<br />
<br />
: Those sound good. -- [[User:Strife Onizuka|Strife Onizuka]] 11:42, 13 June 2008 (PDT)<br />
: Should have one for that evil Linden error 499 (for use with the [[llHTTPRequest]] side of things). -- [[User:Strife Onizuka|Strife Onizuka]] 23:30, 16 June 2008 (PDT)<br />
<br />
== robots.txt ==<br />
Do we want google spidering the caps urls? -- [[User:Strife Onizuka|Strife Onizuka]] 20:34, 16 May 2008 (PDT)<br />
<br />
- ''This is a good point, and probably not. - [[User:Kelly Linden|Kelly Linden]] 10:56, 13 June 2008 (PDT)''<br />
<br />
== Payload Size Limits / Content ==<br />
<br />
Will the data payload size be similar to the current http_response limits? And will we be able to implement something like reverse http with it?<br />
<br />
Thanks,<br />
<br />
BlueWall <j><br />
<br />
- ''There will be payload size limits for PUT and POST, and a max lengh for x-untrusted-argument. And no, you will not be able to implement something like reverse http. There is no provision for 'upgrade' and requests time out rather quickly (<25 seconds) which will make any long poll mechanism difficult - [[User:Kelly Linden|Kelly Linden]] 15:10, 17 June 2008 (PDT)''<br />
<br />
== Content-Type ==<br />
<br />
What about the content-type and more importantly charset? Will it be utf-8? Are URLs in utf-8? Is it "text/plain; charset=utf-8" then? - [[User:Thomas Shikami|Thomas Shikami]] 20:31, 16 June 2008 (PDT)<br />
<br />
- ''Yes, responsees will be "text/plain; charset=utf-8". We will attempt to transcode the body of POST and PUT actions to UTF-8 before they hit the script. URLs will be url encoded - including the 'x-untrusted-argument' which will remain url encoded until (if) the scripter uses llUnescapeURL. - [[User:Kelly Linden|Kelly Linden]] 15:01, 17 June 2008 (PDT) ''<br />
<br />
I vote for a mechanism to set the response content-type arbitrarily (except the charset, where UTF-8 is fine). If worried about arbitrary response content-types, perhaps the initial implementation could limit the allowable content-types to the set ["text/plain","text/xml","application/json", ...]. Then a future implementation could expand the allowed types without changing the function API. <br />
<br />
Consequently, it would also be useful to be able to accept "text/xml", "application/json" and perhaps others. <br />
<br />
In order to discourage phishing, the implementation could automatically set the response content-type to text/plain if the user agent sent identifies any of the major web browsers (IE/Mozilla/Webkit..). - [[User:Cenji Neutra|Cenji Neutra]] 08:09, 16 July 2008 (PDT)<br />
<br />
== Landowner only usage? ==<br />
<br />
:* Not all requests for an url will succeed, the scripter is expected to handle the failure case.<br />
:* The number of available urls will be based on the amount of land owned in the region<br />
<br />
As the majority of my work is placed on land I don't own, does this mean I'm going to be in "last place" when it comes to getting URLs? And if it fails, am I then left to using XML-RPC and email again? Seems pointless to build this in if I still need to have the script set up the other systems, with their associated timers and failsafes. Also, what kind of limits are we talking about per sim? I'm thinking of a rental system I made with approx 40-50 rental units on a sim. Each one would need to be updated from the web - and http in would be perfect, but only if the limits make it feasible and reliable. ~~ {{User|Hippyjim Starbrook‎}} 15:37, 15 July 2008 (PDT)</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=LlRequestSimulatorData&diff=76588LlRequestSimulatorData2008-07-06T16:47:39Z<p>Cenji Neutra: </p>
<hr />
<div>{{#vardefine:p_data_desc|DATA_* flag}}{{LSL_Function<br />
|func_id=293|func_sleep=1.0|func_energy=10.0<br />
|func=llRequestSimulatorData<br />
|return_type=key|p1_type=string|p1_name=simulator|p2_type=integer|p2_name=data<br />
|func_footnote<br />
|func_desc=Requests '''{{LSL Param|data}}''' about '''simulator'''. When '''{{LSL Param|data}}''' is available the {{LSLG|dataserver}} event will be raised.<br />
|return_text=that is the handle for a {{LSLG|dataserver}} event response.<br />
|spec<br />
|caveats=* As of July-2008 this function is broken for scripts in most sims (see [https://jira.secondlife.com/browse/SVC-2596]).<br />
|constants={{{!}} {{Prettytable}}<br />
{{!}}- {{Hl2}}<br />
! colspan="2" {{!}} {{LSL Param|data}} Constant<br />
! Type<br />
! colspan="4" {{!}} Description<br />
{{!}}-<br />
{{LSL_Constants/llRequestedSimulatorData}}<br />
{{!}}}<br />
|examples<br />
|helpers<br />
|also_functions=<br />
{{LSL DefineRow||[[llGetParcelDetails]]|}}<br />
{{LSL DefineRow||[[llGetParcelFlags]]|}}<br />
{{LSL DefineRow||[[llGetParcelMaxPrims]]|}}<br />
{{LSL DefineRow||[[llGetParcelPrimCount]]|}}<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=Dataserver<br />
|cat2=Region<br />
|cat3<br />
|cat4<br />
}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Community_Web_Service_APIs&diff=73532Community Web Service APIs2008-06-21T00:27:30Z<p>Cenji Neutra: </p>
<hr />
<div>Below are listed third-party web-services and data-feeds provided by communities and businesses related to Second Life.<br />
:Note: These services are not affiliated with Linden Labs in any way.<br />
<br />
Service providers should add their own entries with a brief description and link to further information.<br />
<br />
<br />
* '''Apez Affiliate Services API''' - [http://wiki.apez.biz/Development wiki.apez.biz/Development] - interface to [http://www.apez.biz Apez Corp] services, such as banking, group management, key lookup, vending, leasing and others.<br />
* '''W-Hat projects''' - [http://w-hat.com w-hat.com] - An SL group/community that also provides avatar key lookup ([http://w-hat.com/name2key name2key]), persistent database store ([http://w-hat.com/httpdb httpdb]) services.</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Community_Web_Service_APIs&diff=73531Community Web Service APIs2008-06-21T00:22:27Z<p>Cenji Neutra: New page: Below are listed third-party web-services and data-feeds provided by communities and businesses related to Second Life. :Note: These services are not affiliated with Linden Labs in any way...</p>
<hr />
<div>Below are listed third-party web-services and data-feeds provided by communities and businesses related to Second Life.<br />
:Note: These services are not affiliated with Linden Labs in any way.<br />
<br />
Service providers should add their own entries with a brief description and link to further information.<br />
<br />
* '''Apez Affiliate Services API''' - [http://wiki.apez.biz/Development wiki.apez.biz/Development] - interface to [http://www.apez.biz Apez Corp] services, such as banking, group management, vending, leasing and others.<br />
* '''W-Hat name2key''' - [http://w-hat.com/name2key w-hat.com/name2key] - REST-style service for SL avatar key lookup from name.</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=APIs_and_Web_Services_Portal&diff=73530APIs and Web Services Portal2008-06-21T00:12:39Z<p>Cenji Neutra: </p>
<hr />
<div>__NOTOC__<br />
<br />
{| width="100%"<br />
|-<br />
|valign="top" colspan="2"|<br />
<div id="box"><br />
== Getting started ==<br />
<div style="padding: 0.5em"><br />
Welcome to the brand new Web Services portal. You'll find information on web services related to Second Life here.<br />
</div><br />
</div><br />
{{:Web Services Portal/navigation|style=style="float:right;"}}<br />
|-<br />
|valign="top" width="50%"|<br />
<div id="box"><br />
== [[RegAPI]] ==<br />
<div style="padding: 0.5em"><br />
Documentation about the Registration API. The Registration API lets you register Second Life residents from your web page. You can also contribute to the documentation and add your tips for successful implementation.<br />
<br />
</div><br />
</div><br />
|valign="top" width="50%"|<br />
<div id="box"><br />
== [[MapAPI|Webmap API]] ==<br />
<div style="padding: 0.5em"><br />
Documentation about the Webmap API. The Second Life Webmap API allows you to embed Second Life Maps onto your web pages<br />
</div><br />
</div><br />
|-<br />
<br />
|valign="top" width="50%"|<br />
<div id="box"><br />
== [[Live Data Feeds]] ==<br />
<div style="padding: 0.5em"><br />
Live data feeds provided by Linden Lab.<br />
</div><br />
</div><br />
|}<br />
<br />
<br />
----<br />
See also:<br />
<br />
{| width="100%"<br />
|-<br />
|valign="top" width="50%"|<br />
<div id="box"><br />
== [[Community Web Service APIs|Third-party / Community Web Services]] ==<br />
<div style="padding: 0.5em"><br />
Web services and other APIs provided by third-parties related to Second Life but not affiliated with Linden Labs.<br />
</div><br />
</div><br />
|<br />
|}<br />
[[Category:Portals]]</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Talk:External_services&diff=73529Talk:External services2008-06-20T23:52:45Z<p>Cenji Neutra: New page: Perhaps these should be organized alphabetically? Either by kind of service or by business/site name? If by service, what about mutli-service sites (multiple listings or..)? - ~~~</p>
<hr />
<div>Perhaps these should be organized alphabetically? Either by kind of service or by business/site name? If by service, what about mutli-service sites (multiple listings or..)? - [[User:Cenji Neutra|Cenji Neutra]]</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=External_services&diff=73528External services2008-06-20T23:51:04Z<p>Cenji Neutra: </p>
<hr />
<div>These are Second Life-related external services.<br />
Please provide a description for the service.<br />
<br />
* Advertising, update groups alternative http://www.subscribeomatic.com/<br />
* Banking, Vending, Leasing, Promotion & more - http://www.apez.biz<br />
* Tagging http://www.sloog.org/<br />
* Private Social Networking http://www.efaiconica.com<br />
* Social Bookmarking http://www.gridmarker.com/<br />
* Product Search Engine http://www.second411.com/<br />
* Article voting http://sligg.com/<br />
* Location voting http://www.yosims.com/<br />
* Use Statistics http://slstats.com/site/how/<br />
* Postcards http://www.sluniverse.com/pics/<br />
* Blogging from SL http://bloghud.com/<br />
* Popular Places http://www.slpopularplaces.com/index.php?rating=pg<br />
* Top Sites (traffic) http://www.sltopsites.com/<br />
* Profiles http://www.slprofiles.com/<br />
* Geosearch/map markers (Use Firefox) http://www.mapinmap.com/ <br />
* Moodle mashup for education in SL http://www.sloodle.com/<br />
* Rating http://slateit.org/<br />
* SL Tweets HUD (twitter, tagging, search and more): http://www.slexchange.com/modules.php?name=Marketplace&file=item&ItemID=214648<br />
* Second Life Twitter client http://ordinalmalaprop.com/twitter/<br />
* Social network tool http://www.squawknest.com/<br />
* Tracking people & status http://sl-messenger.com/<br />
* Sites, Status & more http://islab.org<br />
<br />
<br />
Back to [[Marketing]]<br />
[[Category:Marketing]]</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Talk:Grid_Identifiers_Spec&diff=71105Talk:Grid Identifiers Spec2008-06-11T03:11:50Z<p>Cenji Neutra: </p>
<hr />
<div>Open Grid Identifier Notation discussion page.<br />
<br />
(please end each comment with <nowiki>~~~~</nowiki>, which will be substituted with your name and the date-time)<br />
<br />
<br />
Based on feedback received thus far from various parties, including comments on sldev, for the 2nd draft we're considering switching the notation to a URN scheme. We may even expand the scope of the proposal to include lookup of a resolver service.<br />
Although beyond the scope of the spec, more thought may be given to how a resolver service might be implemented. One possibility would be the use of DNS with NAPTR and SRV records, or something similar to [http://tools.ietf.org/html/rfc3401 DDDS]. See [http://tools.ietf.org/html/rfc2915 RFC2915] - [[User:Cenji Neutra|Cenji Neutra]] 19:29, 10 June 2008 (PDT)</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Grid_Identifiers_Spec&diff=71104Grid Identifiers Spec2008-06-11T03:11:15Z<p>Cenji Neutra: /* Open Grid Identifier Notation */</p>
<hr />
<div>= Open Grid Identifier Notation =<br />
<br />
<!--span style="font-size: 200%;">Second Life Grid Open Grid Protocol</span--><br />
:<small>'''Draft 1'''</small><br />
:<small>'''June 2008'''</small><br />
::''Notice: This draft is for public comment. ''<br />
<br />
::<small>David Jung (Cenji Neutra) [http://www.apez.biz Apez Corp] cenji.neutra AT gmail.com</small><br />
::<small>Copyright 2008, Apez Corp. All rights reserved. </small><br />
<br />
::<small>This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 license. See http://creativecommons.org/licenses/by-sa/3.0/ for details. </small><br />
<br />
:<small>'''Abstract'''</small><br />
::<small>The explosion in the number of virtual worlds, particularly those based on the [http://opensimulator.org OpenSimulator] effort inspired by [http://secondlife.com Second Life&reg;], has given rise to the need for a universal and widely adopted notation for identifying distinct virtual worlds and their components. This document details such a scheme.</small><br />
<br />
:<small>'''Status'''</small><br />
::<small>As of June 2008, this document is a work in progress. Community input is solicited in order to mold this scheme into one that many parties agree to adopt and support.</small><br />
::<small>This proposal is a 3rd-party community effort and it's presence on the Second Life wiki in no way implies the endorsement or participation of Linden Labs or its employees in any official capacity.</small><br />
::<small>Please use the [[Talk:Grid_Identifiers_Spec|Discussion]] page for comments.</small><br />
UPDATE: Please see the [[Talk:Grid_Identifiers_Spec|Discussion]] '''first'''.<br />
{{RightToc}}<br />
<br />
== Motivation ==<br />
<br />
To illustrate the need for a standardized notation for identifying virtual worlds and their major components, we look to analogy with the early development of the Internet itself. In the early days of the Internet, each host had a ''host file'', which was simple a text file that contained a list of the known Internet connected hosts, their IP addresses and host names. The hosts file was centrally maintained, manually updated and distributed to all Internet hosts. It served two distinct purposes:<br />
* It provided a way to map human readable ''host names'' to IP addresses<br />
* It served as a place where people could look to see what hosts existed on the early Internet<br />
<br />
As the number of hosts on the Internet grew, it became apparent that a centralized mechanism would not be adequate as the Internet grew. From that realization grew the Domain Name System (DNS) and ''search engine'' services. The DNS serves as a distributed implementation of a look-up service and search engines provide a way for people to discover what is available on the Internet (or Web).<br />
<br />
Currently, there likely only a hundred or so long-lived persistent virtual worlds of significant size operating. If virtual worlds are to become a significant piece of the future of the Internet, we would expect their numbers to grow significantly, as has happened with the early Internet.<br />
<br />
What this document details is a simple notation to identify major components of virtual worlds, analogous to the way host names identify web-sites on the modern World Wide Web. For example, "'''net.mygrid.main'''" represents a valid ''grid identifier''.<br />
<br />
How those names are used, the services that may exist to map identifiers to hosts or other resources related to the identified virtual world components and how the mappings are managed, is beyond the scope of this document.<br />
<br />
It should be noted, however, that one practical motivation for the development of this notation was a need for it during the development of a lookup service that, among other things, will provide a (centralized) service for mapping identifiers of known virtual worlds to their corresponding resources. For example, mapping SecondLife and OpenSimulator based grid identifiers to their corresponding initial login URL.<br />
<br />
== Grid Identifiers ==<br />
<br />
=== Identifier Notation ===<br />
<br />
The identifier notation comprises a simple string of period separated labels, like the subdomains of DNS domain names. Each label should conform to the standards set forth for domain names (see RFC-1034). For example (and informally):<br />
* Labels are comprised of ASCII characters A-Z, a-z, 0-9 and the dash "-" character<br />
* Labels are compared case-insensitive<br />
* Internationalization of labels should be handled by applications according to Internationalizing Domain Names in Applications (IDNA; see RFC-3490)<br />
* The complete sequence of 'dotted' labels is referred to as a Grid Identifier or GI.<br />
** While the identifiers are intended to be used to identify other major components of virtual worlds for which the term 'grid' doesn't necessary technically apply, the terminology was chosen to closely match popular usage of the underlying lay concept being captured in order to facilitate dissemination of the idea.<br />
<br />
<br />
=== The identifier space ===<br />
<br />
* The ''root'' of a GI is the left-most label (before the first period).<br />
** Like DNS domain names, OGI identifiers are intended to form a hierarchical system. Whereas the ''root'' or ''terminal'' label for a DNS domain name is at the right of the domain, the left-most GI label is the 'root' in order to avoid confusion with domain names.<br />
<br />
* The only allowable root labels are the top-level DNS subdomains (TLDs), such as "com", "net", "org", "biz" etc.<br />
** These could potentially be expanded or even diverge from the set of TLDs in the future, but it isn't envisioned to be necessary in the medium term.<br />
<br />
==== Identifier types ====<br />
<br />
* Grid identifiers are divided into types "grid", "region" and "agent". <br />
** GIs of all types occupy a single name space (an identifier must be unique regardless of type)<br />
** The number of types can be expanded as necessary<br />
<br />
* A "region" type GI must have the letter "r" as the last character in the right-most label<br />
** Region type identifiers are used to identify that part of a virtual world responsible for simulation of the virtual environment<br />
** In SLGOGP terminology this is known as the "region domain".<br />
** While not mandated, it is suggested that the right-most label end in "-r".<br />
<br />
* An "agent" type GI must have the letter "a" as the last character in the right-most label<br />
** Agent type identifiers are used to identify that part of a virtual world that encompasses the representation of agents and their associated resources (typically agents who act in the world on behalf of people)<br />
** In SLGOGP terminology this is known as the "agent domain".<br />
** While not mandated, it is suggested that the right-most label end in "-a".<br />
<br />
* A "grid" type GI cannot have the last letter of the right-most label end in "a" or "r" and cannot contain a dash "-"<br />
** Grid type identifiers are used to identify an independent virtual world as a whole. This would typically comprise both the simulation of the virtual environment and a default service for the representation and management of avatars.<br />
<br />
<br />
For example, valid OGIs are "com.secondlife.agni" (grid GI), "biz.apez.grid-a" (agent GI) and "org.osgrid.main-r" (region GI).<br />
<br />
== Expected practice ==<br />
<br />
This section does not form part of the OGI specification, but appears in order to inform implementers of the ways in which GIs are envisioned to be used.<br />
<br />
* Due to the obvious mapping between GIs and DNS domain names via reversal of the label ordering, it is expected that an ideal initial mechanism for assigning authority over GIs by any name mapping service providers would be to require control over the corresponding DNS domain insofar as there exist corresponding subdomains.<br />
** The requirements for domain control 'proof' could in turn piggy-back on the established 3rd-party identity certifiers, such as those established for issuing domain SSL certificates.<br />
<br />
* Except where a precedent already exists, region type GIs are expected to always end in "-r" and agent type GIs in "-a".<br />
<br />
* It will be common for a grid GI to have corresponding agent type and region type GIs that are identical except for a "-a" and "-r" suffix respectively. <br />
** For example, a reasonable guess as to the agent type GI for the grid "biz.apez.grid" (if one exists) would be "biz.apez.grid-a".<br />
<br />
* Typical uses for GIs might be:<br />
** Lookup of common resources associated with grid, such as the region GI, 'defacto' agent GI, web-site address, standard services provided etc<br />
** Lookup of common resources associated with agent GIs, such as the login URL for SLGOGP agent domains.<br />
** Machine 'readable' representation for configuration information<br />
*** Such as UI mappings between human readable grid names, such as "Second Life" and the associated GI to be used with lookup services, for presentation in user agent clients<br />
** Lookup and discovery of grid inter-component trust relationships, such as which other agent services a particular region service allows agents to login from<br />
*** For example, determining that org.osgrid.main-r allows login and inventory asset sharing between avatars from org.osgrid.main-a and com.secondlife.agnia<br />
<br />
== References ==<br />
<br />
* Second Life Grid Open Grid Protocol (SLGOGP) - http://wiki.secondlife.com/wiki/SLGOGP_Draft_1 (see also http://wiki.secondlife.com/wiki/AWG)<br />
* Domain Names - Concepts and Facilities - RFC-1034 - http://tools.ietf.org/html/rfc1034<br />
* Internationalizing Domain Names in Applications (IDNA) - RFC-3490 - http://tools.ietf.org/html/rfc3490</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Talk:Grid_Identifiers_Spec&diff=71103Talk:Grid Identifiers Spec2008-06-11T02:33:32Z<p>Cenji Neutra: </p>
<hr />
<div>Open Grid Identifier Notation discussion page.<br />
<br />
(please end each comment with <nowiki>~~~~</nowiki>, which will be substituted with your name and the date-time)<br />
<br />
<br />
Based on feedback received thus far from various parties, including comments on sldev, for the 2nd draft we're considering switching the notation to a URN scheme. We may even expand the scope of the proposal to include lookup of a resolver service.<br />
Although beyond the scope of the spec, more though may be given to how a resolver service might be implemented. One possibility would be the use of DNS with NAPTR and SRV records, or something similar to [http://tools.ietf.org/html/rfc3401 DDDS]. See [http://tools.ietf.org/html/rfc2915 RFC2915] - [[User:Cenji Neutra|Cenji Neutra]] 19:29, 10 June 2008 (PDT)</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Talk:Grid_Identifiers_Spec&diff=71102Talk:Grid Identifiers Spec2008-06-11T02:29:53Z<p>Cenji Neutra: </p>
<hr />
<div>Open Grid Identifier Notation discussion page.<br />
<br />
(please end each comment with <nowiki>~~~~</nowiki>, which will be substituted with your name and the date-time)<br />
<br />
<br />
Based on feedback received thus far from various parties, including comments on sldev, for the 2nd draft we're considering switching the notation to a URN scheme. We may even expand the scope of the proposal to include lookup of a resolver service.<br />
Although beyond the scope of the spec, more though may be given to how a resolver service might be implemented. One possibility would be the use of DNS with NAPTR and SRV records, or something similar to [http://tools.ietf.org/html/rfc2915 DDDS]. See [http://tools.ietf.org/html/rfc2915 RFC2915] - [[User:Cenji Neutra|Cenji Neutra]] 19:29, 10 June 2008 (PDT)</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Grid_Identifiers_Spec&diff=71021Grid Identifiers Spec2008-06-10T15:53:55Z<p>Cenji Neutra: /* Open Grid Identifier Notation */</p>
<hr />
<div>= Open Grid Identifier Notation =<br />
<br />
<!--span style="font-size: 200%;">Second Life Grid Open Grid Protocol</span--><br />
:<small>'''Draft 1'''</small><br />
:<small>'''June 2008'''</small><br />
::''Notice: This draft is for public comment. ''<br />
<br />
::<small>David Jung (Cenji Neutra) [http://www.apez.biz Apez Corp] cenji.neutra AT gmail.com</small><br />
::<small>Copyright 2008, Apez Corp. All rights reserved. </small><br />
<br />
::<small>This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 license. See http://creativecommons.org/licenses/by-sa/3.0/ for details. </small><br />
<br />
:<small>'''Abstract'''</small><br />
::<small>The explosion in the number of virtual worlds, particularly those based on the [http://opensimulator.org OpenSimulator] effort inspired by [http://secondlife.com Second Life&reg;], has given rise to the need for a universal and widely adopted notation for identifying distinct virtual worlds and their components. This document details such a scheme.</small><br />
<br />
:<small>'''Status'''</small><br />
::<small>As of June 2008, this document is a work in progress. Community input is solicited in order to mold this scheme into one that many parties agree to adopt and support.</small><br />
::<small>This proposal is a 3rd-party community effort and it's presence on the Second Life wiki in no way implies the endorsement or participation of Linden Labs or its employees in any official capacity.</small><br />
::<small>Please use the [[Talk:Grid_Identifiers_Spec|Discussion]] page for comments.</small><br />
{{RightToc}}<br />
<br />
== Motivation ==<br />
<br />
To illustrate the need for a standardized notation for identifying virtual worlds and their major components, we look to analogy with the early development of the Internet itself. In the early days of the Internet, each host had a ''host file'', which was simple a text file that contained a list of the known Internet connected hosts, their IP addresses and host names. The hosts file was centrally maintained, manually updated and distributed to all Internet hosts. It served two distinct purposes:<br />
* It provided a way to map human readable ''host names'' to IP addresses<br />
* It served as a place where people could look to see what hosts existed on the early Internet<br />
<br />
As the number of hosts on the Internet grew, it became apparent that a centralized mechanism would not be adequate as the Internet grew. From that realization grew the Domain Name System (DNS) and ''search engine'' services. The DNS serves as a distributed implementation of a look-up service and search engines provide a way for people to discover what is available on the Internet (or Web).<br />
<br />
Currently, there likely only a hundred or so long-lived persistent virtual worlds of significant size operating. If virtual worlds are to become a significant piece of the future of the Internet, we would expect their numbers to grow significantly, as has happened with the early Internet.<br />
<br />
What this document details is a simple notation to identify major components of virtual worlds, analogous to the way host names identify web-sites on the modern World Wide Web. For example, "'''net.mygrid.main'''" represents a valid ''grid identifier''.<br />
<br />
How those names are used, the services that may exist to map identifiers to hosts or other resources related to the identified virtual world components and how the mappings are managed, is beyond the scope of this document.<br />
<br />
It should be noted, however, that one practical motivation for the development of this notation was a need for it during the development of a lookup service that, among other things, will provide a (centralized) service for mapping identifiers of known virtual worlds to their corresponding resources. For example, mapping SecondLife and OpenSimulator based grid identifiers to their corresponding initial login URL.<br />
<br />
== Grid Identifiers ==<br />
<br />
=== Identifier Notation ===<br />
<br />
The identifier notation comprises a simple string of period separated labels, like the subdomains of DNS domain names. Each label should conform to the standards set forth for domain names (see RFC-1034). For example (and informally):<br />
* Labels are comprised of ASCII characters A-Z, a-z, 0-9 and the dash "-" character<br />
* Labels are compared case-insensitive<br />
* Internationalization of labels should be handled by applications according to Internationalizing Domain Names in Applications (IDNA; see RFC-3490)<br />
* The complete sequence of 'dotted' labels is referred to as a Grid Identifier or GI.<br />
** While the identifiers are intended to be used to identify other major components of virtual worlds for which the term 'grid' doesn't necessary technically apply, the terminology was chosen to closely match popular usage of the underlying lay concept being captured in order to facilitate dissemination of the idea.<br />
<br />
<br />
=== The identifier space ===<br />
<br />
* The ''root'' of a GI is the left-most label (before the first period).<br />
** Like DNS domain names, OGI identifiers are intended to form a hierarchical system. Whereas the ''root'' or ''terminal'' label for a DNS domain name is at the right of the domain, the left-most GI label is the 'root' in order to avoid confusion with domain names.<br />
<br />
* The only allowable root labels are the top-level DNS subdomains (TLDs), such as "com", "net", "org", "biz" etc.<br />
** These could potentially be expanded or even diverge from the set of TLDs in the future, but it isn't envisioned to be necessary in the medium term.<br />
<br />
==== Identifier types ====<br />
<br />
* Grid identifiers are divided into types "grid", "region" and "agent". <br />
** GIs of all types occupy a single name space (an identifier must be unique regardless of type)<br />
** The number of types can be expanded as necessary<br />
<br />
* A "region" type GI must have the letter "r" as the last character in the right-most label<br />
** Region type identifiers are used to identify that part of a virtual world responsible for simulation of the virtual environment<br />
** In SLGOGP terminology this is known as the "region domain".<br />
** While not mandated, it is suggested that the right-most label end in "-r".<br />
<br />
* An "agent" type GI must have the letter "a" as the last character in the right-most label<br />
** Agent type identifiers are used to identify that part of a virtual world that encompasses the representation of agents and their associated resources (typically agents who act in the world on behalf of people)<br />
** In SLGOGP terminology this is known as the "agent domain".<br />
** While not mandated, it is suggested that the right-most label end in "-a".<br />
<br />
* A "grid" type GI cannot have the last letter of the right-most label end in "a" or "r" and cannot contain a dash "-"<br />
** Grid type identifiers are used to identify an independent virtual world as a whole. This would typically comprise both the simulation of the virtual environment and a default service for the representation and management of avatars.<br />
<br />
<br />
For example, valid OGIs are "com.secondlife.agni" (grid GI), "biz.apez.grid-a" (agent GI) and "org.osgrid.main-r" (region GI).<br />
<br />
== Expected practice ==<br />
<br />
This section does not form part of the OGI specification, but appears in order to inform implementers of the ways in which GIs are envisioned to be used.<br />
<br />
* Due to the obvious mapping between GIs and DNS domain names via reversal of the label ordering, it is expected that an ideal initial mechanism for assigning authority over GIs by any name mapping service providers would be to require control over the corresponding DNS domain insofar as there exist corresponding subdomains.<br />
** The requirements for domain control 'proof' could in turn piggy-back on the established 3rd-party identity certifiers, such as those established for issuing domain SSL certificates.<br />
<br />
* Except where a precedent already exists, region type GIs are expected to always end in "-r" and agent type GIs in "-a".<br />
<br />
* It will be common for a grid GI to have corresponding agent type and region type GIs that are identical except for a "-a" and "-r" suffix respectively. <br />
** For example, a reasonable guess as to the agent type GI for the grid "biz.apez.grid" (if one exists) would be "biz.apez.grid-a".<br />
<br />
* Typical uses for GIs might be:<br />
** Lookup of common resources associated with grid, such as the region GI, 'defacto' agent GI, web-site address, standard services provided etc<br />
** Lookup of common resources associated with agent GIs, such as the login URL for SLGOGP agent domains.<br />
** Machine 'readable' representation for configuration information<br />
*** Such as UI mappings between human readable grid names, such as "Second Life" and the associated GI to be used with lookup services, for presentation in user agent clients<br />
** Lookup and discovery of grid inter-component trust relationships, such as which other agent services a particular region service allows agents to login from<br />
*** For example, determining that org.osgrid.main-r allows login and inventory asset sharing between avatars from org.osgrid.main-a and com.secondlife.agnia<br />
<br />
== References ==<br />
<br />
* Second Life Grid Open Grid Protocol (SLGOGP) - http://wiki.secondlife.com/wiki/SLGOGP_Draft_1 (see also http://wiki.secondlife.com/wiki/AWG)<br />
* Domain Names - Concepts and Facilities - RFC-1034 - http://tools.ietf.org/html/rfc1034<br />
* Internationalizing Domain Names in Applications (IDNA) - RFC-3490 - http://tools.ietf.org/html/rfc3490</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Talk:Grid_Identifiers_Spec&diff=71020Talk:Grid Identifiers Spec2008-06-10T15:52:41Z<p>Cenji Neutra: New page: Open Grid Identifier Notation discussion page. (please end each comment with <nowiki>~~~~</nowiki>, which will be substituted with your name and the date-time)</p>
<hr />
<div>Open Grid Identifier Notation discussion page.<br />
<br />
(please end each comment with <nowiki>~~~~</nowiki>, which will be substituted with your name and the date-time)</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Grid_Identifiers_Spec&diff=71019Grid Identifiers Spec2008-06-10T15:51:04Z<p>Cenji Neutra: /* Open Grid Identifier Notation */</p>
<hr />
<div>= Open Grid Identifier Notation =<br />
<br />
<!--span style="font-size: 200%;">Second Life Grid Open Grid Protocol</span--><br />
:<small>'''Draft 1'''</small><br />
:<small>'''June 2008'''</small><br />
::''Notice: This draft is for public comment. ''<br />
<br />
::<small>David Jung (Cenji Neutra) [http://www.apez.biz Apez Corp] cenji.neutra AT gmail.com</small><br />
::<small>Copyright 2008, Apez Corp. All rights reserved. </small><br />
<br />
::<small>This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 license. See http://creativecommons.org/licenses/by-sa/3.0/ for details. </small><br />
<br />
:<small>'''Abstract'''</small><br />
::<small>The explosion in the number of virtual worlds, particularly those based on the [http://opensimulator.org OpenSimulator] effort inspired by [http://secondlife.com Second Life&reg;], has given rise to the need for a universal and widely adopted notation for identifying distinct virtual worlds and their components. This document details such a scheme.</small><br />
<br />
:<small>'''Status'''</small><br />
::<small>As of June 2008, this document is a work in progress. Community input is solicited in order to mold this scheme into one that many parties agree to adopt and support.</small><br />
::<small>This proposal is a 3rd-party community effort and it's presence on the Second Life wiki in no way implies the endorsement or participation of Linden Labs or its employees in any official capacity.</small><br />
{{RightToc}}<br />
<br />
== Motivation ==<br />
<br />
To illustrate the need for a standardized notation for identifying virtual worlds and their major components, we look to analogy with the early development of the Internet itself. In the early days of the Internet, each host had a ''host file'', which was simple a text file that contained a list of the known Internet connected hosts, their IP addresses and host names. The hosts file was centrally maintained, manually updated and distributed to all Internet hosts. It served two distinct purposes:<br />
* It provided a way to map human readable ''host names'' to IP addresses<br />
* It served as a place where people could look to see what hosts existed on the early Internet<br />
<br />
As the number of hosts on the Internet grew, it became apparent that a centralized mechanism would not be adequate as the Internet grew. From that realization grew the Domain Name System (DNS) and ''search engine'' services. The DNS serves as a distributed implementation of a look-up service and search engines provide a way for people to discover what is available on the Internet (or Web).<br />
<br />
Currently, there likely only a hundred or so long-lived persistent virtual worlds of significant size operating. If virtual worlds are to become a significant piece of the future of the Internet, we would expect their numbers to grow significantly, as has happened with the early Internet.<br />
<br />
What this document details is a simple notation to identify major components of virtual worlds, analogous to the way host names identify web-sites on the modern World Wide Web. For example, "'''net.mygrid.main'''" represents a valid ''grid identifier''.<br />
<br />
How those names are used, the services that may exist to map identifiers to hosts or other resources related to the identified virtual world components and how the mappings are managed, is beyond the scope of this document.<br />
<br />
It should be noted, however, that one practical motivation for the development of this notation was a need for it during the development of a lookup service that, among other things, will provide a (centralized) service for mapping identifiers of known virtual worlds to their corresponding resources. For example, mapping SecondLife and OpenSimulator based grid identifiers to their corresponding initial login URL.<br />
<br />
== Grid Identifiers ==<br />
<br />
=== Identifier Notation ===<br />
<br />
The identifier notation comprises a simple string of period separated labels, like the subdomains of DNS domain names. Each label should conform to the standards set forth for domain names (see RFC-1034). For example (and informally):<br />
* Labels are comprised of ASCII characters A-Z, a-z, 0-9 and the dash "-" character<br />
* Labels are compared case-insensitive<br />
* Internationalization of labels should be handled by applications according to Internationalizing Domain Names in Applications (IDNA; see RFC-3490)<br />
* The complete sequence of 'dotted' labels is referred to as a Grid Identifier or GI.<br />
** While the identifiers are intended to be used to identify other major components of virtual worlds for which the term 'grid' doesn't necessary technically apply, the terminology was chosen to closely match popular usage of the underlying lay concept being captured in order to facilitate dissemination of the idea.<br />
<br />
<br />
=== The identifier space ===<br />
<br />
* The ''root'' of a GI is the left-most label (before the first period).<br />
** Like DNS domain names, OGI identifiers are intended to form a hierarchical system. Whereas the ''root'' or ''terminal'' label for a DNS domain name is at the right of the domain, the left-most GI label is the 'root' in order to avoid confusion with domain names.<br />
<br />
* The only allowable root labels are the top-level DNS subdomains (TLDs), such as "com", "net", "org", "biz" etc.<br />
** These could potentially be expanded or even diverge from the set of TLDs in the future, but it isn't envisioned to be necessary in the medium term.<br />
<br />
==== Identifier types ====<br />
<br />
* Grid identifiers are divided into types "grid", "region" and "agent". <br />
** GIs of all types occupy a single name space (an identifier must be unique regardless of type)<br />
** The number of types can be expanded as necessary<br />
<br />
* A "region" type GI must have the letter "r" as the last character in the right-most label<br />
** Region type identifiers are used to identify that part of a virtual world responsible for simulation of the virtual environment<br />
** In SLGOGP terminology this is known as the "region domain".<br />
** While not mandated, it is suggested that the right-most label end in "-r".<br />
<br />
* An "agent" type GI must have the letter "a" as the last character in the right-most label<br />
** Agent type identifiers are used to identify that part of a virtual world that encompasses the representation of agents and their associated resources (typically agents who act in the world on behalf of people)<br />
** In SLGOGP terminology this is known as the "agent domain".<br />
** While not mandated, it is suggested that the right-most label end in "-a".<br />
<br />
* A "grid" type GI cannot have the last letter of the right-most label end in "a" or "r" and cannot contain a dash "-"<br />
** Grid type identifiers are used to identify an independent virtual world as a whole. This would typically comprise both the simulation of the virtual environment and a default service for the representation and management of avatars.<br />
<br />
<br />
For example, valid OGIs are "com.secondlife.agni" (grid GI), "biz.apez.grid-a" (agent GI) and "org.osgrid.main-r" (region GI).<br />
<br />
== Expected practice ==<br />
<br />
This section does not form part of the OGI specification, but appears in order to inform implementers of the ways in which GIs are envisioned to be used.<br />
<br />
* Due to the obvious mapping between GIs and DNS domain names via reversal of the label ordering, it is expected that an ideal initial mechanism for assigning authority over GIs by any name mapping service providers would be to require control over the corresponding DNS domain insofar as there exist corresponding subdomains.<br />
** The requirements for domain control 'proof' could in turn piggy-back on the established 3rd-party identity certifiers, such as those established for issuing domain SSL certificates.<br />
<br />
* Except where a precedent already exists, region type GIs are expected to always end in "-r" and agent type GIs in "-a".<br />
<br />
* It will be common for a grid GI to have corresponding agent type and region type GIs that are identical except for a "-a" and "-r" suffix respectively. <br />
** For example, a reasonable guess as to the agent type GI for the grid "biz.apez.grid" (if one exists) would be "biz.apez.grid-a".<br />
<br />
* Typical uses for GIs might be:<br />
** Lookup of common resources associated with grid, such as the region GI, 'defacto' agent GI, web-site address, standard services provided etc<br />
** Lookup of common resources associated with agent GIs, such as the login URL for SLGOGP agent domains.<br />
** Machine 'readable' representation for configuration information<br />
*** Such as UI mappings between human readable grid names, such as "Second Life" and the associated GI to be used with lookup services, for presentation in user agent clients<br />
** Lookup and discovery of grid inter-component trust relationships, such as which other agent services a particular region service allows agents to login from<br />
*** For example, determining that org.osgrid.main-r allows login and inventory asset sharing between avatars from org.osgrid.main-a and com.secondlife.agnia<br />
<br />
== References ==<br />
<br />
* Second Life Grid Open Grid Protocol (SLGOGP) - http://wiki.secondlife.com/wiki/SLGOGP_Draft_1 (see also http://wiki.secondlife.com/wiki/AWG)<br />
* Domain Names - Concepts and Facilities - RFC-1034 - http://tools.ietf.org/html/rfc1034<br />
* Internationalizing Domain Names in Applications (IDNA) - RFC-3490 - http://tools.ietf.org/html/rfc3490</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Grid_Identifiers_Spec&diff=71018Grid Identifiers Spec2008-06-10T15:50:47Z<p>Cenji Neutra: /* Open Grid Identifier Notation */</p>
<hr />
<div>= Open Grid Identifier Notation =<br />
<br />
<!--span style="font-size: 200%;">Second Life Grid Open Grid Protocol</span--><br />
:<small>'''Draft 1'''</small><br />
:<small>'''June 2008'''</small><br />
::''Notice: This draft is for public comment. ''<br />
<br />
::<small>David Jung (Cenji Neutra) [http://www.apez.biz Apez Corp] cenji.neutra AT gmail.com</small><br />
::<small>Copyright 2008, Apez Corp. All rights reserved. </small><br />
<br />
::<small>This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 license. See http://creativecommons.org/licenses/by-sa/3.0/ for details. </small><br />
<br />
:<small>'''Abstract'''</small><br />
::<small>The explosion in the number of virtual worlds, particularly those based on the [http://opensimulator.org OpenSimulator] effort inspired by [http://secondlife.com Second Life&reg;], has given rise to the need for a universal and widely adopted notation for identifying distinct virtual worlds and their components. This document details such a scheme.</small><br />
<br />
:<small>'''Status'''</small><br />
::<small>As of June 2008, this document is a work in progress. Community input is solicited in order to mold this scheme into one that many parties agree to adopt and support.</small><br />
::<small>This proposal is a 3rd-party community effort and it's presence on the Second Life wiki in no way implies the endorsement or participation of Linden Labs or its employees in any official capacity.<br />
{{RightToc}}<br />
<br />
== Motivation ==<br />
<br />
To illustrate the need for a standardized notation for identifying virtual worlds and their major components, we look to analogy with the early development of the Internet itself. In the early days of the Internet, each host had a ''host file'', which was simple a text file that contained a list of the known Internet connected hosts, their IP addresses and host names. The hosts file was centrally maintained, manually updated and distributed to all Internet hosts. It served two distinct purposes:<br />
* It provided a way to map human readable ''host names'' to IP addresses<br />
* It served as a place where people could look to see what hosts existed on the early Internet<br />
<br />
As the number of hosts on the Internet grew, it became apparent that a centralized mechanism would not be adequate as the Internet grew. From that realization grew the Domain Name System (DNS) and ''search engine'' services. The DNS serves as a distributed implementation of a look-up service and search engines provide a way for people to discover what is available on the Internet (or Web).<br />
<br />
Currently, there likely only a hundred or so long-lived persistent virtual worlds of significant size operating. If virtual worlds are to become a significant piece of the future of the Internet, we would expect their numbers to grow significantly, as has happened with the early Internet.<br />
<br />
What this document details is a simple notation to identify major components of virtual worlds, analogous to the way host names identify web-sites on the modern World Wide Web. For example, "'''net.mygrid.main'''" represents a valid ''grid identifier''.<br />
<br />
How those names are used, the services that may exist to map identifiers to hosts or other resources related to the identified virtual world components and how the mappings are managed, is beyond the scope of this document.<br />
<br />
It should be noted, however, that one practical motivation for the development of this notation was a need for it during the development of a lookup service that, among other things, will provide a (centralized) service for mapping identifiers of known virtual worlds to their corresponding resources. For example, mapping SecondLife and OpenSimulator based grid identifiers to their corresponding initial login URL.<br />
<br />
== Grid Identifiers ==<br />
<br />
=== Identifier Notation ===<br />
<br />
The identifier notation comprises a simple string of period separated labels, like the subdomains of DNS domain names. Each label should conform to the standards set forth for domain names (see RFC-1034). For example (and informally):<br />
* Labels are comprised of ASCII characters A-Z, a-z, 0-9 and the dash "-" character<br />
* Labels are compared case-insensitive<br />
* Internationalization of labels should be handled by applications according to Internationalizing Domain Names in Applications (IDNA; see RFC-3490)<br />
* The complete sequence of 'dotted' labels is referred to as a Grid Identifier or GI.<br />
** While the identifiers are intended to be used to identify other major components of virtual worlds for which the term 'grid' doesn't necessary technically apply, the terminology was chosen to closely match popular usage of the underlying lay concept being captured in order to facilitate dissemination of the idea.<br />
<br />
<br />
=== The identifier space ===<br />
<br />
* The ''root'' of a GI is the left-most label (before the first period).<br />
** Like DNS domain names, OGI identifiers are intended to form a hierarchical system. Whereas the ''root'' or ''terminal'' label for a DNS domain name is at the right of the domain, the left-most GI label is the 'root' in order to avoid confusion with domain names.<br />
<br />
* The only allowable root labels are the top-level DNS subdomains (TLDs), such as "com", "net", "org", "biz" etc.<br />
** These could potentially be expanded or even diverge from the set of TLDs in the future, but it isn't envisioned to be necessary in the medium term.<br />
<br />
==== Identifier types ====<br />
<br />
* Grid identifiers are divided into types "grid", "region" and "agent". <br />
** GIs of all types occupy a single name space (an identifier must be unique regardless of type)<br />
** The number of types can be expanded as necessary<br />
<br />
* A "region" type GI must have the letter "r" as the last character in the right-most label<br />
** Region type identifiers are used to identify that part of a virtual world responsible for simulation of the virtual environment<br />
** In SLGOGP terminology this is known as the "region domain".<br />
** While not mandated, it is suggested that the right-most label end in "-r".<br />
<br />
* An "agent" type GI must have the letter "a" as the last character in the right-most label<br />
** Agent type identifiers are used to identify that part of a virtual world that encompasses the representation of agents and their associated resources (typically agents who act in the world on behalf of people)<br />
** In SLGOGP terminology this is known as the "agent domain".<br />
** While not mandated, it is suggested that the right-most label end in "-a".<br />
<br />
* A "grid" type GI cannot have the last letter of the right-most label end in "a" or "r" and cannot contain a dash "-"<br />
** Grid type identifiers are used to identify an independent virtual world as a whole. This would typically comprise both the simulation of the virtual environment and a default service for the representation and management of avatars.<br />
<br />
<br />
For example, valid OGIs are "com.secondlife.agni" (grid GI), "biz.apez.grid-a" (agent GI) and "org.osgrid.main-r" (region GI).<br />
<br />
== Expected practice ==<br />
<br />
This section does not form part of the OGI specification, but appears in order to inform implementers of the ways in which GIs are envisioned to be used.<br />
<br />
* Due to the obvious mapping between GIs and DNS domain names via reversal of the label ordering, it is expected that an ideal initial mechanism for assigning authority over GIs by any name mapping service providers would be to require control over the corresponding DNS domain insofar as there exist corresponding subdomains.<br />
** The requirements for domain control 'proof' could in turn piggy-back on the established 3rd-party identity certifiers, such as those established for issuing domain SSL certificates.<br />
<br />
* Except where a precedent already exists, region type GIs are expected to always end in "-r" and agent type GIs in "-a".<br />
<br />
* It will be common for a grid GI to have corresponding agent type and region type GIs that are identical except for a "-a" and "-r" suffix respectively. <br />
** For example, a reasonable guess as to the agent type GI for the grid "biz.apez.grid" (if one exists) would be "biz.apez.grid-a".<br />
<br />
* Typical uses for GIs might be:<br />
** Lookup of common resources associated with grid, such as the region GI, 'defacto' agent GI, web-site address, standard services provided etc<br />
** Lookup of common resources associated with agent GIs, such as the login URL for SLGOGP agent domains.<br />
** Machine 'readable' representation for configuration information<br />
*** Such as UI mappings between human readable grid names, such as "Second Life" and the associated GI to be used with lookup services, for presentation in user agent clients<br />
** Lookup and discovery of grid inter-component trust relationships, such as which other agent services a particular region service allows agents to login from<br />
*** For example, determining that org.osgrid.main-r allows login and inventory asset sharing between avatars from org.osgrid.main-a and com.secondlife.agnia<br />
<br />
== References ==<br />
<br />
* Second Life Grid Open Grid Protocol (SLGOGP) - http://wiki.secondlife.com/wiki/SLGOGP_Draft_1 (see also http://wiki.secondlife.com/wiki/AWG)<br />
* Domain Names - Concepts and Facilities - RFC-1034 - http://tools.ietf.org/html/rfc1034<br />
* Internationalizing Domain Names in Applications (IDNA) - RFC-3490 - http://tools.ietf.org/html/rfc3490</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Grid_Identifiers_Spec&diff=71004Grid Identifiers Spec2008-06-10T15:22:32Z<p>Cenji Neutra: New page: = Open Grid Identifier Notation = <!--span style="font-size: 200%;">Second Life Grid Open Grid Protocol</span--> :<small>'''Draft 1'''</small> :<small>'''June 2008'''</small> ::''Notice: ...</p>
<hr />
<div>= Open Grid Identifier Notation =<br />
<br />
<!--span style="font-size: 200%;">Second Life Grid Open Grid Protocol</span--><br />
:<small>'''Draft 1'''</small><br />
:<small>'''June 2008'''</small><br />
::''Notice: This draft is for public comment. ''<br />
<br />
::<small>David Jung (Cenji Neutra) [http://www.apez.biz Apez Corp] cenji.neutra AT gmail.com</small><br />
::<small>Copyright 2008, Apez Corp. All rights reserved. </small><br />
<br />
::<small>This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 license. See http://creativecommons.org/licenses/by-sa/3.0/ for details. </small><br />
<br />
:<small>'''Abstract'''</small><br />
::<small>The explosion in the number of virtual worlds, particularly those based on the [http://opensimulator.org OpenSimulator] effort inspired by [http://secondlife.com Second Life&reg;], has given rise to the need for a universal and widely adopted notation for identifying distinct virtual worlds and their components. This document details such a scheme.</small><br />
<br />
:<small>'''Status'''</small><br />
::<small>As of June 2008, this document is a work in progress. Community input is solicited in order to mold this scheme into one that many parties agree to adopt and support.</small><br />
<br />
{{RightToc}}<br />
<br />
== Motivation ==<br />
<br />
To illustrate the need for a standardized notation for identifying virtual worlds and their major components, we look to analogy with the early development of the Internet itself. In the early days of the Internet, each host had a ''host file'', which was simple a text file that contained a list of the known Internet connected hosts, their IP addresses and host names. The hosts file was centrally maintained, manually updated and distributed to all Internet hosts. It served two distinct purposes:<br />
* It provided a way to map human readable ''host names'' to IP addresses<br />
* It served as a place where people could look to see what hosts existed on the early Internet<br />
<br />
As the number of hosts on the Internet grew, it became apparent that a centralized mechanism would not be adequate as the Internet grew. From that realization grew the Domain Name System (DNS) and ''search engine'' services. The DNS serves as a distributed implementation of a look-up service and search engines provide a way for people to discover what is available on the Internet (or Web).<br />
<br />
Currently, there likely only a hundred or so long-lived persistent virtual worlds of significant size operating. If virtual worlds are to become a significant piece of the future of the Internet, we would expect their numbers to grow significantly, as has happened with the early Internet.<br />
<br />
What this document details is a simple notation to identify major components of virtual worlds, analogous to the way host names identify web-sites on the modern World Wide Web. For example, "'''net.mygrid.main'''" represents a valid ''grid identifier''.<br />
<br />
How those names are used, the services that may exist to map identifiers to hosts or other resources related to the identified virtual world components and how the mappings are managed, is beyond the scope of this document.<br />
<br />
It should be noted, however, that one practical motivation for the development of this notation was a need for it during the development of a lookup service that, among other things, will provide a (centralized) service for mapping identifiers of known virtual worlds to their corresponding resources. For example, mapping SecondLife and OpenSimulator based grid identifiers to their corresponding initial login URL.<br />
<br />
== Grid Identifiers ==<br />
<br />
=== Identifier Notation ===<br />
<br />
The identifier notation comprises a simple string of period separated labels, like the subdomains of DNS domain names. Each label should conform to the standards set forth for domain names (see RFC-1034). For example (and informally):<br />
* Labels are comprised of ASCII characters A-Z, a-z, 0-9 and the dash "-" character<br />
* Labels are compared case-insensitive<br />
* Internationalization of labels should be handled by applications according to Internationalizing Domain Names in Applications (IDNA; see RFC-3490)<br />
* The complete sequence of 'dotted' labels is referred to as a Grid Identifier or GI.<br />
** While the identifiers are intended to be used to identify other major components of virtual worlds for which the term 'grid' doesn't necessary technically apply, the terminology was chosen to closely match popular usage of the underlying lay concept being captured in order to facilitate dissemination of the idea.<br />
<br />
<br />
=== The identifier space ===<br />
<br />
* The ''root'' of a GI is the left-most label (before the first period).<br />
** Like DNS domain names, OGI identifiers are intended to form a hierarchical system. Whereas the ''root'' or ''terminal'' label for a DNS domain name is at the right of the domain, the left-most GI label is the 'root' in order to avoid confusion with domain names.<br />
<br />
* The only allowable root labels are the top-level DNS subdomains (TLDs), such as "com", "net", "org", "biz" etc.<br />
** These could potentially be expanded or even diverge from the set of TLDs in the future, but it isn't envisioned to be necessary in the medium term.<br />
<br />
==== Identifier types ====<br />
<br />
* Grid identifiers are divided into types "grid", "region" and "agent". <br />
** GIs of all types occupy a single name space (an identifier must be unique regardless of type)<br />
** The number of types can be expanded as necessary<br />
<br />
* A "region" type GI must have the letter "r" as the last character in the right-most label<br />
** Region type identifiers are used to identify that part of a virtual world responsible for simulation of the virtual environment<br />
** In SLGOGP terminology this is known as the "region domain".<br />
** While not mandated, it is suggested that the right-most label end in "-r".<br />
<br />
* An "agent" type GI must have the letter "a" as the last character in the right-most label<br />
** Agent type identifiers are used to identify that part of a virtual world that encompasses the representation of agents and their associated resources (typically agents who act in the world on behalf of people)<br />
** In SLGOGP terminology this is known as the "agent domain".<br />
** While not mandated, it is suggested that the right-most label end in "-a".<br />
<br />
* A "grid" type GI cannot have the last letter of the right-most label end in "a" or "r" and cannot contain a dash "-"<br />
** Grid type identifiers are used to identify an independent virtual world as a whole. This would typically comprise both the simulation of the virtual environment and a default service for the representation and management of avatars.<br />
<br />
<br />
For example, valid OGIs are "com.secondlife.agni" (grid GI), "biz.apez.grid-a" (agent GI) and "org.osgrid.main-r" (region GI).<br />
<br />
== Expected practice ==<br />
<br />
This section does not form part of the OGI specification, but appears in order to inform implementers of the ways in which GIs are envisioned to be used.<br />
<br />
* Due to the obvious mapping between GIs and DNS domain names via reversal of the label ordering, it is expected that an ideal initial mechanism for assigning authority over GIs by any name mapping service providers would be to require control over the corresponding DNS domain insofar as there exist corresponding subdomains.<br />
** The requirements for domain control 'proof' could in turn piggy-back on the established 3rd-party identity certifiers, such as those established for issuing domain SSL certificates.<br />
<br />
* Except where a precedent already exists, region type GIs are expected to always end in "-r" and agent type GIs in "-a".<br />
<br />
* It will be common for a grid GI to have corresponding agent type and region type GIs that are identical except for a "-a" and "-r" suffix respectively. <br />
** For example, a reasonable guess as to the agent type GI for the grid "biz.apez.grid" (if one exists) would be "biz.apez.grid-a".<br />
<br />
* Typical uses for GIs might be:<br />
** Lookup of common resources associated with grid, such as the region GI, 'defacto' agent GI, web-site address, standard services provided etc<br />
** Lookup of common resources associated with agent GIs, such as the login URL for SLGOGP agent domains.<br />
** Machine 'readable' representation for configuration information<br />
*** Such as UI mappings between human readable grid names, such as "Second Life" and the associated GI to be used with lookup services, for presentation in user agent clients<br />
** Lookup and discovery of grid inter-component trust relationships, such as which other agent services a particular region service allows agents to login from<br />
*** For example, determining that org.osgrid.main-r allows login and inventory asset sharing between avatars from org.osgrid.main-a and com.secondlife.agnia<br />
<br />
== References ==<br />
<br />
* Second Life Grid Open Grid Protocol (SLGOGP) - http://wiki.secondlife.com/wiki/SLGOGP_Draft_1 (see also http://wiki.secondlife.com/wiki/AWG)<br />
* Domain Names - Concepts and Facilities - RFC-1034 - http://tools.ietf.org/html/rfc1034<br />
* Internationalizing Domain Names in Applications (IDNA) - RFC-3490 - http://tools.ietf.org/html/rfc3490</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=LlOpenRemoteDataChannel&diff=70607LlOpenRemoteDataChannel2008-06-08T19:26:41Z<p>Cenji Neutra: </p>
<hr />
<div>{{LSL_Function<br />
|func_id=254|func_sleep=1.0|func_energy=10.0<br />
|func=llOpenRemoteDataChannel<br />
|func_footnote<br />
|func_desc=Creates a channel to listen for XML-RPC calls. Will trigger a {{LSLG|remote_data}} event with channel id once it is available.<br />
|return_text<br />
|spec<br />
|caveats=* If an object moves from one region to another it must re-open the channel<br />
** The object will get the *same* channel as before, but without re-opening no requests will get through<br />
* Any channel that is not used for 14 days will be cleaned up.<br />
** May be advisable to somewhat regularly (before expected use or on a regular schedule) check that the channel is good and hasn't changed by calling llOpenRemoteDataChannel and comparing to the previous channel.<br />
* Note: XML-RPC requests often time-out due to the front-end server being overloaded. LL has continued to upgrade the server hardware periodically, but it has remained unreliable. LL developers have advised that the XML-RPC design isn't scalable (due to the single server bottle-neck) and that the service is "deprecated". They suggest using HTTP polling as an alternative. If an XML-RPC request does time-out the script's remote_data event may or may not be triggered (and any script response is lost).<br />
|constants<br />
|examples=<lsl><br />
default<br />
{<br />
state_entry()<br />
{<br />
llOpenRemoteDataChannel();<br />
}<br />
changed(integer c)<br />
{<br />
if(c & (CHANGED_REGION | CHANGED_TELEPORT))<br />
llOpenRemoteDataChannel();<br />
}<br />
remote_data( integer event_type, key channel, key message_id, string sender, integer idata, string sdata )<br />
{<br />
if (event_type == REMOTE_DATA_CHANNEL) { // channel created<br />
}<br />
}<br />
}<br />
</lsl><br />
|helpers<br />
|also_functions<br />
|also_tests<br />
|also_events<br />
|also_articles<br />
|notes<br />
|cat1=XML-RPC<br />
|cat2<br />
|cat3<br />
|cat4<br />
}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Category:LSL_XML-RPC&diff=70606Category:LSL XML-RPC2008-06-08T19:22:37Z<p>Cenji Neutra: </p>
<hr />
<div>{{Multi-lang}}<br />
{{LSL Header}}{{LSLC|}}{{LSLC|Communications}}<br />
[http://en.wikipedia.org/wiki/XMLRPC XML-RPC] is a standard for sending Procedure Calls (e.g. function calls) to Remote systems. It sends [http://en.wikipedia.org/wiki/XML XML] data over HTTP that remote system then handles.<br />
<br />
LSL receives XML-RPC requests and passes them to the prim specified. It may not establish this connection, but it may reply and keep two-way communication with that server. These responses seem to be able to transport the largest amount of data out of Second Life (vs. [[Email]] and {{LSLGC|HTTP}} Requests).<br />
<br />
=== NOTE: ===<br />
<br />
XML-RPC requests often time-out due to the front-end server being overloaded. LL has continued to upgrade the server hardware periodically, but it has remained unreliable. LL developers have advised that the XML-RPC design isn't scalable (due to the single server bottle-neck) and that the service is "deprecated". They suggest using HTTP polling as an alternative. If an XML-RPC request does time-out the script's remote_data event may or may not be triggered (and any script response is lost).<br />
<br />
=== IMPORTANT IMPLEMENTATION NOTE: ===<br />
<br />
The current implementation of XML-RPC only allows ONE request to be queued on the front-end server (xmlrpc.secondlife.com) at a time. Any additional requests to the same data channel overwrite any pending one. This has serious ramifications for the design of XML-RPC communications where the in-world object could receive requests faster than it can respond to them. In addition, the 3-second delay in [[llRemoteDataReply]] exacerbates this problem even more.<br />
<br />
The observed issue is this: if you send multiple quick requests to an in-world object via XML-RPC, one which is scripted to perform some processing and then return a response (via llRemoteDataReply), there is a potential for earlier requests to get lost on the front end server (they still should generate [[remote_data]] events, though), and have the response meant for an earlier request end up being passed back to a later one, while the earlier requests will time out back at your external application.<br />
<br />
As a result, if you intend to do any serious work with XML-RPC, you will have to design your external client application to manually serialize all requests to each individual RPC channel. That means you have to wait for a response from the previous request before you attempt to send the next one. If you don't care about receiving responses, then this problem is not an issue, as all requests seem to get passed on to the script, regardless of the queueing issue.<br />
<br />
Also note that there is NO way to get around the 3-second delay for llRemoteDataReply; you cannot use the multiple-slave-comm-script trick, because XML-RPC channels are *script-specific*, NOT *object-specific*.<br />
<br />
For more information, see these forum threads [http://forums.secondlife.com/showthread.php?t=158437 here] and [http://forums.secondlife.com/showthread.php?p=1379244 here].<br />
<br />
==Other Resources==<br />
* [http://www.xmlrpc.com/ XMLRPC.com]<br />
* [http://scripts.incutio.com/xmlrpc/ Incutio's XML-RPC PHP library]<br />
<br />
==Example==<br />
<br />
=php=<br />
<br />
To initialize a xmlrpc from an external server you'll need some kind of web-application.<br />
One language to create a webapplication in is PHP.<br />
Here is an example of how to send a xmlrpc message to your SL-script from a webserver using PHP:<br />
<php><?php<br />
echo '<pre>';<br />
$channel = ""; //Fill in the channel you are using (key)<br />
$intvalue = ""; //Fill in the intvalue you are using (integer)<br />
$strvalue = ""; //Fill in the strvalue you are using (string)<br />
$xmldata = "<?xml version=\"1.0\"?><methodCall><methodName>llRemoteData</methodName><br />
<params><param><value><struct><br />
<member><name>Channel</name><value><string>".$channel."</string></value></member><br />
<member><name>IntValue</name><value><int>".$intvalue."</int></value></member><br />
<member><name>StringValue</name><value><string>".$strvalue."</string></value></member><br />
</struct></value></param></params></methodCall>";<br />
echo sendToHost("xmlrpc.secondlife.com", "POST", "/cgi-bin/xmlrpc.cgi", $xmldata);<br />
echo '</pre>';<br />
<br />
function sendToHost($host,$method,$path,$data,$useragent=0)<br />
{ <br />
$buf="";<br />
// Supply a default method of GET if the one passed was empty <br />
if (empty($method)) <br />
$method = 'GET'; <br />
$method = strtoupper($method); <br />
<br />
$fp = fsockopen($host, 80, $errno, $errstr, 30);<br />
<br />
if( !$fp )<br />
{<br />
$buf = "$errstr ($errno)<br />\n";<br />
}else<br />
{<br />
if ($method == 'GET') <br />
$path .= '?' . $data; <br />
fputs($fp, "$method $path HTTP/1.1\r\n"); <br />
fputs($fp, "Host: $host\r\n"); <br />
fputs($fp, "Content-type: text/xml\r\n"); <br />
fputs($fp, "Content-length: " . strlen($data) . "\r\n"); <br />
if ($useragent) <br />
fputs($fp, "User-Agent: MSIE\r\n"); <br />
fputs($fp, "Connection: close\r\n\r\n"); <br />
if ($method == 'POST') <br />
fputs($fp, $data); <br />
while (!feof($fp)) <br />
$buf .= fgets($fp,128); <br />
fclose($fp); <br />
}<br />
return $buf; <br />
} <br />
?></php><br />
<br />
=perl=<br />
<br />
The perl code and corresponding LSL code to contact an object in Second Life is given below. The perl code makes use of the RPC::XML module. You can run the perl code from the command line. It creates an rpc object and sends a message to an object that is rezzed on the grid. Note that you have to supply the UUID of the object within the perl code.<br />
<br />
The perl code sends the message that contains the string "Message to pass" and the number "2007." The LSL code responds by sending the string "I got it" and the number "2008."<br />
<br />
<perl>#!/usr/bin/perl<br />
# <br />
<br />
use RPC::XML;<br />
use RPC::XML::Parser;<br />
use RPC::XML::Client;<br />
<br />
my $llURL = "http://xmlrpc.secondlife.com/cgi-bin/xmlrpc.cgi";<br />
$P = RPC::XML::Parser->new();<br />
<br />
my $cli = RPC::XML::Client->new($llURL);<br />
my $req = RPC::XML::request->new(<br />
"llRemoteData",<br />
{'Channel' => RPC::XML::string->new("UUID for the open channel from the object GOES HERE!"),<br />
'IntValue' => RPC::XML::int->new(2007),<br />
'StringValue' => RPC::XML::string->new("message to pass")});<br />
<br />
# Print out the message to send<br />
print "ref(req): ",ref($req),"\n";<br />
$xml = $req->as_string();<br />
print "Length: ",$req->length,"\n\n",$xml,"\n\n";<br />
<br />
$res = $P->parse($xml);<br />
print ref($res),"\n";<br />
if (ref($res)) {<br />
%h = %{$res->args->[0]->value};<br />
foreach $lupe (keys %h) {<br />
print "$lupe: $h{$lupe}\n";<br />
}<br />
}<br />
<br />
# Submit the request to send the information above.<br />
my $resp = $cli->send_request($req);<br />
<br />
<br />
# Print out the response<br />
print "\n\n\nResponse\n";<br />
print "ref(resp): ",ref($resp),"\n";<br />
$xml = $resp->as_string();<br />
print "Length: ",$resp->length,"\n\n",$xml,"\n\n";<br />
<br />
$res = $P->parse($xml);<br />
print ref($res),"\n";<br />
if (ref($res)) {<br />
%h = %{$res->value};<br />
foreach $lupe (keys %h) {<br />
$val = $h{$lupe};<br />
print "$lupe: $val\n";<br />
}<br />
}</perl><br />
<br />
<br />
=Java=<br />
<br />
This Java code uses the org.apache.xmlrpc library, a jar file for this can be found at http://www.perisic.com/xmlrpc/cis69mc.jar (the code has been tested with this). See http://perisic.com/xmlrpc for a simple introduction into Java & XMLRPC if necessary <br />
* Save the code in a file named SLClient.java and download the jar file cis69mc.jar from the location above.<br />
* Add the channel id where it says '<add channel id here!!!>', so this line may eventually look similar to <code>theData.put("Channel", "24a2c834-c984-9209-78df-20608d4c8ade");</code><br />
* Compile the code with the command: javac -classpath "cis69mc.jar;." SLClient.jar (you may get a note about unchecked or unsafe operations, ignore that. <br />
* Run the code with the command: java -classpath "cis69mc.jar;." SLClient <br />
<br />
<java>import java.util.*;<br />
import org.apache.xmlrpc.*;<br />
<br />
public class SLClient {<br />
public static void main (String [] args) {<br />
try {<br />
Hashtable theData = new Hashtable(); <br />
XmlRpcClient server = new XmlRpcClient("http://xmlrpc.secondlife.com/cgi-bin/xmlrpc.cgi"); //<br />
theData.put("Channel", "<add channel id here!!!>"); <br />
theData.put("IntValue", 2483); <br />
theData.put("StringValue", "The date is: "+ (new Date()).toString() ); <br />
Vector params = new Vector(); <br />
params.add(theData); <br />
<br />
Object result = server.execute("llRemoteData", params ); <br />
<br />
} catch (Exception exception) {<br />
System.err.println("SL_Client: " + exception);<br />
exception.printStackTrace(); <br />
}<br />
}<br />
}</java><br />
<br />
=LSL Server Code=<br />
<br />
Corresponding LSL code (copy and paste this code as a script in an object, save and rezz it, a message with the channel id (and other stuff) will be printed):<br />
<br />
<lsl>key remoteChannel;<br />
init() {<br />
llOpenRemoteDataChannel(); // create an XML-RPC channel<br />
llOwnerSay("My key is " + (string)llGetKey());<br />
}<br />
<br />
default {<br />
state_entry() {<br />
init();<br />
}<br />
<br />
state_exit() {<br />
return;<br />
}<br />
<br />
on_rez(integer param) {<br />
llResetScript(); <br />
}<br />
<br />
remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) {<br />
if (type == REMOTE_DATA_CHANNEL) { // channel created<br />
llSay(DEBUG_CHANNEL,"Channel opened for REMOTE_DATA_CHANNEL" + <br />
(string)channel + " " + (string)message_id + " " + (string)sender + " " + <br />
(string)ival + " " + (string)sval);<br />
remoteChannel = channel;<br />
llOwnerSay("Ready to receive requests on channel \"" + (string)channel + "\""); <br />
state receiving; // start handling requests<br />
} else {<br />
llSay(DEBUG_CHANNEL,"Unexpected event type"); <br />
} <br />
} <br />
} <br />
<br />
<br />
state receiving {<br />
<br />
state_entry() {<br />
llOwnerSay("Ready to receive information from outside SL");<br />
} <br />
<br />
state_exit() {<br />
llOwnerSay("No longer receiving information from outside SL.");<br />
llCloseRemoteDataChannel(remoteChannel);<br />
}<br />
<br />
on_rez(integer param) {<br />
llResetScript();<br />
}<br />
<br />
remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) {<br />
if (type == REMOTE_DATA_REQUEST) { // handle requests sent to us<br />
llSay(DEBUG_CHANNEL,"Request received for REMOTE_DATA_REQUEST " + (string)channel + " " +<br />
(string)message_id + " " + (string)sender + " " + (string)ival + " " + (string)sval);<br />
llRemoteDataReply(channel,NULL_KEY,"I got it",2008);<br />
llOwnerSay("I just received data in "+ llGetRegionName() + <br />
" at position " + (string)llGetPos() + "\n" +<br />
"The string was " + sval + "\nThe number was " + (string)ival + ".");<br />
}<br />
}<br />
}</lsl></div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Email&diff=70605Email2008-06-08T19:12:59Z<p>Cenji Neutra: </p>
<hr />
<div>{{LSL_Event<br />
|event_id=21|event_delay<br />
|event=email<br />
|p1_type=string|p1_name=time|p1_desc<br />
|p2_type=string|p2_name=address|p2_desc<br />
|p3_type=string|p3_name=subj|p3_desc|<br />
p4_type=string|p4_name=message|p4_desc<br />
|p5_type=integer|p5_name=num_left|p5_desc<br />
|event_desc=Triggered when task receives email<br />
|constants<br />
|spec<br />
|caveats=*'''time''' is in the (string)[[llGetUnixTime]] format.<br />
*The email queue is limited to 100 emails, any email after that is bounced.<br />
* Due to bug [[http://jira.secondlife.com/browse/SVC-23 SVC-23]] (present since 2005), objects may stop receiving emails completely until either the region is restarted or the object crosses a region boundary (resetting the script doesn't help). Emails sent may eventually be received after a restart/region-cross. Hence, don't rely on this event for reliable inter-region messaging. <br />
|constants<br />
|examples=<br />
This application uses email to have objects check with a central server to see if the owner has the latest version. In the objects:<br />
<lsl><br />
string version = "1"; //<br />
string type = "lolcube";<br />
default<br />
{<br />
on_rez(integer start_param)<br />
{<br />
llEmail("5a634b27-f032-283f-2df2-55ead7724b23@lsl.secondlife.com",<br />
version,<br />
(string)llGetOwner()+","+type);<br />
}<br />
}</lsl><br />
The server:<br />
<lsl><br />
default<br />
{<br />
state_entry()<br />
{<br />
llSetTimerEvent(15);<br />
}<br />
<br />
timer()<br />
{<br />
llGetNextEmail("","");<br />
}<br />
<br />
email( string time, string address, string version, string message, integer num_left )<br />
{ <br />
if ((integer)version < 2)<br />
{<br />
list info = llCSV2List(llDeleteSubString(message, 0, llSubStringIndex(message, "\n\n") + 1));<br />
llGiveInventory(llList2Key(info,0),llList2String(info,1));<br />
}<br />
<br />
integer i;<br />
for (i = 0; i < num_left; i++)<br />
{<br />
llGetNextEmail("","");<br />
}<br />
}<br />
}<br />
</lsl><br />
|helpers<br />
|also_header<br />
|also_events<br />
|also_functions={{LSL DefineRow||[[llEmail]]|}}<br />
{{LSL DefineRow||[[llGetNextEmail]]|}}<br />
|also_articles<br />
|also_footer<br />
|notes<br />
|mode<br />
|deprecated<br />
|cat1=Email<br />
|cat2<br />
|cat3<br />
|cat4<br />
}}</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=LlEmail&diff=70603LlEmail2008-06-08T19:09:29Z<p>Cenji Neutra: </p>
<hr />
<div>{{LSL_Function<br />
|func_id=119|func_sleep=20.0|func_energy=10.0<br />
|sort=Email|func=llEmail<br />
|p1_type=string|p1_name=address<br />
|p2_type=string|p2_name=subject<br />
|p3_type=string|p3_name=message<br />
|func_footnote<br />
|func_desc=Sends an email to '''address''' with '''subject''' and '''message'''.<br />
|return_text<br />
|spec=The '''message''' is prefixed with information about the prim sending the email.<br />
{{{!}}{{Prettytable}}<br />
{{!}}-{{Hl2}}<br />
!Template<br />
!Example<br />
{{!}}-<br />
{{!}}<pre><br />
Object-Name: *prim*<br />
Region: *simname* (*simpos.x*, *simpos.y*)<br />
Local-Position: (*primpos.x*, *primpos.y*, *primpos.z*)<br />
<br />
*message*<br />
</pre><br />
{{!}}<br />
<pre><br />
Object-Name: Object<br />
Region: Gibson (254976, 256000)<br />
Local-Position: (117, 129, 50)<br />
<br />
The real message starts here.<br />
</pre><br />
{{!}}}<br />
|caveats=* There is a limit to the number of email messages an object can send in a given amount of time. <br />
* Due to bug [[http://jira.secondlife.com/browse/SVC-23 SVC-23]] (present since 2005), objects may stop receiving emails completely until either the region is restarted or the object crosses a region boundary (resetting the script doesn't help). Emails sent may eventually be received after a restart/region-cross. Hence, don't rely on this function for reliable inter-region messaging. <br />
|constants<br />
|examples=<br />
<lsl><br />
string email = "";<br />
<br />
default<br />
{<br />
state_entry() <br />
{<br />
if(email == "")<br />
email = (string)llGetKey()+"@lsl.secondlife.com";<br />
<br />
//Send an email to a normal email account<br />
llEmail( email, "Look it's an email subject line!", "Testing 1 2 3" );<br />
}<br />
<br />
touch_start( integer num_detected )<br />
{<br />
integer i = 0;<br />
<br />
//Send an email to the person who touched the prim<br />
do<br />
llEmail( email, "No touching!", "I was defiled by: " + llDetectedName(i) + "\nKey: " + (string) llDetectedKey(i) );<br />
while(++i < num_detected);<br />
}<br />
}<br />
</lsl><br />
|helpers=<br />
<lsl><br />
email( string time, string address, string subj, string message, integer num_left )<br />
{<br />
if(llGetSubString(address, -19, -1) == "@lsl.secondlife.com")//trim the header<br />
message = llDeleteSubString(message, 0, llSubStringIndex(message, "\n\n") + 1);<br />
}<br />
</lsl><br />
|also_functions=*{{LSLG|llGetNextEmail}}<br />
*{{LSLG|llMessageLinked}}<br />
|also_events=*{{LSLG|email}}<br />
*{{LSLG|link message}}<br />
|also_tests=*[[llEmail]]<br />
|also_articles<br />
|notes=* Because of the long delay on this function, it is often called from a second script triggered by {{LSLG|link message}}.<br />
* If you are sending email within Second Life, remember that the address is ''[key]''@lsl.secondlife.com<br />
** Which means if the key returned by [[llGetKey]] is "a2e76fcd-9360-4f6d-a924-000000000003", then its email address is "a2e76fcd-9360-4f6d-a924-000000000003@lsl.secondlife.com".<br />
|permission<br />
|negative_index<br />
|cat1=Communications<br />
|cat2=Email<br />
|cat3<br />
|cat4<br />
}}<br />
<div id="box"><br />
== Open Source Portal ==<br />
<div style="padding: 0.5em;"><br />
{{OSWikiFeatureNav}}<br />
=== Feature Design Document ===<br />
(none)<br />
<br />
=== Functional Spec ===<br />
(none)<br />
<br />
=== Test scripts ===<br />
[https://osiris.lindenlab.com/mediawiki/index.php/Email_Test internal test]<br />
<br />
=== Discussion for future improvements ===<br />
(none)<br />
<br />
=== Relationship to other features ===<br />
<b> List of features that need to be tested when this feature changes, and why. </b><br />
<br />
[[IM to email]] - verify IM -> email still works.<br />
<br />
[[Postcards]] - Postcards use email out?<br />
<br />
<br />
=== User Guides ===<br />
[http://lslwiki.net/lslwiki/wakka.php?wakka=llemail llEmail on LSLwiki.net]<br />
</div></div></div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Talk:AWG_flows_login&diff=70271Talk:AWG flows login2008-06-06T00:34:49Z<p>Cenji Neutra: New page: "The client contacts a well known hosting server" - what well known hosting server? A 'standard' agent domain identifier system is needed here. So that lookup services can be created tha...</p>
<hr />
<div>"The client contacts a well known hosting server" - what well known hosting server?<br />
<br />
A 'standard' agent domain identifier system is needed here. So that lookup services can be created that map human readable names like "Second Life", "OSGrid" and such to standard identifiers of some sort (e.g. "com.secondlife.agnia") which can further then be used to lookup this "well known host" and other information, such as the 'default' region domain for avatars with a particular agent domain, which region domains are trusted by it perhaps, etc etc - [[User:Cenji Neutra|Cenji Neutra]] 17:34, 5 June 2008 (PDT)</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Open_Source_Meeting/Agenda&diff=70222Open Source Meeting/Agenda2008-06-05T16:42:28Z<p>Cenji Neutra: /* Agenda */</p>
<hr />
<div>< [[Open Source Meeting]]<br />
<br />
<br />
Open source meeting - Thursday, 2pm PT.<br />
<br />
[http://slurl.com/secondlife/Hippotropolis/248/15/25/ Teleport] to the Linden Open Source Project headquarters.<br />
<br />
Please try to add your items as early as possible in the week to give Rob a chance to round up any Lindens that may be appropriate to the discussion. Please also bring items up on [[SLDev]] before or concurrently with adding them as agenda items here.<br />
<br />
== Agenda ==<br />
<br />
* Update from the Lindens (standing item) - [[User:Rob Linden|Rob Linden]]<br />
* Texture caching, follow up from SLDEV, can we store some kind of uncompressed data etc [[User:Michelle2 Zenovka|Michelle2 Zenovka]] 08:02, 5 June 2008 (PDT)<br />
* VWR-7531 - Dynamic grid loading to the login panel [[User:Michelle2 Zenovka|Michelle2 Zenovka]] 08:02, 5 June 2008 (PDT)<br />
** including establishing a standard format for grid (region domain) and agent domain identifiers (see my comment in VWR-7531) [[User:Cenji Neutra|Cenji Neutra]] 09:42, 5 June 2008 (PDT)<br />
* Puppettering - Jake gave us the source code to discuss and play.. so Discuss! (seriously, not sure if there is much if better items turn up last minute then please replace) [[User:Michelle2 Zenovka|Michelle2 Zenovka]] 08:04, 5 June 2008 (PDT)<br />
* cmake - Hows everyone finding it, build issues, other issues etc [[User:Michelle2 Zenovka|Michelle2 Zenovka]] 08:06, 5 June 2008 (PDT)<br />
* Next item? Your name? (sign with "<nowiki>~~~~</nowiki>" which will be converted to your name + timestamp)<br />
<br />
Default agenda is issue triage of issues listed here: http://jira.secondlife.com/secure/IssueNavigator.jspa?mode=hide&requestId=11240</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=SLGOGP_Draft_1/Discuss_1-1_Domains&diff=66475SLGOGP Draft 1/Discuss 1-1 Domains2008-05-07T19:28:10Z<p>Cenji Neutra: </p>
<hr />
<div>{{SimplePath}}<br />
{{Talk}}<br />
<br />
* the sentence "The viewer does so from the vantage point of an agent. An agent is persistent identity and persona that interacts in a virtual world. The agent persists and can be interacted with even when the user controlling it (though a viewer) is off-line." might need some clarification in what sort of interactions are meant here. Inventory transfers and the like? [Tao Takashi]<br />
<br />
* "The agent persists and can be interacted with even when the user controlling it (though a viewer) is off-line.":<br />
: This has surprised many of us, as up to now the prevailing notion had been that the agent comes into being (based on data in account records) when the client connects, and disappears when the client disconnects. If (conceptually) the agent is now seen as persisting so that off-line operations can still be viewed as interacting with the agent, then<br />
::* the distinction between agent and account has been lost,<br />
::* the clean interpretation of agent as a proxy for the client has been lost,<br />
::* agent now has two different states, and on-line and an off-line one.<br />
:This new definition of agent as a persistent entity seems to bring more trouble than benefit.<br />
<br />
: If the reason for the change was that you seek the symmetry of all off-line operations being performed in the Agent Domain, then a cleaner approach to this would be to instantiate the agent whenever an off-line operation is effected. Since this matches what actually happens, and since keeping agents instantiated regardless of login status has dreadful scalability, the cleaner approach also reflects the design of non-toy implementations, which is no bad thing. [[User:Morgaine Dinova|Morgaine Dinova]] 21:42, 11 March 2008 (PDT)<br />
<br />
On the subject of the nuts and bolts of how things are documented, I've been working with Tess to get the rez_avatar portion of the strawman login API put into a form suitable for inclusion with SLGOGP: https://wiki.secondlife.com/wiki/User:Saijanai_Kuhn/Rez_Avatar_Capability<br />
I'm confused concerning how server to server interactions are shown distinct from the viewer to server interactions. I suppose that this distinction is inherent in what kind of URL/capability is being discussed, but it seems to me that we should make it clear in the table, and regardless, we should make it clear in the description and/or naming conventions. You will note that I'm a little vague on how to name the rez_avatar region host URL. I don't even know if its a capability. These kinds of details need to be ironed out.<br />
<br />
I've also been looking at how UML is used in protocol descriptions. There's no real use of sequence diagrams with the long-poll strategy that I can find anywhere on the interent, so we'll need to devise our own convention there, I think, if we use more or less formal UML diagramming. [[User:Saijanai Kuhn|Saijanai]] 16:06, 31 March 2008 (PDT)<br />
<br />
<br />
Reading through the draft I can't help notice the conspicuous absence of reference to assets. I am assuming that asset storage is linked to the agent domain, but if so it isn't mentioned. Perhaps it is actually considered part of the region domain?&mdash;since that's where content is actually created by an agent (e.g. interactively). <br />
I think something should be mentioned about the asset storage service and how it relates to the other components&mdash;as they're obviously an important part of any grid.<br />
From my understanding of the SL grid, the asset storage system is a custom and somewhat independent 'database' from the databases that store agent information, such as inventory.<br />
<br />
Some points I'd like to see clarified in the document:<br />
* Is the intent for an agent domain to also provide access to asset content? (regardless of how it chooses to do that)<br />
** If so, that implies that a region needs to go through the agent domain to obtain asset data, for example to rez an object for an agent<br />
** How is asset IP controlled in this case? i.e. will a sim need to contact the agent domain of both the owner AND creator of an object (e.g. on rez)<br />
*** As an object owner, if I have copy perm for an object, might I assume to be able to rezz it in any region domain to which I have access?<br />
*** As a scripted object creator, I require control over which region domains my script bytecode can be allowed to reside in, irrespective of which region domains its current owner can be in (&mdash;to avoid encryption secrets embedded in script bytecode from being send to untrusted domains over untrusted networks)<br />
* If asset storage is instead linked with the region domain<br />
** Does that imply inter-region-domain exchanges in order to rezz objects when I'm in a different region domain from the one the object was created in?<br />
** What about attachments? Where do they execute? Currently, they execute in the sim where the agent is at any given moment, but again, script creators will require control over which region domains they trust to execute the bytecode in the attachments they create, independently of which region domains the attachment owner/wearer might trust.<br />
*** If attachments execute in a special 'agent sim' (a sim just for running scripts in the agent's attachments) situated in the agent domain, that implies that the executing attachment scripts will need a two-way communication with the region/sim the wearer is currently in.<br />
<br />
I realize that some of these issues may be beyond the intended scope of this document, but something needs to be said about the relationship of asset storage to the agent & region domains at least. My apologies if there are some answers in there I missed.<br />
[[User:Cenji Neutra|Cenji]] 2008-05-07</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=User:Cenji_Neutra&diff=66474User:Cenji Neutra2008-05-07T19:26:35Z<p>Cenji Neutra: </p>
<hr />
<div>CEO Apez Corp.<br />
<br />
Apez.biz - we make your virtual life easier.<br />
<br />
shop . bank . lease . vend . promote . connect<br />
<br />
http://www.apez.biz<br />
[[Category:SL Certification Participant|{{PAGENAME}}]]</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=SLGOGP_Draft_1/Discuss_2-2_LLSD&diff=66448SLGOGP Draft 1/Discuss 2-2 LLSD2008-05-07T14:49:41Z<p>Cenji Neutra: New page: Have anyone thought about or implemented a JSON serialization (as mentioned)? As per the comment: it would be nice to impose on LLSD that the root element be an array or map, but not a sca...</p>
<hr />
<div>Have anyone thought about or implemented a JSON serialization (as mentioned)?<br />
As per the comment: it would be nice to impose on LLSD that the root element be an array or map, but not a scalar, but since LLSD is already established and in-use, that could create the situation were we still have LLSD floating around that doesn't conform to that and hence can't be serialized into JSON. <br />
<br />
Perhaps a better approach would be to just define the JSON serialization to always be a 1-element array containing the rest of the serialized structure. That only adds 2-bytes of overhead (for the "[" and "]"). <br />
It does create the situation where using the JSON data natively is slightly less 'natural' in that you always have to pull out the first array element of the data first. However, the JSON serialization is going to need some other 'unnatural' features anyway, for specifying the LLSD scalar types that don't directly map to JSON types, such as Binary, URI, etc.<br />
<br />
(reason for the interest is because I have a system that uses JSON-RPC between components and in-world devices already. We also use XML-RPC, but XML isn't as compact as JSON - which is important when dealing with it in LSL)</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=PRIM_CAST_SHADOWS&diff=55899PRIM CAST SHADOWS2008-02-25T20:36:37Z<p>Cenji Neutra: New page: According to User:Kelly_Linden in the [http://jira.secondlife.com JIRA] [http://jira.secondlife.com/browse/SVC-1307 SVC-1307] on 2008-02-25: "Once, a long long time ago - beta, and ma...</p>
<hr />
<div>According to [[User:Kelly_Linden]] in the [http://jira.secondlife.com JIRA] [http://jira.secondlife.com/browse/SVC-1307 SVC-1307] on 2008-02-25:<br />
<br />
"Once, a long long time ago - beta, and maybe up to v 1.1 or 1.2 - all prims cast shadow on the ground only. Some time around 1.0 - 1.2 there was a minor graphics update that got rid of these shadows (among other things). However there was a flag that could be set on prims to *turn shadows off*, and this was not removed and I don't know why.<br />
<br />
I'm not sure if llSetPrimitiveParams came around after or this was deprecated or just before, I think after. The prim shadows flag was included for "completeness", I assume, on the possibility it would do something. Or if I have my events backwards it really did do something for a very short time.<br />
<br />
The flag has had no effect for years now. I will re-enable it as a no-op. It will always return 0 and setting it will have no effect.<br />
<br />
So, I may be wrong in my history but this is how I think it happened. In any case, this parameter is gone and not coming back. I'll see about also changing the tool tip on the variable to indicate this."</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Template:LSL_Constants/PrimitiveParams&diff=55893Template:LSL Constants/PrimitiveParams2008-02-25T20:24:49Z<p>Cenji Neutra: </p>
<hr />
<div>{{#if:<br />
{{#vardefine:p_type_desc|PRIM_SCULPT_TYPE_* flag}}<br />
{{#vardefine:p_hole_shape_desc|PRIM_HOLE_* flag}}<br />
{{#vardefine:p_cut_desc|x and y range from 0.0 to 1.0, x must be at least 0.05 smaller than y (z is ignored)}}<br />
{{#vardefine:p_hollow_desc|ranges from 0.0 (solid) to 0.95 (maximum hollowed)}}<br />
{{#vardefine:p_twist_box_desc|ranges from -0.5 (-180 degree in the edit window) to 0.5 (+180 degree in the edit window) for both x and y (z is ignored)}}<br />
{{#vardefine:p_twist_torus_desc|ranges from -1.0 (-360 degree in the edit window) to 1.0 (+360 degree in the edit window) for both x and y (z is ignored)}}<br />
{{#vardefine:p_hole_size_desc|x ranges from 0.05 to 1.0; y ranges from 0.05 (large hole) to 0.50 (no hole)}}<br />
{{#vardefine:p_top_size_desc|ranges from 0.0 to 1.0 for both x and y (z is ignored)}}<br />
{{#vardefine:p_z_taper_desc|ranges from 0.0 to 2.0 for both x and y (z is ignored)}}<br />
{{#vardefine:p_top_shear_desc|ranges from -0.5 to 0.5 for both x and y (z is ignored)}}<br />
{{#vardefine:p_taper_desc|ranges from -1.0 to 1.0 for both x and y (z is ignored)}}<br />
{{#vardefine:p_revolutions_desc|ranges from 1.0 to 4.00}}<br />
{{#vardefine:p_radius_offset_desc|depends on holesize y and revolutions}}<br />
{{#vardefine:p_skew_desc|ranges from -1.0 to 1.0}}<br />
{{#vardefine:p_id_desc|}}<br />
{{#vardefine:p_repeats_desc|x and y range from 0.0 to 100, in 0.01 increments (z is ignored)}}<br />
{{#vardefine:p_offsets_desc|x and y range from -1 to 1 (z is ignored)}}<br />
{{#vardefine:p_flex_float_desc|ranges from 0.0 to 10.0}}<br />
{{#vardefine:p_twist_end_desc|ranges from -0.5 (-180 degree in the edit window) to 0.5 (+180 degree in the edit window)}}<br />
{{#vardefine:p_hole_size_y_desc|ranges from 0.05 (large hole) to 0.50 (no hole)}}<br />
{{#vardefine:p_size_desc|ranges from 0.01 to 10.0 for x, y and z}}<br />
{{#vardefine:p_rot_desc|any valid rotation}}<br />
{{#vardefine:p_topshear_x_desc|ranges from 0.05 to 0.50}}<br />
{{#vardefine:p_boolean_desc|TRUE (enables) or FALSE (disables)}}<br />
{{LSL_Function/color|color}}<br />
{{LSL_Function/alpha|alpha}}<br />
{{LSL_Function/face|face|flag|!footer=*|return={{#ifeq:{{{1|get}}}|get|...<br />
:{{{!}}{{Prettytable}}<br />
{{!}}-{{Hl2}}<br />
!{{HoverText|flag|PRIM_* flag}}<br />
!Return if face is invalid<br />
{{!}}-<br />
{{!!}} [ [[PRIM_TEXTURE]] ] {{!!}} [ {{HoverText|""|string texture}}, {{HoverLink|ZERO_VECTOR|{{LSL VR|0.0|0.0|0.0}} vector repeats}}, {{HoverLink|ZERO_VECTOR|{{LSL VR|0.0|0.0|0.0}} vector offsets}}, {{HoverText|0.0|float rotation_in_radians}} ]<br />
{{!}}-<br />
{{!!}} [ [[PRIM_COLOR]] ] {{!!}} [ {{HoverLink|ZERO_VECTOR|{{LSL VR|0.0|0.0|0.0}} vector color}}, {{HoverText|0.0|float alpha}} ]<br />
{{!}}-<br />
{{!!}} [ [[PRIM_BUMP_SHINY]] ] {{!!}} [ {{HoverLink|PRIM_SHINY_NONE|(0) integer shiny}}, {{HoverLink|PRIM_BUMP_NONE|(0) integer bump}} ]<br />
{{!}}-<br />
{{!!}} [ [[PRIM_FULLBRIGHT]] ] {{!!}} [ {{HoverLink|FALSE|(0) integer boolean}} ]<br />
{{!}}-<br />
{{!!}} [ [[PRIM_TEXGEN]] ] {{!!}} [ {{HoverLink|PRIM_TEXGEN_DEFAULT|(0) integer type}} ]<br />
{{!}}}<br />
}}}}<br />
{{LSL_Function/inventory|map|uuid=true|type=texture|{{#ifeq:{{{1|}}}|get|no_caveat=true}}|full={{{remote|}}}}}<br />
{{LSL_Function/inventory|texture|uuid=true|type=texture|{{#ifeq:{{{1|}}}|get|no_caveat=true}}|full={{{remote|}}}}}<br />
{{#vardefine:p_rotation_in_radians_desc|angle in radians}}<br />
{{#vardefine:p_force_desc|}}<br />
{{#vardefine:p_intensity_desc|ranges from 0.0 to 1.0}}<br />
{{#vardefine:p_radius_desc|ranges from 0.1 to 10.0}}<br />
{{#vardefine:p_falloff_desc|ranges from 0.01 to 1.0}}<br />
}}{{#ifeq:{{{1|}}}|set|<br />
{{{!}} class="sortable" {{Prettytable|style=margin: 0px 0px 10px 1pt;}}<br />
{{!}}- {{Hl2}}<br />
! class="sortable" {{!}}Flag<br />
! class="sortable" {{!}}Description<br />
! class="unsortable" {{!}}Usage<br />
{{!}}-<br />
{{!}} [[#PRIM_TYPE|PRIM_TYPE]]<br />
{{!}} Sets the prim shape.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_TYPE|integer|9}}, [[integer]]&nbsp;{{HoverText|flag|PRIM_TYPE_* flag}}&nbsp;]&nbsp;+ {{HoverLink|#PRIM_TYPE_flag_parameters|Additional parameters required by the flag|flag_parameters}}<br />
{{!}}-<br />
{{!}} [[#PRIM_MATERIAL|PRIM_MATERIAL]]<br />
{{!}} Sets the prims material.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_MATERIAL|integer|2}}, [[integer]]&nbsp;{{HoverText|flag|PRIM_MATERIAL_* flag}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_PHYSICS|PRIM_PHYSICS]]<br />
{{!}} Sets the objects physics status.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_PHYSICS|integer|3}}, [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_TEMP_ON_REZ|PRIM_TEMP_ON_REZ]]<br />
{{!}} Sets the objects temporary status.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_TEMP_ON_REZ|integer|4}}, [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_PHANTOM|PRIM_PHANTOM]]<br />
{{!}} Sets the objects phantom status.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_PHANTOM|integer|5}}, [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_POSITION|PRIM_POSITION]]<br />
{{!}} Sets the prims position.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_POSITION|integer|6}}, [[vector]]&nbsp;{{LSL Param|position}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_ROTATION|PRIM_ROTATION]]<br />
{{!}} Sets the prims rotation.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_ROTATION|integer|8}}, [[rotation]]&nbsp;{{LSL Param|rot}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_SIZE|PRIM_SIZE]]<br />
{{!}} Sets the prims size.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_SIZE|integer|7}}, [[vector]]&nbsp;{{LSL Param|size}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_TEXTURE|PRIM_TEXTURE]]<br />
{{!}} Sets the prims texture attributes.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_TEXTURE|integer|17}}, [[integer]]&nbsp;{{LSL Param|face}}, [[string]]&nbsp;{{LSL Param|texture}}, [[vector]]&nbsp;{{LSL Param|repeats}}, [[vector]]&nbsp;{{LSL Param|offsets}}, [[float]]&nbsp;{{LSL Param|rotation_in_radians}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_COLOR|PRIM_COLOR]]<br />
{{!}} Sets the faces color.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_COLOR|integer|18}}, [[integer]]&nbsp;{{LSL Param|face}}, [[vector]]&nbsp;{{LSL Param|color}}, [[float]]&nbsp;{{LSL Param|alpha}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_BUMP_SHINY|PRIM_BUMP_SHINY]]<br />
{{!}} Sets the faces shiny & bump.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_BUMP_SHINY|integer|19}}, [[integer]]&nbsp;{{LSL Param|face}}, [[integer]]&nbsp;{{HoverText|shiny|PRIM_SHINY_* flag}}, [[integer]]&nbsp;{{HoverText|bump|PRIM_BUMP_* flag}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_FULLBRIGHT|PRIM_FULLBRIGHT]]<br />
{{!}} Sets the faces full bright flag.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_FULLBRIGHT|integer|20}}, [[integer]]&nbsp;{{LSL Param|face}}, [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_FLEXIBLE|PRIM_FLEXIBLE]]<br />
{{!}} Sets the prim flexible.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_FLEXIBLE|integer|21}}, [[integer]]&nbsp;{{LSL Param|boolean}}, [[integer]]&nbsp;{{HoverText|softness|ranges from 0 to 4}}, [[float]]&nbsp;{{LSL Param|flex_float|gravity}}, [[float]]&nbsp;{{LSL Param|flex_float|friction}}, [[float]]&nbsp;{{LSL Param|flex_float|wind}}, [[float]]&nbsp;{{LSL Param|flex_float|tension}}, [[vector]]&nbsp;{{LSL Param|force}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_CAST_SHADOWS|PRIM_CAST_SHADOWS]]<br />
{{!}} Sets the prims cast shadow attribute. ('''DEPRECATED''')<br />
{{!}} [&nbsp;{{LSL Const|PRIM_CAST_SHADOWS|integer|24}}, [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_TEXGEN|PRIM_TEXGEN]]<br />
{{!}} Sets the faces texture mode.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_TEXGEN|integer|22}}, [[integer]]&nbsp;{{LSL Param|face}}, [[integer]]&nbsp;{{HoverText|type|PRIM_TEXGEN_* flag}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_TYPE_LEGACY|PRIM_TYPE_LEGACY]]<br />
{{!}} Sets the prims shape (legacy mode, '''DEPRECATED''').<br />
{{!}} [&nbsp;1, [[integer]]&nbsp;{{HoverText|flag|PRIM_TYPE_* flag}}&nbsp;]&nbsp;+ {{HoverLink|#PRIM_TYPE_LEGACY_flag_parameters|Additional parameters required by the flag|flag_parameters}} <br />
{{!}}} }}<br />
{{{!}} {{Prettytable|style=margin: 0px 0px 10px 1pt;}} {{#switch:{{NAMESPACE}}|Template=|User=|{{LSLC|Light}}}}<br />
{{!}}- {{Hl2}}<br />
! colspan="2" {{!}} Parameter<br />
! colspan="2" {{!}} Additional Parameters<br />
! colspan="6" {{!}} Description<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE|integer|9|b=[&nbsp;|e=&nbsp;]|s=rowspan="18"|s1=id="PRIM_TYPE"}}<br />
{{!}} colspan="2" {{!}} [ [[integer]]&nbsp;{{HoverText|flag|PRIM_TYPE_* flag}} ]<br />
{{!}} colspan="6" {{!}} {{GetSet|{{{1|}}}|Gets|Sets}} the prim shape.<br />
{{!}}-<br />
! colspan="2" {{!}} {{HoverText|flag|PRIM_TYPE_* flag}} Constants<br />
! colspan="6" id="PRIM_TYPE_flag_parameters" {{!}} Flag Parameters<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_BOX|integer|0}}<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}}<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}}<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}}<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}}<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}}<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}}<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}}<br />
{{!}} colspan="6" {{!}} [ [[string]]&nbsp;{{LSL Param|map}},&nbsp;[[integer]]&nbsp;{{LSL Param|type}}&nbsp;] [[Sculpted_Prims:_FAQ]]<br />
{{!}}-<br />
{{!}} rowspan="8" 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}}<br />
{{!!}} Default<br />
{{LSL ConstTB|PRIM_HOLE_SQUARE|integer|hex=0x20}}<br />
{{!!}} Square<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_HOLE_CIRCLE|integer|hex=0x10}}<br />
{{!!}} Circle<br />
{{LSL ConstTB|PRIM_HOLE_TRIANGLE|integer|hex=0x30}}<br />
{{!!}} Triangle<br />
{{!}}-<br />
{{LSL Constants/PrimitiveParams/sculpt types}}<br />
{{!}}-<br />
{{!}} colspan="10" {{!}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL|integer|2|b=[&nbsp;|e=&nbsp;]|s=rowspan="10"|s1=id="PRIM_MATERIAL"}}<br />
{{!}} colspan="2" {{!}} [ [[integer]]&nbsp;{{HoverText|flag|PRIM_MATERIAL_* flag}}]<br />
{{!}} colspan="6" {{!}} {{GetSet|{{{1|}}}|Gets|Sets}} the prim's material. The material determines the default [[llCollisionSound|collision sound]] & [[llCollisionSprite|sprite]].<br />
{{!}}-<br />
! colspan="2" {{!}} {{HoverText|flag|PRIM_MATERIAL_* flag}} Constants<br />
! colspan="6" {{!}} Flag Description<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_STONE|integer|0|m=3|s3=colspan="6"|c=stone}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_METAL|integer|1|m=3|s3=colspan="6"|c=metal}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_GLASS|integer|2|m=3|s3=colspan="6"|c=glass}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_WOOD|integer|3|m=3|s3=colspan="6"|c=wood}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_FLESH|integer|4|m=3|s3=colspan="6"|c=flesh}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_PLASTIC|integer|5|m=3|s3=colspan="6"|c=plastic}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_RUBBER|integer|6|m=3|s3=colspan="6"|c=rubber}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_LIGHT|integer|7|b=<s>|e=</s>|c=light, DEPRECATED: Looks the same as [&nbsp;PRIM_FULLBRIGHT, ALL_SIDES, TRUE&nbsp;]}}<br />
{{!}} colspan="6" {{!}}light, '''DEPRECATED''': Looks the same as [&nbsp;[[PRIM_FULLBRIGHT]], [[ALL_SIDES]], [[TRUE]]&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_PHYSICS|integer|3|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_PHYSICS"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Physics status {{GetSet|{{{1|}}}|[[llGetStatus]]|[[llSetStatus]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TEMP_ON_REZ|integer|4|b=[&nbsp;|e=&nbsp;|s1=id="PRIM_TEMP_ON_REZ"]}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Temp on rez status {{GetSet|{{{1|}}}|[[llGetStatus]]|[[llSetStatus]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_PHANTOM|integer|5|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_PHANTOM"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Phantom status {{GetSet|{{{1|}}}|[[llGetStatus]]|[[llSetStatus]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_POSITION|integer|6|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_POSITION"}}<br />
{{!}} colspan="5" {{!}} [ [[vector]]&nbsp;{{LSL Param|position}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Position, {{GetSet|{{{1|}}}|[[llGetPos]]|[[llSetPos]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_ROTATION|integer|8|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_ROTATION"}}<br />
{{!}} colspan="5" {{!}} [ [[rotation]]&nbsp;{{LSL Param|rot}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Rotation, {{GetSet|{{{1|}}}|[[llGetRot]]|[[llSetRot]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_SIZE|integer|7|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_SIZE"}}<br />
{{!}} colspan="5" {{!}} [ [[vector]]&nbsp;{{LSL Param|size}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Size, {{GetSet|{{{1|}}}|[[llGetScale]]|[[llSetScale]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TEXTURE|integer|17|b=[&nbsp;|e=, [[integer]]&nbsp;{{LSL Param|face}}&nbsp;]|s1=id="PRIM_TEXTURE"}}<br />
{{!}} colspan="5" {{!}} [ [[string]]&nbsp;{{LSL Param|texture}}, [[vector]]&nbsp;{{LSL Param|repeats}}, [[vector]]&nbsp;{{LSL Param|offsets}}, [[float]]&nbsp;{{LSL Param|rotation_in_radians}}&nbsp;]<br />
{{!}} colspan="3" {{!}}<br />
{{{!}} style="background-color:#F9F9F9;"<br />
{{!}}{{!}}{{LSLGC|Texture}}: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetTexture]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llSetTexture]]}}<br />
{{!}}-<br />
{{!!}}Repeats: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetTextureScale]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llScaleTexture]]}}<br />
{{!}}-<br />
{{!!}}Offset: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetTextureOffset]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llOffsetTexture]]}}<br />
{{!}}-<br />
{{!!}}Rotation: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetTextureRot]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llRotateTexture]]}}<br />
{{!}}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_COLOR|integer|18|b=[&nbsp;|e=, [[integer]]&nbsp;{{LSL Param|face}}&nbsp;]|s1=id="PRIM_COLOR"}}<br />
{{!}} colspan="5" {{!}} [ [[vector]]&nbsp;{{LSL Param|color}}, [[float]]&nbsp;{{LSL Param|alpha}}&nbsp;]<br />
{{!}} colspan="3" {{!}} <br />
{{{!}} style="background-color:#F9F9F9;"<br />
{{!!}}{{LSLGC|Alpha}}: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetAlpha]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llSetAlpha]]}}<br />
{{!}}-<br />
{{!!}}{{LSLGC|Color}}: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetColor]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llSetColor]]}}<br />
{{!}}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_SHINY|integer|19|b=[&nbsp;|e=, [[integer]]&nbsp;{{LSL Param|face}}&nbsp;]|s=rowspan="25"|s1=id="PRIM_BUMP_SHINY"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{HoverText|shiny|PRIM_SHINY_* flag}}, [[integer]]&nbsp;{{HoverText|bump|PRIM_BUMP_* flag}}&nbsp;]<br />
{{!}} colspan="3" {{!}}<br />
{{!}}-<br />
! colspan="2" {{!}} {{HoverText|shiny|PRIM_SHINY_* flag}} & {{HoverText|bump|PRIM_BUMP_* flag}} Constants<br />
! colspan="6" {{!}} Description<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_SHINY_NONE|integer|0|m=3|s3=colspan="6"|c=none}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_SHINY_LOW|integer|1|m=3|s3=colspan="6"|c=low}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_SHINY_MEDIUM|integer|2|m=3|s3=colspan="6"|c=medium}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_SHINY_HIGH|integer|3|m=3|s3=colspan="6"|c=high}}<br />
{{!}}-<br />
{{!!}}<br />
{{!!}}<br />
{{!}} colspan="6" {{!}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_NONE|integer|0|m=3|s3=colspan="6"|c=none: no bump map}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_BRIGHT|integer|1|m=3|s3=colspan="6"|c=brightness: generate from highlights}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_DARK|integer|2|m=3|s3=colspan="6"|c=darkness: generate from lowlights}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_WOOD|integer|3|m=3|s3=colspan="6"|c=woodgrain}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_BARK|integer|4|m=3|s3=colspan="6"|c=bark}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_BRICKS|integer|5|m=3|s3=colspan="6"|c=bricks}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_CHECKER|integer|6|m=3|s3=colspan="6"|c=checker}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_CONCRETE|integer|7|m=3|s3=colspan="6"|c=concrete}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_TILE|integer|8|m=3|s3=colspan="6"|c=crustytile}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_STONE|integer|9|m=3|s3=colspan="6"|c=cutstone: blocks}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_DISKS|integer|10|m=3|s3=colspan="6"|c=discs: packed circles}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_GRAVEL|integer|11|m=3|s3=colspan="6"|c=gravel}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_BLOBS|integer|12|m=3|s3=colspan="6"|c=petridish: blobby amoeba like shapes}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_SIDING|integer|13|m=3|s3=colspan="6"|c=siding}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_LARGETILE|integer|14|m=3|s3=colspan="6"|c=stonetile}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_STUCCO|integer|15|m=3|s3=colspan="6"|c=stucco}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_SUCTION|integer|16|m=3|s3=colspan="6"|c=suction: rings}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_WEAVE|integer|17|m=3|s3=colspan="6"|c=weave}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_FULLBRIGHT|integer|20|b=[&nbsp;|e=, [[integer]]&nbsp;{{LSL Param|face}}&nbsp;]|s1=id="PRIM_FULLBRIGHT"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}} colspan="3" {{!}} <br />
{{!}}-<br />
{{LSL ConstTB|PRIM_FLEXIBLE|integer|21|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_FLEXIBLE"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}, [[integer]]&nbsp;{{HoverText|softness|ranges from 0 to 4}}, [[float]]&nbsp;{{LSL Param|flex_float|gravity}}, [[float]]&nbsp;{{LSL Param|flex_float|friction}}, [[float]]&nbsp;{{LSL Param|flex_float|wind}}, [[float]]&nbsp;{{LSL Param|flex_float|tension}}, [[vector]]&nbsp;{{LSL Param|force}}&nbsp;]<br />
{{!}} colspan="3" {{!}} <br />
{{!}}-<br />
{{LSL ConstTB|PRIM_CAST_SHADOWS|integer|24|b=[&nbsp;<s>|e=</s>&nbsp;]|s1=id="PRIM_CAST_SHADOWS"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Shadow casting for the primitive,'''DEPRECATED'''<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TEXGEN|integer|22|b=[&nbsp;|e=, [[integer]]&nbsp;{{LSL Param|face}}&nbsp;]|s=rowspan="4"|s1=id="PRIM_TEXGEN"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{HoverText|type|PRIM_TEXGEN_* flag}}&nbsp;]<br />
{{!}} colspan="3" {{!}} <br />
{{!}}-<br />
! colspan="2" {{!}} {{HoverText|type|PRIM_TEXGEN_* flag}} Constants<br />
! colspan="6" {{!}} Description<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TEXGEN_DEFAULT|integer|0|m=3|s3=colspan="6"|c=}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TEXGEN_PLANAR|integer|1|m=3|s3=colspan="6"|c=}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_POINT_LIGHT|integer|23|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_POINT_LIGHT"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}, [[vector]]&nbsp;{{LSL Param|color}}, [[float]]&nbsp;{{LSL Param|intensity}}, [[float]]&nbsp;{{LSL Param|radius}}, [[float]]&nbsp;{{LSL Param|falloff}}&nbsp;]<br />
{{!}} colspan="3" {{!}} <br />
{{!}}-<br />
{{#ifeq:{{{1|set}}}|set|<br />
{{!}} rowspan="8" id="PRIM_TYPE_LEGACY"{{!}} [ 1 ]<br/><s>{{LSL Const|PRIM_TYPE_LEGACY|integer|1|nolink=*}}</s><br />
{{!}} rowspan="8" {{!}} {{#var:value}}<br />
{{!}} colspan="8" {{!}} [ [[integer]]&nbsp;{{HoverText|flag|PRIM_TYPE_* flag}}, paramaters ]<br />
{{!}}-<br />
! colspan="2" {{!}} {{HoverText|flag|PRIM_TYPE_* flag}} Constants<br />
! colspan="6" id="PRIM_TYPE_LEGACY_flag_parameters"{{!}} Flag Parameters<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_BOX|integer|0}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[float]]&nbsp;{{LSL Param|twist_end}}, [[vector]]&nbsp;{{LSL Param|top_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_CYLINDER|integer|1}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[float]]&nbsp;{{LSL Param|twist_end}}, [[vector]]&nbsp;{{LSL Param|top_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_PRISM|integer|2}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[float]]&nbsp;{{LSL Param|twist_end}}, [[vector]]&nbsp;{{LSL Param|top_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_SPHERE|integer|3}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[vector]]&nbsp;{{LSL Param|cut|dimple}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_TORUS|integer|4}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[float]]&nbsp;{{LSL Param|twist_end}}, [[float]]&nbsp;{{LSL Param|hole_size_y}}, [[vector]]&nbsp;{{LSL Param|top_shear}}, [[vector]]&nbsp;{{LSL Param|cut|advanced_cut}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_TUBE|integer|5}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[float]]&nbsp;{{LSL Param|twist_end}}, [[float]]&nbsp;{{LSL Param|topshear_x}}&nbsp;]<br />
}}<br />
{{!}}-<br />
{{!}}}<br />
<noinclude><br />
<div id="box"><br />
== Caveats ==<br />
<div style="padding: 0.5em;"><br />
{{#var:caveats}}<br />
</div></div><br />
</noinclude></div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Template:LSL_Constants/PrimitiveParams&diff=55891Template:LSL Constants/PrimitiveParams2008-02-25T20:19:54Z<p>Cenji Neutra: </p>
<hr />
<div>{{#if:<br />
{{#vardefine:p_type_desc|PRIM_SCULPT_TYPE_* flag}}<br />
{{#vardefine:p_hole_shape_desc|PRIM_HOLE_* flag}}<br />
{{#vardefine:p_cut_desc|x and y range from 0.0 to 1.0, x must be at least 0.05 smaller than y (z is ignored)}}<br />
{{#vardefine:p_hollow_desc|ranges from 0.0 (solid) to 0.95 (maximum hollowed)}}<br />
{{#vardefine:p_twist_box_desc|ranges from -0.5 (-180 degree in the edit window) to 0.5 (+180 degree in the edit window) for both x and y (z is ignored)}}<br />
{{#vardefine:p_twist_torus_desc|ranges from -1.0 (-360 degree in the edit window) to 1.0 (+360 degree in the edit window) for both x and y (z is ignored)}}<br />
{{#vardefine:p_hole_size_desc|x ranges from 0.05 to 1.0; y ranges from 0.05 (large hole) to 0.50 (no hole)}}<br />
{{#vardefine:p_top_size_desc|ranges from 0.0 to 1.0 for both x and y (z is ignored)}}<br />
{{#vardefine:p_z_taper_desc|ranges from 0.0 to 2.0 for both x and y (z is ignored)}}<br />
{{#vardefine:p_top_shear_desc|ranges from -0.5 to 0.5 for both x and y (z is ignored)}}<br />
{{#vardefine:p_taper_desc|ranges from -1.0 to 1.0 for both x and y (z is ignored)}}<br />
{{#vardefine:p_revolutions_desc|ranges from 1.0 to 4.00}}<br />
{{#vardefine:p_radius_offset_desc|depends on holesize y and revolutions}}<br />
{{#vardefine:p_skew_desc|ranges from -1.0 to 1.0}}<br />
{{#vardefine:p_id_desc|}}<br />
{{#vardefine:p_repeats_desc|x and y range from 0.0 to 100, in 0.01 increments (z is ignored)}}<br />
{{#vardefine:p_offsets_desc|x and y range from -1 to 1 (z is ignored)}}<br />
{{#vardefine:p_flex_float_desc|ranges from 0.0 to 10.0}}<br />
{{#vardefine:p_twist_end_desc|ranges from -0.5 (-180 degree in the edit window) to 0.5 (+180 degree in the edit window)}}<br />
{{#vardefine:p_hole_size_y_desc|ranges from 0.05 (large hole) to 0.50 (no hole)}}<br />
{{#vardefine:p_size_desc|ranges from 0.01 to 10.0 for x, y and z}}<br />
{{#vardefine:p_rot_desc|any valid rotation}}<br />
{{#vardefine:p_topshear_x_desc|ranges from 0.05 to 0.50}}<br />
{{#vardefine:p_boolean_desc|TRUE (enables) or FALSE (disables)}}<br />
{{LSL_Function/color|color}}<br />
{{LSL_Function/alpha|alpha}}<br />
{{LSL_Function/face|face|flag|!footer=*|return={{#ifeq:{{{1|get}}}|get|...<br />
:{{{!}}{{Prettytable}}<br />
{{!}}-{{Hl2}}<br />
!{{HoverText|flag|PRIM_* flag}}<br />
!Return if face is invalid<br />
{{!}}-<br />
{{!!}} [ [[PRIM_TEXTURE]] ] {{!!}} [ {{HoverText|""|string texture}}, {{HoverLink|ZERO_VECTOR|{{LSL VR|0.0|0.0|0.0}} vector repeats}}, {{HoverLink|ZERO_VECTOR|{{LSL VR|0.0|0.0|0.0}} vector offsets}}, {{HoverText|0.0|float rotation_in_radians}} ]<br />
{{!}}-<br />
{{!!}} [ [[PRIM_COLOR]] ] {{!!}} [ {{HoverLink|ZERO_VECTOR|{{LSL VR|0.0|0.0|0.0}} vector color}}, {{HoverText|0.0|float alpha}} ]<br />
{{!}}-<br />
{{!!}} [ [[PRIM_BUMP_SHINY]] ] {{!!}} [ {{HoverLink|PRIM_SHINY_NONE|(0) integer shiny}}, {{HoverLink|PRIM_BUMP_NONE|(0) integer bump}} ]<br />
{{!}}-<br />
{{!!}} [ [[PRIM_FULLBRIGHT]] ] {{!!}} [ {{HoverLink|FALSE|(0) integer boolean}} ]<br />
{{!}}-<br />
{{!!}} [ [[PRIM_TEXGEN]] ] {{!!}} [ {{HoverLink|PRIM_TEXGEN_DEFAULT|(0) integer type}} ]<br />
{{!}}}<br />
}}}}<br />
{{LSL_Function/inventory|map|uuid=true|type=texture|{{#ifeq:{{{1|}}}|get|no_caveat=true}}|full={{{remote|}}}}}<br />
{{LSL_Function/inventory|texture|uuid=true|type=texture|{{#ifeq:{{{1|}}}|get|no_caveat=true}}|full={{{remote|}}}}}<br />
{{#vardefine:p_rotation_in_radians_desc|angle in radians}}<br />
{{#vardefine:p_force_desc|}}<br />
{{#vardefine:p_intensity_desc|ranges from 0.0 to 1.0}}<br />
{{#vardefine:p_radius_desc|ranges from 0.1 to 10.0}}<br />
{{#vardefine:p_falloff_desc|ranges from 0.01 to 1.0}}<br />
}}{{#ifeq:{{{1|}}}|set|<br />
{{{!}} class="sortable" {{Prettytable|style=margin: 0px 0px 10px 1pt;}}<br />
{{!}}- {{Hl2}}<br />
! class="sortable" {{!}}Flag<br />
! class="sortable" {{!}}Description<br />
! class="unsortable" {{!}}Usage<br />
{{!}}-<br />
{{!}} [[#PRIM_TYPE|PRIM_TYPE]]<br />
{{!}} Sets the prim shape.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_TYPE|integer|9}}, [[integer]]&nbsp;{{HoverText|flag|PRIM_TYPE_* flag}}&nbsp;]&nbsp;+ {{HoverLink|#PRIM_TYPE_flag_parameters|Additional parameters required by the flag|flag_parameters}}<br />
{{!}}-<br />
{{!}} [[#PRIM_MATERIAL|PRIM_MATERIAL]]<br />
{{!}} Sets the prims material.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_MATERIAL|integer|2}}, [[integer]]&nbsp;{{HoverText|flag|PRIM_MATERIAL_* flag}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_PHYSICS|PRIM_PHYSICS]]<br />
{{!}} Sets the objects physics status.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_PHYSICS|integer|3}}, [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_TEMP_ON_REZ|PRIM_TEMP_ON_REZ]]<br />
{{!}} Sets the objects temporary status.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_TEMP_ON_REZ|integer|4}}, [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_PHANTOM|PRIM_PHANTOM]]<br />
{{!}} Sets the objects phantom status.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_PHANTOM|integer|5}}, [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_POSITION|PRIM_POSITION]]<br />
{{!}} Sets the prims position.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_POSITION|integer|6}}, [[vector]]&nbsp;{{LSL Param|position}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_ROTATION|PRIM_ROTATION]]<br />
{{!}} Sets the prims rotation.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_ROTATION|integer|8}}, [[rotation]]&nbsp;{{LSL Param|rot}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_SIZE|PRIM_SIZE]]<br />
{{!}} Sets the prims size.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_SIZE|integer|7}}, [[vector]]&nbsp;{{LSL Param|size}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_TEXTURE|PRIM_TEXTURE]]<br />
{{!}} Sets the prims texture attributes.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_TEXTURE|integer|17}}, [[integer]]&nbsp;{{LSL Param|face}}, [[string]]&nbsp;{{LSL Param|texture}}, [[vector]]&nbsp;{{LSL Param|repeats}}, [[vector]]&nbsp;{{LSL Param|offsets}}, [[float]]&nbsp;{{LSL Param|rotation_in_radians}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_COLOR|PRIM_COLOR]]<br />
{{!}} Sets the faces color.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_COLOR|integer|18}}, [[integer]]&nbsp;{{LSL Param|face}}, [[vector]]&nbsp;{{LSL Param|color}}, [[float]]&nbsp;{{LSL Param|alpha}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_BUMP_SHINY|PRIM_BUMP_SHINY]]<br />
{{!}} Sets the faces shiny & bump.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_BUMP_SHINY|integer|19}}, [[integer]]&nbsp;{{LSL Param|face}}, [[integer]]&nbsp;{{HoverText|shiny|PRIM_SHINY_* flag}}, [[integer]]&nbsp;{{HoverText|bump|PRIM_BUMP_* flag}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_FULLBRIGHT|PRIM_FULLBRIGHT]]<br />
{{!}} Sets the faces full bright flag.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_FULLBRIGHT|integer|20}}, [[integer]]&nbsp;{{LSL Param|face}}, [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_FLEXIBLE|PRIM_FLEXIBLE]]<br />
{{!}} Sets the prim flexible.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_FLEXIBLE|integer|21}}, [[integer]]&nbsp;{{LSL Param|boolean}}, [[integer]]&nbsp;{{HoverText|softness|ranges from 0 to 4}}, [[float]]&nbsp;{{LSL Param|flex_float|gravity}}, [[float]]&nbsp;{{LSL Param|flex_float|friction}}, [[float]]&nbsp;{{LSL Param|flex_float|wind}}, [[float]]&nbsp;{{LSL Param|flex_float|tension}}, [[vector]]&nbsp;{{LSL Param|force}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_CAST_SHADOWS|PRIM_CAST_SHADOWS]]<br />
{{!}} Sets the prims cast shadow attribute.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_CAST_SHADOWS|integer|24}}, [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_TEXGEN|PRIM_TEXGEN]]<br />
{{!}} Sets the faces texture mode.<br />
{{!}} [&nbsp;{{LSL Const|PRIM_TEXGEN|integer|22}}, [[integer]]&nbsp;{{LSL Param|face}}, [[integer]]&nbsp;{{HoverText|type|PRIM_TEXGEN_* flag}}&nbsp;]<br />
{{!}}-<br />
{{!}} [[#PRIM_TYPE_LEGACY|PRIM_TYPE_LEGACY]]<br />
{{!}} Sets the prims shape (legacy mode).<br />
{{!}} [&nbsp;1, [[integer]]&nbsp;{{HoverText|flag|PRIM_TYPE_* flag}}&nbsp;]&nbsp;+ {{HoverLink|#PRIM_TYPE_LEGACY_flag_parameters|Additional parameters required by the flag|flag_parameters}} <br />
{{!}}} }}<br />
{{{!}} {{Prettytable|style=margin: 0px 0px 10px 1pt;}} {{#switch:{{NAMESPACE}}|Template=|User=|{{LSLC|Light}}}}<br />
{{!}}- {{Hl2}}<br />
! colspan="2" {{!}} Parameter<br />
! colspan="2" {{!}} Additional Parameters<br />
! colspan="6" {{!}} Description<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE|integer|9|b=[&nbsp;|e=&nbsp;]|s=rowspan="18"|s1=id="PRIM_TYPE"}}<br />
{{!}} colspan="2" {{!}} [ [[integer]]&nbsp;{{HoverText|flag|PRIM_TYPE_* flag}} ]<br />
{{!}} colspan="6" {{!}} {{GetSet|{{{1|}}}|Gets|Sets}} the prim shape.<br />
{{!}}-<br />
! colspan="2" {{!}} {{HoverText|flag|PRIM_TYPE_* flag}} Constants<br />
! colspan="6" id="PRIM_TYPE_flag_parameters" {{!}} Flag Parameters<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_BOX|integer|0}}<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}}<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}}<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}}<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}}<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}}<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}}<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}}<br />
{{!}} colspan="6" {{!}} [ [[string]]&nbsp;{{LSL Param|map}},&nbsp;[[integer]]&nbsp;{{LSL Param|type}}&nbsp;] [[Sculpted_Prims:_FAQ]]<br />
{{!}}-<br />
{{!}} rowspan="8" 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}}<br />
{{!!}} Default<br />
{{LSL ConstTB|PRIM_HOLE_SQUARE|integer|hex=0x20}}<br />
{{!!}} Square<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_HOLE_CIRCLE|integer|hex=0x10}}<br />
{{!!}} Circle<br />
{{LSL ConstTB|PRIM_HOLE_TRIANGLE|integer|hex=0x30}}<br />
{{!!}} Triangle<br />
{{!}}-<br />
{{LSL Constants/PrimitiveParams/sculpt types}}<br />
{{!}}-<br />
{{!}} colspan="10" {{!}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL|integer|2|b=[&nbsp;|e=&nbsp;]|s=rowspan="10"|s1=id="PRIM_MATERIAL"}}<br />
{{!}} colspan="2" {{!}} [ [[integer]]&nbsp;{{HoverText|flag|PRIM_MATERIAL_* flag}}]<br />
{{!}} colspan="6" {{!}} {{GetSet|{{{1|}}}|Gets|Sets}} the prim's material. The material determines the default [[llCollisionSound|collision sound]] & [[llCollisionSprite|sprite]].<br />
{{!}}-<br />
! colspan="2" {{!}} {{HoverText|flag|PRIM_MATERIAL_* flag}} Constants<br />
! colspan="6" {{!}} Flag Description<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_STONE|integer|0|m=3|s3=colspan="6"|c=stone}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_METAL|integer|1|m=3|s3=colspan="6"|c=metal}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_GLASS|integer|2|m=3|s3=colspan="6"|c=glass}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_WOOD|integer|3|m=3|s3=colspan="6"|c=wood}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_FLESH|integer|4|m=3|s3=colspan="6"|c=flesh}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_PLASTIC|integer|5|m=3|s3=colspan="6"|c=plastic}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_RUBBER|integer|6|m=3|s3=colspan="6"|c=rubber}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_MATERIAL_LIGHT|integer|7|b=<s>|e=</s>|c=light, DEPRECATED: Looks the same as [&nbsp;PRIM_FULLBRIGHT, ALL_SIDES, TRUE&nbsp;]}}<br />
{{!}} colspan="6" {{!}}light, '''DEPRECATED''': Looks the same as [&nbsp;[[PRIM_FULLBRIGHT]], [[ALL_SIDES]], [[TRUE]]&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_PHYSICS|integer|3|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_PHYSICS"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Physics status {{GetSet|{{{1|}}}|[[llGetStatus]]|[[llSetStatus]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TEMP_ON_REZ|integer|4|b=[&nbsp;|e=&nbsp;|s1=id="PRIM_TEMP_ON_REZ"]}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Temp on rez status {{GetSet|{{{1|}}}|[[llGetStatus]]|[[llSetStatus]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_PHANTOM|integer|5|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_PHANTOM"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Phantom status {{GetSet|{{{1|}}}|[[llGetStatus]]|[[llSetStatus]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_POSITION|integer|6|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_POSITION"}}<br />
{{!}} colspan="5" {{!}} [ [[vector]]&nbsp;{{LSL Param|position}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Position, {{GetSet|{{{1|}}}|[[llGetPos]]|[[llSetPos]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_ROTATION|integer|8|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_ROTATION"}}<br />
{{!}} colspan="5" {{!}} [ [[rotation]]&nbsp;{{LSL Param|rot}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Rotation, {{GetSet|{{{1|}}}|[[llGetRot]]|[[llSetRot]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_SIZE|integer|7|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_SIZE"}}<br />
{{!}} colspan="5" {{!}} [ [[vector]]&nbsp;{{LSL Param|size}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Size, {{GetSet|{{{1|}}}|[[llGetScale]]|[[llSetScale]]}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TEXTURE|integer|17|b=[&nbsp;|e=, [[integer]]&nbsp;{{LSL Param|face}}&nbsp;]|s1=id="PRIM_TEXTURE"}}<br />
{{!}} colspan="5" {{!}} [ [[string]]&nbsp;{{LSL Param|texture}}, [[vector]]&nbsp;{{LSL Param|repeats}}, [[vector]]&nbsp;{{LSL Param|offsets}}, [[float]]&nbsp;{{LSL Param|rotation_in_radians}}&nbsp;]<br />
{{!}} colspan="3" {{!}}<br />
{{{!}} style="background-color:#F9F9F9;"<br />
{{!}}{{!}}{{LSLGC|Texture}}: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetTexture]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llSetTexture]]}}<br />
{{!}}-<br />
{{!!}}Repeats: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetTextureScale]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llScaleTexture]]}}<br />
{{!}}-<br />
{{!!}}Offset: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetTextureOffset]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llOffsetTexture]]}}<br />
{{!}}-<br />
{{!!}}Rotation: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetTextureRot]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llRotateTexture]]}}<br />
{{!}}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_COLOR|integer|18|b=[&nbsp;|e=, [[integer]]&nbsp;{{LSL Param|face}}&nbsp;]|s1=id="PRIM_COLOR"}}<br />
{{!}} colspan="5" {{!}} [ [[vector]]&nbsp;{{LSL Param|color}}, [[float]]&nbsp;{{LSL Param|alpha}}&nbsp;]<br />
{{!}} colspan="3" {{!}} <br />
{{{!}} style="background-color:#F9F9F9;"<br />
{{!!}}{{LSLGC|Alpha}}: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetAlpha]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llSetAlpha]]}}<br />
{{!}}-<br />
{{!!}}{{LSLGC|Color}}: {{!}}{{!}} {{#ifeq:{{{1|get}}}|get|[[llGetColor]]}} {{!}}{{!}} {{#ifeq:{{{1|set}}}|set|[[llSetColor]]}}<br />
{{!}}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_SHINY|integer|19|b=[&nbsp;|e=, [[integer]]&nbsp;{{LSL Param|face}}&nbsp;]|s=rowspan="25"|s1=id="PRIM_BUMP_SHINY"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{HoverText|shiny|PRIM_SHINY_* flag}}, [[integer]]&nbsp;{{HoverText|bump|PRIM_BUMP_* flag}}&nbsp;]<br />
{{!}} colspan="3" {{!}}<br />
{{!}}-<br />
! colspan="2" {{!}} {{HoverText|shiny|PRIM_SHINY_* flag}} & {{HoverText|bump|PRIM_BUMP_* flag}} Constants<br />
! colspan="6" {{!}} Description<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_SHINY_NONE|integer|0|m=3|s3=colspan="6"|c=none}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_SHINY_LOW|integer|1|m=3|s3=colspan="6"|c=low}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_SHINY_MEDIUM|integer|2|m=3|s3=colspan="6"|c=medium}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_SHINY_HIGH|integer|3|m=3|s3=colspan="6"|c=high}}<br />
{{!}}-<br />
{{!!}}<br />
{{!!}}<br />
{{!}} colspan="6" {{!}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_NONE|integer|0|m=3|s3=colspan="6"|c=none: no bump map}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_BRIGHT|integer|1|m=3|s3=colspan="6"|c=brightness: generate from highlights}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_DARK|integer|2|m=3|s3=colspan="6"|c=darkness: generate from lowlights}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_WOOD|integer|3|m=3|s3=colspan="6"|c=woodgrain}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_BARK|integer|4|m=3|s3=colspan="6"|c=bark}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_BRICKS|integer|5|m=3|s3=colspan="6"|c=bricks}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_CHECKER|integer|6|m=3|s3=colspan="6"|c=checker}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_CONCRETE|integer|7|m=3|s3=colspan="6"|c=concrete}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_TILE|integer|8|m=3|s3=colspan="6"|c=crustytile}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_STONE|integer|9|m=3|s3=colspan="6"|c=cutstone: blocks}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_DISKS|integer|10|m=3|s3=colspan="6"|c=discs: packed circles}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_GRAVEL|integer|11|m=3|s3=colspan="6"|c=gravel}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_BLOBS|integer|12|m=3|s3=colspan="6"|c=petridish: blobby amoeba like shapes}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_SIDING|integer|13|m=3|s3=colspan="6"|c=siding}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_LARGETILE|integer|14|m=3|s3=colspan="6"|c=stonetile}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_STUCCO|integer|15|m=3|s3=colspan="6"|c=stucco}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_SUCTION|integer|16|m=3|s3=colspan="6"|c=suction: rings}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_BUMP_WEAVE|integer|17|m=3|s3=colspan="6"|c=weave}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_FULLBRIGHT|integer|20|b=[&nbsp;|e=, [[integer]]&nbsp;{{LSL Param|face}}&nbsp;]|s1=id="PRIM_FULLBRIGHT"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}} colspan="3" {{!}} <br />
{{!}}-<br />
{{LSL ConstTB|PRIM_FLEXIBLE|integer|21|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_FLEXIBLE"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}, [[integer]]&nbsp;{{HoverText|softness|ranges from 0 to 4}}, [[float]]&nbsp;{{LSL Param|flex_float|gravity}}, [[float]]&nbsp;{{LSL Param|flex_float|friction}}, [[float]]&nbsp;{{LSL Param|flex_float|wind}}, [[float]]&nbsp;{{LSL Param|flex_float|tension}}, [[vector]]&nbsp;{{LSL Param|force}}&nbsp;]<br />
{{!}} colspan="3" {{!}} <br />
{{!}}-<br />
{{LSL ConstTB|PRIM_CAST_SHADOWS|integer|24|b=[&nbsp;<s>|e=</s>&nbsp;]|s1=id="PRIM_CAST_SHADOWS"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}&nbsp;]<br />
{{!}} colspan="3" {{!}} Shadow casting for the primitive,'''DEPRECATED'''<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TEXGEN|integer|22|b=[&nbsp;|e=, [[integer]]&nbsp;{{LSL Param|face}}&nbsp;]|s=rowspan="4"|s1=id="PRIM_TEXGEN"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{HoverText|type|PRIM_TEXGEN_* flag}}&nbsp;]<br />
{{!}} colspan="3" {{!}} <br />
{{!}}-<br />
! colspan="2" {{!}} {{HoverText|type|PRIM_TEXGEN_* flag}} Constants<br />
! colspan="6" {{!}} Description<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TEXGEN_DEFAULT|integer|0|m=3|s3=colspan="6"|c=}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TEXGEN_PLANAR|integer|1|m=3|s3=colspan="6"|c=}}<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_POINT_LIGHT|integer|23|b=[&nbsp;|e=&nbsp;]|s1=id="PRIM_POINT_LIGHT"}}<br />
{{!}} colspan="5" {{!}} [ [[integer]]&nbsp;{{LSL Param|boolean}}, [[vector]]&nbsp;{{LSL Param|color}}, [[float]]&nbsp;{{LSL Param|intensity}}, [[float]]&nbsp;{{LSL Param|radius}}, [[float]]&nbsp;{{LSL Param|falloff}}&nbsp;]<br />
{{!}} colspan="3" {{!}} <br />
{{!}}-<br />
{{#ifeq:{{{1|set}}}|set|<br />
{{!}} rowspan="8" id="PRIM_TYPE_LEGACY"{{!}} [ 1 ]<br/><s>{{LSL Const|PRIM_TYPE_LEGACY|integer|1|nolink=*}}</s><br />
{{!}} rowspan="8" {{!}} {{#var:value}}<br />
{{!}} colspan="8" {{!}} [ [[integer]]&nbsp;{{HoverText|flag|PRIM_TYPE_* flag}}, paramaters ]<br />
{{!}}-<br />
! colspan="2" {{!}} {{HoverText|flag|PRIM_TYPE_* flag}} Constants<br />
! colspan="6" id="PRIM_TYPE_LEGACY_flag_parameters"{{!}} Flag Parameters<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_BOX|integer|0}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[float]]&nbsp;{{LSL Param|twist_end}}, [[vector]]&nbsp;{{LSL Param|top_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_CYLINDER|integer|1}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[float]]&nbsp;{{LSL Param|twist_end}}, [[vector]]&nbsp;{{LSL Param|top_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_PRISM|integer|2}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[float]]&nbsp;{{LSL Param|twist_end}}, [[vector]]&nbsp;{{LSL Param|top_size}}, [[vector]]&nbsp;{{LSL Param|top_shear}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_SPHERE|integer|3}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[vector]]&nbsp;{{LSL Param|cut|dimple}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_TORUS|integer|4}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[float]]&nbsp;{{LSL Param|twist_end}}, [[float]]&nbsp;{{LSL Param|hole_size_y}}, [[vector]]&nbsp;{{LSL Param|top_shear}}, [[vector]]&nbsp;{{LSL Param|cut|advanced_cut}}&nbsp;]<br />
{{!}}-<br />
{{LSL ConstTB|PRIM_TYPE_TUBE|integer|5}}<br />
{{!}} colspan="6" {{!}} [ [[vector]]&nbsp;{{LSL Param|cut}}, [[float]]&nbsp;{{LSL Param|hollow}}, [[float]]&nbsp;{{LSL Param|twist_end}}, [[float]]&nbsp;{{LSL Param|topshear_x}}&nbsp;]<br />
}}<br />
{{!}}-<br />
{{!}}}<br />
<noinclude><br />
<div id="box"><br />
== Caveats ==<br />
<div style="padding: 0.5em;"><br />
{{#var:caveats}}<br />
</div></div><br />
</noinclude></div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Brainstorming&diff=32157Brainstorming2007-09-20T02:58:55Z<p>Cenji Neutra: /* Assets */</p>
<hr />
<div>This page is all about brainstorming about the upcoming architecture. Add your thoughts here in no particular format. Can be use cases, requirements, scenarios. Maybe shouldn't be too long but long enough to get your idea across. Can also be implementation details maybe but in the lower section.<br />
<br />
<br />
== Usage examples and requirements ==<br />
<br />
=== General architecture ===<br />
* allow to run a small grid on my laptop<br />
* allow plug-ins<br />
<br />
=== Objects and Assets ===<br />
* allow objects to only be allowed to be rezzed on certain regions (adds to the agent's restrictions)<br />
* AND/OR limit object rezzing to specific groups of objects (give region owner ability to control what content is allowed in their regions)<br />
* allow assets to be transferred between agent domains<br />
* allow assets to be accessed from multiple agent domains<br />
* allow truly distributed asset storage<br />
<br />
=== Identity ===<br />
* identity should be pluggable, e.g. let me in with OpenID<br />
* various grades of verification should be possible<br />
<br />
=== Viewer ===<br />
* allow all sorts of viewers, from 3D to cellphone to web sites<br />
* Client-side Script runtime<br />
** scriptable chat & movements avatar (bot)<br />
** advanced graphical hud<br />
<br />
=== Agents ===<br />
* allow agents to only allow to connect to certain regions<br />
<br />
=== Regions ===<br />
* allow regions of arbitrary size and form<br />
* allow portals and landmass-style connections between regions or a mix of both<br />
* region should be able to decide which agents to let in depending on the grade of verification (age, RL identity, financial, ... )<br />
* User defined topology. Like bookmarks, but in 2D. Crossing a custom boundary would result in a "walking teleport"<br />
* Multiple instances of a region within a topology. Everyone can have a front row seat for the show.<br />
* Allow as many avatars as will fit in the virtual space of a region. Don't limit the population of a region based on architectural limitations.<br />
<br />
== Implementation thoughts ==<br />
<br />
=== Regions ===<br />
* if we have different region domains will each of them have their own map or would it somehow work to connect certain region domains together while it would still be possible to grow one domains space?<br />
* Can we see into neighboring regions using a low LOD mesh dynamically created to represent the land and objects in a region?<br />
* Virtualize the regions. If no one is in or near a region, don't waste hardware on it. If a region gets too busy, dynamically split it onto two servers, each taking half of the area.<br />
* Allow arbitrary assignment of geography to processing resources - including dynamic migration.<br />
** As someone who's developed 3D virtual world simulations before (and always wanted to create something like SL), the first thing that hit me when I entered SL for the first time was that sims were visible to residents (and scripts). <br />
*** A sim is an implementation detail and residents should never need to know they exist. Making that particular initial implementation choice (to divide processing power into a regular grid and distribute it statically over separate servers) has now locked it in for the future - as removing the concept of regions would break a lot of scripted content.<br />
*** However, it is still possible to lay a foundation that can deal with arbitrary assignment of geographic simulation to processing units (including dynamically) transparently and then add a 'backward-compatibility' layer over it which simulates the familiar square regions for legacy content (virtualizes them as suggested above).<br />
*** Such a system could also be implemented to allow non-flat and non-contiguous geography (e.g. like planets, for example). Current continents could be mapped into small surface patches in a 'legacy' area.<br />
*** It would also allow the possibility of distributing the various aspects of simulation of a geographic area differently - such a physics, collision, scripts, occlusion etc. (for example, if there are few physical objects over a large area, one processing unit could compute the physics for the whole area, while a larger number of processing units execute the area's scripts if required)<br />
<br />
=== Currency ===<br />
* how will virtual currency be handled in a distributed grid architecture?<br />
** Will LL still support L$ in future, or will it be phased out? (perhaps a virtual currency should have no special place in the grid at all - just as there is no special currency on the web ?)<br />
* allow for secure transactions other than in L$ via PayPal, credit cards, etc.<br />
<br />
=== Assets ===<br />
<br />
* It is possible to implement asset storage in a completely distributed way<br />
** Assets need not be stored in fixed locations (such as in the 'home' grid of the creator, for example)<br />
** A completely Peer-to-Peer (P2P) storage protocol is possible<br />
** To be successful it would have to retain many of the properties of the current 'fixed' storage schemes<br />
*** Available: Since the individual physical storage providers in a P2P network can't be trusted, a great deal of redundancy would be required to make it unlikely an asset would ever become unavailable<br />
*** Secure: Assets would need to be encrypted using strong PKI where appropriate (for example, so you can be sure nobody but the primary key holder (/ capability holder) can view your script source or edit your object). For the same reason, no asset should be stored in-whole at any single physical location (hence requiring the collusion of a large number of parties to even assemble the encrypted form of an asset in order to mount a cryptographic attack, unless the 'directory' of storage addresses for the asset has also been compromised). Obviously this wouldn't apply to the 'public' form of an asset (e.g. script bytecode, pre-optimized object mesh etc.).<br />
*** Persistent: Some mechanism to control the lifetime of assets may be needed<br />
**** Given the pace of storage technology progress, it may be possible to just keep every asset ever created (ride the wave of progress)<br />
**** If limited asset lifetimes are needed, some kind of distributed garbage-collection algorithm could be employed<br />
**** What would happen to assets that remain accessible but never 'accessed' for long periods of time? (We don't want the 'virtual data archaeologists' who research the 22nd century in one thousand years from now to keep running into cases of assets that are no longer available just because a long time has passed without 'access'!)<br />
** This may be a hard problem to solve properly now, but just designing an architecture with it in mind and then implementing something similar to the fixed scheme utilized now would leave the possibility open of implementing the more general case in the future.<br />
*** Lets avoid a repeat of the mistake made in the 'design' of the www, where public pages are often stored on servers owned/leased by their creators and routinely lost for the future (save the efforts of the way-back-machine etc).<br />
* Assets should support being signed (and notarized)<br />
** Perhaps they should even allow arbitrary meta-data to be attached to them by their creators (or anyone with perms) and accessed via scripts</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Brainstorming&diff=32156Brainstorming2007-09-20T02:32:08Z<p>Cenji Neutra: /* Implementation thoughts */</p>
<hr />
<div>This page is all about brainstorming about the upcoming architecture. Add your thoughts here in no particular format. Can be use cases, requirements, scenarios. Maybe shouldn't be too long but long enough to get your idea across. Can also be implementation details maybe but in the lower section.<br />
<br />
<br />
== Usage examples and requirements ==<br />
<br />
=== General architecture ===<br />
* allow to run a small grid on my laptop<br />
* allow plug-ins<br />
<br />
=== Objects and Assets ===<br />
* allow objects to only be allowed to be rezzed on certain regions (adds to the agent's restrictions)<br />
* AND/OR limit object rezzing to specific groups of objects (give region owner ability to control what content is allowed in their regions)<br />
* allow assets to be transferred between agent domains<br />
* allow assets to be accessed from multiple agent domains<br />
* allow truly distributed asset storage<br />
<br />
=== Identity ===<br />
* identity should be pluggable, e.g. let me in with OpenID<br />
* various grades of verification should be possible<br />
<br />
=== Viewer ===<br />
* allow all sorts of viewers, from 3D to cellphone to web sites<br />
* Client-side Script runtime<br />
** scriptable chat & movements avatar (bot)<br />
** advanced graphical hud<br />
<br />
=== Agents ===<br />
* allow agents to only allow to connect to certain regions<br />
<br />
=== Regions ===<br />
* allow regions of arbitrary size and form<br />
* allow portals and landmass-style connections between regions or a mix of both<br />
* region should be able to decide which agents to let in depending on the grade of verification (age, RL identity, financial, ... )<br />
* User defined topology. Like bookmarks, but in 2D. Crossing a custom boundary would result in a "walking teleport"<br />
* Multiple instances of a region within a topology. Everyone can have a front row seat for the show.<br />
* Allow as many avatars as will fit in the virtual space of a region. Don't limit the population of a region based on architectural limitations.<br />
<br />
== Implementation thoughts ==<br />
<br />
=== Regions ===<br />
* if we have different region domains will each of them have their own map or would it somehow work to connect certain region domains together while it would still be possible to grow one domains space?<br />
* Can we see into neighboring regions using a low LOD mesh dynamically created to represent the land and objects in a region?<br />
* Virtualize the regions. If no one is in or near a region, don't waste hardware on it. If a region gets too busy, dynamically split it onto two servers, each taking half of the area.<br />
* Allow arbitrary assignment of geography to processing resources - including dynamic migration.<br />
** As someone who's developed 3D virtual world simulations before (and always wanted to create something like SL), the first thing that hit me when I entered SL for the first time was that sims were visible to residents (and scripts). <br />
*** A sim is an implementation detail and residents should never need to know they exist. Making that particular initial implementation choice (to divide processing power into a regular grid and distribute it statically over separate servers) has now locked it in for the future - as removing the concept of regions would break a lot of scripted content.<br />
*** However, it is still possible to lay a foundation that can deal with arbitrary assignment of geographic simulation to processing units (including dynamically) transparently and then add a 'backward-compatibility' layer over it which simulates the familiar square regions for legacy content (virtualizes them as suggested above).<br />
*** Such a system could also be implemented to allow non-flat and non-contiguous geography (e.g. like planets, for example). Current continents could be mapped into small surface patches in a 'legacy' area.<br />
*** It would also allow the possibility of distributing the various aspects of simulation of a geographic area differently - such a physics, collision, scripts, occlusion etc. (for example, if there are few physical objects over a large area, one processing unit could compute the physics for the whole area, while a larger number of processing units execute the area's scripts if required)<br />
<br />
=== Currency ===<br />
* how will virtual currency be handled in a distributed grid architecture?<br />
** Will LL still support L$ in future, or will it be phased out? (perhaps a virtual currency should have no special place in the grid at all - just as there is no special currency on the web ?)<br />
* allow for secure transactions other than in L$ via PayPal, credit cards, etc.<br />
<br />
=== Assets ===</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Brainstorming&diff=32155Brainstorming2007-09-20T02:29:36Z<p>Cenji Neutra: /* Objects and Assets */</p>
<hr />
<div>This page is all about brainstorming about the upcoming architecture. Add your thoughts here in no particular format. Can be use cases, requirements, scenarios. Maybe shouldn't be too long but long enough to get your idea across. Can also be implementation details maybe but in the lower section.<br />
<br />
<br />
== Usage examples and requirements ==<br />
<br />
=== General architecture ===<br />
* allow to run a small grid on my laptop<br />
* allow plug-ins<br />
<br />
=== Objects and Assets ===<br />
* allow objects to only be allowed to be rezzed on certain regions (adds to the agent's restrictions)<br />
* AND/OR limit object rezzing to specific groups of objects (give region owner ability to control what content is allowed in their regions)<br />
* allow assets to be transferred between agent domains<br />
* allow assets to be accessed from multiple agent domains<br />
* allow truly distributed asset storage<br />
<br />
=== Identity ===<br />
* identity should be pluggable, e.g. let me in with OpenID<br />
* various grades of verification should be possible<br />
<br />
=== Viewer ===<br />
* allow all sorts of viewers, from 3D to cellphone to web sites<br />
* Client-side Script runtime<br />
** scriptable chat & movements avatar (bot)<br />
** advanced graphical hud<br />
<br />
=== Agents ===<br />
* allow agents to only allow to connect to certain regions<br />
<br />
=== Regions ===<br />
* allow regions of arbitrary size and form<br />
* allow portals and landmass-style connections between regions or a mix of both<br />
* region should be able to decide which agents to let in depending on the grade of verification (age, RL identity, financial, ... )<br />
* User defined topology. Like bookmarks, but in 2D. Crossing a custom boundary would result in a "walking teleport"<br />
* Multiple instances of a region within a topology. Everyone can have a front row seat for the show.<br />
* Allow as many avatars as will fit in the virtual space of a region. Don't limit the population of a region based on architectural limitations.<br />
<br />
== Implementation thoughts ==<br />
<br />
=== Regions ===<br />
* if we have different region domains will each of them have their own map or would it somehow work to connect certain region domains together while it would still be possible to grow one domains space?<br />
* Can we see into neighboring regions using a low LOD mesh dynamically created to represent the land and objects in a region?<br />
* Virtualize the regions. If no one is in or near a region, don't waste hardware on it. If a region gets too busy, dynamically split it onto two servers, each taking half of the area.<br />
* Allow arbitrary assignment of geography to processing resources - including dynamic migration.<br />
** As someone who's developed 3D virtual world simulations before (and always wanted to create something like SL), the first thing that hit me when I entered SL for the first time was that sims were visible to residents (and scripts). <br />
*** A sim is an implementation detail and residents should never need to know they exist. Making that particular initial implementation choice (to divide processing power into a regular grid and distribute it statically over separate servers) has now locked it in for the future - as removing the concept of regions would break a lot of scripted content.<br />
*** However, it is still possible to lay a foundation that can deal with arbitrary assignment of geographic simulation to processing units (including dynamically) transparently and then add a 'backward-compatibility' layer over it which simulates the familiar square regions for legacy content (virtualizes them as suggested above).<br />
*** Such a system could also be implemented to allow non-flat and non-contiguous geography (e.g. like planets, for example). Current continents could be mapped into small surface patches in a 'legacy' area.<br />
*** It would also allow the possibility of distributing the various aspects of simulation of a geographic area differently - such a physics, collision, scripts, occlusion etc. (for example, if there are few physical objects over a large area, one processing unit could compute the physics for the whole area, while a larger number of processing units execute the area's scripts if required)<br />
<br />
=== Currency ===<br />
* how will virtual currency be handled in a distributed grid architecture?<br />
** Will LL still support L$ in future, or will it be phased out? (perhaps a virtual currency should have no special place in the grid at all - just as there is no special currency on the web ?)<br />
* allow for secure transactions other than in L$ via PayPal, credit cards, etc.</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Brainstorming&diff=32154Brainstorming2007-09-20T02:28:09Z<p>Cenji Neutra: /* Regions */</p>
<hr />
<div>This page is all about brainstorming about the upcoming architecture. Add your thoughts here in no particular format. Can be use cases, requirements, scenarios. Maybe shouldn't be too long but long enough to get your idea across. Can also be implementation details maybe but in the lower section.<br />
<br />
<br />
== Usage examples and requirements ==<br />
<br />
=== General architecture ===<br />
* allow to run a small grid on my laptop<br />
* allow plug-ins<br />
<br />
=== Objects and Assets ===<br />
* allow objects to only be allowed to be rezzed on certain regions (adds to the agent's restrictions)<br />
* AND/OR limit object rezzing to specific groups of objects (give region owner ability to control what content is allowed in their regions)<br />
* allow assets to be transferred between agent domains<br />
* allow assets to be accessed from multiple agent domains<br />
<br />
=== Identity ===<br />
* identity should be pluggable, e.g. let me in with OpenID<br />
* various grades of verification should be possible<br />
<br />
=== Viewer ===<br />
* allow all sorts of viewers, from 3D to cellphone to web sites<br />
* Client-side Script runtime<br />
** scriptable chat & movements avatar (bot)<br />
** advanced graphical hud<br />
<br />
=== Agents ===<br />
* allow agents to only allow to connect to certain regions<br />
<br />
=== Regions ===<br />
* allow regions of arbitrary size and form<br />
* allow portals and landmass-style connections between regions or a mix of both<br />
* region should be able to decide which agents to let in depending on the grade of verification (age, RL identity, financial, ... )<br />
* User defined topology. Like bookmarks, but in 2D. Crossing a custom boundary would result in a "walking teleport"<br />
* Multiple instances of a region within a topology. Everyone can have a front row seat for the show.<br />
* Allow as many avatars as will fit in the virtual space of a region. Don't limit the population of a region based on architectural limitations.<br />
<br />
== Implementation thoughts ==<br />
<br />
=== Regions ===<br />
* if we have different region domains will each of them have their own map or would it somehow work to connect certain region domains together while it would still be possible to grow one domains space?<br />
* Can we see into neighboring regions using a low LOD mesh dynamically created to represent the land and objects in a region?<br />
* Virtualize the regions. If no one is in or near a region, don't waste hardware on it. If a region gets too busy, dynamically split it onto two servers, each taking half of the area.<br />
* Allow arbitrary assignment of geography to processing resources - including dynamic migration.<br />
** As someone who's developed 3D virtual world simulations before (and always wanted to create something like SL), the first thing that hit me when I entered SL for the first time was that sims were visible to residents (and scripts). <br />
*** A sim is an implementation detail and residents should never need to know they exist. Making that particular initial implementation choice (to divide processing power into a regular grid and distribute it statically over separate servers) has now locked it in for the future - as removing the concept of regions would break a lot of scripted content.<br />
*** However, it is still possible to lay a foundation that can deal with arbitrary assignment of geographic simulation to processing units (including dynamically) transparently and then add a 'backward-compatibility' layer over it which simulates the familiar square regions for legacy content (virtualizes them as suggested above).<br />
*** Such a system could also be implemented to allow non-flat and non-contiguous geography (e.g. like planets, for example). Current continents could be mapped into small surface patches in a 'legacy' area.<br />
*** It would also allow the possibility of distributing the various aspects of simulation of a geographic area differently - such a physics, collision, scripts, occlusion etc. (for example, if there are few physical objects over a large area, one processing unit could compute the physics for the whole area, while a larger number of processing units execute the area's scripts if required)<br />
<br />
=== Currency ===<br />
* how will virtual currency be handled in a distributed grid architecture?<br />
** Will LL still support L$ in future, or will it be phased out? (perhaps a virtual currency should have no special place in the grid at all - just as there is no special currency on the web ?)<br />
* allow for secure transactions other than in L$ via PayPal, credit cards, etc.</div>Cenji Neutrahttps://wiki.secondlife.com/w/index.php?title=Brainstorming&diff=32153Brainstorming2007-09-20T02:19:02Z<p>Cenji Neutra: /* Implementation thoughts */</p>
<hr />
<div>This page is all about brainstorming about the upcoming architecture. Add your thoughts here in no particular format. Can be use cases, requirements, scenarios. Maybe shouldn't be too long but long enough to get your idea across. Can also be implementation details maybe but in the lower section.<br />
<br />
<br />
== Usage examples and requirements ==<br />
<br />
=== General architecture ===<br />
* allow to run a small grid on my laptop<br />
* allow plug-ins<br />
<br />
=== Objects and Assets ===<br />
* allow objects to only be allowed to be rezzed on certain regions (adds to the agent's restrictions)<br />
* AND/OR limit object rezzing to specific groups of objects (give region owner ability to control what content is allowed in their regions)<br />
* allow assets to be transferred between agent domains<br />
* allow assets to be accessed from multiple agent domains<br />
<br />
=== Identity ===<br />
* identity should be pluggable, e.g. let me in with OpenID<br />
* various grades of verification should be possible<br />
<br />
=== Viewer ===<br />
* allow all sorts of viewers, from 3D to cellphone to web sites<br />
* Client-side Script runtime<br />
** scriptable chat & movements avatar (bot)<br />
** advanced graphical hud<br />
<br />
=== Agents ===<br />
* allow agents to only allow to connect to certain regions<br />
<br />
=== Regions ===<br />
* allow regions of arbitrary size and form<br />
* allow portals and landmass-style connections between regions or a mix of both<br />
* region should be able to decide which agents to let in depending on the grade of verification (age, RL identity, financial, ... )<br />
* User defined topology. Like bookmarks, but in 2D. Crossing a custom boundary would result in a "walking teleport"<br />
* Multiple instances of a region within a topology. Everyone can have a front row seat for the show.<br />
* Allow as many avatars as will fit in the virtual space of a region. Don't limit the population of a region based on architectural limitations.<br />
<br />
== Implementation thoughts ==<br />
<br />
=== Regions ===<br />
* if we have different region domains will each of them have their own map or would it somehow work to connect certain region domains together while it would still be possible to grow one domains space?<br />
* Can we see into neighboring regions using a low LOD mesh dynamically created to represent the land and objects in a region?<br />
* Virtualize the regions. If no one is in or near a region, don't waste hardware on it. If a region gets too busy, dynamically split it onto two servers, each taking half of the area.<br />
* Allow arbitrary assignment of geography to processing resources - including dynamic migration.<br />
** As someone who's developed 3D virtual world simulations before (and always wanted to create something like SL), the first thing that hit me when I entered SL for the first time was that sims were visible to residents (and scripts). <br />
*** To me, a sim is an implementation detail and residents should never need to know they exist. Making that particular initial implementation choice (to divide processing power into a regular grid and distribute it statically over separate servers) has now locked it in for the future - as removing the concept of regions would break a lot of scripted content.<br />
*** However, it is still possible to lay a foundation that can deal with arbitrary assignment of geographic simulation to processing units (including dynamically) transparently and then add a 'backward-compatibility' layer over it which simulates the familiar square regions for legacy content.<br />
*** Such a system could also be implemented to allow non-flat and non-contiguous geography (e.g. like planets, for example). Current continents could be mapped into small surface patches in a 'legacy' area.<br />
<br />
<br />
=== Currency ===<br />
* how will virtual currency be handled in a distributed grid architecture?<br />
** Will LL still support L$ in future, or will it be phased out? (perhaps a virtual currency should have no special place in the grid at all - just as there is no special currency on the web ?)<br />
* allow for secure transactions other than in L$ via PayPal, credit cards, etc.</div>Cenji Neutra