Landownder Border Detector

Written by Kitsune
//
// LandownerBorderDetector
// Version 20070217-1
// Copyright (c) 2007 by Second Life resident Badpenguin Posthorn
//
// Plop this script in an object and touch the object to display border
// lines and boundary coordinates of contiguous land owned by the same
// landowner. Works by detecting changes in land ownership and is
// accurate up to 0.5 meters. Note that it will only detect boundaries
// on the direct X and Y coordinates from where the scripted object
// resides, so only expect useful results when the boundaries of the
// measured parcel(s) are straight lines. Works on group deeded land
// also.
//
//
// LICENSE:
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the:
// Free Software Foundation, Inc.
// 59 Temple Place Suite 330
// Boston, MA 02111-1307, USA.
// (Also available at http://www.gnu.org/copyleft/gpl.html)
//
//
// Global variables, feel free to customize
//
float gJumpAmount = 0.5;

// *************************************************
// Find a land border by searching out from a
// specific coordinate for a change in land ownership.
// *************************************************
vector findBorder(string axis, vector start_vec, float jump_amount) {
float x = 0;
float y = 0;
float z = 0;
float num = 0;
vector newVec = ZERO_VECTOR;
vector lastVec = ZERO_VECTOR;
key owner1 = NULL_KEY;
key owner2 = NULL_KEY;
//
// Validate axis
//
if ((axis != "x") && (axis != "y")) {
// llSay(0,"Invalid axis passed to findBorder()");
return ZERO_VECTOR;
}
//
// Validate jump_amount
//
if ((integer)jump_amount >= 255) {
// llSay(0,"Invalid jump amount");
return ZERO_VECTOR;
}
//
// Validate start_vec
//
x = getVectorAxis(0,start_vec);
y = getVectorAxis(1,start_vec);
z = getVectorAxis(2,start_vec);
if (x <= 0 || y <= 0 || z <= 0) {
// llSay(0,"Invalid vector passed to findBorder()");
return ZERO_VECTOR;
}
if (x >= 255 || y >= 255 || z >= 255) {
// llSay(0,"Invalid vector passed to findBorder()");
return ZERO_VECTOR;
}
//
// Are we too close to a sim border?
//
if (axis == "x") {
if ((x + jump_amount >= 255) ||(x + jump_amount <= 0)) {
return ZERO_VECTOR;
}
} else {
if ((y + jump_amount >= 255) ||(y + jump_amount <= 0)) {
return ZERO_VECTOR;
}
}
//
// Get owner of land at start vector
//
owner1 = llGetLandOwnerAt(start_vec);
if (owner1 == NULL_KEY) {
// llSay(0,"Could not determine land owner at the location");
return ZERO_VECTOR;
}
//
// Assign initial values
//
lastVec = start_vec;
if (axis == "x") {
num = x;
} else {
num = y;
}
//
// Loop through until we find a different landowner
//
while ((num >= 0) && (num <= 255)) {
if (axis == "x") {
newVec =  + ;
} else {
newVec =  + <0, jump_amount, 0>;
}
owner2 = llGetLandOwnerAt(newVec);
if ((owner2 == NULL_KEY) || (owner1 != owner2)) {
return lastVec;
}
num += jump_amount;
if ((num <= 0) || (num >= 255)) {
return lastVec;
}
lastVec = newVec;
}
return ZERO_VECTOR;
}

// *************************************************
// Return a particular axis from a vector
// *************************************************
float getVectorAxis(integer axis, vector vec) {
if ((axis < 0) || (axis > 2)) {
return -1;
}
list junk = llParseString2List((string)vec,[",","<",">"], []);
if (llGetListLength(junk) != 3) {
return -1;
}
return llList2Float(junk,axis);
}


//
// default state starts here
//
default {
state_entry() {
llSay(0,"Touch the object to determine borders");
}

touch_start(integer num_detected) {
// Uncomment to disallow anyone but the owner to use it
//if (llDetectedKey(0) != llGetOwner()) {
// return;
// }
vector BOUND_EAST = ZERO_VECTOR;
vector BOUND_NORTH = ZERO_VECTOR;
vector BOUND_SOUTH = ZERO_VECTOR;
vector BOUND_WEST = ZERO_VECTOR;
string msg;
vector HOME_POS = llGetPos();
//
// Determine the northern boundary
//
BOUND_NORTH = findBorder("y",HOME_POS,gJumpAmount);
if (BOUND_NORTH == ZERO_VECTOR) {
llSay(0,"Failed to locate northern boundary");
llResetScript();
}
//
// Determine the southern boundary
//
BOUND_SOUTH = findBorder("y",HOME_POS,-gJumpAmount);
if (BOUND_SOUTH == ZERO_VECTOR) {
llSay(0,"Failed to locate southern boundary");
llResetScript();
}
//
// Determine the eastern boundary
//
BOUND_EAST = findBorder("x",HOME_POS,gJumpAmount);
if (BOUND_EAST == ZERO_VECTOR) {
llSay(0,"Failed to locate eastern boundary");
llResetScript();
}
//
// Determine the western boundary
//
BOUND_WEST = findBorder("x",HOME_POS,-gJumpAmount);
if (BOUND_WEST == ZERO_VECTOR) {
llSay(0,"Failed to locate western boundary");
llResetScript();
}
//
// Format some results for displaying
//
float borderNorth = getVectorAxis(1,BOUND_NORTH);
float borderSouth = getVectorAxis(1,BOUND_SOUTH);
float borderEast = getVectorAxis(0,BOUND_EAST);
float borderWest = getVectorAxis(0,BOUND_WEST);
float zCoord = getVectorAxis(2,HOME_POS);
vector vectorNW = ;
vector vectorNE = ;
vector vectorSE = ;
vector vectorSW = ;
//
// Display the results
//
llSay(0,"");
llSay(0,"Northern Boundary Detected: " + (string)BOUND_NORTH);
llSay(0,"Southern Boundary Detected: " + (string)BOUND_SOUTH);
llSay(0,"Eastern Boudary Detected: " + (string)BOUND_EAST);
llSay(0,"Western Boundary Detected: " + (string)BOUND_WEST);
llSay(0,"");
llSay(0,"Northern Border Line: " + (string)borderNorth);
llSay(0,"Southern Border Line: " + (string)borderSouth);
llSay(0,"Eastern Border Line: " + (string)borderEast);
llSay(0,"Western Border Line: " + (string)borderWest);
llSay(0,"");
llSay(0,"Northwest Coords: " + (string)vectorNW);
llSay(0,"Northeast Coords: " + (string)vectorNE);
llSay(0,"Southeast Coords: " + (string)vectorSE);
llSay(0,"Southwest Coords: " + (string)vectorSW);
}

on_rez(integer num) {
llResetScript();
}

}