Project: BulletSim Helicopter with pitch & roll

Back to project

File name: Helicopter.lsl
Code: View Raw Code
vector SIT_TARGET = <1.8 , 0., .6>;
vector SIT_ROT = <0, 0,  0> ;
string DRIVE_ANIM= "driveS";       // animation for sitting driving 
string SITMESSAGE = "DRIVE";       //Sit message

string START_SOUND = "chopper_start";
string DRIVE_SOUND = "chopper";
string QUIT_SOUND = "chopper_quit";

float UP_POWER  = 12; // power upwards
float DOWN_POWER  = 5; // power downwards
float FWD_POWER  = 8;  // Initial power ahead 
float FWD_MAX    = 60; // Max power ahead
float BACK_POWER = 10; // Max power backwards
float PITCH_POWER = 2; // Pitch power

// Change the name of the horizontal propeller to spin_z, vertical to spin_y
// Change the names of light prims to light_red and light_green for red and green flashing lights 

//////////////////////////////////////////////////////////////////////////////////////////////

set_light(string name, float  rate, vector color)
{

     list ps ;
    if (rate ==0.0) ps = [];    
    else  ps =    [
            PSYS_SRC_PATTERN,PSYS_SRC_PATTERN_DROP,
            PSYS_SRC_BURST_RADIUS,0,
            PSYS_PART_START_COLOR,color, 
            PSYS_PART_END_COLOR,color,
            PSYS_PART_START_ALPHA,0.99,
            PSYS_PART_END_ALPHA, 0.6,
            PSYS_PART_START_GLOW, .1,
            PSYS_PART_END_GLOW,0.0,
            PSYS_PART_START_SCALE,< 1, 1, 0> ,
            PSYS_PART_END_SCALE,<.000000,.3000000,0.000000>,
            PSYS_SRC_MAX_AGE, 0,
            PSYS_PART_MAX_AGE,.5,
            PSYS_SRC_BURST_RATE, rate,
            PSYS_SRC_BURST_PART_COUNT, 1,
            PSYS_PART_FLAGS,
                0 |
                PSYS_PART_EMISSIVE_MASK |
                PSYS_PART_FOLLOW_SRC_MASK |
                //PSYS_PART_FOLLOW_VELOCITY_MASK |
                PSYS_PART_INTERP_COLOR_MASK 
                //|                PSYS_PART_INTERP_SCALE_MASK
        ];
        
    integer i;
    for (i=2; i <= llGetNumberOfPrims(); i++) 
        if (llGetLinkName(i) == name)
        {
            llLinkParticleSystem(i,ps);
        }
}


init()
{
            llSetLinkPrimitiveParamsFast(LINK_ALL_CHILDREN, [PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_NONE]);
            llSetSitText(SITMESSAGE);

            llSetCameraEyeOffset(<-8, .0, 1.0>);
            //llSetCameraAtOffset(<1.0, 0.0, 2.0>);
            
            llSetVehicleFlags(0);
            llSetVehicleType(VEHICLE_TYPE_AIRPLANE);

            
            llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE,  <100, 100. , 100. > );
            llSetVehicleVectorParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, < 10, 10,   100 > );
            
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0, 0, 0>);
            llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE,  1);
            llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 10. );
            
            llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 1. );
            llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, .1 );
            
            llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0.25);
            llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY,.5 );
            llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 2.0 );
            //llSetVehicleFloatParam( VEHICLE_BUOYANCY, 1 );
            
            llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, .9 );
            llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 1 );
            llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, .1 );
            llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 10. );
            llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.8 );
            llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 2. );
            llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, .5 );
            llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.5 );
            llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 5. );
            llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0.8 );  
             
            llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, ZERO_ROTATION );
  
}

spin(string spin , vector dir, float vel)
{
    integer i;
    for (i=2; i <= llGetNumberOfPrims(); i++) 
        if (llGetLinkName(i) == spin)
        {
            llSetLinkPrimitiveParamsFast(i, [PRIM_OMEGA, dir, vel, 1.0] );
        }
}


