From d628a7ae802ff0444eebfc5065bbf0725935533a Mon Sep 17 00:00:00 2001 From: SanyaSho Date: Thu, 4 Aug 2022 16:17:51 +0300 Subject: [PATCH] game: restore combine elite soldiers ability to use alt-fire of SMG1 --- game/server/hl2/npc_combine.cpp | 15 ++++++-- game/server/hl2/weapon_smg1.cpp | 62 +++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 24 deletions(-) diff --git a/game/server/hl2/npc_combine.cpp b/game/server/hl2/npc_combine.cpp index afd1f8e2..c06a6ddb 100644 --- a/game/server/hl2/npc_combine.cpp +++ b/game/server/hl2/npc_combine.cpp @@ -378,7 +378,7 @@ void CNPC_Combine::PostNPCInit() // an AR2. if( !GetActiveWeapon() || !FClassnameIs( GetActiveWeapon(), "weapon_ar2" ) ) { - DevWarning("**Combine Elite Soldier MUST be equipped with AR2\n"); + // DevWarning("**Combine Elite Soldier MUST be equipped with AR2\n"); } } @@ -2320,7 +2320,18 @@ void CNPC_Combine::HandleAnimEvent( animevent_t *pEvent ) { if ( pEvent->event == COMBINE_AE_BEGIN_ALTFIRE ) { - EmitSound( "Weapon_CombineGuard.Special1" ); + if( FClassnameIs( GetActiveWeapon(), "weapon_ar2" ) ) + { + EmitSound( "Weapon_CombineGuard.Special1" ); + } + else if( FClassnameIs( GetActiveWeapon(), "weapon_smg1" ) ) + { + EmitSound( "Weapon_SMG1.Double" ); + } + else + { + EmitSound( "Weapon_CombineGuard.Special1" ); + } handledEvent = true; } else if ( pEvent->event == COMBINE_AE_ALTFIRE ) diff --git a/game/server/hl2/weapon_smg1.cpp b/game/server/hl2/weapon_smg1.cpp index cc9934a4..4515ad08 100644 --- a/game/server/hl2/weapon_smg1.cpp +++ b/game/server/hl2/weapon_smg1.cpp @@ -45,7 +45,7 @@ public: float GetFireRate( void ) { return 0.075f; } // 13.3hz int CapabilitiesGet( void ) { return bits_CAP_WEAPON_RANGE_ATTACK1; } - int WeaponRangeAttack2Condition( float flDot, float flDist ); + int WeaponRangeAttack2Condition(/* float flDot, float flDist */); Activity GetPrimaryAttackActivity( void ); virtual const Vector& GetBulletSpread( void ) @@ -228,32 +228,50 @@ void CWeaponSMG1::Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatChar } break; - /*//FIXME: Re-enable - case EVENT_WEAPON_AR2_GRENADE: + case EVENT_WEAPON_AR2_ALTFIRE: { - CAI_BaseNPC *npc = pOperator->MyNPCPointer(); + CAI_BaseNPC *npc = pOperator->MyNPCPointer(); + + Vector vecShootOrigin, vecShootDir; + vecShootOrigin = pOperator->Weapon_ShootPosition(); + //vecShootDir = npc->GetShootEnemyDir( vecShootOrigin ); + + //Checks if it can fire the grenade + WeaponRangeAttack2Condition(); + + Vector vecThrow = m_vecTossVelocity; + + //If on the rare case the vector is 0 0 0, cancel for avoid launching the grenade without speed + //This should be on WeaponRangeAttack2Condition(), but for some unknown reason return CASE_NONE + //doesn't stop the launch + if( vecThrow == Vector(0, 0, 0) ) + { + break; + } - Vector vecShootOrigin, vecShootDir; - vecShootOrigin = pOperator->Weapon_ShootPosition(); - vecShootDir = npc->GetShootEnemyDir( vecShootOrigin ); + CGrenadeAR2 *pGrenade = (CGrenadeAR2*)Create("grenade_ar2", vecShootOrigin, vec3_angle, npc); + pGrenade->SetAbsVelocity( vecThrow ); + pGrenade->SetLocalAngularVelocity(RandomAngle(-400, 400)); //tumble in air + pGrenade->SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE ); - Vector vecThrow = m_vecTossVelocity; + pGrenade->SetThrower(GetOwner()); - CGrenadeAR2 *pGrenade = (CGrenadeAR2*)Create( "grenade_ar2", vecShootOrigin, vec3_angle, npc ); - pGrenade->SetAbsVelocity( vecThrow ); - pGrenade->SetLocalAngularVelocity( QAngle( 0, 400, 0 ) ); - pGrenade->SetMoveType( MOVETYPE_FLYGRAVITY ); - pGrenade->m_hOwner = npc; - pGrenade->m_pMyWeaponAR2 = this; - pGrenade->SetDamage(sk_npc_dmg_ar2_grenade.GetFloat()); + pGrenade->SetGravity(0.5); // lower gravity since grenade is aerodynamic and engine doesn't know it. - // FIXME: arrgg ,this is hard coded into the weapon??? - m_flNextGrenadeCheck = gpGlobals->curtime + 6;// wait six seconds before even looking again to see if a grenade can be thrown. + pGrenade->SetDamage( sk_plr_dmg_smg1_grenade.GetFloat() ); - m_iClip2--; + if( g_pGameRules->IsSkillLevel( SKILL_HARD ) ) + { + m_flNextGrenadeCheck = gpGlobals->curtime + RandomFloat(2, 3); + } + else + { + m_flNextGrenadeCheck = gpGlobals->curtime + 6;// wait six seconds before even looking again to see if a grenade can be thrown. + } + + m_iClip2--; } break; - */ default: BaseClass::Operator_HandleAnimEvent( pEvent, pOperator ); @@ -272,7 +290,7 @@ Activity CWeaponSMG1::GetPrimaryAttackActivity( void ) if ( m_nShotsFired < 3 ) return ACT_VM_RECOIL1; - + if ( m_nShotsFired < 4 ) return ACT_VM_RECOIL2; @@ -394,11 +412,11 @@ void CWeaponSMG1::SecondaryAttack( void ) // flDist - // Output : int //----------------------------------------------------------------------------- -int CWeaponSMG1::WeaponRangeAttack2Condition( float flDot, float flDist ) +int CWeaponSMG1::WeaponRangeAttack2Condition(/* float flDot, float flDist */) { CAI_BaseNPC *npcOwner = GetOwner()->MyNPCPointer(); - return COND_NONE; + // return COND_NONE; /* // --------------------------------------------------------