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

From Second Life Wiki
Jump to navigation Jump to search
(Added script with notes)
Line 596: Line 596:
=== Enzeroizer (Rotation Fixer) ( V1 ) ===
=== Enzeroizer (Rotation Fixer) ( V1 ) ===


'''This will self seed to all links in a set (object) and after re-rezzing the object and setting the scripts running will set the rotations to whatever they were but with the smallest 3 decimal places made ZERO. e.g. <75.458392, 128,038754, 298.836580> will become <75.458000, 128,038000, 298.836000>. This will make minor rotational drifts that occur due to one of our favorite bugs less of an issue.'''
'''Drop tis into the root of your linked object and it will self seed to all links in a set (object). After re-rezzing the object and setting the scripts running it will set the rotations to whatever they were but with the smallest 3 decimal places made ZERO. e.g. <75.458392, 128,038754, 298.836580> will become <75.458000, 128,038000, 298.836000>. This will make minor rotational drifts that occur due to one of our favorite bugs less of an issue.'''
'''I have done light testing and think it's fine. Make a copy of you object before using this script just in case it goes wrong.'''
'''I have done light testing and think it's fine. Make a copy of you object before using this script just in case it goes wrong.'''
'''I will post an updated version using [[llGetLinkPrimitiveParams]] when server 1.38 is rolled out and actually working.'''
'''I will post an updated version using [[llGetLinkPrimitiveParams]] when server 1.38 is rolled out and actually working.'''

Revision as of 08:16, 10 April 2010

FG jpg.jpg

My Contributions

I have implemented a V# system to make it more obvious if a script is updated. The V# forms part of the title of each script.

If you have any comments about the content of this page please post them HERE

More Pages

Free Scripts (content constantly updating)

More Free Scripts (content constantly updating)

Even More Free Scripts (content constantly updating)

Even More More Free Scripts (this page)

Even More More More Free Scripts (content constantly updating)

Legal Stuff

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

Tuition

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

Free Scripts

Script'n'Chat ( V1 )

This script is useful for presentations like teaching etc. It will post text from notecards in HUD contents at any of the 3 volumes we have ("Whisper", "Say" and "Shout"). It can read from a script (the literary kind of script (it reads notecards)) or convert ad-lib text by using an open NC as a chat window. Explanations to follow.

HUD Maker

First you need the object (as a HUD). Create a two prim link_set and drop the following script on it. That's the basic object. Then add to it two NC's, one called "Chat" and another called "Script". Then add the script from further down this page.

<lsl>// V1 //

