/* * [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.2"; 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 = "�"; // 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(); } }