// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Draft an inventory sound playlist // Not compiled or tested in-world // Setup: Place in your own object and touch. Enter add|soundName, remove|number, or list. Up to 12 cues. // Stop / restore: Remove or reset to erase session data. Input listeners close after one reply or after 45 seconds. // Notes: Data lives only in script memory and is lost on reset. No visitors are logged and no external requests are sent. Checks inventory type but does not play or transfer any sound. Repeated sounds are allowed because their order may matter. // License: see LICENSE in this distribution. // Original Incoprea example. MIT. list cues; integer positive(string input) { if(input=="" || llStringLength(input)>5)return FALSE; integer i; for(i=0;i0; } integer handle; integer channel; closeInput() { if(handle)llListenRemove(handle); handle=0; llSetTimerEvent(0); } respond(string input) { input=llStringTrim(input,STRING_TRIM); if(llStringLength(input)>200) { llOwnerSay("Use at most 200 characters."); return; } if(input=="list") { integer i; for(i=0;i=12) { llOwnerSay("Missing sound or playlist full."); return; } cues += [value]; llOwnerSay("Cue appended."); } else if(command=="remove") { if(!positive(value) || (integer)value>llGetListLength(cues)) { llOwnerSay("Invalid cue number."); return; } integer index=(integer)value-1; cues=llDeleteSubList(cues,index,index); llOwnerSay("Cue removed from draft."); } else llOwnerSay("Unknown command."); } default { touch_start(integer touches) { if(llDetectedKey(0)!=llGetOwner())return; closeInput(); channel=-10000-(integer)llFrand(1000000000); handle=llListen(channel,"",llGetOwner(),""); llSetTimerEvent(45); llTextBox(llGetOwner(),"Enter add|soundName, remove|number, or list. Up to 12 cues.",channel); } listen(integer c,string name,key speaker,string input) { if(c!=channel || speaker!=llGetOwner())return; closeInput(); respond(input); } timer() { closeInput(); llOwnerSay("Input closed."); } changed(integer flags) { if(flags & CHANGED_OWNER)llResetScript(); } }