default {

   state_entry()
   {
       llSetPrimitiveParams([7,<0.01,0.58,0.04>,
                             8,<0.0,0.0,1.0,0.0>,
                             9,2,0,<0.175,0.825,0.0>,0.0,<0.0,0.0,0.0>,<1.0,1.0,0.0>,<0.0,0.0,0.0>,
                             17,0,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0,1.0,0.0>,<0.0,0.0,0.0>,0.0,
                             17,1,"51519f67-926a-3301-ee64-db65c0cf1b39",<1.0,0.15,0.0>,<0.74,0.0,0.0>,0.0,
                             17,2,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0,1.0,0.0>,<0.0,0.0,0.0>,0.0,
                             17,3,"0a24d0af-47a5-c7a1-e18d-2b19c5ada706",<1.0,0.15,0.0>,<0.27,0.43,0.0>,0.0,
                             17,4,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0,1.0,0.0>,<0.0,0.0,0.0>,0.0,
                             17,5,"0a24d0af-47a5-c7a1-e18d-2b19c5ada706",<0.5,0.15,0.0>,<0.0,-0.415,0.0>,0.0,
                             17,6,"0a24d0af-47a5-c7a1-e18d-2b19c5ada706",<0.5,0.15,0.0>,<0.0,0.0,0.0>,0.0,
                             18,0,<1.0,1.0,1.0>,1.0,
                             18,1,<1.0,0.0,0.0>,1.0,
                             18,2,<1.0,1.0,1.0>,1.0,
                             18,3,<1.0,0.0,0.0>,1.0,
                             18,4,<1.0,1.0,1.0>,1.0,
                             18,5,<1.0,0.0,0.0>,1.0,
                             18,6,<0.0,1.0,0.0>,1.0,
                             19,0,0,0,
                             19,1,0,1,
                             19,2,0,0,
                             19,3,0,1,
                             19,4,0,0,
                             19,5,0,1,
                             19,6,0,1]);
       llSetLinkPrimitiveParams(2, [7,<0.5,0.01,0.04>,
                                    6,<0.0,0.0,0.04>,
                                    8,<-0.000137,0.000137,-0.707107,0.707107>,
                                    9,0,0,<0.375,0.875,0.0>,0.9,<0.0,0.0,0.0>,<1.0,1.0,0.0>,<0.0,0.0,0.0>,
                                    17,0,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0,1.0,0.0>,<0.0,0.0,0.0>,0.0,
                                    17,1,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0,1.0,0.0>,<0.0,0.0,0.0>,0.0,
                                    17,2,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0,1.0,0.0>,<0.0,0.0,0.0>,0.0,
                                    17,3,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0,1.0,0.0>,<0.0,0.0,0.0>,0.0,
                                    17,4,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0,1.0,0.0>,<0.0,0.0,0.0>,0.0,
                                    17,5,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0,1.0,0.0>,<0.0,0.0,0.0>,0.0,
                                    17,6,"c8433f60-3070-a4b7-dca3-a8ee279b6cfb",<0.7,0.8,0.0>,<0.0,0.0,0.0>,-1.570796,
                                    17,7,"c8433f60-3070-a4b7-dca3-a8ee279b6cfb",<0.7,0.8,0.0>,<0.0,0.0,0.0>,1.570796,
                                    18,0,<1.0,1.0,1.0>,1.0,
                                    18,1,<1.0,1.0,1.0>,1.0,
                                    18,2,<1.0,1.0,1.0>,1.0,
                                    18,3,<1.0,1.0,1.0>,1.0,
                                    18,4,<0.0,0.0,0.0>,1.0,
                                    18,5,<1.0,1.0,1.0>,1.0,
                                    18,6,<1.0,1.0,1.0>,1.0,
                                    18,7,<1.0,1.0,1.0>,1.0]);
       llRemoveInventory(llGetScriptName());
   }

}</lsl>

The "Script" NC

The NC's can contain empty lines but, they will be ignored. The NC example below has 12 lines and that's what the HUD will tell you but, it will only let you chat 11 of them since 1 line is empty. Each line is any text added without pressing the return key. There are limits to how much text can be chatted in one go. This is a very basic script and those limits need to be worked within. Each line is chatted separately. There is no limit to how long your "Script" can be (up to the maximum a notecard can hold).

<lsl>Confessions of a cigar smoker

I owe to smoking, more or less, Through life the whole of my success; With my Cigar I'm sage and wise - Without, I'm dull as cloudy skies. When smoking all my ideas soar, When not, they sink upon the floor. The greatest men have all been smokers, And so were all the greatest jokers. Then ye who'd bid adieu to care, Come here and smoke it into air.</lsl>

The "Chat" NC

Another NC called "Chat" allows that you can chat from the same object at whatever volume is set. This NC when opened from the HUD inventory and left open on screen when the edit to the object contents is closed acts like a chat window (it can be minimized). Only the first line will be read from it. Add the text to chat and click "save". The next time you want to use that option overwrite the last text. ONE LINE ONLY.

<lsl>Whatever text you want to chat...


</lsl>

Script'n'Chat script

The following is the working script for the HUD. Place it with the NC's in the root contents. It will automatically read the NC "Script" and automatically re-read it if it is changed. Don't change the names of the NC's (I didn't make this a sophisticated script and thus it is a bit sensitive to everything being done correctly).

