Jump to content
testgenord1

ride on moving object using llSetLinkPrimitiveParamsFast

Recommended Posts

Hi!
I've made a vocabulary quiz game:
- The player sits on a car.
- He is asked vocabulary questions through the chat.
- With each correct answer, he / she moves forward some meters on the car.
- A wrong answer moves the car back to its initial starting position.
- He / she plays against other players or NPCs / prims.
- The player who goes through the finish line first wins.
- Afterwards, the "car" goes back to its initial starting position.

The script works (OpenSim/ OSGrid).
One problem remains:
I'm using llSetLinkPrimitiveParamsFast to change the position of the car.
The script moves the child prim.

Now, it is not possible to remain sitting on that moving child prim.
The prim keeps moving without you sitting on it.

It is possible to remain sitting on the moving root prim when the script moves the root prim instead of  the child prim.
In that case, though, the position of the root prim must be given in a fixed absolute vector at the beginning of the script,
which is less flexible than the child-prim version, which uses a position relative to the root prim.

I also tried out llSetKeyframdedMotion but using that,
I haven't been able to return to the initial starting position at the end of the game.

The ideal solution would be a child-prim which is "ride-able".

Do you maybe have an idea of how to achieve that?
Thank you very much in advance.
Here is the script:
 

// Simple Sensor Quizz I v0.1 by djphil (CC-BY-NC-SA 4.0) + Prim Computer v0.1 by djphil (CC-BY-NC-SA 4.0)

integer tick;
float move;

list questions = [
    "Was heißt auf Englisch: \n\nessen",
    "Was heißt auf Englisch: \n\ntrinken",
    "Was heißt auf Englisch: \n\ngehen \n(2 Buchstaben)",
    "Was heißt auf Englisch: \n\ngehen \n(4 Buchstaben)",
    "Was heißt auf Englisch: \n\nrennen",
    "Was heißt auf Englisch: \n\nfahren",
    "Was heißt auf Englisch: \n\nfliegen",
    "Was heißt auf Englisch: \n\nschlafen",
    "Was heißt auf Englisch: \n\ndenken",
    "Was heißt auf Englisch: \n\nmögen",
    "Was heißt auf Englisch: \n\nhaben",
    "Was heißt auf Englisch: \n\nverlieren",
    "Was heißt auf Englisch: \n\ngewinnen",
    "Was heißt auf Englisch: \n\nleben",
    "Was heißt auf Englisch: \n\nverstehen",
    "Was heißt auf Englisch: \n\nwissen"
];

list responses = [
    "eat",
    "drink",
    "go",
    "walk",
    "run",
    "drive",
    "fly",
    "sleep",
    "think",
    "like",
    "have",
    "lose",
    "win",
    "live",
    "understand",
    "know"
];

integer random;
string question()
{
    integer count = llGetListLength(questions);
    random = (integer)llFrand((float)count);
    return llList2String(questions, random);
}

integer response(string response)
{
    string csv = llList2String(responses, random);
    list buffer = llCSV2List(llToLower(csv));
    if (~llListFindList(buffer, [llToLower(response)])) return TRUE;
    return FALSE;
}

default
{
   state_entry()
    {
        llSetLinkPrimitiveParamsFast(2, [PRIM_POS_LOCAL, <0.5,0.0,0.0>]);
    }
   touch_start(integer num)
   {
      state listening;
   }
}

state listening
{
   state_entry()
   {
      llSay(0, "\n\nSchreibe die Antwort in den Chat.\n\n" + question());
      llListen(PUBLIC_CHANNEL,"", NULL_KEY, "");
      llListen(-799,"", NULL_KEY, ""); //This can be used by a reset button.
   }
      listen(integer channel, string name, key id, string message)
      {
         
         if (response(message) == TRUE)
         {
            llSay(0, "That's correct, " + name + "!");
            state moving;
         }
            
         else
         {
         llResetScript();
         }
      }
   }
   state moving
   {
      state_entry()
      {
         llSetTimerEvent(2.0);
      }
      timer()
      {
         ++tick;
         move += 2;
         llSetLinkPrimitiveParamsFast(2, [PRIM_POS_LOCAL, <move, 0.0, 0.0>]);
            if (tick > 3)
            {
               tick = 0;
               move = 0;
               llPlaySound("ed124764-705d-d497-167a-182cd9fa2e6c",1.0);
               llSleep(5.0);
               state default;               
            }
            
            state listening;
      }
   }

 

