User:Kireji Haiku/A more complex freebie-giver (setup with notecard)

From Second Life Wiki
< User:Kireji Haiku
Revision as of 13:55, 28 April 2010 by Kireji Haiku (talk | contribs) (added SLURL for pic)
Jump to navigation Jump to search

About this script:


Initial thoughts

  • This script has been provided by Kireji Haiku.
    • It takes a while until you get a hang of the structure. This is my first more complex script.
    • Parts of this script have been taken from this wiki, others of fullperm inworld scripts I have collected.

I wanted to make a freebie- and/or notecard-giver that:


This setup here will give you:

  • A freebie giver, not a vendor.
  • A possibility for people to send an email to multiple recipients without them knowing the addresses. (Ok, you can change that, but I like it that way because I can use a private email-address nobody in SL needs to know about.)
  • A possibility to give a group or anybody multiple arrangements of freebies into folder, without a big hassle.
  • A very easy way to add stuff, once it has been setup. Although I have to say that the initial setup can be a bit nasty.


Have a look at it yourself :)🖈

A more complex freebie-giver (preview).jpg


Go to top!

Setup-guide:

KBcaution.png Important: Please note the BIG DIFFERENCE between the two setups by referring to the script of the main version (eMail-Addresses from notecard, you can make them private or public) and its correspondent with manual input (users have to input address themselves and CAN send an eMail to anybody)
  • Create the final prim you want to use and put in the configuration-notecard. Make sure the name of that notecard ends with ".cfg". Then put the main script inside.
  • Put all stuff you want to give away into the same prim and set all scripts other than the configuration script to "not running".
  • Create a helper-prim for every button you want to use (as it is now, max is 9) and copy a list of the contents into it.
  • Setup your notecard with the help of the script for the helper-prim.
  • Recheck setup, remove spaces around "=" in the notecard between the command and the arguement.
  • This giver will rename itself during the sending process to the user's SL name and after that perform a script-reset. Make sure you have the name you want for your system set up for active status in the notecard. Renaming the prim manually wont do the magic, because the next reset will kill the changes and take the name from notecard again.
  • DO NOT USE ITEMS YOU GIVE AWAY THAT CONTAIN A = IN THEIR NAME! AND BE ADVISED, THAT NAMES ARE CASE SENSITIVE. LONG SETUP NOTECARDS AND A LOT OF ITEMS CAN CRASH THIS SYSTEM EVENTUALLY, SO DON'T OVERDO IT, all'right?
  • If you wonder why all those messages appear after reconfiguring, or why not...try changing the value for debug in the notecard



Use these links to the different parts:



Go to top!

Normal Version

Note!

You're highly advised to read the INTRO first before starting here.

Main Script

You can do anything with this, but please be so kind and leave me a note if you use my work, thanks.

