// (c) Ezian Ecksol. Use, modify, steal or sale as you like. Keep credits.
float detect_range = 96.;
string getparcelname(vector p) {
return llList2String(llGetParcelDetails(p, [PARCEL_DETAILS_NAME]),0);
}
string Float2String(float num) {
list s = llParseString2List((string)(llRound(num*10.)/10.), ["."], []);
return llList2String(s, 0)+"."+llGetSubString(llList2String(s, 1), 0, 0);
}
string Vector2String(vector v) {
return "<"+Float2String(v.x)+", "+Float2String(v.y)+", "+Float2String(v.z)+">";
}
getparcelbounds() {
vector pos = llGetPos();
vector rpos;
pos = <llRound(pos.x), llRound(pos.y), 0.>;
string name = getparcelname(pos);
vector parcel0; vector parcel1;
vector parcel_center; vector parcel_size;
rpos = pos;
do { rpos.x -= 1.; } while (getparcelname(rpos) == name);
parcel0.x = rpos.x + 1.;
rpos = pos;
do { rpos.y -= 1.; } while (getparcelname(rpos) == name);
parcel0.y = rpos.y + 1.;
rpos = pos;
do { rpos.x += 1.; } while (getparcelname(rpos) == name);
parcel1.x = rpos.x;
rpos = pos;
do { rpos.y += 1.; } while (getparcelname(rpos) == name);
parcel1.y = rpos.y;
parcel_center = (parcel1 + parcel0) / 2.;
parcel_size = parcel1 - parcel0;
float c = llPow(parcel_size.x/2.,2.)+llPow(parcel_size.y/2.,2.);
float d = detect_range*detect_range;
if (c > d)
llOwnerSay("Your parcel is to large to be covered by a "+Float2String(detect_range)+"-m-scanner. Place the detector in the middle of the parcel at ground, but the corners are not covered."
; else {
vector dest = <parcel_center.x, parcel_center.y, llGround(parcel_center-llGetPos())+llSqrt(d-c)>;
llOwnerSay("For optimal scanning range at ground, set position of sensor object to: "+Vector2String(dest));
}
}
default {
state_entry() {
getparcelbounds();
}
}