AVsitter/AVsitter2/[AV]adjuster.lsl
Sei Lisa 4b5003294e Change the versioning scheme and add full version to all scripts
The new versioning scheme uses a letter instead of the dash. The letter is a p for a work-in-progress/pre-release version, or an r for a release version. For example:

2.2p04 - work in progress for version 2.2r04
2.2r04 - release version (2.2-04 with the previous scheme)

The two digit number will be increasing even for minor changes. The last minor changes indicator is dropped.
2020-09-07 22:42:58 +02:00

930 lines
34 KiB
Text
Raw Permalink Blame History

/*
* [AV]adjuster - Create a setup and an AVpos notecard from scratch
*
* 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
*/
integer OLD_HELPER_METHOD;
key key_request;
string url = "https://avsitter.com/settings.php"; // the settings dump service remains up for AVsitter customers. settings clear periodically.
string #version = "2.2p04";
string helper_name = "[AV]helper";
string prop_script = "[AV]prop";
string expression_script = "[AV]faces";
string camera_script = "[AV]camera";
string main_script = "[AV]sitA";
string notecard_name = "AVpos";
list POS_LIST;
list ROT_LIST;
list HELPER_KEY_LIST;
list SITTER_POSES;
list SITTERS;
integer sitter_count;
integer end_count;
integer verbose = 0;
integer chat_channel = 5;
integer helper_mode;
integer comm_channel;
integer listen_handle;
integer active_sitter;
key controller;
integer menu_page;
string adding;
integer adding_item_type;
string last_text;
integer menu_pages;
integer number_per_page = 9;
list chosen_animations = [last_text]; //OSS::list chosen_animations; // Force error in LSO
string cache;
string webkey;
integer webcount;
string SEP = "<22>"; // OSS::string SEP = "\x7F";
string FormatFloat(float f, integer num_decimals)
{
f += ((integer)(f > 0) - (integer)(f < 0)) * ((float)(".5e-" + (string)num_decimals) - .5e-6);
string ret = llGetSubString((string)f, 0, num_decimals - (!num_decimals) - 7);
if (num_decimals)
{
num_decimals = -1;
while (llGetSubString(ret, num_decimals, num_decimals) == "0")
{
--num_decimals;
}
if (llGetSubString(ret, num_decimals, num_decimals) == ".")
{
--num_decimals;
}
return llGetSubString(ret, 0, num_decimals);
}
return ret;
}
web(integer force)
{
if (llStringLength(llEscapeURL(cache)) > 1024 || force)
{
if (force)
{
cache += "\n\nend";
}
webcount++;
llHTTPRequest(url, [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded", HTTP_VERIFY_CERT, FALSE], "w=" + webkey + "&c=" + (string)webcount + "&t=" + llEscapeURL(cache));
cache = "";
}
}
Readout_Say(string say)
{
string objectname = llGetObjectName();
llSetObjectName("");
llRegionSayTo(llGetOwner(), 0, "◆" + say);
llSetObjectName(objectname);
cache += say + "\n";
say = "";
web(FALSE);
}
stop_all_anims(key id)
{
list animations = llGetAnimationList(id);
integer i;
for (i = 0; i < llGetListLength(animations); i++)
{
llMessageLinked(LINK_THIS, 90002, llList2String(animations, i), id);
}
}
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);
}
preview_anim(string anim, key id)
{
if (id) // OSS::if (osIsUUID(id) && id != NULL_KEY)
{
stop_all_anims(id);
llMessageLinked(LINK_THIS, 90001, anim, id);
}
}
list get_choices()
{
integer my_number_per_page = number_per_page;
if (adding == "[SYNC]" && sitter_count > 1)
{
my_number_per_page--;
}
list options;
integer i;
integer start = my_number_per_page * menu_page;
integer end = start + my_number_per_page;
if (adding == "[FACE]")
{
list facial_anim_list =
[ "none"
, "express_afraid_emote"
, "express_anger_emote"
, "express_laugh_emote"
, "express_bored_emote"
, "express_cry_emote"
, "express_embarrassed_emote"
, "express_sad_emote"
, "express_toothsmile"
, "express_smile"
, "express_surprise_emote"
, "express_worry_emote"
, "express_repulsed_emote"
, "express_shrug_emote"
, "express_wink_emote"
, "express_disdain"
, "express_frown"
, "express_kiss"
, "express_open_mouth"
, "express_tongue_out"
];
i = llGetListLength(facial_anim_list);
options = llList2List(facial_anim_list, start, end - 1);
}
else
{
integer type = INVENTORY_ANIMATION;
if (adding == "[PROP]")
{
type = INVENTORY_OBJECT;
}
i = start;
while (i < end && i < llGetInventoryNumber(type))
{
if (llGetInventoryName(type, i) != helper_name)
{
options += llGetInventoryName(type, i);
}
i++;
}
i = llGetInventoryNumber(type);
}
menu_pages = llCeil((float)i / my_number_per_page);
return options;
}
ask_anim()
{
choice_menu(get_choices(), "Choose anim" + sitter_text(sitter_count) + ":");
}
choice_menu(list options, string menu_text)
{
last_text = menu_text;
menu_text = "\n(Page " + (string)(menu_page + 1) + "/" + (string)menu_pages + ")\n" + menu_text + "\n\n";
list menu_items;
integer i;
if (llGetListLength(options) == 0)
{
menu_text = "\nNo items of required type in prim inventory.";
menu_items = ["[BACK]"];
}
else
{
integer cutoff = 65;
integer all_options_length = llStringLength(llDumpList2String(options, ""));
integer total_need_to_cut = 412 - all_options_length;
if (total_need_to_cut < 0)
{
cutoff = 43;
}
for (i = 0; i < llGetListLength(options); i++)
{
menu_items += (string)(i + 1);
string item = llList2String(options, i);
if (llStringLength(item) > cutoff)
{
item = llGetSubString(item, 0, cutoff) + "..";
}
menu_text += (string)(i + 1) + "." + item + "\n";
}
if (adding == "[SYNC]" && sitter_count > 1)
{
menu_items += "[DONE]";
}
menu_items += ["[BACK]", "[<<]", "[>>]"];
}
llDialog(controller
, menu_text
, llList2List(menu_items, -3, -1)
+ llList2List(menu_items, -6, -4)
+ llList2List(menu_items, -9, -7)
+ llList2List(menu_items, -12, -10)
, comm_channel
);
}
new_menu()
{
menu_page = 0;
list menu_items = ["[BACK]", "[POSE]", "[SYNC]", "[SUBMENU]"];
if (llList2String(SITTER_POSES, active_sitter) != "")
{
menu_items += ["[PROP]", "[FACE]"];
}
menu_items += "[CAMERA]";
string menu_text = "\nWhat would you like to create?\n";
llDialog(controller
, menu_text
, llList2List(menu_items, -3, -1)
+ llList2List(menu_items, -6, -4)
+ llList2List(menu_items, -9, -7)
+ llList2List(menu_items, -12, -10)
, comm_channel
);
}
end_helper_mode()
{
llRegionSay(comm_channel, "DONEA");
helper_mode = FALSE;
}
Out(string out)
{
llOwnerSay(llGetScriptName() + "[" + version + "] " + out);
}
integer get_number_of_scripts()
{
integer i;
while (llGetInventoryType(main_script + " " + (string)(++i)) == INVENTORY_SCRIPT)
;
return i;
}
string convert_to_world_positions(integer num)
{
rotation target_rot = llEuler2Rot(llList2Vector(ROT_LIST, num) * DEG_TO_RAD) * llGetRot();
vector target_pos = llList2Vector(POS_LIST, num) * llGetRot() + llGetPos();
return (string)target_pos + "|" + (string)target_rot;
}
string sitter_text(integer sitter)
{
return " for SITTER " + (string)sitter;
}
remove_script(string reason)
{
string message = "\n" + llGetScriptName() + " ==Script Removed==\n\n" + reason;
llDialog(llGetOwner(), message, ["OK"], -3675);
llInstantMessage(llGetOwner(), message);
llRemoveInventory(llGetScriptName());
}
done_choosing_anims()
{
string adding_text = llList2String(llParseString2List(adding, ["[", "]"], []), 0);
adding += "2";
integer i;
string text;
for (i = 0; i < llGetListLength(chosen_animations); i++)
{
text += "\nSITTER " + (string)i + ": " + llList2String(chosen_animations, i);
}
llTextBox(controller, "\nType a menu name for " + adding_text + text, comm_channel);
}
camera_menu()
{
string text = "\nCamera:\n\n";
if (llGetInventoryType(camera_script) == INVENTORY_SCRIPT)
{
text += "(using [AV]camera scripts)";
}
else
{
text += "(prim property)";
}
llDialog(controller, text, ["[BACK]", "[SAVE]", "[CLEAR]"], comm_channel);
}
unsit_all()
{
integer i = llGetNumberOfPrims();
while (llGetAgentSize(llGetLinkKey(i)) != ZERO_VECTOR)
{
stop_all_anims(llGetLinkKey(i));
llUnSit(llGetLinkKey(i));
i--;
}
}
toggle_helper_mode()
{
helper_mode = !helper_mode;
if (helper_mode)
{
if (OLD_HELPER_METHOD)
{
unsit_all();
}
listen_handle = llListen(comm_channel, "", "", "");
integer i;
for (i = 0; i < llGetListLength(SITTERS); i++)
{
integer param = comm_channel + i * -1;
if (llGetListLength(SITTERS) == 1)
{
param = comm_channel + llGetLinkNumber() * -1;
}
vector offset = llList2Vector(POS_LIST, i);
if (llVecMag(offset) > 10)
{
offset = ZERO_VECTOR;
}
llRezAtRoot(helper_name, llGetPos() + offset * llGetRot(), ZERO_VECTOR, llEuler2Rot(llList2Vector(ROT_LIST, i) * DEG_TO_RAD) * llGetRot(), param);
}
}
else
{
end_helper_mode();
}
}
default
{
state_entry()
{
if (llSubStringIndex(llGetScriptName(), " ") != -1)
{
remove_script("Use only one of this script!");
}
llListen(chat_channel, "", llGetOwner(), "");
comm_channel = ((integer)llFrand(99999) + 1) * 1000 * -1;
integer i;
while (i++ < get_number_of_scripts())
{
SITTERS += 0;
POS_LIST += 0;
ROT_LIST += 0;
HELPER_KEY_LIST += 0;
SITTER_POSES += "";
}
if (llGetListLength(SITTERS) == 1)
{
comm_channel -= 1000000000;
}
}
link_message(integer sender, integer num, string msg, key id)
{
integer one = (integer)msg;
integer two = (integer)((string)id);
integer i;
if (sender == llGetLinkNumber())
{
list data = llParseStringKeepNulls(msg, ["|"], []);
if (num == 90065)
{
i = llListFindList(SITTERS, [id]);
if (i != -1)
{
SITTERS = llListReplaceList(SITTERS, [NULL_KEY], i, i);
}
return;
}
if (num == 90030)
{
SITTERS = llListReplaceList(SITTERS, [NULL_KEY], (integer)msg, (integer)msg);
SITTERS = llListReplaceList(SITTERS, [NULL_KEY], (integer)((string)id), (integer)((string)id));
if (OLD_HELPER_METHOD && helper_mode)
{
i = llList2Integer(HELPER_KEY_LIST, (integer)msg);
HELPER_KEY_LIST = llListReplaceList(HELPER_KEY_LIST, [llList2Integer(HELPER_KEY_LIST, (integer)((string)id))], (integer)msg, (integer)msg);
HELPER_KEY_LIST = llListReplaceList(HELPER_KEY_LIST, [i], (integer)((string)id), (integer)((string)id));
llRegionSay(comm_channel, "SWAP|" + (string)msg + "|" + (string)id);
}
return;
}
if (num == 90070)
{
SITTERS = llListReplaceList(SITTERS, [id], (integer)msg, (integer)msg);
return;
}
if (num == 90021)
{
integer script_channel = (integer)msg;
list scripts = [prop_script, expression_script, camera_script];
i = llListFindList(scripts, [(string)id]);
while (i < llGetListLength(scripts))
{
i++;
string lookfor = llList2String(scripts, i);
if (lookfor == camera_script && script_channel > 0)
{
lookfor = lookfor + " " + (string)script_channel;
}
if (llGetInventoryType(lookfor) == INVENTORY_SCRIPT)
{
llMessageLinked(LINK_THIS, 90020, (string)script_channel, llList2String(scripts, i));
return;
}
}
if (llGetInventoryType(main_script + " " + (string)(script_channel + 1)) == INVENTORY_SCRIPT)
{
llMessageLinked(LINK_THIS, 90020, (string)(script_channel + 1), "");
}
else
{
Readout_Say("");
Readout_Say("--✄--COPY ABOVE INTO \"AVpos\" NOTECARD--✄--");
Readout_Say("");
web(TRUE);
llRegionSayTo(llGetOwner(), 0, "Settings copy: " + url + "?q=" + webkey);
}
return;
}
if (num == 90022)
{
if (llGetSubString(msg, 0, 3) == "S:M:" || llGetSubString(msg, 0, 3) == "S:T:")
{
msg = strReplace(msg, "*|", "|");
}
if (llGetSubString(msg, 0, 1) == "V:")
{
if (!(integer)((string)id))
{
webkey = (string)llGenerateKey();
webcount = 0;
Readout_Say("");
Readout_Say("--✄--COPY BELOW INTO \"AVpos\" NOTECARD--✄--");
Readout_Say("");
Readout_Say("\"" + llToUpper(llGetObjectName()) + "\" " + strReplace(llList2String(data, 0), "V:", "AVsitter "));
if (llList2Integer(data, 1))
{
Readout_Say("MTYPE " + llList2String(data, 1));
}
if (llList2Integer(data, 2) != 1)
{
Readout_Say("ETYPE " + llList2String(data, 2));
}
if (llList2Integer(data, 3) > -1)
{
Readout_Say("SET " + llList2String(data, 3));
}
if (llList2Integer(data, 4) != 2)
{
Readout_Say("SWAP " + llList2String(data, 4));
}
if (llList2String(data, 6) != "")
{
Readout_Say("TEXT " + strReplace(llList2String(data, 6), "\n", "\\n"));
}
if (llList2String(data, 7) != "")
{
Readout_Say("ADJUST " + strReplace(llList2String(data, 7), SEP, "|"));
}
if (llList2Integer(data, 8))
{
Readout_Say("SELECT " + llList2String(data, 8));
}
if (llList2Integer(data, 9) != 2)
{
Readout_Say("AMENU " + llList2String(data, 9));
}
if (llList2Integer(data, 10))
{
Readout_Say("HELPER " + llList2String(data, 10));
}
}
Readout_Say("");
if (llGetListLength(SITTERS) > 1 || llList2String(data, 5) != "")
{
string SITTER_TEXT;
if (llList2String(data, 5) != "")
{
SITTER_TEXT = "|" + strReplace(llList2String(data, 5), SEP, "|");
}
Readout_Say("SITTER " + (string)id + SITTER_TEXT);
Readout_Say("");
}
return;
}
else if (llGetSubString(msg, 0, 0) == "{")
{
msg = strReplace(msg, "{P:", "{");
list parts = llParseStringKeepNulls(llDumpList2String(llParseString2List(llGetSubString(msg, llSubStringIndex(msg, "}") + 1, 99999), [" "], [""]), ""), ["<"], []);
vector pos2 = (vector)("<" + llList2String(parts, 1));
vector rot2 = (vector)("<" + llList2String(parts, 2));
string result = "<" + FormatFloat(pos2.x, 3) + "," + FormatFloat(pos2.y, 3) + "," + FormatFloat(pos2.z, 3) + ">";
result += "<" + FormatFloat(rot2.x, 1) + "," + FormatFloat(rot2.y, 1) + "," + FormatFloat(rot2.z, 1) + ">";
msg = llGetSubString(msg, 0, llSubStringIndex(msg, "}")) + result;
}
else if (llGetSubString(msg, 1, 1) == ":")
{
msg = strReplace(msg, "S:P:", "POSE ");
msg = strReplace(msg, "S:M:", "MENU ");
msg = strReplace(msg, "S:T:", "TOMENU ");
if (llGetSubString(msg, -6, -1) == "|90210")
{
msg = strReplace(msg, "S:B:", "SEQUENCE ");
msg = strReplace(msg, "|90210", "");
}
else
{
msg = strReplace(msg, "S:B:", "BUTTON ");
if (llSubStringIndex(msg, SEP) == -1)
{
msg = strReplace(msg, "|90200", "");
}
}
msg = strReplace(msg, "S:", "SYNC ");
msg = strReplace(msg, SEP, "|");
}
if (llGetSubString(msg, -1, -1) == "*")
{
msg = llGetSubString(msg, 0, -2);
}
if (llGetSubString(msg, -1, -1) == "|")
{
msg = llGetSubString(msg, 0, -2);
}
if (llGetSubString(msg, 0, 3) == "MENU")
{
Readout_Say("");
}
Readout_Say(msg);
}
if (num == 90100 || num == 90101)
{
if ((msg = llList2String(data, 1)) == "[DUMP]")
{
if (id != llGetOwner())
{
llRegionSayTo(id, 0, "Dumping settings to Owner");
}
llMessageLinked(LINK_THIS, 90020, "0", "");
}
if (msg == "[NEW]")
{
controller = llList2Key(data, 2);
active_sitter = llList2Integer(data, 0);
adding = "";
new_menu();
}
if (msg == "[SAVE]")
{
for (i = 0; i < llGetListLength(SITTERS); i++)
{
if (llList2String(SITTER_POSES, i) != "")
{
string type = "SYNC";
string temp_pose_name = llList2String(SITTER_POSES, i);
if (llSubStringIndex(llList2String(SITTER_POSES, i), "P:") == 0)
{
type = "POSE";
temp_pose_name = llGetSubString(temp_pose_name, 2, 99999);
}
llMessageLinked(LINK_THIS, 90301, (string)i, llList2String(SITTER_POSES, i) + "|" + llList2String(POS_LIST, i) + "|" + llList2String(ROT_LIST, i) + "|");
vector pos = llList2Vector(POS_LIST, i);
vector rot = llList2Vector(ROT_LIST, i);
llSay(0, type + " Saved to memory " + sitter_text(i) + ": {" + temp_pose_name + "}" + llList2String(POS_LIST, i) + llList2String(ROT_LIST, i));
}
}
llMessageLinked(LINK_THIS, 90005, "", llDumpList2String([llList2String(data, 2), id], "|"));
}
if (msg == "[HELPER]")
{
controller = id;
OLD_HELPER_METHOD = (integer)llList2String(data, 3);
toggle_helper_mode();
}
if (msg == "[ADJUST]")
{
end_helper_mode();
}
return;
}
if (num == 90055 || num == 90056)
{
data = llParseStringKeepNulls(id, ["|"], []);
SITTER_POSES = llListReplaceList(SITTER_POSES, [llList2String(data, 0)], one, one);
POS_LIST = llListReplaceList(POS_LIST, [(vector)llList2String(data, 2)], one, one);
ROT_LIST = llListReplaceList(ROT_LIST, [(vector)llList2String(data, 3)], one, one);
if (helper_mode)
{
llRegionSay(comm_channel, "POS|" + (string)one + "|" + convert_to_world_positions(one) + "|" + (string)OLD_HELPER_METHOD + "|" + llList2String(SITTERS, one));
}
}
}
}
changed(integer change)
{
if (change & CHANGED_LINK)
{
if (OLD_HELPER_METHOD)
{
if (llGetAgentSize(llGetLinkKey(llGetNumberOfPrims())) != ZERO_VECTOR)
{
end_helper_mode();
}
}
else if (llGetListLength(SITTERS) == 1 && llAvatarOnSitTarget() == NULL_KEY || llGetAgentSize(llGetLinkKey(llGetNumberOfPrims())) == ZERO_VECTOR)
{
end_helper_mode();
}
}
if (change & CHANGED_INVENTORY)
{
unsit_all();
end_helper_mode();
llResetScript();
}
}
run_time_permissions(integer perm)
{
if (llGetPermissions() & PERMISSION_TRACK_CAMERA)
{
llPlaySound("3d09f582-3851-c0e0-f5ba-277ac5c73fb4", 1.);
vector eye = (llGetCameraPos() - llGetPos()) / llGetRot();
vector at = eye + llRot2Fwd(llGetCameraRot() / llGetRot());
if (llGetInventoryType(camera_script) == INVENTORY_SCRIPT)
{
llMessageLinked(LINK_THIS, 90174, (string)active_sitter, (string)eye + "|" + (string)at);
}
else
{
llMessageLinked(LINK_THIS, 90011, (string)eye, (string)at);
llSay(0, "Camera property saved for all sitters in prim (takes effect next sit).");
}
camera_menu();
}
}
listen(integer chan, string name, key id, string msg)
{
if (chan == chat_channel)
{
if (msg == "cleanup")
{
llRegionSay(comm_channel, "DONEA");
Out("Cleaning \"" + llGetScriptName() + "\" and \"" + helper_name + "\" from prim " + (string)llGetLinkNumber());
if (llGetInventoryType(helper_name) == INVENTORY_OBJECT)
{
llRemoveInventory(helper_name);
}
llRemoveInventory(llGetScriptName());
}
else if (msg == "targets")
{
llMessageLinked(LINK_THIS, 90298, "", "");
}
else if (msg == "helper")
{
if (llGetAgentSize(llGetLinkKey(llGetNumberOfPrims())) != ZERO_VECTOR)
{
llMessageLinked(LINK_SET, 90100, "0|[HELPER]||" + (string)OLD_HELPER_METHOD, llList2Key(SITTERS, 0));
}
}
}
else if (id == controller)
{
if (msg == "[>>]")
{
menu_page++;
if (menu_page >= menu_pages)
{
menu_page = 0;
}
choice_menu(get_choices(), last_text);
}
else if (msg == "[<<]")
{
menu_page--;
if (menu_page < 0)
{
menu_page = menu_pages - 1;
}
choice_menu(get_choices(), last_text);
}
else if (msg == "[BACK]")
{
llMessageLinked(LINK_THIS, 90005, "", llDumpList2String([controller, llList2String(SITTERS, active_sitter)], "|"));
}
else if (msg == "[POSE]" || msg == "[SYNC]")
{
adding = msg;
chosen_animations = [];
sitter_count = active_sitter;
end_count = sitter_count;
if (msg == "[SYNC]")
{
sitter_count = 0;
end_count = llGetListLength(SITTERS) - 1;
}
ask_anim();
}
else if (msg == "[SUBMENU]")
{
adding = msg;
llTextBox(controller, "\n\nName your submenu:", comm_channel);
}
else if (msg == "[PROP]")
{
if (llGetInventoryType(prop_script) == INVENTORY_SCRIPT)
{
adding = msg;
choice_menu(get_choices(), "Choose your prop:");
}
else
{
llSay(0, "For this you need the " + prop_script + " plugin script.");
llMessageLinked(LINK_THIS, 90005, "", llDumpList2String([controller, llList2String(SITTERS, active_sitter)], "|"));
}
}
else if (msg == "[FACE]")
{
if (llGetInventoryType(expression_script) == INVENTORY_SCRIPT)
{
adding = msg;
choice_menu(get_choices(), "Choose your facial anim:");
}
else
{
llSay(0, "For this you need the " + expression_script + " plugin script.");
llMessageLinked(LINK_THIS, 90005, "", llDumpList2String([controller, llList2String(SITTERS, active_sitter)], "|"));
}
}
else if (msg == "[CAMERA]")
{
camera_menu();
}
else if (msg == "[CLEAR]")
{
integer i;
for (i = 0; i < llGetNumberOfPrims(); i++)
{
llSetLinkCamera(i, ZERO_VECTOR, ZERO_VECTOR);
}
if (llGetInventoryType(camera_script) == INVENTORY_SCRIPT)
{
llMessageLinked(LINK_THIS, 90174, (string)active_sitter, "none");
}
else
{
llSay(0, "Camera property cleared from all prims (takes effect next sit).");
}
camera_menu();
}
else if (msg == "[SAVE]")
{
llRequestPermissions(id, PERMISSION_TRACK_CAMERA);
}
else if (llListFindList(["[DONE]", "1", "2", "3", "4", "5", "6", "7", "8", "9"], [msg]) != -1 && llListFindList(["[POSE]", "[SYNC]", "[SYNC]2", "[PROP]", "[FACE]"], [adding]) != -1)
{
string choice = llList2String(get_choices(), (integer)msg - 1);
if (adding == "[PROP]")
{
integer perms = llGetInventoryPermMask(choice, MASK_NEXT);
if ((perms & PERM_COPY) == 0)
{
llSay(0, "Could not add prop '" + choice + "'. Props and their content must be COPY-OK for NEXT owner.");
}
else
{
llMessageLinked(LINK_THIS, 90171, (string)active_sitter, choice);
}
llMessageLinked(LINK_THIS, 90005, "", llDumpList2String([controller, llList2String(SITTERS, active_sitter)], "|"));
}
else if (adding == "[FACE]")
{
llMessageLinked(LINK_THIS, 90172, (string)active_sitter, choice);
llMessageLinked(LINK_THIS, 90005, "", llDumpList2String([controller, llList2String(SITTERS, active_sitter)], "|"));
}
else if (msg == "[DONE]")
{
done_choosing_anims();
}
else if (adding == "[SYNC]" || adding == "[POSE]")
{
chosen_animations += choice;
preview_anim(choice, llList2Key(SITTERS, sitter_count));
sitter_count++;
if (sitter_count > end_count)
{
done_choosing_anims();
}
else
{
ask_anim();
}
}
}
else
{
msg = strReplace(msg, "\n", "");
msg = strReplace(msg, "|", "");
msg = llGetSubString(msg, 0, 22);
if (msg == "")
{
llMessageLinked(LINK_THIS, 90005, "", llDumpList2String([controller, llList2String(SITTERS, active_sitter)], "|"));
}
else if (adding == "[SUBMENU]")
{
llMessageLinked(LINK_THIS, 90300, (string)active_sitter, "T:" + msg + "*" + "||");
llMessageLinked(LINK_THIS, 90300, (string)active_sitter, "M:" + msg + "*" + "||");
llSay(0, "MENU Added: '" + msg + "'" + sitter_text(active_sitter));
llMessageLinked(LINK_THIS, 90005, "", llDumpList2String([controller, llList2String(SITTERS, active_sitter)], "|"));
}
else if (adding == "[POSE]2" || adding == "[SYNC]2")
{
integer start = 0;
integer end = llGetListLength(chosen_animations);
string type = "SYNC";
string prefix;
if (adding == "[POSE]2")
{
prefix = "P:";
type = "POSE";
start = active_sitter;
end = active_sitter + 1;
}
integer x;
integer i;
for (i = start; i < end; i++)
{
llSay(0, type + " Added: '" + msg + "' using anim '" + llList2String(chosen_animations, x) + "' to SITTER " + (string)i);
llMessageLinked(LINK_THIS, 90300, (string)i, prefix + msg + "|" + llList2String(chosen_animations, x) + "|" + llList2String(POS_LIST, i) + "|" + llList2String(ROT_LIST, i));
x++;
}
}
if (msg != "" && (adding == "[POSE]2" || adding == "[SYNC]2"))
{
llMessageLinked(LINK_THIS, 90005, "", llDumpList2String([controller, llList2String(SITTERS, active_sitter)], "|"));
}
}
}
else if (llGetOwnerKey(id) == llGetOwner())
{
list data = llParseString2List(msg, ["|"], []);
integer num = llList2Integer(data, 1);
if (llList2String(data, 0) == "REG")
{
HELPER_KEY_LIST = llListReplaceList(HELPER_KEY_LIST, [id], num, num);
llRegionSay(comm_channel, "POS|" + (string)num + "|" + convert_to_world_positions(num) + "|" + (string)OLD_HELPER_METHOD + "|" + llList2String(SITTERS, num));
}
else if (llList2String(data, 0) == "MENU")
{
if (llList2Key(data, 2) == controller)
{
llMessageLinked(LINK_SET, 90005, "", llDumpList2String([controller, llList2String(SITTERS, num)], "|"));
}
}
else if (llList2String(data, 0) == "MOVED")
{
rotation f = llGetRot();
vector target_rot = llRot2Euler((rotation)llList2String(data, 3) / f) * RAD_TO_DEG;
vector target_pos = ((vector)llList2String(data, 2) - llGetPos()) / f;
if ((string)target_pos != (string)llList2Vector(POS_LIST, num) || (string)target_rot != (string)llList2Vector(ROT_LIST, num))
{
POS_LIST = llListReplaceList(POS_LIST, [target_pos], num, num);
ROT_LIST = llListReplaceList(ROT_LIST, [target_rot], num, num);
llMessageLinked(LINK_THIS, 90057, (string)num, (string)target_pos + "|" + (string)target_rot);
}
}
else if (OLD_HELPER_METHOD)
{
integer sitter = (integer)llGetSubString(name, llSubStringIndex(name, " ") + 1, 99999);
if (llList2String(data, 0) == "ANIMA")
{
llMessageLinked(LINK_THIS, 90075, (string)sitter, llList2Key(data, 1));
}
else if (llList2String(data, 0) == "GETUP")
{
llMessageLinked(LINK_THIS, 90076, (string)sitter, llList2Key(data, 1));
}
}
}
}
on_rez(integer x)
{
llResetScript();
}
}