De DigiWiki.
float speed = 0;
integer locked = FALSE;
key agent;
integer handle = 0;
string waterHeight = "";
default
{
state_entry()
{
llSay(0,"Say 'help' to get the notecard");
speed = 0;
llListen( 0, "", NULL_KEY, "" );
llSetStatus(STATUS_PHYSICS, FALSE);
llSetStatus(STATUS_PHANTOM, TRUE);
llRemoveVehicleFlags(-1);
llSetVehicleType(VEHICLE_TYPE_NONE);
llSetStatus(STATUS_PHANTOM, FALSE);
llSleep(1);
llSetSitText("Ride");
llSitTarget(<0.3, 0.0, 0.3>, ZERO_ROTATION);
llSetCameraEyeOffset(<-5.0, 0.0, 2.0>);
llSetCameraAtOffset(<3.0, 0.0, 2.0>);
handle = llListen( 1431, "", "", "" );
llSay(1431,"start:1.0:getWater");
}
on_rez(integer start)
{
llResetScript();
}
listen( integer channel, string name, key id, string message )
{
if ( id == llGetOwner() )
{
if(message == "reset")
{
llSay(0, "Reseting...");
llResetScript();
}
if(message == "help")
{
llGiveInventory(id,"Sailboat help");
}
if(message == "raise")
{
locked = FALSE;
llSay(0, "The sail is raised.");
}
if(message == "anchor")
{
locked = TRUE;
llSay(0, "The anchor is down.");
}
}
}
changed(integer change)
{
if (change & CHANGED_LINK)
{
agent = llAvatarOnSitTarget();
if (agent)
{
llSetStatus(STATUS_PHYSICS, FALSE);
llSetStatus(STATUS_PHANTOM, TRUE);
llRemoveVehicleFlags(-1);
llSetVehicleType(VEHICLE_TYPE_NONE);
llSleep(1);
llSetStatus(STATUS_PHANTOM, FALSE);
llSetStatus(STATUS_PHYSICS, TRUE);
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);
}
else
{
llSay(0, "Thanks for using the boat!");
llSetStatus(STATUS_PHYSICS, FALSE);
llReleaseControls();
llStopAnimation("sit");
}
}
}
run_time_permissions(integer perm)
{
if (perm)
{
speed = 0;
llStartAnimation("sit");
llSetVehicleType(VEHICLE_TYPE_BOAT);
llSetVehicleFlags(VEHICLE_FLAG_NO_Z |
VEHICLE_FLAG_NO_DEFLECTION_UP |
VEHICLE_FLAG_HOVER_WATER_ONLY |
VEHICLE_FLAG_LOCK_HOVER_HEIGHT);
// remove these flags
llRemoveVehicleFlags( VEHICLE_FLAG_HOVER_TERRAIN_ONLY
| VEHICLE_FLAG_LIMIT_ROLL_ONLY
| VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT);
llSetVehicleVectorParam( VEHICLE_RANGE_BLOCK, <1024, 768, 10000> );
llSetVehicleRotationParam( VEHICLE_ROLL_FRAME, <0.017, 0.017, 0, 0> );
// least for forward-back, most friction for up-down
llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, <2, 3, 2> );
// uniform angular friction (setting it as a scalar rather than a vector)
llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 5 );
// linear motor wins after about five seconds, decays after about a minute
llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 5 );
llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
// agular motor wins after four seconds, decays in same amount of time
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 7 );
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 4 );
llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 1);
llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY,.5 );
llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 2.0 );
llSetVehicleFloatParam( VEHICLE_BUOYANCY, 1 );
// halfway linear deflection with timescale of 3 seconds
llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5 );
llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 3 );
// angular deflection
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.5 );
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 5 );
// somewhat bounscy vertical attractor
llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5 );
llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 5 );
// weak negative damped banking
llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 3 );
llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.8 );
llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, .75 );
// default rotation of local frame
llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, <0, 0, 0, 1> );
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)
{
vector angular_motor;
if(level & CONTROL_FWD)
{
if(!locked)
{
speed += .25;
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <speed,0,0>);
}
}
if(level & CONTROL_BACK)
{
if(!locked)
{
speed -= .25;
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <speed,0,0>);
}
}
if(level & (CONTROL_RIGHT|CONTROL_ROT_RIGHT))
{
if(!locked)
{
angular_motor.x += 2.5;
angular_motor.z -= 2.5;
}
}
if(level & (CONTROL_LEFT|CONTROL_ROT_LEFT))
{
if(!locked)
{
angular_motor.x -= 2.5;
angular_motor.z += 2.5;
}
}
if(level & (CONTROL_UP))
{
speed = 0;
llSetVehicleFlags(VEHICLE_FLAG_NO_X | VEHICLE_FLAG_NO_Y);
}
if(level & (CONTROL_DOWN))
{
speed = 0;
llRemoveVehicleFlags(VEHICLE_FLAG_NO_X | VEHICLE_FLAG_NO_Y);
}
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor);
}
}