Share this post


Link to post
Share on other sites

When you sit on anything, you become a child prim of the linkset.  Therefore, you can move yourself the same way that you can move any other child prim.

state moving
   {
      state_entry()
      {
         llSetTimerEvent(2.0);
         iSelf = llGetNumberOfPrims();   // Be sure to declare iSelf as a global integer variable.
      }
      timer()
      {
         ++tick;
         move += 2;
         llSetLinkPrimitiveParamsFast(iSelf, [PRIM_POS_LOCAL, <move, 0.0, 0.0>]);
            if (tick > 3)
            {
               tick = 0;
               move = 0;
               llPlaySound("ed124764-705d-d497-167a-182cd9fa2e6c",1.0);
               llSleep(5.0);
               state default;               
            }
            
            state listening;
      }
   }

llGetNumberOfPrims() will always yield the link number of the last link that was created ... you.  If you are dealing with several seated avatars, it becomes a wee bit trickier, but the game is the same.  Keep track of each one in the order in which they are seated.

  • Like 1

Share this post


Link to post
Share on other sites

Thank you very much for your quick help! 🙂

I've only tested it in an offline version of OpenSim so far, and the online test might show different results,
but it basically works.

One little problem remained, and that is, not only the avatar, but also his / her vehicle is supposed to be moved, so the avatar seems to be "driving" the car.

I used a workaround, even though it might not be the most elegant way:
I simply repeated your line moving the avatar and this time I filled in the number for the actual child prim ("2") instead of "iSelf".
(the line before the last line in the script).

It seems to work so far, so I'll test it some more online during the week.
Should I run into more trouble, I'll come around again.
Thanks again! 🙂

