Difference between revisions of "User:Toy Wylie/Meeroos/Meeroo Finder"

From Second Life Wiki
Jump to navigation Jump to search
(added script)
 
(Clarified notecard)
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
Copy this script into a normal 0.5m box, sit on it and say the name of the Meeroo you are looking for. If it is within 96.0 meters of range, the box will move right above it.
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>default
You can also add a notecard to the object with all the names of your Meeroos on it (one name per line). This enables you to just sit on the follower and click it to jump to the next Meeroo in the list. Your camera will be focused on the critter to make petting a lot easier.
 
<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()
     state_entry()
     {
     {
         llSitTarget(<0.25,0.0,0.55>,ZERO_ROTATION);
        rebuild();
         llListen(0,"",llGetOwner(),"");
        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)
     listen(integer c,string name,key k,string message)
     {
     {
         llSensor(message+" Meeroo",NULL_KEY,SCRIPTED,96.0,PI);
         sense(message);
     }
     }


     no_sensor()
     no_sensor()
     {
     {
         llOwnerSay("Not found.");
         llRegionSayTo(avatar,0,"Not found.");
     }
     }


     sensor(integer num)
     sensor(integer num)
     {
     {
         while(llVecDist(llGetPos(),llDetectedPos(0))>9.0)
         target=llDetectedKey(0);
             llSetLinkPrimitiveParamsFast(LINK_THIS,
        moveTo(llDetectedPos(0),llDetectedRot(0)*llEuler2Rot(<0.0,0.0,-90.0>*DEG_TO_RAD));
             [
        follow(llDetectedKey(0));
                 PRIM_POSITION,llDetectedPos(0)+<0.0,0.0,1.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,
         llSetLinkPrimitiveParamsFast(LINK_THIS,
         [
         [
             PRIM_POSITION,llDetectedPos(0)+<0.0,0.0,1.0>
             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>
</lsl>

Latest revision as of 07:36, 12 September 2011

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

You can also add a notecard to the object with all the names of your Meeroos on it (one name per line). This enables you to just sit on the follower and click it to jump to the next Meeroo in the list. Your camera will be focused on the critter to make petting a lot easier.

<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>