Welcome to the Second Life Forums Archive

These forums are CLOSED. Please visit the new forums HERE

Script to follow an object?

Ginge Reymont
Registered User
Join date: 10 Oct 2005
Posts: 190
10-10-2005 13:55
I have tried numorous methods but all failed..

Any ideas?
Zapoteth Zaius
Is back
Join date: 14 Feb 2004
Posts: 5,634
10-10-2005 14:37
CODE
////////////////////////////////////////////
// Follow Me Script
//
// Written by Xylor Baysklef
////////////////////////////////////////////

/////////////// CONSTANTS ///////////////////
string FWD_DIRECTION = "+x";

vector POSITION_OFFSET = <-1, 1, 1>; // Local coords
float SCAN_REFRESH = 1.0;

string FOLLOW = "come";
string STAY = "stay";

integer FOLLOW_STOP = 5000;
integer FOLLOW_START = 5001;
///////////// END CONSTANTS /////////////////

///////////// GLOBAL VARIABLES ///////////////
key gOwner;
integer gOverride = FALSE;
rotation gFwdRot;
float gTau;
float gMass;
/////////// END GLOBAL VARIABLES /////////////

StartScanning() {
llSensorRepeat("", gOwner, AGENT, 96.0, PI, SCAN_REFRESH);
}

StopScanning() {
llSensorRemove();
}

// Move to a position far away from the current one.
MoveTo(vector target) {
vector Pos = llGetPos();

while (llVecDist(llGetPos(), target) > 0.01) {
llSetPos(target);
}
}

rotation GetFwdRot() {
// Special case... 180 degrees gives a math error
if (FWD_DIRECTION == "-x") {
return llAxisAngle2Rot(<0, 0, 1>, PI);
}

string Direction = llGetSubString(FWD_DIRECTION, 0, 0);
string Axis = llToLower(llGetSubString(FWD_DIRECTION, 1, 1));

vector Fwd;
if (Axis == "x")
Fwd = <1, 0, 0>;
else if (Axis == "y")
Fwd = <0, 1, 0>;
else
Fwd = <0, 0, 1>;

if (Direction == "-")
Fwd *= -1;

return llRotBetween(Fwd, <1, 0, 0>);
}

rotation GetRotation(rotation rot) {
vector Fwd;
Fwd = llRot2Fwd(rot);

float Angle = llAtan2( Fwd.y, Fwd.x );
return gFwdRot * llAxisAngle2Rot(<0, 0, 1>, Angle);
}

default {
state_entry() {
gOwner = llGetOwner();
gFwdRot = GetFwdRot();
gMass = llGetMass();
gTau = 0.2;

llListen(0, "", gOwner, FOLLOW);
llListen(0, "", gOwner, STAY);
llMoveToTarget(llGetPos(), gTau);
llSetStatus(STATUS_PHYSICS, TRUE);
StartScanning();
}

on_rez(integer param) {
if (llGetOwner() != gOwner)
llResetScript();
}

sensor(integer num_detected) {
if (gOverride)
return;

vector Pos = llDetectedPos(0);
rotation Rot = llDetectedRot(0);
vector Offset = POSITION_OFFSET * Rot;
Pos += Offset;
StopScanning();
rotation TargetRot = GetRotation(Rot);
llRotLookAt(TargetRot, gTau * 5.0, gTau);
//MoveTo(Pos);
llMoveToTarget(Pos, gTau);
StartScanning();
}

listen(integer channel, string name, key id, string mesg) {
if (mesg == FOLLOW) {
StartScanning();
llWhisper(0, "Follow Mode Activated.");
return;
}
if (mesg == STAY) {
StopScanning();
llWhisper(0, "Follow Mode Deactivated.");
}
}

link_message(integer sender, integer channel, string data, key id) {
if (channel == FOLLOW_STOP) {
gOverride = TRUE;
llSetStatus(STATUS_PHYSICS, FALSE);
return;
}
if (channel == FOLLOW_START) {
gOverride = FALSE;
llMoveToTarget(llGetPos(), gTau);
llSetStatus(STATUS_PHYSICS, TRUE);
return;
}
}
}


Something I have in my inventory.. Play with it to get it to do what you want :D
_____________________
I have the right to remain silent. Anything I say will be misquoted and used against me.
---------------
Zapoteth Designs, Temotu (100,50)
---------------