state moving
   {
      state_entry()
      {
         llSetTimerEvent(2.0);
         iSelf = llGetNumberOfPrims();   // Be sure to declare iSelf as a global integer variable.
      }
      timer()
      {
         ++tick;
         move += 2;
         llSetLinkPrimitiveParamsFast(2, [PRIM_POS_LOCAL, <0.0, move, 0.0>]);
         llSetLinkPrimitiveParamsFast(iSelf, [PRIM_POS_LOCAL, <0.0, move, 0.5>]);

 

Share this post


Link to post
Share on other sites

Oh, sure.  I was just focused on moving the avatar.  If you have other prims to move as well, you can move them the same way.  In fact, you can combine things slightly to streamline your script (not that it makes much difference to performance, but it is neater...)

llSetLinkPrimitiveParamsFast(LINK_SET,[34,2,PRIM_POS_LOCAL, <0.0, move, 0.0>,34,iSelf,PRIM_POS_LOCAL, <0.0, move, 0.5>]);

where 34 is the integer equivalent of PRIM_LINK_TARGET.

  • Like 1

Share this post


Link to post
Share on other sites

Hi again!

Just tried out all improvements.

Unfortunately, there is a different problem now,  which is,  with each correct reply to the questions, the linkset-vehicle moves along the negative y-axis,
no matter how you change the coordinates by using the "move" variable.

Besides, the linkset-vehicle does not return to its initial starting position after the "ticks" number of correct reply,  but keeps moving in the same direction.
I'm posting the script including the changes below.

In case any of you can help, please let me know. 🙂
Thanks very much in advance!

// Simple Sensor Quizz I v0.1 by djphil (CC-BY-NC-SA 4.0) + Prim Computer v0.1 by djphil (CC-BY-NC-SA 4.0)
integer iSelf;
integer tick;
float move;

list questions = [
    "Was heißt auf Englisch: \n\nessen",
    "Was heißt auf Englisch: \n\ntrinken",
    "Was heißt auf Englisch: \n\ngehen \n(2 Buchstaben)",
    "Was heißt auf Englisch: \n\ngehen \n(4 Buchstaben)",
    "Was heißt auf Englisch: \n\nrennen",
    "Was heißt auf Englisch: \n\nfahren",
    "Was heißt auf Englisch: \n\nfliegen",
    "Was heißt auf Englisch: \n\nschlafen",
    "Was heißt auf Englisch: \n\ndenken",
    "Was heißt auf Englisch: \n\nmögen",
    "Was heißt auf Englisch: \n\nhaben",
    "Was heißt auf Englisch: \n\nverlieren",
    "Was heißt auf Englisch: \n\ngewinnen",
    "Was heißt auf Englisch: \n\nleben",
    "Was heißt auf Englisch: \n\nverstehen",
    "Was heißt auf Englisch: \n\nwissen"
];

list responses = [
    "eat",
    "drink",
    "go",
    "walk",
    "run",
    "drive",
    "fly",
    "sleep",
    "think",
    "like",
    "have",
    "lose",
    "win",
    "live",
    "understand",
    "know"
];

integer random;
string question()
{
    integer count = llGetListLength(questions);
    random = (integer)llFrand((float)count);
    return llList2String(questions, random);
}

integer response(string response)
{
    string csv = llList2String(responses, random);
    list buffer = llCSV2List(llToLower(csv));
    if (~llListFindList(buffer, [llToLower(response)])) return TRUE;
    return FALSE;
}

default
{
   state_entry()
    {
         llSetLinkPrimitiveParamsFast(1, [PRIM_POS_LOCAL, <0.0,0.0,0.0>]);
    }
   touch_start(integer num)
   {
      state listening;
   }
}

state listening
{
   state_entry()
   {
      llSay(0, "\n\nSchreibe die Antwort in den Chat.\n\n" + question());
      llListen(PUBLIC_CHANNEL,"", NULL_KEY, "");
      llListen(-799,"", NULL_KEY, ""); //This can be used by a reset button.
   }
      listen(integer channel, string name, key id, string message)
      {
         
         if (response(message) == TRUE)
         {
            llSay(0, "That's correct, " + name + "!");
            state moving;
         }
            
         else
         {
         llResetScript();
         }
      }
   }
   state moving
   {
      state_entry()
      {
         llSetTimerEvent(2.0);
         iSelf = llGetNumberOfPrims();   // Be sure to declare iSelf as a global integer variable.
      }
      timer()
      {
         ++tick;
         move += 2;
         llSetLinkPrimitiveParamsFast(LINK_SET,[34,1,PRIM_POS_LOCAL,<0.0,move,0.0>, 34,iSelf,PRIM_POS_LOCAL,<0.0,move,0.0>]);
         if (tick > 3)
            {
               tick = 0;
               move = 0;
               llPlaySound("ed124764-705d-d497-167a-182cd9fa2e6c",1.0);
               llSleep(2.0);
               state default;           
            }
            
            state listening;
      }
   }

 

Share this post


Link to post
Share on other sites
Posted (edited)

I eventually came up with a simpler version than the one above.
It simply uses llSetPos and llGetPos.
There is always room for improvement, so feel free to comment.
Thanks very much for your help, roligloon!
Here is the script:

// Simple Sensor Quizz I v0.1 by djphil (CC-BY-NC-SA 4.0) + Prim Computer v0.1 by djphil (CC-BY-NC-SA 4.0)

integer tick;
float move;
vector oldPosition;

list questions = [
    "Was heißt auf Englisch: \n\nessen",
    "Was heißt auf Englisch: \n\ntrinken",
    "Was heißt auf Englisch: \n\ngehen \n(2 Buchstaben)",
    "Was heißt auf Englisch: \n\ngehen \n(4 Buchstaben)",
    "Was heißt auf Englisch: \n\nrennen",
    "Was heißt auf Englisch: \n\nfahren",
    "Was heißt auf Englisch: \n\nfliegen",
    "Was heißt auf Englisch: \n\nschlafen",
    "Was heißt auf Englisch: \n\ndenken",
    "Was heißt auf Englisch: \n\nmögen",
    "Was heißt auf Englisch: \n\nhaben",
    "Was heißt auf Englisch: \n\nverlieren",
    "Was heißt auf Englisch: \n\ngewinnen",
    "Was heißt auf Englisch: \n\nleben",
    "Was heißt auf Englisch: \n\nverstehen",
    "Was heißt auf Englisch: \n\nwissen"
];

list responses = [
    "eat",
    "drink",
    "go",
    "walk",
    "run",
    "drive",
    "fly",
    "sleep",
    "think",
    "like",
    "have",
    "lose",
    "win",
    "live",
    "understand",
    "know"
];

integer random;
string question()
{
    integer count = llGetListLength(questions);
    random = (integer)llFrand((float)count);
    return llList2String(questions, random);
}

integer response(string response)
{
    string csv = llList2String(responses, random);
    list buffer = llCSV2List(llToLower(csv));
    if (~llListFindList(buffer, [llToLower(response)])) return TRUE;
    return FALSE;
}

default
{
   state_entry()
    {
        oldPosition = llGetPos();
    }
   touch_start(integer num)
   {
      state listening;
   }
}

state listening
{
   state_entry()
   {
      llSay(0, "\n\nSchreibe die Antwort in den Chat.\n\n" + question());
      llListen(PUBLIC_CHANNEL,"", NULL_KEY, "");
      llListen(-799,"", NULL_KEY, "");
   }
      listen(integer channel, string name, key id, string message)
      {
         
         if (response(message) == TRUE)
         {
            llSay(0, "\n\nThat's correct, " + name + "!");
            state moving;
          }
      
         else
         {
         tick = 0;
         move = 0;
         llPlaySound("64319812-dab1-4e89-b1ca-5fc937b8d94a",1.0);
         llSetPos(oldPosition);
         state default; 
         }
      }
   }
  state moving
   {
      state_entry()
      {
         llSetTimerEvent(2.0);
      }
      timer()
      {
         ++tick;
         move += 2;
            
            if (tick > 2)
            {
               llSetPos((oldPosition) + <move, 0.0, 0.0>);   
               llPlaySound("ed124764-705d-d497-167a-182cd9fa2e6c",1.0);
               llSay(0,"\n\nYou have won!!!");
               tick = 0;
               move = 0;
               llSetPos(oldPosition);
               state default;         
            } 
            else
            {
               llSetPos((oldPosition) + <move, 0.0, 0.0>);    
               state listening;
            }   
      }
}

 

Edited by testgenord1

Share this post


Link to post
Share on other sites
Posted (edited)

Continuation:
I've added an automatic / npc car as an opponent and correspondingly adjusted the player's car script.
The npc car just slowly drives forward in intervals through a timer / counter.
Once npc the car has reached a certain number in the counter (here: "more than 10"),
the npc car has won the race and the player has lost.
Then, the npc car sends the message "reset" to the player's car, and the player's car stops and goes back to its initial position ("oldPosition").

Should the player answer all quiz questions correctly before this happens, the player has won.
In that case, the player's car sends the message "reset" to the npc car, which now is supposed to stop moving and go back to its initial position ("oldPosition").

However, although the player's car reacts correctly on the message "reset", the npc car doesn't.
It keeps moving regardless.

Hence, I added an extra script, resetting the npc car script and setting it back to its initial position, which now works.
Still, I'm curious why the message "reset" stops the player's car, but not the npc car, although the scripts as such are very similar.
I'm posting the scripts below:

player's car:

// Simple Sensor Quizz I v0.1 by djphil (CC-BY-NC-SA 4.0) + Prim Computer v0.1 by djphil (CC-BY-NC-SA 4.0)
list lSounds = [ "6e517cde-066f-455e-8c6b-f1c33be90dea", "611c9470-507e-4471-8ce2-5ed0962e4c85", "b1e78aa1-52b7-482f-a48a-57e3ddff81fc", "7b978d05-b3bd-4e6f-892f-92dc4845ddd8", "64319812-dab1-4e89-b1ca-5fc937b8d94a", "720ff3dd-8fc6-4523-9670-139df57527f3"];
integer tick;
float move;
vector oldPosition;

list questions = [
    "Was heißt auf Englisch: \n\nessen",
    "Was heißt auf Englisch: \n\ntrinken",
    "Was heißt auf Englisch: \n\ngehen \n(2 Buchstaben)",
    "Was heißt auf Englisch: \n\ngehen \n(4 Buchstaben)",
    "Was heißt auf Englisch: \n\nrennen",
    "Was heißt auf Englisch: \n\nfahren",
    "Was heißt auf Englisch: \n\nfliegen",
    "Was heißt auf Englisch: \n\nschlafen",
    "Was heißt auf Englisch: \n\ndenken",
    "Was heißt auf Englisch: \n\nmögen",
    "Was heißt auf Englisch: \n\nhaben",
    "Was heißt auf Englisch: \n\nverlieren",
    "Was heißt auf Englisch: \n\ngewinnen",
    "Was heißt auf Englisch: \n\nleben",
    "Was heißt auf Englisch: \n\nverstehen",
    "Was heißt auf Englisch: \n\nwissen"
];

list responses = [
    "eat",
    "drink",
    "go",
    "walk",
    "run",
    "drive",
    "fly",
    "sleep",
    "think",
    "like",
    "have",
    "lose",
    "win",
    "live",
    "understand",
    "know"
];

integer random;
string question()
{
    integer count = llGetListLength(questions);
    random = (integer)llFrand((float)count);
    return llList2String(questions, random);
}

integer response(string response)
{
    string csv = llList2String(responses, random);
    list buffer = llCSV2List(llToLower(csv));
    if (~llListFindList(buffer, [llToLower(response)])) return TRUE;
    return FALSE;
}

default
{
    on_rez(integer start_param)
    {
        oldPosition = llGetPos();
    }
   touch_start(integer num)
   
    {
      llPlaySound("s_rev",1.0);
      llRegionSay(-799,"start");
      state listening;
    } 
 }
state listening
{
   state_entry()
   {
      llSetTimerEvent(8.0);
    }
    timer()
    {
      llSay(0, "\n\nSchreibe die Antwort in den Chat.\n\n" + question());
      llListen(PUBLIC_CHANNEL,"", NULL_KEY, "");
      llListen(-799,"", NULL_KEY, "");
      
   }
   
      listen(integer channel, string name, key id, string message)
      {
         
         if (response(message) == TRUE)
         {
            llSay(0, "\n\nThat's correct, " + name + "!");
            llPlaySound("s_rev",1.0);
            state moving;
          }
          
           if (message == "reset")
         {
              
               llSetPos(oldPosition);
               tick = 0;
               move = 0;
               llSleep(12.0);
               //llStopSound();
               //state default;
               llDie();        
          }
      
         if (response(message) == FALSE)
         {
         tick = 0;
         move = 0;
         integer iWhichOne = (integer) llFrand( llGetListLength( lSounds ) );
         llPlaySound( llList2String(lSounds, iWhichOne), 1.0);
         llSay(0,"\n\n\nThat's wrong, " + name + "!
         \n\n\n(Du musst wieder auf das Auto klicken.)");
         llSetPos(oldPosition);
         key user = llAvatarOnSitTarget(); // Store the UUID of any agent sitting on the sit target.
         llUnSit(user);
         state default; 
         }
      }
   }
  state moving
   {
      state_entry()
      {
         llSetTimerEvent(2.0);
      }
      timer()
      {
         ++tick;
         move += 4;
            
            if (tick > 5)
            {
               llSetPos((oldPosition) + <move, 0.0, 0.0>);
               tick = 0;
               move = 0;
               llRegionSay(-798,"fireworks");
               llLoopSound("cheer-hooter-01",1.0);
               llSay(0,"\n\nYou have won!!!");
               llRegionSay(-799,"reset");
               llSleep(10.0);
               llRegionSay(-798,"fireworks");
               llSleep(12.0);   
               llSetPos(oldPosition);
               llSleep(5.0);
               //llStopSound();
               //state default;
               llDie();  
               
                      
            } 
            else
            {
               llSetPos((oldPosition) + <move, 0.0, 0.0>);    
               state listening;
            }   
      }
}

npc car script:

integer tick;
float move;
vector oldPosition;


list insults = [
    "You are a loser! Ha, ha!",
    "You can't drive! He, he!",
    "I'm much better than you!",
    "I will win!",
    "You will lose! Ha, ha, ha!"
    
];

integer random;
string insult()
{
    integer count = llGetListLength(insults);
    random = (integer)llFrand((float)count);
    return llList2String(insults, random);
}


default
{
    on_rez(integer start_param)
    {
        oldPosition = llGetPos();
        llSetText("Johnny Craft ", <1.0,1.0,1.0>, 1.0);
        state listening;
    } 
 }
state listening
{
   state_entry()
   {
    llListen(-799,"", NULL_KEY, "");
    }
      listen(integer channel, string name, key id, string message)
      {
         
         if (message == "start")
         {            
            llSay(0,"\n\n"+insult());
            state moving;            
        }
        //if (message == "reset")
         //{
               //tick = 0;
               //move = 0;
               //llSetPos(oldPosition);
               //llResetScript();
               //llSleep(5.0);
               //llStopSound();
               //llDie();        
          //}         
    }
}
            state moving
            {
                state_entry()
                {
                    oldPosition = llGetPos();
                    llSetTimerEvent(18.0);
                    }
                    timer()
                    {
                        ++tick;
                        move += 2;
                        
                        if (tick > 10)
                        {
                            llSetPos((oldPosition) + <move, 0.0, 0.0>);
                            llRegionSay(-799,"reset");
                            llRegionSay(-798,"fireworks");
                            llLoopSound("cheer-hooter-01",1.0);
                            llSay(0,"\n\nI'm the winner!!!!\n\nYou lose!!!\n\nHa, ha, ha!!!");
                            tick = 0;
                            move = 0;
                            llSleep(10.0);
                            llRegionSay(-798,"fireworks");
                            llSleep(12.0);   
                            llSetPos(oldPosition);
                            llSleep(5.0);   
                            //llStopSound();
                            llDie();        
            } 
            else
            {
               llPlaySound("s_rev",1.0);
               llSetPos((oldPosition) + <move, 0.0, 0.0>);    
               state moving;
            }   
      }
}

extra npc car reset script:

vector oldPosition;

default
{
     on_rez(integer start_param)
    {
        oldPosition = llGetPos();
        llListen(-799,"", NULL_KEY, "");
    }
      listen(integer channel, string name, key id, string message)
      {
                  
        if (message == "reset")
         {
               llResetOtherScript("npc car script"); 
               llSetPos(oldPosition);
               llSleep(12.0);
               llDie();
               
          }
        
    }
}

Here is the part that isn't working in the npc car script:

//if (message == "reset")
         //{
               //tick = 0;
               //move = 0;
               //llSetPos(oldPosition);
               //llResetScript();
               //llSleep(5.0);
               //llStopSound();
               //state default;
               //llDie();        
          //}         

Do you maybe have any idea why this isn't working?
Thank you very much in advance, and please excuse flaws in the scripts, I'm still learning.
 

Edited by testgenord1

Share this post


Link to post
Share on other sites

From the llListen wiki entry, "On state change or script reset all listens are removed automatically."

In general, it's best to use as few states in a script as possible. Once in a while they may be helpful (e.g., the next line in the wiki: "A state change can be used as a shortcut to releasing listens") and sometimes they're actually necessary to a desired effect (e.g., getting rid of touch* handlers to restore the basic arrow cursor when the mouse hovers over the object), but otherwise they're often more confusing than they're worth.

  • Like 1

Share this post


Link to post
Share on other sites

Thank you very much for your tip.
That, apparently, was the problem.
I deleted the states and now have only one script.
It's still far from perfect, I guess, but it works, at least on OSGrid / OpenSim.
Thank you very much again!

integer tick;
float move;
vector oldPosition;

list insults = [
    "You are a loser! Ha, ha!",
    "You can't drive! He, he!",
    "I'm much better than you!",
    "I will win!",
    "You will lose! Ha, ha, ha!"   
];

integer random;
string insult()
{
    integer count = llGetListLength(insults);
    random = (integer)llFrand((float)count);
    return llList2String(insults, random);
}

default
{
    on_rez(integer start_param)
    {
        oldPosition = llGetPos();
        llSetText("Johnny Craft ", <1.0,1.0,1.0>, 1.0);
        llListen(-799,"", NULL_KEY, "");
    }
    listen(integer channel, string name, key id, string message)
    {
        if (message == "start")
        {
        llSay(0,"\n\n"+insult());
        }
        
        if (message == "reset")
        {
        tick = 0;
        move = 0;
        llSetPos(oldPosition);
        llResetScript();
        llSleep(5.0);
        llStopSound();
        llDie();
        }
        
        oldPosition = llGetPos();
        llSetTimerEvent(10.0);
        }
        timer()
        {
        ++tick;
        move += 2;
        
        if (tick > 10)
        {
        llSetPos((oldPosition) + <move, 0.0, 0.0>);
        llRegionSay(-799,"reset");
        llRegionSay(-798,"fireworks");
        llLoopSound("cheer-hooter-01",1.0);
        llSay(0,"\n\nI'm the winner!!!!\n\nYou lose!!!\n\nHa, ha, ha!!!");
        //llPlaySound("cheer-hooter-01",1.0);
        tick = 0;
        move = 0;
        llSleep(20.0);
        llRegionSay(-798,"fireworks");
        llSleep(12.0);
        llSetPos(oldPosition);
        llSleep(5.0);
        llDie();
        }
        
        else
        {
        llPlaySound("s_rev",1.0);
        llSleep(2.0);
        llSetPos((oldPosition) + <move, 0.0, 0.0>);
        }
    }
}

 

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...