Script to put in desired prim(name doesn't matter here):


<lsl> //SYSTEM PROVIDED BY Kireji Haiku //please send me a note if you use this, thanks. // // // list eMail_list = []; string default_floattext; string object_name; string object_description; string particle_texture; integer GROUPONLY; float timer_writeSubject; float timer_writeBody; float timer_mainmenu; float timer_emailer; float timer_remainButton; float timer_sendMail; key senderKey; string senderName; string subject; string bodyText; list writeButtons; string removeButton; integer i; integer TYPE_OF_TARGET = AGENT; float SCAN_DISTANCE = 25.0; integer STOP_INTERVAL = 20; string CONTROLLER_ID = "control_id";//IF YOU KNOW WHAT THIS IS AND WHAT IT DOES, CHANGE IT ;) integer AUTO_START = TRUE; list particle_parameters=[]; list target_parameters=[]; string scan_for_name; integer attempt_number; integer CHANNEL; string menu_text1 = "Welcome, "; string menu_text2 = ". If you want to send me an eMail click *EMAIL*, otherwise choose your object of desire below."; string option1; string option2; string option3; string option4; string option5; string option6; string option7; string option8; string option9; string info1; string info2; string info3; string info4; string info5; string info6; string info7; string info8; string info9; list list_option1; list list_option2; list list_option3; list list_option4; list list_option5; list list_option6; list list_option7; list list_option8; list list_option9; key name; integer ConfigRequired = TRUE; //DO NOT EVEN THINK ABOUT SETTING UP THE NOTECARD SUFFIX BY NOTECARD :P string ConfigNotecardSuffix = ".cfg";//IF YOU CHANGE THIS, MAKE SURE YOUR NOTECARD HAS THIS SUFFIX float ConfigTimeout = 60.0;//Yes, 60 seconds seems fine to me. integer ConfigLineIndex; key ConfigRequestID; list ConfigCards; string ConfigCardName; integer ConfigCardIndex; integer Debug; integer info_text_enabler;

config_init() {

   default_floattext = "now active";
   object_name = "menu driven giver by Kireji Haiku";//JUST BECAUSE, IT WILL CHANGE ANYWAY, RELAX :)
   particle_texture = "";
   CHANNEL = (integer)llFrand(DEBUG_CHANNEL)*-1;
   timer_writeSubject = 30.0;
   timer_writeBody = 120.0;
   timer_mainmenu = 30.0;
   timer_emailer = 30.0;
   timer_remainButton = 30.0;
   timer_sendMail = 30.0;
   list_option1 = [];
   list_option2 = [];
   list_option3 = [];
   list_option4 = [];
   list_option5 = [];
   list_option6 = [];
   list_option7 = [];
   list_option8 = [];
   list_option9 = [];
   eMail_list = [];
   option1 = "";
   option2 = "";
   option3 = "";
   option4 = "";
   option5 = "";
   option6 = "";
   option7 = "";
   option8 = "";
   option9 = "";
   info1 = "";
   info2 = "";
   info3 = "";
   info4 = "";
   info5 = "";
   info6 = "";
   info7 = "";
   info8 = "";
   info9 = "";
   //NO, I DID NOT FORGET THE DEBUG AND GROUPONLY AND INFO_TEXT_ENABLER
   //AND PLEASE DON'T PUT ANY init() VALUES HERE FOR THEM

}

config_dump() {

   say("eMail-Addresses: >> refer to setup notecard (this is a private list)");
       //IF YOU REALLY WANT THEM PUBLIC CHANGE THIS TO THE NEXT LINE AND WAY-DOWN FOR SENDING EMAIL AGAIN
       //THIS ONLY SHOWS FOR DEBUG==TRUE WHILE THE OTHER WAY
       //WAY-DOWN WILL SHOW IN ANY CASE IF YOU ENABLE IT
       //say("eMail-Addresses: " + llList2CSV(eMail_list));
   say("Floattext: " + default_floattext);
   say("My Name: " + object_name);
   say("My Channel for menu-communication is: " + (string) CHANNEL);
   say("Group-only access is: " + (string) GROUPONLY + "  (1.0 is on, 0.0 is off)");
   say("Debug is currently: " + (string) Debug + " (1.0 is on, 0.0 is off)");
   say("Display INFO-TEXTS is currently: " + (string) info_text_enabler + " (1.0 is on, 0.0 is off)");
   say("Texture for particles: " + particle_texture);
   say("Timer for Subject: " + (string) timer_writeSubject);
   say("Timer for Body: " + (string) timer_writeBody);
   say("Timer for main menu: " + (string) timer_mainmenu);
   say("Timer for eMail: " + (string) timer_emailer);
   say("Timer for Buttons: " + (string) timer_remainButton);
   say("Timer for sending eMail: " + (string) timer_sendMail);
   say("Button1: " + option1);
   if(info_text_enabler)
   {
       say("Info1: " + info1);
   }
   say("Button2: " + option2);
   if(info_text_enabler)
   {
       say("Info2: " + info2);
   }
   say("Button3: " + option3);
   if(info_text_enabler)
   {
       say("Info3: " + info3);
   }
   say("Button4: " + option4);
   if(info_text_enabler)
   {
       say("Info4: " + info4);
   }
   say("Button5: " + option5);
   if(info_text_enabler)
   {
       say("Info5: " + info5);
   }
   say("Button6: " + option6);
   if(info_text_enabler)
   {
       say("Info6: " + info6);
   }
   say("Button7: " + option7);
   if(info_text_enabler)
   {
       say("Info7: " + info7);
   }
   say("Button8: " + option8);
   if(info_text_enabler)
   {
       say("Info8: " + info8);
   }
   say("Button9: " + option9);
   if(info_text_enabler)
   {
       say("Info9: " + info9);
   }
   say("Contents1: " + llList2CSV(list_option1));
   say("Contents2: " + llList2CSV(list_option2));
   say("Contents3: " + llList2CSV(list_option3));
   say("Contents4: " + llList2CSV(list_option4));
   say("Contents5: " + llList2CSV(list_option5));
   say("Contents6: " + llList2CSV(list_option6));
   say("Contents7: " + llList2CSV(list_option7));
   say("Contents8: " + llList2CSV(list_option8));
   say("Contents9: " + llList2CSV(list_option9));
   say("Debug is currently on. Set debug to 0.0 in notecard if you don't like to see this config-note here.");
   say("Current reset time was: " + llGetTimestamp());

}

config_parse(string str, string cardName, integer lineNum) {

   str = llStringTrim(str, STRING_TRIM_HEAD);
   if (llGetSubString(str,0,0) == "//") {
       return;
   }
   list ldata  = llParseStringKeepNulls(str, ["="], [""]);
   string cmd  = llList2String(ldata,0);
   string arg1 = llList2String(ldata,1);
   if (cmd == "@") {
       eMail_list += [arg1];
   } else if (cmd == "float") {
       default_floattext = arg1;
   } else if (cmd == "name") {
       object_name = arg1;
   }  else if (cmd == "texture") {
       particle_texture = arg1;
   } else if (cmd == "timer_writeSubject") {
       timer_writeSubject = (float) arg1;
   } else if (cmd == "timer_writeBody") {
       timer_writeBody = (float) arg1;
   } else if (cmd == "timer_mainmenu") {
       timer_mainmenu = (float) arg1;
   } else if (cmd == "timer_emailer") {
       timer_emailer = (float) arg1;
   } else if (cmd == "timer_remainButton") {
       timer_remainButton = (float) arg1;
   } else if (cmd == "timer_sendMail") {
       timer_sendMail = (float) arg1;
   } else if (cmd == "a") {
       option1 = arg1;
   } else if (cmd == "a_info") {
       info1 = arg1;
   } else if (cmd == "b") {
       option2 = arg1;
   } else if (cmd == "b_info") {
       info2 = arg1;
   } else if (cmd == "c") {
       option3 = arg1;
   } else if (cmd == "c_info") {
       info3 = arg1;
   } else if (cmd == "d") {
       option4 = arg1;
   } else if (cmd == "d_info") {
       info4 = arg1;
   } else if (cmd == "e") {
       option5 = arg1;
   } else if (cmd == "e_info") {
       info5 = arg1;
   } else if (cmd == "f") {
       option6 = arg1;
   } else if (cmd == "f_info") {
       info6 = arg1;
   } else if (cmd == "g") {
       option7 = arg1;
   } else if (cmd == "g_info") {
       info7 = arg1;
   } else if (cmd == "h") {
       option8 = arg1;
   } else if (cmd == "h_info") {
       info8 = arg1;
   } else if (cmd == "i") {
       option9 = arg1;
   } else if (cmd == "i_info") {
       info9 = arg1;
   } else if (cmd == "1") {
       list_option1 += [arg1];
   } else if (cmd == "2") {
       list_option2 += [arg1];
   } else if (cmd == "3") {
       list_option3 += [arg1];
   } else if (cmd == "4") {
       list_option4 += [arg1];
   } else if (cmd == "5") {
       list_option5 += [arg1];
   } else if (cmd == "6") {
       list_option6 += [arg1];
   } else if (cmd == "7") {
       list_option7 += [arg1];
   } else if (cmd == "8") {
       list_option8 += [arg1];
   } else if (cmd == "9") {
       list_option9 += [arg1];
   } else if (cmd == "debug") {
       Debug = (integer) arg1;
   } else if (cmd == "grouponly") {
       GROUPONLY = (integer) arg1;
   } else if (cmd == "display_info_text") {
       info_text_enabler = (integer) arg1;
   }

}

config_done() {

   if (Debug) {
       config_dump();
   }
   say("Configuration done.");

}

say(string str) {

   llSay(0, "Setup process: " + str);

}

integer next_card() {

   if (ConfigCardIndex >= llGetListLength(ConfigCards)) {
       ConfigCards = [];
       return (FALSE);
   }
   ConfigLineIndex = 0;
   ConfigCardName = llList2String(ConfigCards, ConfigCardIndex);
   ConfigCardIndex++;
   ConfigRequestID = llGetNotecardLine(ConfigCardName, ConfigLineIndex);
   say("Reading : " + ConfigCardName);
   return (TRUE);

}

writeSubject() {

   llListen(0, "", senderKey, "");
   llInstantMessage(senderKey, "Please say the subject of your email.");
   llSetTimerEvent(timer_writeSubject);

}

writeBody() {

   llListen(0, "", senderKey, "");
   llInstantMessage(senderKey, "Please say the message you would like to send.");
   llSetTimerEvent(timer_writeBody);

}

removeSubject() {

   i = llListFindList(writeButtons, ["Subject"]);
   writeButtons = llDeleteSubList(writeButtons, i, i);

}

removeMessage() {

   i = llListFindList(writeButtons, ["Message"]);
   writeButtons = llDeleteSubList(writeButtons, i, i);

}

default {

   state_entry() {
       llSetText("", <1.0,1.0,1.0>, 1.0);
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.5,0.5,0.5>, TRUE]);
       llSay(0, "default state...");
       state s_config;
   }
   state_exit() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, TRUE]);
   }

}

state s_reconfig {

   state_entry() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.5,0.5,0.5>, TRUE]);
       llSay(0, "reconfiguring...");
       state s_config;
   }
   state_exit() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, TRUE]);
   }

}