default
{
      
    control(key id, integer level, integer edge)
    {
        rotation rot = llGetRot();
        float speed = llGetVel()* (<1,0,0>*rot);        
        vector linear;
        vector angular;
        
        //Any type of control attempts to right the heli
         
        float v = <0,0,1>* (<1,0,0>*rot); 
        angular.y += 10*v;
        //llSetText("V="+(string)v, <1,1,1>, 1);

        
        if(level & CONTROL_UP)
        {  
            linear.z += UP_POWER;
           //angular.x += 1*v;
   
        }
        
        if(level & CONTROL_DOWN)
        {

          linear.z -= DOWN_POWER;
           
           //angular.x -= 1*v;
           
        }
        
        
        if(level & (CONTROL_FWD))
        {
            angular.y += PITCH_POWER;
           //float z = <0,0,1>*(<1,0,0>*llGetRot());
           //angular_motor.y +=5.*z;
           
           //llSetText("V="+(string)z, <1,1,1>, 1.0);
           
            
           linear.x += FWD_POWER +  speed/2;
           if (linear.x> FWD_MAX) linear.x=FWD_MAX;

        }
        else if(level & (CONTROL_BACK))
        {
            angular.y -= PITCH_POWER;
            linear.x -= BACK_POWER;
           //angular_motor.y += -1*v;

        }

        if(level & (CONTROL_ROT_RIGHT))
        {
            angular.z -=3;            
            if  (level & (CONTROL_UP|CONTROL_FWD)) 
                angular.x +=7;
        }
        
        if(level & (CONTROL_ROT_LEFT))
        {
            angular.z +=3;
            if  (level & (CONTROL_UP|CONTROL_FWD)) 
                angular.x -=7;
        }

        llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, linear);        
        llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular);
        

    } 
    
    
    on_rez(integer n)
    {
        llResetScript();   
    }
    
    state_entry()
    {
        llSitTarget(SIT_TARGET, llEuler2Rot(SIT_ROT) );
        llSetText("", <1,1,1>, 1);     
    }
    
    changed(integer change)
    {
        
        if ((change & CHANGED_LINK) == CHANGED_LINK)
        {
            
            key agent = llAvatarOnSitTarget();
            if (agent != NULL_KEY)
            {                
                llTriggerSound(START_SOUND, 1.0);
                llSetStatus(STATUS_PHANTOM, FALSE);
                llSleep(0.2);
                llSetStatus(STATUS_PHYSICS, TRUE);
                llSleep(0.2);
                init();
                llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA);
                spin("spin_z", <0,0,1>, 18);
                spin("spin_y", <0,1,0>, 14);
                llStopSound();
                llLoopSound(DRIVE_SOUND, 1.0);
                set_light("light_green", 1., <0,1,0>);
                set_light("light_red", .9, <1,0,0>);
            }
            else
            {
                
                llSetStatus(STATUS_PHYSICS, FALSE);
                llSleep(.2);
                llReleaseControls();
                llStopAnimation(DRIVE_ANIM);
                llClearCameraParams();
                llStopSound();
                llTriggerSound(QUIT_SOUND, 1.0);
                spin("spin_z", <0,0,0>, 0);
                spin("spin_y", <0,0,0>, 0);
                set_light("light_green", 0, <0,1,0>);
                set_light("light_red", 0, <1,0,0>);
            }
        }
        
    }
    
    run_time_permissions(integer perm)
    {
        if (perm)
        {
            llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_DOWN | CONTROL_UP | CONTROL_RIGHT | 
                            CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);
                            
                                                                    
            llSetCameraParams([
                       CAMERA_ACTIVE, 1,                     // 0=INACTIVE  1=ACTIVE
                       CAMERA_BEHINDNESS_ANGLE, 10.0,         // (0 to 180) DEGREES
                       CAMERA_BEHINDNESS_LAG, 1.0,           // (0 to 3) SECONDS
                       CAMERA_DISTANCE, 6.0,                 // ( 0.5 to 10) METERS
                       CAMERA_PITCH, 20.0,                    // (-45 to 80) DEGREES
                       CAMERA_POSITION_LOCKED, FALSE,        // (TRUE or FALSE)
                       CAMERA_POSITION_LAG, 0.05,             // (0 to 3) SECONDS
                       CAMERA_POSITION_THRESHOLD, 30.0,       // (0 to 4) METERS
                       CAMERA_FOCUS_LOCKED, FALSE,           // (TRUE or FALSE)
                       CAMERA_FOCUS_LAG, 0.01 ,               // (0 to 3) SECONDS
                       CAMERA_FOCUS_THRESHOLD, 0.01,          // (0 to 4) METERS
                       CAMERA_FOCUS_OFFSET, <0.0,0.0,0.0>   // <-10,-10,-10> to <10,10,10> METERS
                      ]);
                llStopAnimation("sit");
                llStopAnimation("sit_female");
                llStartAnimation(DRIVE_ANIM);
        }
        
      

    }
  
    
    
    
}