Scripted Attachment Detector.lsl

From Second Life Wiki
Jump to navigation Jump to search

Scripted Attachment Dectector.lsl - Linden Scripting Language (LSL) Version 1.0.2

Description

This script will show up to 16 scripted avatars within the sensor's reach and display their name in hovertext. You may also touch the prim to get a list of the scripted avatars. It can also show their distances. It will reset when rezzed, worn, or transferred to a new owner. It is LSL & Mono compatible.

Please note: It does not show its owner, whether or not they are scripted.

It was written in LSLEditor.

Creator

Contributors

If you modify/improve upon the script, please add your name here.

License

This work is hereby released in Public Domain.

Disclaimer

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Purpose

  • To display a hovertext of which avatars are scripted.

Documentation

Create a prim. Drop this script in. Modify the global user variables. Compile in mono. Attach of leave as rezzed prim. Enjoy.=D

Scripted Attachment Detector.lsl

//***********************************************************************************************************
//                                                                                                          *
//                                     --Scripted Attachment Detector--                                     *
//                                                                                                          *
//***********************************************************************************************************
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)
//Creator: Bobbyb30 Swashbuckler
//Attribution: None required, but it is appreciated.
//Created: December 13, 2009
//Last Modified: December 13, 2009
//Released: Tuesday, December 15, 2009
//License: Public Domain

//Status: Fully Working/Production Ready
//Version: 1.0.2

//Name: Scripted Attachment Detector.lsl
//Purpose: To show scripted avatars within the sensor's radius
//Technical Overview: Uses a sensor and exclusion list.
//Description: This script will shows scripted avatars within the sensor's reach and display their name in hovertext.
//             You may also touch the prim to get a list of the avatars. It can also show their distances. It will
//             reset when rezzed, or first worn.
//Directions: Create a prim. Place this script in the prim. Modify the parameters as needed. Save the script. Enjoy.
//Compatible: Mono & LSL compatible
//Other items required:
//Notes: Uses a sensorrepeat. This will cover up to 16 avatars that are in range.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////
//global user variables, you may change these

//hovertext
vector hovercolor = <1.0,1.0,1.0>;//color of hovertext
float hoveralpha = 1.0;//alpha of hovertext, 1 for solid, or 0 to not show hovertext

//sensor
float range = 96.0;//how far to scan out in meters up to 96...(this is the radius)
float interval = 30.0;//how often to scan for in seconds 

//distance
integer showdistance = TRUE;//TRUE/FALSE whether to show the distance of the avatar next to their name
//example: Billy Joe (4m)

//exclude list
// CaSe does *NOT* matter, but spelling counts!
list exclude = ["John Doe","Santa Clause","Barrack Obama","Homeland Security", "Saddam Hussain","Big Oil"];//'people' to exclude


///////////////////////////////////
//global variables...don't change below
list scriptedavatars;//names of avatars who are scripted
list correctedexclusion;//the exclusion list in lowercase+owner

///////////////////
//user functions, dont change
hovertext(string input)//sets the hovertext
{
    llSetText(input,hovercolor,hoveralpha);
}

default
{
    on_rez(integer start_param)
    {
        if(!llGetAttached())//its not attatched, but was rezzed on the ground
            llResetScript();
    }
    attach(key attached)
    {
        if(attached != NULL_KEY)//they just put it on
            llResetScript();
    }
    state_entry()
    {
        llSensorRepeat("","",AGENT,range,TWO_PI,interval);//scan every so many seconds

        //add owner to exclude list
        exclude += llKey2Name(llGetOwner());

        //correct case on exclude list to lowercase and copy to correctexclusion list
        integer counter;
        integer excludelength = llGetListLength(exclude);
        do
        {
            correctedexclusion += llToLower(llList2String(exclude,counter));//add lowercase version to corrected exclusion
        }while(++counter < excludelength);

        //empty the exclude list to save memory
        exclude = [];//clears exclude list
        llOwnerSay("Scripted Attatchment.lsl (Public Domain 2009) by Bobbyb30 Swashbuckler running.");
        llOwnerSay("I will scan " + (string)llRound(range) + "m every " + (string)llRound(interval) + " seconds.");

    }
    touch_start(integer total_number)
    {
        if(llDetectedKey(0) == llGetOwner())//make sure owner touched
            llOwnerSay("The following avatar(s) have scripted attatchments: \n" +
            llDumpList2String(scriptedavatars,", "));//if you want one per line, do "\n"
    }
    sensor(integer total_number)//avatars were found
    {
        //llOwnerSay((string)llGetListLength(exclude));

        //set scriptedavatars to nothing, and then rebuild list based on new finds
        scriptedavatars = [];//clean up old list

        //build scriptedavatars list
        integer counter;
        vector mypos = llGetPos();//for use in determining distance, faster to call once, though less accurate I guess
        do
        {
            string detectedavatarname = llDetectedName(counter);//avatar name
            if(llListFindList(correctedexclusion,[llToLower(detectedavatarname)]) == -1)//check if they are excluded
            {
                if(llGetAgentInfo(llDetectedKey(counter)) & AGENT_SCRIPTED)//if the agent is scripted, add to list
                {
                    if(showdistance)//if showdistance == TRUE, append detectedavatarname with avatar distance
                        detectedavatarname += "(" + (string)llRound(llVecDist(llDetectedPos(counter),mypos)) + ")";//add avatar distance
                    scriptedavatars += detectedavatarname;//not excluded and scripted so add to list
                }
            }
        }while(++counter < total_number);
        //end of build


        //display scripted avatars in hovertext if any

        //get the length of scriptedavatars list to see if anyone was scripted
        integer scriptedavatarslength = llGetListLength(scriptedavatars);//

        if(scriptedavatarslength)//the list isn't empty so someone must have been scripted
            hovertext("* " + (string)llGetListLength(scriptedavatars) + " scripted avatars found *\n" +
            llDumpList2String(scriptedavatars,"\n"));//set the hovertext to display the scripted avatars, will truncate at x chrs
        else//no scripted avatars found
            hovertext("* No scripted avatars found *");
    }
    no_sensor()//this shouldn't trigger as its meant to be an attatchment, but if no avatars, this will trigger
    {
        hovertext("* No avatars detected *");//display no avatars for hovertext
    }
    changed(integer change)
    {
        if(change & CHANGED_OWNER)//new owner, reset script
            llResetScript();
    }
}