There are 7 buttons -

  • 2 Arrow buttons for navigating through the "Script" lines. A preview of the selected line is displayed on the HUD.
  • Behind the preview of the selected line to chat is a black background. This is the face to touch to chat the displayed line.
  • 3 buttons marked "WHISPER", "SAY" and "SHOUT". They are the volume selections. The volume selected will be for both "Script"ed chat and "Chat"ed chat.
  • A button marked "CHATTY". This is an on/off button for whether to chat the changes you make to the "Chat" NC. If using that option make sure "CHATTY" is selected (green).

Oh yeah and btw... When you first wear the HUD it will be facing away from you. Turn it around.

<lsl>// V1 //

key CHAT_id;

key SCRIPT_key;

integer line_count;

key SCRIPT_id;

key SCRIPT_L_id;

key NC_L_B_id;

key NC_L_F_id;

integer SCRIPT_L;

string NC_L;

integer volume;

integer chatty;

key owner;

vector green = <0.0,1.0,0.0>;

vector red = <1.0,0.0,0.0>;

Spew(string s) {

   if(!volume)
   llWhisper(0, ("/me \n\n" + s + "\n"));
   else if(volume == 1)
   llSay(0, ("/me \n\n" + s + "\n"));
   else if(volume == 2)
   llShout(0, ("/me \n\n" + s + "\n"));

}

Display(string s) {

   NC_L = s;
   llSetText(("LINE " + ((string)(line_count + 1)) + " of " + ((string)SCRIPT_L) + " -- " + llGetSubString(NC_L, 0, 59) + "..."), <1.0,1.0,1.0>, 1.0);

}

Backward() {

   if(line_count == 0)
   line_count = SCRIPT_L;
   NC_L_B_id = llGetNotecardLine("Script", (--line_count));

}

Forward() {

   if(line_count == (SCRIPT_L - 1))
   line_count = -1;
   NC_L_F_id = llGetNotecardLine("Script", (++line_count));

}

default {

   on_rez(integer param)
   {
       llResetScript();
   }
   state_entry()
   {
       owner = llGetOwner();
       llSetObjectName(llKey2Name(owner));
       llSetText("", ZERO_VECTOR, 0.0);
       volume = 1;
       llSetPrimitiveParams([PRIM_COLOR, 1, red, 1.0,
                             PRIM_COLOR, 3, red, 1.0,
                             PRIM_COLOR, 6, green, 1.0,
                             PRIM_COLOR, 5, red, 1.0]);
       SCRIPT_L_id = llGetNumberOfNotecardLines("Script");
   }
   dataserver(key q, string data)
   {
       if(q == CHAT_id)
       Spew(data);
       else if(q == SCRIPT_L_id)
       {
           SCRIPT_L = ((integer)data);
           line_count = 0;
           NC_L_F_id = llGetNotecardLine("Script", 0);
       }
       else if(q == NC_L_B_id)
       {
           if(data != "")
           Display(data);
           else
           Backward();
       }
       else if(q == NC_L_F_id)
       {
           if(data != "")
           Display(data);
           else
           Forward();
       }
   }
   changed(integer change)
   {
       if(change & CHANGED_INVENTORY)
       {
           if(chatty)
           CHAT_id = llGetNotecardLine("Chat", 0);
           else
           {
               key k = llGetInventoryKey("Script");
               if(k != SCRIPT_key)
               {
                   SCRIPT_key = k;
                   llSetText("", ZERO_VECTOR, 0.0);
                   SCRIPT_L_id = llGetNumberOfNotecardLines("Script");
               }
           }
       }
   }
   touch_start(integer nd)
   {
       integer link = llDetectedLinkNumber(0);
       integer face = llDetectedTouchFace(0);
       if(link == 1)
       {
           list params;
           if(face == 1)
           {
               chatty = (!chatty);
               if(chatty)
               params = [PRIM_COLOR, 1, green, 1.0];
               else
               params = [PRIM_COLOR, 1, red, 1.0];
           }
           else if(face == 3)
           {
               volume = 0;
               params = [PRIM_COLOR, 3, green, 1.0,
                         PRIM_COLOR, 6, red, 1.0,
                         PRIM_COLOR, 5, red, 1.0];
           }
           else if(face == 6)
           {
               volume = 1;
               params = [PRIM_COLOR, 6, green, 1.0,
                         PRIM_COLOR, 3, red, 1.0,
                         PRIM_COLOR, 5, red, 1.0];
           }
           else if(face == 5)
           {
               volume = 2;
               params = [PRIM_COLOR, 5, green, 1.0,
                         PRIM_COLOR, 3, red, 1.0,
                         PRIM_COLOR, 6, red, 1.0];
           }
           llSetPrimitiveParams(params);
       }
       else
       {
           if(face == 7)
           Backward();
           else if(face == 6)
           Forward();
           else if(face == 4)
           Spew(NC_L);
       }
   }

}</lsl>

