User:Zelena DeCuir

From Second Life Wiki
Revision as of 14:50, 20 December 2012 by Omei Qunhua (talk | contribs) (Moved buggy script to user's own page)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search



Less Laggy Follower

--Zelena DeCuir 01:13, 24 June 2012 (PDT)

This following is a bit less laggy, as it does not use sensor. This is completelly separate system from previous example.
<lsl>

//FOLLOWER SCRIPT

integer count;
key followee;


position()
{
  vector pos = llList2Vector(llGetObjectDetails(followee, [OBJECT_POS]),0);
                  
                  
                 llSetPos(pos); 
                 
                  count += 1;
                  
                   if (count > 50)
                   {
                       llResetScript();
                      // llSay(0,"resetting");
                   }
   position2();
   }
   
   
   
position2()
{
  vector pos = llList2Vector(llGetObjectDetails(followee, [OBJECT_POS]),0);
                 
              
                 
                   
                  if (pos == <0,0,0> | pos.z > 1000 | pos.z < 800 )//this is to ensure some limitation how far the follower is following. In this case the roaming area is at 900m height. 

//So agents below 800 or above 1000ms are not followed. <0,0,0> means the avatar has teleported to other sim.

                 {
                           
                    // llRegionSay(-876543,(string)followee);//as you can see the same channel as tellChannel on the assigner script. This in case some object needs to know we have stopped following and deleted ourselves
                     llSleep(1);
                     llDie();
                   }
                 
                
               
                 llSetPos(pos); 
                  count += 1;
                
   position();// yes this script loops between position(); and position2(); 
   
   }
   
   

default {

 state_entry()
 {

llSetStatus(STATUS_PHYSICS,FALSE); llSetStatus(STATUS_PHANTOM,TRUE);

     llSleep(3);
     llMessageLinked(LINK_THIS,700,"who",""); //asks another script in contents who is wanted to be followed (maybe the other script has a listener, getting the to-be-followed agent from a central server or something)
    // llSay(0,"reseted");
  
 }

 link_message(integer sender_num, integer num, string message, key id)
   {
       if (num == 500)//the other script replies, giving us an agentkey to follow
       {
           // llfolloweeSay("I follow: " + (string) message);
           followee = (key)message;
          // llfolloweeSay("I will follow: " + (string) followee);
          // llSleep(1);
           if (followee != "")
           {
               llMessageLinked(LINK_THIS,600,"got it","");//we tell the other script we got the name and we are ready
            
         
          position();
              
           }
          return;
       }
   }
   on_rez(integer start_param)
   {
       llResetScript();
   }


} </lsl>
And here an example of the other script in the prim contents, that will assign followees
<lsl>


// ASSIGNER SCRIPT

string agentkey; integer deleteChannel = -4567; // the channel your whatever tells this follower to delete itself integer listenID = -97654; // the channel your visitor list send names (to be assigned to be followed) to integer tellChannel = -86443; //in case there is some object, who needs to know who we are following, this is the channel for it to listen


default {

   state_entry()
   {
       agentkey = "";
      llListen(listenID,"",NULL_KEY,"");
     
    
       llSetTimerEvent(5);
   }
link_message(integer sender_num, integer num, string msg, key id)
   {
        if (num == 700 && msg == "who") //the follower script asks us if we know who to follow
       {
             llMessageLinked(LINK_THIS,500,agentkey, "");
           
           }
           
       if (num == 600 && msg == "got it")//the follower script has told us the agent key is received
       {
                llListenRemove(listenID);//we have all the data we need, no point listening anylonger (less laggy this way)
                llSetTimerEvent(0);
               state secondary;
       }
   }//link_message end


on_rez(integer start_param) {

   llResetScript();

}


timer() {

  if (agentkey == "")
  {
      llRegionSay(-8765433,"who"); //we repeat this until we know who to follow
      return;
   }
    if (agentkey != "")
  {
   
      llMessageLinked(LINK_THIS,500,agentkey, "");//we pass our knowledge to the other script
      
       llRegionSay(tellChannel,agentkey);//in case your whatever needs to know who we are following
       
             llSleep(6);
      state secondary;
      return;
   }
   

}

listen( integer channel, string name, key id, string message )
   {
       if (channel == listenID)
       {
            llListenRemove(listenID);
             //   llSay(0,"Listen removed, I´ve heard the command");
          agentkey = message;
           llMessageLinked(LINK_THIS,500, agentkey, "");
            llRegionSay(tellChannel,agentkey);// we've got this one to follow
          llSetTimerEvent(5);
          return;
       }
       
   
   }
   

}


state secondary {

   state_entry()
   {
       llSetTimerEvent(0);
       llListen(deleteChannel,"","","");
   }
   
    listen( integer channel, string name, key id, string message )
   {
       if (channel == deleteChannel && message == agentkey)
       {
            
           llDie();
       }
       
   }
   
   
   
   link_message(integer sender_num, integer num, string msg, key id)
   {
        if (num == 700 && msg == "who")  //the follower script asks us if we know who to follow
       {
             llMessageLinked(LINK_THIS,500,agentkey, "");
            
           }
       if (num == 600 && msg == "got it")
       {
           return;
       }


} on_rez(integer start_param) {

   llResetScript();

} } </lsl>