It should help ensuring that you have the right script contents when saving. It also provides a short description, to get a rough idea of what it's about. The only code change is the product name in [AV]xcite! to add a TM symbol to Xcite!
209 lines
6.1 KiB
Text
209 lines
6.1 KiB
Text
/*
|
|
* [AV]root-control - Allow others to control the menu
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* Copyright © the AVsitter Contributors (http://avsitter.github.io)
|
|
* AVsitter™ is a trademark. For trademark use policy see:
|
|
* https://avsitter.github.io/TRADEMARK.mediawiki
|
|
*
|
|
* Please consider supporting continued development of AVsitter and
|
|
* receive automatic updates and other benefits! All details and user
|
|
* instructions can be found at http://avsitter.github.io
|
|
*/
|
|
|
|
string product = "AVsitter™ Menu Control";
|
|
string version = "2.2";
|
|
string security_script = "[AV]root-security";
|
|
string RLV_script = "[AV]root-RLV";
|
|
list DESIGNATIONS_NOW;
|
|
key CONTROLLER = NULL_KEY;
|
|
integer KEY_TAKEN;
|
|
string CONTROLLER_NAME;
|
|
list SITTERS_MENUKEYS;
|
|
list SITTERS_SHORTNAMES;
|
|
integer menu_channel;
|
|
integer menu_handle;
|
|
key key_request;
|
|
integer verbose = 1;
|
|
|
|
Out(integer level, string out)
|
|
{
|
|
if (verbose >= level)
|
|
{
|
|
llOwnerSay(llGetScriptName() + "[" + version + "]:" + out);
|
|
}
|
|
}
|
|
|
|
list order_buttons(list buttons)
|
|
{
|
|
return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
|
|
}
|
|
|
|
string strReplace(string str, string search, string replace)
|
|
{
|
|
return llDumpList2String(llParseStringKeepNulls(str, [search], []), replace);
|
|
}
|
|
|
|
controller_menu(key id)
|
|
{
|
|
CONTROLLER = id;
|
|
CONTROLLER_NAME = llKey2Name(id);
|
|
list SITTERS;
|
|
integer count = llGetNumberOfPrims();
|
|
while (llGetAgentSize(llGetLinkKey(count)) != ZERO_VECTOR)
|
|
{
|
|
SITTERS += llGetLinkKey(count);
|
|
count--;
|
|
}
|
|
if ((~llListFindList(SITTERS, [id])) && check_for_RLV())
|
|
{
|
|
llMessageLinked(LINK_SET, 90005, "", id);
|
|
}
|
|
else
|
|
{
|
|
if (llGetListLength(SITTERS) == 1 && ((!check_for_RLV()) || (llListFindList(DESIGNATIONS_NOW, ["S"]) == -1) || llGetListLength(DESIGNATIONS_NOW) == 1))
|
|
{
|
|
if (check_for_RLV())
|
|
{
|
|
llMessageLinked(LINK_THIS, 90100, "x|Control...|" + llList2String(SITTERS, 0), id);
|
|
}
|
|
else
|
|
{
|
|
llMessageLinked(LINK_SET, 90005, "", llDumpList2String([id, llList2Key(SITTERS, 0)], "|"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
list menu_items;
|
|
SITTERS_MENUKEYS = [];
|
|
integer i;
|
|
for (i = 0; i < llGetListLength(SITTERS); i++)
|
|
{
|
|
if (llList2Key(SITTERS, i) != NULL_KEY)
|
|
{
|
|
menu_items += llGetSubString(strReplace(llKey2Name(llList2Key(SITTERS, i)), " Resident", ""), 0, 11);
|
|
SITTERS_MENUKEYS += llList2Key(SITTERS, i);
|
|
}
|
|
}
|
|
SITTERS_SHORTNAMES = menu_items;
|
|
string text = "Which avatar?";
|
|
if (check_for_RLV())
|
|
{
|
|
if (!llGetListLength(menu_items))
|
|
{
|
|
llMessageLinked(LINK_THIS, 90211, "", id);
|
|
return;
|
|
}
|
|
if ((~llListFindList(DESIGNATIONS_NOW, ["S"])) && llGetListLength(SITTERS) < llGetListLength(DESIGNATIONS_NOW))
|
|
{
|
|
text += "\n\nCapture = trap a new avatar.";
|
|
menu_items += "Capture...";
|
|
}
|
|
}
|
|
if (llGetListLength(menu_items))
|
|
{
|
|
dialog(text, order_buttons(menu_items), id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
dialog(string text, list menu_items, key id)
|
|
{
|
|
llListenRemove(menu_handle);
|
|
menu_handle = llListen(menu_channel = ((integer)llFrand(0x7FFFFF80) + 1) * -1, "", id, ""); // 7FFFFF80 = max float < 2^31
|
|
llDialog(id, product + " " + version + "\n\n" + text + "\n", order_buttons(menu_items), menu_channel);
|
|
llSetTimerEvent(120);
|
|
}
|
|
|
|
integer check_for_RLV()
|
|
{
|
|
if (llGetInventoryType(RLV_script) == INVENTORY_SCRIPT)
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
default
|
|
{
|
|
state_entry()
|
|
{
|
|
llSetTimerEvent(0);
|
|
}
|
|
|
|
on_rez(integer x)
|
|
{
|
|
llResetScript();
|
|
}
|
|
|
|
timer()
|
|
{
|
|
llListenRemove(menu_handle);
|
|
}
|
|
|
|
link_message(integer sender, integer num, string msg, key id)
|
|
{
|
|
if (num == 90007)
|
|
{
|
|
if (id == CONTROLLER || CONTROLLER == NULL_KEY)
|
|
{
|
|
controller_menu(id);
|
|
}
|
|
else
|
|
{
|
|
string text = "Take control of the menu?";
|
|
if (llGetAgentSize(CONTROLLER) != ZERO_VECTOR)
|
|
{
|
|
text += "\n\nCurrently controlled by: " + CONTROLLER_NAME;
|
|
}
|
|
dialog(text, ["Take Control", "[CANCEL]"], id);
|
|
}
|
|
}
|
|
else if (num == 90206)
|
|
{
|
|
DESIGNATIONS_NOW = llParseStringKeepNulls(msg, ["|"], []);
|
|
}
|
|
}
|
|
|
|
listen(integer channel, string name, key id, string message)
|
|
{
|
|
llListenRemove(menu_handle);
|
|
integer index = llListFindList(SITTERS_SHORTNAMES, [message]);
|
|
if (~index)
|
|
{
|
|
if (check_for_RLV())
|
|
{
|
|
llMessageLinked(LINK_THIS, 90100, "x|Control...|" + llList2String(SITTERS_MENUKEYS, index), CONTROLLER);
|
|
}
|
|
else
|
|
{
|
|
llMessageLinked(LINK_SET, 90005, "", llDumpList2String([CONTROLLER, llList2Key(SITTERS_MENUKEYS, index)], "|"));
|
|
}
|
|
}
|
|
else if (message == "Capture...")
|
|
{
|
|
llMessageLinked(LINK_THIS, 90211, "", id);
|
|
}
|
|
else if (message == "Take Control")
|
|
{
|
|
llMessageLinked(LINK_SET, 90033, "", "");
|
|
if (id != CONTROLLER)
|
|
{
|
|
llRegionSayTo(CONTROLLER, 0, llKey2Name(id) + " has taken control of the menu.");
|
|
}
|
|
controller_menu(id);
|
|
}
|
|
}
|
|
|
|
changed(integer change)
|
|
{
|
|
if (llGetAgentSize(llGetLinkKey(llGetNumberOfPrims())) == ZERO_VECTOR)
|
|
{
|
|
CONTROLLER = NULL_KEY;
|
|
}
|
|
}
|
|
}
|