// ============================================================ // COLLAR SYSTEM - CORE / MENU SCRIPT // Verwaltet Hauptmenü, Rechte-Check und Linkset-Data. // Kommuniziert per llMessageLinked mit den Modulen: // 2_owner.lsl / 3_lock.lsl / 4_leash.lsl / 5_rlv.lsl // ============================================================ // ---- Link-Message-Codes (in ALLEN Scripts identisch halten!) ---- integer LM_OWNER_REQUEST = 200; // core -> owner : str=Name, id=Toucher integer LM_OWNER_ACCEPT = 201; // owner -> core : id=NeuerOwner integer LM_OWNER_RELEASE = 203; // core -> owner : id=Toucher (Freilassung) integer LM_OWNER_ADDTRUST = 210; // core -> owner : id=Toucher integer LM_OWNER_DELTRUST = 211; // core -> owner : id=Toucher integer LM_LOCK_TOGGLE = 300; // core -> lock : id=Toucher, str=PIN integer LM_LOCK_SETPIN = 302; // core -> lock : id=Toucher, str=NeuePIN integer LM_LOCK_PERMALOCK = 303; // core -> lock : id=Toucher integer LM_LEASH_TOGGLE = 400; // core -> leash : id=Halter (Toucher) integer LM_LEASH_DETACH = 401; // core -> leash integer LM_RLV_REFRESH = 500; // core -> rlv : Regeln neu anwenden // ---- Laufzeit-Variablen ---- integer gChannel; integer gListenHandle; key gToucher; integer gMenuState; // 0=Main 1=Owner 2=Lock 3=Leash 4=RLV-Info // ---- Linkset-Data Helper ---- key OwnerKey() { return (key)llLinksetDataRead("owner_key"); } string OwnerName() { return llLinksetDataRead("owner_name"); } integer IsLocked() { return (integer)llLinksetDataRead("locked"); } integer IsPerma() { return (integer)llLinksetDataRead("permalocked"); } integer IsLeashed() { return (integer)llLinksetDataRead("leashed"); } integer IsTrustee(key id) { string trustList = llLinksetDataRead("trustees"); return (llSubStringIndex(trustList, (string)id) != -1); } integer HasAccess(key id) { if (OwnerKey() == NULL_KEY) return TRUE; // noch niemandem gehörend -> jeder darf Owner-Antrag stellen if (id == OwnerKey()) return TRUE; if (IsTrustee(id)) return TRUE; if (id == llGetOwner()) return TRUE; // Trägerin selbst return FALSE; } // ---- Menü ---- openMain(key id) { gToucher = id; gMenuState = 0; string ownerLine; if (OwnerKey() == NULL_KEY) ownerLine = "Kein Owner gesetzt."; else ownerLine = "Owner: " + OwnerName(); string lockLine = "Entsperrt"; if (IsPerma()) lockLine = "PERMANENT gesperrt"; else if (IsLocked()) lockLine = "Gesperrt"; list buttons = []; if (id == llGetOwner()) { // Trägerin if (OwnerKey() == NULL_KEY) buttons += ["Frei (kein Owner)"]; else buttons += ["Owner Info"]; } else { if (OwnerKey() == NULL_KEY) buttons += ["Als Owner anfragen"]; } if (HasAccess(id)) { buttons += ["Leash"]; if (!IsPerma()) buttons += ["Lock/Unlock"]; buttons += ["Trust hinzufügen", "Trust entfernen"]; if (id == OwnerKey()) buttons += ["Freilassen"]; buttons += ["PIN setzen", "Permalock"]; } buttons += ["Info", "Schließen"]; llDialog(id, "== Collar Menü ==\n" + ownerLine + "\nStatus: " + lockLine, buttons, gChannel); } default { state_entry() { gChannel = -(integer)("0x" + llGetSubString((string)llGetKey(),0,7)); llListen(gChannel, "", NULL_KEY, ""); llListen(gChannel + 1, "", NULL_KEY, ""); // PIN setzen llListen(gChannel + 2, "", NULL_KEY, ""); // Permalock bestätigen // Grundwerte initialisieren, falls Collar frisch ist if (llLinksetDataRead("locked") == "") llLinksetDataWrite("locked", "0"); if (llLinksetDataRead("permalocked") == "") llLinksetDataWrite("permalocked", "0"); if (llLinksetDataRead("leashed") == "") llLinksetDataWrite("leashed", "0"); if (llLinksetDataRead("pin") == "") llLinksetDataWrite("pin", llSHA1String("0000")); llSetText("", <0,0,0>, 0); } on_rez(integer p) { llResetScript(); } touch_start(integer n) { key toucher = llDetectedKey(0); if (!HasAccess(toucher) && OwnerKey() != NULL_KEY) { llRegionSayTo(toucher, 0, "Dieses Collar gehört " + OwnerName() + "."); return; } openMain(toucher); } listen(integer chan, string name, key id, string msg) { if (id != gToucher) return; if (chan == gChannel + 1) { // neue PIN setzen llMessageLinked(LINK_SET, LM_LOCK_SETPIN, msg, id); return; } if (chan == gChannel + 2) { if (msg == "Ja, permanent sperren") { llMessageLinked(LINK_SET, LM_LOCK_PERMALOCK, "", id); } return; } if (msg == "Schließen") return; if (msg == "Info") { string s = "Owner: " + (OwnerKey()==NULL_KEY ? "keiner" : OwnerName()); s += "\nGesperrt: " + (string)IsLocked(); s += "\nPermalock: " + (string)IsPerma(); s += "\nGeleint: " + (string)IsLeashed(); llRegionSayTo(id, 0, s); return; } if (msg == "Als Owner anfragen") { llMessageLinked(LINK_SET, LM_OWNER_REQUEST, llKey2Name(id), id); return; } if (msg == "Freilassen") { llMessageLinked(LINK_SET, LM_OWNER_RELEASE, "", id); return; } if (msg == "Trust hinzufügen") { llMessageLinked(LINK_SET, LM_OWNER_ADDTRUST, "", id); return; } if (msg == "Trust entfernen") { llMessageLinked(LINK_SET, LM_OWNER_DELTRUST, "", id); return; } if (msg == "Leash") { llMessageLinked(LINK_SET, LM_LEASH_TOGGLE, "", id); return; } if (msg == "Lock/Unlock") { if (IsLocked()) { llTextBox(id, "PIN zum Entsperren eingeben:", gChannel); } else { llMessageLinked(LINK_SET, LM_LOCK_TOGGLE, "", id); } return; } if (msg == "PIN setzen") { llTextBox(id, "Neue PIN eingeben (nur Zahlen):", gChannel + 1); return; } if (msg == "Permalock") { llDialog(id, "ACHTUNG: Permalock kann NICHT mehr rückgängig gemacht werden!\nWirklich permanent sperren?", ["Ja, permanent sperren", "Abbrechen"], gChannel + 2); return; } // sonst: evtl. PIN-Eingabe für Unlock if (msg != "Abbrechen") { llMessageLinked(LINK_SET, LM_LOCK_TOGGLE, msg, id); } } // Zweiter Kanal: neue PIN setzen (Textbox antwortet auf eigenem Kanal) // Wird über denselben listen() Handler nicht sauber getrennt -> zweiter Listener: }