180 lines
4.5 KiB
Plaintext
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
|
|
}
|
|
*/
|