Difference between revisions of "User:Fred Gandt/Scripts"

From Second Life Wiki
Jump to navigation Jump to search
m (sorted the TOC targets out a bit. will split the 36kb page after I walk the dog.)
(Reduced page size. Moving the excess to new page.)
Line 3: Line 3:
{{RightToc|right;}}
{{RightToc|right;}}


== My contributions ==
== My Contributions ==


'''[[Project:Contribution Agreement| The legal stuff about contributing stuff here and about (worth reading).]]'''
=== Other Pages ===
 
'''[[User:Fred_Gandt/Scripts/Continued_1| More Free Scripts]]'''
 
'''[[User:Fred_Gandt/Scripts/Continued_2| Even More Free Scripts]]'''
 
=== Legal Stuff ===
 
'''[[Project:Contribution Agreement| The legal stuff about contributing to this wiki (worth reading).]]'''


'''I have posted these scripts for FREE use. They are not meant to be the most amazing or groundbreaking scripts in all of creation but, you may find something in them useful. They are not perfect (at least I doubt it) but, I have posted them here for FREE use anyway. If you want to use them go ahead. If you sell these scripts, be aware that I think you are scum. You are welcome to use them in products and welcome to rework them and call the results your own but, to sell these as they are when they are freely available would be disgusting.'''
'''I have posted these scripts for FREE use. They are not meant to be the most amazing or groundbreaking scripts in all of creation but, you may find something in them useful. They are not perfect (at least I doubt it) but, I have posted them here for FREE use anyway. If you want to use them go ahead. If you sell these scripts, be aware that I think you are scum. You are welcome to use them in products and welcome to rework them and call the results your own but, to sell these as they are when they are freely available would be disgusting.'''
Line 54: Line 62:
}</lsl>
}</lsl>


=== Script that gives a set amount of L$ to whoever touches the object this script is in ===
'''[[User:Fred_Gandt/Scripts#My_Contributions|Skip Up]]'''


'''TAKE CARE WITH THIS ONE. IT WILL DEDUCT L$ FROM YOUR ACCOUNT ONCE YOU GRANT PERMISSIONS'''
'''[[User:Fred_Gandt/Scripts#Basic_Particle_Candle_Flame_ON.2FOFF|Skip Down]]'''


'''I WAS ASKED TO MAKE IT THIS WAY. IT WAS DESIGNED TO BE REZZED FOR SHORT PERIODS OF TIME'''
=== Basic Alpha (transparency) SHOW/HIDE ===


'''IF TOO MANY AGENTS USE IT THE MEMORY WILL RUN OUT AND IT WILL FAIL'''
<lsl>integer on;


<lsl>key owner; // Global variable to store the owner UUID (key)
key owner; // Store the owners UUID (key)


integer perms; // Global to store the condition of the request for permissions.
string command = "switch"; // Place the command to chat here. The same command will switch on and off.


integer count; // Global counter.
integer channel = 1; // Place channel to use here (must be a positive if an avatar is chatting on it).


list visitors; // This stores the keys of all the agents who take the gift. They will be allowed only one gift.
Switch(integer i)
{
    llSetLinkAlpha(LINK_SET, ((float)i), ALL_SIDES); // This setting will turn a whole link_set transparent or solid.
}


integer ammount = 1; // Change this figure to the required ammount to give away (e.g. 5). Then drop in your object.
default
{
    state_entry()
    {
        owner = llGetOwner();
        llListen(channel, "", owner, command); // This script is listening all the time.
    }  // Switching the listen off at times would be better to reduce lag. But when??
    touch_end(integer nd)
    {
        on = (!on);
        Switch(on); // Blah
    }
    listen(integer chan, string name, key id, string msg)
    {
        on = (!on);
        Switch(on); // Blah
    }
}</lsl>
 
'''[[User:Fred_Gandt/Scripts#Basic_Light_Switch|Skip Up]]'''
 
'''[[User:Fred_Gandt/Scripts#Simple_Alarm_Clock|Skip Down]]'''
 
=== Basic Particle Candle Flame ON/OFF ===
 
'''This script will make the prim it is in a small glowing sphere that sits at the center of the flame.'''
 
<lsl>integer on; // Establish "on" as a global variable so that we can remember whether or not the flame is on.
 
Flame(integer num)
{
    if(num) // Do we or don't we make a flame? Num is either TRUE or FALSE (1 or 0).
    {
        llParticleSystem([PSYS_PART_FLAGS, 275, // Make the flame since the condition above was met.
        PSYS_SRC_PATTERN, 4,
        PSYS_PART_START_ALPHA, 0.6,
        PSYS_PART_END_ALPHA, 0.0,
        PSYS_PART_START_COLOR, <1.0, 1.0, 0.3>,
        PSYS_PART_END_COLOR, <0.8, 0.6, 0.6>,
        PSYS_PART_START_SCALE, <0.04, 0.07, 0.0>,
        PSYS_PART_END_SCALE, <0.04, 0.04, 0.0>,
        PSYS_PART_MAX_AGE, 0.3,
        PSYS_SRC_MAX_AGE, 0.0,
        PSYS_SRC_ACCEL, <0.0, 0.0, 0.02>, // These are the parameters of the particle effect.
        PSYS_SRC_ANGLE_BEGIN, 0.0,
        PSYS_SRC_ANGLE_END, 0.0,
        PSYS_SRC_BURST_PART_COUNT, 50,
        PSYS_SRC_BURST_RATE, 0.07,
        PSYS_SRC_BURST_RADIUS, 0.0,
        PSYS_SRC_BURST_SPEED_MIN, 0.001,
        PSYS_SRC_BURST_SPEED_MAX, 0.4,
        PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>,
        PSYS_SRC_TARGET_KEY,(key)"",
        PSYS_SRC_TEXTURE, ""]);
        llSetPrimitiveParams([PRIM_POINT_LIGHT, TRUE, <1.0, 0.8, 0.3>, 0.5, 20.0, 1.9,  // For extra effect we switch the light on too.
                              PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, 0.1, // And set the transparency to slightly visible.
                              PRIM_GLOW, ALL_SIDES, 0.1]); // And the glow to slight.
    }
    else // Num was not 1 (TRUE) so we need to stop the effect or not start it.
    {
        llParticleSystem([]); // Make no particles (no flame).
        llSetPrimitiveParams([PRIM_POINT_LIGHT, FALSE, ZERO_VECTOR, 0.0, 0.0, 0.0,  // Switch the light off.
                              PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, 0.0, // And set the transparency to invisible.
                              PRIM_GLOW, ALL_SIDES, 0.0]); // And the glow to zero.
    }
    on = num; // Establish the value of the global variable "on" as being equal to the task we just performed. This acts as our memory.
}


default
default // Create a state for the code to run in.
{
{
     on_rez(integer param)
     state_entry() // On entering that state make the candle flame ignite.
     {
     {
         llResetScript(); // Clear all lists and reset all variables. This action will also clear the permissions.
         llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, 0, <0.0,1.0,0.0>, 0.0, ZERO_VECTOR, <0.0,1.0,0.0>, // Make the prim a sphere.
                              PRIM_SIZE, <0.01,0.01,0.03>, // Make the prim the right size to act as the glowing center of the flame.
                              PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, ZERO_VECTOR, ZERO_VECTOR, 0.0]); // Set the blank texture.
        Flame(TRUE); // Flame(TRUE); Is an order to run the code "Flame" with the integer value "TRUE" (numerical value = 1).
     }
     }
     changed(integer change)
     touch_end(integer detected) // Detect if we have touched the candle.
     {
     {
         if(change & CHANGED_OWNER) // If the script or object changes ownership the script will not be able
         Flame(!on); // We now order that the Flame() code is run with the integer value that is the oposite of what it already is.
         llResetScript();          // to deduct cash from the previous owners account.
         // (!on) = FALSE if on = TRUE and TRUE if on = FALSE. The "!" means "not".
     }
     }
     state_entry()
}</lsl>
 
