use timer to avoid event timeout in OpenSim (#40)

This commit is contained in:
codeviolet 2017-09-09 18:56:10 +10:00 committed by GitHub
parent bfb8ba8443
commit dc8b6c8386

View file

@ -26,6 +26,7 @@ list objects_files;
integer menu_handle; integer menu_handle;
key av; key av;
integer listenhandle; integer listenhandle;
integer i;
particles_on(key target) particles_on(key target)
{ {
@ -71,10 +72,63 @@ default
{ {
llSetTimerEvent(0); llSetTimerEvent(0);
llListenRemove(listenhandle); llListenRemove(listenhandle);
llRegionSayTo(av, 0, "Found " + (string)llGetListLength(objects_to_update) + " objects..."); state do_update;
integer i; }
for (i = 0; i < llGetListLength(objects_to_update); i++)
touch_start(integer touched)
{ {
if (llDetectedKey(0) == llGetOwner() || llSameGroup(llDetectedKey(0)))
{
av = llDetectedKey(0);
objects_to_update = [];
objects_files = [];
llSetTimerEvent(10);
list items;
integer i;
for (i = 0; i < llGetInventoryNumber(INVENTORY_ALL); i++)
{
if (llGetInventoryName(INVENTORY_ALL, i) != llGetScriptName())
{
items += llGetInventoryName(INVENTORY_ALL, i);
}
}
llRegionSayTo(av, 0, "listening...");
llSay(pin, "OBJECT_SEARCH|" + llDumpList2String(items, "|"));
}
}
listen(integer chan, string name, key id, string msg)
{
if (llGetOwnerKey(id) == llGetOwner())
{
list data = llParseStringKeepNulls(msg, ["|"], []);
if (llList2String(data, 0) == "OBJECT_HERE")
{
vector mysize = llGetScale();
float distance = llVecMag(llGetPos() - llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0));
if (distance <= mysize.x / 2)
{
objects_to_update += id;
objects_files += llDumpList2String(llList2List(data, 1, -1), "|");
}
}
}
}
}
state do_update
{
state_entry()
{
llRegionSayTo(av, 0, "Found " + (string)llGetListLength(objects_to_update) + " prims...");
i = 0;
llSetTimerEvent(0.1);
}
timer(){
llRegionSayTo(av, 0, "Processing prim " + (string)(i+1) + "/" + (string)llGetListLength(objects_to_update));
key object = llList2Key(objects_to_update, i); key object = llList2Key(objects_to_update, i);
list items = llParseStringKeepNulls(llList2String(objects_files, i), ["|"], []); list items = llParseStringKeepNulls(llList2String(objects_files, i), ["|"], []);
if (1 == 1) if (1 == 1)
@ -142,52 +196,12 @@ default
} }
} }
} }
else
{ i++;
llRemoteLoadScriptPin(object, receiver_script, pin, TRUE, -1);
} if(i==llGetListLength(objects_to_update)){
} llRegionSayTo(av, 0, "Updates complete!");
llRegionSayTo(av, 0, "Updating Complete!");
llResetScript(); llResetScript();
} }
touch_start(integer touched)
{
if (llDetectedKey(0) == llGetOwner() || llSameGroup(llDetectedKey(0)))
{
av = llDetectedKey(0);
objects_to_update = [];
objects_files = [];
llSetTimerEvent(10);
list items;
integer i;
for (i = 0; i < llGetInventoryNumber(INVENTORY_ALL); i++)
{
if (llGetInventoryName(INVENTORY_ALL, i) != llGetScriptName())
{
items += llGetInventoryName(INVENTORY_ALL, i);
}
}
llRegionSayTo(av, 0, "listening...");
llSay(pin, "OBJECT_SEARCH|" + llDumpList2String(items, "|"));
}
}
listen(integer chan, string name, key id, string msg)
{
if (llGetOwnerKey(id) == llGetOwner())
{
list data = llParseStringKeepNulls(msg, ["|"], []);
if (llList2String(data, 0) == "OBJECT_HERE")
{
vector mysize = llGetScale();
float distance = llVecMag(llGetPos() - llList2Vector(llGetObjectDetails(id, [OBJECT_POS]), 0));
if (distance <= mysize.x / 2)
{
objects_to_update += id;
objects_files += llDumpList2String(llList2List(data, 1, -1), "|");
}
}
}
} }
} }