Scripting vehicles gives me the headache... Because I was not able to create one from the scratch I used the script of an existing free vehicle (Klintel Kiesler's Skyjet) and edited it to my needs. The only vehicle setting I changed is removing the VEHICLE_REFERENCE_FRAME because my object is already correctly aligned.
Linear moving on the X, Y and Z axis works correctly but rotating don't work at all. I've added a debugging text output in the timer function which is responsible for setting the VEHICLE_ANGULAR_MOTOR_DIRECTION. The output correctly shows changing numbers but the vehicle don't rotate a bit.
I'm happy for any tip what I can do to fix this. Here is the flight control script:
CODE
key pilot;
key passenger;
vector linear;
vector angular;
default
{
state_entry()
{
linear = ZERO_VECTOR;
angular = ZERO_VECTOR;
llCollisionSound("", 0.0);
llSetCameraEyeOffset(<-8.0, 0, 5>);
llSetCameraAtOffset(<0.0, 0.0, 0>);
llSetVehicleType(VEHICLE_TYPE_AIRPLANE);
// Linear friction
llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE,
<100.0, 100.0, 100.0>);
// Uniform angular friction
llSetVehicleFloatParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, 10);
// Linear motor
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION,
<0.0, 0.0, 0.0>);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 1.0);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 1.0);
// Angular motor
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION,
<0.0, 0.0, 0.0>);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 1.0);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 22.0);
// Hover
llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, 0.0);
llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, 0.0);
llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 360.0);
llSetVehicleFloatParam(VEHICLE_BUOYANCY, 0.981);
// Linear deflection
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 1.0);
// Angular deflection
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.25);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 100.0);
// Vertical attractor
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.75);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1.0);
// Banking
llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 0.0);
llSetVehicleFloatParam(VEHICLE_BANKING_MIX, 1.0);
llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 360.0);
// default rotation of local frame
llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, ZERO_ROTATION);
// Removed vehicle flags
llRemoveVehicleFlags(VEHICLE_FLAG_NO_DEFLECTION_UP
| VEHICLE_FLAG_HOVER_WATER_ONLY
| VEHICLE_FLAG_HOVER_TERRAIN_ONLY
| VEHICLE_FLAG_HOVER_UP_ONLY
| VEHICLE_FLAG_LIMIT_MOTOR_UP
| VEHICLE_FLAG_LIMIT_ROLL_ONLY);
// Set vehicle flags
llSetVehicleFlags(VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT);
llSetTimerEvent(0.05);
}
on_rez(integer start_param)
{
llResetScript();
}
link_message(integer sender, integer num, string str, key id)
{
if (str == "sit pilot")
{
linear = ZERO_VECTOR;
angular = ZERO_VECTOR;
llRequestPermissions(id, PERMISSION_TAKE_CONTROLS);
pilot = id;
}
else if (str == "unsit pilot")
{
llSetStatus(STATUS_PHYSICS, FALSE);
pilot = NULL_KEY;
llReleaseControls();
}
else if (str == "sit passenger")
{
passenger = id;
}
else if (str == "unsit passenger")
{
passenger = NULL_KEY;
}
}
run_time_permissions(integer permissions)
{
if (permissions & PERMISSION_TAKE_CONTROLS)
{
vector current_pos;
llTakeControls(CONTROL_FWD
| CONTROL_BACK
| CONTROL_LEFT
| CONTROL_RIGHT
| CONTROL_ROT_LEFT
| CONTROL_ROT_RIGHT
| CONTROL_UP
| CONTROL_DOWN
| CONTROL_LBUTTON, TRUE, FALSE);
current_pos = llGetPos();
llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, current_pos.z);
llSetStatus(STATUS_PHYSICS, TRUE);
}
}
control(key id, integer levels, integer edges)
{
// Control upward movement
if ((edges & levels & CONTROL_UP))
{
linear.z += 12.0;
}
else if ((edges & ~levels & CONTROL_UP))
{
linear.z -= 12.0;
}
// Control downward movement
if ((edges & levels & CONTROL_DOWN))
{
linear.z -= 12.0;
}
else if ((edges & ~levels & CONTROL_DOWN))
{
linear.z += 12.0;
}
// Control forward movement
if ((edges & levels & CONTROL_FWD))
{
linear.x += 14.0;
}
else if ((edges & ~levels & CONTROL_FWD))
{
linear.x -= 14.0;
}
// Control backward movement
if ((edges & levels & CONTROL_BACK))
{
linear.x -= 14.0;
}
else if ((edges & ~levels & CONTROL_BACK))
{
linear.x += 14.0;
}
// Control left movement
if ((edges & levels & CONTROL_LEFT))
{
linear.y += 8.0;
}
else if ((edges & ~levels & CONTROL_LEFT))
{
linear.y -= 8.0;
}
// Control right movement
if ((edges & levels & CONTROL_RIGHT))
{
linear.y -= 8.0;
}
else if ((edges & ~levels & CONTROL_RIGHT))
{
linear.y += 8.0;
}
// Control rotate left movement
if ((edges & levels & CONTROL_ROT_LEFT))
{
angular.z += (PI / 180) * 90.0;
angular.x -= PI * 6;
}
else if ((edges & ~levels & CONTROL_ROT_LEFT))
{
angular.z -= (PI / 180) * 90.0;
angular.x += PI * 6;
}
// Control rotate right movement
if ((edges & levels & CONTROL_ROT_RIGHT))
{
angular.z -= (PI / 180) * 120.0;
angular.x += PI * 6;
}
else if ((edges & ~levels & CONTROL_ROT_RIGHT))
{
angular.z += (PI / 180) * 120.0;
angular.x -= PI * 6;
}
}
timer()
{
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, linear);
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular);
llSetText((string) angular, <1.0,1.0,1.0>, 1.0);
}
}