'''[[User:Fred_Gandt/Scripts#Basic_Alpha_.28transparency.29_SHOW.2FHIDE|Skip Up]]'''
 
'''[[User:Fred_Gandt/Scripts#Create_HUD_Mouselook_Button|Skip Down]]'''
 
=== Simple Alarm Clock ===
 
'''Good for reminding you about sandbox returns etc.'''
 
<lsl>string sound = "5e1d5f52-e7ae-0194-a412-93a96f39ff6f"; // Name of the sound in the object inventory.
                                                      // Or the UUID of any sound.
float time;
 
integer on;
 
vector active = <0.0,1.0,0.0>;
 
vector passive = <0.0,0.0,1.0>;
 
vector alarmed = <1.0,0.0,0.0>;
 
default
{
     on_rez(integer param)
     {
     {
         owner = llGetOwner(); // Store the owners key.
         llResetScript();
        llRequestPermissions(owner, PERMISSION_DEBIT); // !! THIS MEANS IT WILL TAKE YOUR MONEY !!
     }
     }
     run_time_permissions(integer perm)
     state_entry()
     {
     {
         if(perm & PERMISSION_DEBIT) // Have we got the permissions we requested?
         llSetColor(passive, ALL_SIDES);
        perms = TRUE; // Store the result of success.
        else
        llRequestPermissions(owner, PERMISSION_DEBIT); // If not we ask for them again.
     }
     }
     touch_end(integer nd)
     touch_end(integer nd)
     {
     {
         do // Loop through the detected touchers to cover the rare cases when
         if(on)
         { // more than one agent touches the object at the same time.
         {
             key toucher = llDetectedKey(count);
             llStopSound();
             if(llListFindList(visitors, [toucher]) == -1) // Check if the agent has touched us before by searching the list for a match.
            llResetScript();
        }
        else
        {
             float time_in_minutes = ((float)llGetObjectDesc()); // Write the time in minutes expressed as a float
            time = (time_in_minutes * 60);                      // in the object description before clicking to start.
            if(time < 1.0)
             {
             {
                 if(perms) // Check if we have permissions.
                 llOwnerSay("The time is not set.\nPlease write the time into the object description and try again");
                {
                return;
                    llGiveMoney(toucher, ammount); // Ker-ching!!
                    visitors += [toucher]; // That's all buster! NEXT!!
                }
             }
             }
            llSetColor(active, ALL_SIDES);
            llSetTimerEvent(time);
            on = TRUE;
         }
         }
         while((++count) < nd); // Increment the counter and loop while it is less than the number of touchers detected.
    }
         count = 0; // Reset the counter.
    timer()
    {
         llSetTimerEvent(0.0);
        llLoopSound(sound, 1.0);
         llSetColor(alarmed, ALL_SIDES);
     }
     }
}</lsl>
}</lsl>


=== Script to make the Mouselook button show at the bottom of your screen ===
'''[[User:Fred_Gandt/Scripts#Basic_Particle_Candle_Flame_ON.2FOFF|Skip Up]]'''
 
'''[[User:Fred_Gandt/Scripts#Float_on_Water_.28like_a_marker_buoy.29|Skip Down]]'''
 
=== Create HUD Mouselook Button ===


<lsl>key owner;
<lsl>key owner;
Line 138: Line 252:
}</lsl>
}</lsl>


=== Script that makes the object it is in float on water (like a marker buoy)===
'''[[User:Fred_Gandt/Scripts#Simple_Alarm_Clock|Skip Up]]'''
 
'''[[User:Fred_Gandt/Scripts#Visit_Web_Address_Dialog|Skip Down]]'''
 
=== Float on Water (like a marker buoy) ===


<lsl>float offset = 0.0; // Use this float to offset the height of the object in relation to the water surface.
<lsl>float offset = 0.0; // Use this float to offset the height of the object in relation to the water surface.
Line 154: Line 272:
}</lsl>
}</lsl>


=== Very Basic Alpha (transparency) ON/OFF script ===
'''[[User:Fred_Gandt/Scripts#Create_HUD_Mouselook_Button|Skip Up]]'''


<lsl>integer on;
'''[[User:Fred_Gandt/Scripts#AO_Overriding_Sit_Script|Skip Down]]'''


key owner; // Store the owners UUID (key)
=== Visit Web Address Dialog ===


string command = "switch"; // Place the command to chat here. The same command will switch on and off.
'''If you have a website use something like this to direct people to it.'''


integer channel = 1; // Place channel to use here (must be a positive if an avatar is chatting on it).
<lsl>string URL_Loader_Message = "\nCopy FREE scripts from an SL wiki page"; // Message to show on dialog.


Switch(integer i)
string URL_To_Visit = "https://wiki.secondlife.com/wiki/User:Fred_Gandt/Scripts"; // URL to visit.
{
    llSetLinkAlpha(LINK_SET, ((float)i), ALL_SIDES); // This setting will turn a whole link_set transparent or solid.
}


default
vector Omega_Axis = <0.0,0.0,1.0>; // If you don't want spinning set this to <0.0,0.0,0.0>;
{
    state_entry()
    {
        owner = llGetOwner();
        llListen(channel, "", owner, command); // This script is listening all the time.
    }  // Switching the listen off at times would be better to reduce lag. But when??
    touch_end(integer nd)
    {
        on = (!on);
        Switch(on); // Blah
    }
    listen(integer chan, string name, key id, string msg)
    {
        on = (!on);
        Switch(on); // Blah
    }
}</lsl>


=== Scripts for multi prim drawers (2 scripts) ===
float Omega_Speed = 0.5; // Speed of spin.


'''Could also be used for doors etc.'''
float Omega_Gain = 1.0; // Strength of spin.


==== Instructions (copy to NC or Script) ====
string Floating_Text = "FREE SCRIPTS!!\n \nTouch to visit web site.\n \n(Official SL wiki)\n \n "; // Floating text.


<lsl>// INSTRUCTIONS FOR USE (there are two scripts that make up the set)
vector Float_Text_Color = <1.0,1.0,1.0>; // Color of floating text.


// Make your chest of drawers and link the whole set together with the body (any prim that doesn't move) of the chest as the root.
float Float_Text_Alpha = 1.0; // Transparency of floating text (1.0 is solid).


// Name every prim used as a part of a drawer (include handles, drawer fronts, bases etc.) "drawer " plus a number.
// FROM THIS POINT IT IS SCARY!! ARRGGGHHHH...!!! //
 
// All the prims of one drawer should now all be named the same. e.g. "drawer 1".
 
// Name every drawer a different number. e.g. "drawer 1", "drawer 2" etc.
 
// With all the parts named correctly, edit the object so that all the drawers are closed.
 
// At this point you might want to take a copy.
 
// Be sure that no prims are named "drawer (something)" unless they are supposed to be (according to the above).
 
// Drop both the scripts (at the same time) into the root of the object.
 
// You will get further instructions in local chat. Follow them.</lsl>
 
==== Drawer Script ====
 
<lsl>// This script needs to be named "Linkypooz".
 
vector open;
 
vector closed;
 
integer OPEN;
 
key owner;
 
integer my_response_num;
 
integer my_link_num;
 
Drawer()
{
    vector pos;
    if(OPEN)
    pos = closed;
    else
    pos = open;
    llSetPos(pos);
    OPEN = (!OPEN);
}


