Difference between revisions of "3D Radar"
Line 15: | Line 15: | ||
<lsl> | <lsl> | ||
////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
// 3D Radar 2. | // 3D Radar 2.5 | ||
// " | // "Oct 15 2008", "18:43:28" | ||
// Creator: Jesse Barnett | // Creator: Jesse Barnett | ||
// Released into the Public Domain | // Released into the Public Domain | ||
Line 25: | Line 25: | ||
integer list_pos; | integer list_pos; | ||
list key_list; | list key_list; | ||
integer key_chan;//Key channel is generated randomly and passed to the scan ball | integer key_chan; //Key channel is generated randomly and passed to the scan ball | ||
integer die_chan = -9423753;//Hey pick your own channels and be sure to paste them into | integer die_chan = -9423753; //Hey pick your own channels and be sure to paste them into | ||
//the scan balls too! | |||
integer key_rem_chan = -49222879; | integer key_rem_chan = -49222879; | ||
default { | default { | ||
Line 52: | Line 52: | ||
for (p = 0; p < iNum; ++p) { | for (p = 0; p < iNum; ++p) { | ||
avKey = llDetectedKey(p); | avKey = llDetectedKey(p); | ||
list_pos = llListFindList(key_list, | list_pos = llListFindList(key_list, (list)avKey); | ||
if (list_pos == -1) { | if (list_pos == -1) { | ||
key_list = ( | key_list += (list) avKey; | ||
key_chan = (integer) llFrand(-1000000) - 1000000; | key_chan = (integer) llFrand(-1000000) - 1000000; | ||
llRezObject("scan ball", llGetPos(), ZERO_VECTOR, ZERO_ROTATION, key_chan); | llRezObject("scan ball", llGetPos(), ZERO_VECTOR, ZERO_ROTATION, key_chan); | ||
Line 63: | Line 63: | ||
} | } | ||
listen(integer c, string name, key id, string msg) { | listen(integer c, string name, key id, string msg) { | ||
integer r = llListFindList(key_list,[msg]); | |||
integer r = llListFindList(key_list,[ | |||
key_list = llDeleteSubList(key_list, r, r); | key_list = llDeleteSubList(key_list, r, r); | ||
} | } | ||
} | } | ||
</lsl> | </lsl> | ||
==Scan Ball Script== | ==Scan Ball Script== | ||
Line 75: | Line 75: | ||
<lsl> | <lsl> | ||
////////////////////////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
// 3D Radar | // 3D Radar 2.5 | ||
// " | // "Oct 15 2008", "18:44:36" | ||
// Creator: Jesse Barnett | // Creator: Jesse Barnett | ||
// Released into the Public Domain | // Released into the Public Domain | ||
Line 105: | Line 105: | ||
else { | else { | ||
avKey = (key) msg; | avKey = (key) msg; | ||
avName = llKey2Name(avKey); | |||
llSensorRepeat("", avKey, AGENT, 96, PI, 1.0); | llSensorRepeat("", avKey, AGENT, 96, PI, 1.0); | ||
llListenRemove(avListen); | llListenRemove(avListen); | ||
Line 111: | Line 112: | ||
sensor(integer n) { | sensor(integer n) { | ||
avPos = llDetectedPos(0); | avPos = llDetectedPos(0); | ||
vector avDivPos = (avPos - rPos) / (96 / 1); //Scan range/Radius of large sphere | |||
vector avDivPos = (avPos - rPos) | |||
avDistance = (integer) llVecDist(rPos, llDetectedPos(0)); | avDistance = (integer) llVecDist(rPos, llDetectedPos(0)); | ||
llSetPos(rPos + avDivPos); | llSetPos(rPos + avDivPos); | ||
Line 123: | Line 119: | ||
no_sensor() { | no_sensor() { | ||
llRegionSay(key_rem_chan, avKey); | llRegionSay(key_rem_chan, avKey); | ||
llDie(); | llDie(); | ||
} | } |
Revision as of 14:47, 15 October 2008
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Scripts have been corrected and working properly now
Rezzes a ball for each avatar in range. Each ball tracks it's on AV and displays distance.
Scanner/Rezzer Script
Place this script in a prim along with the scan ball. When touched it will scan the surrounding area and rezz a ball for each avatar.
Suggestion: Create a sphere with a diameter of 2 meters. Set transparency about 60. Create another sphere about 0.05 diameter, color a dark color and put it in the center of the large prim. Select small prim 1st and then large prim and link them. This will give you a center point to reference. The scan ball script is set to scan for it's avatar to a range of 96 meters.
This formula: vector avDivPos = (avPos - rPos) * 0.010417; Takes the (avatars position - position of scanner) & multiplies by (radius of the distance you want the balls to go(2 meter sphere = 1 meter radius)/scan range(96meters)):
1/96 = approximately 0.010417.
<lsl> ////////////////////////////////////////////////////////////////////////////////////////////////////// // 3D Radar 2.5 // "Oct 15 2008", "18:43:28" // Creator: Jesse Barnett // Released into the Public Domain //////////////////////////////////////////////////////////////////////////////////////////////////////
integer Scan = TRUE; string avKey; integer list_pos; list key_list; integer key_chan; //Key channel is generated randomly and passed to the scan ball integer die_chan = -9423753; //Hey pick your own channels and be sure to paste them into //the scan balls too! integer key_rem_chan = -49222879; default { state_entry() { llSetObjectName("3D Radar"); } touch_start(integer total_number) { if (Scan) { llSensorRepeat("", "", AGENT, 96, PI, 1); key_list =[]; llListen(key_rem_chan, "", "", ""); llOwnerSay("on"); Scan = FALSE; } else { llSensorRemove(); llRegionSay(die_chan, "die"); llOwnerSay("off"); Scan = TRUE; } } sensor(integer iNum) { integer p = 0; for (p = 0; p < iNum; ++p) { avKey = llDetectedKey(p); list_pos = llListFindList(key_list, (list)avKey); if (list_pos == -1) { key_list += (list) avKey; key_chan = (integer) llFrand(-1000000) - 1000000; llRezObject("scan ball", llGetPos(), ZERO_VECTOR, ZERO_ROTATION, key_chan); llSleep(.25); llRegionSay(key_chan, avKey); } } } listen(integer c, string name, key id, string msg) { integer r = llListFindList(key_list,[msg]); key_list = llDeleteSubList(key_list, r, r); } }
</lsl>
Scan Ball Script
Place this script in a prim and then place the prim into the inventory of the Scanner/Rezzer. It will automatically name itself.
Suggestion; Create a sphere prim of 0.05 diameter with glow set about .80. <lsl> ////////////////////////////////////////////////////////////////////////////////////////////////////// // 3D Radar 2.5 // "Oct 15 2008", "18:44:36" // Creator: Jesse Barnett // Released into the Public Domain //////////////////////////////////////////////////////////////////////////////////////////////////////
string avName; integer avDistance; key avKey; integer avListen; integer key_chan; integer die_chan = -9423753; integer key_rem_chan = -49222879; vector avPos; vector rPos; default { state_entry() { llSetObjectName("scan ball"); } on_rez(integer start_param) { rPos = llGetPos(); key_chan = start_param; llListen(die_chan, "", "", ""); avListen = llListen(key_chan, "", "", ""); } listen(integer c, string n, key id, string msg) { if (c == die_chan) llDie(); else { avKey = (key) msg; avName = llKey2Name(avKey); llSensorRepeat("", avKey, AGENT, 96, PI, 1.0); llListenRemove(avListen); } } sensor(integer n) { avPos = llDetectedPos(0); vector avDivPos = (avPos - rPos) / (96 / 1); //Scan range/Radius of large sphere avDistance = (integer) llVecDist(rPos, llDetectedPos(0)); llSetPos(rPos + avDivPos); llSetText(avName + "[" + (string) avDistance + "]", <1, 1, 1 >, 1); } no_sensor() { llRegionSay(key_rem_chan, avKey); llDie(); } } </lsl>