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