// IF YOU VALUE THIS WORK, PLEASE LEAVE ATTRIBUTION INTACT // // // // _|_| // // _| _| _|_|_|_| _|_| _|_|_| _|_| // // _| _| _| _| _| _| _| _|_|_|_| // // _| _| _| _| _| _| _| _| // // _|_| _|_|_|_| _|_| _| _| _|_|_| // // MiniVerse // //............................................................// //.....................▒▓▓▒▒▒▒▓▓▓▓▓▓▒▒▒▓▓░....................// //.................._▒▓▒.Ozone.MiniVerse.▒▓▒_.................// //................_▒▓▓▓▒____PRESENTS____▒▓▓▓▓▓▒_..............// //..............░▓▓▓▓▓▓▒___I.M.A.G.E.___▒▓▓▓▓▓▓▓░.............// //.............▒▓▓▓▓▓▓▓▒__IMAGE_MATRIX__▒▓▓▓▓▓▓▓▓▒............// //............▒▓▒▓▓▓▓▒_ACTION_GAME_ENGINE_▒▓▓▓▓▒▓▓▒...........// //..........▒▓▓▓▓░...▒▓▓▒_By_Spax_Orion_▒▓▓▒...░▓▓▓▓▒.........// //.........▒▓▓▓▓░......▒▓_& Dirty Helga_▓▓▒░.....░▒▓▓▓........// //.........▓▓▓▓▒░.._......░▒▓▓▓▓▓▓▓▓▓▓▓▒░......_..░▒▓▓▓.......// //.........▓▓▓▓░.._▓░▓░_....▓▓▓▓▓▓▓▓▓▓...._▒▓▒▓_..░▓▓▓▓.......// //.........▓▓▓▓.._▓█░▒█▒.....▒▓▓▓▓▓▓▒.....▒█▒░█▒_..▓▓▓▓.......// //........▒▓▓▓▓▓▒_..▒._░_▒▓▓▒░.▒▒.░▒▓▓▒_░_.▒.._▒▓▓▓▓▓▓▒.......// //.......▒▓▓▓▓▓▓▓▓▓_...▒▓▓▓▓▓░..▒▒..░▓▓▓▓▓▒..._▓▓▓▓▓▓▓▓▒......// //......▓▓▓▓▓▓▓▓▓▓▓_.▓▓▓▓▓▒.._▓▓▓█_..▒▓▓▓▓▓._▓▓▓▓▓▓▓▓▓▓▓......// //......▓▓▓▓▓▒▒▓▓▓▒▓▓▓▓▓▓▒░.▒▓▓▓▓▓█▒.░▒▓▓▓▓▓▒▒▓▓▓▒▓▓▓▓▓▓......// //......▓▓▓▓▓░.▓▓▓.▒▓▓▓▓▓░..▒▓▓▓▓▓▓▒..░▓▓▓▓▓░.▓▓▓.░▓▓▓▓▓......// //........▒▓▓█░.▓▓▓.▒▓▓▓▓▓__▓_..▒▒.._▓__▓▓▓▓▓░.▓▓▓.▒▓▓▓▒......// //.........░▒░░▒▓▒░▒▓▓▓▓▓▓▒▒▓▒▒▒▓▓▒▒▒▓▒▒▓▓▓▓▓▒░▒▓▒░░▒░░.......// //.........░▒.░▓▓░.▓▓▓▓█▒▒▒█▒▒▒█▒▒█▒▒▒█▒▒▒█▓▓▓▓.░▓▓░.▒░.......// //.............░▓▓░_▓▓▓▓█................█▓▓▓▓_░▓▓░...........// //..............░▒▓▓▓█▓._▒_.█░....█░._█_.▓█▓▓▓▒░..............// //.................░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░................// //.................░▒▓▓▓▒▒▓▒▒▓▓▓▓▒▒▓▓▓▓▒▒▓▓▒░.................// //..................▒▓▓░░▓░░▓▓▓▓░░▓▓▓▓░░▓▓▒...................// //.................▒▓░..█__▓▓▓▓__▓▓▓▓__█..░▓▒.................// //...................░...░..░▓▓░..░▓▓░..░...░.................// //.................... ..░...░▒░....░▒░...░...................// //............................................................// // Common sense not included and must be supplied by end user // // Read ENTIRE script first and LEARN: KNOW what you're using // // CC BY-NC https://creativecommons.org/licenses/by-nc/4.0/ // // ===========================================================// // orbitSR (permissionless audio follower) // - Rezzed by Arena Entrance Hook on private channel start_param // - Binds to a token + controller key // - Receives AUD position pushes to follow camera-ish spot // - Plays LOOP only (no TRIG) // sounds you want relayed live in this prim // =========================================================== // ---------------- CONFIG ---------------- integer FOLLOW_USE_REGIONPOS = TRUE; // TRUE: llSetRegionPos; FALSE: llSetPos (linkset safe only) float FOLLOW_Z_CLAMP_MIN = 0.0; // safety clamp (optional) float FOLLOW_Z_CLAMP_MAX = 4096.0; string gToken = ""; key gController = NULL_KEY; integer gChan = 0; integer gListen = 0; string gLoopSnd = ""; float gLoopVol = 1.0; integer gHaveLoop = FALSE; integer tokenOk(string tok) { if (gToken == "") return FALSE; return (tok == gToken); } vector clampZ(vector p) { if (p.z < FOLLOW_Z_CLAMP_MIN) p.z = FOLLOW_Z_CLAMP_MIN; if (p.z > FOLLOW_Z_CLAMP_MAX) p.z = FOLLOW_Z_CLAMP_MAX; return p; } moveTo(vector p) { p = clampZ(p); if (FOLLOW_USE_REGIONPOS) llSetRegionPos(p); else llSetPos(p); } playLoop(string snd, float vol) { if (snd == "") return; if (vol < 0.0) vol = 0.0; if (vol > 1.0) vol = 1.0; if (llGetInventoryType(snd) != INVENTORY_SOUND) return; // duplicate suppression if (gHaveLoop && snd == gLoopSnd && llFabs(vol - gLoopVol) < 0.001) return; llStopSound(); llLoopSound(snd, vol); gHaveLoop = TRUE; gLoopSnd = snd; gLoopVol = vol; } stopLoop() { llStopSound(); gHaveLoop = FALSE; gLoopSnd = ""; gLoopVol = 1.0; } default { state_entry() { llSetStatus(STATUS_PHYSICS, FALSE); llSetStatus(STATUS_PHANTOM, TRUE); llSetAlpha(0.0, ALL_SIDES); llSetTimerEvent(0.0); } on_rez(integer start_param) { gChan = start_param; if (gListen) llListenRemove(gListen); gListen = llListen(gChan, "", NULL_KEY, ""); // reset session gToken = ""; gController = NULL_KEY; stopLoop(); } listen(integer channel, string name, key id, string msg) { name = ""; id = NULL_KEY; if (channel != gChan) return; list p = llParseString2List(msg, ["|"], []); string cmd = llToUpper(llList2String(p, 0)); // BIND|token|avatarUUID if (cmd == "BIND") { string tok = llList2String(p, 1); key av = (key)llList2String(p, 2); if (tok == "") return; if (av == NULL_KEY) return; // lock once if (gToken != "" && tok != gToken) return; gToken = tok; gController = av; return; } // Everything below requires token string tok2 = llList2String(p, 1); if (!tokenOk(tok2)) return; // OFF|token if (cmd == "OFF") { stopLoop(); llDie(); return; } // STOP|token if (cmd == "STOP") { stopLoop(); return; } // LOOP|token|SoundName|Vol if (cmd == "LOOP") { string snd = llList2String(p, 2); float vol = (float)llList2String(p, 3); playLoop(snd, vol); return; } // AUD|token| if (cmd == "AUD") { vector pos = (vector)llList2String(p, 2); moveTo(pos); return; } } changed(integer c) { if (c & CHANGED_REGION_START) llResetScript(); if (c & CHANGED_INVENTORY) llResetScript(); } }