default
default
Line 245: Line 302:
     state_entry()
     state_entry()
     {
     {
         owner = llGetOwner();
         llTargetOmega(Omega_Axis, Omega_Speed, Omega_Gain);
         closed = llGetLocalPos();
         llSetText(Floating_Text, Float_Text_Color, Float_Text_Alpha);
     }
     }
     touch_start(integer nd)
     touch_start(integer nd)
     {
     {
        if(llDetectedKey(0) == owner)
         integer count = 0;
        {
            open = llGetLocalPos();
            llSetPos(closed);
            state normal;
        }
    }
}
state normal
{
    state_entry()
    {
        my_link_num = llGetLinkNumber();
        my_response_num = ((integer)llGetSubString(llGetLinkName(my_link_num), 7, -1));
        llOwnerSay(" is active!");
    }
    touch_start(integer nd)
    {
        if(my_link_num == 1)
        {
            llRemoveInventory(llGetScriptName());
        }
        llMessageLinked(LINK_SET, my_response_num, "", "");
    }
    link_message(integer sender, integer num, string str, key id)
    {
        if(num == my_response_num)
        {
            Drawer();
        }
    }
}</lsl>
 
==== Script Delivery Script ====
 
<lsl>// This script can be called "cats ass" for all I care! lolz.
 
default
{
    state_entry()
    {
         integer count;
        integer links = llGetNumberOfPrims();
         do
         do
         {
         {
             string name = llGetLinkName(count);
             key toucher = llDetectedKey(count);
             if(llGetSubString(name, 0, 5) == "drawer")
             llLoadURL(toucher, URL_Loader_Message, URL_To_Visit);
            {
                key link_key = llGetLinkKey(count);
                llGiveInventory(link_key, "Linkypooz");
            }
         }
         }
         while((++count) < (links + 1));
         while((++count) < nd);
        llOwnerSay("\n\nNow take the object to inventory and re-rez.
        \n\nOpen an edit on the object.
        \n\nGo to the tools menu and, at the bottom of the menu click \"Set Scripts Running in Selection\".
        \n\nEdit all the prims of the drawers from the closed position to the open position.
        \n\nWhen all the prims of the drawers are set open, touch each prim(you can do one prim at a time or all together, which ever you prefer).
        \n\nWhen the prim is touched it will automatically close.
        \n\nWhen all the prims of all the drawers are in the closed position the scripts are fully set up.
        \n\nThey will chat that they are active when ready.
        \n\nNow touch the root (or any other non drawer prim) and the script in it will self delete.
        \n\nThat's all!!");
        llRemoveInventory(llGetScriptName());
     }
     }
}</lsl>
}</lsl>


=== Group Joiner that sets it's self to whatever group you are wearing as it is rezzed or created ===
'''[[User:Fred_Gandt/Scripts#Float_on_Water_.28like_a_marker_buoy.29|Skip Up]]'''


<lsl>key group_key;
'''[[User:Fred_Gandt/Scripts#Region_Stats_as_Floating_Text|Skip Down]]'''
Function()
{
    group_key = llList2Key(llGetObjectDetails(llGetKey(), [OBJECT_GROUP]), 0);
    if(group_key != NULL_KEY)
    llHTTPRequest("http://world.secondlife.com/group/" + ((string)group_key), [], "");
    else
    {
        llSay(0, "Since you are not wearing a group tag I am not set to any group.
        \nWear a group tag and try again.
        \nThis script will self delete.");
        llRemoveInventory(llGetScriptName());
    }
}
default
{
    state_entry()
    {
        Function();
    }
    on_rez(integer param)
    {
        Function();
    }
    http_response(key q, integer status, list metadata, string body)
    {
        if(status == 200)
        {
            integer name_start = (llSubStringIndex(body, "<title>") + 7);
            integer name_end = (llSubStringIndex(body, "</title>") - 1);
            integer tex_key_start = (llSubStringIndex(body, "imageid") + 18);
            integer tex_key_end = (tex_key_start + 35);
            string group_name = llGetSubString(body, name_start, name_end);
            llSetObjectName("Join " + group_name);
            key group_tex = llGetSubString(body, tex_key_start, tex_key_end);
            if(group_tex != NULL_KEY)
            llSetTexture(group_tex, ALL_SIDES);
            else
            llSetTexture(TEXTURE_BLANK, ALL_SIDES);
        }
        else
        {
            llHTTPRequest("http://world.secondlife.com/group/" + ((string)group_key), [], "");
        }
    }
    touch_start(integer nd)
    {
        llSay(0, "/me by clicking this link\nsecondlife:///app/group/" + ((string)group_key) + "/about");
    }
}</lsl>


=== Tip Jar with ability to pay a percentage to the founder of the group the object is set to ===
=== AO Overriding Sit Script ===


'''Might be a bit buggy because I wrote it while 1/2 asleep. I'll check later.'''
<lsl>integer sit_target; // Used to store whether or not a sit target is applied.


'''UNDER CERTAIN CONDITIONS (That you set and agree to) THIS SCRIPT WILL TAKE MONEY FROM YOUR ACCOUNT'''
key sitter; // Used to stor the UUID (key) of the avatar we are animating.


<lsl>key owner;
integer perm; // Used to store whether or not we have permissions we ask for.


integer debit_perms = FALSE;
string anim_name; // Used to store the name of the animation we have in the objects inventory.


integer pay_price = 0;
vector pose_offset = <0.0,0.0,0.01>; // This must be a non zero value.
//  The X,Y,Z values denote by how much in meters or parts thereof the avatars palvis is offset from the center of the prim.


list pay_buttons = [20, 50, 100, 250];
vector pose_rotation = <0.0,0.0,0.0>; // This can be a zero value.
 
// The X,Y,Z values denote the rotation in degrees that the animation is rotated around the avatars pelvis.
integer percentage = 50; // Percentage to pay to the founder of the group the object is set to.
 
key beneficiary;
 
string default_message = "/me is very grateful for the generous contribution from ";
 
string beneficiary_message = "% of which has been paid to the founder of ";
 
key group_key;
 
string group_name;
 
Function()
{
    owner = llGetOwner();
    string owner_name = llKey2Name(owner);
    string object_name = (owner_name + "'s Money Box");
    llSetObjectName(object_name);
    llSetPayPrice(pay_price, pay_buttons);
    if(percentage)
    llRequestPermissions(owner, PERMISSION_DEBIT);
}


default
default
Line 413: Line 341:
     on_rez(integer param)
     on_rez(integer param)
     {
     {
         Function();
         llResetScript(); // Clean the script when we rez the object.
     }
     }
     state_entry()
     state_entry()
     {
     {
         Function();
         // This will get the name of an animation in the prims inventory and store it.
    }
        anim_name = llGetInventoryName(INVENTORY_ANIMATION, 0);
    run_time_permissions(integer perms)
         if(anim_name != "")
    {
         if(perms & PERMISSION_DEBIT)
         {
         {
             debit_perms = TRUE;
             llSitTarget(pose_offset, llEuler2Rot(pose_rotation*DEG_TO_RAD)); // Set the sit target.
            group_key = llList2Key(llGetObjectDetails(llGetKey(), [OBJECT_GROUP]), 0);
             sit_target = TRUE; // We have a sit target.
             if(group_key != NULL_KEY)
            llHTTPRequest("http://world.secondlife.com/group/" + ((string)group_key), [], "");
         }
         }
         else
         else
         llRequestPermissions(owner, PERMISSION_DEBIT);
         {
            llSitTarget(ZERO_VECTOR, ZERO_ROTATION); // Remove any stored sit target.
            llOwnerSay("There is no animation in my inventory. Please add an animation so I can work properly."); // Inform owner.
        }
     }
     }
     http_response(key q, integer status, list metadata, string body)
     changed(integer change)
     {
     {
         if(status == 200)
         if(change & CHANGED_LINK) // Sense that the object has an added link (may be an avater).
         {
         {
             integer name_start = (llSubStringIndex(body, "<title>") + 7);
             if(sit_target)
             integer name_end = (llSubStringIndex(body, "</title>") - 1);
             {
            integer founder_key_start = (llSubStringIndex(body, "founderid") + 20);
                sitter = llAvatarOnSitTarget(); // If it is an avatar store the UUID (key).
            integer founder_key_end = (founder_key_start + 35);
                if(sitter) // Check if the sitter is still sitting.
            beneficiary = llGetSubString(body, founder_key_start, founder_key_end);
                llRequestPermissions(sitter, PERMISSION_TRIGGER_ANIMATION); // If sitting get permission to animate.
            group_name = llGetSubString(body, name_start, name_end);
                else
                { // The sitter must have got up or something else changed.
                    if(perm) // If we have permissions then an avatar must have stood up.
                    {
                        llStopAnimation(anim_name); // Make sure the sit animation we play is stopped when the avatar stands.
                        llResetScript(); // Remove the permissions we had and clean the script.
                    }
                }
            }
         }
         }
         else
         if(change & CHANGED_INVENTORY)
         {
         {
             llHTTPRequest("http://world.secondlife.com/group/" + ((string)group_key), [], "");
             llResetScript(); // If the animation is changed reset the script to get its name.
         }
         }
     }
     }
     money(key id, integer amount)
     run_time_permissions(integer perms) // Use the permissions.
     {
     {
        string message = "";
         if(perms & PERMISSION_TRIGGER_ANIMATION) // If we have the permissions we asked for.
        integer dividend;
        string payer = llKey2Name(id);
         if(!percentage)
         {
         {
             message = (default_message + payer);
             perm = TRUE; // Remember that we have the permissions.
        }
             if(sitter) // If the avatar is still sitting.
        else
        {
            dividend = llFloor((((float)amount)/100.0) * ((float)percentage)); // I'm very tired and my eyes are sticky!
             if(dividend)
             {
             {
                 if(debit_perms)
                 llStopAnimation("sit"); // Stop the default linden sit animation.
                llSleep(0.2); // Slow it down a bit. This gives time for the avatar animation list to be sit specific.
                integer count = 0;
                list anims = llGetAnimationList(sitter); // Get a list of animations the avatar is playing.
                integer length = llGetListLength(anims); // Get the length of that list.
                do
                 {
                 {
                     message = (default_message + payer + ".\n" + ((string)percentage) + beneficiary_message + group_name);
                     string anim = llList2String(anims, count); // Pick the animation from the list of animations at index count.
                     llGiveMoney(beneficiary, dividend);
                     if(anim != "")
                }
                     llStopAnimation(anim); // Stop the animation.
                else
                {
                     message = (default_message + payer);
                 }
                 }
                while((++count) < length);
                llStartAnimation(anim_name); // Animate the sitting avatar using our inventory animation.
             }
             }
         }
         }
        llSay(PUBLIC_CHANNEL, message);
     }
     }
}</lsl>
}</lsl>


