User:Toy Wylie/Meeroos/Meeroo Finder

From Second Life Wiki
< User:Toy Wylie
Revision as of 07:33, 12 September 2011 by Toy Wylie (talk | contribs) (updated to latest version)
Jump to navigation Jump to search

Copy this script into a normal 0.5m box, sit on it and say the name of the Meeroo you are looking for on channel 6. If it is within 96.0 meters of range, the finder will move towards it and follow it around. Make sure to type the exact meeroo name, capital letters matter. So if your Roo was named "Kiki Meeroo", type: /6Kiki

<lsl>key target=NULL_KEY; key avatar=NULL_KEY;

vector home; rotation homeRot;

integer names; key nameRequest=NULL_KEY;

follow(key k) {

   if(k==NULL_KEY)
       llSetTimerEvent(0.0);
   else
       llSetTimerEvent(0.5);
   target=k;

}

moveTo(vector pos,rotation rot) {

   while(llVecDist(llGetPos(),pos)>9.0)
       llSetLinkPrimitiveParamsFast(LINK_THIS,
       [
           PRIM_POSITION,pos
       ]);
   llSetLinkPrimitiveParamsFast(LINK_THIS,
   [
       PRIM_POSITION,pos,
       PRIM_ROTATION,rot
   ]);

}

rebuild() {

   llSetPrimitiveParams(
   [
       PRIM_TYPE,PRIM_TYPE_CYLINDER,
           PRIM_HOLE_DEFAULT,
           <0.0,1.0,0.0>,
           0.5,
           <0.0,0.0,0.0>,
           <1.0,1.0,0.0>,
           <0.0,0.0,0.0>,
       PRIM_SIZE,<1.0,1.0,0.0375>,
       PRIM_TEXTURE,
           ALL_SIDES,
           TEXTURE_BLANK,
           <1.0,1.0,0.0>,
           <0.0,0.0,0.0>,
           0.0,
       PRIM_COLOR,
           ALL_SIDES,
           <0.0,0.5,1.0>,
           0.6,
       PRIM_GLOW,
           ALL_SIDES,
           0.3
   ]);
   llWhisper(0,"Sit on me and say your Meeroo's name on channel 6. Example for Kiki Meeroo, say: /6Kiki\nBe sure to keep the correct capitalization. Or click on me to move to the next Meeroo on the embedded notecard.");

}

nextName() {

   string name=llGetInventoryName(INVENTORY_NOTECARD,0);
   if(name=="")
   {
       llRegionSayTo(avatar,0,"Please add a notecard with your meeroos' names on it to the object to use the automation.");
       return;
   }
   nameRequest=llGetNotecardLine(name,names);
   names++;    

}

sense(string name) {

   llSensor(name+" Meeroo",NULL_KEY,SCRIPTED,96.0,PI);

}

default {

   on_rez(integer dummy)
   {
       llResetScript();
   }
   state_entry()
   {
       rebuild();
       target=NULL_KEY;
       llSitTarget(<-0.5,0.0,0.80>,ZERO_ROTATION);
       llSetClickAction(CLICK_ACTION_SIT);
       llSetCameraAtOffset(<0.0,0.0,0.0>);
       llSetCameraEyeOffset(<1.0,0.0,0.5>);
       avatar=NULL_KEY;
       names=0;
       nameRequest=NULL_KEY;
   }
   listen(integer c,string name,key k,string message)
   {
       sense(message);
   }
   no_sensor()
   {
       llRegionSayTo(avatar,0,"Not found.");
   }
   sensor(integer num)
   {
       target=llDetectedKey(0);
       moveTo(llDetectedPos(0),llDetectedRot(0)*llEuler2Rot(<0.0,0.0,-90.0>*DEG_TO_RAD));
       follow(llDetectedKey(0));
   }
   changed(integer change)
   {
       if(change & CHANGED_LINK)
       {
           key sitter=llAvatarOnSitTarget();
           if(sitter!=NULL_KEY && avatar==NULL_KEY)
           {
               avatar=sitter;
               home=llGetPos();
               homeRot=llGetRot();
               llListen(6,"",avatar,"");
               llRequestPermissions(avatar,PERMISSION_TRIGGER_ANIMATION);
           }
           else if(sitter==NULL_KEY && avatar!=NULL_KEY)
           {
               avatar=NULL_KEY;
               moveTo(home,homeRot);
               llSleep(1.0);
               llResetScript();
           }
       }
   }
   run_time_permissions(integer perms)
   {
       if(perms & PERMISSION_TRIGGER_ANIMATION)
       {
           llStopAnimation("sit");
       }
   }
   timer()
   {
       list details=llGetObjectDetails(target,[OBJECT_POS,OBJECT_ROT]);
       vector pos=llList2Vector(details,0);
       rotation rot=llList2Rot(details,1);
       llSetLinkPrimitiveParamsFast(LINK_THIS,
       [
           PRIM_POSITION,pos,
           PRIM_ROTATION,rot*llEuler2Rot(<0.0,0.0,-90.0>*DEG_TO_RAD)
       ]);
   }
   touch_start(integer num)
   {
       if(avatar==NULL_KEY)
           return;
       if(llDetectedKey(0)!=avatar)
           return;
       nextName();
   }
   dataserver(key k,string data)
   {
       if(k!=nameRequest)
           return;
       if(data==EOF)
       {
           llRegionSayTo(avatar,0,"End of list reached.");
           names=0;
           return;
       }
       nameRequest=NULL_KEY;
       data=llStringTrim(data,STRING_TRIM);
       if(data!="")
       {
           sense(data);
           llRegionSayTo(avatar,0,"Looking for "+data+" ...");
       }
       else
           nextName();
   }

} </lsl>