state s_config {

   state_entry() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,0.0,0.0>, TRUE]);
       llSetText("...busy...", <1.0,0.0,0.0>, 1.0);
       llSay(0, "configuring...");
       config_init();
       string item;
       ConfigCards = [];
       integer n = llGetInventoryNumber(INVENTORY_NOTECARD);
       while (n-- > 0) {
           item = llGetInventoryName(INVENTORY_NOTECARD, n);
           if (llSubStringIndex(item, ConfigNotecardSuffix) != -1) {
               ConfigCards += [item];
           }
       }
       ConfigCardIndex = 0;
       if (next_card()) {
           llSetTimerEvent(ConfigTimeout);
       } else if (ConfigRequired) {
           //OK, IF YOU REALLY HAD TO CHANGE THE SUFFIX, YOU MAY AS WELL CHANGE THIS ONE HERE
           say("Configuration notecard missing. Please make sure your notecard ends with .cfg");              
           state s_configRetry;
       } else {
           state s_active;
       }
   }

   dataserver(key query_id, string data) {
       if (query_id == ConfigRequestID) {
           if (data == EOF) {
               if (! next_card()) {
                   config_done();
                   state s_active;
               }
           } else {
               config_parse(data, ConfigCardName, ConfigLineIndex);
               ConfigRequestID = llGetNotecardLine(ConfigCardName, ++ConfigLineIndex);
               llSetTimerEvent(ConfigTimeout);
           }
       }
   }

   timer() {
       say("Dataserver time out: touch to retry");
       state s_configRetry;
   }

   on_rez(integer num) { state s_reconfig; }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { state s_reconfig; }
   }

   state_exit() {
       llSetTimerEvent(0);
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, TRUE]);
       llSay(0, "Ready for use!");
   }

}

state s_configRetry {

   state_entry() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,0.7,0.0>, TRUE]);
       llSetText("Setup failed, touch for retry.", <1.0,0.0,0.0>, 1.0);
       llSay(0, "Setup failed, touch for retry.");
   }
   touch_start(integer tot) {
       if (llDetectedKey(0) == llGetOwner()) {
           state s_config;
       }
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { state s_config; }
   }

   state_exit() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, TRUE]);
       llSetText("", <1.0,1.0,1.0>, 1.0);
   }

}

state s_unconfigured {

   state_entry() {
       llSetText("Configuration missing", <1.0,1.0,1.0>, 1.0);
       llSay(0, "Configuration missing.");
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { state s_reconfig; }
   }

   state_exit() {
       llSetText("", <1.0,1.0,1.0>, 1.0);
   }

}

state s_active {

   state_entry()

{ object_description = "Last reset was: " + llGetTimestamp();

       llSetObjectDesc(object_description);
       llMessageLinked( LINK_SET, FALSE, CONTROLLER_ID, NULL_KEY );
       particle_parameters = [
           PSYS_SRC_TEXTURE, particle_texture,
           PSYS_PART_START_SCALE, <0.1, 0.1, FALSE>, PSYS_PART_END_SCALE, <0.1, 0.1, FALSE>,
           PSYS_PART_START_COLOR, <1.00,1.00,1.00>,    PSYS_PART_END_COLOR, <1.00,1.00,1.00>,
           PSYS_PART_START_ALPHA, (float) 1.0,         PSYS_PART_END_ALPHA, (float) 1.0,
           PSYS_SRC_BURST_PART_COUNT, (integer)  2,
           PSYS_SRC_BURST_RATE,         (float) 0.05,
           PSYS_PART_MAX_AGE,           (float)  10.0,
           PSYS_SRC_PATTERN, (integer) 2,
           PSYS_SRC_ACCEL, < 00.00, 00.00, -00.1>,
           PSYS_PART_FLAGS, (integer) ( 0
           | PSYS_PART_INTERP_COLOR_MASK
           | PSYS_PART_INTERP_SCALE_MASK
           | PSYS_PART_EMISSIVE_MASK
           | PSYS_PART_FOLLOW_VELOCITY_MASK
           | PSYS_PART_WIND_MASK
           | PSYS_PART_TARGET_POS_MASK
           )
               ];
       if ( AUTO_START )
       {
           llParticleSystem( particle_parameters );
       }
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, TRUE]);
       //I would kindly ask you NOT to change the following line
       llSetText(default_floattext + "\n*system provided by Kireji Haiku*", <1.0,1.0,1.0>, 1.0);
       llSetObjectName(object_name);
       writeButtons = ["Subject", "Message"];
       senderKey = llDetectedKey(0);
       llListen(CHANNEL, "", senderKey, "");
   }

   touch_start(integer num)
   {
   integer i=0;
   senderKey = llDetectedKey(i);
   senderName = llKey2Name(llDetectedKey(i));
   if (GROUPONLY) {
       while(i<num)
       {
           key id=llDetectedKey(i);
           if(llSameGroup(id))
           {
               llSay(0, "Please choose from menu.");
               llDialog(senderKey, menu_text1 + senderName + menu_text2, [ option7,option8,option9, option4, option5, option6, option1, option2, option3,"EMAIL" ], CHANNEL );
               llInstantMessage(llGetOwner(), "/me was touched by: " + senderName);
           }
           else
           {

llSay(0, "This only works if you have the right group-tag activated."); llSay(0, "Please try again after changing your group-tag to match my active group."); llSay(0, "You can right-click, edit me and check the general tab to be sure you activated the right one.");

           }
           ++i;
       }
   }
   else {
       llSay(0, "Please choose from menu.");
       llDialog(senderKey, menu_text1 + senderName + menu_text2, [ option7,option8,option9, option4, option5, option6, option1, option2, option3,"EMAIL" ], CHANNEL );
       llInstantMessage(llGetOwner(), "/me was touched by: " + senderName);
   }
   scan_for_name = llKey2Name(llDetectedKey(i));
   attempt_number=1;
   llStringTrim( scan_for_name, STRING_TRIM );
   llSensor( scan_for_name, "", TYPE_OF_TARGET,  SCAN_DISTANCE, TWO_PI );
   llSetTimerEvent(timer_mainmenu);
   }

   listen(integer channel, string name, key id, string message)
   {
       if(message == "EMAIL")
       {

llSay(0, "Currently being used by " + senderName + "."); llSay(0, "Changing state to email_setup ...");

           state emailer;
       }
       if (message == option1)
       {
           llGiveInventoryList(id, option1, list_option1);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option1);

           if(info_text_enabler)

{ llSay(0, "EXTRA INFO: " + info1); }

       }
       if (message == option2)
       {
           llGiveInventoryList(id, option2, list_option2);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option2);

           if(info_text_enabler)

{ llSay(0, "EXTRA INFO: " + info2); }

       }
       if (message == option3)
       {
           llGiveInventoryList(id, option3, list_option3);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option3);

           if(info_text_enabler)

{ llSay(0, "EXTRA INFO: " + info3); }

       }
       if (message == option4)
       {
           llGiveInventoryList(id, option4, list_option4);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option4);

           if(info_text_enabler)

{ llSay(0, "EXTRA INFO: " + info4); }

       }
       if (message == option5)
       {
           llGiveInventoryList(id, option5, list_option5);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option5);

           if(info_text_enabler)

{ llSay(0, "EXTRA INFO: " + info5); }

       }
       if (message == option6)
       {
           llGiveInventoryList(id, option6, list_option6);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option6);

           if(info_text_enabler)

{ llSay(0, "EXTRA INFO: " + info6); }

       }
       if (message == option7)
       {
           llGiveInventoryList(id, option7, list_option7);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option7);

           if(info_text_enabler)

{ llSay(0, "EXTRA INFO: " + info7); }

       }
       if (message == option8)
       {
           llGiveInventoryList(id, option8, list_option8);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option8);

           if(info_text_enabler)

