visitortrackermenu.lsl
///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2014 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
string wasKeyValueSet(string k, string v, string data) {
    if(llStringLength(k) == 0) return "";
    if(llStringLength(v) == 0) return "";
    if(llStringLength(data) == 0) return k + "=" + v;
    integer i = llListFindList(
        llList2ListStrided(
            llParseString2List(data, ["&", "="], []), 
            0, -1, 2
        ), 
    [ k ]);
    if(i != -1) return llDumpList2String(
        llListReplaceList(
            llParseString2List(data, ["&"], []), 
            [ k + "=" + v ], 
        i, i), 
    "&");
    return data + "&" + k + "=" + v;
}
 
string DIALOG_PREAMBLE = "\n            Welcome to the Visitor Tracker.\nCreated in 2014 by Wizardry and Steamworks\n                 26 July 2014: Version: 1.0";
 
resetScripts() {
    integer i = llGetInventoryNumber(INVENTORY_SCRIPT)-1;
    do {
        string name = llGetInventoryName(INVENTORY_SCRIPT, i);
        if(name == llGetScriptName()) jump continue;
        llResetOtherScript(name);
@continue;
    } while(--i>-1);
}
 
default {
    touch_start(integer total_number) {
        key agent = llDetectedKey(0);
        // Owner-only access.
        if(agent != llGetOwner()) return;
        integer channel = (integer)("0x8" + llGetSubString(llGetKey(), 0, 6));
        llListen(channel, "", agent, "");
        llDialog(agent, DIALOG_PREAMBLE, ["⎙ Mode", "⎌ Reset"], channel);
    }
    listen(integer channel, string name, key agent, string message) {
        if(message == "⎌ Reset") {
            resetScripts();
            llResetScript();
            return;
        }
        if(message == "⎙ Mode") {
            llDialog(agent, DIALOG_PREAMBLE, ["☍ Region", "◦ Sensor", "⏏ Exit"], channel);
            return;
        }
        if(message == "☍ Region") {
            llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_DESC, wasKeyValueSet("mode", "region", llList2String(llGetLinkPrimitiveParams(LINK_THIS, [PRIM_DESC]), 0))]);
            resetScripts();
            return;
        }
        if(message == "◦ Sensor") {
            llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_DESC, wasKeyValueSet("mode", "sensor", llList2String(llGetLinkPrimitiveParams(LINK_THIS, [PRIM_DESC]), 0))]);
            llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_DESC, wasKeyValueSet("range", "2", llList2String(llGetLinkPrimitiveParams(LINK_THIS, [PRIM_DESC]), 0))]);
            llDialog(agent, DIALOG_PREAMBLE, ["⏏ Exit", "2m", "4m", "8m", "16m", "32m", "64m", "96m"], channel);
            return;
        }
        // range for sensor
        if(llSubStringIndex(message, "m") == -1) return;
        integer range = (integer)message;
        llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_DESC, wasKeyValueSet("range", (string)range, llList2String(llGetLinkPrimitiveParams(LINK_THIS, [PRIM_DESC]), 0))]);
        resetScripts();
    }
    on_rez(integer num) {
        llResetScript();
    }
}