etqw-sdk/base/script/weapons/assaultrifle_gren.script

371 lines
8.1 KiB
Plaintext

//
// assaultrifle_gren.script
//
object weapon_assaultrifle_gren : weapon_clip {
void preinit();
void destroy();
void DoFire();
void OnBecomeViewWeapon();
void OnFinishViewWeapon();
void IdleInit();
void PlayIdleAnim();
void Sprint();
void LeaveSprint( string newState, float blend );
void FireGrenade();
void Reload();
float DoReload( boolean wasScoped );
void Cleanup();
boolean NeedsReload();
boolean CanFire();
boolean CanReload();
boolean HasNoAmmo();
void DisableIronSights_Private( boolean allowWait );
void EnableIronSights_Private( boolean allowWait );
void OnProxyEnter();
void PlayFireGrenadeEffect();
boolean baseShowAllAmmo;
boolean baseShowClip;
}
void weapon_assaultrifle_gren::preinit() {
hasScope = false;
hasIronSights = true;
baseShowAllAmmo = showAllAmmo;
baseShowClip = showClip;
fireRateSingle = getFloatKeyWithDefault( "fire_rate_single", 0.2f );
}
void weapon_assaultrifle_gren::destroy() {
if ( myPlayer != $null_entity ) {
myPlayer.setGUIClipIndex( 0.f );
myPlayer.SetFireAnim( "" );
}
}
boolean weapon_assaultrifle_gren::CanFire() {
if ( ironSightsEnabled ) {
return ammoAvailable( 1 ) > 0;
}
return true;
}
boolean weapon_assaultrifle_gren::NeedsReload() {
if ( !ironSightsEnabled ) {
if ( !usesStroyent ) {
if ( ammoInClip( 0 ) <= 0 ) {
return true;
}
} else {
if ( ammoAvailable( 0 ) <= 0 ) {
return true;
}
}
}
return false;
}
boolean weapon_assaultrifle_gren::HasNoAmmo() {
if ( !usesStroyent ) {
return ammoAvailable( 0 ) == 0 && ammoAvailable( 1 ) == 0;
}
return ammoAvailable( 0 ) == 0;
}
boolean weapon_assaultrifle_gren::CanReload() {
if ( !usesStroyent ) {
// always update grenade clip,
// set up as clip based but isn't supposed to be
if ( !sys.isClient() ) {
addToClip( 1, clipSize( 1 ) );
}
float index;
if ( ironSightsEnabled ) {
index = 1;
}
if ( ( ammoAvailable( index ) > ammoInClip( index ) ) && ( ammoInClip( index ) < clipSize( index ) ) ) {
return true;
}
}
return false;
}
void weapon_assaultrifle_gren::FireGrenade() {
PlayFireGrenadeEffect();
startSound( "snd_fire_gren_local", SND_WEAPON_FIRE_LOCAL );
startSound( "snd_fire_gren", SND_WEAPON_FIRE );
startSound( "snd_fire_gren_far", SND_WEAPON_FIRE_FAR );
playAnim( ANIMCHANNEL_ALL, "alt_fire" );
LaunchProjectile( 1, 1 );
waitUntil( animDone( ANIMCHANNEL_ALL, 4 ) );
AmmoCheckClip( 1 );
refireTime = sys.getTime() + fireRateSingle;
float minAmmoForReload = 0.f;
if ( sys.isClient() ) {
minAmmoForReload = 1.f; // Gordon: Since clients won't actually use the ammo, bump it by 1
}
if ( ammoAvailable( 1 ) > minAmmoForReload ) {
weaponState( "Reload", 0 );
}
}
void weapon_assaultrifle_gren::DoFire() {
if ( ironSightsEnabled ) {
if ( !mainFireDown ) {
FireGrenade();
}
} else {
FireAuto();
}
}
void weapon_assaultrifle_gren::OnBecomeViewWeapon() {
if ( localScopeEffectsActive ) {
AddLocalScopeEffects();
}
if ( localIronSightsEffectsActive ) {
AddLocalIronSightsEffects();
}
if ( ironSightsEnabled ) {
myPlayer.setGUIClipIndex( 1.0f );
showAllAmmo = true;
showClip = false;
}
UpdateCrosshair();
}
void weapon_assaultrifle_gren::OnFinishViewWeapon() {
RemoveLocalScopeEffects();
RemoveLocalIronSightsEffects();
myPlayer.setGUIClipIndex( 0.0f );
showAllAmmo = false;
showClip = true;
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.weaponReloadTime", 0 );
}
void weapon_assaultrifle_gren::IdleInit() {
weaponReady();
PlayIdleAnim();
playingFireAnim = false;
}
void weapon_assaultrifle_gren::PlayIdleAnim() {
if ( ironSightsEnabled ) {
playCycle( ANIMCHANNEL_ALL, "alt_idle" );
} else {
playCycle( ANIMCHANNEL_ALL, "idle" );
}
}
void weapon_assaultrifle_gren::DisableIronSights_Private( boolean allowWait ) {
playAnim( ANIMCHANNEL_ALL, "switch_from_grenade" );
if ( allowWait ) {
myPlayer.SetFireAnim( "switch_from" );
fired();
sys.wait( 0.2f );
setupAnimClass( "anim_prefix" );
waitUntil( animDone( ANIMCHANNEL_ALL, 4 ) );
} else {
setupAnimClass( "anim_prefix" );
}
myPlayer.SetFireAnim( "" );
ironSightsEnabled = false;
myPlayer.SetIronSightUp( ironSightsEnabled );
ironSightsTimeout = sys.getTime() + 0.5f;
setStatName( getKey( "stat_name" ) );
if ( myPlayer == sys.getLocalViewPlayer() ) {
myPlayer.setGUIClipIndex( 0.0f );
showAllAmmo = baseShowAllAmmo;
showClip = baseShowClip;
UpdateCrosshair();
}
UpdateSpreadModifiers();
}
void weapon_assaultrifle_gren::EnableIronSights_Private( boolean allowWait ) {
setupAnimClass( "anim_prefix_alt" );
if ( allowWait ) {
myPlayer.SetFireAnim( "switch_to" );
fired();
playAnim( ANIMCHANNEL_ALL, "switch_to_grenade" );
waitUntil( animDone( ANIMCHANNEL_ALL, 4 ) );
}
myPlayer.SetFireAnim( "" );
ironSightsEnabled = true;
myPlayer.SetIronSightUp( ironSightsEnabled );
ironSightsTimeout = sys.getTime() + 0.5f;
setStatName( getKey( "stat_name_grenade" ) );
if ( myPlayer == sys.getLocalViewPlayer() ) {
myPlayer.setGUIClipIndex( 1.0f );
showAllAmmo = true;
showClip = false;
UpdateCrosshair();
}
UpdateSpreadModifiers();
}
void weapon_assaultrifle_gren::Sprint() {
weaponReady();
if ( ironSightsEnabled ) {
playAnim( ANIMCHANNEL_ALL, "alt_start_sprint" );
} else {
playAnim( ANIMCHANNEL_ALL, "start_sprint" );
}
waitUntil( animDone( ANIMCHANNEL_ALL, 4 ) );
while ( true ) {
if ( WEAPON_LOWERWEAPON ) {
LeaveSprint( "Lower", 4 );
}
if ( !myPlayer.AI_SPRINT ) {
if ( NeedsReload() && CanReload() ) {
LeaveSprint( "Reload", 4 );
} else {
LeaveSprint( "Idle", 4 );
}
}
if ( WEAPON_ATTACK ) {
LeaveSprint( "Idle", 4 );
}
sys.waitFrame();
}
}
void weapon_assaultrifle_gren::LeaveSprint( string newState, float blend ) {
if ( WEAPON_ATTACK ) {
mainFireDown = false;
}
if ( ironSightsEnabled ) {
playAnim( ANIMCHANNEL_ALL, "alt_leave_sprint" );
} else {
playAnim( ANIMCHANNEL_ALL, "leave_sprint" );
}
waitUntil( animDone( ANIMCHANNEL_ALL, 4 ) );
weaponState( newState, blend );
}
void weapon_assaultrifle_gren::Reload() {
myPlayer.disableSprint( 1.f );
StopBrassSound();
Base_BeginReload();
boolean wantIronSight = DoReload( ironSightsEnabled );
if ( wantIronSight != ironSightsEnabled ) {
if ( wantIronSight ) {
EnableIronSights();
} else {
DisableIronSights();
}
}
Base_EndReload();
weaponState( "Idle", 4 );
}
float weapon_assaultrifle_gren::DoReload( boolean wasScoped ) {
weaponReloading();
if ( ironSightsEnabled ) {
playAnim( ANIMCHANNEL_ALL, "alt_reload" );
} else {
if ( usesStroyent ) {
playAnim( ANIMCHANNEL_ALL, "overheat" );
} else {
playAnim( ANIMCHANNEL_ALL, "reload" );
}
}
boolean altKeyDown;
float stayEnabled = wasScoped;
while ( !animDone( ANIMCHANNEL_ALL, 4 ) ) {
sys.waitFrame();
if ( WEAPON_LOWERWEAPON ) {
Base_EndReload();
weaponState( "Lower", 4 );
}
if ( WEAPON_ALTFIRE ) {
if ( !altKeyDown ) {
altKeyDown = true;
stayEnabled = 1 - stayEnabled;
}
} else {
altKeyDown = false;
}
}
if ( ironSightsEnabled ) {
addToClip( 1, clipSize( 1 ) );
} else {
addToClip( 0, clipSize( 0 ) );
}
return stayEnabled;
}
void weapon_assaultrifle_gren::PlayFireGrenadeEffect() {
if ( sys.getLocalViewPlayer() != myPlayer || pm_thirdperson.getBoolValue() ) {
entity worldModel = getWorldModel( 0 ); // FIXME
worldModel.playEffect( "fx_muzzle_flash_world_gren", "muzzle", 0.0f );
} else {
if ( !myPlayer.IsSniperScopeUp() ) {
playEffect( "fx_muzzle_flash_gren", "muzzle", 0.f );
}
}
}
void weapon_assaultrifle_gren::Cleanup() {
// Gordon: blank here, because we don't want to lose 'iron sights', etc
}
void weapon_assaultrifle_gren::OnProxyEnter() {
Base_OnProxyEnter();
stopSound( SND_WEAPON_RELOAD );
stopSound( SND_WEAPON_BRASS );
}