Smooth motion, cool script from osgrid

Creating scripts
Sarge Alternate
Posts: 1
Joined: Thu Sep 12, 2013 7:51 pm
Has thanked: 0
Been thanked: 0

Re: Smooth motion, cool script from osgrid

Post by Sarge Alternate »

Just tested using my offline instance. Set up the droid, got it running, shut it down, restarted it.

Droid is at the start position, but unresponsive to touch. My thought is that it should restart on its own, without any need for me to restart it. After all, random visitors aren't going to know what to do :D In an ideal situation, the droid would restart and continue from its last position once the world has restarted. :) If that could be done, continuing from last position, then it wouldn't matter how many there are
User avatar
Sherrie Melody
Posts: 273
Joined: Fri Mar 29, 2013 6:56 pm
Has thanked: 201 times
Been thanked: 159 times

Re: Smooth motion, cool script from osgrid

Post by Sherrie Melody »

Sarge Alternate wrote:Just tested using my offline instance. Set up the droid, got it running, shut it down, restarted it.

Droid is at the start position, but unresponsive to touch. My thought is that it should restart on its own, without any need for me to restart it. After all, random visitors aren't going to know what to do :D In an ideal situation, the droid would restart and continue from its last position once the world has restarted. :) If that could be done, continuing from last position, then it wouldn't matter how many there are
When you said "Droid is at the start position, but unresponsive to touch." do you mean it went to the start position and just stopped? I tested the version I posted last, and after region restart it went to the start position and began moving along its path right away, no interference required.

One thing I have found in testing scripts in OpenSim, is that when I make changes to an existing script, it will often exhibit the behavior of the original script. What I do now is copy the modded script contents, delete the old script entirely from the object, create new script, paste my modded script content. This practice has greatly reduced headaches for me. Not sure if that was the issue for you, but just in case.

I'm testing a new version now that picks up from last position. If it works, I'll post here.
User avatar
Sherrie Melody
Posts: 273
Joined: Fri Mar 29, 2013 6:56 pm
Has thanked: 201 times
Been thanked: 159 times

Re: Smooth motion, cool script from osgrid

Post by Sherrie Melody »

Okay. I tested the following script over 3 region restarts and it works. As before, when you very first rez the objects, you'll need to touch to start that first time, after that, the object just continues on automatically after region restart.

