Jump to content

My vehicle won't turn... help?


Lash Carver
 Share

You are about to reply to a thread that has been inactive for 3526 days.

Please take a moment to consider if this thread is worth bumping.

Recommended Posts

key OwnerKey;
string OwnerName;
key Sitter= NULL_KEY;
key Driver = NULL_KEY;
string Anim = "crouch";

vector Linear;
vector Angular;

float       FlightForwardPower = 24;
float       FlightReversePower = 16;
float       FlightUpPower = 14;
float       FlightDownPower = 14;
float       FlightStrafePower = 12;
float       FlightTurnPower = 7;



default
{
    state_entry()
    {
        OwnerKey = llGetOwner();
        OwnerName = llKey2Name(OwnerKey);
        llSetSitText("-FLY-");
        llCollisionSound("", 0.0);
        llSitTarget(<0.8,0.0,0.65>, llEuler2Rot(<0,0,0> ));
        llSetBuoyancy(0);
    }
    
    changed(integer change)
    {
        if((change & CHANGED_LINK) == CHANGED_LINK)
        {
            Sitter = llAvatarOnSitTarget();
            if (Driver != NULL_KEY) {llUnSit(Sitter); return;}
            if (Sitter != NULL_KEY)
            {
                llRequestPermissions(OwnerKey, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA);
            }
            else
            {
                llOwnerSay("Stood up");
                llSetStatus(STATUS_PHYSICS, FALSE);
                llReleaseControls();
                llStopAnimation(Anim);
                Driver = NULL_KEY;
            }
        }
    }
    
    run_time_permissions(integer perms)
    {
        if(perms == (PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA))
        {
            Driver = Sitter;
            Linear = <0,0,0>;
            Angular = <0,0,0>;
            llStopAnimation("sit");
            llStartAnimation(Anim);
            llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_DOWN | CONTROL_UP | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);
            llSetCameraParams([
                CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive
                CAMERA_BEHINDNESS_ANGLE, 2.0, // (0 to 180) degrees
                CAMERA_BEHINDNESS_LAG, 0.1, // (0 to 3) seconds
                CAMERA_DISTANCE, 8.0, // ( 0.5 to 10) meters
                CAMERA_FOCUS_LAG, 0.1 , // (0 to 3) seconds
                CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)
                CAMERA_FOCUS_THRESHOLD, 0.5, // (0 to 4) meters
                CAMERA_PITCH, 20.0, // (-45 to 80) degrees
                CAMERA_POSITION_LAG, 0.1, // (0 to 3) seconds
                CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)
                CAMERA_POSITION_THRESHOLD, 0.5, // (0 to 4) meters
                CAMERA_FOCUS_OFFSET, <0,0,0> // <-10,-10,-10> to <10,10,10> meters
            ]);
            llSetStatus(STATUS_PHYSICS, FALSE);
        llSetPos(llGetPos() + <0,0,0.25>);
        vector rot = llRot2Euler(llGetRot());
        llSetRot(llEuler2Rot(<0,0,rot.z>));
        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, 0.5);
        
        // 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, 2.0);
        
        // hover
        llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, 0.0);
        llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, 0.0);
        llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 360.0);
        llSetVehicleFloatParam(VEHICLE_BUOYANCY, 0.988);
        
        // linear deflection
        llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.0);
        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.5);
        llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1.0);
        
        // banking
        llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 0.0);
        llSetVehicleFloatParam(VEHICLE_BANKING_MIX, 1.0);
        llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 1.0);
        
        // default rotation of local frame
        llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, <0.00000, 0.00000, 0.00000, 0.00000>);
        
        // 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);
        llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_LEFT | CONTROL_RIGHT | CONTROL_ROT_LEFT | CONTROL_ROT_RIGHT | CONTROL_UP | CONTROL_DOWN | CONTROL_LBUTTON, TRUE, FALSE);
        
        llSetStatus(STATUS_PHYSICS, TRUE);
        llSetTimerEvent(0.001);
        }
    }
    
    
    control(key name, integer levels, integer edges)
    {
        if((levels & CONTROL_LBUTTON))
        {
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,0>);
            llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <0,0,0>);
            llSetStatus(STATUS_PHYSICS, FALSE);
            llSleep(0.1);
            llSetStatus(STATUS_PHYSICS, TRUE);
            return;
        }
        
        if((edges & levels & CONTROL_UP)) Linear.z += FlightUpPower;
        else if((edges & ~levels & CONTROL_UP)) Linear.z = 0.0;
        
        if((edges & levels & CONTROL_DOWN)) Linear.z -= FlightDownPower;
        else if((edges & ~levels & CONTROL_DOWN)) Linear.z = 0.0;
        
        if((edges & levels & CONTROL_FWD)) Linear.x += FlightForwardPower;
        else if((edges & ~levels & CONTROL_FWD)) Linear.x = 0.0;
        
        if((edges & levels & CONTROL_BACK)) Linear.x -= FlightReversePower;
        else if((edges & ~levels & CONTROL_BACK)) Linear.x = 0.0;
        
        if((edges & levels & CONTROL_LEFT)) Linear.y += FlightStrafePower;
        else if((edges & ~levels & CONTROL_LEFT)) Linear.y = 0.0;
        
        if((edges & levels & CONTROL_RIGHT)) Linear.y -= FlightStrafePower;
        else if((edges & ~levels & CONTROL_RIGHT)) Linear.y = 0.0;
        
        if((edges & levels & CONTROL_ROT_LEFT)) Angular.z = FlightTurnPower;
        else if((edges & ~levels & CONTROL_ROT_LEFT)) Angular.z = 0;
        
        if((edges & levels & CONTROL_ROT_RIGHT)) Angular.z = -FlightTurnPower;
        else if((edges & ~levels & CONTROL_ROT_RIGHT)) Angular.z = 0;
    }
    
    timer()
    {
        llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, Linear);
        llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, Angular);
    }
}

 

