//start_unprocessed_text /*key gMaskOwner = NULL_KEY; key gKeyHolder = NULL_KEY; string gKeyHolderName; key gCurrentUser = NULL_KEY; key gOwner = NULL_KEY; string gOwnerName; integer gMufflerListener; integer gMufflerChannel; integer gMufflerStrength = 0; integer gCommandListener; integer gCommandChannel; integer gCommandTimeout = 0; integer gTimelock = 0; list gSensorKeys; list gSensorNames; string OBJECT_TYPE = "gasmask"; integer FULL_MASK_MODE = FALSE; integer gHearingListener; initialize() { initialize_channels(); reset_listeners(); gMaskOwner = llGetOwner(); if(gKeyHolder != NULL_KEY) { lock(); } else unlock(); set_muffler(); llSetTimerEvent(1); } reset_listeners() { gCommandTimeout = 0; llListenRemove(gCommandListener); gCurrentUser = NULL_KEY; gSensorKeys = []; gSensorNames = []; } initialize_channels() { gMufflerChannel = (integer)("0x"+llGetSubString((string)llGetKey(),-5,-1)); gCommandChannel = -1 * gMufflerChannel; } integer menu_handler() { integer handled = FALSE; if (gCurrentUser == gMaskOwner) { mask_owner_menu(); handled = TRUE; } else if (gOwner == gCurrentUser) { if (gKeyHolder != NULL_KEY && gCurrentUser != gKeyHolder) { string objName = llGetObjectName(); llSetObjectName(llKey2Name(gCurrentUser)); llSay(PUBLIC_CHANNEL, "/me takes back the keys to " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + "."); llSetObjectName(objName); gKeyHolder = gCurrentUser; } owner_menu(); handled = TRUE; } else if (gCurrentUser == gKeyHolder) { key_holder_menu(); handled = TRUE; } else { default_menu(); handled = TRUE; } return handled; } mask_owner_menu() { string message = ""; list commands = ["Cancel", "Lock", "Unlock", "Safeword", "Timelock", "Muffler", "Set Owner"]; integer i; if (gKeyHolder != NULL_KEY) { i = llListFindList(commands, ["Lock"]); commands = llDeleteSubList(commands, i, i); if ((gKeyHolder == gMaskOwner && gTimelock == 0) || (gOwner == gKeyHolder)) { i = llListFindList(commands, ["Safeword"]); commands = llDeleteSubList(commands, i, i); } if (gKeyHolder != gMaskOwner || (gKeyHolder == gMaskOwner && gTimelock > 0)) { i = llListFindList(commands, ["Unlock"]); commands = llDeleteSubList(commands, i, i); i = llListFindList(commands, ["Timelock"]); commands = llDeleteSubList(commands, i, i); i = llListFindList(commands, ["Muffler"]); commands = llDeleteSubList(commands, i, i); } message += "Currently locked by " + gKeyHolderName +".\n"; } else { i = llListFindList(commands, ["Unlock"]); commands = llDeleteSubList(commands, i, i); i = llListFindList(commands, ["Safeword"]); commands = llDeleteSubList(commands, i, i); i = llListFindList(commands, ["Timelock"]); commands = llDeleteSubList(commands, i, i); message += "Currently unlocked.\n"; } if (gOwner == NULL_KEY) message += "No owner set.\n"; else { message += "Current owner: " + gOwnerName + "\n"; i = llListFindList(commands, ["Set Owner"]); commands = llDeleteSubList(commands, i, i); } if (gTimelock > 0) { message += "Timelock active.\n"; } llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandListener = llListen(gCommandChannel, "", gCurrentUser, ""); gCommandTimeout = 20; } owner_menu() { string message = ""; list commands = ["Cancel", "Lock", "Unlock", "Timelock", "Muffler", "Resign Ownership"]; integer i; if (gKeyHolder != NULL_KEY) { i = llListFindList(commands, ["Lock"]); commands = llDeleteSubList(commands, i, i); message += "Currently locked.\n"; } else { i = llListFindList(commands, ["Unlock"]); commands = llDeleteSubList(commands, i, i); i = llListFindList(commands, ["Timelock"]); commands = llDeleteSubList(commands, i, i); message += "Currently unlocked.\n"; } if (gTimelock > 0) { message += "Timelock active.\nTime remaining: " + Time2String(gTimelock) + "\n"; } llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandListener = llListen(gCommandChannel, "", gCurrentUser, ""); gCommandTimeout = 20; } key_holder_menu() { string message = ""; list commands = ["Cancel", "Unlock", "Timelock", "Muffler"]; message += "You have the keys to " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + ".\n"; message += "You are not the owner of " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + ".\n"; if (gTimelock > 0) { message += "Timelock active.\nTime remaining: " + Time2String(gTimelock) + "\n"; } llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandListener = llListen(gCommandChannel, "", gCurrentUser, ""); gCommandTimeout = 20; } default_menu() { string message = ""; list commands = ["Cancel", "Lock"]; message += llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + " is unlocked.\n"; llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandListener = llListen(gCommandChannel, "", gCurrentUser, ""); gCommandTimeout = 20; } timelock_menu() { string message = ""; list commands = ["Cancel", "Back", "Reset", "+5 Min", "+15 Min", "+30 Min", "+1 Hour", "+2 Hour", "+3 Hour", "+6 Hour", "+12 Hour", "+24 Hour"]; if (gTimelock > 0) { if (gKeyHolder == gMaskOwner) { integer i = llListFindList(commands, ["Reset"]); commands = llDeleteSubList(commands, i, i); } message += "Timelock active.\nTime remaining: " + Time2String(gTimelock) + "\n"; } else message += "Timelock inactive.\n"; llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandListener = llListen(gCommandChannel, "", gCurrentUser, ""); gCommandTimeout = 20; } muffler_menu() { string message = ""; list commands = ["Cancel", "Back", "None", "Light", "Heavy", "Extreme"]; message += "Current muffle strength: " + llList2String(commands, gMufflerStrength + 2) + "\n"; commands = llDeleteSubList(commands, gMufflerStrength + 2, gMufflerStrength + 2); llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandTimeout = 20; } lock() { llOwnerSay("@detach=n"); llMessageLinked(LINK_SET, 0, "show", NULL_KEY); } unlock() { gKeyHolder = NULL_KEY; gKeyHolderName = ""; llOwnerSay("@detach=y"); llMessageLinked(LINK_SET, 0, "hide", NULL_KEY); gTimelock = 0; } set_muffler() { if (gMufflerStrength > 0) { llOwnerSay("@redirchat:"+(string)gMufflerChannel+"=add"); llOwnerSay("@emote=add"); if (FULL_MASK_MODE) { gHearingListener = llListen(PUBLIC_CHANNEL, "", "", ""); llOwnerSay("@recvchat=n"); } } else { llOwnerSay("@redirchat:"+(string)gMufflerChannel+"=rem"); llOwnerSay("@emote=rem"); gMufflerListener = llListen(gMufflerChannel, "", gMaskOwner, ""); if (FULL_MASK_MODE) { llListenRemove(gHearingListener); llOwnerSay("@recvchat=y"); } } } string Time2String(integer seconds) { list times = []; if (seconds % 60 > 0) times = [(string)(seconds % 60)+" seconds"] + times; if (seconds % 3600 / 60 > 0) times = [(string)(seconds % 3600 / 60) + " minutes"] + times; if (seconds % 86400 / 3600 > 0) times = [(string)(seconds % 86400 / 3600) + " hours"] + times; if (seconds / 86400 > 0) times = [(string)(seconds / 86400) + " days"] + times; return llList2CSV(times); } string MuffleString(string message) { string out; integer i; for (i=0; i < llStringLength(message); i++) out += MuffleChar(llGetSubString(message, i, i)); return out; } string MuffleChar(string c) { if (gMufflerStrength == 0) return c; if (gMufflerStrength == 1) return looseMuffle(c); if (gMufflerStrength == 2) return tightMuffle(c); return illegibleMuffle(llToLower(c)); } string looseMuffle(string c) { if (c == "T") return "G"; if (c == "t") return "g"; if (c == "L") return "W"; if (c == "l") return "w"; if (c == "S") return "F"; if (c == "s") return "f"; return c; } string tightMuffle(string c) { if (c == "B" || c == "D" || c == "H" || c == "K" || c == "T" || c == "V") return "G"; if (c == "b" || c == "d" || c == "h" || c == "k" || c == "t" || c == "v") return "g"; if (c == "D" || c == "J" || c == "L" || c == "Q" || c == "R") return "W"; if (c == "d" || c == "j" || c == "l" || c == "q" || c == "r") return "w"; if (c == "S") return "F"; if (c == "s") return "f"; return c; } string illegibleMuffle(string _i) { if (_i == "." || _i == "," || _i == ";" || _i == ":" || _i == "?") return _i; if (_i == "!" || _i == " " || _i == "(" || _i == ")") return _i; if (_i == "a" || _i == "e" || _i == "i" || _i == "o" || _i == "u" || _i == "y") return "eh"; if (_i == "c" || _i == "k" || _i == "q") return "k"; if (_i == "m") return "w"; if (_i == "s" || _i == "z") return "shh"; if (_i == "b" || _i == "p" || _i == "v") return "f"; if (_i == "x") return "ek"; if (llFloor(llFrand(10.0) < 1)) return _i; return "nh"; } increase_timelock(integer min) { string objName = llGetObjectName(); llSetObjectName(llKey2Name(gCurrentUser)); if (min <= 0) { gTimelock = 0; llSay(PUBLIC_CHANNEL, "/me resets " + llKey2Name(gMaskOwner) + "'s timelock."); } else { gTimelock += min * 60; llSay(PUBLIC_CHANNEL, "/me increases " + llKey2Name(gMaskOwner) + "'s timelock by " + Time2String(min*60) + ". Time remaining: " + Time2String(gTimelock)); } llSetObjectName(objName); } change_muffler_strength(integer new_muffle) { string objName = llGetObjectName(); string extra = ""; if (FULL_MASK_MODE) extra = "and hearing "; llSetObjectName(llKey2Name(gMaskOwner)); if (new_muffle == 0) llSay(PUBLIC_CHANNEL, "/me's speech " + extra + "is now clearly understood."); else if (new_muffle == 1) llSay(PUBLIC_CHANNEL, "/me's speech " + extra + "is now lightly muffled."); else if (new_muffle == 2) llSay(PUBLIC_CHANNEL, "/me's speech " + extra + "is now heavily muffled."); else llSay(PUBLIC_CHANNEL, "/me's speech " + extra + "is now extremely muffled."); gMufflerStrength = new_muffle; llSetObjectName(objName); set_muffler(); } default { state_entry() { initialize(); } on_rez(integer params) { initialize(); } touch(integer total_number) { /|/integer distance = llVecDist(llGetPos(), other); /|/if (distance > 5) /|/return; if(gCommandTimeout > 0 && gCurrentUser != llDetectedKey(0)) { llInstantMessage(llDetectedKey(0), llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + " is currently in use and you cannot play with it."); return; } gCurrentUser = llDetectedKey(0); if(!menu_handler()) { llInstantMessage(gCurrentUser, llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + " is currently locked and you cannot play with it."); return; } } timer() { if (gCommandTimeout > 0) { gCommandTimeout--; if (gCommandTimeout == 0) reset_listeners(); } if (gTimelock > 0) { gTimelock--; if (gTimelock == 0) { llSay(PUBLIC_CHANNEL, llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + " was unlocked by their timelock."); unlock(); reset_listeners(); } } } sensor(integer detected) { if (detected == 0) { llInstantMessage(gCurrentUser, "No potential owners in range. (5 metres)"); reset_listeners(); return;; } string message = "Select who will be your future owner:"; list commands = ["Cancel", "Back"]; integer i = detected; if (i > 10) i = 10; do { i--; gSensorKeys += [llDetectedKey(i)]; gSensorNames += [llGetSubString(llDetectedName(i), 0, 23)]; } while (i > 0); commands += gSensorNames; llDialog(gCurrentUser, message, commands, gCommandListener); gCommandTimeout = 20; } listen(integer channel, string name, key id, string message) { if (channel == gCommandChannel) { if (message == "Lock") { gKeyHolder = gCurrentUser; gKeyHolderName = llKey2Name(gKeyHolder); string objName = llGetObjectName(); llSetObjectName(name); llSay(PUBLIC_CHANNEL, "/me locks " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + "."); llSetObjectName(objName); lock(); menu_handler(); } else if (message == "Unlock") { string objName = llGetObjectName(); llSetObjectName(name); llSay(PUBLIC_CHANNEL, "/me unlocks " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + "."); llSetObjectName(objName); unlock(); menu_handler(); } else if (message == "Safeword") { string objName = llGetObjectName(); llSetObjectName(name); llSay(PUBLIC_CHANNEL, "/me safewords from their " + OBJECT_TYPE + "."); llSetObjectName(objName); unlock(); } else if (message == "Timelock") { timelock_menu(); } else if (message == "Muffler") { muffler_menu(); } else if (message == "Back") { reset_listeners(); gCurrentUser = id; menu_handler(); } else if (message == "Cancel") { reset_listeners(); } else if (message == "Set Owner") { llSensor("", NULL_KEY, AGENT, 5, PI); } else if (message == "Resign Ownership") { gOwner = NULL_KEY; gOwnerName = ""; string objName = llGetObjectName(); llSetObjectName(name); llSay(PUBLIC_CHANNEL, "/me resigns their ownership of " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + "."); llSetObjectName(objName); unlock(); reset_listeners(); } else if (message == "None") { change_muffler_strength(0); reset_listeners(); } else if (message == "Light") { change_muffler_strength(1); reset_listeners(); } else if (message == "Heavy") { change_muffler_strength(2); reset_listeners(); } else if (message == "Extreme") { change_muffler_strength(3); reset_listeners(); } else if (message == "+5 Min") { increase_timelock(5); timelock_menu(); } else if (message == "+15 Min") { increase_timelock(15); timelock_menu(); } else if (message == "+30 Min") { increase_timelock(30); timelock_menu(); } else if (message == "+1 Hour") { increase_timelock(60); timelock_menu(); } else if (message == "+2 Hour") { increase_timelock(120); timelock_menu(); } else if (message == "+3 Hour") { increase_timelock(180); timelock_menu(); } else if (message == "+6 Hour") { increase_timelock(360); timelock_menu(); } else if (message == "+12 Hour") { increase_timelock(720); timelock_menu(); } else if (message == "+24 Hour") { increase_timelock(1440); timelock_menu(); } else if (message == "Clear") { increase_timelock(-1); timelock_menu(); } else if (message == "Yes") { gOwner = id; gOwnerName = name; string objName = llGetObjectName(); llSetObjectName(llKey2Name(gMaskOwner)); llSay(PUBLIC_CHANNEL, "/me declares " + name + " to be the owner of their " + OBJECT_TYPE + "."); llSetObjectName(objName); reset_listeners(); } else if (message == "No") { string objName = llGetObjectName(); llSetObjectName(name); llSay(PUBLIC_CHANNEL, "/me declines ownership of " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + "."); llSetObjectName(objName); reset_listeners(); } else { integer i = llListFindList(gSensorNames, [message]); if (i > -1) { key user = llList2Key(gSensorKeys, i); string message = name + " would like to to be the owner of their " + OBJECT_TYPE + "."; list commands = ["Yes", "No"]; reset_listeners(); gCommandTimeout = 20; gCommandListener = llListen(gCommandChannel, "", user, ""); llDialog(user, message, commands, gCommandChannel); } } } else if (channel == gMufflerChannel) { string objName = llGetObjectName(); llSetObjectName(llKey2Name(gMaskOwner)); llSay(PUBLIC_CHANNEL, MuffleString(message)); llSetObjectName(objName); } else if (channel == PUBLIC_CHANNEL) { string objName = llGetObjectName(); llSetObjectName(name); if (llGetSubString(message,0,2) == "/me") return; llOwnerSay(MuffleString(message)); llSetObjectName(objName); } } } */ //end_unprocessed_text //nfo_preprocessor_version 0 //program_version Emerald Viewer 1.4.0.2270 - Yeyinde Firecaster //mono integer gTimelock = 0; list gSensorNames; list gSensorKeys; string gOwnerName; key gOwner = NULL_KEY; integer gMufflerStrength = 0; integer gMufflerListener; integer gMufflerChannel; key gMaskOwner = NULL_KEY; string gKeyHolderName; key gKeyHolder = NULL_KEY; integer gHearingListener; key gCurrentUser = NULL_KEY; integer gCommandTimeout = 0; integer gCommandListener; integer gCommandChannel; string OBJECT_TYPE = "gasmask"; integer FULL_MASK_MODE = TRUE; string tightMuffle(string c) { if (c == "B" || c == "D" || c == "H" || c == "K" || c == "T" || c == "V") return "G"; if (c == "b" || c == "d" || c == "h" || c == "k" || c == "t" || c == "v") return "g"; if (c == "D" || c == "J" || c == "L" || c == "Q" || c == "R") return "W"; if (c == "d" || c == "j" || c == "l" || c == "q" || c == "r") return "w"; if (c == "S") return "F"; if (c == "s") return "f"; return c; } mask_owner_menu() { string message = ""; list commands = ["Cancel", "Lock", "Unlock", "Safeword", "Timelock", "Muffler", "Set Owner"]; integer i; if (gKeyHolder != NULL_KEY) { i = llListFindList(commands, ["Lock"]); commands = llDeleteSubList(commands, i, i); if ((gKeyHolder == gMaskOwner && gTimelock == 0) || (gOwner == gKeyHolder)) { i = llListFindList(commands, ["Safeword"]); commands = llDeleteSubList(commands, i, i); } if (gKeyHolder != gMaskOwner || (gKeyHolder == gMaskOwner && gTimelock > 0)) { i = llListFindList(commands, ["Unlock"]); commands = llDeleteSubList(commands, i, i); i = llListFindList(commands, ["Timelock"]); commands = llDeleteSubList(commands, i, i); i = llListFindList(commands, ["Muffler"]); commands = llDeleteSubList(commands, i, i); } message += "Currently locked by " + gKeyHolderName +".\n"; } else { i = llListFindList(commands, ["Unlock"]); commands = llDeleteSubList(commands, i, i); i = llListFindList(commands, ["Safeword"]); commands = llDeleteSubList(commands, i, i); i = llListFindList(commands, ["Timelock"]); commands = llDeleteSubList(commands, i, i); message += "Currently unlocked.\n"; } if (gOwner == NULL_KEY) message += "No owner set.\n"; else { message += "Current owner: " + gOwnerName + "\n"; i = llListFindList(commands, ["Set Owner"]); commands = llDeleteSubList(commands, i, i); } if (gTimelock > 0) { message += "Timelock active.\n"; } llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandListener = llListen(gCommandChannel, "", gCurrentUser, ""); gCommandTimeout = 20; } string looseMuffle(string c) { if (c == "T") return "G"; if (c == "t") return "g"; if (c == "L") return "W"; if (c == "l") return "w"; if (c == "S") return "F"; if (c == "s") return "f"; return c; } key_holder_menu() { string message = ""; list commands = ["Cancel", "Unlock", "Timelock", "Muffler"]; message += "You have the keys to " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + ".\n"; message += "You are not the owner of " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + ".\n"; if (gTimelock > 0) { message += "Timelock active.\nTime remaining: " + Time2String(gTimelock) + "\n"; } llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandListener = llListen(gCommandChannel, "", gCurrentUser, ""); gCommandTimeout = 20; } string illegibleMuffle(string _i) { if (_i == "." || _i == "," || _i == ";" || _i == ":" || _i == "?") return _i; if (_i == "!" || _i == " " || _i == "(" || _i == ")") return _i; if (_i == "a" || _i == "e" || _i == "i" || _i == "o" || _i == "u" || _i == "y") return "eh"; if (_i == "c" || _i == "k" || _i == "q") return "k"; if (_i == "m") return "w"; if (_i == "s" || _i == "z") return "shh"; if (_i == "b" || _i == "p" || _i == "v") return "f"; if (_i == "x") return "ek"; if (llFloor(llFrand(10.0) < 1)) return _i; return "nh"; } default_menu() { string message = ""; list commands = ["Cancel", "Lock"]; message += llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + " is unlocked.\n"; llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandListener = llListen(gCommandChannel, "", gCurrentUser, ""); gCommandTimeout = 20; } string Time2String(integer seconds) { list times = []; if (seconds % 60 > 0) times = [(string)(seconds % 60)+" seconds"] + times; if (seconds % 3600 / 60 > 0) times = [(string)(seconds % 3600 / 60) + " minutes"] + times; if (seconds % 86400 / 3600 > 0) times = [(string)(seconds % 86400 / 3600) + " hours"] + times; if (seconds / 86400 > 0) times = [(string)(seconds / 86400) + " days"] + times; return llList2CSV(times); } string MuffleChar(string c) { if (gMufflerStrength == 0) return c; if (gMufflerStrength == 1) return looseMuffle(c); if (gMufflerStrength == 2) return tightMuffle(c); return illegibleMuffle(llToLower(c)); } unlock() { gKeyHolder = NULL_KEY; gKeyHolderName = ""; llOwnerSay("@detach=y"); llMessageLinked(LINK_SET, 0, "hide", NULL_KEY); gTimelock = 0; } timelock_menu() { string message = ""; list commands = ["Cancel", "Back", "Reset", "+5 Min", "+15 Min", "+30 Min", "+1 Hour", "+2 Hour", "+3 Hour", "+6 Hour", "+12 Hour", "+24 Hour"]; if (gTimelock > 0) { if (gKeyHolder == gMaskOwner) { integer i = llListFindList(commands, ["Reset"]); commands = llDeleteSubList(commands, i, i); } message += "Timelock active.\nTime remaining: " + Time2String(gTimelock) + "\n"; } else message += "Timelock inactive.\n"; llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandListener = llListen(gCommandChannel, "", gCurrentUser, ""); gCommandTimeout = 20; } set_muffler() { if (gMufflerStrength > 0) { llOwnerSay("@redirchat:"+(string)gMufflerChannel+"=add"); llOwnerSay("@emote=add"); if (FULL_MASK_MODE) { gHearingListener = llListen(PUBLIC_CHANNEL, "", "", ""); llOwnerSay("@recvchat=n"); } } else { llOwnerSay("@redirchat:"+(string)gMufflerChannel+"=rem"); llOwnerSay("@emote=rem"); gMufflerListener = llListen(gMufflerChannel, "", gMaskOwner, ""); if (FULL_MASK_MODE) { llListenRemove(gHearingListener); llOwnerSay("@recvchat=y"); } } } reset_listeners() { gCommandTimeout = 0; llListenRemove(gCommandListener); gCurrentUser = NULL_KEY; gSensorKeys = []; gSensorNames = []; } owner_menu() { string message = ""; list commands = ["Cancel", "Lock", "Unlock", "Timelock", "Muffler", "Resign Ownership"]; integer i; if (gKeyHolder != NULL_KEY) { i = llListFindList(commands, ["Lock"]); commands = llDeleteSubList(commands, i, i); message += "Currently locked.\n"; } else { i = llListFindList(commands, ["Unlock"]); commands = llDeleteSubList(commands, i, i); i = llListFindList(commands, ["Timelock"]); commands = llDeleteSubList(commands, i, i); message += "Currently unlocked.\n"; } if (gTimelock > 0) { message += "Timelock active.\nTime remaining: " + Time2String(gTimelock) + "\n"; } llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandListener = llListen(gCommandChannel, "", gCurrentUser, ""); gCommandTimeout = 20; } muffler_menu() { string message = ""; list commands = ["Cancel", "Back", "None", "Light", "Heavy", "Extreme"]; message += "Current muffle strength: " + llList2String(commands, gMufflerStrength + 2) + "\n"; commands = llDeleteSubList(commands, gMufflerStrength + 2, gMufflerStrength + 2); llDialog(gCurrentUser, message, commands, gCommandChannel); gCommandTimeout = 20; } integer menu_handler() { integer handled = FALSE; if (gCurrentUser == gMaskOwner) { mask_owner_menu(); handled = TRUE; } else if (gOwner == gCurrentUser) { if (gKeyHolder != NULL_KEY && gCurrentUser != gKeyHolder) { string objName = llGetObjectName(); llSetObjectName(llKey2Name(gCurrentUser)); llSay(PUBLIC_CHANNEL, "/me takes back the keys to " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + "."); llSetObjectName(objName); gKeyHolder = gCurrentUser; } owner_menu(); handled = TRUE; } else if (gCurrentUser == gKeyHolder) { key_holder_menu(); handled = TRUE; } else { default_menu(); handled = TRUE; } return handled; } lock() { llOwnerSay("@detach=n"); llMessageLinked(LINK_SET, 0, "show", NULL_KEY); } initialize_channels() { gMufflerChannel = (integer)("0x"+llGetSubString((string)llGetKey(),-5,-1)); gCommandChannel = -1 * gMufflerChannel; } initialize() { initialize_channels(); reset_listeners(); gMaskOwner = llGetOwner(); if(gKeyHolder != NULL_KEY) { lock(); } else unlock(); set_muffler(); llSetTimerEvent(1); } increase_timelock(integer min) { string objName = llGetObjectName(); llSetObjectName(llKey2Name(gCurrentUser)); if (min <= 0) { gTimelock = 0; llSay(PUBLIC_CHANNEL, "/me resets " + llKey2Name(gMaskOwner) + "'s timelock."); } else { gTimelock += min * 60; llSay(PUBLIC_CHANNEL, "/me increases " + llKey2Name(gMaskOwner) + "'s timelock by " + Time2String(min*60) + ". Time remaining: " + Time2String(gTimelock)); } llSetObjectName(objName); } change_muffler_strength(integer new_muffle) { string objName = llGetObjectName(); string extra = ""; if (FULL_MASK_MODE) extra = "and hearing "; llSetObjectName(llKey2Name(gMaskOwner)); if (new_muffle == 0) llSay(PUBLIC_CHANNEL, "/me's speech " + extra + "is now clearly understood."); else if (new_muffle == 1) llSay(PUBLIC_CHANNEL, "/me's speech " + extra + "is now lightly muffled."); else if (new_muffle == 2) llSay(PUBLIC_CHANNEL, "/me's speech " + extra + "is now heavily muffled."); else llSay(PUBLIC_CHANNEL, "/me's speech " + extra + "is now extremely muffled."); gMufflerStrength = new_muffle; llSetObjectName(objName); set_muffler(); } string MuffleString(string message) { string out; integer i; for (i=0; i < llStringLength(message); i++) out += MuffleChar(llGetSubString(message, i, i)); return out; } default { state_entry() { initialize(); } on_rez(integer params) { initialize(); } touch(integer total_number) { if(gCommandTimeout > 0 && gCurrentUser != llDetectedKey(0)) { llInstantMessage(llDetectedKey(0), llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + " is currently in use and you cannot play with it."); return; } gCurrentUser = llDetectedKey(0); if(!menu_handler()) { llInstantMessage(gCurrentUser, llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + " is currently locked and you cannot play with it."); return; } } timer() { if (gCommandTimeout > 0) { gCommandTimeout--; if (gCommandTimeout == 0) reset_listeners(); } if (gTimelock > 0) { gTimelock--; if (gTimelock == 0) { llSay(PUBLIC_CHANNEL, llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + " was unlocked by their timelock."); unlock(); reset_listeners(); } } } sensor(integer detected) { if (detected == 0) { llInstantMessage(gCurrentUser, "No potential owners in range. (5 metres)"); reset_listeners(); return;; } string message = "Select who will be your future owner:"; list commands = ["Cancel", "Back"]; integer i = detected; if (i > 10) i = 10; do { i--; gSensorKeys += [llDetectedKey(i)]; gSensorNames += [llGetSubString(llDetectedName(i), 0, 23)]; } while (i > 0); commands += gSensorNames; llDialog(gCurrentUser, message, commands, gCommandListener); gCommandTimeout = 20; } listen(integer channel, string name, key id, string message) { if (channel == gCommandChannel) { if (message == "Lock") { gKeyHolder = gCurrentUser; gKeyHolderName = llKey2Name(gKeyHolder); string objName = llGetObjectName(); llSetObjectName(name); llSay(PUBLIC_CHANNEL, "/me locks " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + "."); llSetObjectName(objName); lock(); menu_handler(); } else if (message == "Unlock") { string objName = llGetObjectName(); llSetObjectName(name); llSay(PUBLIC_CHANNEL, "/me unlocks " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + "."); llSetObjectName(objName); unlock(); menu_handler(); } else if (message == "Safeword") { string objName = llGetObjectName(); llSetObjectName(name); llSay(PUBLIC_CHANNEL, "/me safewords from their " + OBJECT_TYPE + "."); llSetObjectName(objName); unlock(); } else if (message == "Timelock") { timelock_menu(); } else if (message == "Muffler") { muffler_menu(); } else if (message == "Back") { reset_listeners(); gCurrentUser = id; menu_handler(); } else if (message == "Cancel") { reset_listeners(); } else if (message == "Set Owner") { llSensor("", NULL_KEY, AGENT, 5, PI); } else if (message == "Resign Ownership") { gOwner = NULL_KEY; gOwnerName = ""; string objName = llGetObjectName(); llSetObjectName(name); llSay(PUBLIC_CHANNEL, "/me resigns their ownership of " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + "."); llSetObjectName(objName); unlock(); reset_listeners(); } else if (message == "None") { change_muffler_strength(0); reset_listeners(); } else if (message == "Light") { change_muffler_strength(1); reset_listeners(); } else if (message == "Heavy") { change_muffler_strength(2); reset_listeners(); } else if (message == "Extreme") { change_muffler_strength(3); reset_listeners(); } else if (message == "+5 Min") { increase_timelock(5); timelock_menu(); } else if (message == "+15 Min") { increase_timelock(15); timelock_menu(); } else if (message == "+30 Min") { increase_timelock(30); timelock_menu(); } else if (message == "+1 Hour") { increase_timelock(60); timelock_menu(); } else if (message == "+2 Hour") { increase_timelock(120); timelock_menu(); } else if (message == "+3 Hour") { increase_timelock(180); timelock_menu(); } else if (message == "+6 Hour") { increase_timelock(360); timelock_menu(); } else if (message == "+12 Hour") { increase_timelock(720); timelock_menu(); } else if (message == "+24 Hour") { increase_timelock(1440); timelock_menu(); } else if (message == "Clear") { increase_timelock(-1); timelock_menu(); } else if (message == "Yes") { gOwner = id; gOwnerName = name; string objName = llGetObjectName(); llSetObjectName(llKey2Name(gMaskOwner)); llSay(PUBLIC_CHANNEL, "/me declares " + name + " to be the owner of their " + OBJECT_TYPE + "."); llSetObjectName(objName); reset_listeners(); } else if (message == "No") { string objName = llGetObjectName(); llSetObjectName(name); llSay(PUBLIC_CHANNEL, "/me declines ownership of " + llKey2Name(gMaskOwner) + "'s " + OBJECT_TYPE + "."); llSetObjectName(objName); reset_listeners(); } else { integer i = llListFindList(gSensorNames, [message]); if (i > -1) { key user = llList2Key(gSensorKeys, i); string message = name + " would like to to be the owner of their " + OBJECT_TYPE + "."; list commands = ["Yes", "No"]; reset_listeners(); gCommandTimeout = 20; gCommandListener = llListen(gCommandChannel, "", user, ""); llDialog(user, message, commands, gCommandChannel); } } } else if (channel == gMufflerChannel) { string objName = llGetObjectName(); llSetObjectName(llKey2Name(gMaskOwner)); llSay(PUBLIC_CHANNEL, MuffleString(message)); llSetObjectName(objName); } else if (channel == PUBLIC_CHANNEL) { string objName = llGetObjectName(); llSetObjectName(name); if (llGetSubString(message,0,2) == "/me") return; llOwnerSay(MuffleString(message)); llSetObjectName(objName); } } }