// Stargate Sound Controller v2 // Based on original script by Spectre Draconia & Ayden Janus. // Keeps original sound UUIDs while adding a robust command interface. // // Recommended API: // llMessageLinked(LINK_SET, 0, "SG_SOUND", "CHEV_LOCK"); // llMessageLinked(LINK_SET, 0, "SG_SOUND", "CHEV_INCOMING"); // llMessageLinked(LINK_SET, 0, "SG_SOUND", "DIAL_FAILED"); // llMessageLinked(LINK_SET, 0, "SG_SOUND", "INTERFERENCE"); // llMessageLinked(LINK_SET, 0, "SG_SOUND", "GATE_ACTIVE"); // llMessageLinked(LINK_SET, 0, "SG_SOUND", "GATE_CLOSE"); // llMessageLinked(LINK_SET, 0, "SG_SOUND", "STOP"); // llMessageLinked(LINK_SET, 0, "SG_SOUND", "CHEV_LOCK|0.7"); // per-call volume // // Compatibility API (legacy): // llMessageLinked(LINK_SET, 0, "chevSound", NULL_KEY); // llMessageLinked(LINK_SET, 0, "dialFailed", NULL_KEY); // llMessageLinked(LINK_SET, 0, "sndInterference", NULL_KEY); // llMessageLinked(LINK_SET, 0, "actvGate", NULL_KEY); // llMessageLinked(LINK_SET, 0, "closeGate", NULL_KEY); integer debug = TRUE; // Preserve original UUIDs (LOCKED: do not change unless intentionally replacing assets) string chevSound = "90ee3471-386a-4d64-8767-6e34d7fc8210"; string chevIncoming = "7fd4a22a-79db-41d5-9077-e1e7963dc650"; string dialFailed = "0a79ae60-016e-4d1f-ad22-ff9bce8faaa1"; string sndInterference = "070181d7-3780-42e5-b56e-abd2c15e316f"; string actvGate = "cf35705d-d3dd-4d3d-915f-0af9f130ee57"; string gateOpen = "0eeefaa0-60fa-4c71-9f47-bac6bd2c8c4f"; string closeGate = "d772a755-5762-4ebf-8447-1ce0e6302d95"; float defaultVolume = 1.0; string normalize_cmd(string s) { return llToUpper(llStringTrim(s, STRING_TRIM)); } play_one_shot(string soundId, float vol) { if (vol < 0.0) vol = 0.0; if (vol > 1.0) vol = 1.0; llTriggerSound(soundId, vol); } play_looped(string soundId, float vol) { if (vol < 0.0) vol = 0.0; if (vol > 1.0) vol = 1.0; llLoopSound(soundId, vol); } string resolve_sound_id(string command) { if (command == "CHEV_LOCK" || command == "CHEVSOUND") return chevSound; if (command == "CHEV_INCOMING" || command == "INCOMING") return chevIncoming; if (command == "DIAL_FAILED" || command == "DIALFAILED") return dialFailed; if (command == "INTERFERENCE" || command == "SNDINTERFERENCE") return sndInterference; if (command == "GATE_ACTIVE" || command == "ACTVGATE") return actvGate; if (command == "GATE_OPEN" || command == "KAWOOSH") return gateOpen; if (command == "GATE_CLOSE" || command == "CLOSEGATE") return closeGate; return ""; } handle_command(string raw) { list parts = llParseStringKeepNulls(raw, ["|"], []); string command = normalize_cmd(llList2String(parts, 0)); float vol = defaultVolume; integer isLoop = FALSE; if (llGetListLength(parts) >= 2) { string arg = normalize_cmd(llList2String(parts, 1)); if (arg == "LOOP") { isLoop = TRUE; if (llGetListLength(parts) >= 3) { vol = (float)llStringTrim(llList2String(parts, 2), STRING_TRIM); } } else { vol = (float)llStringTrim(llList2String(parts, 1), STRING_TRIM); } } if (command == "STOP") { llStopSound(); return; } string soundId = resolve_sound_id(command); if (soundId == "") { if (debug) llOwnerSay("Unknown SG_SOUND command: " + raw); return; } if (isLoop) play_looped(soundId, vol); else play_one_shot(soundId, vol); if (debug) llOwnerSay("[SOUND] played=" + command + " vol=" + (string)vol + (isLoop ? " loop=1" : " loop=0")); } preload_all() { list allSounds = [chevSound, chevIncoming, dialFailed, sndInterference, actvGate, gateOpen, closeGate]; integer i = 0; integer n = llGetListLength(allSounds); for (; i < n; ++i) { llPreloadSound(llList2String(allSounds, i)); } } default { state_entry() { preload_all(); } changed(integer c) { if (c & CHANGED_INVENTORY) { preload_all(); } } link_message(integer sender_num, integer num, string str, key id) { list rawParts = llParseStringKeepNulls(str, ["|"], []); string msg = llStringTrim(llList2String(rawParts, 0), STRING_TRIM); string payload = ""; // Prefer pipe-delimited payload from str. if (llGetListLength(rawParts) >= 2) { payload = llStringTrim(llDumpList2String(llList2List(rawParts, 1, -1), "|"), STRING_TRIM); } // Fall back to key payload only when not NULL_KEY. if (payload == "") { string keyPayload = llStringTrim((string)id, STRING_TRIM); if (keyPayload != "" && keyPayload != (string)NULL_KEY) { payload = keyPayload; } } // New interface: command in key payload if (normalize_cmd(msg) == "SG_SOUND") { if (debug) llOwnerSay("[SOUND] command=" + msg + " payload=" + payload); if (payload == "") return; handle_command(payload); return; } // Legacy interface: command in str if (msg != "") { string legacy = normalize_cmd(msg); if ( legacy == "CHEVSOUND" || legacy == "DIALFAILED" || legacy == "SNDINTERFERENCE" || legacy == "ACTVGATE" || legacy == "CLOSEGATE" || legacy == "STOP" ) { handle_command(msg); } } } }