User:Trinity Coulter/Handy Follow Seat
Jump to navigation
Jump to search
I just used a default cube prim for this. Its simple but effective, hope it works well for you, feel free to mod and post your improvements if you like :)
Thx, Trin
<lsl> integer finding_target = FALSE; integer follow_range = 1; string targetname; key targetkey; string help_text = "Say \'follow Avie Name\' to follow, \'stop follow\' to stop, and range 1 (or other number) to set the follow range.";
default {
state_entry()
{
llApplyImpulse(-llGetMass()*llGetVel(),FALSE);
llSay(0,help_text);
llSitTarget(<.3,0,.5>, ZERO_ROTATION);
llSetStatus(STATUS_ROTATE_X,FALSE);
llSetStatus(STATUS_ROTATE_Y,FALSE);
llSetStatus(STATUS_ROTATE_Z,TRUE);
llListen(0,"",llGetOwner(),"");
}
on_rez(integer start_param)
{
llResetScript();
}
listen(integer channel, string name, key id, string message)
{
string command = "follow";
if (llGetSubString(message,0,llStringLength(command)-1) == command)
{
//do a sensor
finding_target = TRUE;
targetname = llStringTrim(llGetSubString(message,llStringLength(command),-1),STRING_TRIM);
llSay(0,"Finding " + targetname);
llSensor(targetname,NULL_KEY,AGENT,65,PI);
}
command = "stop follow";
if (llGetSubString(message,0,llStringLength(command)-1) == command)
{
//stop sensing
finding_target = FALSE;
llSensorRemove();
llStopLookAt();
llSay(0,"No Longer Following");
llSetStatus(STATUS_PHYSICS, FALSE);
}
command = "range";
if (llGetSubString(message,0,llStringLength(command)-1) == command)
{
//set range
integer temp_follow_range = (integer)llStringTrim(llGetSubString(message,llStringLength(command),-1),STRING_TRIM);
if (temp_follow_range == 0)
{
llSay(0,"Invalid range, range remains at " + (string)follow_range);
}
else
{
follow_range = temp_follow_range;
llSay(0,"Range reset to " + (string)follow_range + " meters");
}
}
}
sensor(integer num_detected)
{
if(finding_target == TRUE)
{
integer x;
for (x = 0; x < num_detected; x++)
{
if (llToLower(llDetectedName(x)) == llToLower(targetname))
{
targetkey = llDetectedKey(x);
llSay(0, "Found " + targetname + ", following at range of " + (string)follow_range + "meters.");
llSetStatus(STATUS_PHYSICS, TRUE);
finding_target = FALSE;
float mass = llGetMass(); // mass of this object
float gravity = 9.8; // gravity constant
llSetForce(mass * <0,0,gravity>, FALSE); // in global orientation
llSensorRepeat("",targetkey, AGENT,65,PI,1.0);
}
}
}
else
{
vector targetpos = llDetectedPos(0);
targetpos.z = targetpos.z + 1;
llLookAt(targetpos, 1.0, 5.0);
if(llVecDist(targetpos,llGetPos()) > follow_range)
{
llTarget(targetpos, follow_range);
llMoveToTarget(targetpos,2.0);
}
}
}
no_sensor()
{
if(finding_target == TRUE)
{
llSay(0,"Target not found, please check spelling and try again.");
finding_target = FALSE;
}
}
at_target(integer tnum, vector targetpos, vector ourpos)
{
llStopMoveToTarget();
llStopLookAt();
llTargetRemove(tnum);
llApplyImpulse(-llGetMass()*llGetVel(),FALSE);
}
changed(integer change)
{
if (change & CHANGED_LINK)
{
float mass = llGetMass(); // mass of this object
float gravity = 9.8; // gravity constant
llSetForce(mass * <0,0,gravity>, FALSE); // in global orientation
llApplyImpulse(-llGetMass()*llGetVel(),FALSE);
llSetRot(llGetRot());
}
}
} </lsl>