User:Fred Gandt/Scripts

From Second Life Wiki
< User:Fred Gandt
Revision as of 15:18, 29 January 2010 by Fred Gandt (talk | contribs) (Added tip jar script with percentage to group ability/choice thingy.)
Jump to navigation Jump to search

Tuition

Tuition scripts, notes, videos and screenshots etc.

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>

Script that gives a set amount of L$ to whoever touches the object this script is in

TAKE CARE WITH THIS ONE. IT WILL DEDUCT L$ FROM YOUR ACCOUNT ONCE YOU GRANT PERMISSIONS

I WAS ASKED TO MAKE IT THIS WAY. IT WAS DESIGNED TO BE REZZED FOR SHORT PERIODS OF TIME

IF TOO MANY AGENTS USE IT THE MEMORY WILL RUN OUT AND IT WILL FAIL

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

integer perms; // Global to store the condition of the request for permissions.

integer count; // Global counter.

list visitors; // This stores the keys of all the agents who take the gift. They will be allowed only one gift.

integer ammount = 1; // Change this figure to the required ammount to give away (e.g. 5). Then drop in your object.

default {

   on_rez(integer param)
   {
       llResetScript(); // Clear all lists and reset all variables. This action will also clear the permissions.
   }
   changed(integer change)
   {
       if(change & CHANGED_OWNER) // If the script or object changes ownership the script will not be able
       llResetScript();           // to deduct cash from the previous owners account.
   }
   state_entry()
   {
       owner = llGetOwner(); // Store the owners key.
       llRequestPermissions(owner, PERMISSION_DEBIT); // !! THIS MEANS IT WILL TAKE YOUR MONEY !!
   }
   run_time_permissions(integer perm)
   {
       if(perm & PERMISSION_DEBIT) // Have we got the permissions we requested?
       perms = TRUE; // Store the result of success.
       else
       llRequestPermissions(owner, PERMISSION_DEBIT); // If not we ask for them again.
   }
   touch_end(integer nd)
   {
       do // Loop through the detected touchers to cover the rare cases when
       {  // more than one agent touches the object at the same time.
           key toucher = llDetectedKey(count);
           if(llListFindList(visitors, [toucher]) == -1) // Check if the agent has touched us before by searching the list for a match.
           {
               if(perms) // Check if we have permissions.
               {
                   llGiveMoney(toucher, ammount); // Ker-ching!!
                   visitors += [toucher]; // That's all buster! NEXT!!
               }
           }
       }
       while((++count) < nd); // Increment the counter and loop while it is less than the number of touchers detected.
       count = 0; // Reset the counter.
   }

}</lsl>

Script to make the Mouselook button show at the bottom of your screen

<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>

Script that makes the object it is in 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>

Very Basic Alpha (transparency) ON/OFF script

<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>

Scripts for multi prim drawers (2 scripts)

Could also be used for doors etc.

<lsl>// INSTRUCTIONS FOR USE (there are two scripts that make up the set)

// 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.

// Name every prim used as a part of a drawer (include handles, drawer fronts, bases etc.) "drawer " plus a number.

// 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><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 {

   state_entry()
   {
       owner = llGetOwner();
       closed = llGetLocalPos();
   }
   touch_start(integer nd)
   {
       if(llDetectedKey(0) == owner)
       {
           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><lsl>// This script can be called "cats ass" for all I care! lolz.

default {

   state_entry()
   {
       integer count;
       integer links = llGetNumberOfPrims();
       do
       {
           string name = llGetLinkName(count);
           if(llGetSubString(name, 0, 5) == "drawer")
           {
               key link_key = llGetLinkKey(count);
               llGiveInventory(link_key, "Linkypooz");
           }
       }
       while((++count) < (links + 1));
       llOwnerSay("\n\nNow take the object to inventory and re-rez.
       \n\nSet all the prims so that all the drawers are closed.
       \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>

Group Joiner that sets it's self to whatever group you are wearing as it is rezzed or created

<lsl>key group_key;

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 group the object is set to

Might be a bit buggy because I wrote it while 1/2 asleep. I'll check later.

UNDER CERTAIN CONDITIONS (That you set and agree to) THIS SCRIPT WILL TAKE MONEY FROM YOUR ACCOUNT

<lsl>key owner;

integer debit_perms = FALSE;

integer pay_price = 0;

list pay_buttons = [20, 50, 100, 250];

integer percentage = 50; // Percentage to pay to 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 {

   on_rez(integer param)
   {
       Function();
   }
   state_entry()
   {
       Function();
   }
   run_time_permissions(integer perms)
   {
       if(perms & PERMISSION_DEBIT)
       {
           debit_perms = TRUE;
           group_key = llList2Key(llGetObjectDetails(llGetKey(), [OBJECT_GROUP]), 0);
           if(group_key != NULL_KEY)
           llHTTPRequest("http://world.secondlife.com/group/" + ((string)group_key), [], "");
       }
       else
       llRequestPermissions(owner, PERMISSION_DEBIT);
   }
   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 founder_key_start = (llSubStringIndex(body, "founderid") + 20);
           integer founder_key_end = (founder_key_start + 35);
           beneficiary = llGetSubString(body, founder_key_start, founder_key_end);
           group_name = llGetSubString(body, name_start, name_end);
       }
       else
       {
           llHTTPRequest("http://world.secondlife.com/group/" + ((string)group_key), [], "");
       }
   }
   money(key id, integer amount)
   {
       string message = "";
       integer dividend;
       string payer = llKey2Name(id);
       if(!percentage)
       {
           message = (default_message + payer);
       }
       else
       {
           dividend = llFloor((((float)amount)/100.0) * ((float)percentage)); // I'm very tired and my eyes are sticky!
           if(dividend)
           {
               if(debit_perms)
               {
                   message = (default_message + payer + ".\n" + ((string)percentage) + beneficiary_message + group_name);
                   llGiveMoney(beneficiary, dividend);
               }
               else
               {
                   message = (default_message + payer);
               }
           }
       }
       llSay(PUBLIC_CHANNEL, message);
   }

}</lsl>