Smooth motion, cool script from osgrid
-
- Posts: 1
- Joined: Thu Sep 12, 2013 7:51 pm
- Has thanked: 0
- Been thanked: 0
Re: Smooth motion, cool script from osgrid
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 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
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 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
- 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
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.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 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
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.
- 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
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.
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.
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();
}
}
}
- 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
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
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
National Security Threat Level: Gnat
My site: Excelsior Station
My Kitely World: Misfit's Folly
- 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
Its working!
Just logged in and went looking for the droid, found it moving along its path just as it should be.
Thanks, Sherrie.
Just logged in and went looking for the droid, found it moving along its path just as it should be.
Thanks, Sherrie.
- 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
National Security Threat Level: Gnat
My site: Excelsior Station
My Kitely World: Misfit's Folly
- 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
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.
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();
}
}
}
- 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
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)
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
National Security Threat Level: Gnat
My site: Excelsior Station
My Kitely World: Misfit's Folly
- 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
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.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)
- 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
Yeah, I did notice. My droid is pausing at every corner and intersection and saying "Scanning..." At least, offline it is. I haven't updated my Kitely world yet as I forgot to upload my sounds inventory 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
National Security Threat Level: Gnat
My site: Excelsior Station
My Kitely World: Misfit's Folly