-->

FoxSan's 3D Tools and LSL Script Repository

Tons of LSL scripts, examples and 3D tools, free for all. There are currently 207 scripts and articles in this database.

Height Detector (by click)

//Title: Height Detector
//Date:11-16-2003 7:24 PM
//Scripter: Francis Chung
 
default
{
    state_entry()
    {
        llSetStatus(STATUS_PHANTOM, TRUE);
        llSetText( "Touch to find out your height", < 1,1,1>, 1 );
    } 
 
    touch_start(integer total_number)
    {
        key avatar;
        string name;
        vector size;
        vector pos;
        string saeheight = "";
        float heightfeet; 
 
        avatar = llDetectedKey(0);
        size   = llGetAgentSize( avatar );
        name   = llDetectedName(0);
        pos    = llDetectedPos(0); 
 
        heightfeet = size.z * 3.28083;
        saeheight  = (string)((integer) llFloor(heightfeet)) + " feet "; 
 
        heightfeet -= llFloor(heightfeet);
        saeheight  += (string)((integer)(llRound(heightfeet * 12))) + " inches"; 
 
        llSay( 0, name + " is " + (string)size.z + " m (" + saeheight + ") tall. (counting your shoes)" ); 
 
        size.x = 0.5;
        size.y = 0.5;
        llSetScale( size );
        // pos.x += 0.5;
        llSetPos( pos ); 
 
    }
}

Avatar Detector

//
//    SHOP ZERO Tips25 AvatorDetector v1.0
//
//                   Created by Zero2000 Kid     2008/04/06
// 
 
integer input_ch = 34;
integer range=96;
integer handle;
string target;
string simname;
 
output_info (vector v , string name) {
    string pos=(string)v.x + "/" + (string)v.y + "/" + (string)v.z;
    llInstantMessage(llGetOwner(),name+"--> secondlife://"+simname+"/"+pos);
}
 
default {
    state_entry(){
        handle = llListen(input_ch,"",llGetOwner(),"");
    }
 
    on_rez(integer param){
        llResetScript();
    }
 
    listen(integer ch, string name, key id, string message) {
        target=message;
        simname=llGetRegionName();
        llInstantMessage(llGetOwner(),"Searching " + target + " ....");
        llSensor("", NULL_KEY, AGENT, range, PI);
    }
 
    sensor(integer total_number) {
        integer i;
        for (i = 0; i < total_number; i++) {
            if (llSubStringIndex(llToLower(llDetectedName(i)),llToLower(target))!=-1) {
                output_info(llDetectedPos(i),llDetectedName(i));
            }
        }
        llInstantMessage(llGetOwner(),"Searching complete.");
    }
 
    no_sensor() {
        llInstantMessage(llGetOwner(),"Searching complete.");
    }
 
}

Age Detector (volumedetect)

// Get Days Old
// Original b yTravis Lambert -- 10-19-2005 (504 days old) :)  
// Re-Written by Hank Ramos Aug/8/2006
// Some functions by Christopher Omega 10/21/05
 
//Global Variables
list lNames;
 
//User Functions
integer min(integer a, integer b)
{
 if (a > b)
 return b;
 return a;
}
 
integer isLeapYear(integer year)
{
 return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
}
 
integer daysInMonth(integer month, integer year)
{
 if (month < 9) {
 if (month != 2) {
 // Before September, odd numbered months
 // are 31 days long.
 if (month % 2 != 0) {
 return 31;
 } else {
 return 30;
 }
 } else {
 // February is the odd man out.
 if (isLeapYear(year)) {
 return 29;
 } else {
 return 28;
 }
 }
 } else {
 // After August, odd numbered months
 // are 30 days long.
 if (month % 2 != 0) {
 return 30;
 } else {
 return 31;
 }
 }
}
 
float timestampDiff(string t1, string t2)
{
 if (t1 == t2)
 return 0;
 
 float diff = 0;
 integer year1 = (integer) llGetSubString(t1, 0, 3);
 integer year2 = (integer) llGetSubString(t2, 0, 3);
 integer i;
 if (year1 != year2) {
 integer minYear = min(year1, year2);
 integer maxYear = year1;
 if (minYear == year1)
 maxYear = year2;
 float secsBetween;
 secsBetween += 31536000 * (maxYear - minYear);
 for (i = minYear; i < maxYear; ++i) {
 if (isLeapYear(i))
 secsBetween += 86400; // Add extra day.
 }
 if (year2 == maxYear)
 secsBetween *= -1;
 diff += secsBetween;
 }
 
 integer month1 = (integer) llGetSubString(t1, 5, 6);
 integer month2 = (integer) llGetSubString(t2, 5, 6);
 if (month1 != month2) {
 integer month1Secs;
 for (i = 1; i < month1; ++i) {
 // 1 day = 24 hrs * 60 mins * 60 secs
 month1Secs += daysInMonth(i, year1);
 }
 month1Secs *= 86400; // Convert days into secs.
 integer month2Secs;
 for (i = 1; i < month2; ++i) {
 month2Secs += daysInMonth(i, year2);
 }
 month2Secs *= 86400;
 diff += month1Secs - month2Secs;
 }
 // Whew! Now everything past this point should be clear cut
 // conversion directly into seconds.
 integer days1 = (integer) llGetSubString(t1, 8, 9);
 integer days2 = (integer) llGetSubString(t2, 8, 9);
 diff += (days1 - days2) * 86400;
 integer hours1 = (integer) llGetSubString(t1, 11, 12);
 integer hours2 = (integer) llGetSubString(t2, 11, 12);
 diff += (hours1 - hours2) * 3600; //1 hr = 60 mins * 60 secs.
 integer minutes1 = (integer) llGetSubString(t1, 14, 15);
 integer minutes2 = (integer) llGetSubString(t2, 14, 15);
 diff += (minutes1 - minutes2) * 60;
 float secs1 = (float) llGetSubString(t1, 17, -2); // Skip last char.
 float secs2 = (float) llGetSubString(t2, 17, -2);
 diff += secs1 - secs2;
 return diff;
}
 
default
{
 state_entry()
 {
 llSetText(llGetObjectName(), <1,1,1>, 1);
 llVolumeDetect(TRUE);
 }
 
 collision_start(integer num_detected)
 //touch_start(integer num_detected)
 {
 integer x;
 
 //Loop through all the clicks
 for (x = 0; x < num_detected; x++)
 {
 lNames += llRequestAgentData(llDetectedKey(x), DATA_BORN);
 lNames += llDetectedName(x);
 }
 }
 dataserver(key kQueryid, string sData)
 {
 integer x;
 string  sName;
 integer iAge;
 
 //Loop through names in list
 for (x = 0; x < llGetListLength(lNames); x += 2)
 {
 if (kQueryid == llList2Key(lNames, x))
 {
 //Found our request
 sName = llList2Key(lNames, x + 1);
 lNames = llDeleteSubList(lNames, x, x + 1);
 iAge  = llRound(timestampDiff(llGetDate(), sData)/86400);
 if (iAge == 1)
 {
 llSay(0,sName + " is " + (string)iAge + " Day Old!");
 }
 else
 {
 llSay(0,sName + " is " + (string)iAge + " Days Old!");
 }
 }
 }
 }
}