Difference between revisions of "Parcel Scanning"
Line 18: | Line 18: | ||
default { | default { | ||
state_entry() { | state_entry() { | ||
gridAreas = gridDefault = [0. | gridAreas = gridDefault = [0.5, 0.5, 255.5, 255.5]; | ||
llSetTimerEvent(0.01); | llSetTimerEvent(0.01); | ||
} | } | ||
Line 78: | Line 78: | ||
} else if (3 == pattern) { | } else if (3 == pattern) { | ||
float gridSize = tx - cx; | float gridSize = tx - cx; | ||
if (gridSize > | if (gridSize > 4.0) { | ||
if ((owner1 != owner2) || (owner2 != owner3) || | if ((owner1 != owner2) || (owner2 != owner3) || | ||
(owner3 != k) || (owner1 != k) || | (owner3 != k) || (owner1 != k) || | ||
Line 84: | Line 84: | ||
(gridSize * gridSize))) { | (gridSize * gridSize))) { | ||
float midG = llRound(gridSize / 2.0); | float midG = llRound(gridSize / 2.0); | ||
float midX = | float midX = cx + midG; | ||
float midY = | float midY = cy + midG; | ||
list newGrids = []; | list newGrids = []; |
Revision as of 14:43, 6 August 2009
Scanning parcels within a simulator can be a slow process if not done efficiently. In order to solve this I devised a neater way of scanning parcels that can reduce the number of operations required by 50% or more.
The following script by Haravikk Mistral is provided as-is, and will simply test the simulator you place it in for land-owners, then every 24 hours it will re-scan and inform you of any new land-owners, or any that have left. It will do this by treating the region first as a square 256 units wide, test it, and if required will sub-divide it in order to narrow down its search to detect individual parcels.
NOTE: The script's timer is set to a default of 2 seconds, this is assuming that speed is not an issue, and stops the script from causing much lag.
<lsl>list oldOwners = []; list oldGroups = [];
list newOwners = []; list newGroups = [];
list gridAreas = []; list gridDefault = [];
integer operations = 0;
default {
state_entry() { gridAreas = gridDefault = [0.5, 0.5, 255.5, 255.5]; llSetTimerEvent(0.01); } timer() { float cx = llList2Float(gridAreas, 0); float cy = llList2Float(gridAreas, 1); float tx = llList2Float(gridAreas, 2); float ty = llList2Float(gridAreas, 3); gridAreas = llDeleteSubList( (gridAreas = []) + gridAreas, 0, 3 ); key owner1 = NULL_KEY; key owner2 = NULL_KEY; key owner3 = NULL_KEY; float x = cx; float y = cy; integer pattern = 0; @gridProcess; ++operations; list details = llGetParcelDetails( <x, y, 0.0>, [ PARCEL_DETAILS_OWNER, PARCEL_DETAILS_GROUP, PARCEL_DETAILS_AREA ] ); key k = llList2Key(details, 0); key g = llList2Key(details, 1); list l = [k]; if (!(~llListFindList(oldOwners, l)) && !(~llListFindList(newOwners, l))) { if ((k != NULL_KEY) && (k != g)) newOwners += l; else { k = g; l = [k]; if (!(~llListFindList(oldGroups, l)) && !(~llListFindList(newGroups, l))) { if (k != NULL_KEY) newGroups += l; } } } if (!pattern) { owner1 = k; y = ty; } else if (1 == pattern) { owner2 = k; x = tx; } else if (2 == pattern) { owner3 = k; y = cy; } else if (3 == pattern) { float gridSize = tx - cx; if (gridSize > 4.0) { if ((owner1 != owner2) || (owner2 != owner3) || (owner3 != k) || (owner1 != k) || (llList2Float(details, 2) < (gridSize * gridSize))) { float midG = llRound(gridSize / 2.0); float midX = cx + midG; float midY = cy + midG; list newGrids = []; if (midX > cx) { if (midY > cy) newGrids = [ cx, cy, midX, midY, midX, cy, tx, midY, cx, midY, midX, ty, midX, midY, tx, ty ]; else newGrids = [ cx, cy, midX, ty, midX, cy, tx, ty ]; } else if (midY > cy) newGrids = [ cx, cy, tx, midY, cx, midY, tx, ty ]; if (newGrids != []) gridAreas = (gridAreas = []) + newGrids + gridAreas; } } } if (3 > pattern) { ++pattern; jump gridProcess; } if ([] == gridAreas) { string msg = "Complete after " + (string)operations + " operations."; integer x = oldOwners != []; while ((--x) >= 0) { integer index = llListFindList( newOwners, [llList2Key(oldOwners, x)] ); if (~index) newOwners = llDeleteSubList( (newOwners = []) + newOwners, index, index ); else oldOwners = llDeleteSubList( (oldOwners = []) + oldOwners, x, x ); } if (x = newOwners != []) { msg += "\nNew land owners:"; while ((--x) >= 0) msg += "\n" + llList2String(newOwners, x); msg += "\n"; } if (x = oldOwners != []) { msg += "\nAbsent land owners:"; while ((--x) >= 0) msg += "\n" + llList2String(oldOwners, x); msg += "\n"; } oldOwners = (oldOwners = newOwners = []) + oldOwners + newOwners; x = oldGroups != []; while ((--x) >= 0) { integer index = llListFindList( newGroups, [llList2Key(oldGroups, x)] ); if (~index) newGroups = llDeleteSubList( (newGroups = []) + newGroups, index, index ); else oldGroups = llDeleteSubList( (oldGroups = []) + oldGroups, x, x ); } if (x = newGroups != []) { msg += "\nNew land groups:"; while ((--x) >= 0) msg += "\n" + llList2String(newGroups, x); msg += "\n"; } if (x = oldGroups != []) { msg += "\nAbsent land groups:"; while ((--x) >= 0) msg += "\n" + llList2String(oldGroups, x); } oldGroups = (oldGroups = newGroups = []) + oldGroups + newGroups; llInstantMessage(llGetOwner(), (msg = "") + msg); gridAreas = gridDefault; float time = 86400.0 - llGetGMTclock(); if (time < 3600.0) time += 86400.0; llSetTimerEvent(time); } else llSetTimerEvent(2.0); }
} </lsl>