Difference between revisions of "3D Radar"

From Second Life Wiki
Jump to navigation Jump to search
(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();
	}
}