Part (1). Make note card called Elite.Spanker.Help and copy the text into it.
**** Elite Spanker v4.0 .Help.Card **** THIS SPANKER IS 100% FREE ***
============================================
Elite Spanker is a free version spanker for Male and Female that will add some fun to your second life. It does not spam out in open chat when someone has spanked you. It will display a hover text over the object for a short time and this Elite Version comes with some cool options that you can set to the spanker system.
4.0 Release Notes
--------------------
1. I changed the shape of the object to make it fit better.
2. The system is now using embedded animations and no longer needs the animation files in the content.
3. I freed much more memory in the spanker system main script.
4. I updated the help doc with more info about the spanker system.
-------------------------------------------------------------------------------
(Note: Only the Owner will have dailog menu not any one else that clicks it.)
The layout for the main Menu system looks like like this:
Sex. Mode, Help
Reset, Exit, Counter,
Spank, Sound, (A)DataB
Ignore
1. Sex: will switch from male to female every time push this button.
2. Mode: will switch the Access list on and off list every time this button is clicked and the access list will hold up to 20 people.
3. Help: you are reading it now

4. Reset: This resets the database and whole system.
4. Exit: This button will just Exit main the Menu system.
5. Counter: this will let you reset the counter.
6. Spank: this will let you spank your own ass, when you spank your own ass the counter does not count at all.
7. Sound: this will let you switch sound effects on and off.
8. (A)DataB: This button stands for Access Database, when you push this button another dialog menu system will load up and look like:
Access User (1 of 1)
Access Name:bigjohn jade
Menu, Exit,
Scan Add, Add, Remove,
<<Prev, Next >>, Memory Chk,
Ignore
Menu: This button loads the main Menu system back up.
Exit: This button exits the Menu system.
Scan Add: This button lets you Scan/Add to the base spanker.
Menu, (A)DataB, Exit
<< Prev, Next >>, Add User
Ignore
Menu: This button loads the main Menu system.
(A)DataB: This button will load the main Access Database Manager Menu system back up.
Exit: This button exits the Menu system.
<<Prev: This button will take you back to the name that it was on before the Next >> button was clicked.
Next >>: This button will go to the next name found in the database list.
Add User: This button will add a name found in the Scan that you are looking at on the Access Scan Database Manager to the Access list.
Add: This button will let you Add people to the Access list manually and when clicked another dialog Menu system will load and look like:
Exit, (A)DataB, Menu,
Ignore
Just type in the name of person that you want to add by hand to the Access list , for example:
/69 add bigjohn jade
Exit: This button will exit the Menu system.
(A)DataB: This button will load the main Access Database Manager Menu system again.
Menu: This button will load the main Menu system again.
Remove: This button on the Access Database Manager lets you remove people very easily, you dont have to type in any names at all to remove people from the Access list.
Just find the person in the database list you want to remove by using Next >> button and once you find the person you want to remove from the system you just hit the Remove button while that person's name is selected.
<<Prev: This button will take you back to name before that it was on before you had hit the Next >> button.
Next >>: This button will go to next name found in the database list.
Memory Chk: This will show you how many free bytes the main script has for the Access database list.
End of help file.
CODE
// By BigJohn Jade
integer CurrentTempUser2 = 0;
integer chan;
list Users2;
key GetUser;
float ScanAroundM = 30.0;
float RepeatScanTime = 0.1;
integer TurnOn = FALSE;
integer lH = -213645771;
integer lT;
integer lT2;
ET()
{
llSetTimerEvent(0.0);
if(lH == -213645771)
lH = llListen(chan,"","","");
lT = (integer)llGetTime() + 120;
llSetTimerEvent(45);
}
ET2()
{
llSetTimerEvent(0.0);
TurnOn = TRUE;
lT2 = (integer)llGetTime() + 5;
llSetTimerEvent(1);
}
integer isUser(string name)
{
integer i;
for (i=0;i<llGetListLength(Users2);i++)
{
string s = llList2String(Users2,i);
if (s==llToLower(name)) return 1;
}
return 0;
}
SetupScanner()
{
llSensorRemove();
llSensorRepeat("","" , AGENT, ScanAroundM, 2*PI, RepeatScanTime);
}
ListUsers2List(integer user1, key id) {
integer UserCount2 = llGetListLength(Users2) - 1;
CurrentTempUser2 = user1;
if (CurrentTempUser2 == -1) {
CurrentTempUser2 = UserCount2;
} else if (CurrentTempUser2 > UserCount2) {
CurrentTempUser2 = 0;
}
if (Users2 == [])
{
return;
}
ET();
list Buttons = [];
integer RangeSet = (integer)ScanAroundM;
string title="\n*** Access Scan Database Manager ***\n*** Scan Range Setting: "+(string)RangeSet+"m *** \n\nUser (" + (string)(CurrentTempUser2 + 1) + " of " + (string)(UserCount2 + 1)+ ")\nName:"+llList2String(Users2,CurrentTempUser2);
Buttons+=["<< Prev","Next >>","Add User","Menu","(A)DataB","Exit"];
llDialog(id,title,Buttons,chan);
return;
}
default
{
sensor(integer total_number)
{
integer i;
for (i=0;i<total_number;i++)
{
key person = llDetectedKey(i);
string name = llToLower(llDetectedName(i));
key K2N = llToLower(llKey2Name(person));
if ((isUser(K2N)==0))
{
Users2 = llListInsertList(Users2,[(string)K2N],llGetListLength(Users2));
}
}
}
no_sensor()
{
llSetTimerEvent(0.0);
llSensorRemove();
TurnOn = FALSE;
list Buttons = [];
string title="\n*** Access Scan Database Manager.\n\nNo one in Range detected!";
ET();
Buttons+=["Menu","Exit"];
llDialog(GetUser,title,Buttons,chan);
}
listen(integer channel, string name, key id, string message)
{
if (message == "Add User" && (id == llGetOwner()))
{
GetUser = id;
llMessageLinked(LINK_SET,0,"SET ID",id);
llSleep(1);
string SetNewAccess = llList2String(Users2,CurrentTempUser2);
llMessageLinked(LINK_SET,0,"SCAN ACCESS ADD",SetNewAccess);
ListUsers2List(CurrentTempUser2,GetUser);
return;
}
if (message == "Next >>" && (id == llGetOwner()))
{
GetUser = id;
ListUsers2List(CurrentTempUser2 + 1,id);
return;
}
if (message == "<< Prev" && (id == llGetOwner()))
{
GetUser = id;
ListUsers2List(CurrentTempUser2 - 1,id);
return;
}
if (message == "Menu" && (id == llGetOwner()))
{
GetUser = id;
llMessageLinked(LINK_SET,0,"MAIN MENU",GetUser);
return;
}
if (message == "(A)DataB" && (id == llGetOwner()))
{
GetUser = id;
llMessageLinked(LINK_SET,0,"ACCESS DATABASE MENU",GetUser);
return;
}
}
link_message(integer sender_num,integer num,string str,key id)
{
if (str == "START SCAN AROUND FOR ACCESS")
{
chan = (integer)llFrand(1000) + 1000;
llListenRemove(lH);
lH = -213645771;
GetUser = id;
Users2 = [];
llOwnerSay("Please Wait... Scan Around Database will be done within 5 Secs...");
ET2();
SetupScanner();
}
if (str == "GET USER")
{
GetUser = id;
}
if (str == "SET SCAN AROUND M")
{
ScanAroundM = (float)num;
}
if (str == "RESET WIZARD")
{
llResetScript();
}
}
timer()
{
if(llGetTime() > lT2)
{
if (TurnOn)
{
TurnOn = FALSE;
llSensorRemove();
llSetTimerEvent(0.0);
ListUsers2List(CurrentTempUser2,GetUser);
}
if(llGetTime() > lT)
{
Users2 = [];
llListenRemove(lH);
lH = -213645771;
llSetTimerEvent(0.0);
}
}
}
}
Part (3). Make new script called Elite.Spanker v4.0 and clear out all the code from new script and add new code from here.
CODE
// Elite Spanker v4.0 By BigJohn Jade
string SoundFile ="475a3e83-6801-49c6-e7ad-d6386b2ecc29";
string HelpCard = "Elite.Spanker.Help";
string Anim1express_anger = "express_anger";
string Anim2expressembarrased = "express_embarrased";
vector Vector_Color = <1.00000, 1.00000, 1.00000>;
integer IHavePermission = FALSE;
integer GetAttach = FALSE;
integer SoundOn = TRUE;
integer SexFemale = TRUE;
integer AccessMode = FALSE;
integer lT;
list UserName;
string FirstName;
float TimeIt = 3.0;
integer MaxAccess = 20;
integer lT2;
integer lA2 = -69;
integer lH = -69;
integer chan;
key GetUser;
integer CurrentAccessUser = 0;
list Access;
string SetRemoveAccess;
key GetAccessUser;
integer Count;
integer FindNoteCard(string name)
{
integer i;
for(i=0;i<llGetInventoryNumber(INVENTORY_NOTECARD);i++)
if(llGetInventoryName(INVENTORY_NOTECARD,i) == (string)name)
return TRUE;
return FALSE;
}
string getParameter(list strings)
{
integer len = llGetListLength(strings);
integer i;
string ret;
string space= "";
for (i=1;i<len;i++)
{
ret += space + llList2String(strings,i);
space=" ";
}
return ret;
}
integer CheckAccessList(key id)
{
integer i;
integer List_Count = llGetListLength(Access);
for (i=0;i<List_Count; i++ )
{
if (llGetListLength(Access) == MaxAccess)
{
list Buttons = [];
string title="\n\nAccess List is Full!";
Buttons+=["Menu","Exit","(A)DataB"];
llDialog(id,title,Buttons,chan);
return 1;
}
}
return 0;
}
integer isAccess(string name)
{
integer i;
for (i=0;i<llGetListLength(Access);i++)
{
string s = llList2String(Access,i);
if (s==llToLower(name)) return 1;
}
return 0;
}
DelFromAccessList(key id,string name)
{
integer i;
for (i=0;i<llGetListLength(Access);i++)
{
string s = llList2String(Access,i);
if (s==name)
{
Access = llDeleteSubList(Access, i, i);
list Buttons = [];
string title="\n\n"+(string)name + " have been removed from the Access list.";
Buttons+=["Menu","Exit","(A)DataB"];
llDialog(id,title,Buttons,chan);
}
}
return;
}
ListAccessList(integer user1, key id) {
integer UserCount = llGetListLength(Access) - 1;
CurrentAccessUser = user1;
if (CurrentAccessUser == -1) {
CurrentAccessUser = UserCount;
} else if (CurrentAccessUser > UserCount) {
CurrentAccessUser = 0;
}
integer i;
if (Access == [])
{
list Buttons = [];
string title="\n\n*** Access Database Manager ***\n\nAccess List is Empty!";
Buttons+=["Add","Scan Add","Memory Chk","Menu","Exit"];
llDialog(id,title,Buttons,chan);
return;
}
list Buttons = [];
string title="\n\n*** Access Database Manager *** \n\nAccess User (" + (string)(CurrentAccessUser + 1) + " of " + (string)(UserCount + 1)+ ")\nAccess Name:"+llList2String(Access,CurrentAccessUser);
Buttons+=["<< Prev","Next >>","Memory Chk","Scan Add","Add","Remove","Menu","Exit"];
llDialog(id,title,Buttons,chan);
return;
}
LetsTimeIt()
{
lT = (integer)llGetTime() + (integer)TimeIt;
llSetTimerEvent(1);
}
LetsTimeIt2()
{
if(lH == -69)
lH = llListen(chan,"","","");
lT2 = (integer)llGetTime() + 120;
}
PlaySoundFile()
{
if(SoundOn)
{
float volume = 0.8;
llPlaySound(SoundFile, volume);
}
}
SetupChannels()
{
chan = (integer)llFrand(1000) + 1000;
llListenRemove(lH);
lH = -69;
llListenRemove(lA2);
lA2 = llListen(69,"","","");
}
OwnerMenu(key id)
{
LetsTimeIt2();
list buttons = [];
string title = "";
if(SoundOn)
{
title+="\nSound Effects: On";
}
if(!SoundOn)
{
title+="\nSound Effects: Off";
}
if(AccessMode)
{
title+="\nAccess Mode: On";
}
if(!AccessMode)
{
title+="\nAccess Mode: Off";
}
if(SexFemale)
{
title+="\nSex: Female";
}
if(!SexFemale)
{
title+="\nSex: Male";
}
buttons+=["Spank","Sound","(A)DataB","Reset","Exit","Counter","Sex","Mode","Help"];
llDialog(id,title,buttons,chan);
}
default
{
state_entry()
{
UserName = llParseString2List(llKey2Name(llGetOwner()),[" ","| "," |"," | "],[]);
FirstName = llList2String(UserName,0);
llSetText("",Vector_Color, 1);
SetupChannels();
}
listen(integer channel, string name, key id, string message)
{
list strings = llParseString2List(message,[" "],[]);
string command = llList2String(strings,0);
string par = llToLower(getParameter((strings)));
if (message == "Menu" && (id == llGetOwner()))
{
GetAccessUser = id;
OwnerMenu(id);
return;
}
if (message == "Next >>" && (id == llGetOwner()))
{
GetAccessUser = id;
ListAccessList(CurrentAccessUser + 1,id);
return;
}
if (message == "<< Prev" && (id == llGetOwner()))
{
GetAccessUser = id;
ListAccessList(CurrentAccessUser - 1,id);
return;
}
if (message == "Help" && (id == llGetOwner()))
{
GetUser = id;
if(FindNoteCard(HelpCard) != TRUE)
{
llDialog(id,(string)HelpCard + " Missing from the object content.",["Exit"],999);
return;
}
else
llGiveInventory(id,HelpCard);
return;
}
if (message == "Counter" && (id == llGetOwner()))
{
GetUser = id;
list Buttons = [];
string title="\n***(-Reset Counter-)***";
title+="\n\n"+(string)FirstName+ ", your ass has been spanked "+(string)Count+ " times!";
Buttons+=["Reset It","Don't","Menu"];
llDialog(id,title,Buttons,chan);
}
if (message == "Reset It" && (id == llGetOwner()))
{
GetUser = id;
Count = 0;
llOwnerSay("The Counter has been reset back to 0!");
OwnerMenu(id);
}
if (message == "Don't" && (id == llGetOwner()))
{
GetUser = id;
OwnerMenu(id);
}
if (message == "Reset" && (id == llGetOwner()))
{
GetUser = id;
list Buttons = [];
string title="\n***(-Reset Whole System-)***";
title+="\n\nDatabase and all will be reset and script will go back to default settings.";
Buttons+=["Yes","No","Menu"];
llDialog(id,title,Buttons,chan);
}
if (message == "Yes" && (id == llGetOwner()))
{
GetUser = id;
llOwnerSay("The system has been reset, you must take off the spanker and add it back on to your av now.");
llResetScript();
}
if (message == "No" && (id == llGetOwner()))
{
GetUser = id;
OwnerMenu(id);
}
if (message == "Mode" && (id == llGetOwner()))
{
GetUser = id;
if(AccessMode)
{
AccessMode = FALSE;
llOwnerSay("Access Mode is now off!");
OwnerMenu(id);
return;
}
if(!AccessMode)
{
AccessMode = TRUE;
llOwnerSay("Access Mode is now on!");
OwnerMenu(id);
return;
}
}
if (message == "Sound" && (id == llGetOwner()))
{
GetUser = id;
if(SoundOn)
{
SoundOn = FALSE;
llOwnerSay("Sound Effects is now off!");
OwnerMenu(id);
return;
}
if(!SoundOn)
{
SoundOn = TRUE;
llOwnerSay("Sound Effects is now on!");
OwnerMenu(id);
return;
}
}
if (message == "Sex" && (id == llGetOwner()))
{
GetUser = id;
if(SexFemale)
{
SexFemale = FALSE;
llOwnerSay("Sex Set to: Male!");
OwnerMenu(id);
return;
}
if(!SexFemale)
{
SexFemale = TRUE;
llOwnerSay("Sex Set to: Female!");
OwnerMenu(id);
return;
}
}
if (message == "Spank" && (id == llGetOwner()))
{
GetUser = id;
if(SexFemale)
{
llStartAnimation(Anim2expressembarrased);
}
else
if(!SexFemale)
{
llStartAnimation(Anim1express_anger);
}
LetsTimeIt();
PlaySoundFile();
llSetText("\n\n"+(string)FirstName+" has spanked their own ass!\n\n"+(string)FirstName+"'s ass has been spanked "+(string)Count+" times.",Vector_Color, 1);
OwnerMenu(id);
return;
}
if (message == "(A)DataB" && (id == llGetOwner()))
{
GetAccessUser = id;
string Incoming = llToLower(llKey2Name(id));
LetsTimeIt2();
ListAccessList(CurrentAccessUser,id);
return;
}
if (message == "Memory Chk" && (id == llGetOwner()))
{
GetAccessUser = id;
list Buttons = [];
string title ="\n*** Access Database Memory ***\n\nAccess Database bytes available: "+(string)llGetFreeMemory();
Buttons+=["Menu","Exit","(A)DataB"];
llDialog(id,title,Buttons,chan);
return;
}
if (message == "Scan Add" && (id == llGetOwner()))
{
GetAccessUser = id;
llMessageLinked(LINK_SET,0,"START SCAN AROUND FOR ACCESS",id);
return;
}
if (message == "Remove" && (id == llGetOwner()))
{
GetAccessUser = id;
SetRemoveAccess = llList2String(Access,CurrentAccessUser);
DelFromAccessList(id,SetRemoveAccess);
return;
}
if(lA2 != -69 && channel == 69)
{
llListenRemove(lA2);
lA2 = -69;
}
if (message == "Add" && (id == llGetOwner()))
{
GetAccessUser = id;
lA2 = llListen(22,"","","");
list Buttons = [];
string title="\n***(-Access Adding-)***\nType in the chat command with, /69 add av name like so.\n\n/69 add bigjohn jade";
Buttons+=["Exit","(A)DataB","Menu"];
llDialog(id,title,Buttons,chan);
return;
}
if (command == "add" && (id == llGetOwner()))
{
GetAccessUser = id;
if (par =="")
{
llListenRemove(lA2);
return;
}
else
if (CheckAccessList(id) == 1)
{
llListenRemove(lA2);
return;
}
else
if ((isAccess(par)>0))
{
list Buttons = [];
string title="\n\nSorry " + (string)par + " was already found in the Access List.";
Buttons+=["Menu","Exit","(A)DataB"];
llDialog(id,title,Buttons,chan);
llListenRemove(lA2);
return;
}
else
Access = llListInsertList(Access,[par],llGetListLength(Access));
list Buttons = [];
string title="\n\nAdd " + (string)par + " to the Access List.";
Buttons+=["Menu","Exit","(A)DataB"];
llDialog(id,title,Buttons,chan);
llListenRemove(lA2);
return;
}
}
attach(key id)
{
if(id == NULL_KEY)
{
GetAttach = FALSE;
return;
}
else
GetAttach = TRUE;
SetupChannels();
llRequestPermissions(id,PERMISSION_TRIGGER_ANIMATION);
UserName = llParseString2List(llKey2Name(llGetOwner()),[" ","| "," |"," | "],[]);
FirstName = llList2String(UserName,0);
llOwnerSay("Spanker System is now ready, click the spanker for Owner Menu. (Bytes Free"+" "+(string)llGetFreeMemory()+")");
}
touch_start(integer total_number)
{
integer TouchTrack;
key person = llDetectedKey(TouchTrack);
string name = llDetectedName(TouchTrack);
string user;
if(!GetAttach)
{
llInstantMessage(person,"I must be attach before you can use me!");
return;
}
else
if (person == llGetOwner())
{
OwnerMenu(llDetectedKey(0));
return;
}
else
if(AccessMode)
{
if ((isAccess(name)==0))
{
llInstantMessage(person,"Sorry but "+(string)FirstName+" has their spanker on access mode, you was not found on the access list!");
return;
}
}
LetsTimeIt();
PlaySoundFile();
if(SexFemale)
{
llStartAnimation(Anim2expressembarrased);
}
else
if(!SexFemale)
{
llStartAnimation(Anim1express_anger);
}
Count++;
user+="\n"+llKey2Name(person)+" has spanked that ass!\n\n"+(string)FirstName+"'s ass has been spanked "+(string)Count+" times.";
llSetText("\n"+user,Vector_Color, 1);
}
run_time_permissions(integer permissions)
{
if (permissions == PERMISSION_TRIGGER_ANIMATION)
{
IHavePermission = TRUE;
}
}
link_message(integer sender_num,integer num,string str,key id)
{
if (str == "SET ID")
{
GetAccessUser = id;
}
if (str == "MAIN MENU")
{
GetUser = id;
string Incoming3 = llToLower(llKey2Name(id));
OwnerMenu(id);
}
if (str == "ACCESS DATABASE MENU")
{
SetupChannels();
GetAccessUser = id;
string Incoming = llToLower(llKey2Name(id));
LetsTimeIt2();
ListAccessList(CurrentAccessUser,id);
return;
}
if (str == "SCAN ACCESS ADD")
{
string Incoming = llToLower(id);
if ((isAccess(Incoming)>0))
{
llInstantMessage(llGetOwner(),(string)Incoming+ " was already found in the Access list.");
return;
}
else
Access = llListInsertList(Access,[Incoming],llGetListLength(Access));
llInstantMessage(llGetOwner(),(string)Incoming+ " has been add to the Access list.");
return;
}
if (str == "SET UP ACCESS USERS")
{
if ((isAccess(id)>0))
{
return;
}
else
Access = llListInsertList(Access,[id],llGetListLength(Access));
return;
}
}
timer()
{
if(llGetTime() > lT)
{
llSetText("",Vector_Color, 1);
llSetTimerEvent(0.0);
}
if(llGetTime() > lT2)
{
llListenRemove(lH);
lH = -69;
}
}
}
Part (4). Make sure that you copy the help card and the two scripts into same object you going to use for it all.