{ llSay(0, "EXTRA INFO: " + info8); }

       }
       if (message == option9)
       {
           llGiveInventoryList(id, option9, list_option9);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option9);

           if(info_text_enabler)

{ llSay(0, "EXTRA INFO: " + info9); }

       }
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait..."); llSetText("",<0,0,0>, 0);

       llMessageLinked( LINK_SET, FALSE, CONTROLLER_ID, NULL_KEY );
       llResetScript();
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   sensor(integer number_of_matches)
   {
       if ( attempt_number == 1 )
       {
           llMessageLinked( LINK_SET, 2, CONTROLLER_ID, llDetectedKey(0) );
           llSetTimerEvent( STOP_INTERVAL );

       }
       else
       {
           integer i;
           scan_for_name = llToLower(scan_for_name);
           for ( i=0; i<number_of_matches; i++)
           {
               if ( llSubStringIndex(llToLower(llDetectedName(i)), scan_for_name) >= 0 )
               {
                   llMessageLinked( LINK_SET, 2, CONTROLLER_ID, llDetectedKey(i) );
                   llSetTimerEvent( STOP_INTERVAL );
                   return;
               }
           }
           llOwnerSay("error: I can't find \""+scan_for_name+"\" within "+(string)SCAN_DISTANCE+"m.");
           llResetScript();
       }
   }

   no_sensor()
   {
       if ( attempt_number == 1 )
       {
           llSensor( "", "", TYPE_OF_TARGET,  SCAN_DISTANCE, TWO_PI );
           attempt_number = 2;
       }
       else
       {
           llMessageLinked( LINK_SET, FALSE, CONTROLLER_ID, NULL_KEY );
           llOwnerSay("error: I can't find anyone named "+scan_for_name+" within "+(string)SCAN_DISTANCE+"m.");
           llResetScript();
       }
   }

   link_message( integer sibling, integer num, string mesg, key target_key )
   {
       if ( mesg != CONTROLLER_ID )
       {
           return;
       }
       else if ( num == 0 )
       {
           llParticleSystem( [ ] );
       }
       else if ( num == 1 )
       {
           llParticleSystem( particle_parameters + target_parameters );
       }
       else if ( num == 2 )
       {
           target_parameters = [ PSYS_SRC_TARGET_KEY, target_key ];
           llParticleSystem( particle_parameters + target_parameters );
       }
       else
       {
           //do nothing
       }
   }

   changed(integer change)
   {
       if (change & CHANGED_LINK)
       {
           integer link = llGetNumberOfPrims();
           key id;
           while(llGetAgentSize(id = llGetLinkKey(link--)))
               {
               llUnSit(id); llSay(0, "Does this look like a chair?");
               }
       }
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

}

state emailer {

   state_entry()
   {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.0,1.0,0.0>, TRUE]);
       if(writeButtons == [])
       {
           state sendMail;
       }
       llListen(CHANNEL, "", llDetectedKey(0), "");
       llSetTimerEvent(timer_emailer);
       llInstantMessage(senderKey, "You have 30 seconds to choose.");
       llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0);
       llDialog(senderKey, "What part of your message would you like to write?", writeButtons, CHANNEL);
   }

   listen(integer channgel, string name, key id, string message)
   {
       if(message == "Subject")
       {
           state subjectWrite;
       }
       else if(message == "Message")
       {
           state messageWrite;
       }
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait...");

       llSetText("",<0,0,0>, 0);
       state default;
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

}

state subjectWrite {

   state_entry()
   {

llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,0.0,0.0>, TRUE]); llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0);

       writeSubject();
   }

   listen(integer channel, string name, key id, string message)
   {
       subject = message;
       removeButton = "Subject";
       state remainButton;
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait...");

       state emailer;
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

}

state messageWrite {

   state_entry()
   {

llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,0.0,0.0>, TRUE]); llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0);

       writeBody();
   }

   listen(integer channel, string name, key id, string message)
   {
       bodyText = message;
       removeButton = "Message";
       state remainButton;
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait...");

       state emailer;
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

}

state remainButton {

   state_entry()
   {

llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.0,0.0,0.0>, TRUE]); llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0);

       llSetTimerEvent(timer_remainButton);
       if(removeButton == "Subject")
       {
           removeSubject();
           state emailer;
       }
       else if(removeButton == "Message")
       {
           removeMessage();
           state emailer;
       }
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait...");

       state emailer;
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

}

state sendMail {

   state_entry()
   {

llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,0.0>, TRUE]); llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0);

       llSetTimerEvent(timer_sendMail);
       llListen(CHANNEL, "", senderKey, "Yes");
       llListen(CHANNEL, "", senderKey, "No");
       llInstantMessage(senderKey, "Your email reads as the followed:");
       //SHOW IF YOU LIKE TO GIVE YOUR MAILADDRESS OR HIDE OTHERWISE
       //llSay(0, "EMAIL-ADDRESSES: " + llList2CSV(eMail_list));
       llInstantMessage(senderKey, "SUBJECT:      " + subject);
       llInstantMessage(senderKey, "EMAIL-TEXT:  " + bodyText);
       llDialog(senderKey, "Do you wish to send this message?", ["Yes","No"], CHANNEL);
   }

   listen(integer channel, string name, key id, string message)
   {
       if(message == "Yes")
       {
           llInstantMessage(senderKey, "I hope you don't mind " + senderName + ", but I will have to assume your name for a moment to send this email.");
           llInstantMessage(senderKey, "Your email will be sent in 20 seconds.");
           llInstantMessage(senderKey, "Thank you " + senderName + ", for using the " + llGetObjectName());
           llSetText("", <0,0,0>, 0);
           llSetObjectName(senderName);
           integer recipient;
           for (recipient = 0; recipient < llGetListLength(eMail_list); recipient++)
               {
                   llEmail(llList2String(eMail_list,recipient), subject, bodyText);
               }
           llInstantMessage(senderKey, "Email has been sent. I'm ready for the next try.");
           state default;
       }
       else if(message == "No")
       {
           llInstantMessage(senderKey, "Thank you " + senderName + ", for using " + llGetObjectName());
           llSetText("", <0,0,0>, 0);
           llInstantMessage(senderKey, "I'm ready for the next try.");
           state default;
       }
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait...");

       state default;
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

} </lsl>


Go to top!

config.cfg Notecard


Notecard to put in desired prim:

  • Keep timer for sending mail above 30 seconds.
  • Use this script to create lists.
  • Any name followed by .cfg is fine.