Anti Spam Greeter ( V1 )

As the name suggests...This is a low spam greeter for use in medium to kinda high traffic areas. To use it place a plain prim in the entrance way of the area being visited. Drop this script onto it. The prim will turn transparent and a type of phantom called "VolumeDetect" which means avatars will pass through it. As they pass through it (even if just a foot dips into it) the script will issue various messages depending on the settings. It can also be used to give a folder of stuff (if wanted) to the visitor. Just add the stuff (LM's, NC's, Freebies etc.) to the prim contents. You can change the contents at any time without needing to do anything to the script (unless you want the messages to change too).

<lsl>// V1 //

// Edit the strings below to set up the messaging.

string personalize = "Welcome to to my shop"; // If empty ( "" ) no personalisation will be used. // If not empty the personalization will prepend the first name of the visitor and the whole will prepend... // ..."IM" and/or "DM" if used. E.g. "Welcome to to my shop Fred." would be chatted to me prepending the IM. // If used, this messages byte count will be added to those of "IM" and "DM".

string IM = "This text will be instant messaged to the visitor."; // If empty ( "" ) no IM will be sent. // This MUST be limited to less than 1024 bytes ( around 300 characters ). // If used, this messages byte count will be added to those of "personalize".

string DM = "This text will appear on the dialog ( blue dropdown with buttons )."; // If empty ( "" ) no Dialog will be sent ( unless there are gifts ). // This MUST be limited to less than 512 bytes ( around 150 characters ). // If used, this messages byte count will be added to those of "personalize".

string GM = "\nSince you're here I wonder if you would like a gift?"; // If there are gifts in the contents... // ...this will append "DM" ( it can be empty ( "" )). If used this will add to the byte count of "DM".

string folder_name = "Folder of Joy!"; // This will be the name of the folder if a gift pack is given.

string notification = "has entered your shop."; // This message with the full name of the visitor prepended will be IMed to you if it is not empty ( "" ).

////////////////////////////////////////////////////////////////////////////////////////////// //////YOU KNOW THE DRILL...DON'T EDIT ANYTHING BELOW UNLESS YOU KNOW WHAT YOU'RE DOING./////// //////////////////////////////////////////////////////////////////////////////////////////////

key owner;

list visitors;

list DB = ["OK"];

list lises;

list inventory;

integer gifts;

integer lis;

integer DC;

RemoveListens(key k) {

   if(k != NULL_KEY)
   {
       integer index = llListFindList(lises, [k]);
       if(index != -1)
       {
           llListenRemove(llList2Integer(lises, (index + 1)));
           lises = llDeleteSubList(lises, index, (index + 1));
       }
   }
   else
   {
       llListenRemove(llList2Integer(lises, 1));
       lises = llDeleteSubList(lises, 0, 1);
   }
   if(!llGetListLength(lises))
   {
       llSetTimerEvent(0.0);
       DC = (llRound(llFrand(-91746382)) - 10000);
   }

}

