Difference between revisions of "User:Fred Gandt/Scripts/Continued 2"
Fred Gandt (talk | contribs) m (→Swingin' Door: Fixed lil thing) |
Fred Gandt (talk | contribs) (→Swingin' Door: Added a new function (urgh but works (or seems to)). Removed offer of demo since the update.) |
||
Line 140: | Line 140: | ||
=== Swingin' Door === | === Swingin' Door === | ||
''' | '''NOW LESS LIKELY TO GET FREAKED OUT BY ODD ROTATIONS''' | ||
'''I have tested this more and there are still a couple of little bumps in it. I'm working on it...''' | |||
'''I have tested this | |||
'''I will add notes and guidance when I have finished the script.''' | '''I will add notes and guidance when I have finished the script.''' | ||
Line 192: | Line 159: | ||
// Touch and hold until a blue drop-down dialog shows for config options. | // Touch and hold until a blue drop-down dialog shows for config options. | ||
list angle_list = ["210", "240", "270", "120", "150", "180", "30", "60", "90"]; | list angle_list = ["210", "240", "270", "120", "150", "180", "30", "60", "90"]; // More choices to come. | ||
key LL_Brazillian_Rosewood = "a25bebc8-4739-453d-d44e-fc522cf95488"; | key LL_Brazillian_Rosewood = "a25bebc8-4739-453d-d44e-fc522cf95488"; | ||
Line 229: | Line 196: | ||
integer t_count; | integer t_count; | ||
integer aligned; | |||
integer global; | integer global; | ||
Line 279: | Line 248: | ||
llPlaySound(door_sound, 1.0); | llPlaySound(door_sound, 1.0); | ||
} | } | ||
float d; | |||
float a = angle; | |||
vector v = (llRot2Euler(llGetLocalRot())*RAD_TO_DEG); | vector v = (llRot2Euler(llGetLocalRot())*RAD_TO_DEG); | ||
float x = llFabs(v.x); | float x = llFabs(v.x); | ||
float y = v.y; | |||
float z = v.z; | float z = v.z; | ||
if(x < 1.0) | if(x < 1.0) | ||
d = 1.0; | d = 1.0; | ||
else | else | ||
d = -1.0; | d = -1.0; | ||
if(o) | if(o) | ||
{ | { | ||
Line 299: | Line 269: | ||
else | else | ||
llSetTimerEvent(time); | llSetTimerEvent(time); | ||
llTargetOmega(<0.0,0.0,d>, (angle/90.0), 1.0); | if(aligned) | ||
{ | |||
llTargetOmega(<0.0,0.0,d>, (angle/90.0), 1.0); | |||
llSetLocalRot(llEuler2Rot(<x, | llSleep(1.5); | ||
llTargetOmega(ZERO_VECTOR, 0.0, 0.0); | |||
} | |||
llSetLocalRot(llEuler2Rot(<x,y,(z + a)>*DEG_TO_RAD)); | |||
open = (!open); | open = (!open); | ||
} | } | ||
Line 401: | Line 374: | ||
nop = llGetNumberOfPrims(); | nop = llGetNumberOfPrims(); | ||
mln = llGetLinkNumber(); | mln = llGetLinkNumber(); | ||
GetAligned(nop, mln); | |||
} | |||
GetAligned(integer p, integer l) | |||
{ | |||
vector myrot = (llRot2Euler(llGetRot())*RAD_TO_DEG); | |||
vector rootrot = (llRot2Euler(llGetRootRotation())*RAD_TO_DEG); | |||
integer mrx = llRound(llFabs(myrot.x)); | |||
integer mry = llRound(llFabs(myrot.y)); | |||
integer rrx = llRound(llFabs(rootrot.x)); | |||
integer rry = llRound(llFabs(rootrot.y)); | |||
if(p > 1) | |||
{ | |||
if((mrx == rrx && mry == rry)) | |||
aligned = TRUE; | |||
else if((mrx == (rrx + 180) && mry == rry)) | |||
aligned = TRUE; | |||
else if((mrx == (rrx - 180) && mry == rry)) | |||
aligned = TRUE; | |||
else if((mrx == rrx && mry == (rry + 180))) | |||
aligned = TRUE; | |||
else if((mrx == rrx && mry == (rry - 180))) | |||
aligned = TRUE; | |||
else if((mrx == (rrx + 180) && mry == (rry + 180))) | |||
aligned = TRUE; | |||
else if((mrx == (rrx + 180) && mry == (rry - 180))) | |||
aligned = TRUE; | |||
else if((mrx == (rrx - 180) && mry == (rry - 180))) | |||
aligned = TRUE; | |||
else if((mrx == (rrx - 180) && mry == (rry + 180))) | |||
aligned = TRUE; | |||
else | |||
aligned = FALSE; | |||
} | |||
else | |||
{ | |||
if((!mrx) && (!mry)) | |||
aligned = TRUE; | |||
else if((mrx == 180) && (mry == 180)) | |||
aligned = TRUE; | |||
else if((!mrx) && (mry == 180)) | |||
aligned = TRUE; | |||
else if((mrx == 180) && (!mry)) | |||
aligned = TRUE; | |||
else | |||
aligned = FALSE; | |||
} | |||
} | } | ||
Line 489: | Line 509: | ||
dia_msg = "\nSelect the length of time to wait before auto closing or turn off auto closure."; | dia_msg = "\nSelect the length of time to wait before auto closing or turn off auto closure."; | ||
if(llRound(time)) | if(llRound(time)) | ||
dia_msg += ("\nThe time this door is set at is \"" + ((string) | dia_msg += ("\nThe time this door is set at is \"" + ((string)((integer)time)) + "\" seconds now."); | ||
dia_buttons = ["NoAuto", "-", "CANCEL"]; | dia_buttons = ["NoAuto", "-", "CANCEL"]; | ||
dia_buttons += time_list; | dia_buttons += time_list; | ||
Line 495: | Line 515: | ||
else | else | ||
{ | { | ||
dia_msg = ("\nSelect the degree of travel for your doors.\nThis door is set at \"" + ((string) | dia_msg = ("\nSelect the degree of travel for your doors.\nThis door is set at \"" + ((string)angle) + "\" now."); | ||
dia_buttons = ["-", "CANCEL", "-"]; | dia_buttons = ["-", "CANCEL", "-"]; | ||
dia_buttons += angle_list; | dia_buttons += angle_list; | ||
Line 606: | Line 626: | ||
nop = llGetNumberOfPrims(); | nop = llGetNumberOfPrims(); | ||
mln = llGetLinkNumber(); | mln = llGetLinkNumber(); | ||
GetAligned(nop, mln); | |||
Whitelist(NULL_KEY); | Whitelist(NULL_KEY); | ||
} | } | ||
} | } | ||
}</lsl> | }</lsl> |
Revision as of 03:23, 20 February 2010
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
My Contributions
Other Pages
Legal Stuff
The legal stuff about contributing to this wiki (worth reading).
Tuition
Tuition scripts, notes, videos and screenshots etc. (hardly any content yet)
Free Scripts
Online Status Display & Pager
This will display the owners profile picture and a color coded and text texture sign that changes depending on the owners online status.
Just drop the script into a fresh prim.
<lsl>key owner_id;
string owner_name;
key ON_OFF_line = "124cfcec-6b8d-552c-42b8-6a1179884e74";
string profile_url = "http://world.secondlife.com/resident/";
key name_id;
key online_id;
key touch_request_id;
integer lis;
integer channel;
key requester;
OnlineStatus(integer ol, integer tr) {
list ol_params = []; if(ol) ol_params = [17, 5, ON_OFF_line, <1.4,0.25,0.0>, <0.0,0.375,0.0>, (90*DEG_TO_RAD), 18, 5, <0.0,1.0,0.0>, 1.0, 18, 6, <1.0,1.0,1.0>, 1.0]; else ol_params = [17, 5, ON_OFF_line, <1.4,0.25,0.0>, <0.0,0.625,0.0>, (90*DEG_TO_RAD), 18, 5, <1.0,0.0,0.0>, 1.0, 18, 6, <0.5,0.5,0.5>, 1.0]; llSetPrimitiveParams(ol_params); if(tr) { llSetTimerEvent(30.0); if(ol) { lis = llListen(channel, "", requester, ""); llDialog(requester, ("\nWould you like to page " + owner_name + "?"), ["YES", "NO"], channel); } else llInstantMessage(requester, (owner_name + " is currently offline.")); }
}
default {
state_entry() { owner_id = llGetOwner(); name_id = llRequestAgentData(owner_id, DATA_NAME); channel = -5647; } dataserver(key q, string data) { if(q == name_id) { owner_name = data; llSetObjectName(owner_name + "'s Online Status"); llHTTPRequest((profile_url + ((string)owner_id)), [], ""); } else if(q == online_id) OnlineStatus(((integer)data), FALSE); else if(q == touch_request_id) OnlineStatus(((integer)data), TRUE); } http_response(key q, integer status, list metadata, string body) { integer tex_key_start = (llSubStringIndex(body, "imageid") + 18); integer tex_key_end = (tex_key_start + 35); key profile_image = ((key)llGetSubString(body, tex_key_start, tex_key_end)); llSetPrimitiveParams([9, 0, 0, <0.6,0.875,0.0>, 0.02, ZERO_VECTOR, <1.0,1.0,0.0>, ZERO_VECTOR, 8, llEuler2Rot(<0.0,90.0,0.0>*DEG_TO_RAD), 7, <0.85,0.01,0.6>, 17, -1, TEXTURE_BLANK, <1.0,1.0,0.0>, ZERO_VECTOR, 0.0, 18, -1, ZERO_VECTOR, 1.0]); llSetPrimitiveParams([17, 6, profile_image, <1.0,1.0,0.0>, ZERO_VECTOR, (90*DEG_TO_RAD), 17, 5, ON_OFF_line, <1.4,0.25,0.0>, <0.0,0.375,0.0>, (90*DEG_TO_RAD), 19, 5, 0, 1, 18, 6, <1.0,1.0,1.0>, 1.0, 18, 5, <0.0,1.0,0.0>, 1.0, 20, 5, 1, 20, 6, 1]); llSetTimerEvent(0.1); } timer() { llListenRemove(lis); llSetTimerEvent(10.0); online_id = llRequestAgentData(owner_id, DATA_ONLINE); } touch_start(integer nd) { llSetTimerEvent(0.0); requester = llDetectedKey(0); touch_request_id = llRequestAgentData(owner_id, DATA_ONLINE); } listen(integer chan, string name, key id, string msg) { llListenRemove(lis); llSetTimerEvent(10.0); if(msg == "YES") { llInstantMessage(owner_id, ("secondlife:///app/agent/" + ((string)requester) + "/about has requested to message you.")); llInstantMessage(requester, owner_name + " has been paged."); } }
}</lsl>
Swingin' Door
NOW LESS LIKELY TO GET FREAKED OUT BY ODD ROTATIONS
I have tested this more and there are still a couple of little bumps in it. I'm working on it...
I will add notes and guidance when I have finished the script.
Although this is far more featured than you might imagine the one thing you need to know to get full use is to include a notecard in the doors something like the example below.
<lsl>Whitelist Fred Gandt Elmer Fudd Rank Xerox Blacklist The Joker Miss Crabapple M Linden</lsl><lsl>// Don't fiddle with the contents of this script unless you know what you're doing. // I designed it to be dragged and dropped into a fresh prim. // Touch and hold until a blue drop-down dialog shows for config options.
list angle_list = ["210", "240", "270", "120", "150", "180", "30", "60", "90"]; // More choices to come.
key LL_Brazillian_Rosewood = "a25bebc8-4739-453d-d44e-fc522cf95488";
list time_list = ["16", "18", "20","10", "12", "14", "4", "6", "8"];
key Door_Opening = "99236139-075b-3057-7c6f-0f68bb2af001";
key Door_Closing = "43e46041-25fa-0a03-7be8-78297f579d53";
key Doorbell = "213aae54-6093-7fcc-118f-3039a5435986";
integer notecard_length;
integer sound_on = TRUE;
string dia_msg = "\n";
list dia_buttons = [];
list whitelist = [];
list blacklist = [];
float angle = 90.0;
integer count_NCL;
string owner_name;
float time = 6.0;
integer dia_chan;
integer dia_lis;
integer t_count;
integer aligned;
integer global;
integer locked;
integer group;
integer local;
integer IGAN;
integer dead;
integer open;
integer nop;
key bell_id;
integer mln;
integer ot;
string NCN;
key owner;
key NoNL;
key NCK;
key OLC;
key NL;
OperateDoor(integer o, integer lm) {
if(nop >= 2 && (!lm)) llMessageLinked(LINK_ALL_OTHERS, dia_chan, owner_name, owner); if(sound_on) { key door_sound; if(o) door_sound = Door_Closing; else door_sound = Door_Opening; llPlaySound(door_sound, 1.0); } float d; float a = angle; vector v = (llRot2Euler(llGetLocalRot())*RAD_TO_DEG); float x = llFabs(v.x); float y = v.y; float z = v.z; if(x < 1.0) d = 1.0; else d = -1.0; if(o) { if(x < 1.0) d = -1.0; else d = 1.0; a = -angle; llSetTimerEvent(0.0); } else llSetTimerEvent(time); if(aligned) { llTargetOmega(<0.0,0.0,d>, (angle/90.0), 1.0); llSleep(1.5); llTargetOmega(ZERO_VECTOR, 0.0, 0.0); } llSetLocalRot(llEuler2Rot(<x,y,(z + a)>*DEG_TO_RAD)); open = (!open);
}
TouchMeAllOver(key id, integer t, integer te) {
if(t && id == owner) { ot = TRUE; global = FALSE; local = FALSE; dia_msg = "\n\"Global\" - Instruct all doors linked to this. \n\"Local\" - Instruct only locally linked doors. \n\"Self\" - Instruct only this door."; dia_buttons = ["Self", "Local", "CANCEL", "Global"]; dia_lis = llListen(dia_chan, owner_name, owner, ""); llDialog(owner, dia_msg, dia_buttons, dia_chan); } if(te) { if(t_count < 10) { if(!dead) { if(!Whitelist(id)) { bell_id = id; OLC = llRequestAgentData(owner, DATA_ONLINE); return; } } else { if(id != owner) return; } OperateDoor(open, FALSE); } t_count = 0; }
}
integer Whitelist(key id) {
integer w = TRUE; integer index; if(id == NULL_KEY) { whitelist = []; blacklist = []; count_NCL = 0; NCN = llGetInventoryName(INVENTORY_NOTECARD, 0); if(llStringLength(NCN)) { IGAN = TRUE; NCK = llGetInventoryKey(NCN); llMessageLinked(LINK_ALL_OTHERS, dia_chan, "IGAN", NCK); NoNL = llGetNumberOfNotecardLines(NCN); } else { IGAN = FALSE; if(nop > 1) llMessageLinked(LINK_ALL_OTHERS, dia_chan, "IGAN", owner); } } else { if(id != owner) { if(locked) { index = llListFindList(whitelist, [llKey2Name(id)]); if(index == -1) w = FALSE; if(group) { if(!w) { if(llSameGroup(id)) w = TRUE; } } } index = llListFindList(blacklist, [llKey2Name(id)]); if(index != -1) w = FALSE; } } return w;
}
GetCracking() {
owner = llGetOwner(); dia_chan = (-1 * llAbs(((integer)("0x" + llGetSubString(((string)owner), -9, -3))))); owner_name = llKey2Name(owner); nop = llGetNumberOfPrims(); mln = llGetLinkNumber(); GetAligned(nop, mln);
}
GetAligned(integer p, integer l) {
vector myrot = (llRot2Euler(llGetRot())*RAD_TO_DEG); vector rootrot = (llRot2Euler(llGetRootRotation())*RAD_TO_DEG); integer mrx = llRound(llFabs(myrot.x)); integer mry = llRound(llFabs(myrot.y)); integer rrx = llRound(llFabs(rootrot.x)); integer rry = llRound(llFabs(rootrot.y)); if(p > 1) { if((mrx == rrx && mry == rry)) aligned = TRUE; else if((mrx == (rrx + 180) && mry == rry)) aligned = TRUE; else if((mrx == (rrx - 180) && mry == rry)) aligned = TRUE; else if((mrx == rrx && mry == (rry + 180))) aligned = TRUE; else if((mrx == rrx && mry == (rry - 180))) aligned = TRUE; else if((mrx == (rrx + 180) && mry == (rry + 180))) aligned = TRUE; else if((mrx == (rrx + 180) && mry == (rry - 180))) aligned = TRUE; else if((mrx == (rrx - 180) && mry == (rry - 180))) aligned = TRUE; else if((mrx == (rrx - 180) && mry == (rry + 180))) aligned = TRUE; else aligned = FALSE; } else { if((!mrx) && (!mry)) aligned = TRUE; else if((mrx == 180) && (mry == 180)) aligned = TRUE; else if((!mrx) && (mry == 180)) aligned = TRUE; else if((mrx == 180) && (!mry)) aligned = TRUE; else aligned = FALSE; }
}
default {
on_rez(integer param) { GetCracking(); Whitelist(NULL_KEY); } state_entry() { GetCracking(); vector pos = llGetPos(); llSetPrimitiveParams([9, 0, 0, <0.125, 0.375, 0.0>, 0.0,ZERO_VECTOR, <1.0, 1.0, 0.0>, ZERO_VECTOR, 17, 0, LL_Brazillian_Rosewood, <2.0, 0.1, 0.0>, <0.5, 0.025, 0.0>, 0.0, 17, 1, LL_Brazillian_Rosewood, <2.0, 1.0, 0.0>, <0.5, 0.0, 0.0>, 0.0, 17, 2, LL_Brazillian_Rosewood, <0.05, 1.0, 0.0>, <0.0125, 0.0, 0.0>, 0.0, 17, 3, LL_Brazillian_Rosewood, <2.0, 0.1, 0.0>, <0.5, -0.025, 0.0>, 0.0, 17, 4, LL_Brazillian_Rosewood, <0.05, 1.0, 0.0>, ZERO_VECTOR, 0.0, 17, 5, LL_Brazillian_Rosewood, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0, 19,ALL_SIDES,1,13, 7, <3.0, 0.2, 3.0>]); Whitelist(NULL_KEY); } listen(integer chan, string name, key id, string msg) { llListenRemove(dia_lis); if(msg != "CANCEL") { if(msg == "Global" | msg == "Local" | msg == "Self") { if(msg == "Global") global = TRUE; else if(msg == "Local") local = TRUE; dia_msg = "\nConfigure your doors."; dia_buttons = ["AutoClose", "CANCEL", "Angle"]; if(sound_on) dia_buttons += ["SoundOff"]; else dia_buttons += ["SoundOn"]; if(locked) dia_buttons += ["UnLock"]; else dia_buttons += ["Lock"]; if(group) dia_buttons += ["GroupOff"]; else dia_buttons += ["GroupOn"]; if(dead) dia_buttons += ["UnDead"]; else dia_buttons += ["DeadLock"]; if(global) llMessageLinked(LINK_ALL_OTHERS, dia_chan, "ALTT", owner); else if(local) llMessageLinked(LINK_ALL_OTHERS, dia_chan, "LTT", owner); dia_lis = llListen(dia_chan, owner_name, owner, ""); llDialog(owner, dia_msg, dia_buttons, dia_chan); } else if(msg == "SoundOff") sound_on = FALSE; else if(msg == "SoundOn") sound_on = TRUE; else if(msg == "UnLock") locked = FALSE; else if(msg == "Lock") locked = TRUE; else if(msg == "GroupOff") group = FALSE; else if(msg == "GroupOn") group = TRUE; else if(msg == "UnDead") dead = FALSE; else if(msg == "DeadLock") dead = TRUE; else if(msg == "NoAuto") time = 0.0; else if(msg == "AutoClose" | msg == "Angle") { dia_lis = llListen(dia_chan, owner_name, owner, ""); if(ot) { ot = FALSE; if(msg == "AutoClose") { dia_msg = "\nSelect the length of time to wait before auto closing or turn off auto closure."; if(llRound(time)) dia_msg += ("\nThe time this door is set at is \"" + ((string)((integer)time)) + "\" seconds now."); dia_buttons = ["NoAuto", "-", "CANCEL"]; dia_buttons += time_list; } else { dia_msg = ("\nSelect the degree of travel for your doors.\nThis door is set at \"" + ((string)angle) + "\" now."); dia_buttons = ["-", "CANCEL", "-"]; dia_buttons += angle_list; } llDialog(owner, dia_msg, dia_buttons, dia_chan); } } else if(msg != "-") { float m = ((float)msg); if(m > 20.0) angle = m; else time = m; } } } dataserver(key q, string data) { if(q == NoNL) { notecard_length = ((integer)data); NL = llGetNotecardLine(NCN, count_NCL); } else if(q == NL) { if(data != EOF) whitelist += [data]; if(count_NCL < notecard_length) NL = llGetNotecardLine(NCN, (++count_NCL)); else { integer index = llListFindList(whitelist, ["blacklist"]); blacklist = llList2List(whitelist, index, -1); whitelist = llDeleteSubList(whitelist, index, -1); } } else if(q == OLC) { if(((integer)data)) { llPlaySound(Doorbell, 1.0); llInstantMessage(owner, (llKey2Name(bell_id) + " is at the door")); } } } link_message(integer sender, integer num, string str, key id) { if(str != "IGAN") { if(sender == (mln + 1) | sender == (mln - 1)) { if(num == dia_chan && str == owner_name && id == owner) OperateDoor(open, TRUE); else if(num == dia_chan && str == "LTT" && id == owner) dia_lis = llListen(dia_chan, owner_name, owner, ""); } if(num == dia_chan && str == "ALTT" && id == owner) dia_lis = llListen(dia_chan, owner_name, owner, ""); } else { if(num == dia_chan && id == owner) { if(IGAN) llMessageLinked(LINK_ALL_OTHERS, dia_chan, "IGAN", NCK); } else { NCN = ((string)id); whitelist = []; blacklist = []; count_NCL = 0; NoNL = llGetNumberOfNotecardLines(NCN); } } } touch(integer nd) { ++t_count; if(t_count >= 10) { key id = llDetectedKey(0); TouchMeAllOver(id, TRUE, FALSE); } } touch_end(integer nd) { key id = llDetectedKey(0); TouchMeAllOver(id, FALSE, TRUE); } timer() { llSetTimerEvent(0.0); ot = FALSE; llListenRemove(dia_lis); OperateDoor(open, FALSE); } changed(integer change) { if(change & CHANGED_INVENTORY) { IGAN = FALSE; Whitelist(NULL_KEY); } if(change & CHANGED_LINK) { llSleep(2.0); nop = llGetNumberOfPrims(); mln = llGetLinkNumber(); GetAligned(nop, mln); Whitelist(NULL_KEY); } }
}</lsl>