Code: Select all


    // Tour script by Rebekka Revnik
    // it's free for everyone, no restrictions
    // you may delete my name and claim it as your own script
    // but if you give credit it would be nice :-)

    // the first part is not mine, thanks and credits goes to Kayaker :-)

    // Single Framed (SF) motion without llKeyframedMotion
    // original script : Kayaker Magic
    // from: http://forums.osgrid.org/viewtopic.php?f=5&t=4577
    // minor changes by me
    osWarpPos (key id, vector destpos ) {
         vector primPos = llList2Vector(osGetPrimitiveParams(id, [PRIM_POSITION]), 0);
         integer jumps = (integer)(llVecDist(destpos, primPos) / 0.3) + 1;
         // Try and avoid stack/heap collisions
         if (jumps > 411)
             jumps = 411;
         list rules = [ PRIM_POSITION, destpos ];  //The start for the rules list
         integer count = 1;
         while ( ( count = count << 1 ) < jumps)
             rules = [] + rules + rules;   //should tighten memory use.
         osSetPrimitiveParams(id, rules + llList2List( rules, (count - jumps) << 1, count) );
         vector primPos2 = llList2Vector(osGetPrimitiveParams(id, [PRIM_POSITION]), 0);
         if ( llVecDist( primPos2, destpos ) > .001 ) //Failsafe
             while ( --jumps ) 
                osSetPrimitiveParams(id, [PRIM_POSITION, destpos]);
    }


    vector      SF_spos;        //start position
    rotation    SF_srot;        //starting rotation
    float       SF_stime;       //starting time
    vector      SF_epos;        //ending position
    rotation    SF_erot;        //ending rotation
    float       SF_seconds;     //time to move that distance
    integer     SF_target=-1;      //handle of last target position
    integer     continuous=0;    //loop back through path

    SFrame()
    {
       SF_spos=llGetPos();
       SF_srot=llGetRot();
       SF_stime=llGetTime();
       SF_epos = llList2Vector(Points, Count);
       SF_erot = llList2Rot(Rots, Count);
       SF_seconds=llVecDist(SF_epos, llGetPos()) / TIME;
       rotation t=<SF_srot.x-SF_erot.x,SF_srot.y-SF_erot.y,SF_srot.z-SF_erot.z,SF_srot.s-SF_erot.s>;
       if ((t.x*t.x + t.y*t.y + t.z*t.z + t.s*t.x)>0.5) SF_erot = <-SF_erot.x,-SF_erot.y,-SF_erot.z,-SF_erot.s>;
       llTargetRemove(SF_target);
       SF_target=llTarget(SF_epos, 0.1);
    }

    integer SFnotat()
    {
       if (SF_target== -1) return TRUE;
       float time=llGetTime();
       time = (time-SF_stime)/SF_seconds;
       if (time>1.0)
       {
          llTargetRemove(SF_target);
          SF_target=-1;
          llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,SF_epos,PRIM_ROTATION,SF_erot]);
          return TRUE;
       }
       float emit= 1.0-time;
       vector pos=SF_epos*time+SF_spos*emit;
       rotation rot = <
          SF_erot.x*time+SF_srot.x*emit,
          SF_erot.y*time+SF_srot.y*emit,
          SF_erot.z*time+SF_srot.z*emit,
          SF_erot.s*time+SF_srot.s*emit
             >;
       emit = llSqrt(rot.x*rot.x+rot.y*rot.y+rot.z*rot.z+rot.s*rot.s);
       rot = <rot.x/emit,rot.y/emit,rot.z/emit,rot.s/emit>;
       //vector v = llRot2Euler(rot);
       vector v = <0.0, 0.0, 1.0> * rot;
       //v.x = 0;
       //v.y = 0;
       //rot = llEuler2Rot(v);
       //llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,pos,PRIM_ROTATION,llEuler2Rot(v)]);
       llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,pos,PRIM_ROTATION,rot]);
       return FALSE;
    }

    // ab hier hab ich das geschrieben :-)

    // Mach dir eine Notecard mit den folgenden Einträgen
    // Gross/Kleinschreibung ist nicht wichtig, also DRIVE ist genauso gut wie drive oder Drive

    // DRIVE = Position = Rotation      die Wegpunkte eben, mit Position und Rotation

    // nach dem Wegpunkt (muss aber nicht sein)

    // PAUSE = Sekunden               hält das Objekt ne Weile an
    // TEXT = text                  sagt den Text im Chat

    // now that's my part :-)

    // Make a notecard with the folling entries
    // it's not case sensitive, for example drive is accepted as DRIVE or Drive

    // DRIVE = Position = Rotation      the waypoints with given params

    // after the waypoint (optionally but but not required)

    // PAUSE = seconds               makes the object to stay for a while
    // TEXT = text                  says the text in chat

    // wie es oben steht, die Schlüsselwörter
    // as above, the keywords
    string DRIVE = "drive";
    string PAUSE = "pause";
    string TEXT = "text";
    // Name der Notecard
    // name of the notecard
    string NCNAME = "config";
    // Trennzeichen für die Schlüsselwörter
    // separator for keywords
    string SEPARATOR = "=";
    // wie schnell sich das Objekt bewegt
    // 1 ist ungefähr 1 Meter pro Sekunde
    // Grösser = schneller, aber auch mehr ruckeln
    // how fast your object will move
    // 1 means appr. 1 m per second
    // a greater number ist faster but less smoothly
    float TIME = 1.0;
    // Stell es auf TRUE, dann kommen Infos im Chat über die Wegpunkte
    // set it to TRUE to get informations about the waypoints in chat
    integer DEBUG = FALSE;
    // Wähle die Sprache, ich kann nur die beiden unten sprechen
    // 0 = deutsch, 1 = englisch
    // choose language, I speak only the two below
    // 0 for german, 1 for english
    integer LANGUAGE = 0;

    list Points;
    list Rots;
    list Pause;
    list Text;
    integer NCLine;
    key NCid;
    integer Count;

    // liest ein Zeile aus der Notecard und speichert sie
    // reads a notecard line and saves it
    Read(string data)
    {
       list l = llParseString2List(data, [SEPARATOR], []);
       string s1 = llToLower(llStringTrim(llList2String(l, 0), STRING_TRIM));
       vector v1 = (vector)llToLower(llStringTrim(llList2String(l, 1), STRING_TRIM));
       rotation r1 = (rotation)llToLower(llStringTrim(llList2String(l, 2), STRING_TRIM));
       integer x;
       if(s1 == DRIVE)
       {
          if(v1 != ZERO_VECTOR)
          {
             Points += [v1];
             Rots += [r1];
             Pause += [0];
             Text += [""];
          }
       } else if(s1 == PAUSE)
       {
          x = llGetListLength(Pause) - 1;
          Pause = llListReplaceList(Pause, [(float)llToLower(llStringTrim(llList2String(l, 1), STRING_TRIM))], x, x);

       } else if(s1 == TEXT)
       {
          x = llSubStringIndex(data, SEPARATOR);
          data = llDeleteSubString(data, 0, x);
          x = llGetListLength(Text) - 1;
          Text = llListReplaceList(Text, [llStringTrim(data, STRING_TRIM)], x, x);
       }
    }

    // Sagt was in der Notecard steht (TEXT = text), ohne den Objektnamen
    // es muss aber ein Leerzeichen drin sein und mindestens zwei Wörter haben
    // sonst kommt nur der normale Chat mit dem Objektnamen
    // says what you wrote in the notecard (TEXT = text) without the object name
    // it has to be a space in it and at least two words
    // otherwise you'll get only the normal chat with the object name
    Say(string s)
    {
       string s1 = llGetObjectName();
       integer x = llSubStringIndex(s, " ");
       if(x != -1)
       {
          string s2 = llGetSubString(s, 0, x - 1);
          s = llDeleteSubString(s, 0, x -1);
          s = "/me" + s;
          llSetObjectName(s2);
       }
       llSay(0, s);
       llSetObjectName(s1);
    }

    default
    {
       on_rez (integer start_param) {
            llResetScript();
        }

       state_entry()
       {
          llSetText("", <1,1,1>, 1.0);
          Points = [];
          Rots = [];
          Pause = [];
          Text = [];
          if(llGetInventoryType(NCNAME) == INVENTORY_NONE)
          {
             if(LANGUAGE == 0) llOwnerSay("Keine config-NC gefunden.");
             else if(LANGUAGE == 1) llOwnerSay("No config nc found.");

          } else
          {
             if(LANGUAGE == 0) llOwnerSay("Lese config, bitte warten...");
             else if(LANGUAGE == 1) llOwnerSay("Reading config nc, please wait...");
             NCLine = 0;
             NCid = llGetNotecardLine(NCNAME, NCLine++);
          }
       }
       dataserver(key requested, string data)
       {
          if(requested == NCid)
          {
             if(data != EOF)
             {
                Read(data);
                NCid = llGetNotecardLine(NCNAME, NCLine++);
             } else
             {
                if(LANGUAGE == 0) llOwnerSay("Fertig.");
                else if(LANGUAGE == 1) llOwnerSay("Ready.");
                if(llGetListLength(Points) == 0)
                {
                   if(LANGUAGE == 0) llOwnerSay("Keine Wegpunkte gefunden.");
                   else if(LANGUAGE == 1) llOwnerSay("No waypoints found.");
                }
                else
                {
                   if(LANGUAGE == 0) llOwnerSay((string)llGetListLength(Points) + " Wegpunkte gelesen.");
                   else if(LANGUAGE == 1) llOwnerSay((string)llGetListLength(Points) + " waypoints read.");
                   state running;
                }
             }
          }
       }
    }

    state running
    {
       state_entry()
        {
            if(continuous == 1) {
            state drive;
                
            }
       }
       touch_start(integer total_number)
        {
            continuous = 1;
            list homeList = llParseString2List(osGetNotecardLine("config", 0), "=", "");
            vector homePos = llList2Vector(homeList,1);
            osWarpPos(llGetKey(), homePos);
            llSleep(2.0);

            state drive;
       }
    }
    state drive
    {
       state_entry()
       {
          llSetText("", <1,1,1>, 1.0);
          Count = 0;
          SFrame();
        }
        changed (integer change) {
            if (change & CHANGED_REGION_START) { 
                SFrame();
            }
    
        }

       not_at_target()
       {
          if(SFnotat())
          {
             if(DEBUG)
             {
                if(LANGUAGE == 0) llOwnerSay("Wegpunkt Nr. " + (string)(Count + 1) + " bei " + (string)llList2Vector(Points, Count));
                else if(LANGUAGE == 1) llOwnerSay("waypoint no. " + (string)(Count + 1) + " at " + (string)llList2Vector(Points, Count));
             }
             if(llList2String(Text, Count) != "") Say(llList2String(Text, Count));
             if(llList2Float(Pause, Count) > 0) llSleep(llList2Float(Pause, Count));
             Count++;
             if(Count == llGetListLength(Points)) state running;
             SFrame();
          }
       }
    }