default {

   state_entry()
   {
       owner = llGetOwner();
       llVolumeDetect(TRUE);
       llSetAlpha(0.0, -1);
       DC = (llRound(llFrand(-91746382)) - 10000);
       integer NOI = llGetInventoryNumber(INVENTORY_ALL);
       if(NOI > 1)
       {
           gifts = TRUE;
           DB = ["Gift Pack", "No Thanks"];
           DM += ("\n" + GM);
           string me = llGetScriptName();
           integer count;
           string name;
           do
           {
               name = llGetInventoryName(INVENTORY_ALL, count);
               if(name != me)
               inventory += [name];
           }
           while((++count) < NOI);
       }
   }
   changed(integer change)
   {
       if(change & (CHANGED_INVENTORY | CHANGED_OWNER))
       llResetScript();
   }
   collision_start(integer nd)
   {
       if(llGetListLength(lises) <= 120)
       {
           integer count;
           do
           {
               key id = llDetectedKey(count);
               string name = llDetectedName(count);
               if(llListFindList(visitors, [id]) == -1)
               {
                   string PM = "";
                   if(personalize != "")
                   PM = ("\n" + personalize + " " + llGetSubString(name, 0, (llSubStringIndex(name, " ") - 1)) + ".\n");
                   if(llGetListLength(visitors) > 200)
                   visitors = llDeleteSubList(visitors, 0, 50);
                   visitors += [id];
                   if(DM != "")
                   {
                       if(gifts)
                       {
                           llSetTimerEvent(60.0);
                           lis = llListen((++DC), name, id, "");
                           lises += [id, lis];
                       }
                       llDialog(id, (PM + DM), DB, DC);
                   }
                   if(IM != "")
                   llInstantMessage(id, (PM + IM));
                   if(notification != "")
                   llInstantMessage(owner, (name + " " + notification));
               }
           }
           while((++count) < nd);
       }
   }
   listen(integer chan, string name, key id, string msg)
   {
       if(msg == "Gift Pack")
       llGiveInventoryList(id, folder_name, inventory);
       RemoveListens(id);
   }
   timer()
   {
       RemoveListens(NULL_KEY);
   }

}</lsl>

Grid Status Updater ( V10 )

Checks the Second Life Grid Status every ten minutes to see if there are any new issues. If there are it will IM you.

Drop this script onto any prim that is currently not expected to do something else (e.g. a wall or floor etc) and let it run. If it is in an attachment it will work fine but, only while you are logged in. The script will maintain the name of the prim (or object if in a root) but when sending an update will use a special name set by you. This is simply more aesthetically pleasing. Getting an update from "Ceiling Fan" can seem a little odd.

<lsl>// V10 //

string feed_url = "http://status.secondlifegrid.net/feed/";

string alert_name = "Grid Status Update"; // The name for the prim when it sends an update.

string my_proper_name; // Used to store the "normal" name of the prim.

key owner;

string last;

key iq;

default {

   state_entry()
   {
       my_proper_name = llGetObjectName();
       owner = llGetOwner();
       llSetTimerEvent(600.0);
       iq = llHTTPRequest(feed_url, [], "");
   }
   timer()
   {
       iq = llHTTPRequest(feed_url, [], "");
   }
   http_response(key q, integer status, list meta, string body)
   {
       if(q == iq)
       {
           if(status == 200)
           {
               integer index;
               body = llGetSubString(body, (llSubStringIndex(body, "<item>") + 6), -1);
               string latest = llStringTrim(llGetSubString(body, (llSubStringIndex(body, "<description><![CDATA[") + 22),
                               (llSubStringIndex(body, "]]></description>") - 1)), STRING_TRIM);
               if(latest != last)
               {
                   last = latest;
                   while(index != -1)
                   {
                       index = llSubStringIndex(latest, "’");
                       if(index != -1)
                       latest = llInsertString(llDeleteSubString(latest, index, (index + 6)), index, "'");
                   }
                   index = 0;
                   while(index != -1)
                   {
                       index = llSubStringIndex(latest, ">");
                       if(index != -1)
                       latest = llInsertString(llDeleteSubString(latest, index, (index + 4)), index, ">");
                   }
                   index = 0;
                   while(index != -1)
                   {
                       index = llSubStringIndex(latest, "&");
                       if(index != -1)
                       latest = llInsertString(llDeleteSubString(latest, index, (index + 4)), index, "&");
                   }
                   index = llSubStringIndex(latest, "[...]");
                   if(index != -1)
                   latest = llInsertString(llDeleteSubString(latest, index, (index + 4)), index, "...");
                   string issue = llGetSubString(body, (llSubStringIndex(body, "<title>") + 7), (llSubStringIndex(body, "</title>") - 1));
                   string dnt = llGetSubString(body, (llSubStringIndex(body, "<pubDate>") + 9), (llSubStringIndex(body, "</pubDate>") - 10));
                   string date = (llGetSubString(dnt, 0, -7) + " (UTC)");
                   string time = llGetSubString(dnt, -5, -1);
                   llSetObjectName(alert_name);
                   llInstantMessage(owner, "/me \n\nISSUE --> " + issue + 
                                           "\n\nTIME --> " + time + ", " + date +
                                           "\n\nLATEST --> " + latest +
                                           "\n\nVISIT --> " + llGetSubString(feed_url, 0, -6));
                   llSetObjectName(my_proper_name);
               }
           }
           else
           {
               llSleep(60.0);
               iq = llHTTPRequest(feed_url, [], "");
           }
       }
   }

}</lsl>