I am terrible with vehicles, can somebody tell me why my flying vehicle can't turn?

Link to comment
Share on other sites

You are missing += on the turns in your control event.  Here it is corrected:

 

key OwnerKey;string OwnerName;key Sitter= NULL_KEY;key Driver = NULL_KEY;string Anim = "crouch";vector Linear;vector Angular;float       FlightForwardPower = 24;float       FlightReversePower = 16;float       FlightUpPower = 14;float       FlightDownPower = 14;float       FlightStrafePower = 12;float       FlightTurnPower = 7;default{    state_entry()    {        OwnerKey = llGetOwner();        OwnerName = llKey2Name(OwnerKey);        llSetSitText("-FLY-");        llCollisionSound("", 0.0);        llSitTarget(<0.8,0.0,0.65>, llEuler2Rot(<0,0,0> ));        llSetBuoyancy(0);    }        changed(integer change)    {        if((change & CHANGED_LINK) == CHANGED_LINK)        {            Sitter = llAvatarOnSitTarget();            if (Driver != NULL_KEY) {llUnSit(Sitter); return;}            if (Sitter != NULL_KEY)            {                llRequestPermissions(OwnerKey, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA);            }            else            {                llOwnerSay("Stood up");                llSetStatus(STATUS_PHYSICS, FALSE);                llReleaseControls();                llStopAnimation(Anim);                Driver = NULL_KEY;            }        }    }        run_time_permissions(integer perms)    {        if(perms == (PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA))        {            Driver = Sitter;            Linear = <0,0,0>;            Angular = <0,0,0>;            llStopAnimation("sit");            llStartAnimation(Anim);            llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_DOWN | CONTROL_UP | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);            llSetCameraParams([                CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive                CAMERA_BEHINDNESS_ANGLE, 2.0, // (0 to 180) degrees                CAMERA_BEHINDNESS_LAG, 0.1, // (0 to 3) seconds                CAMERA_DISTANCE, 8.0, // ( 0.5 to 10) meters                CAMERA_FOCUS_LAG, 0.1 , // (0 to 3) seconds                CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)                CAMERA_FOCUS_THRESHOLD, 0.5, // (0 to 4) meters                CAMERA_PITCH, 20.0, // (-45 to 80) degrees                CAMERA_POSITION_LAG, 0.1, // (0 to 3) seconds                CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)                CAMERA_POSITION_THRESHOLD, 0.5, // (0 to 4) meters                CAMERA_FOCUS_OFFSET, <0,0,0> // <-10,-10,-10> to <10,10,10> meters            ]);            llSetStatus(STATUS_PHYSICS, FALSE);        llSetPos(llGetPos() + <0,0,0.25>);        vector rot = llRot2Euler(llGetRot());        llSetRot(llEuler2Rot(<0,0,rot.z>));        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, 0.5);                // 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, 2.0);                // hover        llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, 0.0);        llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, 0.0);        llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 360.0);        llSetVehicleFloatParam(VEHICLE_BUOYANCY, 0.988);                // linear deflection        llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.0);        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.5);        llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1.0);                // banking        llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 0.0);        llSetVehicleFloatParam(VEHICLE_BANKING_MIX, 1.0);        llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 1.0);                // default rotation of local frame        llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, <0.00000, 0.00000, 0.00000, 0.00000>);                // 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);        llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_LEFT | CONTROL_RIGHT | CONTROL_ROT_LEFT | CONTROL_ROT_RIGHT | CONTROL_UP | CONTROL_DOWN | CONTROL_LBUTTON, TRUE, FALSE);                llSetStatus(STATUS_PHYSICS, TRUE);        llSetTimerEvent(0.001);        }    }            control(key name, integer levels, integer edges)    {        if((levels & CONTROL_LBUTTON))        {            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,0>);            llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <0,0,0>);            llSetStatus(STATUS_PHYSICS, FALSE);            llSleep(0.1);            llSetStatus(STATUS_PHYSICS, TRUE);            return;        }                if((edges & levels & CONTROL_UP)) Linear.z += FlightUpPower;        else if((edges & ~levels & CONTROL_UP)) Linear.z = 0.0;                if((edges & levels & CONTROL_DOWN)) Linear.z -= FlightDownPower;        else if((edges & ~levels & CONTROL_DOWN)) Linear.z = 0.0;                if((edges & levels & CONTROL_FWD)) Linear.x += FlightForwardPower;        else if((edges & ~levels & CONTROL_FWD)) Linear.x = 0.0;                if((edges & levels & CONTROL_BACK)) Linear.x -= FlightReversePower;        else if((edges & ~levels & CONTROL_BACK)) Linear.x = 0.0;                if((edges & levels & CONTROL_LEFT)) Linear.y += FlightStrafePower;        else if((edges & ~levels & CONTROL_LEFT)) Linear.y = 0.0;                if((edges & levels & CONTROL_RIGHT)) Linear.y -= FlightStrafePower;        else if((edges & ~levels & CONTROL_RIGHT)) Linear.y = 0.0;                if((edges & levels & CONTROL_ROT_LEFT)) Angular.z += FlightTurnPower;        else if((edges & ~levels & CONTROL_ROT_LEFT)) Angular.z = 0;                if((edges & levels & CONTROL_ROT_RIGHT)) Angular.z += -FlightTurnPower;        else if((edges & ~levels & CONTROL_ROT_RIGHT)) Angular.z = 0;    }        timer()    {        llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, Linear);        llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, Angular);    }}

 

Link to comment
Share on other sites

It will not turn, at all, ever. I have checked and the controls are firing and the angular is changing as expected, just nothing happens.

 

I ust found something interesting though! My vehicle is only 3 prims and this one script. Just to test, I made a block of wood and put my script inside and ta-da! works perfect. Whats wrong with my linkset!?

Link to comment
Share on other sites

There are numerous problems with this script's design.  What I've done is added in some angular motion (banking) and decay, but it is very slow.  That may be because of the airplane mode, or it may be one of your values.  Not sure.  I've also removed the timer which isn't necessary since pressing the control keys triggers a control event and updates the motors.  Keep in mind I don't recomment using this script until you've made it much more efficient.  I just slapped some fixes in it.

See more on a better way to do this script after the code window.

 

key OwnerKey;string OwnerName;key Sitter= NULL_KEY;key Driver = NULL_KEY;string Anim = "crouch";vector Linear;vector Angular;float       FlightForwardPower = 24;float       FlightReversePower = 16;float       FlightUpPower = 14;float       FlightDownPower = 14;float       FlightStrafePower = 12;float       FlightTurnPower = 7;default{    state_entry()    {        OwnerKey = llGetOwner();        OwnerName = llKey2Name(OwnerKey);        llSetSitText("-FLY-");        llCollisionSound("", 0.0);        llSitTarget(<0.8,0.0,0.65>, llEuler2Rot(<0,0,0> ));        llSetBuoyancy(0);    }        changed(integer change)    {        if((change & CHANGED_LINK) == CHANGED_LINK)        {            Sitter = llAvatarOnSitTarget();            if (Driver != NULL_KEY) {llUnSit(Sitter); return;}            if (Sitter != NULL_KEY)            {                llRequestPermissions(OwnerKey, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA);            }            else            {                llOwnerSay("Stood up");                llSetStatus(STATUS_PHYSICS, FALSE);                llReleaseControls();                llStopAnimation(Anim);                Driver = NULL_KEY;            }        }    }        run_time_permissions(integer perms)    {        if(perms == (PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA))        {            Driver = Sitter;            Linear = <0,0,0>;            Angular = <0,0,0>;            llStopAnimation("sit");            llStartAnimation(Anim);            llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_DOWN | CONTROL_UP | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);            llSetCameraParams([                CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive                CAMERA_BEHINDNESS_ANGLE, 2.0, // (0 to 180) degrees                CAMERA_BEHINDNESS_LAG, 0.1, // (0 to 3) seconds                CAMERA_DISTANCE, 8.0, // ( 0.5 to 10) meters                CAMERA_FOCUS_LAG, 0.1 , // (0 to 3) seconds                CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)                CAMERA_FOCUS_THRESHOLD, 0.5, // (0 to 4) meters                CAMERA_PITCH, 20.0, // (-45 to 80) degrees                CAMERA_POSITION_LAG, 0.1, // (0 to 3) seconds                CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)                CAMERA_POSITION_THRESHOLD, 0.5, // (0 to 4) meters                CAMERA_FOCUS_OFFSET, <0,0,0> // <-10,-10,-10> to <10,10,10> meters            ]);            llSetStatus(STATUS_PHYSICS, FALSE);        llSetPos(llGetPos() + <0,0,0.25>);        vector rot = llRot2Euler(llGetRot());        llSetRot(llEuler2Rot(<0,0,rot.z>));        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, 0.5);                // 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, 2.0);                // hover        llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, 0.0);        llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, 0.0);        llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 360.0);        llSetVehicleFloatParam(VEHICLE_BUOYANCY, 0.988);                // linear deflection        llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.0);        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.5);        llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1.0);                // banking        llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 1.0);        llSetVehicleFloatParam(VEHICLE_BANKING_MIX, 0.7);        llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 2.0);                // default rotation of local frame        llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, <0.00000, 0.00000, 0.00000, 0.00000>);                // 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);        llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_LEFT | CONTROL_RIGHT | CONTROL_ROT_LEFT | CONTROL_ROT_RIGHT | CONTROL_UP | CONTROL_DOWN | CONTROL_LBUTTON, TRUE, FALSE);                llSetStatus(STATUS_PHYSICS, TRUE);        }    }            control(key name, integer levels, integer edges)    {        if((levels & CONTROL_LBUTTON))        {            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,0>);            llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <0,0,0>);            llSetStatus(STATUS_PHYSICS, FALSE);            llSleep(0.1);            llSetStatus(STATUS_PHYSICS, TRUE);            return;        }                if((edges & levels & CONTROL_UP)) Linear.z += FlightUpPower;        else if((edges & ~levels & CONTROL_UP)) Linear.z = 0.0;                if((edges & levels & CONTROL_DOWN)) Linear.z -= FlightDownPower;        else if((edges & ~levels & CONTROL_DOWN)) Linear.z = 0.0;                if((edges & levels & CONTROL_FWD)) Linear.x += FlightForwardPower;        else if((edges & ~levels & CONTROL_FWD)) Linear.x = 0.0;                if((edges & levels & CONTROL_BACK)) Linear.x -= FlightReversePower;        else if((edges & ~levels & CONTROL_BACK)) Linear.x = 0.0;                if((edges & levels & CONTROL_LEFT)) Linear.y += FlightStrafePower;        else if((edges & ~levels & CONTROL_LEFT)) Linear.y = 0.0;                if((edges & levels & CONTROL_RIGHT)) Linear.y -= FlightStrafePower;        else if((edges & ~levels & CONTROL_RIGHT)) Linear.y = 0.0;                if((edges & levels & CONTROL_ROT_LEFT))         {                    Angular.x -= FlightTurnPower; // Added for bank, but VERY slow            Angular.z += FlightTurnPower;        }        else if((edges & ~levels & CONTROL_ROT_LEFT)) Angular.z = 0;                if((edges & levels & CONTROL_ROT_RIGHT))         {                       Angular.x += FlightTurnPower; // Added for bank, but VERY slow            Angular.z -= FlightTurnPower;        }        else if((edges & ~levels & CONTROL_ROT_RIGHT)) Angular.z = 0;                llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, Linear);        llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, Angular);        llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 999.0); // Quick decay                          llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 999.0); // Quick decay    }}

 

The following recommendations come directly from code that can be found at the Vehicle Laboratory in-world.  I highly suggest you visit there for some more detailed insights into vehicle scripts.  It can be found via search.

(1) The first thing I would do is make your motion/speed values into vectors instead of floats, so you can add them together in one fell swoop, rather than adding piecemeal.

(2) Set up bitwise integers for linear and angular controls.  Store the controls pertaining to each.

(3) Use the bitwise integers in (2) above to test for linear or angular key presses in your control event, then add all values together for the respective keys being pressed and pass them to your linear and angular motors.  The nice thing about this is you only send to the specific motor you're pressing keys for, because of that bitwise integer you set up in (2).

For a complete example of all three, go to the Vehicle Laboratory and grab a few of the sample scripts, you'll see exactly what I mean here and you'll see how much more efficient it is.

Link to comment
Share on other sites

Yeah it's still very early but I was hoping to get the basic movement working, then work on cleaning stuff up a bit. Thanks for all the continued help!

 

I recreated my vehicle linkset and it's magically working now. Really not sure what broke my other build.

Link to comment
Share on other sites

See the end of my post, under the script.  I did not post the code because it's not mine to post, but the code is free to anyone that visits the Vehicle Laboratory.  It's saved me a lot of headache learning vehicles and it's super-efficient.  I just visited a bit ago, his place is in disarray at the moment, but he does have the vehicle scripts available if you look.  Take the balloon to the vehicle laboratory.

Go here and grab the hovercraft and airplane examples.  You'll learn a lot.  He has other examples too, boat, submarine, etc.

http://maps.secondlife.com/secondlife/Slate/185/62/259

 

Glad to hear it started working for you.

Link to comment
Share on other sites

ugh ok no idea where to even start looking at the lab. The signs point into the ground, the map shows a completely different layout...etc. Where is an example script?!

 

EDIT: Nevermind, thanks for the surl! lol perfect :) they are definitly smooth!

Link to comment
Share on other sites

Yeah, it's a mess there right now.  Glad you found them.

I don't think you can do a vehicle script any more efficient than those examples, the way the controls are handled. 

When I wanted to learn I had two choices--either use the wiki and learn the settings through trial and error or find examples I could learn off of.  After finding VLAB, I was able to grasp the settings a lot easier and write my own vehicle script.

I grabbed all the notecards and examples a year or two ago, when everything was still in place at VLAB.  I dropped you a folder in-world with all the goodies.  It should help.

Link to comment
Share on other sites

i just pick up on this part in the change event

 

if (Sitter != NULL_KEY)            {                llRequestPermissions(OwnerKey, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA);            }

 

the script as wrote is asking perms of the Owner rather than the Sitter

Link to comment
Share on other sites

You are about to reply to a thread that has been inactive for 3526 days.

Please take a moment to consider if this thread is worth bumping.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share

×
×
  • Create New...