If you are still getting old behavior from the script when you try it, try the trick I mentioned earlier. Delete original script, open new script, and paste new script contents in new script file.
User avatar
Sarge Misfit
Posts: 254
Joined: Thu Mar 14, 2013 4:10 pm
Has thanked: 5 times
Been thanked: 223 times

Re: Smooth motion, cool script from osgrid

Post by Sarge Misfit »

For some reason, I wasn't notified that you'd posted again.

I do pretty much the same thing. I create a whole new script and paste the new code in. Then rez a new object to place the new script in. One complication may e the fact that I am running it on my offline instance. I wonder if Kitely has made some changes to the OpenSim they're running. I'll test your latest and will let you know
Living life on the wrong side of a one-track mind.

National Security Threat Level: Gnat

My site: Excelsior Station
My Kitely World: Misfit's Folly
User avatar
Sarge Misfit
Posts: 254
Joined: Thu Mar 14, 2013 4:10 pm
Has thanked: 5 times
Been thanked: 223 times

Re: Smooth motion, cool script from osgrid

Post by Sarge Misfit »

Its working!

Just logged in and went looking for the droid, found it moving along its path just as it should be.

Thanks, Sherrie. :D
These users thanked the author Sarge Misfit for the post:
Sherrie Melody
Living life on the wrong side of a one-track mind.

