I am stuck with a little vehicle I am trying to make. It shows a for me not understandable behaviour.
I based the thing on the 'Simple Vehicle 1.0.0' that I found in a free script collection - so far the controls work, it speeds up, keeps speed, turns, but one thing it also does:
It always tries to turn and drive into the worlds negative X-axis direction, if you steer it turn, but after releasing controls it starts turning again and tries again to go in to the world X axis direction.
The sript is in the root prim in the center of the vehicle, and has zero_rotation, and it's x-axis points to the vehicles front...
*big sigh* - please if someone has an idea I would be very thankful...
relevant Code and settings follows:
CODE
// initialize vehicle parameters
init_vehicle()
{
llSitTarget(<2.5,0,1.00>,ZERO_ROTATION);
llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE);
llPassCollisions(TRUE);
llSetSitText("PULL!");
llSetVehicleType(VEHICLE_TYPE_CAR);
llSetVehicleFlags(VEHICLE_FLAG_NO_DEFLECTION_UP | VEHICLE_FLAG_LIMIT_ROLL_ONLY | VEHICLE_FLAG_LIMIT_MOTOR_UP);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.2);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.8);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 0.10);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.10);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 0.1);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.2);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.2);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.1);
llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <10.0, 0.5, 1000.0> );
llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <10.0, 10.0, 0.5> );
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.50);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 0.40);
llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 0.0);
llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 1.0);
llSetVehicleFloatParam(VEHICLE_BANKING_MIX, 0.0);
llCollisionSound("", 0.0);
curspeed = 0;
llSetTimerEvent(0.0);
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <curspeed,0,0> );
}
.....
changed(integer change)
{
if (change == CHANGED_LINK) {
key agent = llAvatarOnSitTarget();
if (sitagent == NULL_KEY && agent != NULL_KEY) {
sitagent = agent;
llRequestPermissions(sitagent,PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA);
llSetStatus(STATUS_PHYSICS, TRUE);
curspeed = 0;
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <curspeed,0,0> );
}
if (sitagent != NULL_KEY && agent == NULL_KEY) {
curspeed = 0;
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <curspeed,0,0> );
llSetStatus(STATUS_PHYSICS, FALSE);
llReleaseControls();
llStopAnimation("ponywalk");
llStopAnimation("ponystand");
llStopAnimation("sit");
sitagent = NULL_KEY;
}
}
}
run_time_permissions(integer perms)
{
if (perms == PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA) {
llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT,
CONTROL_UP | CONTROL_DOWN | TRUE, FALSE);
llSay(0,"Animation & Take Controls permission taken");
gotperms = TRUE;
llStopAnimation("sit");
llStartAnimation("ponystand");
}
}
control(key id, integer held, integer change)
{
vector angular_motor;
integer pressed = held & change;
integer down = held & ~change;
integer released = ~held & change;
integer inactive = ~held & ~change;
if (pressed & CONTROL_FWD) {
curspeed = curspeed + 1;
if (curspeed > 10) { curspeed = 10;}
if (curspeed == 1) {
llStopAnimation("ponystand");
llStartAnimation("ponywalk");
}
if (curspeed == 0) {
llStopAnimation("ponywalk");
llStartAnimation("ponystand");
llSetTimerEvent(0.0);
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,0> );
}
llSetTimerEvent(0.1);
}
if (pressed & CONTROL_BACK) {
curspeed = curspeed - 1;
if (curspeed < -3) { curspeed = -3;}
if (curspeed == -1) {
llStopAnimation("ponystand");
llStartAnimation("ponywalk");
}
if (curspeed == 0) {
llStopAnimation("ponywalk");
llStartAnimation("ponystand");
llSetTimerEvent(0.0);
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,0> );
}
llSetTimerEvent(0.1);
}
if(held & (CONTROL_UP))
{
angular_motor.y += 50;
}
if(down & (CONTROL_LEFT|CONTROL_ROT_LEFT)) {
if (curspeed == 0) { return;}
angular_motor.x -= PI*2;
angular_motor.z += PI*2;
}
if (down & (CONTROL_RIGHT|CONTROL_ROT_RIGHT)) {
if (curspeed == 0) { return;}
angular_motor.x += PI*2;
angular_motor.z -= PI*2;
}
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor);
}
timer()
{
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <curspeed,0,0>);
}
}