1st necessity of SL
Ever since I noticed that many sims contain 1000's of wonderful objects with fancy effects and 1000's active scripts that use valuable simresources while no-one is around to enjoy it, I wanted to script something simple to offload those resources and give the visitor a better experience.
That's why I made this little script: '1st necessity of SL' that could and should be used in any project that doesn't need to be active all the time.
We are building a better place, together :)
<lsl> // Script disables all other not-blacklisted scripts within // the same prim when there's nobody in the set scope (area) // // measured script time is less than 0.002 ms on average // // Don't use it for rental stuff or sorts, not everything is suitable. // // Don't reset this script or take it back to your inventory when you're // not within the set scope (area) or you'll get unpredictable results !!
// scope (area) can be AGENT_LIST_REGION, AGENT_LIST_PARCEL or AGENT_LIST_PARCEL_OWNER integer scope = AGENT_LIST_REGION;
// do not go below 10.0 seconds nor above 30.0 float sweepEveryXSeconds = 30.0;
list scriptBlacklist = ["some script", "some other script"]; list scriptWhitelist;
integer debugScript = FALSE;
get_list_of_scripts_to_toggle_on_or_off_without_blacklisted_ones()
{
string thisScript = llGetScriptName(); scriptWhitelist = [];
integer numberOfScripts = llGetInventoryNumber(INVENTORY_SCRIPT);
// return if just thisScript
if (numberOfScripts == 1)
return;
integer index;
do
{
string scriptName = llGetInventoryName(INVENTORY_SCRIPT, index);
if (scriptName != thisScript && ~llListFindList(scriptBlacklist, [scriptName]))
{
scriptWhitelist += [scriptName];
if (debugScript)
llSay(PUBLIC_CHANNEL,
"/me [" + thisScript + "]: Script on whitelist: '" + scriptName + "'.");
}
else
{
if (debugScript)
llSay(PUBLIC_CHANNEL,
"/me [" + thisScript + "]: Script on blacklist: '" + scriptName + "'.");
}
++index; } while (index < numberOfScripts);
}
toggle_script_states(integer inputInteger) {
string outputState = "FALSE"; if (inputInteger) outputState = "TRUE";
string thisScript = llGetScriptName(); integer numberOfWhitelistedScripts = llGetListLength(scriptWhitelist);
integer index;
do
{
string scriptToChangeState = llList2String(scriptWhitelist, index);
llSetScriptState(scriptToChangeState, inputInteger);
if (debugScript)
llSay(PUBLIC_CHANNEL,
"/me [" + scriptName + "]: Changed state of '" + scriptToChangeState + "' to " + outputState);
++index; } while (index < numberOfWhitelistedScripts);
}
default {
on_rez(integer start_param)
{
llResetScript();
}
changed(integer change)
{
if (change & (CHANGED_OWNER | CHANGED_INVENTORY))
llResetScript();
}
state_entry()
{
get_list_of_scripts_to_toggle_on_or_off_without_blacklisted_ones();
llSetTimerEvent(sweepEveryXSeconds);
}
timer()
{
list agentList = llGetAgentList(scope, []);
integer numberOfAgentsInSim = llGetListLength(agentList);
if (numberOfAgentsInSim)
toggle_script_states(TRUE);
else
toggle_script_states(FALSE);
}
} </lsl>