National Security Threat Level: Gnat

My site: Excelsior Station
My Kitely World: Misfit's Folly
User avatar
Sherrie Melody
Posts: 273
Joined: Fri Mar 29, 2013 6:56 pm
Has thanked: 201 times
Been thanked: 159 times

Re: Smooth motion, cool script from osgrid

Post by Sherrie Melody »

Here is one more version of the script. It has the region restart code to pickup where it left off plus one more thing. In the previous versions of the script, the object gradually rotates between destinations to the specified rotation. This version causes the object to rotate only once it has arrived at the destination.

Sarge, you might like this version better for your robots.

Code: Select all

    // Tour script by Rebekka Revnik
    // it's free for everyone, no restrictions
    // you may delete my name and claim it as your own script
    // but if you give credit it would be nice :-)

    // the first part is not mine, thanks and credits goes to Kayaker :-)

    // Single Framed (SF) motion without llKeyframedMotion
    // original script : Kayaker Magic
    // from: http://forums.osgrid.org/viewtopic.php?f=5&t=4577
    // minor changes by me
    osWarpPos (key id, vector destpos ) {
         vector primPos = llList2Vector(osGetPrimitiveParams(id, [PRIM_POSITION]), 0);
         integer jumps = (integer)(llVecDist(destpos, primPos) / 0.3) + 1;
         // Try and avoid stack/heap collisions
         if (jumps > 411)
             jumps = 411;
         list rules = [ PRIM_POSITION, destpos ];  //The start for the rules list
         integer count = 1;
         while ( ( count = count << 1 ) < jumps)
             rules = [] + rules + rules;   //should tighten memory use.
         osSetPrimitiveParams(id, rules + llList2List( rules, (count - jumps) << 1, count) );
         vector primPos2 = llList2Vector(osGetPrimitiveParams(id, [PRIM_POSITION]), 0);
         if ( llVecDist( primPos2, destpos ) > .001 ) //Failsafe
             while ( --jumps ) 
                osSetPrimitiveParams(id, [PRIM_POSITION, destpos]);
    }


    vector      SF_spos;        //start position
    rotation    SF_srot;        //starting rotation
    float       SF_stime;       //starting time
    vector      SF_epos;        //ending position
    rotation    SF_erot;        //ending rotation
    float       SF_seconds;     //time to move that distance
    integer     SF_target=-1;      //handle of last target position
    integer     continuous=0;    //loop back through path

    SFrame()
    {
       SF_spos=llGetPos();
       SF_stime=llGetTime();
       SF_epos = llList2Vector(Points, Count);
       SF_seconds=llVecDist(SF_epos, llGetPos()) / TIME;
       llTargetRemove(SF_target);
       SF_target=llTarget(SF_epos, 0.1);
    }

    integer SFnotat()
    {
       if (SF_target== -1) return TRUE;
       float time=llGetTime();
       time = (time-SF_stime)/SF_seconds;
       if (time>1.0)
       {
          llTargetRemove(SF_target);
          SF_target=-1;
          llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,SF_epos]);
          return TRUE;
       }
       float emit= 1.0-time;
       vector pos=SF_epos*time+SF_spos*emit;
       
       vector v = <0.0, 0.0, 1.0>;
       llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,pos]);
       return FALSE;
    }

    // ab hier hab ich das geschrieben :-)

    // Mach dir eine Notecard mit den folgenden Einträgen
    // Gross/Kleinschreibung ist nicht wichtig, also DRIVE ist genauso gut wie drive oder Drive

    // DRIVE = Position = Rotation      die Wegpunkte eben, mit Position und Rotation

    // nach dem Wegpunkt (muss aber nicht sein)

    // PAUSE = Sekunden               hält das Objekt ne Weile an
    // TEXT = text                  sagt den Text im Chat

    // now that's my part :-)

    // Make a notecard with the folling entries
    // it's not case sensitive, for example drive is accepted as DRIVE or Drive

    // DRIVE = Position = Rotation      the waypoints with given params

    // after the waypoint (optionally but but not required)

    // PAUSE = seconds               makes the object to stay for a while
    // TEXT = text                  says the text in chat

    // wie es oben steht, die Schlüsselwörter
    // as above, the keywords
    string DRIVE = "drive";
    string PAUSE = "pause";
    string TEXT = "text";
    // Name der Notecard
    // name of the notecard
    string NCNAME = "config";
    // Trennzeichen für die Schlüsselwörter
    // separator for keywords
    string SEPARATOR = "=";
    // wie schnell sich das Objekt bewegt
    // 1 ist ungefähr 1 Meter pro Sekunde
    // Grösser = schneller, aber auch mehr ruckeln
    // how fast your object will move
    // 1 means appr. 1 m per second
    // a greater number ist faster but less smoothly
    float TIME = 1.0;
    // Stell es auf TRUE, dann kommen Infos im Chat über die Wegpunkte
    // set it to TRUE to get informations about the waypoints in chat
    integer DEBUG = FALSE;
    // Wähle die Sprache, ich kann nur die beiden unten sprechen
    // 0 = deutsch, 1 = englisch
    // choose language, I speak only the two below
    // 0 for german, 1 for english
    integer LANGUAGE = 0;

    list Points;
    list Rots;
    list Pause;
    list Text;
    integer NCLine;
    key NCid;
    integer Count;

    // liest ein Zeile aus der Notecard und speichert sie
    // reads a notecard line and saves it
    Read(string data)
    {
       list l = llParseString2List(data, [SEPARATOR], []);
       string s1 = llToLower(llStringTrim(llList2String(l, 0), STRING_TRIM));
       vector v1 = (vector)llToLower(llStringTrim(llList2String(l, 1), STRING_TRIM));
       rotation r1 = (rotation)llToLower(llStringTrim(llList2String(l, 2), STRING_TRIM));
       integer x;
       if(s1 == DRIVE)
       {
          if(v1 != ZERO_VECTOR)
          {
             Points += [v1];
             Rots += [r1];
             Pause += [0];
             Text += [""];
          }
       } else if(s1 == PAUSE)
       {
          x = llGetListLength(Pause) - 1;
          Pause = llListReplaceList(Pause, [(float)llToLower(llStringTrim(llList2String(l, 1), STRING_TRIM))], x, x);

       } else if(s1 == TEXT)
       {
          x = llSubStringIndex(data, SEPARATOR);
          data = llDeleteSubString(data, 0, x);
          x = llGetListLength(Text) - 1;
          Text = llListReplaceList(Text, [llStringTrim(data, STRING_TRIM)], x, x);
       }
    }

    // Sagt was in der Notecard steht (TEXT = text), ohne den Objektnamen
    // es muss aber ein Leerzeichen drin sein und mindestens zwei Wörter haben
    // sonst kommt nur der normale Chat mit dem Objektnamen
    // says what you wrote in the notecard (TEXT = text) without the object name
    // it has to be a space in it and at least two words
    // otherwise you'll get only the normal chat with the object name
    Say(string s)
    {
       string s1 = llGetObjectName();
       integer x = llSubStringIndex(s, " ");
       if(x != -1)
       {
          string s2 = llGetSubString(s, 0, x - 1);
          s = llDeleteSubString(s, 0, x -1);
          s = "/me" + s;
          llSetObjectName(s2);
       }
       llSay(0, s);
       llSetObjectName(s1);
    }

    default
    {
       on_rez (integer start_param) {
            llResetScript();
        }

       state_entry()
       {
          llSetText("", <1,1,1>, 1.0);
          Points = [];
          Rots = [];
          Pause = [];
          Text = [];
          if(llGetInventoryType(NCNAME) == INVENTORY_NONE)
          {
             if(LANGUAGE == 0) llOwnerSay("Keine config-NC gefunden.");
             else if(LANGUAGE == 1) llOwnerSay("No config nc found.");

          } else
          {
             if(LANGUAGE == 0) llOwnerSay("Lese config, bitte warten...");
             else if(LANGUAGE == 1) llOwnerSay("Reading config nc, please wait...");
             NCLine = 0;
             NCid = llGetNotecardLine(NCNAME, NCLine++);
          }
       }
       dataserver(key requested, string data)
       {
          if(requested == NCid)
          {
             if(data != EOF)
             {
                Read(data);
                NCid = llGetNotecardLine(NCNAME, NCLine++);
             } else
             {
                if(LANGUAGE == 0) llOwnerSay("Fertig.");
                else if(LANGUAGE == 1) llOwnerSay("Ready.");
                if(llGetListLength(Points) == 0)
                {
                   if(LANGUAGE == 0) llOwnerSay("Keine Wegpunkte gefunden.");
                   else if(LANGUAGE == 1) llOwnerSay("No waypoints found.");
                }
                else
                {
                   if(LANGUAGE == 0) llOwnerSay((string)llGetListLength(Points) + " Wegpunkte gelesen.");
                   else if(LANGUAGE == 1) llOwnerSay((string)llGetListLength(Points) + " waypoints read.");
                   state running;
                }
             }
          }
       }
    }

    state running
    {
       state_entry()
        {
            if(continuous == 1) {
            state drive;
                
            }
       }
       touch_start(integer total_number)
        {
            continuous = 1;
            list homeList = llParseString2List(osGetNotecardLine("config", 0), "=", "");
            vector homePos = llList2Vector(homeList,1);
            osWarpPos(llGetKey(), homePos);
            llSleep(2.0);

            state drive;
       }
    }
    state drive
    {
       state_entry()
       {
          llSetText("", <1,1,1>, 1.0);
          Count = 0;
          SFrame();
        }
        changed (integer change) {
            if (change & CHANGED_REGION_START) { 
                SFrame();
            }
    
        }

       not_at_target()
       {
          if(SFnotat())
          {
             if(DEBUG)
             {
                if(LANGUAGE == 0) llOwnerSay("Wegpunkt Nr. " + (string)(Count + 1) + " bei " + (string)llList2Vector(Points, Count));
                else if(LANGUAGE == 1) llOwnerSay("waypoint no. " + (string)(Count + 1) + " at " + (string)llList2Vector(Points, Count));
             }
             if(llList2String(Text, Count) != "") Say(llList2String(Text, Count));
             if(llList2Float(Pause, Count) > 0) llSleep(llList2Float(Pause, Count));
             rotation newRot = llList2Rot(Rots, Count);
             llSetRot(newRot); //Do the Rotation...

             Count++;
             if(Count == llGetListLength(Points)) state running;
             SFrame();
          }
       }
    }