=== Region Stats as floating text ===
'''[[User:Fred_Gandt/Scripts#Visit_Web_Address_Dialog|Skip Up]]'''
 
'''[[User:Fred_Gandt/Scripts#Configurable_Unpacker|Skip Down]]'''
 
=== Region Stats as Floating Text ===


<lsl>string bar = "||";
<lsl>string bar = "||";
Line 531: Line 466:
     }
     }
}</lsl>
}</lsl>
'''[[User:Fred_Gandt/Scripts#AO_Overriding_Sit_Script|Skip Up]]'''
'''[[User:Fred_Gandt/Scripts#My_Contributions|Top of Page]]'''


=== Configurable Unpacker ===
=== Configurable Unpacker ===
'''Honestly I haven't tested this at all. IM Fred Gandt if it gives you problems.'''


<lsl>key owner;
<lsl>key owner;
Line 668: Line 605:
}</lsl>
}</lsl>


=== Give dialog offering a push button to visit the URL of your choice ===
'''[[User:Fred_Gandt/Scripts#My_Contributions|Top of Page]]'''
 
'''If you have a website you can direct people there with something like this'''
 
<lsl>string URL_Loader_Message = "\nCopy FREE scripts from an SL wiki page"; // Message to show on dialog.
 
string URL_To_Visit = "https://wiki.secondlife.com/wiki/User:Fred_Gandt/Scripts"; // URL to visit.
 
vector Omega_Axis = <0.0,0.0,1.0>; // If you don't want spinning set this to <0.0,0.0,0.0>;
 
float Omega_Speed = 0.5; // Speed of spin.
 
float Omega_Gain = 1.0; // Strength of spin.
 
string Floating_Text = "FREE SCRIPTS!!\n \nTouch to visit web site.\n \n(Official SL wiki)\n \n "; // Floating text.
 
vector Float_Text_Color = <1.0,1.0,1.0>; // Color of floating text.
 
float Float_Text_Alpha = 1.0; // Transparency of floating text (1.0 is solid).
 
// FROM THIS POINT IT IS SCARY!! ARRGGGHHHH...!!! //
 
default
{
    state_entry()
    {
        llTargetOmega(Omega_Axis, Omega_Speed, Omega_Gain);
        llSetText(Floating_Text, Float_Text_Color, Float_Text_Alpha);
    }
    touch_start(integer nd)
    {
        integer count = 0;
        do
        {
            key toucher = llDetectedKey(count);
            llLoadURL(toucher, URL_Loader_Message, URL_To_Visit);
        }
        while((++count) < nd);
    }
}</lsl>
 
=== Alarm Clock (simple) ===
 
'''Good for reminding you about sandbox returns etc.'''
 
<lsl>string sound = "5e1d5f52-e7ae-0194-a412-93a96f39ff6f"; // Name of the sound in the object inventory.
                                                      // Or the UUID of any sound.
float time;
 
integer on;
 
vector active = <0.0,1.0,0.0>;
 
vector passive = <0.0,0.0,1.0>;
 
vector alarmed = <1.0,0.0,0.0>;
 
default
{
    on_rez(integer param)
    {
        llResetScript();
    }
    state_entry()
    {
        llSetColor(passive, ALL_SIDES);
    }
    touch_end(integer nd)
    {
        if(on)
        {
            llStopSound();
            llResetScript();
        }
        else
        {
            float time_in_minutes = ((float)llGetObjectDesc()); // Write the time in minutes expressed as a float
            time = (time_in_minutes * 60);                      // in the object description before clicking to start.
            if(time < 1.0)
            {
                llOwnerSay("The time is not set.\nPlease write the time into the object description and try again");
                return;
            }
            llSetColor(active, ALL_SIDES);
            llSetTimerEvent(time);
            on = TRUE;
        }
    }
    timer()
    {
        llSetTimerEvent(0.0);
        llLoopSound(sound, 1.0);
        llSetColor(alarmed, ALL_SIDES);
    }
}</lsl>
 
=== Floating text left/right alignment ===
 
'''THIS IS A FIRST DRAFT AND IS A LITTLE MORE INTENSIVE THAN I HOPE TO MAKE IT'''
 
'''This script can turn a list of individual lines of text into a left or right aligned floating text display'''
 
