Script:Files:script/vehicles/cockpits/basic.script

From Mod Wiki
object vehicle_cockpit_light {
    void                init();

    void                Idle();

    entity                myVehicle;
    entity                myCockpit;
}

void vehicle_cockpit_light::init() {        
    setOrigin( getVectorKey( "origin" ) );
    bind( myVehicle );

    setState( "Idle" );
}

void vehicle_cockpit_light::Idle() {
    turnOn();
    while ( true ) {
        if ( myVehicle == $null_entity || myCockpit == $null_entity ) {
            remove();
        }

        sys.waitFrame();
    }
}




object vehicle_basic_cockpit {
    void                preinit();
    void                init();

    void                Idle();
    void                Idle_Jointed();
    void                Idle_View();    

    void                OnCockpitSetup( entity v );

    void                OnEntered() { ; }

    void                StartEMPEffect();
    void                StopEMPEffect();

    handle                empEffect;

    entity                myVehicle;
    float                jointHandle;
    vector                largeFov;

    boolean                noEmpEffects;

    vector                offset;
    float                passengerId;
}

void vehicle_basic_cockpit::preinit() {
    offset = getVectorKey( "offset" );
    largeFov = getVectorKey( "largeFov" );
    noEmpEffects = getIntKey( "no_emp_effects" );
    empEffect = 0;
}

void vehicle_basic_cockpit::init() {
    string climateSkinKey = getKey( "climate_skin_key" );
    if ( climateSkinKey != "" ) {
        setSkin( sys.getClimateSkin( "skin_" + climateSkinKey ) );
    }

    jointHandle = myVehicle.getJointHandle( getKey( "joint_attach" ) );
    passengerId    = getFloatKey( "passenger_id" ) - 1;

    // create the lights
    float i = 1;
    while ( 1 ) {
        string lightDefName = getKey( "def_light" + i );
        if ( lightDefName == "" ) {
            break;
        }

        vehicle_cockpit_light light = sys.spawnClient( lightDefName );
        if ( light != $null_entity ) {
            light.myVehicle = myVehicle;
            light.myCockpit = self;
        }
        i++;
    }

    OnEntered();

    if ( passengerId != -1 && !getFloatKey( "force_joint_idle" ) ) {
        setState( "Idle_View" );
    }

    if ( jointHandle == INVALID_JOINT ) {
        jointHandle = myVehicle.getJointHandle( "origin" );
    }
    if ( jointHandle == INVALID_JOINT ) {
        setState( "Idle" );
    }
    setState( "Idle_Jointed" );
}

void vehicle_basic_cockpit::StartEMPEffect() {
    if ( empEffect ) {
        return;
    }

    empEffect = playEffect( "fx_emped", getKey( "joint_fx_emped" ), 0 );
}

void vehicle_basic_cockpit::StopEMPEffect() {
    if ( !empEffect ) {
        return;
    }

    stopEffectHandle( empEffect );
    empEffect = 0;
}

void vehicle_basic_cockpit::Idle_Jointed() {
    while ( true ) {        
        vector localOffset = offset;
        float fov = sys.getDefaultFov();
        if ( fov > 90.f ) {
            float val = (fov - 90.f) / (110.f-90.f);
            if ( val > 1.f ) {
                val = 1.f;
            }
            localOffset = localOffset + val * largeFov;
        }
        vector jointOrigin = myVehicle.getJointPos( jointHandle );
        vector jointAngles = myVehicle.getJointAngle( jointHandle );
        vector worldOffset = sys.rotateVecByAngles( localOffset, jointAngles );
        setOrigin( jointOrigin + worldOffset );
        setAngles( jointAngles );

        if ( !noEmpEffects ) {
            if ( myVehicle.isWeaponEMPed() ) {
                StartEMPEffect();
            } else {
                StopEMPEffect();
            }
        }

        sys.waitFrame();
    }
}

void vehicle_basic_cockpit::Idle() {
    while ( true ) {
        vector localOffset = offset;
        float fov = sys.getDefaultFov();
        if ( fov > 90.f ) {
            float val = (fov - 90.f) / (110.f-90.f);
            if ( val > 1.f ) {
                val = 1.f;
            }
            localOffset = localOffset + val * largeFov;
        }
        vector jointOrigin = myVehicle.getWorldOrigin();
        vector jointAngles = myVehicle.getAngles();
        vector worldOffset = sys.rotateVecByAngles( localOffset, jointAngles );
        setOrigin( jointOrigin + worldOffset );
        setAngles( jointAngles );

        if ( !noEmpEffects ) {
            if ( myVehicle.isWeaponEMPed() ) {
                StartEMPEffect();
            } else {
                StopEMPEffect();
            }
        }

        sys.waitFrame();
    }
}

void vehicle_basic_cockpit::Idle_View() {
    entity p = myVehicle.getPositionPlayer( passengerId );

    while ( true ) {        
        vector localOffset = offset;
        float fov = sys.getDefaultFov();
        if ( fov > 90.f ) {
            float val = (fov - 90.f) / (110.f-90.f);
            if ( val > 1.f ) {
                val = 1.f;
            }
            localOffset = localOffset + val * largeFov;
        }
        vector jointOrigin = p.getViewOrigin();
        vector jointAngles = p.getRenderViewAngles();        
        vector worldOffset = sys.rotateVecByAngles( localOffset, jointAngles );

        setOrigin( jointOrigin + worldOffset );
        setAngles( jointAngles );

        if ( !noEmpEffects ) {
            if ( myVehicle.isWeaponEMPed() ) {
                StartEMPEffect();
            } else {
                StopEMPEffect();
            }
        }

        sys.waitFrame();
    }
}

void vehicle_basic_cockpit::OnCockpitSetup( entity v ) {
    myVehicle    = v;
}