Touch Texture Setter ( V2 )

Fill out the UUID for the texture to set. Drop the script in the prim to texture. The texture then sets on each face touched. A long held touch will delete the script.

<lsl>// V2 //

key texture_uuid = "f05755e7-d31c-116d-9cf2-a4840bdfc56b";

integer tc;

key owner;

default {

   state_entry()
   {
       owner = llGetOwner();
   }
   touch_end(integer nd)
   {
       while(nd)
       {
           if(llDetectedKey(--nd) == owner)
           {
               tc = 0;
               llSetTexture(texture_uuid, llDetectedTouchFace(nd));
           }
       }
   }
   touch(integer nd)
   {
       while(nd)
       {
           if(llDetectedKey(--nd) == owner)
           {
               if((++tc) == 20)
               llRemoveInventory(llGetScriptName());
           }
       }
   }

}</lsl>

Enzeroizer (Rotation Fixer) ( V1 )

Drop tis into the root of your linked object and it will self seed to all links in a set (object). After re-rezzing the object and setting the scripts running it will set the rotations to whatever they were but with the smallest 3 decimal places made ZERO. e.g. <75.458392, 128,038754, 298.836580> will become <75.458000, 128,038000, 298.836000>. This will make minor rotational drifts that occur due to one of our favorite bugs less of an issue. I have done light testing and think it's fine. Make a copy of you object before using this script just in case it goes wrong. I will post an updated version using llGetLinkPrimitiveParams when server 1.38 is rolled out and actually working.

<lsl>// V1 //

SelfSeed() {

   integer links_in_set = llGetObjectPrimCount(llGetKey());
   integer count = 2;
   do
   {
       key link = llGetLinkKey(count);
       llGiveInventory(link, llGetScriptName());
   }
   while((++count) <= links_in_set);

}

Enzeroize() {

   vector rot = (llRot2Euler(llGetLocalRot())*RAD_TO_DEG);
   string X = ((string)rot.x);
   string Y = ((string)rot.y);
   string Z = ((string)rot.z);
   llSetLocalRot(llEuler2Rot(<((float)(llDeleteSubString(X, -3, -1) + "000")),
                              ((float)(llDeleteSubString(Y, -3, -1) + "000")),
                              ((float)(llDeleteSubString(Z, -3, -1) + "000"))>*DEG_TO_RAD));

}

default {

   state_entry()
   {
       if(llGetLinkNumber() == 1)
       {
           SelfSeed();
           Enzeroize();
           llOwnerSay("\nTake me to your inventory and re-rez me." +
                      "\nThen open an edit on me and goto your \"Tools\" menu." +
                      "\nNear the bottom of the menu click \"Set Scripts Running In Selection\"." +
                      "\nAll the scripts will self delete after Enzeroizing.");
       }
       else
       Enzeroize();
       llRemoveInventory(llGetScriptName());
   }

}</lsl>

More Scripts...

Free Scripts (content constantly updating)

More Free Scripts (content constantly updating)

Even More Free Scripts (content constantly updating)

Even More More Free Scripts (this page)

Even More More More Free Scripts (content constantly updating)

If you have any comments about the content of this page please post them HERE