<lsl>// SetTextAlign // Begin //
// Thank you to Silicon Plunkett for the following list of "samples" the script uses to measure the width of the strings.
// He made a great effort to work these values out and I would have been at a massive disadvantage without them.
// This may never have existed.
list samples = [" ", "![]{}|:;'.,ijlIJ", "\/<>`()rtf", "*#\"yszxcvETYLZ", "_?upahkbnRPAFKCV", "~$^+qeodgmDB", "w=QUOSGHXN", "%WM", "@"];
string SetTextAlign(integer A, integer D, list S)
{
    list result = [];
    string separate = "";
    if(A)
    {
        list scores = [];
        list scores_max = [];
        string line = "";
        string sample = "";
        string letter = "";
        string spaces = "";
        string to_pad = "";
        float score = 0.0;
        float max_score = 0.0;
        float next = 0.0;
        integer length = 0;
        integer s_length = 0;
        integer count = 0;
        integer count_a = 0;
        integer count_b = 0;
        integer count_c = 0;
        integer ssi = 0;
        integer padem = 0;
        integer space_count = 0;
        separate = "\n";
        length = llGetListLength(S);
        do
        {
            line = llList2String(S, count);
            s_length = llStringLength(line);
            count_a = 0;
            score = 0.0;
            do
            {
                letter = llGetSubString(line, count_a, count_a);
                count_b = 0;
                do
                {
                    count_c = 0;
                    do
                    {
                        sample = llList2String(samples, count_c);
                        ssi = llSubStringIndex(sample, letter);
                        if(ssi != -1)
                        {
                            if(count_c == 0)
                            score += 1.0;
                            else if(count_c == 1)
                            score += 1.5;
                            else if(count_c == 2)
                            score += 2.0;
                            else if(count_c == 3)
                            score += 2.5;
                            else if(count_c == 4)  // Thanx to some advice from a veritable genius ( Xzaviar Qarnac ) -
                            score += 3.0;          // - I have realised something very important about loops.
                            else if(count_c == 5)  // Since this realization I have cut out alot of potential drag.
                            score += 3.5;          // Thank you Xzaviar.
                            else if(count_c == 6)
                            score += 4.0;
                            else if(count_c == 7)
                            score += 4.5;
                            else
                            score += 5.0;
                            count_c = 9;    // This line is what I realized was needed.
                        }
                        else
                        {
                            ; // Not sure yet. I'll think of something! lolz
                        }
                    }
                    while((++count_c) < 9);
                }
                while((++count_b) < 1);
            }
            while((++count_a) < s_length);
            scores += [score];
        }
        while((++count) < length);
        scores_max = llListSort(scores, 1, FALSE);
        max_score = llList2Float(scores_max, padem);
        scores_max = [];
        do
        {
            next = llList2Float(scores, padem);
            spaces = "";
            space_count = 0;
            do
            {
                spaces += " ";
            }
            while((((float)(++space_count)) + next) < max_score);
            to_pad = llList2String(S, padem);
            if(D)
            result += [(to_pad + spaces)];
            else
            result += [(spaces + to_pad)];
        }
        while((++padem) < length);
        scores = [];
    }
    else
    result = S;
    return llDumpList2String(result, separate);
}
// SetTetAlign // End //
default
{
    state_entry()
    {
        float alpha = 1.0;
        vector color = <0.0,1.0,1.0>; // Turquoise!
// The text to display must be fed to the function as a list of strings each being one line (as below).
        list source = ["Hello there, Avatar!", "My script can align your text to the left or right.", "Touch me for a copy of it."];
        llSetText(SetTextAlign(TRUE, TRUE, source), color, alpha);
// SetTextAlign(Align (TRUE or FALSE), Direction (TRUE = left : FALSE = right), source).
 
// I will be adding a couple of extra features to this very soon.
    }
    touch_start(integer nd)
    {
        integer countnd = 0;
        do
        {
            key toucher = llDetectedKey(countnd);
            llGiveInventory(toucher, llGetScriptName()); // FREE!!! Enjoy.
        }
        while((++countnd) < nd);
    }
}</lsl>
 
=== AO overriding sit script ===
 
<lsl>integer sit_target; // Used to store whether or not a sit target is applied.
 
key sitter; // Used to stor the UUID (key) of the avatar we are animating.
 
integer perm; // Used to store whether or not we have permissions we ask for.
 
string anim_name; // Used to store the name of the animation we have in the objects inventory.
 
vector pose_offset = <0.0,0.0,0.01>; // This must be a non zero value.
//  The X,Y,Z values denote by how much in meters or parts thereof the avatars palvis is offset from the center of the prim.
 
vector pose_rotation = <0.0,0.0,0.0>; // This can be a zero value.
// The X,Y,Z values denote the rotation in degrees that the animation is rotated around the avatars pelvis.
 
default
{
    on_rez(integer param)
    {
        llResetScript(); // Clean the script when we rez the object.
    }
    state_entry()
    {
        // This will get the name of an animation in the prims inventory and store it.
        anim_name = llGetInventoryName(INVENTORY_ANIMATION, 0);
        if(anim_name != "")
        {
            llSitTarget(pose_offset, llEuler2Rot(pose_rotation*DEG_TO_RAD)); // Set the sit target.
            sit_target = TRUE; // We have a sit target.
        }
        else
        {
            llSitTarget(ZERO_VECTOR, ZERO_ROTATION); // Remove any stored sit target.
            llOwnerSay("There is no animation in my inventory. Please add an animation so I can work properly."); // Inform owner.
        }
    }
    changed(integer change)
    {
        if(change & CHANGED_LINK) // Sense that the object has an added link (may be an avater).
        {
            if(sit_target)
            {
                sitter = llAvatarOnSitTarget(); // If it is an avatar store the UUID (key).
                if(sitter) // Check if the sitter is still sitting.
                llRequestPermissions(sitter, PERMISSION_TRIGGER_ANIMATION); // If sitting get permission to animate.
                else
                { // The sitter must have got up or something else changed.
                    if(perm) // If we have permissions then an avatar must have stood up.
                    {
                        llStopAnimation(anim_name); // Make sure the sit animation we play is stopped when the avatar stands.
                        llResetScript(); // Remove the permissions we had and clean the script.
                    }
                }
            }
        }
        if(change & CHANGED_INVENTORY)
        {
            llResetScript(); // If the animation is changed reset the script to get its name.
        }
    }
    run_time_permissions(integer perms) // Use the permissions.
    {
        if(perms & PERMISSION_TRIGGER_ANIMATION) // If we have the permissions we asked for.
        {
            perm = TRUE; // Remember that we have the permissions.
            if(sitter) // If the avatar is still sitting.
            {
                llStopAnimation("sit"); // Stop the default linden sit animation.
                llSleep(0.2); // Slow it down a bit. This gives time for the avatar animation list to be sit specific.
                integer count = 0;
                list anims = llGetAnimationList(sitter); // Get a list of animations the avatar is playing.
                integer length = llGetListLength(anims); // Get the length of that list.
                do
                {
                    string anim = llList2String(anims, count); // Pick the animation from the list of animations at index count.
                    if(anim != "")
                    llStopAnimation(anim); // Stop the animation.
                }
                while((++count) < length);
                llStartAnimation(anim_name); // Animate the sitting avatar using our inventory animation.
            }
        }
    }
}</lsl>
 
=== Basic particle candle flame ON/OFF script ===
 
'''This script will make the prim it is in a small glowing sphere that sits at the center of the flame.'''
 
<lsl>integer on; // Establish "on" as a global variable so that we can remember whether or not the flame is on.
 
