Difference between revisions of "3D Radar"
(New page: == 3D Radar == Rezzes a ball for each avatar in range. Each ball tracks it's on AV and displays distance. <pre> </pre> <pre> </pre> {{LSLC|Library|3D Radar}}) |
|||
Line 3: | Line 3: | ||
Rezzes a ball for each avatar in range. Each ball tracks it's on AV and displays distance. | 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. | |||
<pre> | <pre> | ||
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,[avKey]); | |||
if (list_pos == -1) { | |||
key_list = (key_list =[]) + key_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) { | |||
key remove_key = msg; | |||
integer r = llListFindList(key_list,[remove_key]); | |||
llDeleteSubList(key_list, r, r); | |||
} | |||
} | |||
</pre> | </pre> | ||
==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. | |||
<pre> | <pre> | ||
string avName; | |||
string 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; | |||
llSensorRepeat("", avKey, AGENT, 96, PI, 1.0); | |||
llListenRemove(avListen); | |||
} | |||
} | |||
sensor(integer n) { | |||
avPos = llDetectedPos(0); | |||
integer name = TRUE; | |||
if (name) { | |||
avName = llDetectedName(0); | |||
name = FALSE; | |||
} | |||
vector avDivPos = (avPos - rPos) * 0.010417;//Scan range/Radius of large sphere | |||
avDistance = (string) llVecDist(rPos, llDetectedPos(0)); | |||
llSetPos(rPos + avDivPos); | |||
llSetText(avName + "[" + avDistance + "]", <1, 1, 1 >, 1); | |||
} | |||
no_sensor() { | |||
llRegionSay(key_rem_chan, avKey); | |||
llOwnerSay(avName + " is now out of range."); | |||
llDie(); | |||
} | |||
} | |||
</pre> | </pre> | ||
{{LSLC|Library|3D Radar}} | {{LSLC|Library|3D Radar}} |
Revision as of 19:03, 28 November 2007
3D Radar
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.
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,[avKey]); if (list_pos == -1) { key_list = (key_list =[]) + key_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) { key remove_key = msg; integer r = llListFindList(key_list,[remove_key]); llDeleteSubList(key_list, r, r); } }
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.
string avName; string 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; llSensorRepeat("", avKey, AGENT, 96, PI, 1.0); llListenRemove(avListen); } } sensor(integer n) { avPos = llDetectedPos(0); integer name = TRUE; if (name) { avName = llDetectedName(0); name = FALSE; } vector avDivPos = (avPos - rPos) * 0.010417;//Scan range/Radius of large sphere avDistance = (string) llVecDist(rPos, llDetectedPos(0)); llSetPos(rPos + avDivPos); llSetText(avName + "[" + avDistance + "]", <1, 1, 1 >, 1); } no_sensor() { llRegionSay(key_rem_chan, avKey); llOwnerSay(avName + " is now out of range."); llDie(); } }