Difference between revisions of "Random AV Profile Projector"
Line 16: | Line 16: | ||
// TOUCH to switch ON and OFF | // TOUCH to switch ON and OFF | ||
//ONLINE HELP AT: http://wiki.secondlife.com/wiki/Talk:Random_AV_Profile_Projector | |||
// ** PARAMETERS THAT YOU CAN CHANGE ** | // ** PARAMETERS THAT YOU CAN CHANGE ** | ||
Line 23: | Line 25: | ||
// GENERAL PARAMETERS | // GENERAL PARAMETERS | ||
//************************ | //************************ | ||
// listen channel for Owner | |||
integer OwnerChannel = 54321; | |||
// the number of seconds that a listen remains open before timing-out & automatically closing | |||
float DialogTimeout = 20.00; | |||
// how often in seconds the sensor fires | // how often in seconds the sensor fires | ||
float RepeatTime = 35.00; | float RepeatTime = 35.00; | ||
Line 34: | Line 42: | ||
integer TotalNoScansAllowed = 20; | integer TotalNoScansAllowed = 20; | ||
// | // texture palette of UUID's. One will be randomly selected for display when an AV without a profile pic is selected | ||
list DefaultTexturePalette = ["7cfd684e-2141-941c-eac8-bd439f0d5a9f", "d02531dd-491c-45b5-2cab-2e47ec81ec0d", "c3eebd9e-ee92-a16f-f906-bc275928df86"]; | |||
// | // sets whether the DefaultTexturePalette will be used to texture/projecte when the toy is switched OFF. 'TRUE' to texture/project; 'FALSE' to have no texturing/projection when off | ||
integer EmployDefaultTexture = TRUE; | |||
Line 60: | Line 68: | ||
integer TexturePrim = TRUE; | integer TexturePrim = TRUE; | ||
// the following 'Prim*' parameters effect the prim only if | // the following 'Prim*' parameters effect the prim only if EmployDefaultTexture and/or TexturePrim = FALSE | ||
// if either = TRUE then the prim is automatically set to solid blank white with full bright | // if either = TRUE then the prim is automatically set to solid blank white with full bright | ||
// texture to use for the prim when toy is OFF | // texture to use for the prim when toy is OFF | ||
key | key PrimUUIDTexture = "5748decc-f629-461c-9a36-a35a221fe21f"; | ||
// set to TRUE to turn on Full Bright on ALL_SIDES when the toy is OFF | // set to TRUE to turn on Full Bright on ALL_SIDES when the toy is OFF | ||
Line 90: | Line 98: | ||
// ** DO NOT CHANGE BELOW THIS LINE ** | // ** DO NOT CHANGE BELOW THIS LINE ** | ||
//************************ | //************************ | ||
string URL_FORUMTHREAD = "http://forums.secondlife.com/showthread.php?t=225692"; | string URL_FORUMTHREAD = "http://forums.secondlife.com/showthread.php?t=225692"; | ||
string URL_WIKIPAGE = "http://wiki.secondlife.com/wiki/User:Debbie_Trilling"; | string URL_WIKIPAGE = "http://wiki.secondlife.com/wiki/User:Debbie_Trilling"; | ||
string URL_HELPPAGE = "http://wiki.secondlife.com/wiki/Talk:Random_AV_Profile_Projector"; | |||
string URL_RESIDENT = "http://world.secondlife.com/resident/"; | string URL_RESIDENT = "http://world.secondlife.com/resident/"; | ||
key LastTexture = ""; | key LastTexture = ""; | ||
integer Power = FALSE; | integer Power = FALSE; | ||
string PowerText = "On"; | |||
integer NoSensorCounter = 0; | integer NoSensorCounter = 0; | ||
key AVKey = ""; | key AVKey = ""; | ||
Line 104: | Line 117: | ||
string Author = "Debbie Trilling"; | string Author = "Debbie Trilling"; | ||
string Supplier = "The Particle Crucible"; | string Supplier = "The Particle Crucible"; | ||
string Version = " v5. | string Version = " v5.3"; | ||
integer ListenChannel; | integer ListenChannel; | ||
integer ListenChannel2; | |||
list | list ExcludeListing = []; | ||
integer ExcludeListSize = 50; | |||
integer OwnerListen = FALSE; | |||
string OwnerListenText = "OpenListen"; | |||
Line 126: | Line 140: | ||
{ | { | ||
// are we going to use a default texture when toy is OFF? | // are we going to use a default texture when toy is OFF? | ||
if ( | if (EmployDefaultTexture) | ||
{ | { | ||
if (TexturePrim) | if (TexturePrim) | ||
Line 138: | Line 152: | ||
ApplyPrimPrefs(); | ApplyPrimPrefs(); | ||
} | } | ||
ParticleStart((key)llList2String( | ParticleStart((key)llList2String(DefaultTexturePalette, (integer)llFrand((float)llGetListLength(DefaultTexturePalette)))); | ||
} | } | ||
else | else | ||
Line 151: | Line 165: | ||
{ | { | ||
llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, PrimFullBright, | llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, PrimFullBright, | ||
PRIM_TEXTURE, ALL_SIDES, | PRIM_TEXTURE, ALL_SIDES, PrimUUIDTexture, <1.000000, 1.000000, 0.000000>, <0.000000, 0.000000, 0.000000>, 0.000000, PRIM_COLOR, ALL_SIDES, PrimColour, PrimAlpha ]); | ||
} | } | ||
Line 192: | Line 206: | ||
{ | { | ||
llOwnerSay( | llOwnerSay( | ||
"\nThank you for your interest in this | "\nThank you for your interest in this " + ObjectName + " " + Version + " created by " + Author + " at " + Supplier + ". \nTOUCH the " + ObjectName + " to operate it."); | ||
} | |||
CloseAllListens() | |||
{ | |||
llSetTimerEvent(0.0); | |||
llListenRemove(ListenChannel); | |||
llListenRemove(ListenChannel2); | |||
OwnerListenText = "OpenListen"; | |||
} | |||
CloseUserListen() | |||
{ | |||
llSetTimerEvent(0.0); | |||
llListenRemove(ListenChannel); | |||
} | } | ||
Line 198: | Line 226: | ||
ShutDown() | ShutDown() | ||
{ | { | ||
Power = FALSE; | |||
PowerText = "On"; | |||
llSensorRemove(); | llSensorRemove(); | ||
ProjectTexture(); | ProjectTexture(); | ||
CloseAllListens(); | |||
llOwnerSay("\nThe " + ObjectName + " is now switched OFF."); | |||
} | |||
StartUp() | |||
{ | |||
Power = TRUE; | |||
PowerText = "Off"; | |||
NoSensorCounter = 0; | |||
CloseAllListens(); | |||
llSensorRepeat("",NULL_KEY,AGENT,Range,PI,RepeatTime); | |||
llOwnerSay("\nThe " + ObjectName + " is now switched ON. Please wait..."); | |||
} | } | ||
Line 211: | Line 252: | ||
{ | { | ||
// reset script on rez | // reset script on rez | ||
llResetScript(); | llResetScript(); | ||
} | } | ||
Line 220: | Line 260: | ||
{ | { | ||
// reset script on change of owner | // reset script on change of owner | ||
llResetScript(); | llResetScript(); | ||
} | } | ||
Line 233: | Line 272: | ||
llSetObjectName(ObjectName + Version); | llSetObjectName(ObjectName + Version); | ||
llSetObjectDesc("Supplied free by " + Author + "'s " + Supplier); | llSetObjectDesc("Supplied free by " + Author + "'s " + Supplier); | ||
llSetText("'Touch' for information",<1.0,1.0,0.0>,0.8); | |||
ProjectTexture(); | ProjectTexture(); | ||
AnnounceWelcome(); | |||
} | } | ||
touch_start(integer total_number) | touch_start(integer total_number) | ||
{ | { | ||
DetectedUser = llDetectedKey(0); | |||
list MenuItems = ["LearnMore", "GetScript","Help"]; | |||
string MenuText = "MAIN MENU: Please make a selection within " + (string)llFloor(DialogTimeout) + " seconds.\n- LearnMore: Read the forum thread on this product\n- GetScript: Get yourself the latest version of this free script\n- Help: Link to the " + ObjectName + " Help page"; | |||
if (DetectedUser == ObjectOwner) | |||
{ | { | ||
if (Power) | if (Power) | ||
{ | { | ||
MenuItems = [PowerText, OwnerListenText] + MenuItems; | |||
MenuText = MenuText + "\n- Off: Power Down \n- Open/CloseListen: Opens/Closes channel " + (string)OwnerChannel; | |||
} | } | ||
else | else | ||
{ | { | ||
MenuItems = (list)PowerText + MenuItems; | |||
MenuText = MenuText + "\n- On: Power Up"; | |||
} | } | ||
} | } | ||
Line 260: | Line 299: | ||
{ | { | ||
// touched by someone other than Owner. Send them a message & a dialog box of options | // touched by someone other than Owner. Send them a message & a dialog box of options | ||
llInstantMessage(DetectedUser, "\nThank you for your interest in the " + ObjectName + " created by " + Author + "\nThe dialog menu offers a number of options."); | llInstantMessage(DetectedUser, "\nThank you for your interest in the " + ObjectName + " created by " + Author + "\nThe dialog menu offers a number of options."); | ||
// if already on 'Exclude List', give opportunity to clear their name, else give opportunity to exclude their name | // if already on 'Exclude List', give opportunity to clear their name, else give opportunity to exclude their name | ||
if (llListFindList( | if (llListFindList(ExcludeListing, (list)llKey2Name(AVKey)) != -1 ) | ||
{ | { | ||
// they are on the 'Exclude List' so give opportunity to clear their name | // they are on the 'Exclude List' so give opportunity to clear their name | ||
MenuItems = | MenuItems = (list)"IncludeMe" + MenuItems; | ||
MenuText = MenuText + "\n- IncludeMe: Have the " + ObjectName + " | MenuText = MenuText + "\n- IncludeMe: Have the " + ObjectName + " remove your name from the 'Exclude List'"; | ||
} | } | ||
else | else | ||
{ | { | ||
// they are not on the 'Exclude List' so give opportunity to add their name | // they are not on the 'Exclude List' so give opportunity to add their name | ||
MenuItems = | MenuItems = (list)"ExcludeMe" + MenuItems; | ||
MenuText = MenuText + "\n- ExcludeMe: Have the " + ObjectName + " | MenuText = MenuText + "\n- ExcludeMe: Have your name added to the " + ObjectName + "'s 'Exclude List'"; | ||
} | } | ||
} | } | ||
// generate the dialog menu | |||
integer CommChannel = (-200000 - ((integer)llFrand(12345) * -1)); | |||
ListenChannel = llListen(CommChannel, "", DetectedUser, ""); | |||
llDialog(DetectedUser, MenuText, MenuItems, CommChannel); | |||
llSetTimerEvent(DialogTimeout); | |||
} | } | ||
Line 306: | Line 343: | ||
else | else | ||
{ | { | ||
ParticleStart((key)llList2String( | ParticleStart((key)llList2String(DefaultTexturePalette, (integer)llFrand((float)llGetListLength(DefaultTexturePalette)))); | ||
} | } | ||
} | } | ||
Line 325: | Line 362: | ||
{ | { | ||
// selected AV doesn't have a profile picture, so use the default instead | // selected AV doesn't have a profile picture, so use the default instead | ||
ParticleStart((key)llList2String( | ParticleStart((key)llList2String(DefaultTexturePalette, (integer)llFrand((float)llGetListLength(DefaultTexturePalette)))); | ||
} | } | ||
else | else | ||
Line 333: | Line 370: | ||
{ | { | ||
// same profile pic as last time. so display a random default instead | // same profile pic as last time. so display a random default instead | ||
ParticleStart((key)llList2String( | ParticleStart((key)llList2String(DefaultTexturePalette, (integer)llFrand((float)llGetListLength(DefaultTexturePalette)))); | ||
// clear the last texture out | // clear the last texture out | ||
LastTexture = ""; | LastTexture = ""; | ||
Line 339: | Line 376: | ||
else | else | ||
{ | { | ||
// are they on the | // are they on the ExcludeListing? if so, display a random default texture instead | ||
if (llListFindList( | if (llListFindList(ExcludeListing, (list)llKey2Name(AVKey)) != -1 ) | ||
{ | { | ||
// they are on the 'Exclude List' | // they are on the 'Exclude List' | ||
ParticleStart((key)llList2String( | ParticleStart((key)llList2String(DefaultTexturePalette, (integer)llFrand((float)llGetListLength(DefaultTexturePalette)))); | ||
} | } | ||
else | else | ||
{ | { | ||
// different profile from last time & not on | // different profile from last time & not on ExcludeListing, so display it | ||
ParticleStart((key)llGetSubString(body,s1+s1l,s2+s2l)); | ParticleStart((key)llGetSubString(body,s1+s1l,s2+s2l)); | ||
// save the key for comparison purposes next time tho' | // save the key for comparison purposes next time tho' | ||
Line 365: | Line 402: | ||
listen(integer channel, string name, key id, string message) | listen(integer channel, string name, key id, string message) | ||
{ | { | ||
if (message == " | if (message == "LearnMore") | ||
{ | |||
llLoadURL(DetectedUser, "Thank you for choosing to learn more about the " + ObjectName + ".This link will take you to the relevant SL forum thread.", URL_FORUMTHREAD); | |||
CloseUserListen(); | |||
} | |||
else if (message == "GetScript") | |||
{ | |||
llLoadURL(DetectedUser, "Thank you for choosing to look at the script for the " + ObjectName + ".This link will allow you to get your own free copy.", URL_WIKIPAGE); | |||
CloseUserListen(); | |||
} | |||
else if (message == "Help") | |||
{ | |||
llLoadURL(ObjectOwner, "This link will take you to the " + ObjectName + "'s Help page.", URL_HELPPAGE); | |||
CloseUserListen(); | |||
} | |||
else if (message == "ExcludeMe") | |||
{ | |||
ExcludeListing = (list)llKey2Name(DetectedUser) + llList2List( ExcludeListing, 0, (ExcludeListSize - 2)); | |||
llInstantMessage(DetectedUser, "You have been added to the " + ObjectName + "'s 'Exclude List'"); | |||
CloseUserListen(); | |||
} | |||
else if (message == "IncludeMe") | |||
{ | |||
integer ExcludeListPosition = llListFindList(ExcludeListing, (list)llKey2Name(DetectedUser)); | |||
ExcludeListing = llDeleteSubList(ExcludeListing, ExcludeListPosition, ExcludeListPosition); | |||
llInstantMessage(DetectedUser, "You have been removed from the " + ObjectName + "'s 'Exclude List'"); | |||
CloseUserListen(); | |||
} | |||
else if ((message == "On") && (id == ObjectOwner)) | |||
{ | |||
StartUp(); | |||
} | |||
else if ((message == "Off") && (id == ObjectOwner)) | |||
{ | |||
ShutDown(); | |||
} | |||
else if ((message == "OpenListen") && (id == ObjectOwner)) | |||
{ | |||
// open the Owner Only channel | |||
ListenChannel2 = llListen(OwnerChannel, "", ObjectOwner, ""); | |||
OwnerListenText = "CloseListen"; | |||
llOwnerSay("Owner Only channel " + (string)OwnerChannel + " is now open for you.\n Options are: 'Exclude <AV_NAME>', 'Include <AV_NAME>', 'ClearAll' and 'List'"); | |||
} | |||
else if ((message == "CloseListen") && (id == ObjectOwner)) | |||
{ | |||
// close the Owner Only channel | |||
llListenRemove(ListenChannel2); | |||
OwnerListenText = "OpenListen"; | |||
llOwnerSay("Owner Only channel " + (string)OwnerChannel + " is now closed."); | |||
} | |||
else if (((llGetSubString(message,0,6) == "Exclude") || (llGetSubString(message,0,6) == "exclude")) && (id == ObjectOwner)) | |||
{ | { | ||
string DerivedName = llGetSubString(llStringTrim(message,STRING_TRIM),8,llStringLength(llStringTrim(message,STRING_TRIM))); | |||
// check if already on the 'Exclude List'. If not, add them | |||
if (llListFindList(ExcludeListing, (list)DerivedName) != -1 ) | |||
{ | |||
llOwnerSay(DerivedName + " already exists on the " + ObjectName + "'s 'Exclude List'."); | |||
} | |||
else | |||
{ | |||
ExcludeListing = (list)DerivedName + llList2List( ExcludeListing, 0, (ExcludeListSize - 2)); | |||
llOwnerSay(DerivedName + " has been added to the " | |||
+ ObjectName + "'s 'Exclude List'. \nThere are now " + (string)(ExcludeListSize - llGetListLength(ExcludeListing)) + " available slots remaining on this list."); | |||
} | |||
} | } | ||
else if (message == " | else if (((llGetSubString(message,0,6) == "Include") || (llGetSubString(message,0,6) == "include")) && (id == ObjectOwner)) | ||
{ | { | ||
string DerivedName = llGetSubString(llStringTrim(message,STRING_TRIM),8,llStringLength(llStringTrim(message,STRING_TRIM))); | |||
// check if already on the 'Exclude List'. If so, remove them | |||
if (llListFindList(ExcludeListing, (list)DerivedName) != -1 ) | |||
{ | |||
integer ExcludeListPosition = llListFindList(ExcludeListing, (list)DerivedName); | |||
ExcludeListing = llDeleteSubList(ExcludeListing, ExcludeListPosition, ExcludeListPosition); | |||
llOwnerSay(DerivedName + " has been removed from the " | |||
+ ObjectName + "'s 'Exclude List'. \nThere are now " + (string)(ExcludeListSize - llGetListLength(ExcludeListing)) + " available slots remaining on this list."); | |||
} | |||
else | |||
{ | |||
llOwnerSay(DerivedName + " is not listed the " + ObjectName + "'s 'Exclude List' and therefore cannot be removed."); | |||
} | |||
} | } | ||
else if (message == " | else if (((llGetSubString(message,0,7) == "ClearAll") || (llGetSubString(message,0,7) == "clearall") || (llGetSubString(message,0,8) == "clear all") || (llGetSubString(message,0,8) == "Clear all")) && (id == ObjectOwner)) | ||
{ | { | ||
ExcludeListing = []; | |||
llOwnerSay("The 'Exclude List' has been cleared. All " + (string)ExcludeListSize + " slots are available."); | |||
} | } | ||
else if (message == " | else if (((llGetSubString(message,0,3) == "List") || (llGetSubString(message,0,3) == "list")) && (id == ObjectOwner)) | ||
{ | { | ||
if (llGetListLength(ExcludeListing) > 0) | |||
{ | |||
llOwnerSay("The following " + (string)llGetListLength(ExcludeListing) + " AV's are listed on the 'Exclude List':\n" | |||
+ llDumpList2String(ExcludeListing, " | ")); | |||
} | |||
else | |||
{ | |||
llOwnerSay("No AV's are listed on the 'Exclude List'."); | |||
} | |||
} | } | ||
else | else | ||
Line 391: | Line 506: | ||
llInstantMessage(DetectedUser, "Unrecognised option or selection made from a timed-out menu."); | llInstantMessage(DetectedUser, "Unrecognised option or selection made from a timed-out menu."); | ||
} | } | ||
} | } | ||
timer() | timer() | ||
{ | { | ||
CloseUserListen(); | |||
} | } | ||
//default end | //default end | ||
} | } | ||
</lsl> | </lsl> |
Revision as of 15:11, 11 January 2008
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
~ RANDOM AV PROFILE PICTURE PROJECTOR v5.1 by Debbie Trilling ~
Profile: http://wiki.secondlife.com/wiki/User:Debbie_Trilling
<lsl> // ~ RANDOM AV PROFILE PICTURE PROJECTOR v5.2 by Debbie Trilling ~
// *** This script randomly selects an AV from a crowd & then displays their // profile picture as texture on a prim and/or a 'holographic' image projected above the prim***
// Free to use as you wish by under condition that the title and this introduction remain in place, // and that due credit continues to be given to Moriash Moreau, Jana Kamachi and Solar Alter, and // Debbie Trilling.
// TOUCH to switch ON and OFF
//ONLINE HELP AT: http://wiki.secondlife.com/wiki/Talk:Random_AV_Profile_Projector
// ** PARAMETERS THAT YOU CAN CHANGE **
//************************
// GENERAL PARAMETERS
//************************
// listen channel for Owner
integer OwnerChannel = 54321;
// the number of seconds that a listen remains open before timing-out & automatically closing float DialogTimeout = 20.00;
// how often in seconds the sensor fires float RepeatTime = 35.00;
// sensor range in meters. Maximum 96m but in practice 10 to 30m because of particle draw distance float Range = 25.00;
// sets the number of consecutive times that the scanner is allowed to operate without having located an AV within range // eg: if RepeatTime = 60.0 seconds and TotalNoScansAllowed = 30, then the toy will operate for 1800 seconds (60x30, or 30 minutes) without locating // anyone before it automatically powers down. Set to '0' to disable the auto-off function integer TotalNoScansAllowed = 20;
// texture palette of UUID's. One will be randomly selected for display when an AV without a profile pic is selected list DefaultTexturePalette = ["7cfd684e-2141-941c-eac8-bd439f0d5a9f", "d02531dd-491c-45b5-2cab-2e47ec81ec0d", "c3eebd9e-ee92-a16f-f906-bc275928df86"];
// sets whether the DefaultTexturePalette will be used to texture/projecte when the toy is switched OFF. 'TRUE' to texture/project; 'FALSE' to have no texturing/projection when off integer EmployDefaultTexture = TRUE;
//************************
// PARTICLE EMISSION PARAMETERS
//************************
// set to TRUE to display the profile picture as a particle 'holographic' image above the prim
integer DisplayBanner = TRUE;
// width size in meters of the projected image (max 4.00) float Size = 2.50;
// height above object the centre of projected image will be (theoretical max. 50.0, in practice 2.0 to 10.0)) float Height = 2.50;
//************************
// PRIM TEXTURE PARAMETERS
//************************
// set to TRUE to texture the prim with the profile picture on ALL_SIDES
integer TexturePrim = TRUE;
// the following 'Prim*' parameters effect the prim only if EmployDefaultTexture and/or TexturePrim = FALSE // if either = TRUE then the prim is automatically set to solid blank white with full bright // texture to use for the prim when toy is OFF key PrimUUIDTexture = "5748decc-f629-461c-9a36-a35a221fe21f";
// set to TRUE to turn on Full Bright on ALL_SIDES when the toy is OFF integer PrimFullBright = FALSE;
// vector for the prim colour when toy is OFF vector PrimColour = <0.0, 0.0, 0.0>;
// set the alpha of the prim from 0.0 (clear) to 1.0 (solid) for when toy is OFF float PrimAlpha = 1.00;
//************************
// SHOUTOUT PARAMETERS
//************************
// set to 'TRUE' to give a 'ShoutOut' to the AV once they have been selected; 'FALSE' for no 'ShoutOut'
integer ShoutOut = TRUE;
// text to 'ShoutOut' when an AV's profile is projected. Text will be preceeded by their name, eg: "<AV Name>'s face is up in lights!" string ShoutOutText = "'s face is up in lights!";
//************************
// ** DO NOT CHANGE BELOW THIS LINE **
//************************
string URL_FORUMTHREAD = "http://forums.secondlife.com/showthread.php?t=225692";
string URL_WIKIPAGE = "http://wiki.secondlife.com/wiki/User:Debbie_Trilling";
string URL_HELPPAGE = "http://wiki.secondlife.com/wiki/Talk:Random_AV_Profile_Projector";
string URL_RESIDENT = "http://world.secondlife.com/resident/";
key LastTexture = "";
integer Power = FALSE;
string PowerText = "On";
integer NoSensorCounter = 0;
key AVKey = "";
key DetectedUser = "";
key ObjectOwner = "";
string OwnerName = "";
string ObjectName = "Profile Projector";
string Author = "Debbie Trilling";
string Supplier = "The Particle Crucible";
string Version = " v5.3";
integer ListenChannel;
integer ListenChannel2;
list ExcludeListing = [];
integer ExcludeListSize = 50;
integer OwnerListen = FALSE;
string OwnerListenText = "OpenListen";
GiveShoutOut()
{
// any interaction with selected AV (give Inventory items etc) can safely be done from this function
// this function will only execute if ShoutOut == TRUE
//although fondly calling it a 'ShoutOut', it actually makes more sense to keep within the 20m range of llSay llSay(0, llKey2Name(AVKey) + ShoutOutText);
}
ProjectTexture()
{
// are we going to use a default texture when toy is OFF?
if (EmployDefaultTexture)
{
if (TexturePrim)
{
// using a default texture; if putting texture on the prim, let's make sure it is solid white, blank. full bright
llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, TRUE, PRIM_COLOR, ALL_SIDES, <1.0, 1.0, 1.0>, 1.0 ]);
}
else
{
// not texturing the prim, so apply the prom preferences
ApplyPrimPrefs();
}
ParticleStart((key)llList2String(DefaultTexturePalette, (integer)llFrand((float)llGetListLength(DefaultTexturePalette))));
}
else
{
// we're not doing anything when the toy is OFF; change the prim to user preferences
llParticleSystem([]);
ApplyPrimPrefs();
}
}
ApplyPrimPrefs() { llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, PrimFullBright, PRIM_TEXTURE, ALL_SIDES, PrimUUIDTexture, <1.000000, 1.000000, 0.000000>, <0.000000, 0.000000, 0.000000>, 0.000000, PRIM_COLOR, ALL_SIDES, PrimColour, PrimAlpha ]); }
ParticleStart(key texture)
{
if (DisplayBanner)
{
//core code by Moriash Moreau. Adapted to suit by Debbie Trilling
llParticleSystem([
PSYS_PART_FLAGS, 0,
PSYS_SRC_PATTERN, 4,
PSYS_PART_START_ALPHA, 0.50,
PSYS_PART_END_ALPHA, 0.50,
PSYS_PART_START_COLOR, <1.0,1.0,1.0>,
PSYS_PART_END_COLOR, <1.0,1.0,1.0>,
PSYS_PART_START_SCALE, <Size * 1.6 ,Size,0.00>,
PSYS_PART_END_SCALE, <Size * 1.6,Size,0.00>,
PSYS_PART_MAX_AGE, 1.20,
PSYS_SRC_MAX_AGE, 0.00,
PSYS_SRC_ACCEL, <0.0,0.0,0.0>,
PSYS_SRC_ANGLE_BEGIN, 0.00,
PSYS_SRC_ANGLE_END, 0.00,
PSYS_SRC_BURST_PART_COUNT, 8,
PSYS_SRC_BURST_RADIUS, Height,
PSYS_SRC_BURST_RATE, 0.10,
PSYS_SRC_BURST_SPEED_MIN, 0.00,
PSYS_SRC_BURST_SPEED_MAX, 0.00,
PSYS_SRC_OMEGA, <0.00,0.00,0.00>,
PSYS_SRC_TEXTURE, texture]);
}
if (TexturePrim) { llSetTexture(texture, ALL_SIDES); } }
AnnounceWelcome() { llOwnerSay( "\nThank you for your interest in this " + ObjectName + " " + Version + " created by " + Author + " at " + Supplier + ". \nTOUCH the " + ObjectName + " to operate it."); }
CloseAllListens() { llSetTimerEvent(0.0); llListenRemove(ListenChannel); llListenRemove(ListenChannel2); OwnerListenText = "OpenListen"; }
CloseUserListen() { llSetTimerEvent(0.0); llListenRemove(ListenChannel); }
ShutDown()
{
Power = FALSE;
PowerText = "On";
llSensorRemove();
ProjectTexture();
CloseAllListens();
llOwnerSay("\nThe " + ObjectName + " is now switched OFF.");
}
StartUp()
{
Power = TRUE;
PowerText = "Off";
NoSensorCounter = 0;
CloseAllListens();
llSensorRepeat("",NULL_KEY,AGENT,Range,PI,RepeatTime);
llOwnerSay("\nThe " + ObjectName + " is now switched ON. Please wait...");
}
default
{
on_rez(integer start_param) { // reset script on rez llResetScript(); }
changed( integer change ) { if(change & CHANGED_OWNER ) { // reset script on change of owner llResetScript(); } }
state_entry() { //initialise system llParticleSystem([]); ObjectOwner = llGetOwner(); OwnerName = llKey2Name(ObjectOwner); llSetObjectName(ObjectName + Version); llSetObjectDesc("Supplied free by " + Author + "'s " + Supplier); llSetText("'Touch' for information",<1.0,1.0,0.0>,0.8); ProjectTexture(); AnnounceWelcome(); }
touch_start(integer total_number) { DetectedUser = llDetectedKey(0); list MenuItems = ["LearnMore", "GetScript","Help"]; string MenuText = "MAIN MENU: Please make a selection within " + (string)llFloor(DialogTimeout) + " seconds.\n- LearnMore: Read the forum thread on this product\n- GetScript: Get yourself the latest version of this free script\n- Help: Link to the " + ObjectName + " Help page";
if (DetectedUser == ObjectOwner) { if (Power) { MenuItems = [PowerText, OwnerListenText] + MenuItems; MenuText = MenuText + "\n- Off: Power Down \n- Open/CloseListen: Opens/Closes channel " + (string)OwnerChannel; } else { MenuItems = (list)PowerText + MenuItems; MenuText = MenuText + "\n- On: Power Up"; } } else { // touched by someone other than Owner. Send them a message & a dialog box of options llInstantMessage(DetectedUser, "\nThank you for your interest in the " + ObjectName + " created by " + Author + "\nThe dialog menu offers a number of options."); // if already on 'Exclude List', give opportunity to clear their name, else give opportunity to exclude their name if (llListFindList(ExcludeListing, (list)llKey2Name(AVKey)) != -1 ) { // they are on the 'Exclude List' so give opportunity to clear their name MenuItems = (list)"IncludeMe" + MenuItems; MenuText = MenuText + "\n- IncludeMe: Have the " + ObjectName + " remove your name from the 'Exclude List'"; } else { // they are not on the 'Exclude List' so give opportunity to add their name MenuItems = (list)"ExcludeMe" + MenuItems; MenuText = MenuText + "\n- ExcludeMe: Have your name added to the " + ObjectName + "'s 'Exclude List'"; } } // generate the dialog menu integer CommChannel = (-200000 - ((integer)llFrand(12345) * -1)); ListenChannel = llListen(CommChannel, "", DetectedUser, ""); llDialog(DetectedUser, MenuText, MenuItems, CommChannel); llSetTimerEvent(DialogTimeout); }
sensor(integer total_number)
{
// save the AV key in case it is needed for a 'ShoutOut'
AVKey = llDetectedKey((integer)llFrand(total_number));
// core code by Jana Kamachi and Solar Alter. Adapted to suit by Debbie Trilling
llHTTPRequest( URL_RESIDENT + (string)AVKey,[HTTP_METHOD,"GET"],"");
}
no_sensor()
{
// counts the number of times that the scanner doesn't find anyone in range. If TotalNoScansAllowed is set to greater than zero, automatically powers down the toy
// when the number of no_sensors exceeds TotalNoScansAllowed. However, this functionality is disabled if TotalNoScansAllowed is set to zero.
NoSensorCounter++;
if ((NoSensorCounter > TotalNoScansAllowed) && (TotalNoScansAllowed > 0))
{
ShutDown();
llInstantMessage(ObjectOwner, "\nThe " + ObjectName + " has been automatically switched OFF as no Agents have been detected within the set timeframe.");
}
else
{
ParticleStart((key)llList2String(DefaultTexturePalette, (integer)llFrand((float)llGetListLength(DefaultTexturePalette))));
}
}
http_response(key req,integer stat, list met, string body)
{
// core code by Jana Kamachi and Solar Alter. Adapted to suit by Debbie Trilling
integer s1 = 0;
integer s2 = 0;
integer s1l= 0;
integer s2l= -3;
s1 = llSubStringIndex(body,"<img alt=\"profile image\" src=\"http://secondlife.com/app/image/");
s1l = llStringLength("<img alt=\"profile image\" src=\"http://secondlife.com/app/image/");
s2 = llSubStringIndex(body,"\" class=\"parcelimg\" />");
if(s1 == -1) { // selected AV doesn't have a profile picture, so use the default instead ParticleStart((key)llList2String(DefaultTexturePalette, (integer)llFrand((float)llGetListLength(DefaultTexturePalette)))); } else { //check whether this was the texture used last time if ((key)llGetSubString(body,s1+s1l,s2+s2l) == LastTexture) { // same profile pic as last time. so display a random default instead ParticleStart((key)llList2String(DefaultTexturePalette, (integer)llFrand((float)llGetListLength(DefaultTexturePalette)))); // clear the last texture out LastTexture = ""; } else { // are they on the ExcludeListing? if so, display a random default texture instead if (llListFindList(ExcludeListing, (list)llKey2Name(AVKey)) != -1 ) { // they are on the 'Exclude List' ParticleStart((key)llList2String(DefaultTexturePalette, (integer)llFrand((float)llGetListLength(DefaultTexturePalette)))); } else { // different profile from last time & not on ExcludeListing, so display it ParticleStart((key)llGetSubString(body,s1+s1l,s2+s2l)); // save the key for comparison purposes next time tho' LastTexture = (key)llGetSubString(body,s1+s1l,s2+s2l);
// give a 'ShoutOut', if set to do so if (ShoutOut) { GiveShoutOut(); } } } } }
listen(integer channel, string name, key id, string message)
{
if (message == "LearnMore") { llLoadURL(DetectedUser, "Thank you for choosing to learn more about the " + ObjectName + ".This link will take you to the relevant SL forum thread.", URL_FORUMTHREAD); CloseUserListen(); } else if (message == "GetScript") { llLoadURL(DetectedUser, "Thank you for choosing to look at the script for the " + ObjectName + ".This link will allow you to get your own free copy.", URL_WIKIPAGE); CloseUserListen(); } else if (message == "Help") { llLoadURL(ObjectOwner, "This link will take you to the " + ObjectName + "'s Help page.", URL_HELPPAGE); CloseUserListen(); } else if (message == "ExcludeMe") { ExcludeListing = (list)llKey2Name(DetectedUser) + llList2List( ExcludeListing, 0, (ExcludeListSize - 2)); llInstantMessage(DetectedUser, "You have been added to the " + ObjectName + "'s 'Exclude List'"); CloseUserListen(); } else if (message == "IncludeMe") { integer ExcludeListPosition = llListFindList(ExcludeListing, (list)llKey2Name(DetectedUser)); ExcludeListing = llDeleteSubList(ExcludeListing, ExcludeListPosition, ExcludeListPosition); llInstantMessage(DetectedUser, "You have been removed from the " + ObjectName + "'s 'Exclude List'"); CloseUserListen(); } else if ((message == "On") && (id == ObjectOwner)) { StartUp(); } else if ((message == "Off") && (id == ObjectOwner)) { ShutDown(); } else if ((message == "OpenListen") && (id == ObjectOwner)) { // open the Owner Only channel ListenChannel2 = llListen(OwnerChannel, "", ObjectOwner, ""); OwnerListenText = "CloseListen"; llOwnerSay("Owner Only channel " + (string)OwnerChannel + " is now open for you.\n Options are: 'Exclude <AV_NAME>', 'Include <AV_NAME>', 'ClearAll' and 'List'"); } else if ((message == "CloseListen") && (id == ObjectOwner)) { // close the Owner Only channel llListenRemove(ListenChannel2); OwnerListenText = "OpenListen"; llOwnerSay("Owner Only channel " + (string)OwnerChannel + " is now closed."); } else if (((llGetSubString(message,0,6) == "Exclude") || (llGetSubString(message,0,6) == "exclude")) && (id == ObjectOwner)) { string DerivedName = llGetSubString(llStringTrim(message,STRING_TRIM),8,llStringLength(llStringTrim(message,STRING_TRIM))); // check if already on the 'Exclude List'. If not, add them if (llListFindList(ExcludeListing, (list)DerivedName) != -1 ) { llOwnerSay(DerivedName + " already exists on the " + ObjectName + "'s 'Exclude List'."); } else { ExcludeListing = (list)DerivedName + llList2List( ExcludeListing, 0, (ExcludeListSize - 2)); llOwnerSay(DerivedName + " has been added to the " + ObjectName + "'s 'Exclude List'. \nThere are now " + (string)(ExcludeListSize - llGetListLength(ExcludeListing)) + " available slots remaining on this list."); } } else if (((llGetSubString(message,0,6) == "Include") || (llGetSubString(message,0,6) == "include")) && (id == ObjectOwner)) { string DerivedName = llGetSubString(llStringTrim(message,STRING_TRIM),8,llStringLength(llStringTrim(message,STRING_TRIM))); // check if already on the 'Exclude List'. If so, remove them if (llListFindList(ExcludeListing, (list)DerivedName) != -1 ) { integer ExcludeListPosition = llListFindList(ExcludeListing, (list)DerivedName); ExcludeListing = llDeleteSubList(ExcludeListing, ExcludeListPosition, ExcludeListPosition); llOwnerSay(DerivedName + " has been removed from the " + ObjectName + "'s 'Exclude List'. \nThere are now " + (string)(ExcludeListSize - llGetListLength(ExcludeListing)) + " available slots remaining on this list."); } else { llOwnerSay(DerivedName + " is not listed the " + ObjectName + "'s 'Exclude List' and therefore cannot be removed."); } } else if (((llGetSubString(message,0,7) == "ClearAll") || (llGetSubString(message,0,7) == "clearall") || (llGetSubString(message,0,8) == "clear all") || (llGetSubString(message,0,8) == "Clear all")) && (id == ObjectOwner)) { ExcludeListing = []; llOwnerSay("The 'Exclude List' has been cleared. All " + (string)ExcludeListSize + " slots are available.");
} else if (((llGetSubString(message,0,3) == "List") || (llGetSubString(message,0,3) == "list")) && (id == ObjectOwner)) { if (llGetListLength(ExcludeListing) > 0) { llOwnerSay("The following " + (string)llGetListLength(ExcludeListing) + " AV's are listed on the 'Exclude List':\n" + llDumpList2String(ExcludeListing, " | ")); } else { llOwnerSay("No AV's are listed on the 'Exclude List'."); } } else { llInstantMessage(DetectedUser, "Unrecognised option or selection made from a timed-out menu."); }
}
timer() { CloseUserListen(); }
//default end
}
</lsl>