//Roz Wright's "One Lollipop To a Customer" Script
//A combination of and a complete PG rewrite of NawtieNitey's
//"Candybags" script and Evie Moriguchi's "VaGatcha" scripts.
//Like "Candybags" and "VaGacha", this script can be placed in any
//non-rigged attachment, if you want a simple no-HUD on-touch sol-
//ution. The "Candybags" scripts are also now on pastebin.com.
//This script is designed to discourage visitors from abusing your
//free gift system by repeatedly clicking the dispenser. The script
//can randomly select between several gifts, or give the same gift
//to every visitor. Type "alert" in the description field (in Edit)
//of the dispenser to be alerted to visitors touching the dispenser.
integer visitCycle = 60; //Try to keep this number reasonably low
// You want to discourage visitors from abusing the free gift system
// not store a list of partial avatar keys for eternity.
string curr_id;
string prev_id;
list past_users;
string itemName;
integer itemcount;
integer gift;
integer alertMe (string ObjDesc)
{
//AlertMe checks to see if you have the word "alert" in your
//dispenser's "description" field. If you do, it returns a
//TRUE value and you're alerted to someone touching your dis-
//penser.
integer giveAlert = FALSE;
ObjDesc = llToLower(ObjDesc);
//and here's where the magic happens...
if (llSubStringIndex(ObjDesc, "alert") != -1) giveAlert = TRUE;
//I don't need an "else" statement, giveAlert is already FALSE.
return giveAlert;
//llSubStringIndex and llGetObjectDesc are an easy way to allow
//the user to change a simple single parameter without notecards,
//menus, or opening a listen channel.
//...and using llGetObjectDetails(id,[OBJECT_DESC]) is a nifty way
//for an object to pull communication from other unlinked objects
//without requiring a listen channel. Just saying...
}
string ID_8 (key StoreID)
{
//ID_8 only stores the first 8 characters of a key in a string to
//save memory. It's good for speeding up key to list comparisons but
//not for much else.
return llList2String(llParseString2List((string)StoreID, ["-"], []),0);
//Okay, I lied...It's also pretty good for creating key based indexes,
//where you can look up a partial UUID in a list, which can direct you
//to additional information stored in other lists.
}
default
{
changed(integer change)
//If you add or change gifts, this will let you know how many objects
//are currently in your dispenser's inventory.
{
if (change & CHANGED_INVENTORY)
{
itemcount = llGetInventoryNumber(INVENTORY_OBJECT);
llOwnerSay("There are now " + (string)itemcount + " objects in inventory.");
}
}
touch_start(integer num_detected)
{
//Let's get the number of items in the dispenser
itemcount = llGetInventoryNumber(INVENTORY_OBJECT);
//Let's get the key for the avatar clicking the dispenser
key commKey = llDetectedKey(0);
//Let's prepare that key for comparison against a list of
//recent visitors
curr_id = ID_8 (commKey);
//There are three conditionals that result in the visitor not
//getting an item, so let's assume that the person may not be
//getting a gift.
gift = FALSE;
//Check inventory and make sure there are actually items to give.
if (itemcount==0)llInstantMessage(commKey, "Sorry, there are no items to give you at this time.");
//Check to see if the visitor is repeatedly clicking the item.
else if (curr_id == prev_id)llInstantMessage(commKey, "You have already been sent " + itemName +", please check your inventory.");
//Check to see if the visitor has recently been given a gift.
else if(~llListFindList(past_users, [curr_id]))
{
//singular
if (itemcount==1)llInstantMessage(commKey, "Welcome back. This item is only available to new visitors at this time.");
//plural
else llInstantMessage(commKey, "Welcome back. These items are only available to new visitors at this time.");
}
//If this is a new visitor (or a really old one) give them a gift.
else
{
//lets give our conditional a little buffer room so it doesn't have to move
//around information in the list size every time it evaluates a new toucher.
if (llGetListLength(past_users) > (visitCycle + 10)) llDeleteSubList(past_users, visitCycle, -1);
//don't waste time on random gift selection if it's not neccessary.
if (itemcount > 1)
{
integer randomIndex = (integer)llFrand(itemcount);
itemName = llGetInventoryName(INVENTORY_OBJECT, randomIndex);
}
else itemName = llGetInventoryName(INVENTORY_OBJECT, 0);
llInstantMessage (commKey, "Welcome, you are being sent " + itemName + " as our free gift!");
llGiveInventory(commKey, itemName);
//Let's set up a check to make sure the visitor isn't repeatedly
//clicking the item.
prev_id = curr_id;
//Let's add their partial key to the list
past_users = [prev_id] + past_users;
//This person is getting a gift, let's set the "gift" flag to TRUE.
gift = TRUE;
}
integer alert = alertMe (llGetObjectDesc());
//Alert the owner that someone just received a gift.
if (alert && gift) llInstantMessage(llGetOwner(),llDetectedName(0) + " was given " + itemName + ".");
//Add a few slashes // to the next line if you don't want alerts on every touch
else if (alert && !gift) llInstantMessage(llGetOwner(),llDetectedName(0) + " touched me.");
}
}
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