vector angular_motor; float speed=0; float lift = 0.04; float tilt=15; float turn=1.0; vector moving; integer turnnow = FALSE; integer ts = FALSE; integer cs = FALSE; integer sit=FALSE; vector velocity=<0,0,0>; vector impulse; float turbo=10; string Bname; // Name of Vehicle integer own=FALSE; float volume=1.0; key passenger; key driver; help() { llWhisper(0,"Key Actions:"); llWhisper(0,"Right click and 'Ride' <-- Starts " + Bname); llWhisper(0,"Click STAND UP button <-- Stops " + Bname + " and returns contols"); llWhisper(0,"W or Forward <-- Accelerates or goes faster forwards"); llWhisper(0,"S or Backwards <-- Slows or goes faster backwards"); llWhisper(0,"W or Forward & S or Backwards <-- Brakes or stops the " + Bname); llWhisper(0,"E or Page up <-- Toggles on and off Turbo Mode"); llWhisper(0,"C or Page down <-- Toggles on and off Cruise mode"); llWhisper(0,"A or Left <-- Turns left"); llWhisper(0,"D or Right <-- Turns right"); } default { state_entry() { Bname=llGetObjectName(); llWhisper(0,"Preparing " + Bname); llMessageLinked(LINK_ALL_CHILDREN, 0, "stop", NULL_KEY); llSetStatus(STATUS_PHYSICS, FALSE); llStopSound(); llSetTimerEvent(0.0); velocity = <10, 0, 0>; turnnow = FALSE; ts = FALSE; cs = FALSE; llCollisionSound("", 0.0); llSitTarget(<-0.4,0.05,0.7>, <0,0.0,0,1>); llSetCameraEyeOffset(<-9.0, 0.0, 3.0>); llSetCameraAtOffset(<0.0, 0.0, 1.0>); llPreloadSound("Ducati Idle"); llPreloadSound("D0"); llPreloadSound("D1"); llPreloadSound("D2"); llPreloadSound("D3"); llPreloadSound("D4"); llPreloadSound("D5"); llPreloadSound("D6"); llSetSitText("Ride"); llSetVehicleFlags(-1); llSetVehicleType(VEHICLE_TYPE_BOAT); llSetVehicleFlags(VEHICLE_FLAG_HOVER_UP_ONLY | VEHICLE_FLAG_HOVER_WATER_ONLY); llRemoveVehicleFlags( VEHICLE_FLAG_HOVER_TERRAIN_ONLY | VEHICLE_FLAG_LIMIT_ROLL_ONLY | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT); llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, <8, 3, 2> ); llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 2 ); llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 2 ); llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 ); 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, 0.5 ); 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, <0, 0, 0, 1> ); llWhisper(0,Bname + " is now ready to ride"); } touch(integer total_number) { key owner=llGetOwner(); if (llDetectedKey(0)==owner) { help(); } else { llWhisper(0,llDetectedName(0) + ", Please step away from the " + Bname); } } changed(integer change) { if (change & CHANGED_LINK) { llStopSound(); llSetStatus(STATUS_PHYSICS, FALSE); driver = llAvatarOnSitTarget(); if (driver) { if (driver != llGetOwner() && own==FALSE) { string ownername=llKey2Name(llGetOwner()); string sitter=llKey2Name(driver); llWhisper(0,sitter + ", you may only drive the " + Bname + " after " + ownername + " is seated"); } if(driver == llGetOwner()) { //llWhisper(0,"1" + (string)own); own=TRUE; } llSetTimerEvent(0.1); } else { llSetTimerEvent(0.0); //llWhisper(0,"4" + (string)own); own=FALSE; llStopAnimation("motorcycle_sit"); llMessageLinked(LINK_ALL_CHILDREN, 0, "stop", NULL_KEY); llSetStatus(STATUS_PHYSICS, FALSE); llReleaseControls(); llStopSound(); sit=FALSE; ts = FALSE; cs = FALSE; } } } run_time_permissions(integer perm) { if (perm && own) { //llWhisper(0,"3" + (string)own); sit=TRUE; speed=0; ts = FALSE; cs = FALSE; llStopAnimation("sit"); llStartAnimation("motorcycle_sit"); llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT | CONTROL_UP | CONTROL_DOWN, TRUE, FALSE); } } control(key id, integer level, integer edge) { if(level & CONTROL_FWD) { if(ts) { if(velocity.x < 100) { if(cs == FALSE) { velocity.x += (turbo * 3);} else { velocity.x += turbo;} speed = 0; } } else { if(speed < 35) { if(cs == FALSE) { speed += 5;} else { speed += 1; } } } } if(level & CONTROL_BACK) { if(ts) { if(velocity.x > 0) { velocity.x -= turbo; } else { velocity.x = 0; speed = 0; } } if(speed > -15 && velocity.x < 1) { speed -= 3; } } if((level & CONTROL_BACK) && (level & CONTROL_FWD)) { speed=0; velocity=<0,0,0>; } if(level & CONTROL_UP) { if(ts) { llWhisper(0,"Turbo off"); ts = FALSE; lift=0.04; speed=0; turn=1.0; velocity=<0,0,0>; } else { llWhisper(0,"Turbo on"); ts = TRUE; lift=0.08; speed=0; turn=2.0; velocity=<0,0,0>; } } if(level & CONTROL_DOWN) { if(cs) { llWhisper(0,"Cruise off"); cs = FALSE; speed=0; velocity=<0,0,0>; } else { llWhisper(0,"Cruise on"); cs = TRUE; speed=0; velocity=<0,0,0>; } } if(level & (CONTROL_RIGHT|CONTROL_ROT_RIGHT)) { turnnow = TRUE; angular_motor.x += tilt; angular_motor.z -= turn; } if(level & (CONTROL_LEFT|CONTROL_ROT_LEFT)) { turnnow = TRUE; angular_motor.x -= tilt; angular_motor.z += turn; } } timer() { if (sit==FALSE) { if(own) { llSetStatus(STATUS_PHYSICS, TRUE); llRequestPermissions(driver,PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS); llLoopSoundMaster("Ducati Idle",volume - 0.5); llMessageLinked(LINK_ALL_CHILDREN, 0, "start", NULL_KEY); } } else if(sit) { llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, ZERO_VECTOR); if(turnnow) { llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor); angular_motor = ZERO_VECTOR; turnnow = FALSE; } if((velocity.x > 9) || (speed > 1)) { llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, <0, lift, 0, 1> ); } else { llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, <0, 0, 0, 1> ); } if(ts) { llApplyImpulse( velocity, TRUE ); } else { llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION,); } moving=llGetVel(); float total = llVecMag(moving); if (total < 1) { llLoopSoundSlave("Ducati Idle",volume - 0.5); } else if (total < 3) { llLoopSoundSlave("D0",volume); } else if (total < 6) { llLoopSoundSlave("D1",volume); } else if (total < 9) { llLoopSoundSlave("D2",volume); } else if (total < 12) { llLoopSoundSlave("D3",volume); } else if (total < 15) { llLoopSoundSlave("D4",volume); } else if (total < 18) { llLoopSoundSlave("D5",volume); } else if (total > 17) { llLoopSoundSlave("D6",volume); } if(cs == FALSE) { speed *= 0.75; velocity.x *= 0.75; } } } link_message(integer sender_num, integer num, string str, key id) { if(num==21) { passenger=str; sit=FALSE; if(passenger == llGetOwner()) { own=TRUE; } } else if(num==20) { if(passenger == llGetOwner()) { own=FALSE; } passenger=NULL_KEY; sit=FALSE; } } on_rez(integer start_param) { llResetScript(); } }