Files
LSL-Scripts/Rene Free Lighting System/Renes Free Lighting System/_Main/switch.lsl.bak
2016-04-25 11:15:59 -05:00

725 lines
25 KiB
Plaintext

// :SHOW:1
// :CATEGORY:Light
// :NAME:Rene's Free Lighting System
// :AUTHOR:Rene10957 Resident
// :KEYWORDS: light,lamp,lighting light
// :CREATED:2015-06-11 14:41:45
// :EDITED:2015-06-12 12:30:32
// :ID:1079
// :NUM:1784
// :REV:2.1
// :WORLD:Opensim
// :DESCRIPTION:
// Light Switch
// :CODE:
// :LICENSE: CC0 (Public Domain)
// Rene's Free Lighting System - Light Switch
//
// Author: Rene10957 Resident
// Date: 31-05-2015
// License: CC0 (Public Domain).
// To the extent possible under law, Rene10957 has waived all copyright and related or neighboring rights.
// For more information, see http://creativecommons.org/publicdomain/zero/1.0/.
string title = "Light Switch"; // title
string version = "2.1"; // version
integer linkSet = TRUE; // LINKSET mode
// Constants
integer _PUBLIC_ = 1; // public access bit
integer _GROUP_ = 2; // group access bit
integer _OWNER_ = 4; // owner access bit
integer _GRPOWN_ = 6; // group + owner
integer switchChannel = -10957; // switch channel
float maxRed = 1.0; // max. red
float maxGreen = 1.0; // max. green
float maxBlue = 1.0; // max. blue
float maxRadius = 20.0; // max. light radius
float maxFalloff = 2.0; // max. light falloff
float maxGlow = 1.0; // max. prim glow
float maxAlpha = 1.0; // max. prim alpha
string configPrefix = "config"; // prefix for configuration notecards
string configSeparator = ":"; // separator between prefix and name
string defNotecard = "Default"; // default notecard
// Notecard variables
integer verbose = FALSE; // show more/less info during startup
integer switchAccess; // access level for switch
integer menuAccess; // access level for menu
integer msgNumber; // number part of incoming link messages
string msgSwitch; // string part of incoming link message: switch (on/off)
string msgOn; // string part of incoming link message: switch on
string msgOff; // string part of incoming link message: switch off
string msgMenu; // string part of incoming link message: show menu
integer percent; // increase/decrease percentage for +/- buttons
integer changePrimColor = FALSE; // TRUE = prim color changes with light color, FALSE = white
integer changeParticleColor = FALSE; // TRUE = particle color changes with light color, FALSE = white
integer particleInc; // increase/decrease percentage for particle effect (menu)
string particleTexture; // texture UUID for particle effect
integer particleMenu = FALSE; // TRUE = "On/Off" replaced by "Particles" (particle menu)
integer notecardMenu = FALSE; // TRUE = "On/Off" replaced by "Presets" (notecard menu)
string extButton; // "On/Off" replaced by button text (sends link message)
integer extNumber; // number part of outgoing link message
integer lightGroups = FALSE; // TRUE = use prim description for light groups, FALSE = ignore prim description
string faces; // color/glow/fullbright on all faces (ALL_SIDES = -1), one face or CSV list
integer baseIntensity; // base for light intensity
// Notecard variables: menu defaults
vector defColor; // default color (R,G,B)
vector defColorOff; // default color (R,G,B) when OFF
integer defAlpha; // default prim alpha
integer defAlphaOff; // default prim alpha when OFF
integer defIntensity; // default light intensity
integer defRadius; // default light radius
integer defFalloff; // default light falloff
integer defGlow; // default prim glow
integer defFullbright = FALSE; // default fullbright
integer defParticleSize; // default particle size
// Variables
key owner; // object owner
key user; // key of last avatar to touch object
list notecardButtons; // list of notecards in inventory
string notecard; // notecard name
integer line; // notecard line
integer loading = FALSE; // notecard loading
integer menuChannel; // main menu channel
integer colorChannel; // color menu channel
integer particleChannel; // particle menu channel
integer notecardChannel; // notecard menu channel
integer menuHandle; // handle for main menu listener
integer colorHandle; // handle for color menu listener
integer particleHandle; // handle for particle menu listener
integer notecardHandle; // handle for notecard menu listener
integer on = FALSE; // on-off switch
integer particles = TRUE; // particles on/off
integer perRed; // percent red
integer perGreen; // percent green
integer perBlue; // percent blue
integer perAlpha; // percent prim alpha
integer perRedOff; // percent red when OFF
integer perGreenOff; // percent green when OFF
integer perBlueOff; // percent blue when OFF
integer perAlphaOff; // percent prim alpha when OFF
integer perIntensity; // percent light intensity
integer perRadius; // percent light radius
integer perFalloff; // percent light falloff
integer perGlow; // percent prim glow
integer fullbright = TRUE; // fullbright
// Functions
list orderButtons(list buttons)
{
return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) + llList2List(buttons, -9, -7) +
llList2List(buttons, -12, -10);
}
discoverNotecards()
{
llSetText("Discovering notecards...", <1,1,1>, 1.0);
notecardButtons = [];
integer i;
integer pos;
integer number = llGetInventoryNumber(INVENTORY_NOTECARD);
string name;
string prefix;
string suffix;
for (i = 0; i < number; ++i) {
name = llGetInventoryName(INVENTORY_NOTECARD, i);
pos = llSubStringIndex(name, configSeparator);
if (pos > -1) {
prefix = llGetSubString(name, 0, pos - 1);
suffix = llGetSubString(name, pos + 1, -1);
if (prefix == configPrefix && suffix != defNotecard && llGetListLength(notecardButtons) < 10)
notecardButtons += suffix;
}
}
notecardButtons = llListSort(notecardButtons, 1, TRUE); // sort ascending
if (llGetInventoryType(configPrefix + configSeparator + defNotecard) == INVENTORY_NOTECARD)
notecardButtons += defNotecard;
if (llGetListLength(notecardButtons) > 0) {
notecardButtons += "Main menu";
notecardButtons = orderButtons(notecardButtons); // reverse row order
}
llSetText("", ZERO_VECTOR, 0.0);
}
integer accessGranted(key user, integer access)
{
integer bitmask = _PUBLIC_;
if (user == owner) bitmask += _OWNER_;
if (llSameGroup(user)) bitmask += _GROUP_;
return (bitmask & access);
}
integer checkAccess(string par, string val)
{
if (llToLower(val) == "public") return _PUBLIC_;
if (llToLower(val) == "group") return _GROUP_;
if (llToLower(val) == "owner") return _OWNER_;
if (llToLower(val) == "group+owner") return _GRPOWN_;
llWhisper(0, "[Notecard] " + par + " out of range, corrected to PUBLIC");
return _PUBLIC_;
}
integer checkInt(string par, integer val, integer min, integer max)
{
if (val < min || val > max) {
if (val < min) val = min;
else if (val > max) val = max;
llWhisper(0, "[Notecard] " + par + " out of range, corrected to " + (string)val);
}
return val;
}
vector checkVector(string par, vector val)
{
if (val == ZERO_VECTOR) {
val = <100,100,100>;
llWhisper(0, "[Notecard] " + par + " out of range, corrected to " + (string)val);
}
return val;
}
integer checkYesNo(string par, string val)
{
if (llToLower(val) == "yes") return TRUE;
if (llToLower(val) == "no") return FALSE;
llWhisper(0, "[Notecard] " + par + " out of range, corrected to NO");
return FALSE;
}
string checkKey(string par, string val)
{
if ((key)val) return val;
if (val == "") return val;
llWhisper(0, "[Notecard] " + par + " out of range (not a valid key)");
return "";
}
string truncMenuButton(string par, string val)
{
string trunc = llBase64ToString(llGetSubString(llStringToBase64(val), 0, 31));
if (val != trunc) llWhisper(0, "[Notecard] " + par + " will be truncated to 24 bytes");
return trunc;
}
loadNotecard()
{
verbose = TRUE;
switchAccess = _PUBLIC_;
menuAccess = _PUBLIC_;
msgNumber = 10957;
msgSwitch = "switch";
msgOn = "on";
msgOff = "off";
msgMenu = "menu";
percent = 10;
changePrimColor = TRUE;
changeParticleColor = TRUE;
particleTexture = "";
particleMenu = FALSE;
notecardMenu = FALSE;
extButton = "";
extNumber = 10958;
lightGroups = FALSE;
faces = "-1";
baseIntensity = 100;
defColor = <100,100,100>;
defColorOff = <100,100,100>;
defAlpha = 100;
defAlphaOff = 100;
defIntensity = 100;
defRadius = 50;
defFalloff = 40;
defGlow = 0;
defFullbright = TRUE;
defParticleSize = 20;
line = 0;
if (llGetInventoryType(notecard) == INVENTORY_NOTECARD) {
loading = TRUE;
llSetText("Loading notecard...", <1,1,1>, 1.0);
llGetNotecardLine(notecard, line);
}
else {
reset();
particleInc = 999; // reset particle size in plugin script
sendMessage(getGroup());
if (verbose) {
llWhisper(0, "Notecard \"" + notecard + "\" not found or empty, using defaults");
llWhisper(0, "Touch to turn light on or off");
llWhisper(0, "Long touch to show menu");
if (linkSet) llWhisper(0, title + " " + version + "-LINKSET ready");
else llWhisper(0, title + " " + version + "-REGION ready");
}
}
}
readNotecard (string ncLine)
{
string ncData = llStringTrim(ncLine, STRING_TRIM);
if (llStringLength(ncData) > 0 && llGetSubString(ncData, 0, 0) != "#") {
list ncList = llParseString2List(ncData, ["=","#"], []); // split into parameter, value, comment
string par = llStringTrim(llList2String(ncList, 0), STRING_TRIM);
string val = llStringTrim(llList2String(ncList, 1), STRING_TRIM);
string lcpar = llToLower(par);
if (lcpar == "verbose") verbose = checkYesNo(par, val);
else if (lcpar == "switchaccess") switchAccess = checkAccess(par, val);
else if (lcpar == "menuaccess") menuAccess = checkAccess(par, val);
else if (lcpar == "msgnumber") msgNumber = (integer)val;
else if (lcpar == "msgswitch") msgSwitch = truncMenuButton(par, val);
else if (lcpar == "msgon") msgOn = truncMenuButton(par, val);
else if (lcpar == "msgoff") msgOff = truncMenuButton(par, val);
else if (lcpar == "msgmenu") msgMenu = truncMenuButton(par, val);
else if (lcpar == "menupercent") percent = checkInt(par, (integer)val, 1, 100);
else if (lcpar == "changeprimcolor") changePrimColor = checkYesNo(par, val);
else if (lcpar == "changeparticlecolor") changeParticleColor = checkYesNo(par, val);
else if (lcpar == "particletexture") particleTexture = checkKey(par, val);
else if (lcpar == "particlemenu") particleMenu = checkYesNo(par, val);
else if (lcpar == "notecardmenu") notecardMenu = checkYesNo(par, val);
else if (lcpar == "extbutton") extButton = truncMenuButton(par, val);
else if (lcpar == "extnumber") extNumber = (integer)val;
else if (lcpar == "lightgroups") lightGroups = checkYesNo(par, val);
else if (lcpar == "faces") faces = truncMenuButton(par, val);
else if (lcpar == "baseintensity") baseIntensity = checkInt(par, (integer)val, 1, 100);
else if (lcpar == "coloron") defColor = checkVector(par, (vector)val);
else if (lcpar == "coloroff") defColorOff = checkVector(par, (vector)val);
else if (lcpar == "alphaon") defAlpha = checkInt(par, (integer)val, 0, 100);
else if (lcpar == "alphaoff") defAlphaOff = checkInt(par, (integer)val, 0, 100);
else if (lcpar == "intensity") defIntensity = checkInt(par, (integer)val, 0, 100);
else if (lcpar == "radius") defRadius = checkInt(par, (integer)val, 0, 100);
else if (lcpar == "falloff") defFalloff = checkInt(par, (integer)val, 0, 100);
else if (lcpar == "glow") defGlow = checkInt(par, (integer)val, 0, 100);
else if (lcpar == "fullbright") defFullbright = checkYesNo(par, val);
else if (lcpar == "particlesize") defParticleSize = checkInt(par, (integer)val, 1, 100);
else llWhisper(0, "Unknown parameter in notecard line " + (string)(line + 1) + ": " + par);
}
line++;
llGetNotecardLine(notecard, line);
}
menuDialog (key id)
{
string strOn = "OFF"; if (on) strOn = "ON";
string strLinkSet = "REGION"; if (linkSet) strLinkSet = "LINKSET";
string strFullbright = "NO"; if (fullbright) strFullbright = "YES";
string strButton = "On/Off"; if (particleMenu) strButton = "Particles";
else if (notecardMenu) strButton = "Presets";
else if (extButton) strButton = extButton;
menuChannel = (integer)(llFrand(-1000000000.0) - 1000000000.0);
llListenRemove(menuHandle);
menuHandle = llListen(menuChannel, "", "", "");
llSetTimerEvent(0);
llSetTimerEvent(300);
llDialog(id, title + " " + version +
"\n\nIntensity: " + (string)perIntensity + "%\t\tState: " + strOn +
"\nRadius: " + (string)perRadius + "%\t\tFullbright: " + strFullbright +
"\nFalloff: " + (string)perFalloff + "%\t\tMode: " + strLinkSet +
"\nGlow: " + (string)perGlow + "%\t\tGroup: " + getGroup(), [
"-Glow", "+Glow", strButton,
"-Falloff", "+Falloff", "Reset",
"-Radius", "+Radius", "Fullbright",
"-Intensity", "+Intensity", "Color" ],
menuChannel);
}
colorDialog (key id)
{
colorChannel = (integer)(llFrand(-1000000000.0) - 1000000000.0);
llListenRemove(colorHandle);
colorHandle = llListen(colorChannel, "", "", "");
llSetTimerEvent(0);
llSetTimerEvent(300);
if (on) {
llDialog(id, "Color & Alpha when ON" +
"\n\nRed: " + (string)perRed + "%" +
"\nGreen: " + (string)perGreen + "%" +
"\nBlue: " + (string)perBlue + "%" +
"\nAlpha: " + (string)perAlpha + "%", [
"-Alpha", "+Alpha", "Main menu",
"-Blue", "+Blue", "B min/max",
"-Green", "+Green", "G min/max",
"-Red", "+Red", "R min/max" ],
colorChannel);
}
else {
llDialog(id, "Color & Alpha when OFF" +
"\n\nRed: " + (string)perRedOff + "%" +
"\nGreen: " + (string)perGreenOff + "%" +
"\nBlue: " + (string)perBlueOff + "%" +
"\nAlpha: " + (string)perAlphaOff + "%", [
"-Alpha", "+Alpha", "Main menu",
"-Blue", "+Blue", "B min/max",
"-Green", "+Green", "G min/max",
"-Red", "+Red", "R min/max" ],
colorChannel);
}
}
particleDialog (key id)
{
string strLightOn = "OFF"; if (on) strLightOn = "ON";
string strParticlesOn = "OFF"; if (particles) strParticlesOn = "ON";
particleChannel = (integer)(llFrand(-1000000000.0) - 1000000000.0);
llListenRemove(particleHandle);
particleHandle = llListen(particleChannel, "", "", "");
llSetTimerEvent(0);
llSetTimerEvent(300);
llDialog(id, "Particle effect" +
"\n\nLight: " + strLightOn +
"\nParticles: " + strParticlesOn, [
"Min", "Max", "Main menu",
"-10%", "+10%", "Reset",
"-5%", "+5%", "Part. on/off",
"-1%", "+1%", "Light on/off" ],
particleChannel);
}
notecardDialog (key id)
{
string name = llGetSubString(notecard, llStringLength(configPrefix) + llStringLength(configSeparator), -1);
notecardChannel = (integer)(llFrand(-1000000000.0) - 1000000000.0);
llListenRemove(notecardHandle);
notecardHandle = llListen(notecardChannel, "", "", "");
llSetTimerEvent(0);
llSetTimerEvent(300);
llDialog(id, "Configuration notecards\n\nLoaded notecard: " + name, notecardButtons, notecardChannel);
}
string getGroup()
{
if (!lightGroups) return "None";
string str = llStringTrim(llGetObjectDesc(), STRING_TRIM);
if (llToLower(str) == "(no description)" || str == "") str = "Default";
return str;
}
float percentage (integer per, float num)
{
return num / 100.0 * (float)per;
}
integer min (integer x, integer y)
{
if (x < y) return x; else return y;
}
integer max (integer x, integer y)
{
if (x > y) return x; else return y;
}
reset()
{
perRed = (integer)defColor.x;
perGreen = (integer)defColor.y;
perBlue = (integer)defColor.z;
perRedOff = (integer)defColorOff.x;
perGreenOff = (integer)defColorOff.y;
perBlueOff = (integer)defColorOff.z;
perAlpha = defAlpha;
perAlphaOff = defAlphaOff;
perIntensity = defIntensity;
perRadius = defRadius;
perFalloff = defFalloff;
perGlow = defGlow;
fullbright = defFullbright;
}
sendMessage(string group)
{
vector color;
vector colorOn;
vector colorOff;
float intensity;
float radius;
float falloff;
float alpha;
float glow;
integer fullbr;
vector primColor;
vector particleColor;
integer particlesOn;
colorOn.x = percentage(perRed, maxRed);
colorOn.y = percentage(perGreen, maxGreen);
colorOn.z = percentage(perBlue, maxBlue);
colorOff.x = percentage(perRedOff, maxRed);
colorOff.y = percentage(perGreenOff, maxGreen);
colorOff.z = percentage(perBlueOff, maxBlue);
if (on) {
color = colorOn;
intensity = percentage(perIntensity, (float)baseIntensity / 100.0);
radius = percentage(perRadius, maxRadius);
falloff = percentage(perFalloff, maxFalloff);
alpha = percentage(perAlpha, maxAlpha);
glow = percentage(perGlow, maxGlow);
fullbr = fullbright;
if (changePrimColor) primColor = color;
else primColor = colorOff;
if (changeParticleColor) particleColor = color;
else particleColor = colorOff;
particlesOn = particles;
}
else {
color = colorOff;
alpha = percentage(perAlphaOff, maxAlpha);
glow = 0.0;
fullbr = FALSE;
primColor = color;
particlesOn = FALSE;
}
list msgList = [group, on, color, intensity, radius, falloff, alpha, glow, fullbr,
primColor, particleColor, defParticleSize, particleInc, particleTexture, particlesOn,
"<" + faces + ">", lightGroups];
string msg = llList2CSV(msgList);
particleInc = 0;
if (linkSet) llMessageLinked(LINK_SET, switchChannel, msg, "");
else llRegionSay(switchChannel, msg);
}
default
{
state_entry()
{
owner = llGetOwner();
notecard = configPrefix + configSeparator + defNotecard;
discoverNotecards();
loadNotecard();
}
on_rez(integer start_param)
{
llResetScript();
}
touch_start(integer total_number)
{
llResetTime();
}
touch_end(integer total_number)
{
if (loading) {
llWhisper(0, "Notecard is still loading");
return;
}
user = llDetectedKey(0);
if (llGetTime() > 1.0) {
if (accessGranted(user, menuAccess)) menuDialog(user);
else llInstantMessage(user, "[Menu] Access denied");
}
else {
if (accessGranted(user, switchAccess)) {
on = !on;
sendMessage(getGroup());
}
else llInstantMessage(user, "[Switch] Access denied");
}
}
listen(integer channel, string name, key id, string msg)
{
llSetTimerEvent(0);
if (channel == menuChannel) {
llListenRemove(menuHandle);
if (msg == "-Intensity") perIntensity = max(perIntensity - percent, 0);
else if (msg == "-Radius") perRadius = max(perRadius - percent, 0);
else if (msg == "-Falloff") perFalloff = max(perFalloff - percent, 0);
else if (msg == "-Glow") perGlow = max(perGlow - percent, 0);
else if (msg == "+Intensity") perIntensity = min(perIntensity + percent, 100);
else if (msg == "+Radius") perRadius = min(perRadius + percent, 100);
else if (msg == "+Falloff") perFalloff = min(perFalloff + percent, 100);
else if (msg == "+Glow") perGlow = min(perGlow + percent, 100);
else if (msg == "Color") colorDialog(id);
else if (msg == "Fullbright") fullbright = !fullbright;
else if (msg == "Reset") reset();
else if (msg == "On/Off") on = !on;
else if (msg == "Particles") particleDialog(id);
else if (msg == "Presets") {
if (llGetListLength(notecardButtons) > 0) notecardDialog(id);
else llWhisper(0, "No configuration notecards found");
}
else if (msg == extButton) llMessageLinked(LINK_SET, extNumber, msg, id);
if (msg != "Color" && msg != "Particles" && msg != "Presets" && msg != extButton) {
sendMessage(getGroup());
menuDialog(id);
}
}
else if (channel == colorChannel) {
llListenRemove(colorHandle);
if (on) {
if (msg == "-Red") perRed = max(perRed - percent, 0);
else if (msg == "-Green") perGreen = max(perGreen - percent, 0);
else if (msg == "-Blue") perBlue = max(perBlue - percent, 0);
else if (msg == "-Alpha") perAlpha = max(perAlpha - percent, 0);
else if (msg == "+Red") perRed = min(perRed + percent, 100);
else if (msg == "+Green") perGreen = min(perGreen + percent, 100);
else if (msg == "+Blue") perBlue = min(perBlue + percent, 100);
else if (msg == "+Alpha") perAlpha = min(perAlpha + percent, 100);
else if (msg == "R min/max") { if (perRed) perRed = 0; else perRed = 100; }
else if (msg == "G min/max") { if (perGreen) perGreen = 0; else perGreen = 100; }
else if (msg == "B min/max") { if (perBlue) perBlue = 0; else perBlue = 100; }
else if (msg == "Main menu") menuDialog(id);
}
else {
if (msg == "-Red") perRedOff = max(perRedOff - percent, 0);
else if (msg == "-Green") perGreenOff = max(perGreenOff - percent, 0);
else if (msg == "-Blue") perBlueOff = max(perBlueOff - percent, 0);
else if (msg == "-Alpha") perAlphaOff = max(perAlphaOff - percent, 0);
else if (msg == "+Red") perRedOff = min(perRedOff + percent, 100);
else if (msg == "+Green") perGreenOff = min(perGreenOff + percent, 100);
else if (msg == "+Blue") perBlueOff = min(perBlueOff + percent, 100);
else if (msg == "+Alpha") perAlphaOff = min(perAlphaOff + percent, 100);
else if (msg == "R min/max") { if (perRedOff) perRedOff = 0; else perRedOff = 100; }
else if (msg == "G min/max") { if (perGreenOff) perGreenOff = 0; else perGreenOff = 100; }
else if (msg == "B min/max") { if (perBlueOff) perBlueOff = 0; else perBlueOff = 100; }
else if (msg == "Main menu") menuDialog(id);
}
if (msg != "Main menu") {
sendMessage(getGroup());
colorDialog(id);
}
}
else if (channel == particleChannel) {
llListenRemove(particleHandle);
if (msg == "-1%") particleInc = -1;
else if (msg == "+1%") particleInc = 1;
else if (msg == "-5%") particleInc = -5;
else if (msg == "+5%") particleInc = 5;
else if (msg == "-10%") particleInc = -10;
else if (msg == "+10%") particleInc = 10;
else if (msg == "Min") particleInc = -100;
else if (msg == "Max") particleInc = 100;
else if (msg == "Light on/off") on = !on;
else if (msg == "Part. on/off") particles = !particles;
else if (msg == "Reset") particleInc = 999; // reset particle size
else if (msg == "Main menu") menuDialog(id);
if (msg != "Main menu") {
sendMessage(getGroup());
particleDialog(id);
}
}
else if (channel == notecardChannel) {
llListenRemove(notecardHandle);
if (msg == "Main menu") menuDialog(id);
else {
notecard = configPrefix + configSeparator + msg;
loadNotecard();
}
}
}
link_message(integer sender_number, integer number, string msg, key id)
{
if (number != msgNumber) return;
if (loading) {
llWhisper(0, "Notecard is still loading");
return;
}
if (id) user = id;
else {
llWhisper(0, "A valid avatar key must be provided in the link message");
return;
}
if (msg == msgSwitch) {
if (accessGranted(id, switchAccess)) {
on = !on;
sendMessage(getGroup());
}
else llInstantMessage(id, "[Switch] Access denied");
}
else if (msg == msgOn) {
if (accessGranted(id, switchAccess)) {
if (!on) {
on = TRUE;
sendMessage(getGroup());
}
}
else llInstantMessage(id, "[Switch] Access denied");
}
else if (msg == msgOff) {
if (accessGranted(id, switchAccess)) {
if (on) {
on = FALSE;
sendMessage(getGroup());
}
}
else llInstantMessage(id, "[Switch] Access denied");
}
else if (msg == msgMenu) {
if (accessGranted(id, menuAccess)) menuDialog(id);
else llInstantMessage(id, "[Menu] Access denied");
}
}
dataserver(key req, string data)
{
if (data == EOF) {
defColor.x = checkInt("ColorOn (RED)", (integer)defColor.x, 0, 100);
defColor.y = checkInt("ColorOn (GREEN)", (integer)defColor.y, 0, 100);
defColor.z = checkInt("ColorOn (BLUE)", (integer)defColor.z, 0, 100);
defColorOff.x = checkInt("ColorOff (RED)", (integer)defColorOff.x, 0, 100);
defColorOff.y = checkInt("ColorOff (GREEN)", (integer)defColorOff.y, 0, 100);
defColorOff.z = checkInt("ColorOff (BLUE)", (integer)defColorOff.z, 0, 100);
reset();
particleInc = 999; // reset particle size in plugin script
sendMessage(getGroup());
if (verbose) if (user) {} else {
llWhisper(0, "Touch to turn light on or off");
llWhisper(0, "Long touch to show menu");
if (linkSet) llWhisper(0, title + " " + version + "-LINKSET ready");
else llWhisper(0, title + " " + version + "-REGION ready");
}
loading = FALSE;
llSetText("", ZERO_VECTOR, 0.0);
if (user) notecardDialog(user);
}
else {
readNotecard(data);
}
}
changed(integer change)
{
if (change & CHANGED_INVENTORY) {
user = "";
discoverNotecards();
loadNotecard();
}
}
timer()
{
llSetTimerEvent(0);
llListenRemove(menuHandle);
llListenRemove(colorHandle);
llListenRemove(particleHandle);
llListenRemove(notecardHandle);
}
}