etqw-sdk/base/script/vehicles/weapons/antiair.script

281 lines
6.9 KiB
Plaintext

object vehicle_weapon_gatling : vehicle_weapon_base {
void preinit();
void init();
void Fire();
void SpinBarrels();
void IdleEmpty();
void OnSetPlayer( entity p );
float projectileIndex;
float clientProjectileIndex;
float jointHandle;
float spinHandle;
float fireRate;
float triggerDelay;
float spread;
float nextFireTime;
float spinSpeed;
float spinStop;
float spinFire;
entity vehicle;
float localSurface;
boolean playingFireSound;
boolean spinBarrelsActive;
boolean brassSoundActive;
boolean wantsFire;
string muzzleFlashFX;
string fireStartSound;
string fireStopSound;
string barrelLoopSound;
string barrelLoopLowSound;
string brassStartSound;
string brassStopSound;
float barrelSoundChannel;
float barrelLowSoundChannel;
float fireSoundChannel;
float brassSoundChannel;
float showTracer;
}
void vehicle_weapon_gatling::preinit() {
projectileIndex = GetEntityDef( getKey( "def_projectile" ) );
clientProjectileIndex = GetEntityDef( getKey( "client_projectile" ) );
vehicle = getVehicle();
jointHandle = vehicle.getJointHandle( getKey( "muzzle" ) );
spinHandle = vehicle.getJointHandle( getKey( "spin_joint" ) );
muzzleFlashFX = getKey( "muzzle_flash" );
fireStartSound = getKey( "fire_start_sound" );
fireStopSound = getKey( "fire_stop_sound" );
barrelLoopSound = getKey( "barrel_loop_sound" );
barrelLoopLowSound = getKey( "barrel_loop_low_sound" );
brassStartSound = getKey( "brass_start_sound" );
brassStopSound = getKey( "brass_stop_sound" );
barrelSoundChannel = getFloatKey( "sound_channel_barrel" );
if ( barrelSoundChannel == 0 ) {
barrelSoundChannel = SND_WEAPON_MECH;
}
barrelLowSoundChannel = getFloatKey( "sound_channel_barrel_low" );
if ( barrelLowSoundChannel == 0 ) {
barrelLowSoundChannel = SND_WEAPON_MOVE;
}
fireSoundChannel = getFloatKey( "sound_channel_fire" );
if ( fireSoundChannel == 0 ) {
fireSoundChannel = SND_WEAPON_FIRE;
}
brassSoundChannel = getFloatKey( "sound_channel_brass" );
if ( brassSoundChannel == 0 ) {
brassSoundChannel = SND_WEAPON_BRASS;
}
fireRate = getFloatKey( "fire_rate" );
triggerDelay = getFloatKey( "trigger_delay" );
spread = getFloatKey( "spread" );
spinStop = getFloatKey( "spin_stop" );
spinFire = getFloatKey( "spin_fire" );
localSurface = -1;
string localSurfaceName = getKey( "surface_name" );
if ( localSurfaceName != "" ) {
localSurface = vehicle.getSurfaceId( localSurfaceName );
}
showTracer = TRACER_CHANCE;
}
void vehicle_weapon_gatling::init() {
}
void vehicle_weapon_gatling::IdleEmpty() {
if ( playingFireSound ) {
playingFireSound = false;
vehicle.startSound( fireStopSound, fireSoundChannel );
}
if ( brassSoundActive ) {
brassSoundActive = false;
vehicle.startSound( brassStopSound, brassSoundChannel );
}
}
void vehicle_weapon_gatling::Fire() {
boolean showMuzzle;
playingFireSound = false;
if ( !spinBarrelsActive ) {
thread SpinBarrels();
}
float startFiringTime = sys.getTime() + triggerDelay;
wantsFire = true;
while ( user.getButton( PK_ATTACK ) && !myVehicle.isWeaponEMPed() && CanRemoveCharge() ) {
if ( spinSpeed < spinFire ) {
sys.waitFrame();
continue;
}
user.proxyFiringWeapon = true;
showMuzzle = true;
if ( localSurface != -1 ) {
if ( vehicle.isSurfaceHidden( localSurface ) ) {
showMuzzle = false;
showTracer = TRACER_OFF;
} else {
showTracer = TRACER_CHANCE;
}
}
UpdateCharge();
if ( !playingFireSound ) {
playingFireSound = true;
vehicle.startSound( fireStartSound, fireSoundChannel );
if ( user == sys.getLocalViewPlayer() ) {
vehicle.startSound( brassStartSound, brassSoundChannel );
brassSoundActive = true;
}
}
if ( sys.getTime() >= nextFireTime ) {
vehicle.launchBullet( user, vehicle, projectileIndex, spread, vehicle.getJointPos( jointHandle ), vehicle.getJointAxis( jointHandle, 0 ), showTracer, true );
nextFireTime = sys.getTime() + fireRate;
RemoveCharge();
}
if ( showMuzzle ) {
vehicle.playJointEffect( muzzleFlashFX, jointHandle, 0 );
}
sys.waitFrame();
}
wantsFire = false;
if ( user != $null_entity ) {
user.proxyFiringWeapon = false;
}
if ( playingFireSound ) {
playingFireSound = false;
vehicle.startSound( fireStopSound, fireSoundChannel );
}
if ( brassSoundActive ) {
brassSoundActive = false;
vehicle.startSound( brassStopSound, brassSoundChannel );
}
GoToIdle();
}
void vehicle_weapon_gatling::OnSetPlayer( entity p ) {
if ( p != user ) {
if ( user != $null_entity ) {
user.gatlingSpeed = 0.0f;
}
wantsFire = false;
}
OnSetPlayer_Base( p );
}
void vehicle_weapon_gatling::SpinBarrels() {
spinBarrelsActive = true;
vector ang;
vehicle.startSound( barrelLoopLowSound, barrelLowSoundChannel );
vehicle.fadeSound( barrelLowSoundChannel, -20.0f, 0.0f );
vehicle.startSound( barrelLoopSound, barrelSoundChannel );
vehicle.fadeSound( barrelSoundChannel, -20.0f, 0.0f );
// start & end pitch for the main loop sound
float basePitch = 0.4f;
float maxPitch = 0.8f;
// start & end pitch for the low loop sound
float basePitchLow = 1.0f;
float maxPitchLow = 1.5f;
float pitchRange = maxPitch - basePitch;
float pitchRangeLow = maxPitchLow - basePitchLow;
while ( true ) {
sys.waitFrame();
if ( wantsFire ) {
if ( spinSpeed < spinFire ) {
if ( spinSpeed < spinStop ) {
spinSpeed = spinStop;
}
spinSpeed = spinSpeed + 90.f;
} else {
spinSpeed = spinFire;
}
} else {
if ( spinSpeed > spinStop ) {
spinSpeed = spinSpeed - 30.f;
}
if ( spinSpeed <= spinStop ) {
spinSpeed = 0.f;
}
}
if ( user != $null_entity ) {
user.gatlingSpeed = spinSpeed;
}
ang_z += spinSpeed * sys.getFrameTime();
vehicle.setJointAngle( spinHandle, JOINTMOD_LOCAL, ang );
float fraction = ( spinSpeed - spinStop ) / ( spinFire - spinStop );
if ( fraction < 0.0f ) {
fraction = 0.0f;
}
float pitch = fraction * pitchRange + basePitch;
vehicle.setChannelPitchShift( barrelSoundChannel, pitch );
float pitchLow = fraction * pitchRangeLow + basePitchLow;
vehicle.setChannelPitchShift( barrelLowSoundChannel, pitchLow );
float volume = sys.sqrt( sys.sin( fraction * 90 ) ) * 20.0f - 20.0f;
vehicle.fadeSound( barrelSoundChannel, volume, 0.0f );
float volumeLow = sys.sqrt( sys.sin( ( 1.0f - fraction ) * 90 ) ) * 5.0f - 5.0f;
vehicle.fadeSound( barrelLowSoundChannel, volumeLow, 0.0f );
if ( spinSpeed == 0.0f ) {
break;
}
}
// fade the sounds out
vehicle.fadeSound( barrelSoundChannel, -60.0f, 0.25f );
vehicle.fadeSound( barrelLowSoundChannel, -60.0f, 0.25f );
spinBarrelsActive = false;
}