Difference between revisions of "Bartender"

From Second Life Wiki
Jump to navigation Jump to search
(New page: ==Bartender! v1.0.0== Bartender to serve drinks.. and other things. <br> Drop this script in your bartender prim. <br> Drop a bunch of 'drink' objects into your bartender prim. <br> Touch ...)
 
m (<lsl> tag to <source>)
 
(5 intermediate revisions by one other user not shown)
Line 8: Line 8:
Touch the bartender prim and select a drink.
Touch the bartender prim and select a drink.
<br>
<br>
Some debugging info is transmitted on llOwnerSay, but spam is mminimal. Edit the script variable to adjust this.
Some debugging info is transmitted on llOwnerSay, but spam is minimal. Edit the script variable to adjust this.
<br>
<br>
<b>This script differs from others in that:</b>
<b>This script differs from others in that:</b>
Line 17: Line 17:
<br>
<br>
Evidently this script can be used as a kind of object freebie vendor too.
Evidently this script can be used as a kind of object freebie vendor too.
<br>
NOTES:
<br>
It's been a while since I wrote it, and it was never really extensively tested, so i expect there is some stupid in it. But AFAIK it's fine.
<br>
It features a primitive kind of double-touch prevention that i don't use anymore, so I guess the touch functions have been improved.. yeah.. that was it.. i think.. yeah. So there are some redundant bits.
<div style="padding: 0.5em;">
<div style="padding: 0.5em;">
<lsl>
<source lang="lsl2">
//
//
// BETLOG Hax
// BETLOG Hax
Line 25: Line 31:
// No more editing script drink lists.
// No more editing script drink lists.
//=========================================================================
//=========================================================================
// LICENCE:
// ---LICENCE START---
//  Creative Commons Attribution-Share Alike 3.0 license
// http://creativecommons.org/licenses/by-sa/3.0/
// http://creativecommons.org/licenses/by-sa/3.0/
// ie: Attribution licence:
// You can modify this script, but you must prominently state that you
//   Give me credit by leaving it in the script I created.
// used this script, credit it's original author(s), and supply this
//   Supply my original script with your modified version.
//  unaltered script with your modification.
//   Refer to the wiki URL from which you copied this script.
//
//     https://wiki.secondlife.com/wiki/Bartender
//  If you significantly rework my script:
// ---LICENCE END---
//      I suggest that you include a full permissions notecard in your object called
//     'CREDITS', into which you drag the original/unaltered version of this script.
// OR
//  If you use my original script unaltered: (or just edit a few of my global variables)
//     Simply use my original script as-is: with the same (full) permissions,
//     and in the original script that lists BETLOG Hax as it's creator.
// Either of these two options gives 'attribution' and complies with this licence.
//=========================================================================
//=========================================================================
//----------------------------------
//----------------------------------
// SHARED CONFIGURATION
// SHARED CONFIGURATION
Line 171: Line 171:
     }
     }
}
}
//=========================================================================
// LICENCE:
//  Creative Commons Attribution-Share Alike 3.0 license
//  http://creativecommons.org/licenses/by-sa/3.0/
//  You can modify this script, but you must prominently state that you
//  used this script, credit it's original author(s), and supply this
//  unaltered script with your modification.
//
//  If you significantly rework my script:
//      I suggest that you include a full permissions notecard in your object called
//      'CREDITS', into which you drag the original/unaltered version of this script.
//  OR
//  If you use my original script unaltered: (or just edit a few of my global variables)
//      Simply use my original script as-is: with the same (full) permissions,
//      and in the original script that lists BETLOG Hax as it's creator.
//  Either of these two options gives 'attribution' and complies with this licence.
//=========================================================================


   </lsl>
 
   </source>
</div>
</div>


{{LSLC|Examples|Bartender!}}
{{LSLC|Examples|Bartender!}}

Latest revision as of 14:05, 24 January 2015

Bartender! v1.0.0

Bartender to serve drinks.. and other things.
Drop this script in your bartender prim.
Drop a bunch of 'drink' objects into your bartender prim.
Touch the bartender prim and select a drink.
Some debugging info is transmitted on llOwnerSay, but spam is minimal. Edit the script variable to adjust this.
This script differs from others in that:
It opens a single random negative channel, it does not activate an llListen *every time* someone clicks it.
IF the random channel is being used by something else, and this causes the bartender to get a bunch of garbage inputs, it will automatically change to a new random channel, and optionally inform the owner.
Evidently this script can be used as a kind of object freebie vendor too.
NOTES:
It's been a while since I wrote it, and it was never really extensively tested, so i expect there is some stupid in it. But AFAIK it's fine.
It features a primitive kind of double-touch prevention that i don't use anymore, so I guess the touch functions have been improved.. yeah.. that was it.. i think.. yeah. So there are some redundant bits.

//
// BETLOG Hax
// for Aley Arai AEST: 20080328 0645 [SLT:  20080327 1345]
// Written to allow easier use - just dump drink objects into inv and you are done.
// No more editing script drink lists.
//=========================================================================
// ---LICENCE START---
// http://creativecommons.org/licenses/by-sa/3.0/
// ie: Attribution licence:
//   Give me credit by leaving it in the script I created.
//   Supply my original script with your modified version.
//   Refer to the wiki URL from which you copied this script.
//      https://wiki.secondlife.com/wiki/Bartender
// ---LICENCE END---
//=========================================================================

