<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rtec+Dethly</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rtec+Dethly"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Rtec_Dethly"/>
	<updated>2026-07-27T08:34:30Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ParcelChatRelay&amp;diff=1198763</id>
		<title>ParcelChatRelay</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ParcelChatRelay&amp;diff=1198763"/>
		<updated>2016-01-06T01:34:41Z</updated>

		<summary type="html">&lt;p&gt;Rtec Dethly: /* VERSION 1.0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Parcel Chat Relay==&lt;br /&gt;
&lt;br /&gt;
===Description:===&lt;br /&gt;
Communicate on your land in general chat regardless of distance between avatars. Useful when building, in clubs, for roleplay, etc.&lt;br /&gt;
&lt;br /&gt;
Messages will be intelligently relayed - a listener will never hear a message twice! It will either be heard normally, or relayed. Using the new llRegionSayTo() api, chat messages are only relayed to avatars that are out of range.&lt;br /&gt;
&lt;br /&gt;
===How to use:===&lt;br /&gt;
* Rez 1 or more relays on your parcel, in a way that you could hear each avatar (&amp;lt;20m). Do not worry overlapping, but don&#039;t overdo it either - less relays will still be less lag.&lt;br /&gt;
* If you rez a relay on its&#039; final position, it will immediately be &#039;tuned&#039; and part of the network.&lt;br /&gt;
* If you move or remove a relay, it might take up to 10 minutes for the network to catch up.&lt;br /&gt;
&lt;br /&gt;
===Features:===&lt;br /&gt;
* Muliple relays can be rezzed to cover each part of your parcel.&lt;br /&gt;
* Dedoubling without any overhead&lt;br /&gt;
* Low lag - relays do not have to communicate to dedouble messages&lt;br /&gt;
&lt;br /&gt;
===Limitations:===&lt;br /&gt;
* Works only per parcel (by design). Agents on neighboring land will not receive relayed messages.&lt;br /&gt;
* Receivers have to be within radar range (96m) of the receiving relay&lt;br /&gt;
* Scripts cannot distinguish normal say, whispering and shouting. Normal say is assumed. Shouts may be heard double by the receiver&lt;br /&gt;
* Moving avatars might experience &#039;border&#039; cases - where a message sometimes accidentally is not relayed or double relayed. Due to the fast response time unlikely&lt;br /&gt;
* The displayed (&#039;faked&#039;) name is the official linden name, and chat is colored like objects, not avatars. Also depends on viewer settings.&lt;br /&gt;
Remarks on the parcel limitation.. Other options (sim wide, range based) would be easily possible, but i like the item to be zero-config (&#039;just works&#039;). Feel free to mod the script at your demands.&lt;br /&gt;
&lt;br /&gt;
===License:===&lt;br /&gt;
Modified BSD / public domain&lt;br /&gt;
&lt;br /&gt;
This script is also available at marketplace for your convenience: https://marketplace.secondlife.com/p/Parcel-Chat-Relay/3157725&lt;br /&gt;
&lt;br /&gt;
===Notes:===&lt;br /&gt;
Possible easy-to-adjust modifications: do not use parcel key but owner key as handle, allowing cross parcel-but-same-owner chat, or specifying a fixed key for region-wide that.&lt;br /&gt;
&lt;br /&gt;
===VERSION 2.0===&lt;br /&gt;
Recommended and most efficient version&lt;br /&gt;
=Code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//PCR Version 2//&lt;br /&gt;
//changes:&lt;br /&gt;
//* No longer uses radar but llGetAgentList to detect agents&lt;br /&gt;
//* Removed hover text and replaced by ownersay spam on updates&lt;br /&gt;
//* Added configurable option for coverage (parcel, parcels by same owner, entire region)&lt;br /&gt;
//* Made timer faster running in first 10 minutes after rez, to update faster on repositions&lt;br /&gt;
//* Some adjustments to allow cross-parcel and region-wide chat; replaced parcel key by owner key in those situations.&lt;br /&gt;
//* Overall, this version is more efficient and causes less lag, especially when idling, since agent list is not unneccesary updated by sensor events. It also provides better coverage and automatic support for skyboxes.&lt;br /&gt;
&lt;br /&gt;
//2011-2012 Tano Toll - TSL License//&lt;br /&gt;
&lt;br /&gt;
//Short summorization:&lt;br /&gt;
//Relays will know of eachothers existance&lt;br /&gt;
//Relays listen to public chat&lt;br /&gt;
//The relay _closest_ to sending agent is responsible for relaying the message&lt;br /&gt;
//Messages will only be relayed to agents further than 20 meter away from the speaker&lt;br /&gt;
//Messages will only be relayed to agents on the same parcel&lt;br /&gt;
&lt;br /&gt;
//USAGE:&lt;br /&gt;
//* Edit coverage parameter below to suit your needs&lt;br /&gt;
//* place this script in a objects, placed in hearing range of avatars&lt;br /&gt;
//* If you do NOT want to relay a certain place, like a skybox, simply place no relay object. However, agents in the skybox will still hear what is said near other relays. If you do not want that, please use version 1 of this script that uses radar to detect agents.&lt;br /&gt;
&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
&lt;br /&gt;
//choose coverage:&lt;br /&gt;
//integer coverage=AGENT_LIST_PARCEL;&lt;br /&gt;
integer coverage=AGENT_LIST_PARCEL_OWNER;&lt;br /&gt;
//integer coverage=AGENT_LIST_REGION;&lt;br /&gt;
&lt;br /&gt;
//Maximum range from listener object to avatar&lt;br /&gt;
integer maxRange=6000; //sim wide, reaches all skyboxes&lt;br /&gt;
//integer maxRange=290; //sim wide, ground level&lt;br /&gt;
//integer maxRange=100; //radar range, like version 1&lt;br /&gt;
&lt;br /&gt;
//just a hash. change to use several systems on a single parcel.&lt;br /&gt;
string tag=&amp;quot;+-/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// NO NEED TO EDIT BELOW THIS LINE. CHANGES AT OWN RISK //&lt;br /&gt;
&lt;br /&gt;
//list of detected nearby agents:&lt;br /&gt;
list insim;&lt;br /&gt;
&lt;br /&gt;
//timestamp of last check - to reduce sim load&lt;br /&gt;
integer stamp;&lt;br /&gt;
&lt;br /&gt;
//key of the parcel where we are rezzed&lt;br /&gt;
key parcelkey;&lt;br /&gt;
&lt;br /&gt;
//key based for handle, depending on setting parcel or owner&lt;br /&gt;
key handlebase; &lt;br /&gt;
&lt;br /&gt;
//chat channel handle made with key as base&lt;br /&gt;
integer handle;&lt;br /&gt;
&lt;br /&gt;
//list of detected nearby relays&lt;br /&gt;
list repeaters;&lt;br /&gt;
&lt;br /&gt;
//for less confusing setup, fast timer first minutes after rez, then slow down to appropiate interval&lt;br /&gt;
integer timercount;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
announce() {&lt;br /&gt;
    llRegionSay (handle, tag+(string)handlebase);   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //llSetText(&amp;quot;Chat Relay started...&amp;quot;,ZERO_VECTOR,1);&lt;br /&gt;
        llOwnerSay(&amp;quot;Chat Relay started...&amp;quot;);&lt;br /&gt;
        if (llGetAttached()) {&lt;br /&gt;
            //owner relay only mode&lt;br /&gt;
            //redundant in this script.&lt;br /&gt;
            //llListen (0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            //relay all agents&lt;br /&gt;
            llListen (0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);   &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //scan for nearby agents&lt;br /&gt;
        //llSensorRepeat (&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 65, TWO_PI, 20);&lt;br /&gt;
        &lt;br /&gt;
        //make up a inter-relay channel, so they can find eachother&lt;br /&gt;
        parcelkey=llList2Key(llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_ID]),0);        &lt;br /&gt;
        &lt;br /&gt;
        //adjust key based on coverage. for single parcel, use parcel key. else use owner key.&lt;br /&gt;
        //notice that on region-wide coverage, all relays must be rezzed by same owner.&lt;br /&gt;
                      &lt;br /&gt;
        if (coverage==AGENT_LIST_PARCEL)&lt;br /&gt;
            handlebase=parcelkey;&lt;br /&gt;
        else&lt;br /&gt;
            handlebase=llGetOwner();&lt;br /&gt;
            &lt;br /&gt;
        handle=-10909-(integer)(&amp;quot;0x&amp;quot;+llGetSubString(handlebase,1,5));&lt;br /&gt;
        llListen(handle, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, tag+(string)handlebase);&lt;br /&gt;
        &lt;br /&gt;
        //broadcast our existance about every 5 minutes, but starting with 10 second interval to avoid setup confusion&lt;br /&gt;
        //llSetTimerEvent(290.0+llFrand (20.0)); //about each 300 seconds, not all at once&lt;br /&gt;
        llSetTimerEvent (10.0);&lt;br /&gt;
        announce();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer n) {&lt;br /&gt;
        //simply reset&lt;br /&gt;
        llResetScript();   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {        &lt;br /&gt;
        //announce self&lt;br /&gt;
        announce();&lt;br /&gt;
        &lt;br /&gt;
        //check interval&lt;br /&gt;
        timercount++;&lt;br /&gt;
        if (timercount==60) //after about 10 minutes&lt;br /&gt;
            llSetTimerEvent(290.0+llFrand (20.0)); //change to 5 minute interval       &lt;br /&gt;
        &lt;br /&gt;
        //and clear list. repeaters with an too old timestamp will be removed.&lt;br /&gt;
        integer n=llGetListLength(repeaters)-1;&lt;br /&gt;
        integer t=llGetUnixTime();&lt;br /&gt;
        while (n&amp;gt;0) {&lt;br /&gt;
            if ((t-llList2Integer(repeaters, n))&amp;gt;390) { //time out&lt;br /&gt;
                llOwnerSay (&amp;quot;Lost connection to node at &amp;quot;+(string)llList2Vector(repeaters, n-1));&lt;br /&gt;
                repeaters=llDeleteSubList(repeaters, n-2, n);&lt;br /&gt;
            }&lt;br /&gt;
            n-=3;&lt;br /&gt;
        }   &lt;br /&gt;
        //llSetText (&amp;quot;Node(s): &amp;quot;+(string)(1+llGetListLength(repeaters)/3), &amp;lt;1,1,1&amp;gt;, 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen (integer channel, string name, key id, string m) {        &lt;br /&gt;
        &lt;br /&gt;
        if (!channel) { //channel 0&lt;br /&gt;
            //only relay agents, not objects&lt;br /&gt;
            if (llGetAgentSize(id));else&lt;br /&gt;
                return;&lt;br /&gt;
                &lt;br /&gt;
            //see if another relay is more nearby&lt;br /&gt;
            integer n=0;&lt;br /&gt;
            vector senderpos=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0);&lt;br /&gt;
            float d=llVecDist(senderpos, llGetPos());            &lt;br /&gt;
            while (n&amp;lt;llGetListLength(repeaters)) {&lt;br /&gt;
                if (d&amp;gt;llVecDist(senderpos, llList2Vector(repeaters, n+1)))&lt;br /&gt;
                    return;&lt;br /&gt;
                n+=3;&lt;br /&gt;
            }&lt;br /&gt;
            //We are nearest repeater. Our job to relay.&lt;br /&gt;
            &lt;br /&gt;
            //see if we need to refresh our list - cache it for 15 seconds&lt;br /&gt;
            if ((llGetUnixTime()-stamp) &amp;gt; 15.0) {&lt;br /&gt;
                stamp=llGetUnixTime();&lt;br /&gt;
                insim=llGetAgentList (coverage, []);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            //relay to everyone in range. that&#039;s fixed to minimum 20 mins maximum 60.&lt;br /&gt;
            //get position of chatter&lt;br /&gt;
            vector o=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0);&lt;br /&gt;
        &lt;br /&gt;
            n=llGetListLength(insim);&lt;br /&gt;
            string oname=llGetObjectName();&lt;br /&gt;
            llSetObjectName(name);&lt;br /&gt;
            while (~--n) {&lt;br /&gt;
                vector t=llList2Vector(llGetObjectDetails(llList2Key(insim, n), [OBJECT_POS]), 0);        &lt;br /&gt;
                float d=llVecDist (o,t);&lt;br /&gt;
                if (d&amp;gt;=20 &amp;amp;&amp;amp; d&amp;lt;=maxRange) {&lt;br /&gt;
                    //same parcel? - edit - check skipped.&lt;br /&gt;
                    //if (parcelkey==llList2Key(llGetParcelDetails(llList2Vector(llGetObjectDetails(llList2Key(insim,n), [OBJECT_POS]),0), [PARCEL_DETAILS_ID]),0))&lt;br /&gt;
                        llRegionSayTo (llList2Key(insim,n), 0, m);   &lt;br /&gt;
                }&lt;br /&gt;
            }       &lt;br /&gt;
            llSetObjectName(oname);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        if (channel==handle) {&lt;br /&gt;
            //there&#039;s another repeater..&lt;br /&gt;
            vector pos=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]),0);&lt;br /&gt;
            &lt;br /&gt;
            integer p=llListFindList(repeaters, [id, pos]);&lt;br /&gt;
            if (~p)&lt;br /&gt;
                repeaters=llDeleteSubList(repeaters, p, p+2);&lt;br /&gt;
            else&lt;br /&gt;
                llOwnerSay (&amp;quot;New node found at &amp;quot;+(string)pos);&lt;br /&gt;
            repeaters += [id, pos, llGetUnixTime()];&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VERSION 1.0===&lt;br /&gt;
In some cases, you might want to use the original radar-based version. Usually not recommended, listed for completeness.&lt;br /&gt;
=Code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//2011-2012 Tano Toll - TSL License//&lt;br /&gt;
&lt;br /&gt;
//Short summorization:&lt;br /&gt;
//Relays will know of eachothers existance&lt;br /&gt;
//Relays listen to public chat&lt;br /&gt;
//The relay _closest_ to sending agent is responsible for relaying the message&lt;br /&gt;
//Messages will only be relayed to agents further than 20 meter away from the speaker&lt;br /&gt;
//Messages will only be relayed to agents on the same parcel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//list of detected nearby agents:&lt;br /&gt;
list insim;&lt;br /&gt;
&lt;br /&gt;
//just a hash. change to use several systems on a single parcel.&lt;br /&gt;
string tag=&amp;quot;+-/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//key of the parcel where we are rezzed&lt;br /&gt;
key parcelkey;&lt;br /&gt;
&lt;br /&gt;
//chat channel handle made with key as base&lt;br /&gt;
integer parcelhandle;&lt;br /&gt;
&lt;br /&gt;
//list of detected nearby relays&lt;br /&gt;
list repeaters;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
announce() {&lt;br /&gt;
    llRegionSay (parcelhandle, tag+(string)parcelkey);   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText(&amp;quot;Chat Relay started...&amp;quot;,ZERO_VECTOR,1);&lt;br /&gt;
        if (llGetAttached()) {&lt;br /&gt;
            //owner relay only mode&lt;br /&gt;
            //redundant in this script.&lt;br /&gt;
            //llListen (0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            //relay all agents&lt;br /&gt;
            llListen (0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);   &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //scan for nearby agents&lt;br /&gt;
        llSensorRepeat (&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 65, TWO_PI, 20);&lt;br /&gt;
        &lt;br /&gt;
        //make up a inter-relay channel, so they can find eachother&lt;br /&gt;
        parcelkey=llList2Key(llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_ID]),0);&lt;br /&gt;
        parcelhandle=-10909-(integer)(&amp;quot;0x&amp;quot;+llGetSubString(parcelkey,1,5));&lt;br /&gt;
        llListen(parcelhandle, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, tag+(string)parcelkey);&lt;br /&gt;
        &lt;br /&gt;
        //broadcast our existance about every 5 minutes&lt;br /&gt;
        llSetTimerEvent(290.0+llFrand (20.0)); //about each 300 seconds, not all at once&lt;br /&gt;
        announce();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer n) {&lt;br /&gt;
        //simply reset&lt;br /&gt;
        llResetScript();   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {        &lt;br /&gt;
        //announce self&lt;br /&gt;
        announce();&lt;br /&gt;
        &lt;br /&gt;
        //and clear list. repeaters with an too old timestamp will be removed.&lt;br /&gt;
        integer n=llGetListLength(repeaters)-1;&lt;br /&gt;
        integer t=llGetUnixTime();&lt;br /&gt;
        while (n&amp;gt;0) {&lt;br /&gt;
            if ((t-llList2Integer(repeaters, n))&amp;gt;390) { //time out&lt;br /&gt;
                repeaters=llDeleteSubList(repeaters, n-2, n);&lt;br /&gt;
            }&lt;br /&gt;
            n-=3;&lt;br /&gt;
        }   &lt;br /&gt;
        llSetText (&amp;quot;Node(s): &amp;quot;+(string)(1+llGetListLength(repeaters)/3), &amp;lt;1,1,1&amp;gt;, 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor (integer n) {&lt;br /&gt;
        //add detected agents to our list&lt;br /&gt;
        while (~--n) {&lt;br /&gt;
            key id=llDetectedKey(n);&lt;br /&gt;
            if (!~llListFindList(insim, [id]))&lt;br /&gt;
                insim+=id;    &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //clean up agents that are no longer in sim&lt;br /&gt;
        n=llGetListLength(insim);&lt;br /&gt;
        while (~--n)&lt;br /&gt;
            if (llGetAgentSize(llList2Key(insim,n))); else&lt;br /&gt;
                insim=llDeleteSubList(insim,n,n);   &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        insim=[];&lt;br /&gt;
        /*&lt;br /&gt;
        //clean up agents that are no longer in sim&lt;br /&gt;
        integer n=llGetListLength(insim);&lt;br /&gt;
        while (~--n)&lt;br /&gt;
            if (llGetAgentSize(llList2Key(insim,n))); else&lt;br /&gt;
                insim=llDeleteSubList(insim,n,n);   &lt;br /&gt;
        */&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen (integer channel, string name, key id, string m) {&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        if (!channel) { //channel 0&lt;br /&gt;
            //only relay agents, not objects&lt;br /&gt;
            if (llGetAgentSize(id));else&lt;br /&gt;
                return;&lt;br /&gt;
                &lt;br /&gt;
            //see if another relay is more nearby&lt;br /&gt;
            integer n=0;&lt;br /&gt;
            vector senderpos=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0);&lt;br /&gt;
            float d=llVecDist(senderpos, llGetPos());            &lt;br /&gt;
            while (n&amp;lt;llGetListLength(repeaters)) {&lt;br /&gt;
                if (d&amp;gt;llVecDist(senderpos, llList2Vector(repeaters, n+1)))&lt;br /&gt;
                    return;&lt;br /&gt;
                n+=3;&lt;br /&gt;
            }&lt;br /&gt;
            //We are nearest repeater. Our job to relay.&lt;br /&gt;
            &lt;br /&gt;
            //relay to everyone in range. that&#039;s fixed to minimum 20 mins maximum 60.&lt;br /&gt;
            //get position of chatter&lt;br /&gt;
            vector o=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0);&lt;br /&gt;
        &lt;br /&gt;
            n=llGetListLength(insim);&lt;br /&gt;
            string oname=llGetObjectName();&lt;br /&gt;
            llSetObjectName(name);&lt;br /&gt;
            while (~--n) {&lt;br /&gt;
                vector t=llList2Vector(llGetObjectDetails(llList2Key(insim, n), [OBJECT_POS]), 0);        &lt;br /&gt;
                float d=llVecDist (o,t);&lt;br /&gt;
                if (d&amp;gt;=20/* &amp;amp;&amp;amp; d&amp;lt;=60*/) {&lt;br /&gt;
                    //same parcel?&lt;br /&gt;
                    if (parcelkey==llList2Key(llGetParcelDetails(llList2Vector(llGetObjectDetails(llList2Key(insim,n), [OBJECT_POS]),0), [PARCEL_DETAILS_ID]),0))&lt;br /&gt;
                        llRegionSayTo (llList2Key(insim,n), 0, m);   &lt;br /&gt;
                }&lt;br /&gt;
            }       &lt;br /&gt;
            llSetObjectName(oname);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        if (channel==parcelhandle) {&lt;br /&gt;
            //there&#039;s another repeater..&lt;br /&gt;
            vector pos=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]),0);&lt;br /&gt;
            &lt;br /&gt;
            integer p=llListFindList(repeaters, [id, pos]);&lt;br /&gt;
            if (~p)&lt;br /&gt;
                repeaters=llDeleteSubList(repeaters, p, p+2);&lt;br /&gt;
            repeaters += [id, pos, llGetUnixTime()];&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rtec Dethly</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=ParcelChatRelay&amp;diff=1198762</id>
		<title>ParcelChatRelay</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=ParcelChatRelay&amp;diff=1198762"/>
		<updated>2016-01-06T01:33:41Z</updated>

		<summary type="html">&lt;p&gt;Rtec Dethly: /* VERSION 2.0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Parcel Chat Relay==&lt;br /&gt;
&lt;br /&gt;
===Description:===&lt;br /&gt;
Communicate on your land in general chat regardless of distance between avatars. Useful when building, in clubs, for roleplay, etc.&lt;br /&gt;
&lt;br /&gt;
Messages will be intelligently relayed - a listener will never hear a message twice! It will either be heard normally, or relayed. Using the new llRegionSayTo() api, chat messages are only relayed to avatars that are out of range.&lt;br /&gt;
&lt;br /&gt;
===How to use:===&lt;br /&gt;
* Rez 1 or more relays on your parcel, in a way that you could hear each avatar (&amp;lt;20m). Do not worry overlapping, but don&#039;t overdo it either - less relays will still be less lag.&lt;br /&gt;
* If you rez a relay on its&#039; final position, it will immediately be &#039;tuned&#039; and part of the network.&lt;br /&gt;
* If you move or remove a relay, it might take up to 10 minutes for the network to catch up.&lt;br /&gt;
&lt;br /&gt;
===Features:===&lt;br /&gt;
* Muliple relays can be rezzed to cover each part of your parcel.&lt;br /&gt;
* Dedoubling without any overhead&lt;br /&gt;
* Low lag - relays do not have to communicate to dedouble messages&lt;br /&gt;
&lt;br /&gt;
===Limitations:===&lt;br /&gt;
* Works only per parcel (by design). Agents on neighboring land will not receive relayed messages.&lt;br /&gt;
* Receivers have to be within radar range (96m) of the receiving relay&lt;br /&gt;
* Scripts cannot distinguish normal say, whispering and shouting. Normal say is assumed. Shouts may be heard double by the receiver&lt;br /&gt;
* Moving avatars might experience &#039;border&#039; cases - where a message sometimes accidentally is not relayed or double relayed. Due to the fast response time unlikely&lt;br /&gt;
* The displayed (&#039;faked&#039;) name is the official linden name, and chat is colored like objects, not avatars. Also depends on viewer settings.&lt;br /&gt;
Remarks on the parcel limitation.. Other options (sim wide, range based) would be easily possible, but i like the item to be zero-config (&#039;just works&#039;). Feel free to mod the script at your demands.&lt;br /&gt;
&lt;br /&gt;
===License:===&lt;br /&gt;
Modified BSD / public domain&lt;br /&gt;
&lt;br /&gt;
This script is also available at marketplace for your convenience: https://marketplace.secondlife.com/p/Parcel-Chat-Relay/3157725&lt;br /&gt;
&lt;br /&gt;
===Notes:===&lt;br /&gt;
Possible easy-to-adjust modifications: do not use parcel key but owner key as handle, allowing cross parcel-but-same-owner chat, or specifying a fixed key for region-wide that.&lt;br /&gt;
&lt;br /&gt;
===VERSION 2.0===&lt;br /&gt;
Recommended and most efficient version&lt;br /&gt;
=Code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//PCR Version 2//&lt;br /&gt;
//changes:&lt;br /&gt;
//* No longer uses radar but llGetAgentList to detect agents&lt;br /&gt;
//* Removed hover text and replaced by ownersay spam on updates&lt;br /&gt;
//* Added configurable option for coverage (parcel, parcels by same owner, entire region)&lt;br /&gt;
//* Made timer faster running in first 10 minutes after rez, to update faster on repositions&lt;br /&gt;
//* Some adjustments to allow cross-parcel and region-wide chat; replaced parcel key by owner key in those situations.&lt;br /&gt;
//* Overall, this version is more efficient and causes less lag, especially when idling, since agent list is not unneccesary updated by sensor events. It also provides better coverage and automatic support for skyboxes.&lt;br /&gt;
&lt;br /&gt;
//2011-2012 Tano Toll - TSL License//&lt;br /&gt;
&lt;br /&gt;
//Short summorization:&lt;br /&gt;
//Relays will know of eachothers existance&lt;br /&gt;
//Relays listen to public chat&lt;br /&gt;
//The relay _closest_ to sending agent is responsible for relaying the message&lt;br /&gt;
//Messages will only be relayed to agents further than 20 meter away from the speaker&lt;br /&gt;
//Messages will only be relayed to agents on the same parcel&lt;br /&gt;
&lt;br /&gt;
//USAGE:&lt;br /&gt;
//* Edit coverage parameter below to suit your needs&lt;br /&gt;
//* place this script in a objects, placed in hearing range of avatars&lt;br /&gt;
//* If you do NOT want to relay a certain place, like a skybox, simply place no relay object. However, agents in the skybox will still hear what is said near other relays. If you do not want that, please use version 1 of this script that uses radar to detect agents.&lt;br /&gt;
&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
&lt;br /&gt;
//choose coverage:&lt;br /&gt;
//integer coverage=AGENT_LIST_PARCEL;&lt;br /&gt;
integer coverage=AGENT_LIST_PARCEL_OWNER;&lt;br /&gt;
//integer coverage=AGENT_LIST_REGION;&lt;br /&gt;
&lt;br /&gt;
//Maximum range from listener object to avatar&lt;br /&gt;
integer maxRange=6000; //sim wide, reaches all skyboxes&lt;br /&gt;
//integer maxRange=290; //sim wide, ground level&lt;br /&gt;
//integer maxRange=100; //radar range, like version 1&lt;br /&gt;
&lt;br /&gt;
//just a hash. change to use several systems on a single parcel.&lt;br /&gt;
string tag=&amp;quot;+-/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// NO NEED TO EDIT BELOW THIS LINE. CHANGES AT OWN RISK //&lt;br /&gt;
&lt;br /&gt;
//list of detected nearby agents:&lt;br /&gt;
list insim;&lt;br /&gt;
&lt;br /&gt;
//timestamp of last check - to reduce sim load&lt;br /&gt;
integer stamp;&lt;br /&gt;
&lt;br /&gt;
//key of the parcel where we are rezzed&lt;br /&gt;
key parcelkey;&lt;br /&gt;
&lt;br /&gt;
//key based for handle, depending on setting parcel or owner&lt;br /&gt;
key handlebase; &lt;br /&gt;
&lt;br /&gt;
//chat channel handle made with key as base&lt;br /&gt;
integer handle;&lt;br /&gt;
&lt;br /&gt;
//list of detected nearby relays&lt;br /&gt;
list repeaters;&lt;br /&gt;
&lt;br /&gt;
//for less confusing setup, fast timer first minutes after rez, then slow down to appropiate interval&lt;br /&gt;
integer timercount;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
announce() {&lt;br /&gt;
    llRegionSay (handle, tag+(string)handlebase);   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //llSetText(&amp;quot;Chat Relay started...&amp;quot;,ZERO_VECTOR,1);&lt;br /&gt;
        llOwnerSay(&amp;quot;Chat Relay started...&amp;quot;);&lt;br /&gt;
        if (llGetAttached()) {&lt;br /&gt;
            //owner relay only mode&lt;br /&gt;
            //redundant in this script.&lt;br /&gt;
            //llListen (0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            //relay all agents&lt;br /&gt;
            llListen (0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);   &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //scan for nearby agents&lt;br /&gt;
        //llSensorRepeat (&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 65, TWO_PI, 20);&lt;br /&gt;
        &lt;br /&gt;
        //make up a inter-relay channel, so they can find eachother&lt;br /&gt;
        parcelkey=llList2Key(llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_ID]),0);        &lt;br /&gt;
        &lt;br /&gt;
        //adjust key based on coverage. for single parcel, use parcel key. else use owner key.&lt;br /&gt;
        //notice that on region-wide coverage, all relays must be rezzed by same owner.&lt;br /&gt;
                      &lt;br /&gt;
        if (coverage==AGENT_LIST_PARCEL)&lt;br /&gt;
            handlebase=parcelkey;&lt;br /&gt;
        else&lt;br /&gt;
            handlebase=llGetOwner();&lt;br /&gt;
            &lt;br /&gt;
        handle=-10909-(integer)(&amp;quot;0x&amp;quot;+llGetSubString(handlebase,1,5));&lt;br /&gt;
        llListen(handle, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, tag+(string)handlebase);&lt;br /&gt;
        &lt;br /&gt;
        //broadcast our existance about every 5 minutes, but starting with 10 second interval to avoid setup confusion&lt;br /&gt;
        //llSetTimerEvent(290.0+llFrand (20.0)); //about each 300 seconds, not all at once&lt;br /&gt;
        llSetTimerEvent (10.0);&lt;br /&gt;
        announce();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer n) {&lt;br /&gt;
        //simply reset&lt;br /&gt;
        llResetScript();   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {        &lt;br /&gt;
        //announce self&lt;br /&gt;
        announce();&lt;br /&gt;
        &lt;br /&gt;
        //check interval&lt;br /&gt;
        timercount++;&lt;br /&gt;
        if (timercount==60) //after about 10 minutes&lt;br /&gt;
            llSetTimerEvent(290.0+llFrand (20.0)); //change to 5 minute interval       &lt;br /&gt;
        &lt;br /&gt;
        //and clear list. repeaters with an too old timestamp will be removed.&lt;br /&gt;
        integer n=llGetListLength(repeaters)-1;&lt;br /&gt;
        integer t=llGetUnixTime();&lt;br /&gt;
        while (n&amp;gt;0) {&lt;br /&gt;
            if ((t-llList2Integer(repeaters, n))&amp;gt;390) { //time out&lt;br /&gt;
                llOwnerSay (&amp;quot;Lost connection to node at &amp;quot;+(string)llList2Vector(repeaters, n-1));&lt;br /&gt;
                repeaters=llDeleteSubList(repeaters, n-2, n);&lt;br /&gt;
            }&lt;br /&gt;
            n-=3;&lt;br /&gt;
        }   &lt;br /&gt;
        //llSetText (&amp;quot;Node(s): &amp;quot;+(string)(1+llGetListLength(repeaters)/3), &amp;lt;1,1,1&amp;gt;, 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen (integer channel, string name, key id, string m) {        &lt;br /&gt;
        &lt;br /&gt;
        if (!channel) { //channel 0&lt;br /&gt;
            //only relay agents, not objects&lt;br /&gt;
            if (llGetAgentSize(id));else&lt;br /&gt;
                return;&lt;br /&gt;
                &lt;br /&gt;
            //see if another relay is more nearby&lt;br /&gt;
            integer n=0;&lt;br /&gt;
            vector senderpos=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0);&lt;br /&gt;
            float d=llVecDist(senderpos, llGetPos());            &lt;br /&gt;
            while (n&amp;lt;llGetListLength(repeaters)) {&lt;br /&gt;
                if (d&amp;gt;llVecDist(senderpos, llList2Vector(repeaters, n+1)))&lt;br /&gt;
                    return;&lt;br /&gt;
                n+=3;&lt;br /&gt;
            }&lt;br /&gt;
            //We are nearest repeater. Our job to relay.&lt;br /&gt;
            &lt;br /&gt;
            //see if we need to refresh our list - cache it for 15 seconds&lt;br /&gt;
            if ((llGetUnixTime()-stamp) &amp;gt; 15.0) {&lt;br /&gt;
                stamp=llGetUnixTime();&lt;br /&gt;
                insim=llGetAgentList (coverage, []);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            //relay to everyone in range. that&#039;s fixed to minimum 20 mins maximum 60.&lt;br /&gt;
            //get position of chatter&lt;br /&gt;
            vector o=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0);&lt;br /&gt;
        &lt;br /&gt;
            n=llGetListLength(insim);&lt;br /&gt;
            string oname=llGetObjectName();&lt;br /&gt;
            llSetObjectName(name);&lt;br /&gt;
            while (~--n) {&lt;br /&gt;
                vector t=llList2Vector(llGetObjectDetails(llList2Key(insim, n), [OBJECT_POS]), 0);        &lt;br /&gt;
                float d=llVecDist (o,t);&lt;br /&gt;
                if (d&amp;gt;=20 &amp;amp;&amp;amp; d&amp;lt;=maxRange) {&lt;br /&gt;
                    //same parcel? - edit - check skipped.&lt;br /&gt;
                    //if (parcelkey==llList2Key(llGetParcelDetails(llList2Vector(llGetObjectDetails(llList2Key(insim,n), [OBJECT_POS]),0), [PARCEL_DETAILS_ID]),0))&lt;br /&gt;
                        llRegionSayTo (llList2Key(insim,n), 0, m);   &lt;br /&gt;
                }&lt;br /&gt;
            }       &lt;br /&gt;
            llSetObjectName(oname);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        if (channel==handle) {&lt;br /&gt;
            //there&#039;s another repeater..&lt;br /&gt;
            vector pos=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]),0);&lt;br /&gt;
            &lt;br /&gt;
            integer p=llListFindList(repeaters, [id, pos]);&lt;br /&gt;
            if (~p)&lt;br /&gt;
                repeaters=llDeleteSubList(repeaters, p, p+2);&lt;br /&gt;
            else&lt;br /&gt;
                llOwnerSay (&amp;quot;New node found at &amp;quot;+(string)pos);&lt;br /&gt;
            repeaters += [id, pos, llGetUnixTime()];&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VERSION 1.0===&lt;br /&gt;
In some cases, you might want to use the original radar-based version. Usually not recommended, listed for completeness.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//2011-2012 Tano Toll - TSL License//&lt;br /&gt;
&lt;br /&gt;
//Short summorization:&lt;br /&gt;
//Relays will know of eachothers existance&lt;br /&gt;
//Relays listen to public chat&lt;br /&gt;
//The relay _closest_ to sending agent is responsible for relaying the message&lt;br /&gt;
//Messages will only be relayed to agents further than 20 meter away from the speaker&lt;br /&gt;
//Messages will only be relayed to agents on the same parcel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//list of detected nearby agents:&lt;br /&gt;
list insim;&lt;br /&gt;
&lt;br /&gt;
//just a hash. change to use several systems on a single parcel.&lt;br /&gt;
string tag=&amp;quot;+-/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//key of the parcel where we are rezzed&lt;br /&gt;
key parcelkey;&lt;br /&gt;
&lt;br /&gt;
//chat channel handle made with key as base&lt;br /&gt;
integer parcelhandle;&lt;br /&gt;
&lt;br /&gt;
//list of detected nearby relays&lt;br /&gt;
list repeaters;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
announce() {&lt;br /&gt;
    llRegionSay (parcelhandle, tag+(string)parcelkey);   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText(&amp;quot;Chat Relay started...&amp;quot;,ZERO_VECTOR,1);&lt;br /&gt;
        if (llGetAttached()) {&lt;br /&gt;
            //owner relay only mode&lt;br /&gt;
            //redundant in this script.&lt;br /&gt;
            //llListen (0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            //relay all agents&lt;br /&gt;
            llListen (0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);   &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //scan for nearby agents&lt;br /&gt;
        llSensorRepeat (&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 65, TWO_PI, 20);&lt;br /&gt;
        &lt;br /&gt;
        //make up a inter-relay channel, so they can find eachother&lt;br /&gt;
        parcelkey=llList2Key(llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_ID]),0);&lt;br /&gt;
        parcelhandle=-10909-(integer)(&amp;quot;0x&amp;quot;+llGetSubString(parcelkey,1,5));&lt;br /&gt;
        llListen(parcelhandle, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, tag+(string)parcelkey);&lt;br /&gt;
        &lt;br /&gt;
        //broadcast our existance about every 5 minutes&lt;br /&gt;
        llSetTimerEvent(290.0+llFrand (20.0)); //about each 300 seconds, not all at once&lt;br /&gt;
        announce();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer n) {&lt;br /&gt;
        //simply reset&lt;br /&gt;
        llResetScript();   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {        &lt;br /&gt;
        //announce self&lt;br /&gt;
        announce();&lt;br /&gt;
        &lt;br /&gt;
        //and clear list. repeaters with an too old timestamp will be removed.&lt;br /&gt;
        integer n=llGetListLength(repeaters)-1;&lt;br /&gt;
        integer t=llGetUnixTime();&lt;br /&gt;
        while (n&amp;gt;0) {&lt;br /&gt;
            if ((t-llList2Integer(repeaters, n))&amp;gt;390) { //time out&lt;br /&gt;
                repeaters=llDeleteSubList(repeaters, n-2, n);&lt;br /&gt;
            }&lt;br /&gt;
            n-=3;&lt;br /&gt;
        }   &lt;br /&gt;
        llSetText (&amp;quot;Node(s): &amp;quot;+(string)(1+llGetListLength(repeaters)/3), &amp;lt;1,1,1&amp;gt;, 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor (integer n) {&lt;br /&gt;
        //add detected agents to our list&lt;br /&gt;
        while (~--n) {&lt;br /&gt;
            key id=llDetectedKey(n);&lt;br /&gt;
            if (!~llListFindList(insim, [id]))&lt;br /&gt;
                insim+=id;    &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //clean up agents that are no longer in sim&lt;br /&gt;
        n=llGetListLength(insim);&lt;br /&gt;
        while (~--n)&lt;br /&gt;
            if (llGetAgentSize(llList2Key(insim,n))); else&lt;br /&gt;
                insim=llDeleteSubList(insim,n,n);   &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    no_sensor() {&lt;br /&gt;
        insim=[];&lt;br /&gt;
        /*&lt;br /&gt;
        //clean up agents that are no longer in sim&lt;br /&gt;
        integer n=llGetListLength(insim);&lt;br /&gt;
        while (~--n)&lt;br /&gt;
            if (llGetAgentSize(llList2Key(insim,n))); else&lt;br /&gt;
                insim=llDeleteSubList(insim,n,n);   &lt;br /&gt;
        */&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen (integer channel, string name, key id, string m) {&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        if (!channel) { //channel 0&lt;br /&gt;
            //only relay agents, not objects&lt;br /&gt;
            if (llGetAgentSize(id));else&lt;br /&gt;
                return;&lt;br /&gt;
                &lt;br /&gt;
            //see if another relay is more nearby&lt;br /&gt;
            integer n=0;&lt;br /&gt;
            vector senderpos=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0);&lt;br /&gt;
            float d=llVecDist(senderpos, llGetPos());            &lt;br /&gt;
            while (n&amp;lt;llGetListLength(repeaters)) {&lt;br /&gt;
                if (d&amp;gt;llVecDist(senderpos, llList2Vector(repeaters, n+1)))&lt;br /&gt;
                    return;&lt;br /&gt;
                n+=3;&lt;br /&gt;
            }&lt;br /&gt;
            //We are nearest repeater. Our job to relay.&lt;br /&gt;
            &lt;br /&gt;
            //relay to everyone in range. that&#039;s fixed to minimum 20 mins maximum 60.&lt;br /&gt;
            //get position of chatter&lt;br /&gt;
            vector o=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0);&lt;br /&gt;
        &lt;br /&gt;
            n=llGetListLength(insim);&lt;br /&gt;
            string oname=llGetObjectName();&lt;br /&gt;
            llSetObjectName(name);&lt;br /&gt;
            while (~--n) {&lt;br /&gt;
                vector t=llList2Vector(llGetObjectDetails(llList2Key(insim, n), [OBJECT_POS]), 0);        &lt;br /&gt;
                float d=llVecDist (o,t);&lt;br /&gt;
                if (d&amp;gt;=20/* &amp;amp;&amp;amp; d&amp;lt;=60*/) {&lt;br /&gt;
                    //same parcel?&lt;br /&gt;
                    if (parcelkey==llList2Key(llGetParcelDetails(llList2Vector(llGetObjectDetails(llList2Key(insim,n), [OBJECT_POS]),0), [PARCEL_DETAILS_ID]),0))&lt;br /&gt;
                        llRegionSayTo (llList2Key(insim,n), 0, m);   &lt;br /&gt;
                }&lt;br /&gt;
            }       &lt;br /&gt;
            llSetObjectName(oname);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        if (channel==parcelhandle) {&lt;br /&gt;
            //there&#039;s another repeater..&lt;br /&gt;
            vector pos=llList2Vector(llGetObjectDetails(id, [OBJECT_POS]),0);&lt;br /&gt;
            &lt;br /&gt;
            integer p=llListFindList(repeaters, [id, pos]);&lt;br /&gt;
            if (~p)&lt;br /&gt;
                repeaters=llDeleteSubList(repeaters, p, p+2);&lt;br /&gt;
            repeaters += [id, pos, llGetUnixTime()];&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
--[[User:Tano Toll|Tano Toll]] 19:54, 11 May 2012 (PDT)&lt;/div&gt;</summary>
		<author><name>Rtec Dethly</name></author>
	</entry>
</feed>