/* * oc_shock.lsl * Shock App für OpenCollar 8.4 * Mit einstellbarer Animation und Sound (Finale Version) */ string g_sSubMenu = "Shock"; string g_sParentMenu = "Apps"; integer CMD_WEARER = 503; integer CMD_SAFEWORD = 510; integer NOTIFY = 1002; integer MENUNAME_REQUEST = 3000; integer MENUNAME_RESPONSE = 3001; integer DIALOG = -9000; integer DIALOG_RESPONSE = -9001; string UPMENU = "BACK"; key g_kWearer; string g_sStrength = "Medium"; integer g_iDuration = 4; string g_sAnimSoft = "shock_soft"; string g_sAnimMedium = "shock_medium"; string g_sAnimHard = "shock_hard"; string g_sSound = "shock_sound"; string g_sCustomAnim = ""; string g_sCustomSound = ""; integer g_iShockActive = FALSE; integer g_iListenHandle = -1; string g_sPending = ""; string GetAnim() { if (g_sCustomAnim != "") return g_sCustomAnim; if (g_sStrength == "Soft") return g_sAnimSoft; if (g_sStrength == "Hard") return g_sAnimHard; return g_sAnimMedium; } string GetSound() { if (g_sCustomSound != "") return g_sCustomSound; return g_sSound; } ShockStart() { if (g_iShockActive) return; string anim = GetAnim(); string snd = GetSound(); llMessageLinked(LINK_SET, 7000, anim, ""); if (llGetInventoryType(snd) == INVENTORY_SOUND) llLoopSound(snd, 1.0); g_iShockActive = TRUE; llSetTimerEvent((float)g_iDuration); llMessageLinked(LINK_SET, NOTIFY, "0⚡ Shock (" + g_sStrength + ") gestartet!", g_kWearer); } ShockStop() { if (!g_iShockActive) return; llStopSound(); llMessageLinked(LINK_SET, 7001, GetAnim(), ""); llMessageLinked(LINK_SET, 7001, g_sAnimSoft, ""); llMessageLinked(LINK_SET, 7001, g_sAnimMedium, ""); llMessageLinked(LINK_SET, 7001, g_sAnimHard, ""); g_iShockActive = FALSE; llSetTimerEvent(0.0); llMessageLinked(LINK_SET, NOTIFY, "0Shock beendet.", g_kWearer); } ShowMainMenu(key kAv) { string p = "\n⚡ Shock App\n\nStärke: " + g_sStrength + "\nDauer: " + (string)g_iDuration + "s\n"; if (g_sCustomAnim != "") p += "Eigene Anim: " + g_sCustomAnim + "\n"; if (g_sCustomSound != "") p += "Eigener Sound: " + g_sCustomSound + "\n"; llMessageLinked(LINK_SET, DIALOG, (string)kAv + "|" + p + "|0|Soft`Medium`Hard`Stop`Settings`" + UPMENU + "| |" + (string)CMD_WEARER, "ShockMain"); } ShowSettingsMenu(key kAv) { string p = "\n⚙ Einstellungen\n\n"; // Animation if (g_sCustomAnim == "") { p += "Animation: Standard\n"; } else { p += "Animation: " + g_sCustomAnim + "\n"; } // Sound if (g_sCustomSound == "") { p += "Sound: Standard\n"; } else { p += "Sound: " + g_sCustomSound + "\n"; } llMessageLinked(LINK_SET, DIALOG, (string)kAv + "|" + p + "|0|Anim ändern`Sound ändern`Reset`" + UPMENU + "| |" + (string)CMD_WEARER, "ShockSettings"); } default { state_entry() { g_kWearer = llGetOwner(); llOwnerSay("Shock App geladen."); } timer() { ShockStop(); } link_message(integer sender, integer num, string str, key id) { if (num == CMD_SAFEWORD) ShockStop(); if (num == MENUNAME_REQUEST && str == g_sParentMenu) llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, ""); else if (num == DIALOG_RESPONSE) { list l = llParseString2List(str, ["|"], []); string btn = llList2String(l, 1); key av = llList2Key(l, 0); if (av != g_kWearer) return; if (btn == g_sSubMenu) ShowMainMenu(av); else if (btn == "Soft") { g_sStrength = "Soft"; ShockStart(); } else if (btn == "Medium") { g_sStrength = "Medium"; ShockStart(); } else if (btn == "Hard") { g_sStrength = "Hard"; ShockStart(); } else if (btn == "Stop") ShockStop(); else if (btn == "Settings") ShowSettingsMenu(av); else if (btn == "Anim ändern") { g_sPending = "anim"; if (g_iListenHandle != -1) llListenRemove(g_iListenHandle); g_iListenHandle = llListen(0, "", g_kWearer, ""); llTextBox(av, "Name der Animation eingeben (leer = Standard):", 0); } else if (btn == "Sound ändern") { g_sPending = "sound"; if (g_iListenHandle != -1) llListenRemove(g_iListenHandle); g_iListenHandle = llListen(0, "", g_kWearer, ""); llTextBox(av, "Name des Sounds eingeben (leer = Standard):", 0); } else if (btn == "Reset") { g_sCustomAnim = ""; g_sCustomSound = ""; llMessageLinked(LINK_SET, NOTIFY, "0Einstellungen zurückgesetzt.", av); ShowSettingsMenu(av); } else if (btn == UPMENU) ShowMainMenu(av); } } listen(integer channel, string name, key id, string message) { if (id != g_kWearer || g_sPending == "") return; if (g_sPending == "anim") { g_sCustomAnim = llStringTrim(message, STRING_TRIM); if (g_sCustomAnim == "") { llMessageLinked(LINK_SET, NOTIFY, "0Animation auf Standard zurückgesetzt.", g_kWearer); } else { llMessageLinked(LINK_SET, NOTIFY, "0Neue Animation: " + g_sCustomAnim, g_kWearer); } } else if (g_sPending == "sound") { g_sCustomSound = llStringTrim(message, STRING_TRIM); if (g_sCustomSound == "") { llMessageLinked(LINK_SET, NOTIFY, "0Sound auf Standard zurückgesetzt.", g_kWearer); } else { llMessageLinked(LINK_SET, NOTIFY, "0Neuer Sound: " + g_sCustomSound, g_kWearer); } } g_sPending = ""; llListenRemove(g_iListenHandle); g_iListenHandle = -1; ShowSettingsMenu(g_kWearer); } }