<lsl> //SYSTEM PROVIDED BY Kireji Haiku //please send me a note if you use this, thanks. // // // //no space before and after "="!!! //comment lines start with two forward slashes //debug is 1.0 or 0.0 //grouponly is 1.0 or 0.0 //display info text is 1.0 or 0.0 // // // @=test_address1@mail.com @=test_address2@mail.com @=test_address3@mail.com float=Notecards for lessons name=Notecard terminal texture=cda52928-37a5-c7cd-23bc-a8e6330ef28c timer_writeSubject=30 timer_writeBody=120 timer_mainmenu=30 timer_emailer=30 timer_remainButton=30 timer_sendMail=45 debug=0.0 grouponly=1.0 display_info_text=0.0 // // // //MENU BUTTON NAMES // // // a=button 1 name b=button 2 name c=button 3 name d=button 4 name e=button 5 name f=button 6 name g=button 7 name h=button 8 name i=button 9 name // // // //INFO TEXTS FOR LOCAL CHAT AFTER PRESSING BUTTON AND RECEIVING INVENTORY LIST // // // a_info=info 1 text b_info=info 2 text c_info=info 3 text d_info=info 4 text e_info=info 5 text f_info=info 6 text g_info=info 7 text h_info=info 8 text i_info=info 9 text // // // //SETUP OF LIST FOR EVERY BUTTON // // // 1=1a 1=1b 1=1c 1=1d 1=1e 1=1f 2=2a 2=2b 2=2c 2=2d 2=2e 2=2f 3=3 4=4a 4=4b 5=5 6=6 //7-9 give nothing, returns error and then resets //remove slashes to enable //7= //8= //9= // </lsl>

Go to top!

Help with setup

Note!

You're highly advised to read the INTRO first before starting here.

Script for prims with a copy of the inventory list you give away by pressing one particular button

You can do anything with this, but please be so kind and leave me a note if you use my work, thanks.

This script is for:

Use this script for creating a list:

  • Make a copy of the content list for every button in different prims.
  • Name the object with the list name for your desired button, not the button name.
  • Example for above, your button "a" gives you a list of the items listed under "1". Name your prim "1"
  • You can copy&paste the created local chat text into the notecard and replace your "timestamp + prim_name:" with "prim_name=" for every line
  • Yeah, sorry. That's the fastest way for the first setup, adding single items later is a lot faster.

<lsl> //SYSTEM PROVIDED BY Kireji Haiku //please send me a note if you use this, thanks. // // // integer len; integer i; integer typ;

default {

   state_entry()
   {
   llSay(0,"touch me to get your list");
   //do nothing 
   }
   touch_start(integer total_number)
   {
       string name = llGetObjectName();
       typ = INVENTORY_ALL;
       len =  llGetInventoryNumber(typ);
       for(i=0;i<=len-1;i++)
       {
           llSay(0, llGetInventoryName(typ,i));
       }
   }

} </lsl>



Go to top!

Version with manual eMail-Address Input

Note!

You're highly advised to read the INTRO first before starting here.

manual eMail Script


VERSION WITH MANUAL eMAIL-ADDRESS INPUT

Script: <lsl> //SYSTEM PROVIDED BY Kireji Haiku //please send me a note if you use this, thanks. // // // string eMail; string default_floattext; string object_name; string object_description; string particle_texture; integer GROUPONLY; float timer_writeAddress; float timer_writeSubject; float timer_writeBody; float timer_mainmenu; float timer_emailer; float timer_remainButton; float timer_sendMail; key senderKey; string senderName; string subject; string bodyText; list writeButtons; string removeButton; integer i; integer TYPE_OF_TARGET = AGENT; float SCAN_DISTANCE = 25.0; integer STOP_INTERVAL = 20; string CONTROLLER_ID = "control_id";//IF YOU KNOW WHAT THIS IS AND WHAT IT DOES, CHANGE IT ;) integer AUTO_START = TRUE; list particle_parameters=[]; list target_parameters=[]; string scan_for_name; integer attempt_number; integer CHANNEL; string menu_text1 = "Welcome, "; string menu_text2 = ". If you want to send me an eMail click *EMAIL*, otherwise choose your object of desire below."; string option1; string option2; string option3; string option4; string option5; string option6; string option7; string option8; string option9; string info1; string info2; string info3; string info4; string info5; string info6; string info7; string info8; string info9; list list_option1; list list_option2; list list_option3; list list_option4; list list_option5; list list_option6; list list_option7; list list_option8; list list_option9; key name; integer ConfigRequired = TRUE; //DO NOT EVEN THINK ABOUT SETTING UP THE NOTECARD SUFFIX BY NOTECARD :P string ConfigNotecardSuffix = ".cfg";//IF YOU CHANGE THIS, MAKE SURE YOUR NOTECARD HAS THIS SUFFIX float ConfigTimeout = 60.0;//Yes, 60 seconds seems fine to me. integer ConfigLineIndex; key ConfigRequestID; list ConfigCards; string ConfigCardName; integer ConfigCardIndex; integer Debug;

config_init() {

   default_floattext = "now active";
   object_name = "menu driven giver by Kireji Haiku";//JUST BECAUSE, IT WILL CHANGE ANYWAY, RELAX :)
   particle_texture = "";

CHANNEL = (integer)llFrand(DEBUG_CHANNEL)*-1; timer_writeAddress = 30.0;

   timer_writeSubject = 30.0;
   timer_writeBody = 120.0;
   timer_mainmenu = 30.0;
   timer_emailer = 30.0;
   timer_remainButton = 30.0;
   timer_sendMail = 30.0;
   list_option1 = [];
   list_option2 = [];
   list_option3 = [];
   list_option4 = [];
   list_option5 = [];
   list_option6 = [];
   list_option7 = [];
   list_option8 = [];
   list_option9 = [];
   option1 = "";
   option2 = "";
   option3 = "";
   option4 = "";
   option5 = "";
   option6 = "";
   option7 = "";
   option8 = "";
   option9 = "";
   info1 = "";
   info2 = "";
   info3 = "";
   info4 = "";
   info5 = "";
   info6 = "";
   info7 = "";
   info8 = "";
   info9 = "";
   //NO, I DID NOT FORGET THE DEBUG AND GROUPONLY
   //AND PLEASE DON'T PUT ANY init() VALUES HERE FOR THEM

}

config_dump() {

   say("Floattext: " + default_floattext);
   say("My Name: " + object_name);
   say("My Channel for menu-communication is: " + (string) CHANNEL);
   say("Group-only access is: " + (string) GROUPONLY + "  (1.0 is on, 0.0 is off)");

say("Texture for particles: " + particle_texture); say("Timer for eMail-Address: " + (string) timer_writeAddress);

   say("Timer for Subject: " + (string) timer_writeSubject);
   say("Timer for Body: " + (string) timer_writeBody);
   say("Timer for main menu: " + (string) timer_mainmenu);
   say("Timer for eMail: " + (string) timer_emailer);
   say("Timer for Buttons: " + (string) timer_remainButton);
   say("Timer for sending eMail: " + (string) timer_sendMail);
   say("Button1: " + option1);
   say("Info1: " + info1);
   say("Button2: " + option2);
   say("Info2: " + info2);
   say("Button3: " + option3);
   say("Info3: " + info3);
   say("Button4: " + option4);
   say("Info4: " + info4);
   say("Button5: " + option5);
   say("Info5: " + info5);
   say("Button6: " + option6);
   say("Info6: " + info6);
   say("Button7: " + option7);
   say("Info7: " + info7);
   say("Button8: " + option8);
   say("Info8: " + info8);
   say("Button9: " + option9);
   say("Info9: " + info9);
   say("Contents1: " + llList2CSV(list_option1));
   say("Contents2: " + llList2CSV(list_option2));
   say("Contents3: " + llList2CSV(list_option3));
   say("Contents4: " + llList2CSV(list_option4));
   say("Contents5: " + llList2CSV(list_option5));
   say("Contents6: " + llList2CSV(list_option6));
   say("Contents7: " + llList2CSV(list_option7));
   say("Contents8: " + llList2CSV(list_option8));
   say("Contents9: " + llList2CSV(list_option9));
   say("Debug is currently on. Set debug to 0.0 in notecard if you don't like to see this config-note here.");

say("Current reset time was: " + llGetTimestamp()); }