Flame(integer num)
{
    if(num) // Do we or don't we make a flame? Num is either TRUE or FALSE (1 or 0).
    {
        llParticleSystem([PSYS_PART_FLAGS, 275, // Make the flame since the condition above was met.
        PSYS_SRC_PATTERN, 4,
        PSYS_PART_START_ALPHA, 0.6,
        PSYS_PART_END_ALPHA, 0.0,
        PSYS_PART_START_COLOR, <1.0, 1.0, 0.3>,
        PSYS_PART_END_COLOR, <0.8, 0.6, 0.6>,
        PSYS_PART_START_SCALE, <0.04, 0.07, 0.0>,
        PSYS_PART_END_SCALE, <0.04, 0.04, 0.0>,
        PSYS_PART_MAX_AGE, 0.3,
        PSYS_SRC_MAX_AGE, 0.0,
        PSYS_SRC_ACCEL, <0.0, 0.0, 0.02>, // These are the parameters of the particle effect.
        PSYS_SRC_ANGLE_BEGIN, 0.0,
        PSYS_SRC_ANGLE_END, 0.0,
        PSYS_SRC_BURST_PART_COUNT, 50,
        PSYS_SRC_BURST_RATE, 0.07,
        PSYS_SRC_BURST_RADIUS, 0.0,
        PSYS_SRC_BURST_SPEED_MIN, 0.001,
        PSYS_SRC_BURST_SPEED_MAX, 0.4,
        PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>,
        PSYS_SRC_TARGET_KEY,(key)"",
        PSYS_SRC_TEXTURE, ""]);
        llSetPrimitiveParams([PRIM_POINT_LIGHT, TRUE, <1.0, 0.8, 0.3>, 0.5, 20.0, 1.9,  // For extra effect we switch the light on too.
                              PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, 0.1, // And set the transparency to slightly visible.
                              PRIM_GLOW, ALL_SIDES, 0.1]); // And the glow to slight.
    }
    else // Num was not 1 (TRUE) so we need to stop the effect or not start it.
    {
        llParticleSystem([]); // Make no particles (no flame).
        llSetPrimitiveParams([PRIM_POINT_LIGHT, FALSE, ZERO_VECTOR, 0.0, 0.0, 0.0,  // Switch the light off.
                              PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, 0.0, // And set the transparency to invisible.
                              PRIM_GLOW, ALL_SIDES, 0.0]); // And the glow to zero.
    }
    on = num; // Establish the value of the global variable "on" as being equal to the task we just performed. This acts as our memory.
}
 
default // Create a state for the code to run in.
{
    state_entry() // On entering that state make the candle flame ignite.
    {
        llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, 0, <0.0,1.0,0.0>, 0.0, ZERO_VECTOR, <0.0,1.0,0.0>, // Make the prim a sphere.
                              PRIM_SIZE, <0.01,0.01,0.03>, // Make the prim the right size to act as the glowing center of the flame.
                              PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, ZERO_VECTOR, ZERO_VECTOR, 0.0]); // Set the blank texture.
        Flame(TRUE); // Flame(TRUE); Is an order to run the code "Flame" with the integer value "TRUE" (numerical value = 1).
    }
    touch_end(integer detected) // Detect if we have touched the candle.
    {
        Flame(!on); // We now order that the Flame() code is run with the integer value that is the oposite of what it already is.
        // (!on) = FALSE if on = TRUE and TRUE if on = FALSE. The "!" means "not".
    }
}</lsl>

Revision as of 02:58, 8 February 2010

My Contributions

Other Pages

More Free Scripts

Even More Free Scripts

Legal Stuff

The legal stuff about contributing to this wiki (worth reading).

I have posted these scripts for FREE use. They are not meant to be the most amazing or groundbreaking scripts in all of creation but, you may find something in them useful. They are not perfect (at least I doubt it) but, I have posted them here for FREE use anyway. If you want to use them go ahead. If you sell these scripts, be aware that I think you are scum. You are welcome to use them in products and welcome to rework them and call the results your own but, to sell these as they are when they are freely available would be disgusting.

I will be constantly updating this page, adding new scripts and tweaking the scripts already posted (BE AWARE : As I post these scripts I am pretty sure they are correct; however, I occasionally make mistakes like any other biological life form so there may be errors. If an error exists it will be fixed at some point). They may be faster or more efficient or have more features within hours or days of posting so keep coming back for fresh versions. If any of these scripts give you any problems please IM me and I'll see what I can do for you. Similarly if you need quick advice or assistance with understnding LSL give me a call. I do not want your money (so don't treat me like an employee) and I request that your respect my humanity (I may be tired, in a bad mood or even busy working on something else so, don't expect professional politeness; expect honesty).

I am not a tame scriptor. Just because I am charitable do not try to take advantage or you will end up with no help at all. ;-)

Tuition

Tuition scripts, notes, videos and screenshots etc. (hardly any content yet)

I teach in-world at The Builders Brewery. I help out in a few groups and by IM. I will be developing a course of work that will be posted here to accompany my tuition and to act as a stand-alone guide to anyone wanting to grasp the basics of scripting in LSL.

The most important first lesson is this - Don't be afraid to try. It might look like sci-fi gibberish but, in truth it is no more complex than a foreign language written in American-English. IT DOESN'T BITE!

Free Scripts

Basic Light Switch

<lsl>// This script will cause the prim it is in to emit light. // If the prim (or object if the script is in the root of a link_set) // is touched the light will turn off if on and on if off. // The switching code can be used for many different actions.

integer on; // Global variable used to measure the condition 'on or off'.

vector color = <1.0,1.0,1.0>; // R,G,B (red, green, blue) values.

float intensity = 1.0; // 0.0 to 1.0 (1.0 = full brightness)

float radius = 20.0; // 0.1 to 20.0 (20.0 = full sphere)

float falloff = 0.01; // 0.01 to 2.0 (2.0 = least spread)

Switch() // The switching function. I made the switch function to facilitate easier editing. {

   on = (!on); // Flip the boolean value of the integer 'on'.
   llSetPrimitiveParams([PRIM_POINT_LIGHT, on, color, intensity, radius, falloff]);

}

default {

   touch_end(integer nd)
   {
       Switch(); // Unconditionally call the switch to operate.
   }

}</lsl>

Skip Up

Skip Down

Basic Alpha (transparency) SHOW/HIDE

<lsl>integer on;

key owner; // Store the owners UUID (key)

string command = "switch"; // Place the command to chat here. The same command will switch on and off.

integer channel = 1; // Place channel to use here (must be a positive if an avatar is chatting on it).

Switch(integer i) {

   llSetLinkAlpha(LINK_SET, ((float)i), ALL_SIDES); // This setting will turn a whole link_set transparent or solid.

}

default {

   state_entry()
   {
       owner = llGetOwner();
       llListen(channel, "", owner, command); // This script is listening all the time.
   }   // Switching the listen off at times would be better to reduce lag. But when??
   touch_end(integer nd)
   {
       on = (!on);
       Switch(on); // Blah
   }
   listen(integer chan, string name, key id, string msg)
   {
       on = (!on);
       Switch(on); // Blah
   }

}</lsl>

Skip Up

Skip Down

Basic Particle Candle Flame ON/OFF

This script will make the prim it is in a small glowing sphere that sits at the center of the flame.

<lsl>integer on; // Establish "on" as a global variable so that we can remember whether or not the flame is on.

