Project: Bulletsim single-script car

Back to project

File name: Bulletsim Car.lsl
Code: View Raw Code
// link numbers  for wheels
//
integer FL=22; //front left 
integer FR=21; //front right

integer BL=25; //back left
integer BR = 20; //back right

integer BL2=0;  //second back wheel (for 6 wheel trucks) - set to if no wheels
integer BR2=0;


vector SIT_TARGET = <1.0, .6, .8>;
vector SIT_ROT = <0,0,  0> ;

string DRIVE_ANIM= "driveS";       // animation for sitting driving straight
string DRIVELEFT_ANIM= "driveL";   // Turning left
string DRIVERIGHT_ANIM = "driveR"; // Turning right
string SITMESSAGE = "DRIVE"; //Sit message


string ENGINE_SOUND = "engine"; /// Looping engine sound
string START_SOUND = "enginestart"; // startup sound
string ACCEL_SOUND = "firetr"; // acceleerator sound
string SCREECH_SOUND = "screech"; // screeching sound when turning

string SMOKE_TEXTURE = "smoke-01"; // For screeching wheels;

float FWD_POWER = 12.;
float REV_POWER = -7.;

vector WHEEL_ROTATION= PI/2*<1,0,0>; // Rotation of  the front wheel - set this manually  until you get the front wheels aligned right

float turning_ratio = .3; // Less is sharper

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



float linear;
integer toggle;


integer seated = 0;
float turn =0;
float oldTurn =0;
float speedMult =1.;

psystem(integer lnk)
{
     llLinkParticleSystem(lnk,
        [
            PSYS_SRC_PATTERN,PSYS_SRC_PATTERN_DROP,
            PSYS_SRC_BURST_RADIUS,.3,
            PSYS_SRC_ANGLE_BEGIN,PI,
            PSYS_SRC_ANGLE_END,PI+0.1,
            PSYS_PART_START_COLOR,<1.000000,1.000000,1.000000>,
            PSYS_PART_END_COLOR,<1.000000,1.000000,1.000000>,
            PSYS_PART_START_ALPHA,.1,
            PSYS_PART_END_ALPHA,0,
            PSYS_PART_START_GLOW,0,
            PSYS_PART_END_GLOW,0,
            PSYS_PART_BLEND_FUNC_SOURCE,PSYS_PART_BF_SOURCE_ALPHA,
            PSYS_PART_BLEND_FUNC_DEST,PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA,
            PSYS_PART_START_SCALE,<1.60000,1.600000,0.000000>,
            PSYS_PART_END_SCALE,<4,4, 0.000000>,
            PSYS_SRC_TEXTURE,  SMOKE_TEXTURE,
            PSYS_SRC_MAX_AGE,0,
            PSYS_PART_MAX_AGE,3,
            PSYS_SRC_BURST_RATE,0.01,
            PSYS_SRC_BURST_PART_COUNT,2,
            PSYS_SRC_ACCEL,<0.000000,0.000000,.00000>,
            PSYS_SRC_OMEGA,<0.000000,0.000000,0.000000>,
            PSYS_SRC_BURST_SPEED_MIN,0.1,
            PSYS_SRC_BURST_SPEED_MAX,0.5,
            PSYS_PART_FLAGS,
                0 
                | PSYS_PART_EMISSIVE_MASK
                | PSYS_PART_INTERP_SCALE_MASK
                | PSYS_PART_INTERP_COLOR_MASK
        ]);
}


init()
{
            llSetLinkPrimitiveParamsFast(LINK_ALL_CHILDREN, [PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_NONE]);
            llSetSitText(SITMESSAGE);
            // forward-back,left-right,updown
            llSitTarget(SIT_TARGET, llEuler2Rot(SIT_ROT) );
            
            llSetCameraEyeOffset(<-10, -1.0, 3.0>);
            //llSetCameraAtOffset(<1.0, 0.0, 2.0>);
            
            //llPreloadSound("boat_start");
            //llPreloadSound("boat_run");
            
            llSetVehicleFlags(0);
            llSetVehicleType(VEHICLE_TYPE_CAR);
            llSetVehicleFlags(VEHICLE_FLAG_HOVER_UP_ONLY );
            llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, <.5, .1, .1> );
            llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 1 );
            
            
            
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0, 0, 0>);
            llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, .5);
            llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.05);
            
            llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 1 );
            llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 5 );
            llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0.15);
            llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY,.5 );
            llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 2.0 );
            //llSetVehicleFloatParam( VEHICLE_BUOYANCY, 1 );
            llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5 );
            llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 3 );
            llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.5 );
            llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 10 );
            llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5 );
            llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 2 );
            llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 1 );
            llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.1 );
            llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, .5 );
            llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, ZERO_ROTATION );
  
           
  
}

string curanim;

