// because f--- you, that's why //-------------------------------------------------------------------------- // BEGIN config #define USE_BOLTS #define LIGHT_GLOW 0.2 #define OFF_DAMP_FACTOR 0.6 // END config //-------------------------------------------------------------------------- // BEGIN macros #define color_parse(_argv) <(float)gets(_argv, 1), (float)gets(argv, 2), (float)gets(argv, 3)> #define listen_on(_h, _ch) llListenRemove(_h); _h = llListen(_ch, "", NULL_KEY, "") // END macros //-------------------------------------------------------------------------- // BEGIN includes #include #include // END includes //-------------------------------------------------------------------------- // BEGIN globals integer L_CAPS = 0; integer L_LIGHTS = 0; #define C_CAPS 411 integer C_LIGHTS = 0; integer power_on = 1; vector color = <1, 1, 1>; key avatar = NULL_KEY; // END globals //-------------------------------------------------------------------------- // BEGIN functions init() { avatar = llGetOwner(); C_LIGHTS = 105 - (integer)("0x" + substr(avatar, 29, 35)); listen_on(L_LIGHTS, C_LIGHTS); listen_on(L_CAPS, C_CAPS); power_on = 1; tell(avatar, C_LIGHTS, "color-q"); } // init() update_color() { if (power_on) { llSetLinkGLTFOverrides(LINK_THIS, ALL_SIDES, [ OVERRIDE_GLTF_BASE_COLOR_FACTOR, llsRGB2Linear(color), OVERRIDE_GLTF_EMISSIVE_FACTOR, llsRGB2Linear(color) ]); setp(LINK_THIS, [ PRIM_COLOR, ALL_SIDES, color, 1.0, PRIM_GLOW, ALL_SIDES, LIGHT_GLOW ]); } // if (power_on) else { llSetLinkGLTFOverrides(LINK_THIS, ALL_SIDES, [ OVERRIDE_GLTF_BASE_COLOR_FACTOR, llsRGB2Linear(color * OFF_DAMP_FACTOR), OVERRIDE_GLTF_EMISSIVE_FACTOR, llsRGB2Linear(color * OFF_DAMP_FACTOR) ]); setp(LINK_THIS, [ PRIM_COLOR, ALL_SIDES, color * OFF_DAMP_FACTOR, 1.0, PRIM_GLOW, ALL_SIDES, 0 ]); } // else (power_on) } // update_color() // END functions //-------------------------------------------------------------------------- // BEGIN main default { state_entry() { init(); } // state_entry() on_rez(integer n) { init(); } // on_rez(...) listen(integer cc, string src, key id, string msg) { if (cc == C_CAPS) { if (substr(msg, 0, 4) == "info ") { integer rc = (integer)delstring(msg, 0, 4); tell(id, rc, "hwc " + jsobject([ "vendor", "Cat Conspiracy", "version", "1.0", "purpose", "light", "channel", jsobject(["caps", C_CAPS, "lights", C_LIGHTS]), "private", 1, "busy", 0, "usable", power_on, "health", 1.0, "info", "http://localhost:8080/" ])); } // if (cmd == "info") } // if (cc == C_CAPS) else if (cc == C_LIGHTS) { list argv = split(msg, " "); string cmd = gets(argv, 0); switch (cmd) { case "on": power_on = 1; update_color(); break; case "off": power_on = 0; update_color(); break; #ifdef USE_BOLTS case "bolts": if (gets(argv, 1) == "on") { echo("@detach=n"); } else if (gets(argv, 1) == "off") { echo("@detach=y"); } break; #endif case "color": color = color_parse(argv); update_color(); break; case "probe": tell(id, C_LIGHTS, "color-q"); break; default: // Unsupported command, do nothing. break; } // switch (cmd) } // if (cc == C_LIGHTS) } // listen(...) } // state default // END main //--------------------------------------------------------------------------