72 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
| vector startPos;
 | |
| vector curPos;
 | |
| vector curForce;
 | |
| integer second;
 | |
| 
 | |
| default
 | |
| {
 | |
|    state_entry()
 | |
|    {
 | |
|        llSay( 0, "Hello, Avatar! Touch to launch me straight up.");
 | |
|        llSetStatus( 1, TRUE );
 | |
|        startPos = < 0, 0, 0 >;
 | |
|    }
 | |
|  
 | |
|    touch_start(integer total_number)
 | |
|    {
 | |
|        startPos = llGetPos();
 | |
|        curPos = startPos;
 | |
|        curForce = < 0, 0, 0 >;
 | |
|        second = 0;
 | |
|         
 | |
|        llSetColor( < 1.0, 0.0, 0.0 > , ALL_SIDES ); // set color to red.
 | |
|         
 | |
|        float objMass = llGetMass();
 | |
|        float Z_force = 10.2 * objMass;
 | |
|         
 | |
|        llSetForce( < 0.0, 0.0, Z_force >, FALSE );
 | |
|         
 | |
|        llSay( 0, "Force of " + (string)Z_force + " being applied." );
 | |
|        llSetTimerEvent(1);
 | |
|    }
 | |
|     
 | |
|    timer()
 | |
|    {
 | |
|        second++;
 | |
|        curPos = llGetPos();
 | |
|        float curDisplacement = llVecMag( curPos - startPos );
 | |
|        
 | |
|        if( ( curDisplacement > 30. ) &&  // then object is too far away, and
 | |
|          ( llGetForce() != < 0.0, 0.0, 0.0 > ) ) // force not already zero, 
 | |
|        {   // then let gravity take over, and change color to green.
 | |
|            llSetForce( < 0.0, 0.0, 0.0 >, FALSE ); 
 | |
|            llSetColor( < 0, 1.0, 0 >, ALL_SIDES ); 
 | |
|            llSay( 0, "Force removed; object in free flight." );
 | |
|        } 
 | |
|         
 | |
|        if ( second > 19 )  // then time to wrap this up.
 | |
|        {
 | |
|            // turn object blue and zero force to be safe....
 | |
|            llSetColor( < 0, 0, 1.0 >, ALL_SIDES ); // change color to blue.
 | |
|            llSetForce( < 0, 0, 0 >, FALSE );
 | |
| 
 | |
|            // ...move object back to starting position...
 | |
|            // ...after saving current status of Physics attribute.
 | |
|            integer savedStatus = llGetStatus( 1 );
 | |
|            llSetStatus( 1, FALSE );  // turn physics off.
 | |
|            while ( llVecDist( llGetPos(), startPos ) > 0.001) 
 | |
|            {
 | |
|                llSetPos( startPos );
 | |
|            }
 | |
|            llSetStatus( 1, savedStatus );  // restore Physics status.
 | |
|            
 | |
|            //...and then turn color to black and Reset the script.          
 | |
|            llSetColor( < 1, 1, 1 >, ALL_SIDES );
 | |
|            llSetTimerEvent( 0 );  // turn off timer events.
 | |
|            llSay( 0, "Done and resetting script." );
 | |
|            llResetScript();  // return object to ready state.
 | |
|        }
 | |
|    }
 | |
| }
 | |
| 
 |