From fe7ab41af39cf4e36972ad93e72cc603b04e5eb1 Mon Sep 17 00:00:00 2001 From: Rain Date: Sun, 13 Oct 2024 18:23:47 +0300 Subject: [PATCH] Fix grenade bugs Fix #708 Fix #713 Fix problems with throwable items like grenades. This PR disables priming throwables with the +attack2/"alt fire" button, as that seemed to be happening by mistake. This also removes the experimental underhanding/lobbing of grenades feature. This was never really properly implemented, and was just remnants from tests years ago. It's not parity, and if we wanted this kind of system in the future, it should probably go through a proper design doc process to be added. Finally, this fixes the inability to throw grenades/throwables whilst sprinting - parity behaviour is to allow throwing of nades regardless of sprint state. --- mp/src/game/client/neo/c_neo_player.cpp | 7 +- mp/src/game/server/neo/neo_player.cpp | 7 +- .../game/shared/neo/weapons/weapon_detpack.h | 2 +- .../shared/neo/weapons/weapon_grenade.cpp | 177 +----------------- .../game/shared/neo/weapons/weapon_grenade.h | 6 +- .../weapons/weapon_neobasecombatweapon.cpp | 39 ++-- .../neo/weapons/weapon_neobasecombatweapon.h | 2 +- .../neo/weapons/weapon_smokegrenade.cpp | 172 ----------------- .../shared/neo/weapons/weapon_smokegrenade.h | 6 +- 9 files changed, 30 insertions(+), 388 deletions(-) diff --git a/mp/src/game/client/neo/c_neo_player.cpp b/mp/src/game/client/neo/c_neo_player.cpp index e5f289fb63..d959170c88 100644 --- a/mp/src/game/client/neo/c_neo_player.cpp +++ b/mp/src/game/client/neo/c_neo_player.cpp @@ -1058,12 +1058,7 @@ void C_NEO_Player::PostThink(void) } else if (m_afButtonPressed & IN_AIM) { - // Binds hack: we want grenade secondary attack to trigger on aim (mouse button 2) - if (pNeoWep->GetNeoWepBits() & NEO_WEP_THROWABLE) - { - pNeoWep->SecondaryAttack(); - } - else if (!CanSprint() || !(m_nButtons & IN_SPEED)) + if (!CanSprint() || !(m_nButtons & IN_SPEED)) { Weapon_AimToggle(pNeoWep, clientAimHold ? NEO_TOGGLE_FORCE_AIM : NEO_TOGGLE_DEFAULT); } diff --git a/mp/src/game/server/neo/neo_player.cpp b/mp/src/game/server/neo/neo_player.cpp index deb6b88adc..5e163be48b 100644 --- a/mp/src/game/server/neo/neo_player.cpp +++ b/mp/src/game/server/neo/neo_player.cpp @@ -1016,12 +1016,7 @@ void CNEO_Player::PostThink(void) } else if (m_afButtonPressed & IN_AIM) { - // Binds hack: we want grenade secondary attack to trigger on aim (mouse button 2) - if (pNeoWep->GetNeoWepBits() & NEO_WEP_THROWABLE) - { - pNeoWep->SecondaryAttack(); - } - else if (!CanSprint() || !(m_nButtons & IN_SPEED)) + if (!CanSprint() || !(m_nButtons & IN_SPEED)) { Weapon_AimToggle(pNeoWep, clientAimHold ? NEO_TOGGLE_FORCE_AIM : NEO_TOGGLE_DEFAULT); } diff --git a/mp/src/game/shared/neo/weapons/weapon_detpack.h b/mp/src/game/shared/neo/weapons/weapon_detpack.h index f61540d8c9..e01fb303d3 100644 --- a/mp/src/game/shared/neo/weapons/weapon_detpack.h +++ b/mp/src/game/shared/neo/weapons/weapon_detpack.h @@ -39,7 +39,6 @@ class CWeaponDetpack : public CNEOBaseCombatWeapon void Precache(void); void PrimaryAttack(void); - void SecondaryAttack(void) { } void DecrementAmmo(CBaseCombatCharacter* pOwner); void ItemPostFrame(void); @@ -51,6 +50,7 @@ class CWeaponDetpack : public CNEOBaseCombatWeapon virtual float GetSpeedScale(void) const { return 1.0; } bool CanDrop(void) OVERRIDE; + virtual bool CanPerformSecondaryAttack() const override final { return false; } #ifndef CLIENT_DLL void Operator_HandleAnimEvent(animevent_t* pEvent, CBaseCombatCharacter* pOperator); diff --git a/mp/src/game/shared/neo/weapons/weapon_grenade.cpp b/mp/src/game/shared/neo/weapons/weapon_grenade.cpp index 2dcb983702..c53fdb12b4 100644 --- a/mp/src/game/shared/neo/weapons/weapon_grenade.cpp +++ b/mp/src/game/shared/neo/weapons/weapon_grenade.cpp @@ -23,8 +23,6 @@ ConVar sv_neo_infinite_frag_grenades("sv_neo_infinite_frag_grenades", "0", FCVAR_REPLICATED | FCVAR_CHEAT, "Should frag grenades use up ammo.", true, 0.0, true, 1.0); ConVar sv_neo_grenade_throw_intensity("sv_neo_grenade_throw_intensity", "900.0", FCVAR_REPLICATED | FCVAR_CHEAT, "How strong should regular grenade throws be.", true, 0.0, true, 9999.9); // 750 is the original NT impulse. Seems incorrect though, weight or phys difference? -ConVar sv_neo_grenade_lob_intensity("sv_neo_grenade_lob_intensity", "375.0", FCVAR_REPLICATED | FCVAR_CHEAT, "How strong should underhand grenade lobs be.", true, 0.0, true, 9999.9); // No such thing in original, but chose half of 750 -ConVar sv_neo_grenade_roll_intensity("sv_neo_grenade_roll_intensity", "375.0", FCVAR_REPLICATED | FCVAR_CHEAT, "How strong should underhand grenade rolls be.", true, 0.0, true, 9999.9); ConVar sv_neo_grenade_blast_damage("sv_neo_grenade_blast_damage", "200.0", FCVAR_REPLICATED | FCVAR_CHEAT, "How much damage should a grenade blast deal.", true, 0.0, true, 999.9); ConVar sv_neo_grenade_blast_radius("sv_neo_grenade_blast_radius", "250.0", FCVAR_REPLICATED | FCVAR_CHEAT, "How large should the grenade blast radius be.", true, 0.0, true, 9999.9); ConVar sv_neo_grenade_fuse_timer("sv_neo_grenade_fuse_timer", "2.16", FCVAR_REPLICATED | FCVAR_CHEAT, "How long in seconds until a frag grenade explodes.", true, 0.1, true, 60.0); // Measured as 2.15999... in NT, ie. < 2.16 @@ -119,42 +117,6 @@ bool CWeaponGrenade::Reload(void) return true; } -void CWeaponGrenade::SecondaryAttack(void) -{ - if (ShootingIsPrevented()) - { - return; - } - - if (m_bRedraw || !HasPrimaryAmmo()) - { - return; - } - - auto pPlayer = ToBasePlayer(GetOwner()); - if (!pPlayer) - { - return; - } - - if (m_flNextSecondaryAttack > gpGlobals->curtime) - { - return; - } - - if (m_AttackPaused != GRENADE_PAUSED_SECONDARY) - { - // Note that this is a secondary attack and prepare the grenade attack to pause. - m_AttackPaused = GRENADE_PAUSED_SECONDARY; - SendWeaponAnim(ACT_VM_PULLPIN); - - // Don't let weapon idle interfere in the middle of a throw! - m_flTimeWeaponIdle = FLT_MAX; - m_flNextSecondaryAttack = gpGlobals->curtime + RETHROW_DELAY; - m_bDrawbackFinished = false; - } -} - void CWeaponGrenade::PrimaryAttack(void) { if (ShootingIsPrevented()) @@ -239,30 +201,6 @@ void CWeaponGrenade::ItemPostFrame(void) } break; - case GRENADE_PAUSED_SECONDARY: - if (!(pOwner->m_nButtons & IN_AIM)) - { - //See if we're ducking - if (pOwner->m_nButtons & IN_DUCK) - { - RollGrenade(pOwner); - //Send the weapon animation - SendWeaponAnim(ACT_VM_THROW); - } - else - { - LobGrenade(pOwner); - //Send the weapon animation - SendWeaponAnim(ACT_VM_THROW); - } - - pOwner->DoAnimationEvent(PLAYERANIMEVENT_ATTACK_PRIMARY); - m_flNextPrimaryAttack = m_flNextSecondaryAttack = m_flTimeWeaponIdle = gpGlobals->curtime + SequenceDuration(); - m_bDrawbackFinished = false; - m_AttackPaused = GRENADE_PAUSED_NO; - } - break; - default: if (m_bRedraw) { @@ -350,107 +288,6 @@ void CWeaponGrenade::ThrowGrenade(CNEO_Player *pPlayer, bool isAlive, CBaseEntit m_bRedraw = true; } -void CWeaponGrenade::LobGrenade(CNEO_Player *pPlayer) -{ - // Binds hack: we want grenade secondary attack to trigger on aim, not the attack2 bind. - if (pPlayer->m_afButtonPressed & IN_AIM) - { - return; - } - else if (!sv_neo_infinite_frag_grenades.GetBool()) - { - Assert(HasPrimaryAmmo()); - DecrementAmmo(pPlayer); - } - -#ifndef CLIENT_DLL - Vector vecEye = pPlayer->EyePosition(); - Vector vForward, vRight; - - pPlayer->EyeVectors(&vForward, &vRight, NULL); - Vector vecSrc = vecEye + vForward * 2.0f + Vector(0, 0, -8); - CheckThrowPosition(pPlayer, vecEye, vecSrc); - - Vector vecThrow; - pPlayer->GetVelocity(&vecThrow, NULL); - vecThrow += vForward * sv_neo_grenade_lob_intensity.GetFloat() + Vector(0, 0, 50); - CBaseGrenade *pGrenade = NEOFraggrenade_Create(vecSrc, vec3_angle, vecThrow, AngularImpulse(200, random->RandomInt(-600, 600), 0), pPlayer, sv_neo_grenade_fuse_timer.GetFloat(), false); - - if (pGrenade) - { - pGrenade->SetDamage(sv_neo_grenade_blast_damage.GetFloat()); - pGrenade->SetDamageRadius(sv_neo_grenade_blast_radius.GetFloat()); - } -#endif - - WeaponSound(WPN_DOUBLE); - - // player "shoot" animation - pPlayer->DoAnimationEvent(PLAYERANIMEVENT_ATTACK_PRIMARY); - - m_bRedraw = true; -} - -void CWeaponGrenade::RollGrenade(CNEO_Player *pPlayer) -{ - // Binds hack: we want grenade secondary attack to trigger on aim, not the attack2 bind. - if (pPlayer->m_afButtonPressed & IN_AIM) - { - return; - } - else if (!sv_neo_infinite_frag_grenades.GetBool()) - { - Assert(HasPrimaryAmmo()); - DecrementAmmo(pPlayer); - } - -#ifndef CLIENT_DLL - // BUGBUG: Hardcoded grenade width of 4 - better not change the model :) - Vector vecSrc; - pPlayer->CollisionProp()->NormalizedToWorldSpace(Vector(0.5f, 0.5f, 0.0f), &vecSrc); - vecSrc.z += GRENADE_RADIUS; - - Vector vecFacing = pPlayer->BodyDirection2D(); - // no up/down direction - vecFacing.z = 0; - VectorNormalize(vecFacing); - trace_t tr; - UTIL_TraceLine(vecSrc, vecSrc - Vector(0, 0, 16), MASK_PLAYERSOLID, pPlayer, COLLISION_GROUP_NONE, &tr); - if (tr.fraction != 1.0) - { - // compute forward vec parallel to floor plane and roll grenade along that - Vector tangent; - CrossProduct(vecFacing, tr.plane.normal, tangent); - CrossProduct(tr.plane.normal, tangent, vecFacing); - } - vecSrc += (vecFacing * 2.0); - CheckThrowPosition(pPlayer, pPlayer->WorldSpaceCenter(), vecSrc); - - Vector vecThrow; - pPlayer->GetVelocity(&vecThrow, NULL); - vecThrow += vecFacing * sv_neo_grenade_roll_intensity.GetFloat(); - // put it on its side - QAngle orientation(0, pPlayer->GetLocalAngles().y, -90); - // roll it - AngularImpulse rotSpeed(0, 0, 720); - CBaseGrenade *pGrenade = NEOFraggrenade_Create(vecSrc, orientation, vecThrow, rotSpeed, pPlayer, sv_neo_grenade_fuse_timer.GetFloat(), false); - - if (pGrenade) - { - pGrenade->SetDamage(sv_neo_grenade_blast_damage.GetFloat()); - pGrenade->SetDamageRadius(sv_neo_grenade_blast_radius.GetFloat()); - } - -#endif - - WeaponSound(SPECIAL1); - - // player "shoot" animation - pPlayer->DoAnimationEvent(PLAYERANIMEVENT_ATTACK_PRIMARY); - - m_bRedraw = true; -} - bool CWeaponGrenade::CanDrop() { auto owner = GetOwner(); @@ -482,18 +319,6 @@ void CWeaponGrenade::Operator_HandleAnimEvent(animevent_t *pEvent, CBaseCombatCh fThrewGrenade = true; break; - case EVENT_WEAPON_THROW2: - RollGrenade(pOwner); - DecrementAmmo(pOwner); - fThrewGrenade = true; - break; - - case EVENT_WEAPON_THROW3: - LobGrenade(pOwner); - DecrementAmmo(pOwner); - fThrewGrenade = true; - break; - default: BaseClass::Operator_HandleAnimEvent(pEvent, pOperator); break; @@ -506,4 +331,4 @@ void CWeaponGrenade::Operator_HandleAnimEvent(animevent_t *pEvent, CBaseCombatCh m_flTimeWeaponIdle = FLT_MAX; //NOTE: This is set once the animation has finished up! } } -#endif \ No newline at end of file +#endif diff --git a/mp/src/game/shared/neo/weapons/weapon_grenade.h b/mp/src/game/shared/neo/weapons/weapon_grenade.h index 683c12122c..e94f845fe1 100644 --- a/mp/src/game/shared/neo/weapons/weapon_grenade.h +++ b/mp/src/game/shared/neo/weapons/weapon_grenade.h @@ -46,7 +46,6 @@ class CWeaponGrenade : public CNEOBaseCombatWeapon void Precache(void); void PrimaryAttack(void); - void SecondaryAttack(void); void DecrementAmmo(CBaseCombatCharacter *pOwner); void ItemPostFrame(void); @@ -57,17 +56,16 @@ class CWeaponGrenade : public CNEOBaseCombatWeapon void Drop(const Vector& vecVelocity) OVERRIDE; bool CanDrop(void) OVERRIDE; + virtual bool CanPerformSecondaryAttack() const override final { return false; } #ifndef CLIENT_DLL void Operator_HandleAnimEvent(animevent_t *pEvent, CBaseCombatCharacter *pOperator); #endif void ThrowGrenade(CNEO_Player *pPlayer, bool isAlive = true, CBaseEntity *pAttacker = NULL); - void LobGrenade(CNEO_Player *pPlayer); bool IsPrimed() const { return (m_AttackPaused != 0); } private: - void RollGrenade(CNEO_Player *pPlayer); // Check a throw from vecSrc. If not valid, move the position back along the line to vecEye void CheckThrowPosition(CBasePlayer *pPlayer, const Vector &vecEye, Vector &vecSrc); @@ -79,4 +77,4 @@ class CWeaponGrenade : public CNEOBaseCombatWeapon CWeaponGrenade(const CWeaponGrenade &other); }; -#endif // NEO_WEAPON_GRENADE_H \ No newline at end of file +#endif // NEO_WEAPON_GRENADE_H diff --git a/mp/src/game/shared/neo/weapons/weapon_neobasecombatweapon.cpp b/mp/src/game/shared/neo/weapons/weapon_neobasecombatweapon.cpp index 5e3f21d96e..2fd77aee37 100644 --- a/mp/src/game/shared/neo/weapons/weapon_neobasecombatweapon.cpp +++ b/mp/src/game/shared/neo/weapons/weapon_neobasecombatweapon.cpp @@ -467,42 +467,45 @@ void CNEOBaseCombatWeapon::ItemPreFrame(void) } // Handles lowering the weapon view model when character is sprinting -void CNEOBaseCombatWeapon::ProcessAnimationEvents(void) +void CNEOBaseCombatWeapon::ProcessAnimationEvents() { CNEO_Player* pOwner = static_cast(ToBasePlayer(GetOwner())); if (!pOwner) + { return; + } - if (!m_bLowered && (pOwner->IsSprinting() || pOwner->GetMoveType() == MOVETYPE_LADDER) && !m_bInReload && !m_bRoundBeingChambered) + const auto next = [this](const int activity) { + SendWeaponAnim(activity); + if (GetNeoWepBits() & NEO_WEP_THROWABLE) + { + return; + } + constexpr auto nextAttackDelay = 0.2; + m_flNextPrimaryAttack = max(gpGlobals->curtime + nextAttackDelay, m_flNextPrimaryAttack); + m_flNextSecondaryAttack = m_flNextPrimaryAttack; + }; + + if (!m_bLowered && !m_bInReload && !m_bRoundBeingChambered && + (pOwner->IsSprinting() || pOwner->GetMoveType() == MOVETYPE_LADDER)) { m_bLowered = true; - SendWeaponAnim(ACT_VM_IDLE_LOWERED); - m_flNextPrimaryAttack = max(gpGlobals->curtime + 0.2, m_flNextPrimaryAttack); - m_flNextSecondaryAttack = m_flNextPrimaryAttack; + next(ACT_VM_IDLE_LOWERED); } else if (m_bLowered && !(pOwner->IsSprinting() || pOwner->GetMoveType() == MOVETYPE_LADDER)) { m_bLowered = false; - SendWeaponAnim(ACT_VM_IDLE); - m_flNextPrimaryAttack = max(gpGlobals->curtime + 0.2, m_flNextPrimaryAttack); - m_flNextSecondaryAttack = m_flNextPrimaryAttack; + next(ACT_VM_IDLE); } else if (m_bLowered && m_bRoundBeingChambered) { // For bolt action weapons m_bLowered = false; - SendWeaponAnim(ACT_VM_PULLBACK); - m_flNextPrimaryAttack = max(gpGlobals->curtime + 0.2, m_flNextPrimaryAttack); - m_flNextSecondaryAttack = m_flNextPrimaryAttack; + next(ACT_VM_PULLBACK); } - if (m_bLowered) + if (m_bLowered && gpGlobals->curtime > m_flNextPrimaryAttack) { - if (gpGlobals->curtime > m_flNextPrimaryAttack) - { - SendWeaponAnim(ACT_VM_IDLE_LOWERED); - m_flNextPrimaryAttack = max(gpGlobals->curtime + 0.2, m_flNextPrimaryAttack); - m_flNextSecondaryAttack = m_flNextPrimaryAttack; - } + next(ACT_VM_IDLE_LOWERED); } } diff --git a/mp/src/game/shared/neo/weapons/weapon_neobasecombatweapon.h b/mp/src/game/shared/neo/weapons/weapon_neobasecombatweapon.h index a551666d17..07ffb09932 100644 --- a/mp/src/game/shared/neo/weapons/weapon_neobasecombatweapon.h +++ b/mp/src/game/shared/neo/weapons/weapon_neobasecombatweapon.h @@ -219,7 +219,7 @@ class CNEOBaseCombatWeapon : public CBaseHL2MPCombatWeapon float GetLastAttackTime(void) const { return m_flLastAttackTime; } - virtual void ProcessAnimationEvents(void); + void ProcessAnimationEvents(); bool m_bWeaponIsLowered; int GetNumShotsFired(void) const { return m_nNumShotsFired; } diff --git a/mp/src/game/shared/neo/weapons/weapon_smokegrenade.cpp b/mp/src/game/shared/neo/weapons/weapon_smokegrenade.cpp index 4a5ca9d19d..e906b75781 100644 --- a/mp/src/game/shared/neo/weapons/weapon_smokegrenade.cpp +++ b/mp/src/game/shared/neo/weapons/weapon_smokegrenade.cpp @@ -97,42 +97,6 @@ bool CWeaponSmokeGrenade::Reload(void) return true; } -void CWeaponSmokeGrenade::SecondaryAttack(void) -{ - if (ShootingIsPrevented()) - { - return; - } - - if (m_bRedraw || !HasPrimaryAmmo()) - { - return; - } - - auto pPlayer = ToBasePlayer(GetOwner()); - if (!pPlayer) - { - return; - } - - if (m_flNextSecondaryAttack > gpGlobals->curtime) - { - return; - } - - if (m_AttackPaused != GRENADE_PAUSED_SECONDARY) - { - // Note that this is a secondary attack and prepare the grenade attack to pause. - m_AttackPaused = GRENADE_PAUSED_SECONDARY; - SendWeaponAnim(ACT_VM_PULLPIN); - - // Don't let weapon idle interfere in the middle of a throw! - m_flTimeWeaponIdle = FLT_MAX; - m_flNextSecondaryAttack = gpGlobals->curtime + RETHROW_DELAY; - m_bDrawbackFinished = false; - } -} - void CWeaponSmokeGrenade::PrimaryAttack(void) { if (ShootingIsPrevented()) @@ -218,29 +182,6 @@ void CWeaponSmokeGrenade::ItemPostFrame(void) } break; - case GRENADE_PAUSED_SECONDARY: - if (!(pOwner->m_nButtons & IN_AIM)) - { - //See if we're ducking - if (pOwner->m_nButtons & IN_DUCK) - { - RollGrenade(pOwner); - //Send the weapon animation - SendWeaponAnim(ACT_VM_THROW); - } - else - { - LobGrenade(pOwner); - //Send the weapon animation - SendWeaponAnim(ACT_VM_THROW); - } - - m_flNextPrimaryAttack = m_flNextSecondaryAttack = m_flTimeWeaponIdle = gpGlobals->curtime + SequenceDuration(); - m_bDrawbackFinished = false; - m_AttackPaused = GRENADE_PAUSED_NO; - } - break; - default: if (m_bRedraw) { @@ -329,107 +270,6 @@ void CWeaponSmokeGrenade::ThrowGrenade(CNEO_Player* pPlayer, bool isAlive, CBase m_bRedraw = true; } -void CWeaponSmokeGrenade::LobGrenade(CNEO_Player* pPlayer) -{ - // Binds hack: we want grenade secondary attack to trigger on aim, not the attack2 bind. - if (pPlayer->m_afButtonPressed & IN_AIM) - { - return; - } - else if (!sv_neo_infinite_smoke_grenades.GetBool()) - { - Assert(HasPrimaryAmmo()); - DecrementAmmo(pPlayer); - } - -#ifndef CLIENT_DLL - Vector vecEye = pPlayer->EyePosition(); - Vector vForward, vRight; - - pPlayer->EyeVectors(&vForward, &vRight, NULL); - Vector vecSrc = vecEye + vForward * 2.0f + Vector(0, 0, -8); - CheckThrowPosition(pPlayer, vecEye, vecSrc); - - Vector vecThrow; - pPlayer->GetVelocity(&vecThrow, NULL); - vecThrow += vForward * sv_neo_grenade_lob_intensity.GetFloat() + Vector(0, 0, 50); - CBaseGrenade* pGrenade = NEOSmokegrenade_Create(vecSrc, vec3_angle, vecThrow, AngularImpulse(200, random->RandomInt(-600, 600), 0), pPlayer); - - if (pGrenade) - { - pGrenade->SetDamage(0); - pGrenade->SetDamageRadius(0); - } -#endif - - WeaponSound(WPN_DOUBLE); - - // player "shoot" animation - pPlayer->DoAnimationEvent(PLAYERANIMEVENT_ATTACK_PRIMARY); - - m_bRedraw = true; -} - -void CWeaponSmokeGrenade::RollGrenade(CNEO_Player* pPlayer) -{ - // Binds hack: we want grenade secondary attack to trigger on aim, not the attack2 bind. - if (pPlayer->m_afButtonPressed & IN_AIM) - { - return; - } - else if (!sv_neo_infinite_smoke_grenades.GetBool()) - { - Assert(HasPrimaryAmmo()); - DecrementAmmo(pPlayer); - } - -#ifndef CLIENT_DLL - // BUGBUG: Hardcoded grenade width of 4 - better not change the model :) - Vector vecSrc; - pPlayer->CollisionProp()->NormalizedToWorldSpace(Vector(0.5f, 0.5f, 0.0f), &vecSrc); - vecSrc.z += GRENADE_RADIUS; - - Vector vecFacing = pPlayer->BodyDirection2D(); - // no up/down direction - vecFacing.z = 0; - VectorNormalize(vecFacing); - trace_t tr; - UTIL_TraceLine(vecSrc, vecSrc - Vector(0, 0, 16), MASK_PLAYERSOLID, pPlayer, COLLISION_GROUP_NONE, &tr); - if (tr.fraction != 1.0) - { - // compute forward vec parallel to floor plane and roll grenade along that - Vector tangent; - CrossProduct(vecFacing, tr.plane.normal, tangent); - CrossProduct(tr.plane.normal, tangent, vecFacing); - } - vecSrc += (vecFacing * 2.0); - CheckThrowPosition(pPlayer, pPlayer->WorldSpaceCenter(), vecSrc); - - Vector vecThrow; - pPlayer->GetVelocity(&vecThrow, NULL); - vecThrow += vecFacing * sv_neo_grenade_roll_intensity.GetFloat(); - // put it on its side - QAngle orientation(0, pPlayer->GetLocalAngles().y, -90); - // roll it - AngularImpulse rotSpeed(0, 0, 720); - CBaseGrenade* pGrenade = NEOSmokegrenade_Create(vecSrc, orientation, vecThrow, rotSpeed, pPlayer); - - if (pGrenade) - { - pGrenade->SetDamage(0); - pGrenade->SetDamageRadius(0); - } - -#endif - - WeaponSound(SPECIAL1); - - // player "shoot" animation - pPlayer->DoAnimationEvent(PLAYERANIMEVENT_ATTACK_PRIMARY); - - m_bRedraw = true; -} - bool CWeaponSmokeGrenade::CanDrop() { auto owner = GetOwner(); @@ -461,18 +301,6 @@ void CWeaponSmokeGrenade::Operator_HandleAnimEvent(animevent_t* pEvent, CBaseCom fThrewGrenade = true; break; - case EVENT_WEAPON_THROW2: - RollGrenade(pOwner); - DecrementAmmo(pOwner); - fThrewGrenade = true; - break; - - case EVENT_WEAPON_THROW3: - LobGrenade(pOwner); - DecrementAmmo(pOwner); - fThrewGrenade = true; - break; - default: BaseClass::Operator_HandleAnimEvent(pEvent, pOperator); break; diff --git a/mp/src/game/shared/neo/weapons/weapon_smokegrenade.h b/mp/src/game/shared/neo/weapons/weapon_smokegrenade.h index 54f13b086b..b511b0e4e5 100644 --- a/mp/src/game/shared/neo/weapons/weapon_smokegrenade.h +++ b/mp/src/game/shared/neo/weapons/weapon_smokegrenade.h @@ -45,7 +45,6 @@ class CWeaponSmokeGrenade : public CNEOBaseCombatWeapon void Precache(void); void PrimaryAttack(void); - void SecondaryAttack(void); void DecrementAmmo(CBaseCombatCharacter* pOwner); void ItemPostFrame(void); @@ -55,17 +54,16 @@ class CWeaponSmokeGrenade : public CNEOBaseCombatWeapon bool Reload(void); void Drop(const Vector& vecVelocity) OVERRIDE; bool CanDrop() OVERRIDE; + virtual bool CanPerformSecondaryAttack() const override final { return false; } #ifndef CLIENT_DLL void Operator_HandleAnimEvent(animevent_t* pEvent, CBaseCombatCharacter* pOperator); #endif void ThrowGrenade(CNEO_Player* pPlayer, bool isAlive = true, CBaseEntity *pAttacker = NULL); - void LobGrenade(CNEO_Player* pPlayer); bool IsPrimed() const { return (m_AttackPaused != 0); } private: - void RollGrenade(CNEO_Player* pPlayer); // Check a throw from vecSrc. If not valid, move the position back along the line to vecEye void CheckThrowPosition(CBasePlayer* pPlayer, const Vector& vecEye, Vector& vecSrc); @@ -77,4 +75,4 @@ class CWeaponSmokeGrenade : public CNEOBaseCombatWeapon CWeaponSmokeGrenade(const CWeaponSmokeGrenade& other); }; -#endif // NEO_WEAPON_SMOKEGRENADE_H \ No newline at end of file +#endif // NEO_WEAPON_SMOKEGRENADE_H