Flame(integer num) {

   if(num) // Do we or don't we make a flame? Num is either TRUE or FALSE (1 or 0).
   {
       llParticleSystem([PSYS_PART_FLAGS, 275, // Make the flame since the condition above was met.
       PSYS_SRC_PATTERN, 4,
       PSYS_PART_START_ALPHA, 0.6,
       PSYS_PART_END_ALPHA, 0.0,
       PSYS_PART_START_COLOR, <1.0, 1.0, 0.3>,
       PSYS_PART_END_COLOR, <0.8, 0.6, 0.6>,
       PSYS_PART_START_SCALE, <0.04, 0.07, 0.0>,
       PSYS_PART_END_SCALE, <0.04, 0.04, 0.0>,
       PSYS_PART_MAX_AGE, 0.3,
       PSYS_SRC_MAX_AGE, 0.0,
       PSYS_SRC_ACCEL, <0.0, 0.0, 0.02>, // These are the parameters of the particle effect.
       PSYS_SRC_ANGLE_BEGIN, 0.0,
       PSYS_SRC_ANGLE_END, 0.0,
       PSYS_SRC_BURST_PART_COUNT, 50,
       PSYS_SRC_BURST_RATE, 0.07,
       PSYS_SRC_BURST_RADIUS, 0.0,
       PSYS_SRC_BURST_SPEED_MIN, 0.001,
       PSYS_SRC_BURST_SPEED_MAX, 0.4,
       PSYS_SRC_OMEGA, <0.0, 0.0, 0.0>,
       PSYS_SRC_TARGET_KEY,(key)"",
       PSYS_SRC_TEXTURE, ""]);
       llSetPrimitiveParams([PRIM_POINT_LIGHT, TRUE, <1.0, 0.8, 0.3>, 0.5, 20.0, 1.9,  // For extra effect we switch the light on too.
                             PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, 0.1, // And set the transparency to slightly visible.
                             PRIM_GLOW, ALL_SIDES, 0.1]); // And the glow to slight.
   }
   else // Num was not 1 (TRUE) so we need to stop the effect or not start it.
   {
       llParticleSystem([]); // Make no particles (no flame).
       llSetPrimitiveParams([PRIM_POINT_LIGHT, FALSE, ZERO_VECTOR, 0.0, 0.0, 0.0,  // Switch the light off.
                             PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, 0.0, // And set the transparency to invisible.
                             PRIM_GLOW, ALL_SIDES, 0.0]); // And the glow to zero.
   }
   on = num; // Establish the value of the global variable "on" as being equal to the task we just performed. This acts as our memory.

}

default // Create a state for the code to run in. {

   state_entry() // On entering that state make the candle flame ignite.
   {
       llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, 0, <0.0,1.0,0.0>, 0.0, ZERO_VECTOR, <0.0,1.0,0.0>, // Make the prim a sphere.
                             PRIM_SIZE, <0.01,0.01,0.03>, // Make the prim the right size to act as the glowing center of the flame.
                             PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, ZERO_VECTOR, ZERO_VECTOR, 0.0]); // Set the blank texture.
       Flame(TRUE); // Flame(TRUE); Is an order to run the code "Flame" with the integer value "TRUE" (numerical value = 1).
   }
   touch_end(integer detected) // Detect if we have touched the candle.
   {
       Flame(!on); // We now order that the Flame() code is run with the integer value that is the oposite of what it already is.
       // (!on) = FALSE if on = TRUE and TRUE if on = FALSE. The "!" means "not".
   }

}</lsl>

Skip Up

Skip Down

Simple Alarm Clock

Good for reminding you about sandbox returns etc.

<lsl>string sound = "5e1d5f52-e7ae-0194-a412-93a96f39ff6f"; // Name of the sound in the object inventory.

                                                      // Or the UUID of any sound.

float time;

integer on;

vector active = <0.0,1.0,0.0>;

vector passive = <0.0,0.0,1.0>;

vector alarmed = <1.0,0.0,0.0>;

default {

   on_rez(integer param)
   {
       llResetScript();
   }
   state_entry()
   {
       llSetColor(passive, ALL_SIDES);
   }
   touch_end(integer nd)
   {
       if(on)
       {
           llStopSound();
           llResetScript();
       }
       else
       {
           float time_in_minutes = ((float)llGetObjectDesc()); // Write the time in minutes expressed as a float
           time = (time_in_minutes * 60);                      // in the object description before clicking to start.
           if(time < 1.0)
           {
               llOwnerSay("The time is not set.\nPlease write the time into the object description and try again");
               return;
           }
           llSetColor(active, ALL_SIDES);
           llSetTimerEvent(time);
           on = TRUE;
       }
   }
   timer()
   {
       llSetTimerEvent(0.0);
       llLoopSound(sound, 1.0);
       llSetColor(alarmed, ALL_SIDES);
   }

}</lsl>

Skip Up

Skip Down

Create HUD Mouselook Button

<lsl>key owner;

default {

   state_entry()
   {
       owner = llGetOwner();
       llRequestPermissions(owner, PERMISSION_TAKE_CONTROLS);
   }
   run_time_permissions(integer perm)
   {
       if(perm & PERMISSION_TAKE_CONTROLS) // Do we have the perms we asked for?
       llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE); // This creates a button at the bottom of the screen
       else                    // that if pressed automatically zooms the camera of the owner into mouselook.
       llRequestPermissions(owner, PERMISSION_TAKE_CONTROLS);
   }
   control(key id, integer this, integer that)
   {                        // Adding various conditions here can change the script behavior in many ways.
       llOwnerSay("Click"); // Do stuff when clicking the left mouse button while in mouselook. Like for guns etc.
   }

}</lsl>

Skip Up

Skip Down

Float on Water (like a marker buoy)

<lsl>float offset = 0.0; // Use this float to offset the height of the object in relation to the water surface. // The object will (when the offset is zero) float with its geometric center at the level of the water surface. default // The offset is a measure of meters and/or parts thereof. {

   state_entry() // Best to set the object in place with your edit tools and then add the script.
   {             // As the code runs it will lock the objects position and attempt to remain there.
       float float_height = (llWater(ZERO_VECTOR) + offset); 
       vector pos = llGetPos();
       llSetStatus(STATUS_PHYSICS, TRUE); // Make the object physical.
       llMoveToTarget(<pos.x, pos.y, float_height>, 0.5); // Have it maintain it's position.
       // Things get more complex if you wanna make a boat. But this is a place to start.
   }

}</lsl>

Skip Up

Skip Down

Visit Web Address Dialog

If you have a website use something like this to direct people to it.

<lsl>string URL_Loader_Message = "\nCopy FREE scripts from an SL wiki page"; // Message to show on dialog.

string URL_To_Visit = "https://wiki.secondlife.com/wiki/User:Fred_Gandt/Scripts"; // URL to visit.

vector Omega_Axis = <0.0,0.0,1.0>; // If you don't want spinning set this to <0.0,0.0,0.0>;

float Omega_Speed = 0.5; // Speed of spin.

float Omega_Gain = 1.0; // Strength of spin.

string Floating_Text = "FREE SCRIPTS!!\n \nTouch to visit web site.\n \n(Official SL wiki)\n \n "; // Floating text.

vector Float_Text_Color = <1.0,1.0,1.0>; // Color of floating text.

float Float_Text_Alpha = 1.0; // Transparency of floating text (1.0 is solid).

// FROM THIS POINT IT IS SCARY!! ARRGGGHHHH...!!! //

default {

   state_entry()
   {
       llTargetOmega(Omega_Axis, Omega_Speed, Omega_Gain);
       llSetText(Floating_Text, Float_Text_Color, Float_Text_Alpha);
   }
   touch_start(integer nd)
   {
       integer count = 0;
       do
       {
           key toucher = llDetectedKey(count);
           llLoadURL(toucher, URL_Loader_Message, URL_To_Visit);
       }
       while((++count) < nd);
   }

}</lsl>

Skip Up

Skip Down

AO Overriding Sit Script

<lsl>integer sit_target; // Used to store whether or not a sit target is applied.

key sitter; // Used to stor the UUID (key) of the avatar we are animating.

integer perm; // Used to store whether or not we have permissions we ask for.

string anim_name; // Used to store the name of the animation we have in the objects inventory.

vector pose_offset = <0.0,0.0,0.01>; // This must be a non zero value. // The X,Y,Z values denote by how much in meters or parts thereof the avatars palvis is offset from the center of the prim.

