IW4-Dump-Files/animscripts/hummer_turret/minigun_code.gsc

180 lines
4.5 KiB
Plaintext

#include maps\_utility;
#include common_scripts\utility;
#include animscripts\hummer_turret\common;
main( turret )
{
turret.fireInterval = 0.1; // time between shots
turret.closeEnoughAimDegrees = 45; // how many degrees away from aiming exactly at the target should we be before we start doing "on/near target" stuff
turret.fireControllerFunc = ::fireController_minigun; // the function that tells the turret how exactly to shoot when the fireDirector tells it that it should be firing
turret.specialCleanupFunc = ::minigun_cleanup_func; // gets called when the turret is no longer in use
turret.default_drop_pitch = 20;
humvee_turret_init( turret, "minigun" );
wait( 0.05 );
turret notify( "turret_ready" );
}
minigun_cleanup_func( gunner, turret )
{
if ( turret GetBarrelSpinRate() > 0 )
{
turret StopBarrelSpin();
}
}
// controls spinning & firing the minigun, responding to commands from fireDirector()
fireController_minigun( turret )
{
self endon( "death" );
self endon( "dismount" );
assert( isdefined( turret ) );
turret endon( "kill_fireController" );
turret endon( "death" );
// "extra" fire time makes the operator look like he has human reaction time
turret.extraFireTime_min = 600; // ms
turret.extraFireTime_max = 900;
startFireTime = -1;
ceaseFireTime = undefined;
extraFireTime = undefined;
// extra spin time makes it look like the operator is scanning for more targets
turret.extraSpinTime_min = 250;
turret.extraSpinTime_max = 2250;
startExtraSpinningTime = -1;
extraSpinTime = undefined;
isFiring = false;
isSpinning = false;
// the weapon will need periodic operator "maintenance"
turret.secsOfFiringBeforeReload = 15; // secs
turret.fireTime = 0;
self DoAim( turret );
while ( 1 )
{
// if we're supposed to be firing but we're not, and if we're not doing a custom anim...
if ( turret.doFiring && !isFiring && !self.isCustomAnimating )
{
isFiring = true;
// spin the barrel if need be
if ( !isSpinning )
{
//println( "start spin" );
turret minigun_spinup();
isSpinning = true;
}
// start firing
//println( "start firing" );
turret notify( "startfiring" );
startFireTime = GetTime();
self DoShoot( turret );
wait( 0.05 ); // let the shooting thread start before potentially killing it on the same frame
}
// if we're currently not supposed to be firing but still actually are...
else if ( !turret.doFiring && isFiring )
{
if ( !IsDefined( ceaseFireTime ) )
{
ceaseFireTime = GetTime(); // time when the turret stops firing
}
if ( !IsDefined( extraFireTime ) )
{
extraFireTime = RandomFloatRange( turret.extraFireTime_min, turret.extraFireTime_max );
}
// have we fired long enough after being told to stop?
if ( GetTime() - ceaseFireTime >= extraFireTime )
{
isFiring = false;
//println( "stop firing" );
self DoAim( turret );
startExtraSpinningTime = GetTime();
// reset counters
ceaseFireTime = undefined;
extraFireTime = undefined;
}
}
// if all we're still doing is spinning...
else if ( !turret.doFiring && !isFiring && isSpinning )
{
if ( !IsDefined( extraSpinTime ) )
{
extraSpinTime = RandomFloatRange( turret.extraSpinTime_min, turret.extraSpinTime_max );
}
// stop spin immediately for custom anims, or wait for extra spin time
if ( self.isCustomAnimating || ( GetTime() - startExtraSpinningTime >= extraSpinTime ) )
{
//println( "stop spin" );
turret StopBarrelSpin();
isSpinning = false;
extraSpinTime = undefined; // reset
}
}
if ( turret.turretstate == "fire" )
turret.fireTime += 0.05;// ( GetTime() - startFireTime ) / 1000;
if ( turret.fireTime > turret.secsOfFiringBeforeReload )
{
//println( "reload" );
turret.doFiring = false;
isFiring = false;
self DoAim( turret );
startExtraSpinningTime = -1;
ceaseFireTime = undefined;
extraFireTime = undefined;
self thread DoReload( turret );
turret.fireTime = 0; // reset counter
}
wait( 0.05 );
if ( !isdefined( turret ) )
break;
}
}
// spins the minigun up to the full rate needed to fire
minigun_spinup()
{
if ( self GetBarrelSpinRate() == 1 )
{
return;
}
self StartBarrelSpin();
while ( self GetBarrelSpinRate() < 1 )
{
wait( 0.05 );
}
}
//=====================================
// SRS TEMP - so I don't clutter generic_human with stuff I'm not using atm
/*
humveeGunner : complete nonloopsync
{
//humvee_turret_2_passenger
//humvee_turret_duck
//humvee_turret_duck_left
//humvee_turret_duck_right
//humvee_turret_death
}
*/