User:Ezian Ecksol

From Second Life Wiki
Jump to navigation Jump to search

Some Scripts

Rangefinder <lsl> // 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();   
   }

} </lsl> --Ezian Ecksol 11:34, 24 September 2008 (PDT)


CamJumper <lsl> // 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);
  }

} </lsl> --Ezian Ecksol 17:21, 23 September 2008 (PDT)



Visitor-Detector

<lsl> // 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 = [];   
   }

} </lsl>



1-Prim Digiclock

<lsl>// 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();            
   }

}</lsl> --Ezian Ecksol 17:21, 23 September 2008 (PDT)



Cam Lock/Follow <lsl> // 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();
   }

} </lsl> --Ezian Ecksol 17:21, 23 September 2008 (PDT)