Difference between revisions of "3D Radar"

From Second Life Wiki
Jump to navigation Jump to search
m (Correct indenting tab size)
Line 19: Line 19:
<lsl>
<lsl>
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
// 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>
</lsl>
Line 87: Line 87:
<lsl>
<lsl>
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
// 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
        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
        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)
        {                                                                //(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>
</lsl>
{{LSLC|Library|3D Radar}}
{{LSLC|Library|3D Radar}}

Revision as of 03:44, 8 September 2014


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 {

   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);
   }

} </lsl>

Scan Ball Script

Place this script in a prim and make sure to name it "scan ball". Then place the prim into the inventory of the Scanner/Rezzer.

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; key owner;

default {

   state_entry()
   {
       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();
   }

} </lsl>