integer curPsys; vector SIT_TARGET = <2. , 0.5, 1.6>; vector SIT_ROT = <0,0, 0> ; string DRIVE_ANIM= "driveS"; // animation for sitting driving string SITMESSAGE = "DRIVE"; //Sit message // Add 3 sounds called "Startup", "Engine" and "Shutdown" sound effects when the engine starts/runs/stop // Also add a sound called "Splash" for when the airplane lands on water float UP_POWER = 5; // power upwards float DOWN_POWER = 5; // power upwards float FWD_POWER = 8; // Initial power ahead float FWD_MAX = 50; // Max power float BACK_POWER = 4; // Max float PITCH_POWER = 2; float WATER; vector linear; integer isBoat=0; integer throttle; vector regionSize; ////////////////////////////////////////////////////////////////////////////////////////// psys(integer n) { list ps ; if (n==0) ps = []; else ps = [ PSYS_SRC_PATTERN,PSYS_SRC_PATTERN_ANGLE_CONE, PSYS_SRC_BURST_RADIUS,2, PSYS_SRC_ANGLE_BEGIN,PI/2-0.2, PSYS_SRC_ANGLE_END,PI/2-0.2, PSYS_PART_START_COLOR,<1., 1.000, 1.>, PSYS_PART_END_COLOR,<1.000000,1.000000,1.000000>, PSYS_PART_START_ALPHA,0.5, PSYS_PART_END_ALPHA,0.0, PSYS_PART_START_GLOW,0., PSYS_PART_END_GLOW,0.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., 1., 0> , PSYS_PART_END_SCALE,<3.000000,3.000000,0.000000>, PSYS_SRC_TEXTURE,"701b57bb-f28e-4c96-a15d-1df46ed2a88e", PSYS_SRC_MAX_AGE, 0, PSYS_PART_MAX_AGE, 3, PSYS_SRC_BURST_RATE, 0.02, PSYS_SRC_BURST_PART_COUNT, 1, PSYS_SRC_ACCEL,<0.000000,0.000000,0.000000>, PSYS_SRC_OMEGA,<0.000000,0.000000,0.000000>, PSYS_SRC_BURST_SPEED_MIN, 0.1, PSYS_SRC_BURST_SPEED_MAX, .9, PSYS_PART_FLAGS, 0 | PSYS_PART_EMISSIVE_MASK | //PSYS_PART_FOLLOW_SRC_MASK | //PSYS_PART_FOLLOW_VELOCITY_MASK | //PSYS_PART_BOUNCE_MASK | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK ]; llParticleSystem(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, <1000, 10. , 10. > ); 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, 5. ); llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 2. ); llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 5. ); llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0.25); llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, .9 ); llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 1.0 ); llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, .8 ); llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 2); llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, .5 ); llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 10. ); llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.7 ); llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 5. ); llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, .9 ); llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.5 ); llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 5 ); llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0.7 ); llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, ZERO_ROTATION ); WATER = llWater(ZERO_VECTOR); regionSize = osGetRegionSize(); } 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); linear = ZERO_VECTOR;; 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_FWD) { angular.y += 3; } if(level & CONTROL_BACK) { angular.y -= 3; } if((level &edge & CONTROL_DOWN) || (level &edge & CONTROL_LEFT)) { throttle --; if (throttle< -2) throttle =-2; llWhisper(0, "Throttle "+(string)throttle); } else if( (level &edge & CONTROL_UP) || (level &edge & CONTROL_RIGHT)) { throttle ++; if (throttle >8 ) throttle = 8; llWhisper(0, "Throttle "+(string)throttle); } linear.x += throttle* (5); //if (linear.x> FWD_MAX) linear.x=FWD_MAX; if(level & (CONTROL_ROT_RIGHT)) { vector pos = llGetPos(); angular.z -=5; if (pos.z > WATER+1 ) angular.x +=3; } if(level & (CONTROL_ROT_LEFT)) { vector pos = llGetPos(); angular.z +=5; if (pos.z > WATER+1 ) angular.x -=3; } 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); psys(0); } timer() { vector p = llGetPos(); if ( p.z < WATER+1 && isBoat == 0 ) { isBoat = 1; psys(1); llSetVehicleFlags(VEHICLE_FLAG_HOVER_WATER_ONLY); llTriggerSound("Splash", 1); // if (throttle >3) throttle = 3; } else if (isBoat == 1) { vector r = (llRot2Fwd(llGetRot())); if (r.z > 0.1 ) { llRemoveVehicleFlags(VEHICLE_FLAG_HOVER_WATER_ONLY); psys(0); isBoat = 0; } } } changed(integer change) { if ((change & CHANGED_LINK) == CHANGED_LINK) { key agent = llAvatarOnSitTarget(); if (agent != NULL_KEY) { llTriggerSound("Startup", 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_x", <1,0,0>, 24); //spin("spin_y", <0,1,0>, 14); //llStopSound(); llLoopSound("Engine", 1.0); //set_light("light_green", 1., <0,1,0>); //set_light("light_red", .9, <1,0,0>); llSetTimerEvent(1); llWhisper(0, "Use Shift+left/right or PgUp/down to change throttle"); } else { llSetStatus(STATUS_PHYSICS, FALSE); llSleep(.2); llReleaseControls(); llStopAnimation(DRIVE_ANIM); llClearCameraParams(); llStopSound(); llTriggerSound("Shutdown", 1.0); //spin("spin_z", <0,0,0>, 0); spin("spin_x", <0,0,0>, 0); //set_light("light_green", 0, <0,1,0>); //set_light("light_red", 0, <1,0,0>); psys(0); vector v= llRot2Euler(llGetRot()); v.x = 0; v.y =0; llSetRot(llEuler2Rot(v)); llResetScript(); } } } 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, 5.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); } } }