config_parse(string str, string cardName, integer lineNum) {

   str = llStringTrim(str, STRING_TRIM_HEAD);
   if (llGetSubString(str,0,0) == "//") {
       return;
   }
   list ldata  = llParseStringKeepNulls(str, ["="], [""]);
   string cmd  = llList2String(ldata,0);
   string arg1 = llList2String(ldata,1);
   if (cmd == "@") {
       eMail_list += [arg1];
   } else if (cmd == "float") {
       default_floattext = arg1;
   } else if (cmd == "name") {
       object_name = arg1;
   }  else if (cmd == "texture") {
       particle_texture = arg1;
   } else if (cmd == "timer_writeAddress") {
       timer_writeAddress = (float) arg1;
   } else if (cmd == "timer_writeSubject") {
       timer_writeSubject = (float) arg1;
   } else if (cmd == "timer_writeBody") {
       timer_writeBody = (float) arg1;
   } else if (cmd == "timer_mainmenu") {
       timer_mainmenu = (float) arg1;
   } else if (cmd == "timer_emailer") {
       timer_emailer = (float) arg1;
   } else if (cmd == "timer_remainButton") {
       timer_remainButton = (float) arg1;
   } else if (cmd == "timer_sendMail") {
       timer_sendMail = (float) arg1;
   } else if (cmd == "a") {
       option1 = arg1;
   } else if (cmd == "a_info") {
       info1 = arg1;
   } else if (cmd == "b") {
       option2 = arg1;
   } else if (cmd == "b_info") {
       info2 = arg1;
   } else if (cmd == "c") {
       option3 = arg1;
   } else if (cmd == "c_info") {
       info3 = arg1;
   } else if (cmd == "d") {
       option4 = arg1;
   } else if (cmd == "d_info") {
       info4 = arg1;
   } else if (cmd == "e") {
       option5 = arg1;
   } else if (cmd == "e_info") {
       info5 = arg1;
   } else if (cmd == "f") {
       option6 = arg1;
   } else if (cmd == "f_info") {
       info6 = arg1;
   } else if (cmd == "g") {
       option7 = arg1;
   } else if (cmd == "g_info") {
       info7 = arg1;
   } else if (cmd == "h") {
       option8 = arg1;
   } else if (cmd == "h_info") {
       info8 = arg1;
   } else if (cmd == "i") {
       option9 = arg1;
   } else if (cmd == "i_info") {
       info9 = arg1;
   } else if (cmd == "1") {
       list_option1 += [arg1];
   } else if (cmd == "2") {
       list_option2 += [arg1];
   } else if (cmd == "3") {
       list_option3 += [arg1];
   } else if (cmd == "4") {
       list_option4 += [arg1];
   } else if (cmd == "5") {
       list_option5 += [arg1];
   } else if (cmd == "6") {
       list_option6 += [arg1];
   } else if (cmd == "7") {
       list_option7 += [arg1];
   } else if (cmd == "8") {
       list_option8 += [arg1];
   } else if (cmd == "9") {
       list_option9 += [arg1];
   } else if (cmd == "debug") {
       Debug = (integer) arg1;
   } else if (cmd == "grouponly") {
       GROUPONLY = (integer) arg1;
   }

}

config_done() {

   if (Debug) {
       config_dump();
   }
   say("Configuration done.");

}

say(string str) {

   llSay(0, "Setup process: " + str);

}

integer next_card() {

   if (ConfigCardIndex >= llGetListLength(ConfigCards)) {
       ConfigCards = [];
       return (FALSE);
   }
   ConfigLineIndex = 0;
   ConfigCardName = llList2String(ConfigCards, ConfigCardIndex);
   ConfigCardIndex++;
   ConfigRequestID = llGetNotecardLine(ConfigCardName, ConfigLineIndex);
   say("Reading : " + ConfigCardName);
   return (TRUE);

}

writeAddress() {

   llListen(0, "", senderKey, "");
   llSay(0, "Please say the address of whom you are sending your email.");
   llSetTimerEvent(timer_writeAddress);

}

writeSubject() {

   llListen(0, "", senderKey, "");
   llInstantMessage(senderKey, "Please say the subject of your email.");
   llSetTimerEvent(timer_writeSubject);

}

writeBody() {

   llListen(0, "", senderKey, "");
   llInstantMessage(senderKey, "Please say the message you would like to send.");
   llSetTimerEvent(timer_writeBody);

}

removeAddress() {

   i = llListFindList(writeButtons, ["Address"]);
   writeButtons = llDeleteSubList(writeButtons, i, i);

}

removeSubject() {

   i = llListFindList(writeButtons, ["Subject"]);
   writeButtons = llDeleteSubList(writeButtons, i, i);

}

removeMessage() {

   i = llListFindList(writeButtons, ["Message"]);
   writeButtons = llDeleteSubList(writeButtons, i, i);

}

default {

   state_entry() {
       llSetText("", <1.0,1.0,1.0>, 1.0);
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.5,0.5,0.5>, TRUE]);
       llSay(0, "default state...");
       state s_config;
   }
   state_exit() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, TRUE]);
   }

}

state s_reconfig {

   state_entry() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.5,0.5,0.5>, TRUE]);
       llSay(0, "reconfiguring...");
       state s_config;
   }
   state_exit() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, TRUE]);
   }

}

state s_config {

   state_entry() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,0.0,0.0>, TRUE]);
       llSetText("...busy...", <1.0,0.0,0.0>, 1.0);
       llSay(0, "configuring...");
       config_init();
       string item;
       ConfigCards = [];
       integer n = llGetInventoryNumber(INVENTORY_NOTECARD);
       while (n-- > 0) {
           item = llGetInventoryName(INVENTORY_NOTECARD, n);
           if (llSubStringIndex(item, ConfigNotecardSuffix) != -1) {
               ConfigCards += [item];
           }
       }
       ConfigCardIndex = 0;
       if (next_card()) {
           llSetTimerEvent(ConfigTimeout);
       } else if (ConfigRequired) {
           //OK, IF YOU REALLY HAD TO CHANGE THE SUFFIX, YOU MAY AS WELL CHANGE THIS ONE HERE
           say("Configuration notecard missing. Please make sure your notecard ends with .cfg");              
           state s_configRetry;
       } else {
           state s_active;
       }
   }

   dataserver(key query_id, string data) {
       if (query_id == ConfigRequestID) {
           if (data == EOF) {
               if (! next_card()) {
                   config_done();
                   state s_active;
               }
           } else {
               config_parse(data, ConfigCardName, ConfigLineIndex);
               ConfigRequestID = llGetNotecardLine(ConfigCardName, ++ConfigLineIndex);
               llSetTimerEvent(ConfigTimeout);
           }
       }
   }

   timer() {
       say("Dataserver time out: touch to retry");
       state s_configRetry;
   }

   on_rez(integer num) { state s_reconfig; }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { state s_reconfig; }
   }

   state_exit() {
       llSetTimerEvent(0);
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, TRUE]);
       llSay(0, "Ready for use!");
   }

}

