User:Zelena DeCuir
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>