From 0d0d66640926d4b9a568cd2404f3e2530ef9f015 Mon Sep 17 00:00:00 2001 From: rabscootle Date: Mon, 20 Jul 2026 14:18:26 -0500 Subject: [PATCH 1/2] Use robot voice filter for enemy Spy disguises in MvM --- src/game/server/player.h | 2 +- src/game/server/sceneentity.cpp | 2 +- src/game/server/tf/tf_player.cpp | 11 ++++++++++- src/game/server/tf/tf_player.h | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/game/server/player.h b/src/game/server/player.h index 902e0e627ca..0a54d409693 100644 --- a/src/game/server/player.h +++ b/src/game/server/player.h @@ -463,7 +463,7 @@ class CBasePlayer : public CBaseCombatCharacter virtual void GetStepSoundVelocities( float *velwalk, float *velrun ); virtual void SetStepSoundTime( stepsoundtimes_t iStepSoundTime, bool bWalking ); virtual void DeathSound( const CTakeDamageInfo &info ); - virtual const char* GetSceneSoundToken( void ) { return ""; } + virtual const char* GetSceneSoundToken( CBasePlayer * ) { return ""; } virtual void OnEmitFootstepSound( const CSoundParameters& params, const Vector& vecOrigin, float fVolume ) {} diff --git a/src/game/server/sceneentity.cpp b/src/game/server/sceneentity.cpp index f5c037e45ad..ed1d1b2fb17 100644 --- a/src/game/server/sceneentity.cpp +++ b/src/game/server/sceneentity.cpp @@ -1648,7 +1648,7 @@ bool CSceneEntity::GetSoundNameForPlayer( CChoreoEvent *event, CBasePlayer *play if ( pActor && pActor->IsPlayer() ) { - pchToken = dynamic_cast< CBasePlayer* >( pActor )->GetSceneSoundToken(); + pchToken = dynamic_cast< CBasePlayer* >( pActor )->GetSceneSoundToken( player ); } // Copy the sound name diff --git a/src/game/server/tf/tf_player.cpp b/src/game/server/tf/tf_player.cpp index d29e346def0..b028e903dd3 100644 --- a/src/game/server/tf/tf_player.cpp +++ b/src/game/server/tf/tf_player.cpp @@ -15315,7 +15315,7 @@ void CTFPlayer::DeathSound( const CTakeDamageInfo &info ) //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- -const char* CTFPlayer::GetSceneSoundToken( void ) +const char* CTFPlayer::GetSceneSoundToken( CBasePlayer *pListener ) { if ( TFGameRules() && TFGameRules()->IsMannVsMachineMode() && GetTeamNumber() == TF_TEAM_PVE_INVADERS ) { @@ -15328,6 +15328,15 @@ const char* CTFPlayer::GetSceneSoundToken( void ) return "MVM_"; } } + else if ( TFGameRules() && TFGameRules()->IsMannVsMachineMode() && + GetTeamNumber() == TF_TEAM_PVE_DEFENDERS && + IsPlayerClass( TF_CLASS_SPY ) && + m_Shared.InCond( TF_COND_DISGUISED ) && + m_Shared.GetDisguiseTeam() == TF_TEAM_PVE_INVADERS && + pListener->GetTeamNumber() == TF_TEAM_PVE_INVADERS ) + { + return "MVM_"; + } else { return ""; diff --git a/src/game/server/tf/tf_player.h b/src/game/server/tf/tf_player.h index d2affa28511..a82151359ec 100644 --- a/src/game/server/tf/tf_player.h +++ b/src/game/server/tf/tf_player.h @@ -373,7 +373,7 @@ class CTFPlayer : public CBaseMultiplayerPlayer, public IHasAttributes, public I float PlayCritReceivedSound( void ); void PainSound( const CTakeDamageInfo &info ); void DeathSound( const CTakeDamageInfo &info ); - virtual const char* GetSceneSoundToken( void ); + virtual const char* GetSceneSoundToken( CBasePlayer *pListener ); void StunSound( CTFPlayer* pAttacker, int iStunFlags, int iOldStunFlags=0 ); void SetSeeCrit( bool bAllSeeCrit, bool bMiniCrit, bool bShowDisguisedCrit ) { m_bAllSeeCrit = bAllSeeCrit; m_bMiniCrit = bMiniCrit; m_bShowDisguisedCrit = bShowDisguisedCrit; } From 604b695131262fd9134b893c3dd742cf49358e63 Mon Sep 17 00:00:00 2001 From: rabscootle Date: Tue, 21 Jul 2026 11:49:05 -0500 Subject: [PATCH 2/2] Fix disguised player not hearing robot lines --- src/game/server/tf/tf_player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/server/tf/tf_player.cpp b/src/game/server/tf/tf_player.cpp index b028e903dd3..eb29e15f521 100644 --- a/src/game/server/tf/tf_player.cpp +++ b/src/game/server/tf/tf_player.cpp @@ -15333,7 +15333,7 @@ const char* CTFPlayer::GetSceneSoundToken( CBasePlayer *pListener ) IsPlayerClass( TF_CLASS_SPY ) && m_Shared.InCond( TF_COND_DISGUISED ) && m_Shared.GetDisguiseTeam() == TF_TEAM_PVE_INVADERS && - pListener->GetTeamNumber() == TF_TEAM_PVE_INVADERS ) + ( pListener == this || ( pListener && pListener->GetTeamNumber() == TF_TEAM_PVE_INVADERS ) ) ) { return "MVM_"; }