state s_configRetry {

   state_entry() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,0.7,0.0>, TRUE]);
       llSetText("Setup failed, touch for retry.", <1.0,0.0,0.0>, 1.0);
       llSay(0, "Setup failed, touch for retry.");
   }
   touch_start(integer tot) {
       if (llDetectedKey(0) == llGetOwner()) {
           state s_config;
       }
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { state s_config; }
   }

   state_exit() {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, TRUE]);
       llSetText("", <1.0,1.0,1.0>, 1.0);
   }

}

state s_unconfigured {

   state_entry() {
       llSetText("Configuration missing", <1.0,1.0,1.0>, 1.0);
       llSay(0, "Configuration missing.");
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { state s_reconfig; }
   }

   state_exit() {
       llSetText("", <1.0,1.0,1.0>, 1.0);
   }

}

state s_active {

   state_entry()

{ object_description = "Last reset was: " + llGetTimestamp();

       llSetObjectDesc(object_description);
       llMessageLinked( LINK_SET, FALSE, CONTROLLER_ID, NULL_KEY );
       particle_parameters = [
           PSYS_SRC_TEXTURE, particle_texture,
           PSYS_PART_START_SCALE, <0.1, 0.1, FALSE>, PSYS_PART_END_SCALE, <0.1, 0.1, FALSE>,
           PSYS_PART_START_COLOR, <1.00,1.00,1.00>,    PSYS_PART_END_COLOR, <1.00,1.00,1.00>,
           PSYS_PART_START_ALPHA, (float) 1.0,         PSYS_PART_END_ALPHA, (float) 1.0,
           PSYS_SRC_BURST_PART_COUNT, (integer)  2,
           PSYS_SRC_BURST_RATE,         (float) 0.05,
           PSYS_PART_MAX_AGE,           (float)  10.0,
           PSYS_SRC_PATTERN, (integer) 2,
           PSYS_SRC_ACCEL, < 00.00, 00.00, -00.1>,
           PSYS_PART_FLAGS, (integer) ( 0
           | PSYS_PART_INTERP_COLOR_MASK
           | PSYS_PART_INTERP_SCALE_MASK
           | PSYS_PART_EMISSIVE_MASK
           | PSYS_PART_FOLLOW_VELOCITY_MASK
           | PSYS_PART_WIND_MASK
           | PSYS_PART_TARGET_POS_MASK
           )
               ];
       if ( AUTO_START )
       {
           llParticleSystem( particle_parameters );
       }
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,1.0>, TRUE]);
       //I would kindly ask you NOT to change the following line
       llSetText(default_floattext + "\n*system provided by Kireji Haiku*", <1.0,1.0,1.0>, 1.0);
       llSetObjectName(object_name);
       writeButtons = ["Address","Subject", "Message"];
       senderKey = llDetectedKey(0);
       llListen(CHANNEL, "", senderKey, "");
   }

   touch_start(integer num)
   {
   integer i=0;
   senderKey = llDetectedKey(i);
   senderName = llKey2Name(llDetectedKey(i));
   if (GROUPONLY) {
       while(i<num)
       {
           key id=llDetectedKey(i);
           if(llSameGroup(id))
           {
               llSay(0, "Please choose from menu.");
               llDialog(senderKey, menu_text1 + senderName + menu_text2, [ option7,option8,option9, option4, option5, option6, option1, option2, option3,"EMAIL" ], CHANNEL );
               llInstantMessage(llGetOwner(), "/me was touched by: " + senderName);
           }
           else
           {

llSay(0, "This only works if you have the right group-tag activated."); llSay(0, "Please try again after changing your group-tag to match my active group."); llSay(0, "You can right-click, edit me and check the general tab to be sure you activated the right one.");

           }
           ++i;
       }
   }
   else {
       llSay(0, "Please choose from menu.");
       llDialog(senderKey, menu_text1 + senderName + menu_text2, [ option7,option8,option9, option4, option5, option6, option1, option2, option3,"EMAIL" ], CHANNEL );
       llInstantMessage(llGetOwner(), "/me was touched by: " + senderName);
   }
   scan_for_name = llKey2Name(llDetectedKey(i));
   attempt_number=1;
   llStringTrim( scan_for_name, STRING_TRIM );
   llSensor( scan_for_name, "", TYPE_OF_TARGET,  SCAN_DISTANCE, TWO_PI );
   llSetTimerEvent(timer_mainmenu);
   }

   listen(integer channel, string name, key id, string message)
   {
       if(message == "EMAIL")
       {

llSay(0, "Currently being used by " + senderName + "."); llSay(0, "Changing state to email_setup ...");

           state emailer;
       }
       if (message == option1)
       {
           llGiveInventoryList(id, option1, list_option1);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option1); llSay(0, "EXTRA INFO: " + info1);

       }
       if (message == option2)
       {
           llGiveInventoryList(id, option2, list_option2);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option2); llSay(0, "EXTRA INFO: " + info2);

       }
       if (message == option3)
       {
           llGiveInventoryList(id, option3, list_option3);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option3); llSay(0, "EXTRA INFO: " + info3);

       }
       if (message == option4)
       {
           llGiveInventoryList(id, option4, list_option4);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option4); llSay(0, "EXTRA INFO: " + info4);

       }
       if (message == option5)
       {
           llGiveInventoryList(id, option5, list_option5);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option5); llSay(0, "EXTRA INFO: " + info5);

       }
       if (message == option6)
       {
           llGiveInventoryList(id, option6, list_option6);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option6); llSay(0, "EXTRA INFO: " + info6);

       }
       if (message == option7)
       {
           llGiveInventoryList(id, option7, list_option7);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option7); llSay(0, "EXTRA INFO: " + info7);

       }
       if (message == option8)
       {
           llGiveInventoryList(id, option8, list_option8);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option8); llSay(0, "EXTRA INFO: " + info8);

       }
       if (message == option9)
       {
           llGiveInventoryList(id, option9, list_option9);

llSay(0, "Please look in your inventory under recent items to find your new stuff. It should be in a folder named: " + option9); llSay(0, "EXTRA INFO: " + info9);

       }
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait..."); llSetText("",<0,0,0>, 0);

       llMessageLinked( LINK_SET, FALSE, CONTROLLER_ID, NULL_KEY );
       llResetScript();
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   sensor(integer number_of_matches)
   {
       if ( attempt_number == 1 )
       {
           llMessageLinked( LINK_SET, 2, CONTROLLER_ID, llDetectedKey(0) );
           llSetTimerEvent( STOP_INTERVAL );

       }
       else
       {
           integer i;
           scan_for_name = llToLower(scan_for_name);
           for ( i=0; i<number_of_matches; i++)
           {
               if ( llSubStringIndex(llToLower(llDetectedName(i)), scan_for_name) >= 0 )
               {
                   llMessageLinked( LINK_SET, 2, CONTROLLER_ID, llDetectedKey(i) );
                   llSetTimerEvent( STOP_INTERVAL );
                   return;
               }
           }
           llOwnerSay("error: I can't find \""+scan_for_name+"\" within "+(string)SCAN_DISTANCE+"m.");
           llResetScript();
       }
   }

   no_sensor()
   {
       if ( attempt_number == 1 )
       {
           llSensor( "", "", TYPE_OF_TARGET,  SCAN_DISTANCE, TWO_PI );
           attempt_number = 2;
       }
       else
       {
           llMessageLinked( LINK_SET, FALSE, CONTROLLER_ID, NULL_KEY );
           llOwnerSay("error: I can't find anyone named "+scan_for_name+" within "+(string)SCAN_DISTANCE+"m.");
           llResetScript();
       }
   }

   link_message( integer sibling, integer num, string mesg, key target_key )
   {
       if ( mesg != CONTROLLER_ID )
       {
           return;
       }
       else if ( num == 0 )
       {
           llParticleSystem( [ ] );
       }
       else if ( num == 1 )
       {
           llParticleSystem( particle_parameters + target_parameters );
       }
       else if ( num == 2 )
       {
           target_parameters = [ PSYS_SRC_TARGET_KEY, target_key ];
           llParticleSystem( particle_parameters + target_parameters );
       }
       else
       {
           //do nothing
       }
   }

   changed(integer change)
   {
       if (change & CHANGED_LINK)
       {
           integer link = llGetNumberOfPrims();
           key id;
           while(llGetAgentSize(id = llGetLinkKey(link--)))
               {
               llUnSit(id); llSay(0, "Does this look like a chair?");
               }
       }
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

}

