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