Difference between revisions of "User:Kireji Haiku/A more complex freebie-giver (setup with notecard)"

From Second Life Wiki
Jump to navigation Jump to search
m
(Replaced content with "{{delete|out of date}}")
 
(16 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Help |Wiki=*}}
{{delete|out of date}}
{{LSL Header}}
<div style="float:right;">__TOC__</div>
<div id="box">
=About this script:=
<div style="padding: 0.5em;">
 
 
 
==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:'''
* gives up to nine different lists of its inventory items and gives the ability to send an eMail as feedback to the owner (or the owners!). Complete setup with notecard support and ability to resctrict to group. Including parts of [[llList2CSV]], [[AdvancedNotecardReader]], [[llUnSit]], [[llSameGroup]], [[llParticleSystem]] and last but not least the three main functions [[llEmail]], [[llGiveInventoryList]] and [[llDialog]].
 
 
 
'''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.'''
 
 
{{SLurl
|region=Cypris Village
|x=112
|y=143
|z=28
|title=Have a look at it yourself in SL by following this SLURL
}}
 
[[File:A_more_complex_freebie-giver_(preview).jpg]]
 
 
[http://wiki.secondlife.com/wiki/User:Kireji_Haiku/A_more_complex_freebie-giver_(setup_with_notecard) Go to top!]
==Setup-guide:==
 
{{KBcaution|Please note the '''BIG DIFFERENCE''' between the two setups by referring to [[#Main Script|the script of the main version]] '''(eMail-Addresses from notecard, you can make them private or public)''' and [[#manual eMail Script|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 [[#config.cfg Notecard|notecard]]
 
 
 
 
 
'''Use these links to the different parts:'''
* Normal Version
** [[#Main Script|Configuration Script]]
** [[#config.cfg Notecard|config.cfg Notecard]]
* Version with manual eMail-Address Input
** [[#manual eMail Script|Script-Version for manual eMail-Address-Input]]
** [[#manual eMail Notecard|Notecard-Version for manual eMail-Address-Input]]
* [[#Help with setup|Help with setup]]
 
 
 
 
 
[http://wiki.secondlife.com/wiki/User:Kireji_Haiku/A_more_complex_freebie-giver_(setup_with_notecard) Go to top!]
</div></div>
<div id="box">
=Normal Version=
{{Help/Box|Note!|You're highly advised to read the [[#About this script:|INTRO]] first before starting here.}}
<div style="padding: 0.5em;">
==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):'''
 
 
* [[#config.cfg Notecard|config.cfg Notecard to this script]]
* [[#manual eMail Script|other Script-Version for manual eMail-Address-Input]]
<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>
 
 
 
[http://wiki.secondlife.com/wiki/User:Kireji_Haiku/A_more_complex_freebie-giver_(setup_with_notecard) Go to top!]
==config.cfg Notecard==
 
* [[#Main Script|Configuration Script to this notecard]]
* [[#Help with setup|Help with setup of this notecard]]
* [[#manual eMail Notecard|Have a look at the Notecard-Version for manual eMail-Input]]
** [[#manual eMail Script|and its Script-Version for manual eMail-Input]]
 
 
'''Notecard to put in desired prim:'''
 
* Keep timer for sending mail above 30 seconds.
* Use [[#Help with setup|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>
 
[http://wiki.secondlife.com/wiki/User:Kireji_Haiku/A_more_complex_freebie-giver_(setup_with_notecard) Go to top!]
</div></div>
<div id="box">
=Help with setup=
{{Help/Box|Note!|You're highly advised to read the [[#About this script:|INTRO]] first before starting here.}}
<div style="padding: 0.5em;">
==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:'''
 
* '''Setting up the Normal Version'''
** [[#config.cfg Notecard|set up this notecard(list)]]
** [[#Main Script|for its script(list)]]
* '''Setting up the Version with manual eMail-Address Input'''
** [[#manual eMail Notecard|set up this notecard (manual)]]
** [[#manual eMail Script|for its script(maunal)]]
 
'''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>
 
 
 
 
 
[http://wiki.secondlife.com/wiki/User:Kireji_Haiku/A_more_complex_freebie-giver_(setup_with_notecard) Go to top!]
</div></div>
<div id="box">
=Version with manual eMail-Address Input=
{{Help/Box|Note!|You're highly advised to read the [[#About this script:|INTRO]] first before starting here.}}
<div style="padding: 0.5em;">
==manual eMail Script==
 
* [[#manual eMail Notecard|config.cfg Notecard for this script]]
** [[#Help with setup|Help with setup]]
* Normal Version '''(because you might not want them to be able to send an eMail to ANY eMail-Address)'''
** [[#Main Script|Configuration Script]]
** [[#config.cfg Notecard|config.cfg Notecard]]
 
 
 
'''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>
 
 
 
 
 
[http://wiki.secondlife.com/wiki/User:Kireji_Haiku/A_more_complex_freebie-giver_(setup_with_notecard) Go to top!]
==manual eMail Notecard==
 
 
 
 
* [[#manual eMail Script|Script-Version for manual eMail-Address-Input]]
** [[#Help with setup|Help with setup]]
* Normal Version '''(because you might not want them to be able to send an eMail to ANY eMail-Address)'''
** [[#Main Script|Configuration Script]]
** [[#config.cfg Notecard|config.cfg Notecard]]
 
 
'''VERSION WITH MANUAL eMAIL-ADDRESS INPUT
 
 
 
Notecard to put in desired prim:'''
 
* Keep timer for sending mail above 30 seconds.
* Use [[#Help with setup|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>
 
 
 
[http://wiki.secondlife.com/wiki/User:Kireji_Haiku/A_more_complex_freebie-giver_(setup_with_notecard) Go to top!]
</div></div>

Latest revision as of 18:03, 29 May 2011

Deletion Requested
The deletion of this article was requested for the following reason:

out of date

If there is a need to discuss the deletion of this article, please add your comment(s) here.