default
{
    
    on_rez(integer n)
    {
        llResetScript();   
    }
    
    state_entry()
    {
       
    }
    
    changed(integer change)
    {
        
        
        if ((change & CHANGED_LINK) == CHANGED_LINK)
        {
            
            key agent = llAvatarOnLinkSitTarget(1);
            if (agent != NULL_KEY)
            {                

                llTriggerSound(START_SOUND, 1.0);
                init();
                llSleep(0.3);
                llSetStatus(STATUS_PHYSICS, TRUE);
                llSleep(0.5);
                llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA);
                seated = 1;
                llSetTimerEvent(0);


            }
            else
            {
                
                llSetStatus(STATUS_PHYSICS, FALSE);
                llSleep(.2);
                llReleaseControls();
                llTargetOmega(<0,0,0>,PI,0);
                llClearCameraParams();
                seated = 0;
                llStopSound();
                llStopAnimation(DRIVE_ANIM);
                llSetTimerEvent(300);
            }
        }
        
    }
    
    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, 15.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);
        llLoopSound(ENGINE_SOUND,1.0);
        llSleep(0.5);
    }
    
    control(key id, integer level, integer edge)
    {
        integer dir=0;
        vector angular_motor;
        oldTurn = turn;
        float speed = llGetVel()* (<1,0,0>*llGetRot());
        turn = 0.;
        linear  = 0;
        
        if(level & CONTROL_FWD)
        {
            if (edge&CONTROL_FWD)
                llTriggerSound(ACCEL_SOUND, 1.0);
            linear = FWD_POWER;
            turn = 2;
            dir =1;
        }
        
        if(level & CONTROL_BACK)
        {
            linear = REV_POWER;
            dir = -1;
            turn = -2;
            speedMult = 1.0;
        }
        
        
        if(level & (CONTROL_RIGHT|CONTROL_ROT_RIGHT))
        {    
 
            turn = -1;
            angular_motor.z -= speed / turning_ratio ;
            linear *=0.7; //slow down a bit
        }
        
        if(level & (CONTROL_LEFT|CONTROL_ROT_LEFT))
        {
            turn = 1;
            angular_motor.z += speed / turning_ratio ;
            linear *=0.7;
        }
        
        
        
        if(level &edge & (CONTROL_UP) && speedMult < 5.)
        {
            speedMult += 1.;
            llTriggerSound(ACCEL_SOUND , 1.0);
           // llWhisper(0,"Gear "+(integer)speedMult);
        }
        else if(level &edge & (CONTROL_DOWN) && speedMult > 1.)
        {
            speedMult -= 1.;
            //llWhisper(0,"Gear "+(integer)speedMult);
        }
            
        
        llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <llPow(speedMult, .9)*linear,0,0>);


        if (oldTurn != turn) 
        {
             llStopAnimation(DRIVELEFT_ANIM);
             llStopAnimation(DRIVERIGHT_ANIM);
             if (turn <0) 
                  llStartAnimation(DRIVERIGHT_ANIM);
             else if (turn >0) 
                  llStartAnimation(DRIVELEFT_ANIM);
            
            
            llSetLinkPrimitiveParamsFast(BL, [PRIM_OMEGA, <0,1,0>, dir*6, 1.0]);
            llSetLinkPrimitiveParamsFast(BR, [PRIM_OMEGA, <0,1,0>,dir*6, 1.0]);
            
            if (BL2>0)
            {
            llSetLinkPrimitiveParamsFast(BL2, [PRIM_OMEGA, <0,1,0>, dir*6, 1.0]);
            llSetLinkPrimitiveParamsFast(BR2, [PRIM_OMEGA, <0,1,0>,dir*6, 1.0]);
            }
            
            
            if (turn == 1 || turn == -1)
            {
                vector wr  = <0,1,0>*llEuler2Rot(<0, 0, turn/3.>);
                rotation ax = llEuler2Rot(WHEEL_ROTATION)*llEuler2Rot(<0, 0, turn/3.>);
                
                llSetLinkPrimitiveParamsFast(FL, [PRIM_ROT_LOCAL, ax, PRIM_OMEGA, dir*wr, speedMult*3., .2]);
                llSetLinkPrimitiveParamsFast(FR, [PRIM_ROT_LOCAL, ax, PRIM_OMEGA, dir*wr, speedMult*3., .2]);
                
                if (speed>15.)
                {
                    psystem(BL); psystem(BR);
                    llPlaySound(SCREECH_SOUND, 1.0);
                }
            }
            else
            {
                rotation ax = llEuler2Rot(<0,0,0>);
                
                llStopSound();
                llSetLinkPrimitiveParamsFast(FL, [PRIM_ROT_LOCAL, ax*llEuler2Rot(WHEEL_ROTATION), PRIM_OMEGA, dir*<0,1,0>*ax, speedMult*3, 1.]);
                llSetLinkPrimitiveParams(FR, [PRIM_ROT_LOCAL, ax*llEuler2Rot(WHEEL_ROTATION), PRIM_OMEGA, dir* <0,1,0>*ax, speedMult*3, 1.]);

                llLinkParticleSystem(FL, []);                    llLinkParticleSystem(FR, []);
                llLinkParticleSystem(BL, []);                    llLinkParticleSystem(BR, []);

                llLoopSound(ENGINE_SOUND,1.0);


            }


        }
        
        
        if (speed <0.1  &&  speed > -0.1)
            speed =0;
                
        llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor);

    } 
    
    
    touch_start(integer n)
    {
        llOwnerSay((string)llDetectedLinkNumber(0));
    }
    
}