Color script
From Second Life Wiki
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Color script
Compare:
Color lists:
// Created by: Masakazu Kojima // Reposted by: ALicia Sautereau integer CHANNEL = PUBLIC_CHANNEL; // channel to listen for commands on integer OWNER_ONLY = FALSE; // only owner can control integer USE_IMS = TRUE; // send IMs instead of using chat string COMMAND_CHANGE_COLOR = "change"; // command to change color string COMMAND_LIST_COLORS = "listcolors"; // command to list colors integer MAX_CHAT_LENGTH = 255; // max size for one message string PREFIX_HEX = "#"; // prefix to specify hex code string PREFIX_VECTOR = "<"; // prefix to specify vector code list LINKS_TO_SET = [LINK_SET, ALL_SIDES]; // [link number, link face, ...] list COLORS; set_colors() { COLORS = [ "navy", "#001f3f", "blue", "#0074d9", "aqua", "#7fdbff", "teal", "#39cccc", "olive", "#3d9970", "green", "#2ecc40", "lime", "#01ff70", "yellow", "#ffdc00", "orange", "#ff851b", "red", "#ff4136", "maroon", "#85144b", "fuchsia", "#f012be", "purple", "#b10dc9", "white", "#ffffff", "silver", "#dddddd", "gray", "#aaaaaa", "black", "#111111" ]; } say(key id, string str) { if (USE_IMS) llInstantMessage(id, str); else llWhisper(PUBLIC_CHANNEL, str); } vector color_from_hex(string str) { return <(integer)("0x" + llGetSubString(str,1,2)), (integer)("0x" + llGetSubString(str,3,4)), (integer)("0x" + llGetSubString(str,5,6))> / 255; } vector color_from_vector(string vec) { // caveat: 1,1,1 will be treated as #ffffff, not #010101 list l = llParseString2List(vec, [" ", ",", "<", ">"], []); vector v; v.x = (float)llList2String(l, 0); v.y = (float)llList2String(l, 1); v.z = (float)llList2String(l, 2); if (v.x > 1 || v.y > 1 || v.z > 1) v /= 255; return v; } vector color_from_name(string name) { // vv strip spaces and force lowercase vv integer x = llListFindList(COLORS, [ llToLower(llDumpList2String(llParseString2List(name, [" "], []), "")) ]); if (x == -1) return <-1, -1, -1>; return color_from_hex(llList2String(COLORS, x+1)); } set_color(key id, string str) { vector color; integer i; if (llGetSubString(str, 0, 0) == PREFIX_HEX) // hex code color = color_from_hex(str); else if (llGetSubString(str, 0, 0) == PREFIX_VECTOR) // vector color = color_from_vector(str); else color = color_from_name(str); if (color.x < 0 || color.x > 1 || color.y < 0 || color.y > 1 || color.z < 0 || color.z > 1) { say(id, "Invalid color specified: " + str); return; } llSetColor(color, ALL_SIDES); } list_colors(key id) { string str = ""; string nstr = ""; integer i; for (i = 0; i < llGetListLength(COLORS); i += 2) { nstr = str + llList2String(COLORS, i) + ", "; if (llStringLength(nstr) > MAX_CHAT_LENGTH) { say(id, str); str = llList2String(COLORS, i); } else { str = nstr; } } if (str != "") say(id, str); } default { on_rez(integer bla) { llResetScript(); } changed(integer change) { if ((OWNER_ONLY) && (change & CHANGED_OWNER)) llResetScript(); } state_entry() { set_colors(); if (OWNER_ONLY) llListen(CHANNEL, "", llGetOwner(), ""); else llListen(CHANNEL, "", "", ""); } listen(integer channel, string name, key id, string msg) { string command; string argument; list l; l = llParseStringKeepNulls(msg, [" "], []); command = llList2String(l, 0); argument = llDumpList2String(llList2List(l, 1, -1), " "); if (command == COMMAND_CHANGE_COLOR) set_color(id, argument); else if (command == COMMAND_LIST_COLORS) list_colors(id); } }