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