state emailer {

   state_entry()
   {
       llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.0,1.0,0.0>, TRUE]);
       if(writeButtons == [])
       {
           state sendMail;
       }
       llListen(CHANNEL, "", llDetectedKey(0), "");
       llSetTimerEvent(timer_emailer);
       llInstantMessage(senderKey, "You have 30 seconds to choose.");
       llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0);
       llDialog(senderKey, "What part of your message would you like to write?", writeButtons, CHANNEL);
   }

   listen(integer channgel, string name, key id, string message)

{ if(message == "Address") { state addressWrite; }

       if(message == "Subject")
       {
           state subjectWrite;
       }
       else if(message == "Message")
       {
           state messageWrite;
       }
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait...");

       llSetText("",<0,0,0>, 0);
       state default;
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

}

state addressWrite {

   state_entry()

{ llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,0.0,0.0>, TRUE]); llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0);

       writeAddress();
   }
   
   listen(integer channel, string name, key id, string message)
   {
       eMail = message;
       removeButton = "Address";
       state remainButton;
   }
   
   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "User has failed to enter information quickly enough. Please try again.");
       state emailer;
   }

}

state subjectWrite {

   state_entry()
   {

llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,0.0,0.0>, TRUE]); llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0);

       writeSubject();
   }

   listen(integer channel, string name, key id, string message)
   {
       subject = message;
       removeButton = "Subject";
       state remainButton;
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait...");

       state emailer;
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

}

state messageWrite {

   state_entry()
   {

llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,0.0,0.0>, TRUE]); llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0);

       writeBody();
   }

   listen(integer channel, string name, key id, string message)
   {
       bodyText = message;
       removeButton = "Message";
       state remainButton;
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait...");

       state emailer;
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

}

state remainButton {

   state_entry()
   {

llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <0.0,0.0,0.0>, TRUE]); llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0); llSetTimerEvent(timer_remainButton); if(removeButton == "Address") { removeAddress(); state emailer; }

       if(removeButton == "Subject")
       {
           removeSubject();
           state emailer;
       }
       else if(removeButton == "Message")
       {
           removeMessage();
           state emailer;
       }
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait...");

       state emailer;
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

}

state sendMail {

   state_entry()
   {

llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, <1.0,1.0,0.0>, TRUE]); llSetText("Currently in use by " + (string)llKey2Name(senderKey) + ". Please wait!", <1.0,0.0,0.0>, 1.0);

       llSetTimerEvent(timer_sendMail);
       llListen(CHANNEL, "", senderKey, "Yes");
       llListen(CHANNEL, "", senderKey, "No");
       llInstantMessage(senderKey, "Your email reads as the followed:");
       llSay(0, "EMAIL-ADDRESSES: " + eMail));
       llInstantMessage(senderKey, "SUBJECT:      " + subject);
       llInstantMessage(senderKey, "EMAIL-TEXT:  " + bodyText);
       llDialog(senderKey, "Do you wish to send this message?", ["Yes","No"], CHANNEL);
   }

   listen(integer channel, string name, key id, string message)
   {
       if(message == "Yes")
       {
           llInstantMessage(senderKey, "I hope you don't mind " + senderName + ", but I will have to assume your name for a moment to send this email.");
           llInstantMessage(senderKey, "Your email will be sent in 20 seconds.");
           llInstantMessage(senderKey, "Thank you " + senderName + ", for using the " + llGetObjectName());
           llSetText("", <0,0,0>, 0);
           llSetObjectName(senderName);
           llEmail(eMail, subject, bodyText);
           llInstantMessage(senderKey, "Email has been sent. I'm ready for the next try.");
           state default;
       }
       else if(message == "No")
       {
           llInstantMessage(senderKey, "Thank you " + senderName + ", for using " + llGetObjectName());
           llSetText("", <0,0,0>, 0);
           llInstantMessage(senderKey, "I'm ready for the next try.");
           state default;
       }
   }

   timer()
   {
       llSetTimerEvent(0);
       llSay(0, "You, " + senderName + ", have failed to select an option in time. Unit is resetting and then available for retry.");

llSay(0, "Please wait...");

       state default;
   }

   on_rez(integer start_param)
   {
       llResetScript();
   }

   changed(integer change) {
       if (change & CHANGED_OWNER) { llResetScript(); }
       if (change & CHANGED_INVENTORY) { llResetScript(); }
   }

} </lsl>



Go to top!

manual eMail Notecard


VERSION WITH MANUAL eMAIL-ADDRESS INPUT


Notecard to put in desired prim:

  • Keep timer for sending mail above 30 seconds.
  • Use this script to create lists.
  • Any name followed by .cfg is fine.

<lsl> //SYSTEM PROVIDED BY Kireji Haiku //please send me a note if you use this, thanks. // // // //no space before and after "="!!! //comment lines start with two forward slashes //debug is 1.0 or 0.0 //grouponly is 1.0 or 0.0 // float=Notecards for lessons name=Notecard terminal texture=cda52928-37a5-c7cd-23bc-a8e6330ef28c timer_writeAddress=30 timer_writeSubject=30 timer_writeBody=120 timer_mainmenu=30 timer_emailer=30 timer_remainButton=30 timer_sendMail=45 debug=0.0 grouponly=1.0 // //comments: //a through i are the button names. //1 through 9 are the list names for buttons a through i. //one line per list item! // a=button 1 name a_info=info 1 text b=button 2 name b_info=info 2 text c=button 3 name c_info=info 3 text d=button 4 name d_info=info 4 text e=button 5 name e_info=info 5 text f=button 6 name f_info=info 6 text g=button 7 name g_info=info 7 text h=button 8 name h_info=info 8 text i=button 9 name i_info=info 9 text // 1=1a 1=1b 1=1c 1=1d 1=1e 1=1f 2=2a 2=2b 2=2c 2=2d 2=2e 2=2f 3=3 4=4a 4=4b 5=5 6=6 //7-9 give nothing, returns error and then resets //remove slashes to enable //7= //8= //9= // </lsl>


Go to top!