Difference between revisions of "3D Radar"

From Second Life Wiki
Jump to navigation Jump to search
m (→‎Scan Ball Script: - Removed line of code that names the object. According to the rezzer script, this prim should already be named and the name has no effect on the operation of the script.)
m (Replaced <source> with <syntaxhighlight>; added fancy tip)
 
(5 intermediate revisions by 3 users not shown)
Line 13: Line 13:
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.
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)):
This formula: {{mono|1=vector avDivPos = (avPos - rPos) * 0.010417}}; Takes the {{mono|1=(avatars position - position of scanner)}} & multiplies by {{mono|1=(radius of the distance you want the balls to go(2 meter sphere = 1 meter radius)/scan range(96meters))}}:


1/96 = approximately 0.010417.
1/96 = approximately 0.010417.


<lsl>
<syntaxhighlight lang="lsl2">
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
// 3D Radar 2.5
//               3D Radar 2.5
// "Oct 15 2008", "18:43:28"
//                 "Oct 15 2008", "18:43:28"
// Creator: Jesse Barnett
//                 Creator: Jesse Barnett
// Released into the Public Domain
//               Released into the Public Domain
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
 
integer Scan = TRUE;
integer Scan = TRUE;
string avKey;
string avKey;
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 the scan balls too!
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  
{
{
 
touch_start(integer total_number)  
    touch_start(integer total_number)  
{
    {
if (Scan)  
        if (Scan)  
{
        {
llSensorRepeat("", "", AGENT, 96, PI, 1);
            llSensorRepeat("", "", AGENT, 96, PI, 1);
key_list =[];
            key_list =[];
llListen(key_rem_chan, "", "", "");
            llListen(key_rem_chan, "", "", "");
llOwnerSay("on");
            llOwnerSay("on");
Scan = FALSE;
            Scan = FALSE;
}
        }
else  
        else  
{
        {
llSensorRemove();
            llSensorRemove();
llRegionSay(die_chan, "die");
            llRegionSay(die_chan, "die");
llOwnerSay("off");
            llOwnerSay("off");
Scan = TRUE;
            Scan = TRUE;
}
        }
}
    }
sensor(integer iNum)  
    sensor(integer iNum)  
{
    {
integer p = 0;
        integer p = 0;
for (p = 0; p < iNum; ++p)  
        for (p = 0; p < iNum; ++p)  
{
        {
avKey = llDetectedKey(p);
            avKey = llDetectedKey(p);
list_pos = llListFindList(key_list, (list)avKey);
            list_pos = llListFindList(key_list, (list)avKey);
if (list_pos == -1)  
            if (list_pos == -1)  
{
            {
key_list += (list) avKey;
                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);
llSleep(.25);
                llSleep(.25);
llRegionSay(key_chan, avKey);
                llRegionSay(key_chan, avKey);
}
            }
}
        }
}
    }
listen(integer c, string name, key id, string msg)  
    listen(integer c, string name, key id, string msg)  
{
    {
integer r = llListFindList(key_list,[(key)msg]);
        integer r = llListFindList(key_list,[(key)msg]);
key_list = llDeleteSubList(key_list, r, r);
        key_list = llDeleteSubList(key_list, r, r);
}
    }
}
}
</lsl>
</syntaxhighlight>


==Scan Ball Script==
==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.  
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.
{{Tip|custom=Suggestion:|Create a sphere prim of 0.05 diameter with glow set about .80.}}
<lsl>
<syntaxhighlight lang="lsl2">
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
// 3D Radar 2.5
//               3D Radar 2.5
// "Oct 15 2008", "18:44:36"
//                 "Oct 15 2008", "18:44:36"
// Creator: Jesse Barnett
//                 Creator: Jesse Barnett
// Released into the Public Domain
//               Released into the Public Domain
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////


Line 107: Line 107:
{
{


state_entry()
    state_entry()
{
    {
owner = llGetOwner(); // Lets check to see what the key of the owner of the object is and save it for later
        llSetObjectName("scan ball"); //Renames the object to "scan ball"
}
        owner = llGetOwner(); // Lets check to see what the key of the owner of the object is and save it for later
    }


on_rez(integer start_param)
    on_rez(integer start_param)
{
    {
rPos = llGetPos();
        rPos = llGetPos();
key_chan = start_param;
        key_chan = start_param;
llListen(die_chan, "", "", "");
        llListen(die_chan, "", "", "");
avListen = llListen(key_chan, "", "", "");
        avListen = llListen(key_chan, "", "", "");
}
    }


listen(integer c, string n, key id, string msg)
    listen(integer c, string n, key id, string msg)
{
    {
if (c == die_chan && msg == "die" && owner == llDetectedOwner(0)) //Lets check to see if the message we heard matches all the criteria for the kill command (Right channel, right message and from radar owned by same owner)
        if (c == die_chan && msg == "die" && owner == llDetectedOwner(0)) //Lets check to see if the message we heard matches all the criteria for the kill command
{
        {                                                                //(Right channel, right message and from radar owned by same owner)
llDie();
            llDie();
}
        }
       
else
        else
{
        {
avKey = (key) msg;
            avKey = (key) msg;
avName = llKey2Name(avKey);
            avName = llKey2Name(avKey);
llSensorRepeat("", avKey, AGENT, 96, PI, 1.0);
            llSensorRepeat("", avKey, AGENT, 96, PI, 1.0);
llListenRemove(avListen);
            llListenRemove(avListen);
}
        }
}
    }
   
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) / (96 / 1);   //Scan range/Radius of large sphere
avDistance = (integer) llVecDist(rPos, llDetectedPos(0));
        avDistance = (integer) llVecDist(rPos, llDetectedPos(0));
llSetPos(rPos + avDivPos);
        llSetPos(rPos + avDivPos);
llSetText(avName + "[" + (string) avDistance + "]", <1, 1, 1 >, 1);
        llSetText(avName + "[" + (string) avDistance + "]", <1, 1, 1 >, 1);
}
    }
   
no_sensor()
    no_sensor()
{
    {
llRegionSay(key_rem_chan, avKey);
        llRegionSay(key_rem_chan, avKey);
llDie();
        llDie();
}
    }
}
}
</lsl>
</syntaxhighlight>
{{LSLC|Library|3D Radar}}
{{LSLC|Library|3D Radar}}

Latest revision as of 14:36, 28 January 2023


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.

//////////////////////////////////////////////////////////////////////////////////////////////////////
//                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 
{
 
    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,[(key)msg]);
        key_list = 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.

KBtip2.png Suggestion: Create a sphere prim of 0.05 diameter with glow set about .80.
//////////////////////////////////////////////////////////////////////////////////////////////////////
//                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;
key owner;
 
default
{

    state_entry()
    {
        llSetObjectName("scan ball"); //Renames the object to "scan ball"
        owner = llGetOwner(); // Lets check to see what the key of the owner of the object is and save it for later
    }

    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 && msg == "die" && owner == llDetectedOwner(0)) //Lets check to see if the message we heard matches all the criteria for the kill command
        {                                                                 //(Right channel, right message and from radar owned by same owner)
            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();
    }
}