Jump to content

ride on moving object using llSetLinkPrimitiveParamsFast


testgenord1
 Share

You are about to reply to a thread that has been inactive for 1736 days.

Please take a moment to consider if this thread is worth bumping.

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;
      }
   }

 

Link to comment
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
Link to comment
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>]);

 

Link to comment
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
Link to comment
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;
      }
   }

 

Link to comment
Share on other sites

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
Link to comment
Share on other sites

  • 4 weeks later...

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
Link to comment
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
Link to comment
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
Link to comment
Share on other sites

You are about to reply to a thread that has been inactive for 1736 days.

Please take a moment to consider if this thread is worth bumping.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share

×
×
  • Create New...