Color script

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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);

    }
}