Script:Files:script/vehicles/platypus.script

From Mod Wiki
object vehicle_platypus : vehicle_base {
    void            preinit();
    void            init();

    void            OnCollision( object traceObject, float velocity, vector mins, vector maxs );

    void            OnWeaponSelected( entity p, float index );

    void            OnPlayerEntered( entity p, float position );

    void            DriverAnimThread();

    float            driverAnimThread;

    float            steerJoint;
    float            throttleJoint;
}

void vehicle_platypus::preinit() {
    driverAnimThread = -1;

    steerJoint = getJointHandle( getKey( "joint_steer" ) );
    throttleJoint = getJointHandle( getKey( "joint_throttle" ) );
}

void vehicle_platypus::init() {
    setLightsEnabled( 0, false );
}

void vehicle_platypus::OnCollision( object traceObject, float velocity, vector mins, vector maxs ) {
    OnCollision_Base( traceObject, velocity, mins, maxs );
}

void vehicle_platypus::OnWeaponSelected( entity p, float index ) {
    if ( index == 0 ) {
        FireDecoy( p );
    }
}

void vehicle_platypus::OnPlayerEntered( entity p, float position ) {
    OnPlayerEntered_Base( p, position );

    if ( position == 0 ) {
        if ( driverAnimThread == -1 ) {
            driverAnimThread = thread DriverAnimThread();
        }
    }
}

#define PLATYPUS_STEER_SPEED 3.f
#define PLATYPUS_STEER_LIMIT 60.f
#define PLATYPUS_STEER_AXIS steerAngles_x

#define PLATYPUS_THROTTLE_SPEED 1.f
#define PLATYPUS_THROTTLE_LIMIT 30.f
#define PLATYPUS_THROTTLE_AXIS throttleAngles_y

void vehicle_platypus::DriverAnimThread() {
    vector steerAngles;
    vector throttleAngles;

    while ( true ) {
        entity driver = getDriver();

        vector input;
        if ( driver == $null_entity ) {
            if ( PLATYPUS_STEER_AXIS == 0.f && PLATYPUS_THROTTLE_AXIS == 0.f ) {
                break;
            }
            input = '0 0 0';
        } else {
            input = driver.getMove();
        }

        if ( input_x > 0.f ) {
            PLATYPUS_THROTTLE_AXIS += PLATYPUS_THROTTLE_SPEED;
            if ( PLATYPUS_THROTTLE_AXIS > PLATYPUS_THROTTLE_LIMIT ) {
                PLATYPUS_THROTTLE_AXIS = PLATYPUS_THROTTLE_LIMIT;
            }
        } else if ( input_x < 0.f ) {
            PLATYPUS_THROTTLE_AXIS -= PLATYPUS_THROTTLE_SPEED;
            if ( PLATYPUS_THROTTLE_AXIS < -PLATYPUS_THROTTLE_LIMIT ) {
                PLATYPUS_THROTTLE_AXIS = -PLATYPUS_THROTTLE_LIMIT;
            }
        } else {
            if ( PLATYPUS_THROTTLE_AXIS > 0.f ) {
                PLATYPUS_THROTTLE_AXIS -= PLATYPUS_THROTTLE_SPEED;
                if ( PLATYPUS_THROTTLE_AXIS < 0.f ) {
                    PLATYPUS_THROTTLE_AXIS = 0.f;
                }
            } else if ( PLATYPUS_THROTTLE_AXIS < 0.f ) {
                PLATYPUS_THROTTLE_AXIS += PLATYPUS_THROTTLE_SPEED;
                if ( PLATYPUS_THROTTLE_AXIS > 0.f ) {
                    PLATYPUS_THROTTLE_AXIS = 0.f;
                }
            }
        }

        if ( input_y < 0.f ) {
            PLATYPUS_STEER_AXIS += PLATYPUS_STEER_SPEED;
            if ( PLATYPUS_STEER_AXIS > PLATYPUS_STEER_LIMIT ) {
                PLATYPUS_STEER_AXIS = PLATYPUS_STEER_LIMIT;
            }
        } else if ( input_y > 0.f ) {
            PLATYPUS_STEER_AXIS -= PLATYPUS_STEER_SPEED;
            if ( PLATYPUS_STEER_AXIS < -PLATYPUS_STEER_LIMIT ) {
                PLATYPUS_STEER_AXIS = -PLATYPUS_STEER_LIMIT;
            }
        } else {
            if ( PLATYPUS_STEER_AXIS > 0.f ) {
                PLATYPUS_STEER_AXIS -= PLATYPUS_STEER_SPEED;
                if ( PLATYPUS_STEER_AXIS < 0.f ) {
                    PLATYPUS_STEER_AXIS = 0.f;
                }
            } else if ( PLATYPUS_STEER_AXIS < 0.f ) {
                PLATYPUS_STEER_AXIS += PLATYPUS_STEER_SPEED;
                if ( PLATYPUS_STEER_AXIS > 0.f ) {
                    PLATYPUS_STEER_AXIS = 0.f;
                }
            }
        }

        setJointAngle( steerJoint, JOINTMOD_LOCAL, steerAngles );
        setJointAngle( throttleJoint, JOINTMOD_LOCAL, throttleAngles );

        sys.waitFrame();
    }

    driverAnimThread = -1;
}