Difference between revisions of "User:Ezian Ecksol"
Jump to navigation
Jump to search
Ezian Ecksol (talk | contribs) |
m (fixed broken lsl formatting) |
||
(9 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
< | == Some Scripts == | ||
'''Rangefinder''' | |||
<source lang="lsl2"> | |||
// Rangefinder, (c) Ezian Ecksol, open source. keep credits. | |||
// usage: compile script, drag it to your av inventory. | |||
// drop this script into 2 objects, click them to hear the distance | |||
// possible to move the objects and click again. | |||
integer chan = -947836726; | |||
integer listen_h; | |||
key target; | |||
string target_name; | |||
shout() { | |||
llRegionSay(chan,"key$"+(string)llGetKey()); | |||
} | |||
info() { | |||
llSay(0,"Distance to "+target_name+": "+(string)get_dist()+ "m.\nMove and touch to hear distance again."); | |||
} | |||
float get_dist() { | |||
return llVecDist(llGetPos(),llList2Vector(llGetObjectDetails(target,[OBJECT_POS]),0)); | |||
} | |||
default | |||
{ | |||
state_entry() { | |||
listen_h = llListen(chan, "", NULL_KEY, ""); | |||
llSetTimerEvent(2.); | |||
} | |||
on_rez(integer p) { | |||
llResetScript(); | |||
} | |||
listen(integer channel, string name, key id, string msg) { | |||
if (llGetOwnerKey(id) == llGetOwner()) { | |||
list m = llParseString2List(msg, ["$"], []); | |||
if (llList2String(m,0) == "key"){ | |||
llSetTimerEvent(0.); | |||
llListenRemove(listen_h); | |||
string t = llList2String(m,1); | |||
target = (key)t; | |||
target_name = llList2String(llGetObjectDetails(target,[OBJECT_NAME]),0); | |||
info(); | |||
shout(); | |||
} | |||
} | |||
} | |||
touch_start(integer total_number) { | |||
if (target != NULL_KEY) | |||
info(); | |||
else | |||
llSay(0,"! Not linked"); | |||
} | |||
timer() { | |||
shout(); | |||
} | |||
} | |||
</source> | |||
--[[User:Ezian Ecksol|Ezian Ecksol]] 11:34, 24 September 2008 (PDT) | |||
'''CamJumper''' | |||
<source lang="lsl2"> | |||
// CamJumper (Dash) | |||
// (c) Ezian Ecksol. Use, modify, steal or sale as you like. Keep credits. | |||
// | |||
// usage: attach anywhere. Say /1 jc | |||
// to jump to cam position. works also to neighbour sims. | |||
// doesnt work most of the time if flying. | |||
integer jump_max=63; | |||
integer chan = 1; | |||
key owner; | |||
integer wouldGoOffWorld(vector here, vector there) { | |||
if (there.x < 0. || there.x >= 256. || there.y < 0. || there.y >= 256.) | |||
return llEdgeOfWorld(here, there - here); | |||
else | |||
return FALSE; | |||
} | |||
jumpto(vector to, float time) { | |||
vector e; vector from; vector s; float d; integer i; integer j; | |||
vector from0; | |||
vector region0; vector region; | |||
from = llGetPos(); | |||
if (!wouldGoOffWorld(from, to)) { | |||
region0 = llGetRegionCorner()/256.; | |||
do { | |||
region = llGetRegionCorner()/256.; | |||
if (region != region0) { | |||
if (region.x > region0.x) | |||
to.x -= 256.; | |||
else if (region.x < region0.x) | |||
to.x += 256.; | |||
if (region.y > region0.y) | |||
to.y -= 256.; | |||
else if (region.y < region0.y) | |||
to.y += 256.; | |||
} | |||
from0 = from; | |||
region0 = region; | |||
d = llVecDist(from, to); | |||
j = (integer)(d / jump_max)+1; | |||
e = from + (to - from) / (float)j; | |||
llOwnerSay("j="+(string)j+", d="+(string)d+", to="+(string)to); | |||
llMoveToTarget(e, time); | |||
llSleep(.5); | |||
from = llGetPos(); | |||
} while ((llVecDist(from, to) > 3.) && (llVecDist(from0, from) > 6.)); | |||
llStopMoveToTarget(); | |||
} else | |||
llOwnerSay("Destination is - or would cross - off-world."); | |||
} | |||
default { | |||
state_entry() { | |||
owner = llGetOwner(); | |||
llRequestPermissions(owner, PERMISSION_TRACK_CAMERA); | |||
} | |||
run_time_permissions(integer perm) { | |||
if (perm & PERMISSION_TRACK_CAMERA) | |||
llListen(chan, "", owner, "jc"); | |||
else | |||
llOwnerSay("Did not get permissions, failed."); | |||
} | |||
on_rez(integer start_param) { | |||
llResetScript(); | |||
} | |||
listen(integer ch, string name, key id, string msg) { | |||
jumpto(llGetCameraPos() + 3.5 * llRot2Fwd(llGetCameraRot()), .05); | |||
} | |||
} | |||
</source> | |||
--[[User:Ezian Ecksol|Ezian Ecksol]] 17:21, 23 September 2008 (PDT) | |||
---- | |||
'''Visitor-Detector''' | |||
<source lang="lsl2"> | |||
// Visitor-Detector 0.66 | |||
// (c) Ezian Ecksol. Use, modify, steal or sale as you like. Keep credits. | |||
// modify these values: ///// | |||
float ignore_time = 20.; // avatars visiting the parcel less than this time in seconds will be ignored | |||
integer print_method = 1; // 0=llSay, 1=llOwnerSay, 2=llInstantMessage | |||
float loop_time = 2.; // scanner checks every <loop_time> seconds | |||
////////////////////////////////// | |||
vector parcel0; vector parcel1; | |||
vector parcel_center; vector parcel_size; | |||
float detect_range = 96.; | |||
key owner; | |||
string parcel; | |||
list visitors_long; | |||
list visitors_short; | |||
integer active; | |||
string getparcelname(vector p) { | |||
return llList2String(llGetParcelDetails(p, [PARCEL_DETAILS_NAME]),0); | |||
} | |||
getparcelbounds() { | |||
vector pos = llGetPos(); | |||
vector rpos; | |||
pos = <llRound(pos.x), llRound(pos.y), 0.>; | |||
string name = getparcelname(pos); | |||
rpos = pos; | |||
do { rpos.x -= 1.; } while ((getparcelname(rpos) == name) && (rpos.x>=0.)); | |||
parcel0.x = rpos.x + 1.; | |||
rpos = pos; | |||
do { rpos.y -= 1.; } while ((getparcelname(rpos) == name) && (rpos.y>=0.)); | |||
parcel0.y = rpos.y + 1.; | |||
rpos = pos; | |||
do { rpos.x += 1.; } while ((getparcelname(rpos) == name) && (rpos.x<256.)); | |||
parcel1.x = rpos.x; | |||
rpos = pos; | |||
do { rpos.y += 1.; } while ((getparcelname(rpos) == name) && (rpos.y<256.)); | |||
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 96-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 object to: "+Vector2String(dest)); | |||
} | |||
} | |||
string format_2dig(integer i) { | |||
if (i<10) | |||
return "0"+(string)i; | |||
else | |||
return (string)i; | |||
} | |||
string format_timestamp(string ts) { | |||
return parcel+", "+llGetSubString(ts, 0, 9)+", "+llGetSubString(ts, 11,18)+" GMT"; | |||
} | |||
string format_seconds(integer s) { | |||
integer m = s / 60; | |||
s %= 60; | |||
integer h = m / 60; | |||
m %= 60; | |||
return format_2dig(h)+":"+format_2dig(m)+":"+format_2dig(s); | |||
} | |||
console(string txt) { | |||
if (print_method == 0) | |||
llSay(0, txt); | |||
else if (print_method == 1) | |||
llOwnerSay(txt); | |||
else | |||
llInstantMessage(owner, txt); | |||
} | |||
visitors_left(list v) { | |||
integer j = llGetListLength(v); | |||
if (j) { | |||
integer i; | |||
integer tu = llGetUnixTime(); | |||
for (i=0; i<j; i+=3) | |||
console("<< "+llList2String(v, i)+" left "+parcel+" after "+format_seconds(tu-llList2Integer(v, i+1))); | |||
} | |||
} | |||
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)+">"; | |||
} | |||
activate(integer a) { | |||
active = a; | |||
if (a) { | |||
llOwnerSay("Scans every "+Float2String(loop_time)+"s. Ignores visitors staying less than "+Float2String(ignore_time)+"s."); | |||
llOwnerSay("Activated: "+format_timestamp(llGetTimestamp())); | |||
llSensorRepeat("", NULL_KEY, AGENT, detect_range, PI, loop_time); | |||
} else { | |||
llOwnerSay("Deactived."); | |||
llSensorRemove(); | |||
} | |||
} | |||
default { | |||
state_entry() { | |||
owner = llGetOwner(); | |||
parcel = "\""+llList2String(llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_NAME]),0)+"\""; // +" in "+llGetRegionName(); | |||
activate(TRUE); | |||
llOwnerSay("Touch to stop or start."); | |||
getparcelbounds(); | |||
} | |||
touch_start(integer n) { | |||
if (llDetectedKey(0) == owner) | |||
activate(!active); | |||
} | |||
on_rez(integer p) { | |||
llResetScript(); | |||
} | |||
changed(integer c) { | |||
if (c & CHANGED_OWNER) llResetScript(); | |||
} | |||
sensor(integer n) { | |||
integer i; integer j; | |||
integer tu = llGetUnixTime(); | |||
string ts = llGetTimestamp(); | |||
string dname; | |||
list temp; | |||
list temp_short = visitors_short; | |||
list temp_long = visitors_long; | |||
visitors_short = []; | |||
visitors_long = []; | |||
for (i=0; i<n; ++i) { | |||
if (llOverMyLand(llDetectedKey(i))) { | |||
//vector dpos = llDetectedPos(i); | |||
//if ((dpos.x >= parcel0.x) && (dpos.x < parcel1.x) && (dpos.y >= parcel0.y) && (dpos.y < parcel1.y)) { | |||
dname = llDetectedName(i); | |||
j = llListFindList(temp_long, [dname]); | |||
if (j != -1) { | |||
visitors_long += llList2List(temp_long, j, j+2); | |||
temp_long = llDeleteSubList(temp_long, j, j+2); | |||
} else { | |||
j = llListFindList(temp_short, [dname]); | |||
if (j != -1) { | |||
temp = llList2List(temp_short, j, j+2); | |||
if ((tu-llList2Integer(temp, 1)) >= ignore_time) { | |||
visitors_long += temp; | |||
console(">> "+llList2String(temp, 0)+" entered "+format_timestamp(llList2String(temp, 2))); | |||
} else { | |||
visitors_short += temp; | |||
} | |||
} else { | |||
visitors_short += [dname, tu, ts]; | |||
} | |||
} | |||
} | |||
} | |||
visitors_left(temp_long); | |||
} | |||
no_sensor() { | |||
visitors_left(visitors_long); | |||
visitors_short = []; | |||
visitors_long = []; | |||
} | |||
} | |||
</source> | |||
---- | |||
'''1-Prim Digiclock''' | |||
<source lang="lsl2">// 1-Prim Digiclock | |||
// (c) Ezian Ecksol, open source, keep credits | |||
// | |||
// put to object description the GMT offset in hours, e.g 2.5 | |||
// touch to turn on/off | |||
list faces = [3,2.05,.6, 7,.795,0., 4,-11.5,-0.73, 6,.795,0., 1,2.05,-0.6]; | |||
key tx = "2b43c7d6-c96a-b5d9-7210-8bc15451252f"; | |||
float tx_step = 0.0625; | |||
float tx_step_2; | |||
float tx_base; | |||
integer presence0; | |||
float gmt_offset; | |||
float clock_cycle; | |||
float clock_time; | |||
integer clock_mode = TRUE; | |||
list construct_face(integer f, integer z) { | |||
integer i = f*3; | |||
return [PRIM_TEXTURE, llList2Integer(faces,i), tx, | |||
<llList2Float(faces,i+1), tx_step, 0.0>, <llList2Float(faces,i+2), tx_base-(float)z*tx_step, 0.0>, 0.0]; | |||
} | |||
setprim(integer z1, integer z2, integer z3, integer z4, integer z5) { | |||
llSetPrimitiveParams( | |||
construct_face(0,z1)+construct_face(1,z2)+ | |||
construct_face(2,z3)+construct_face(3,z4)+ | |||
construct_face(4,z5)); | |||
} | |||
clock() { | |||
clock_time = llGetGMTclock() + gmt_offset*3600.0; | |||
integer s = (integer) clock_time; | |||
integer h = (s / 3600) % 24; | |||
integer m = s % 3600; | |||
m = m / 60; | |||
setprim(h/10,h%10,10,m/10,m%10); | |||
llResetTime(); | |||
integer w1 = (integer) (clock_time / clock_cycle); | |||
float w2 = clock_time - (float)w1 * clock_cycle; | |||
llSetTimerEvent(clock_cycle-w2); | |||
} | |||
default | |||
{ | |||
state_entry() { | |||
integer f; | |||
integer i; | |||
list j; | |||
gmt_offset = (float)llGetObjectDesc(); | |||
tx_step_2 = tx_step / 2.; | |||
tx_base = 0.5 - tx_step_2; | |||
clock_cycle = 60.0; | |||
setprim(11,11,11,11,11); | |||
for (i=0; i<15; i+=3) { | |||
f = llList2Integer(faces,i); | |||
j += [PRIM_GLOW,f,.01, PRIM_COLOR, f, <0., 0., 1.>, 1.]; | |||
} | |||
llSetPrimitiveParams([ | |||
PRIM_TYPE, PRIM_TYPE_PRISM, 1, <0.2, 0.8, 0.0>, 0.7, <0.0, 0.0, 0.0>, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>, | |||
PRIM_SIZE, <0.01, 1.777, 0.577>, PRIM_FULLBRIGHT, ALL_SIDES, TRUE, PRIM_COLOR, ALL_SIDES, <0., 0., 1.>, 0.] + j); | |||
clock(); | |||
} | |||
on_rez(integer p) { | |||
llResetScript(); | |||
} | |||
touch_start(integer total_number) { | |||
if (llGetOwner() == llDetectedKey(0)) { | |||
clock_mode = !clock_mode; | |||
if (clock_mode) { | |||
clock(); | |||
} else { | |||
llSetTimerEvent(0.); | |||
setprim(15,15,15,15,15); | |||
} | |||
} | |||
} | |||
timer() { | |||
clock(); | |||
} | |||
} </source> | |||
--[[User:Ezian Ecksol|Ezian Ecksol]] 17:21, 23 September 2008 (PDT) | |||
---- | |||
'''Cam Lock/Follow''' | |||
<source lang="lsl2"> | |||
// Camstyle, (c) Ezian Ecksol, feel free to copy, steal, modify | |||
// Put script into prim, attach it. | |||
// usage: position your camera where you like. | |||
// enter in chan: | |||
// /1 camstyle follow <-- camera is fixed, but follows your av | |||
// /1 camstyle lock <-- camera is completly locked | |||
// /1 camstyle <-- releases cam again | |||
integer chan = 1; | |||
key owner; | key owner; | ||
Line 41: | Line 527: | ||
default | default | ||
{ | { | ||
state_entry() | state_entry() { | ||
owner = llGetOwner(); | owner = llGetOwner(); | ||
llListen(chan, "", owner, ""); | llListen(chan, "", owner, ""); | ||
Line 55: | Line 540: | ||
} | } | ||
changed(integer c) { | changed(integer c) { | ||
if (c & CHANGED_OWNER) | if (c & CHANGED_OWNER) | ||
Line 62: | Line 545: | ||
} | } | ||
} | } | ||
</ | </source> | ||
--[[User:Ezian Ecksol|Ezian Ecksol]] 17:21, 23 September 2008 (PDT) |
Latest revision as of 16:17, 26 April 2015
Some Scripts
Rangefinder
// Rangefinder, (c) Ezian Ecksol, open source. keep credits.
// usage: compile script, drag it to your av inventory.
// drop this script into 2 objects, click them to hear the distance
// possible to move the objects and click again.
integer chan = -947836726;
integer listen_h;
key target;
string target_name;
shout() {
llRegionSay(chan,"key$"+(string)llGetKey());
}
info() {
llSay(0,"Distance to "+target_name+": "+(string)get_dist()+ "m.\nMove and touch to hear distance again.");
}
float get_dist() {
return llVecDist(llGetPos(),llList2Vector(llGetObjectDetails(target,[OBJECT_POS]),0));
}
default
{
state_entry() {
listen_h = llListen(chan, "", NULL_KEY, "");
llSetTimerEvent(2.);
}
on_rez(integer p) {
llResetScript();
}
listen(integer channel, string name, key id, string msg) {
if (llGetOwnerKey(id) == llGetOwner()) {
list m = llParseString2List(msg, ["$"], []);
if (llList2String(m,0) == "key"){
llSetTimerEvent(0.);
llListenRemove(listen_h);
string t = llList2String(m,1);
target = (key)t;
target_name = llList2String(llGetObjectDetails(target,[OBJECT_NAME]),0);
info();
shout();
}
}
}
touch_start(integer total_number) {
if (target != NULL_KEY)
info();
else
llSay(0,"! Not linked");
}
timer() {
shout();
}
}
--Ezian Ecksol 11:34, 24 September 2008 (PDT)
CamJumper
// CamJumper (Dash)
// (c) Ezian Ecksol. Use, modify, steal or sale as you like. Keep credits.
//
// usage: attach anywhere. Say /1 jc
// to jump to cam position. works also to neighbour sims.
// doesnt work most of the time if flying.
integer jump_max=63;
integer chan = 1;
key owner;
integer wouldGoOffWorld(vector here, vector there) {
if (there.x < 0. || there.x >= 256. || there.y < 0. || there.y >= 256.)
return llEdgeOfWorld(here, there - here);
else
return FALSE;
}
jumpto(vector to, float time) {
vector e; vector from; vector s; float d; integer i; integer j;
vector from0;
vector region0; vector region;
from = llGetPos();
if (!wouldGoOffWorld(from, to)) {
region0 = llGetRegionCorner()/256.;
do {
region = llGetRegionCorner()/256.;
if (region != region0) {
if (region.x > region0.x)
to.x -= 256.;
else if (region.x < region0.x)
to.x += 256.;
if (region.y > region0.y)
to.y -= 256.;
else if (region.y < region0.y)
to.y += 256.;
}
from0 = from;
region0 = region;
d = llVecDist(from, to);
j = (integer)(d / jump_max)+1;
e = from + (to - from) / (float)j;
llOwnerSay("j="+(string)j+", d="+(string)d+", to="+(string)to);
llMoveToTarget(e, time);
llSleep(.5);
from = llGetPos();
} while ((llVecDist(from, to) > 3.) && (llVecDist(from0, from) > 6.));
llStopMoveToTarget();
} else
llOwnerSay("Destination is - or would cross - off-world.");
}
default {
state_entry() {
owner = llGetOwner();
llRequestPermissions(owner, PERMISSION_TRACK_CAMERA);
}
run_time_permissions(integer perm) {
if (perm & PERMISSION_TRACK_CAMERA)
llListen(chan, "", owner, "jc");
else
llOwnerSay("Did not get permissions, failed.");
}
on_rez(integer start_param) {
llResetScript();
}
listen(integer ch, string name, key id, string msg) {
jumpto(llGetCameraPos() + 3.5 * llRot2Fwd(llGetCameraRot()), .05);
}
}
--Ezian Ecksol 17:21, 23 September 2008 (PDT)
Visitor-Detector
// Visitor-Detector 0.66
// (c) Ezian Ecksol. Use, modify, steal or sale as you like. Keep credits.
// modify these values: /////
float ignore_time = 20.; // avatars visiting the parcel less than this time in seconds will be ignored
integer print_method = 1; // 0=llSay, 1=llOwnerSay, 2=llInstantMessage
float loop_time = 2.; // scanner checks every <loop_time> seconds
//////////////////////////////////
vector parcel0; vector parcel1;
vector parcel_center; vector parcel_size;
float detect_range = 96.;
key owner;
string parcel;
list visitors_long;
list visitors_short;
integer active;
string getparcelname(vector p) {
return llList2String(llGetParcelDetails(p, [PARCEL_DETAILS_NAME]),0);
}
getparcelbounds() {
vector pos = llGetPos();
vector rpos;
pos = <llRound(pos.x), llRound(pos.y), 0.>;
string name = getparcelname(pos);
rpos = pos;
do { rpos.x -= 1.; } while ((getparcelname(rpos) == name) && (rpos.x>=0.));
parcel0.x = rpos.x + 1.;
rpos = pos;
do { rpos.y -= 1.; } while ((getparcelname(rpos) == name) && (rpos.y>=0.));
parcel0.y = rpos.y + 1.;
rpos = pos;
do { rpos.x += 1.; } while ((getparcelname(rpos) == name) && (rpos.x<256.));
parcel1.x = rpos.x;
rpos = pos;
do { rpos.y += 1.; } while ((getparcelname(rpos) == name) && (rpos.y<256.));
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 96-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 object to: "+Vector2String(dest));
}
}
string format_2dig(integer i) {
if (i<10)
return "0"+(string)i;
else
return (string)i;
}
string format_timestamp(string ts) {
return parcel+", "+llGetSubString(ts, 0, 9)+", "+llGetSubString(ts, 11,18)+" GMT";
}
string format_seconds(integer s) {
integer m = s / 60;
s %= 60;
integer h = m / 60;
m %= 60;
return format_2dig(h)+":"+format_2dig(m)+":"+format_2dig(s);
}
console(string txt) {
if (print_method == 0)
llSay(0, txt);
else if (print_method == 1)
llOwnerSay(txt);
else
llInstantMessage(owner, txt);
}
visitors_left(list v) {
integer j = llGetListLength(v);
if (j) {
integer i;
integer tu = llGetUnixTime();
for (i=0; i<j; i+=3)
console("<< "+llList2String(v, i)+" left "+parcel+" after "+format_seconds(tu-llList2Integer(v, i+1)));
}
}
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)+">";
}
activate(integer a) {
active = a;
if (a) {
llOwnerSay("Scans every "+Float2String(loop_time)+"s. Ignores visitors staying less than "+Float2String(ignore_time)+"s.");
llOwnerSay("Activated: "+format_timestamp(llGetTimestamp()));
llSensorRepeat("", NULL_KEY, AGENT, detect_range, PI, loop_time);
} else {
llOwnerSay("Deactived.");
llSensorRemove();
}
}
default {
state_entry() {
owner = llGetOwner();
parcel = "\""+llList2String(llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_NAME]),0)+"\""; // +" in "+llGetRegionName();
activate(TRUE);
llOwnerSay("Touch to stop or start.");
getparcelbounds();
}
touch_start(integer n) {
if (llDetectedKey(0) == owner)
activate(!active);
}
on_rez(integer p) {
llResetScript();
}
changed(integer c) {
if (c & CHANGED_OWNER) llResetScript();
}
sensor(integer n) {
integer i; integer j;
integer tu = llGetUnixTime();
string ts = llGetTimestamp();
string dname;
list temp;
list temp_short = visitors_short;
list temp_long = visitors_long;
visitors_short = [];
visitors_long = [];
for (i=0; i<n; ++i) {
if (llOverMyLand(llDetectedKey(i))) {
//vector dpos = llDetectedPos(i);
//if ((dpos.x >= parcel0.x) && (dpos.x < parcel1.x) && (dpos.y >= parcel0.y) && (dpos.y < parcel1.y)) {
dname = llDetectedName(i);
j = llListFindList(temp_long, [dname]);
if (j != -1) {
visitors_long += llList2List(temp_long, j, j+2);
temp_long = llDeleteSubList(temp_long, j, j+2);
} else {
j = llListFindList(temp_short, [dname]);
if (j != -1) {
temp = llList2List(temp_short, j, j+2);
if ((tu-llList2Integer(temp, 1)) >= ignore_time) {
visitors_long += temp;
console(">> "+llList2String(temp, 0)+" entered "+format_timestamp(llList2String(temp, 2)));
} else {
visitors_short += temp;
}
} else {
visitors_short += [dname, tu, ts];
}
}
}
}
visitors_left(temp_long);
}
no_sensor() {
visitors_left(visitors_long);
visitors_short = [];
visitors_long = [];
}
}
1-Prim Digiclock
// 1-Prim Digiclock
// (c) Ezian Ecksol, open source, keep credits
//
// put to object description the GMT offset in hours, e.g 2.5
// touch to turn on/off
list faces = [3,2.05,.6, 7,.795,0., 4,-11.5,-0.73, 6,.795,0., 1,2.05,-0.6];
key tx = "2b43c7d6-c96a-b5d9-7210-8bc15451252f";
float tx_step = 0.0625;
float tx_step_2;
float tx_base;
integer presence0;
float gmt_offset;
float clock_cycle;
float clock_time;
integer clock_mode = TRUE;
list construct_face(integer f, integer z) {
integer i = f*3;
return [PRIM_TEXTURE, llList2Integer(faces,i), tx,
<llList2Float(faces,i+1), tx_step, 0.0>, <llList2Float(faces,i+2), tx_base-(float)z*tx_step, 0.0>, 0.0];
}
setprim(integer z1, integer z2, integer z3, integer z4, integer z5) {
llSetPrimitiveParams(
construct_face(0,z1)+construct_face(1,z2)+
construct_face(2,z3)+construct_face(3,z4)+
construct_face(4,z5));
}
clock() {
clock_time = llGetGMTclock() + gmt_offset*3600.0;
integer s = (integer) clock_time;
integer h = (s / 3600) % 24;
integer m = s % 3600;
m = m / 60;
setprim(h/10,h%10,10,m/10,m%10);
llResetTime();
integer w1 = (integer) (clock_time / clock_cycle);
float w2 = clock_time - (float)w1 * clock_cycle;
llSetTimerEvent(clock_cycle-w2);
}
default
{
state_entry() {
integer f;
integer i;
list j;
gmt_offset = (float)llGetObjectDesc();
tx_step_2 = tx_step / 2.;
tx_base = 0.5 - tx_step_2;
clock_cycle = 60.0;
setprim(11,11,11,11,11);
for (i=0; i<15; i+=3) {
f = llList2Integer(faces,i);
j += [PRIM_GLOW,f,.01, PRIM_COLOR, f, <0., 0., 1.>, 1.];
}
llSetPrimitiveParams([
PRIM_TYPE, PRIM_TYPE_PRISM, 1, <0.2, 0.8, 0.0>, 0.7, <0.0, 0.0, 0.0>, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>,
PRIM_SIZE, <0.01, 1.777, 0.577>, PRIM_FULLBRIGHT, ALL_SIDES, TRUE, PRIM_COLOR, ALL_SIDES, <0., 0., 1.>, 0.] + j);
clock();
}
on_rez(integer p) {
llResetScript();
}
touch_start(integer total_number) {
if (llGetOwner() == llDetectedKey(0)) {
clock_mode = !clock_mode;
if (clock_mode) {
clock();
} else {
llSetTimerEvent(0.);
setprim(15,15,15,15,15);
}
}
}
timer() {
clock();
}
}
--Ezian Ecksol 17:21, 23 September 2008 (PDT)
Cam Lock/Follow
// Camstyle, (c) Ezian Ecksol, feel free to copy, steal, modify
// Put script into prim, attach it.
// usage: position your camera where you like.
// enter in chan:
// /1 camstyle follow <-- camera is fixed, but follows your av
// /1 camstyle lock <-- camera is completly locked
// /1 camstyle <-- releases cam again
integer chan = 1;
key owner;
list keywords = ["lock", "follow"];
cam_style(integer cs) {
llRequestPermissions(owner, PERMISSION_CONTROL_CAMERA | PERMISSION_TRACK_CAMERA);
llClearCameraParams();
if (!cs)
return;
vector cpos = llGetCameraPos();
list params = [CAMERA_ACTIVE, TRUE, CAMERA_POSITION_LOCKED, TRUE, CAMERA_POSITION_THRESHOLD, 0.5,
CAMERA_FOCUS_THRESHOLD, 0.5, CAMERA_POSITION, cpos];
if (cs == 1)
params += [
CAMERA_DISTANCE, .5, // ( 0.5 to 10) meters
CAMERA_BEHINDNESS_LAG, 0.1, // (0 to 3) seconds
CAMERA_PITCH, 10.0, // (-45 to 80) degrees
CAMERA_FOCUS, cpos + llRot2Fwd(llGetCameraRot()), // region-relative position
CAMERA_FOCUS_LAG, 0.1, // (0 to 3) seconds
CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)
CAMERA_POSITION_LAG, 1.0 // (0 to 3) seconds
];
else if (cs == 2)
params += [
CAMERA_FOCUS_LAG, 0.0, // (0 to 3) seconds
CAMERA_BEHINDNESS_LAG, 0.5 // (0 to 3) seconds
];
llSetCameraParams(params);
}
default
{
state_entry() {
owner = llGetOwner();
llListen(chan, "", owner, "");
}
listen(integer channel, string name, key id, string msg) {
msg = llToLower(msg);
list m = llParseString2List(msg, [" "], []);
if (llList2String(m, 0) == "camstyle")
cam_style(llListFindList(keywords, [llList2String(m, 1)]) + 1);
}
changed(integer c) {
if (c & CHANGED_OWNER)
llResetScript();
}
}
--Ezian Ecksol 17:21, 23 September 2008 (PDT)