vector pose_rotation = <0.0,0.0,0.0>; // This can be a zero value. // The X,Y,Z values denote the rotation in degrees that the animation is rotated around the avatars pelvis.

default {

   on_rez(integer param)
   {
       llResetScript(); // Clean the script when we rez the object.
   }
   state_entry()
   {
       // This will get the name of an animation in the prims inventory and store it.
       anim_name = llGetInventoryName(INVENTORY_ANIMATION, 0);
       if(anim_name != "")
       {
           llSitTarget(pose_offset, llEuler2Rot(pose_rotation*DEG_TO_RAD)); // Set the sit target.
           sit_target = TRUE; // We have a sit target.
       }
       else
       {
           llSitTarget(ZERO_VECTOR, ZERO_ROTATION); // Remove any stored sit target.
           llOwnerSay("There is no animation in my inventory. Please add an animation so I can work properly."); // Inform owner.
       }
   }
   changed(integer change)
   {
       if(change & CHANGED_LINK) // Sense that the object has an added link (may be an avater).
       {
           if(sit_target)
           {
               sitter = llAvatarOnSitTarget(); // If it is an avatar store the UUID (key).
               if(sitter) // Check if the sitter is still sitting.
               llRequestPermissions(sitter, PERMISSION_TRIGGER_ANIMATION); // If sitting get permission to animate.
               else
               { // The sitter must have got up or something else changed.
                   if(perm) // If we have permissions then an avatar must have stood up.
                   {
                       llStopAnimation(anim_name); // Make sure the sit animation we play is stopped when the avatar stands.
                       llResetScript(); // Remove the permissions we had and clean the script.
                   }
               }
           }
       }
       if(change & CHANGED_INVENTORY)
       {
           llResetScript(); // If the animation is changed reset the script to get its name.
       }
   }
   run_time_permissions(integer perms) // Use the permissions.
   {
       if(perms & PERMISSION_TRIGGER_ANIMATION) // If we have the permissions we asked for.
       {
           perm = TRUE; // Remember that we have the permissions.
           if(sitter) // If the avatar is still sitting.
           {
               llStopAnimation("sit"); // Stop the default linden sit animation.
               llSleep(0.2); // Slow it down a bit. This gives time for the avatar animation list to be sit specific.
               integer count = 0;
               list anims = llGetAnimationList(sitter); // Get a list of animations the avatar is playing.
               integer length = llGetListLength(anims); // Get the length of that list.
               do
               {
                   string anim = llList2String(anims, count); // Pick the animation from the list of animations at index count.
                   if(anim != "")
                   llStopAnimation(anim); // Stop the animation.
               }
               while((++count) < length);
               llStartAnimation(anim_name); // Animate the sitting avatar using our inventory animation.
           }
       }
   }

}</lsl>

Skip Up

Skip Down

Region Stats as Floating Text

<lsl>string bar = "||";

string RFPS = "Region Frames per Second ";

string RTD = "Region Time Dilation ";

string GetCondition(integer d, integer f) {

   string s = "";
   if(d >= 15 && f >= 15)
   s = "GOOD";
   else if(d >= 10 && f >= 10)
   s = "POOR";
   else if(d >= 5 && f >= 5)
   s = "DIABOLICAL";
   else
   s = "CRASHED?";
   return s;

}

default {

   on_rez(integer param)
   {
       llResetScript();
   }
   state_entry()
   {
       llSetTimerEvent(5.0);
   }
   timer()
   {
       integer count = 0;
       vector color;
       string d = "";
       string f = "";
       string text = "";
       float dilation = (llGetRegionTimeDilation() * 10);
       float FPS = llGetRegionFPS();
       integer mathed_fps = (llRound(FPS*2)/10);
       integer mathed_dilation = llRound(dilation);
       do
       d += bar;
       while((++count) < mathed_dilation);
       count = 0;
       do
       f += bar;
       while((++count) < mathed_fps);
       color = <1.0, (dilation/10), 0.0>;
       text = ("All is  -  " + GetCondition((mathed_dilation * 2), (mathed_fps * 2)) + "\n" + RFPS + f + "\n" + RTD + d);
       llSetText(text, color, 1.0);
   }

}</lsl>

Skip Up

Top of Page

Configurable Unpacker

<lsl>key owner;

string me;

integer open = FALSE;

list folder_contents = [];

string folder_name; // The folder name will establish from the description of the object this script is in.

// CHANGE ONLY THE SETTINGS BELOW //

integer give_this_script = TRUE; // Give this FREE script away with the other contents? Think about it....

integer allow_only_owner = FALSE; // Owner only or open to all?

integer self_delete = FALSE; // Self delete?

integer timed_deletion = FALSE; // Delete immediately after giving contents or hang around a bit?

float deletion_delay = 10.0; // Length of time to hang around in seconds (if timed_deletion is set TRUE)

string display_rez_text = ""; // Floating text on rez?

string localchat_rez_text = ""; // Chatted message on rez?

string ownerchat_rez_text = ""; // Chatted message only to owner on rez?

string display_deletion_text = ""; // Floating text before deletion?

string localchat_deletion_text = ""; // Chatted message before deletion?

string ownerchat_deletion_text = ""; // Chatted message only to owner before deletion?

vector rez_text_color = <1.0,1.0,1.0>; // Color of floating text if set to show on rez.

vector deletion_text_color = <1.0,1.0,1.0>; // Color of floating text if set to show before deletion.

float rez_text_alpha = 1.0; // Transparency of floating text if set to show on rez.

float deletion_text_alpha = 1.0; // Transparency of floating text if set to show before deletion.

// CHANGE ONLY THE SETTINGS ABOVE //

OnRezTextOptionsFunctionThingy(integer o) {

   if(display_rez_text != "")
   llSetText(display_rez_text, rez_text_color, rez_text_alpha);
   if(localchat_rez_text != "")
   llSay(0, localchat_rez_text);
   if(ownerchat_rez_text != "")
   llOwnerSay(ownerchat_rez_text);
   if(!o)
   {
       integer count = 0;
       integer NOI = llGetInventoryNumber(INVENTORY_ALL);
       if(NOI)
       {
           do
           {
               string name = llGetInventoryName(INVENTORY_ALL, count);
               if(name == me)
               {
                   if(give_this_script)
                   folder_contents += [name];
               }
               else
               folder_contents += [name];
           }
           while((++count) < NOI);
       }
       folder_name = llGetObjectDesc();
   }

}

default {

   on_rez(integer param)
   {
       owner = llGetOwner();
       me = llGetScriptName();
       OnRezTextOptionsFunctionThingy(FALSE);
   }
   touch_start(integer nd)
   {
       if(!open)
       {
           integer give = FALSE;
           key toucher = llDetectedKey(0);
           if(allow_only_owner)
           {
               if(toucher == owner)
               give = TRUE;
           }
           else
           {
               give = TRUE;
           }
           if(give)
           {
               open = TRUE;
               llGiveInventoryList(toucher, folder_name, folder_contents);
           }
           if(open)
           {
               if(display_deletion_text != "")
               llSetText(display_deletion_text, deletion_text_color, deletion_text_alpha);
               if(localchat_deletion_text != "")
               llSay(0, localchat_deletion_text);
               if(ownerchat_deletion_text != "")
               llOwnerSay(ownerchat_deletion_text);
               if(self_delete)
               {
                   if(timed_deletion)
                   llSetTimerEvent(deletion_delay);
                   else
                   llDie();
               }
               else
               {
                   open = FALSE;
                   OnRezTextOptionsFunctionThingy(TRUE);
               }
           }
       }
   }
   timer()
   {
       llDie();
   }

}</lsl>

Top of Page