
I am trying to create a vehicle such that when I push forward, the vehicle starts foward, but eventually slows to a stop on its own. I was hoping to use friction for this. For some reason, however, once my vehicle stops due to friction, it never starts again!
Here is my code ...
CODE
default
{
state_entry()
{
llSetBuoyancy(1.0);
llSetVehicleType(VEHICLE_TYPE_CAR);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 0.1);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 2);
llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, <2, 0.1, 0.1> );
//no angular motor
llSetVehicleVectorParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, <1000, 1000, 1000> );
llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, <0, 0, 0> );
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 1000 );
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 120 );
//no angular deflection, all linear deflection
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0 );
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 10 );
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 1.0 );
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 10 );
//vertical attraction
llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 1 );
llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 0 );
//no bank
llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 0 );
llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 1 );
llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 10 );
}
changed(integer change) { // something changed
if (change & CHANGED_LINK) { // and it was a link change
// llSleep(0.5); // llUnSit works better with this delay
key av = llAvatarOnSitTarget();
if (av) { // somebody is sitting on me
llRequestPermissions(av, PERMISSION_TAKE_CONTROLS);
llSetStatus(STATUS_PHYSICS, TRUE);
llOwnerSay("sit");
} else {
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0.0, 0.0, 0.0>);
llSetStatus(STATUS_PHYSICS, FALSE);
}
}
}
run_time_permissions(integer perms)
{
integer desired_controls =
CONTROL_FWD |
CONTROL_BACK |
CONTROL_LEFT |
CONTROL_RIGHT |
CONTROL_ROT_LEFT |
CONTROL_ROT_RIGHT |
CONTROL_UP |
CONTROL_DOWN |
CONTROL_LBUTTON |
CONTROL_ML_LBUTTON;
if (perms & PERMISSION_TAKE_CONTROLS) {
llTakeControls(desired_controls, TRUE, FALSE);
}
}
control(key id, integer held, integer change) {
integer pressed = held & change;
integer down = held & ~change;
integer released = ~held & change;
integer inactive = ~held & ~change;
if (pressed & CONTROL_FWD) {
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <5.0, 0.0, 0.0>);
llOwnerSay("fwd");
} else if (pressed & CONTROL_BACK) {
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0.00, 0.0, 0.0>);
llOwnerSay("back");
}
}
}
So I can tell that when I hit forward, my script goes to the right place ... but after my vehicle slows to a stop, re-setting the LINEAR_MOTOR_DIRECTION does not make me go forward again.
I expected friction to just decrase my linear velocity, and not actual stick me to the ground ... what am I missing?
I have also tried using LINEAR_MOTOR_DECAY without using friction, but then my person never seems to stop because there is no friction to slow me down, because my vehicle is buoyant, and lives above the ground...
Basically, this will be a multi-person vehicle that floats along the ground, and people can stand on it. I have it very strongly attracted up, so that the vehicle stays rock-steady as it moves along. What I can't figure out is how to get an "impulse-like" behavior using the linear motor. The vehicle tutorial says this is possible, but I can't figure it out.