User avatar
Sarge Misfit
Posts: 254
Joined: Thu Mar 14, 2013 4:10 pm
Has thanked: 5 times
Been thanked: 223 times

Re: Smooth motion, cool script from osgrid

Post by Sarge Misfit »

Thanks, Sherrie. I'll give it a go.

I had a thought about another application for this. A bus line. :) Not sure if I can add one to my world, but I bet there's other people would like to give it a try.

Oh! Maybe this can be used for a tour bus of the Kitely Welcome Centre once its fully complete (I believe there's a 2nd phase to its construction)
Living life on the wrong side of a one-track mind.

National Security Threat Level: Gnat

My site: Excelsior Station
My Kitely World: Misfit's Folly
User avatar
Sherrie Melody
Posts: 273
Joined: Fri Mar 29, 2013 6:56 pm
Has thanked: 201 times
Been thanked: 159 times

Re: Smooth motion, cool script from osgrid

Post by Sherrie Melody »

Sarge Misfit wrote:Thanks, Sherrie. I'll give it a go.

I had a thought about another application for this. A bus line. :) Not sure if I can add one to my world, but I bet there's other people would like to give it a try.

Oh! Maybe this can be used for a tour bus of the Kitely Welcome Centre once its fully complete (I believe there's a 2nd phase to its construction)
It sure could. I don't know if you noticed in the code or not, but it also supports pauses and chats. The original script was meant for touring balloons I think. I'm sure it could be used for just about any type of touring object, lol, even a submarine maybe.
User avatar
Sarge Misfit
Posts: 254
Joined: Thu Mar 14, 2013 4:10 pm
Has thanked: 5 times
Been thanked: 223 times

Re: Smooth motion, cool script from osgrid

Post by Sarge Misfit »

Yeah, I did notice. My droid is pausing at every corner and intersection and saying "Scanning..." :-D At least, offline it is. I haven't updated my Kitely world yet as I forgot to upload my sounds inventory :oops: I'll be doing that later today once I get 3 more running
Living life on the wrong side of a one-track mind.

National Security Threat Level: Gnat

My site: Excelsior Station
My Kitely World: Misfit's Folly
Post Reply