Script:Files:script/vehicles/weapons/gpmg.script

From Mod Wiki
object vehicle_weapon_gpmg : vehicle_weapon_base {
    void                preinit();
    void                init();
    void                destroy();

    void                Idle();
    void                Fire();

    void                OnSetPlayer( entity p );

    string                muzzleFlashFX;
    string                muzzleSound;
    string                muzzleSoundLocal;

    float                fireRate;
    float                spread;

    float                projectileIndex;

    float                jointHandle;

    float                tracerCounter;
    float                tracerInterval;

    float                localSurface;

    entity                vehicle;

    boolean                playingOverheat;

    entity                muzzleFX;
    float                lastMuzzleFX;
    float                muzzleFlashInterval;
}

void vehicle_weapon_gpmg::preinit() {
    muzzleFlashFX            = getKey( "muzzle_flash" );
    muzzleSound                = getKey( "muzzle_sound" );
    muzzleSoundLocal        = getKey( "muzzle_sound" );

    fireRate                = getFloatKey( "fire_rate" );
    spread                    = getFloatKey( "spread" );

    projectileIndex            = GetEntityDef( getKey( "def_projectile" ) );

    localSurface            = -1;

    vehicle                    = getVehicle();

    string localSurfaceName    = getKey( "surface_name" );
    if ( localSurfaceName != "" ) {
        localSurface = vehicle.getSurfaceId( localSurfaceName );
    }

    jointHandle                = vehicle.getJointHandle( getKey( "muzzle" ) );
    tracerCounter            = 0;
    tracerInterval            = sys.getEntityDefIntKey( projectileIndex, "tracer_interval" );
    muzzleFlashInterval        = vehicle.getFloatKeyWithDefault( "muzzle_flash_interval", 0.5f );
}

void vehicle_weapon_gpmg::init() {
}

void vehicle_weapon_gpmg::destroy() {
    if ( muzzleFX != $null_entity ) {
        muzzleFX.unbind();
        muzzleFX.endEffect( true );
        muzzleFX = $null_entity;
    }
}

void vehicle_weapon_gpmg::Idle() {
    SetCrosshair();

    while ( true ) {
        sys.waitFrame();

        UpdateCharge();

        if ( user != $null_entity ) {
            user.proxyFiringWeaponStart = false;
            if ( user.getButton( PK_ATTACK ) && !myVehicle.isWeaponEMPed() ) {
                if ( CanRemoveCharge() ) {
                    if ( sys.getTime() >= fireDelayTime ) {
                        user.proxyFiringWeaponStart = true;
                        if ( sys.getTime() >= reFireTime ) {
                            playingOverheat = false;
                            setState( "Fire" );
                        }
                    } else {
                        if ( !playingOverheat ) {
                            vehicle.startSound( "snd_gpmg_overheat", SND_WEAPON_FIRE_LOCAL );
                            playingOverheat = true;
                        }
                    }
                }
            } else if ( muzzleFX != $null_entity ) {
                muzzleFX.unbind();
                muzzleFX.endEffect( true );
                muzzleFX = $null_entity;
            }
        }
    }
}

void vehicle_weapon_gpmg::Fire() {
    boolean showMuzzle = true;

    RemoveCharge();

    if ( localSurface != -1 ) {
        if ( vehicle.isSurfaceHidden( localSurface ) ) {
            showMuzzle = false;
        }
    }

    float forceTracer = TRACER_CHANCE;
    if ( tracerInterval > 0 ) {
        if ( tracerCounter % tracerInterval == 0 ) {
            forceTracer = TRACER_FORCE;
        }
    }

    vehicle.launchBullet( user, vehicle, projectileIndex, spread, vehicle.getJointPos( jointHandle ), vehicle.getJointAxis( jointHandle, 0 ), forceTracer, true );

    if ( showMuzzle ) {
        if ( sys.getTime() - lastMuzzleFX > muzzleFlashInterval ) {
            if ( muzzleFX != $null_entity ) {
                muzzleFX.unbind();
                muzzleFX.endEffect( false );
                muzzleFX = $null_entity;
            }

            // spawn explicitly so we can get an entity to call endEffect on.
            muzzleFX = vehicle.spawnClientEffect( muzzleFlashFX );
            if ( muzzleFX != $null_entity ) {
                muzzleFX.bindToJoint( vehicle, getKey( "muzzle" ), 1 );
            }

            lastMuzzleFX = sys.getTime();
        }
    }

    if( user == sys.getLocalPlayer() ) {
        vehicle.playJointEffect( muzzleSoundLocal, jointHandle, 0 );
    } else {
        vehicle.playJointEffect( muzzleSound, jointHandle, 0 );
    }

    AddReFireDelay( fireRate );

    tracerCounter++;

    GoToIdle();
}

void vehicle_weapon_gpmg::OnSetPlayer( entity p ) {
    OnSetPlayer_Base( p );
    if ( muzzleFX != $null_entity ) {
        muzzleFX.unbind();
        muzzleFX.endEffect( true );
        muzzleFX = $null_entity;
    }
}