//----------------------------------
// SHARED CONFIGURATION
//----------------------------------
// CONFIGURATION
//
//OPTIONAL debug feedback - 0=off, 1=Channel & Noise info, 2=all debug
integer gDebug              = 
                                //0;
                                1;
                                //2;
//
//number of invalid messages received before re-randomizing channel
integer gChannelNoiseMax    = 5; 
//
// message that appears on the dialog
string  gDlgMessage         = "\n\t\n\t\n\t\t\tMay I offer you a drink?";
//
// Optional chat responses
// leave BOTH of these fields blank ( ""; ) to NOT speak a message
// leave one OR the other blank to alter the form of the message
//recipient name is auto-inserted between these two
string  gMsgResponseA       = "Thanks";
// target name ends up here
string  gMsgResponseB       = ", enjoy your drink. :)";
//----------------------------------
// CORE CODE
integer gListenHandle       = 0;
integer gDlgLimiter         = 0;
integer gDlgChannel         = -5746547; //failsafe only
list    gDrinksList         = [];
integer gDrinksCount        = 0;
integer gChannelNoise       = 0;
//----------------------------------
f_dialogMenu(key id, list dlgButtons)
{   llDialog(id, gDlgMessage, dlgButtons, gDlgChannel);
    if (gDebug > 1)
    {   llOwnerSay("***OFFERING DIALOG:***"
            +"\nname: "+llKey2Name(id)
            +"\nid: "+(string)id
            +"\ngDlgMessage: "+gDlgMessage
            +"\ndlgButtons: "+llList2CSV(dlgButtons)
            +"\ngDlgChannel: "+(string)gDlgChannel
            +"\n***************"
        );
    }
}
//-----------------------
f_dialogNullify()
{   gDlgLimiter = 0;    
}
//-----------------------
f_randomChannel()
{   
//a static channel is more reliable where many people may request a drink while another is still considering the choices
//gChannelNoise will trigger auto-re-randomization of this static channel if too much invalid message activity is detected
    if (gListenHandle)
        llListenRemove(gListenHandle);
    gDlgChannel = (integer)(llFrand(-0x7FFFFFFF)-1);
    gListenHandle = llListen(gDlgChannel, "", "", ""); 
    if (gDebug)
        llOwnerSay("gDlgChannel: "+(string)gDlgChannel);
}
//-----------------------
f_assessInventory()
{   integer    i;
    integer    n = llGetInventoryNumber(INVENTORY_OBJECT);
    gDrinksList = [];
    for(i=0; i<n; i++ )
        gDrinksList += [ llGetInventoryName(INVENTORY_OBJECT, i) ];
    gDrinksCount = llGetListLength(gDrinksList);
    if (gDebug > 1)
        llOwnerSay("gDrinksCount: "+(string)gDrinksCount+" - gDrinksList: "+llList2CSV(gDrinksList));        
}
//-----------------------
default
{   on_rez(integer start_param)
    {   llResetScript();
    }
    changed(integer change)
    {   if (change & CHANGED_INVENTORY)
        {   llSetText("RE-EVALUATING\ninventory.", <0.0, 1.0, 0.0>,1.0);            
            //so its not being called too much and slowing down inv changes            
            llSetTimerEvent(8.0);
        }
        if (change & CHANGED_OWNER)
            llResetScript();
    }
    timer()
    {   llSetTimerEvent(0.0);
        llSetText("", <1.0, 1.0, 1.0>,1.0);
        f_assessInventory();        
    }
    state_entry()
    {   f_randomChannel();
        f_assessInventory();
    }
    touch_end(integer num_detected)
    {   gDlgLimiter += 1;
        if (gDlgLimiter == 1)
        {   key av = llDetectedKey(0);
            f_dialogMenu(av, gDrinksList);            
        }
        else if (gDlgLimiter >= 2) //3)
            f_dialogNullify();
    }
    listen(integer channel, string name, key id, string message)
    {   integer index = llListFindList(gDrinksList, [message]);
        if (index == -1)
        {   gChannelNoise++;
            if (gDebug)
                llOwnerSay("FYI - INVALID MESSAGE DETECTED ON THIS CHANNEL:\ngDlgChannel: "+(string)gDlgChannel+"\ngChannelNoise/gChannelNoiseMax = "+(string)gChannelNoise+"/"+(string)gChannelNoiseMax+"\nFrom: "+name+" [key: "+(string)id+"]");
            if (gChannelNoise >= gChannelNoiseMax)
                f_randomChannel();
            return;
        }
        string drink = llGetInventoryName(INVENTORY_OBJECT, index);
        if (drink != "")
        {   f_dialogNullify();            
            if ( (gMsgResponseA != "") || (gMsgResponseB != "") )
                llSay(0, gMsgResponseA+" "+name+" "+gMsgResponseB);
            llGiveInventory(id, drink);
            if (gDebug > 1)
                llOwnerSay("drink: "+drink+" was given to: "+name+" [key: "+(string)id+"]");
        }
        else
        {   // SHOULD never happen
            llOwnerSay("ERROR: The bar has no drinks!!!..or somthing else bad happened..");
        }
    }
}