Skip to content

Commit 91d887a

Browse files
authored
[TF2] Add prediction for thermal thruster + self-stun (#908)
1 parent bb2844b commit 91d887a

File tree

5 files changed

+136
-70
lines changed

5 files changed

+136
-70
lines changed

src/game/server/tf/tf_player.cpp

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@
126126
#include "tf_revive.h"
127127
#include "tf_logic_halloween_2014.h"
128128
#include "tf_logic_player_destruction.h"
129-
#include "tf_weapon_rocketpack.h"
130129
#include "tf_weapon_slap.h"
131130
#include "func_croc.h"
132131
#include "tf_weapon_bonesaw.h"
@@ -1453,35 +1452,6 @@ void CTFPlayer::TFPlayerThink()
14531452
else
14541453
{
14551454
m_iLeftGroundHealth = -1;
1456-
if ( GetFlags() & FL_ONGROUND )
1457-
{
1458-
// Airborne conditions end on ground contact
1459-
m_Shared.RemoveCond( TF_COND_KNOCKED_INTO_AIR );
1460-
m_Shared.RemoveCond( TF_COND_AIR_CURRENT );
1461-
1462-
if ( m_Shared.InCond( TF_COND_ROCKETPACK ) )
1463-
{
1464-
// Make sure we're still not dealing with launch, where it's possible
1465-
// to hit your head and fall to the ground before the second stage.
1466-
CTFWeaponBase *pRocketPack = Weapon_OwnsThisID( TF_WEAPON_ROCKETPACK );
1467-
if ( pRocketPack )
1468-
{
1469-
if ( gpGlobals->curtime > ( static_cast< CTFRocketPack* >( pRocketPack )->GetRefireTime() ) )
1470-
{
1471-
EmitSound( "Weapon_RocketPack.BoostersShutdown" );
1472-
EmitSound( "Weapon_RocketPack.Land" );
1473-
m_Shared.RemoveCond( TF_COND_ROCKETPACK );
1474-
1475-
IGameEvent *pEvent = gameeventmanager->CreateEvent( "rocketpack_landed" );
1476-
if ( pEvent )
1477-
{
1478-
pEvent->SetInt( "userid", GetUserID() );
1479-
gameeventmanager->FireEvent( pEvent );
1480-
}
1481-
}
1482-
}
1483-
}
1484-
}
14851455

14861456
if ( m_iBlastJumpState )
14871457
{

src/game/shared/tf/tf_player_shared.cpp

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "tf_mapinfo.h"
3232
#include "tf_dropped_weapon.h"
3333
#include "tf_weapon_passtime_gun.h"
34+
#include "tf_weapon_rocketpack.h"
3435
#include <functional>
3536

3637
// Client specific.
@@ -471,7 +472,10 @@ BEGIN_PREDICTION_DATA_NO_BASE( CTFPlayerShared )
471472
DEFINE_PRED_FIELD( m_bHasPasstimeBall, FIELD_BOOLEAN, FTYPEDESC_INSENDTABLE ),
472473
DEFINE_PRED_FIELD( m_bIsTargetedForPasstimePass, FIELD_BOOLEAN, FTYPEDESC_INSENDTABLE ), // does this belong here?
473474
DEFINE_PRED_FIELD( m_askForBallTime, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
475+
DEFINE_PRED_FIELD( m_flHolsterAnimTime, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
474476
DEFINE_PRED_ARRAY( m_flItemChargeMeter, FIELD_FLOAT, LAST_LOADOUT_SLOT_WITH_CHARGE_METER, FTYPEDESC_INSENDTABLE ),
477+
DEFINE_PRED_FIELD( m_iStunIndex, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ),
478+
DEFINE_PRED_FIELD( m_bScattergunJump, FIELD_BOOLEAN, 0 ),
475479
END_PREDICTION_DATA()
476480

477481
// Server specific.
@@ -1005,7 +1009,6 @@ void CTFPlayerShared::Spawn( void )
10051009
SetRevengeCrits( 0 );
10061010

10071011
m_PlayerStuns.RemoveAll();
1008-
m_iStunIndex = -1;
10091012

10101013
m_iPasstimeThrowAnimState = PASSTIME_THROW_ANIM_NONE;
10111014
m_bHasPasstimeBall = false;
@@ -1014,6 +1017,7 @@ void CTFPlayerShared::Spawn( void )
10141017
#else
10151018
m_bSyncingConditions = false;
10161019
#endif
1020+
m_iStunIndex = -1;
10171021
m_bKingRuneBuffActive = false;
10181022

10191023
// Reset our assist here incase something happens before we get killed
@@ -3090,9 +3094,48 @@ void CTFPlayerShared::ConditionThink( void )
30903094

30913095
VehicleThink();
30923096

3093-
if ( m_pOuter->GetFlags() & FL_ONGROUND && InCond( TF_COND_PARACHUTE_ACTIVE ) )
3097+
if ( m_pOuter->GetFlags() & FL_ONGROUND )
30943098
{
3095-
RemoveCond( TF_COND_PARACHUTE_ACTIVE );
3099+
// Airborne conditions end on ground contact
3100+
RemoveCond( TF_COND_KNOCKED_INTO_AIR );
3101+
RemoveCond( TF_COND_AIR_CURRENT );
3102+
3103+
if ( InCond( TF_COND_PARACHUTE_ACTIVE ) )
3104+
{
3105+
RemoveCond( TF_COND_PARACHUTE_ACTIVE );
3106+
}
3107+
3108+
if ( InCond( TF_COND_ROCKETPACK ) )
3109+
{
3110+
// Make sure we're still not dealing with launch, where it's possible
3111+
// to hit your head and fall to the ground before the second stage.
3112+
CTFWeaponBase *pRocketPack = m_pOuter->Weapon_OwnsThisID( TF_WEAPON_ROCKETPACK );
3113+
if ( pRocketPack )
3114+
{
3115+
if ( gpGlobals->curtime > ( static_cast< CTFRocketPack* >( pRocketPack )->GetRefireTime() ) )
3116+
{
3117+
#ifdef CLIENT_DLL
3118+
if ( prediction->IsFirstTimePredicted() )
3119+
#endif
3120+
{
3121+
CPASAttenuationFilter filter( m_pOuter );
3122+
filter.UsePredictionRules();
3123+
m_pOuter->EmitSound( filter, m_pOuter->entindex(), "Weapon_RocketPack.BoostersShutdown" );
3124+
m_pOuter->EmitSound( filter, m_pOuter->entindex(), "Weapon_RocketPack.Land" );
3125+
}
3126+
RemoveCond( TF_COND_ROCKETPACK );
3127+
3128+
#ifdef GAME_DLL
3129+
IGameEvent *pEvent = gameeventmanager->CreateEvent( "rocketpack_landed" );
3130+
if ( pEvent )
3131+
{
3132+
pEvent->SetInt( "userid", m_pOuter->GetUserID() );
3133+
gameeventmanager->FireEvent( pEvent );
3134+
}
3135+
#endif
3136+
}
3137+
}
3138+
}
30963139
}
30973140

30983141
// See if we should be pulsing our radius heal
@@ -7301,6 +7344,8 @@ void CTFPlayerShared::OnRemoveStunned( void )
73017344
m_iStunFlags = 0;
73027345
m_hStunner = NULL;
73037346

7347+
m_iStunIndex = -1;
7348+
73047349
#ifdef CLIENT_DLL
73057350
if ( m_pOuter->m_pStunnedEffect )
73067351
{
@@ -7310,7 +7355,6 @@ void CTFPlayerShared::OnRemoveStunned( void )
73107355
m_pOuter->m_pStunnedEffect = NULL;
73117356
}
73127357
#else
7313-
m_iStunIndex = -1;
73147358
m_PlayerStuns.RemoveAll();
73157359
#endif
73167360

@@ -9624,15 +9668,16 @@ bool CTFPlayerShared::AddToSpyCloakMeter( float val, bool bForce )
96249668

96259669
#endif
96269670

9627-
#ifdef GAME_DLL
96289671
//-----------------------------------------------------------------------------
96299672
// Purpose: Stun & Snare Application
96309673
//-----------------------------------------------------------------------------
96319674
void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iStunFlags, CTFPlayer* pAttacker )
96329675
{
9676+
#ifdef GAME_DLL
96339677
// Insanity prevention
96349678
if ( ( m_PlayerStuns.Count() + 1 ) >= 250 )
96359679
return;
9680+
#endif
96369681

96379682
if ( InCond( TF_COND_PHASE ) || InCond( TF_COND_PASSTIME_INTERCEPTION ) )
96389683
return;
@@ -9643,11 +9688,13 @@ void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iSt
96439688
if ( InCond( TF_COND_INVULNERABLE_HIDE_UNLESS_DAMAGED ) && !InCond( TF_COND_MVM_BOT_STUN_RADIOWAVE ) )
96449689
return;
96459690

9691+
#ifdef GAME_DLL
96469692
if ( pAttacker && TFGameRules() && TFGameRules()->IsTruceActive() && pAttacker->IsTruceValidForEnt() )
96479693
{
96489694
if ( ( pAttacker->GetTeamNumber() == TF_TEAM_RED ) || ( pAttacker->GetTeamNumber() == TF_TEAM_BLUE ) )
96499695
return;
96509696
}
9697+
#endif
96519698

96529699
float flRemapAmount = RemapValClamped( flReductionAmount, 0.0, 1.0, 0, 255 );
96539700

@@ -9674,10 +9721,13 @@ void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iSt
96749721
}
96759722
else if ( GetActiveStunInfo() )
96769723
{
9724+
#ifdef GAME_DLL
96779725
// Something yanked our TF_COND_STUNNED in an unexpected way
96789726
if ( !HushAsserts() )
96799727
Assert( !"Something yanked out TF_COND_STUNNED." );
96809728
m_PlayerStuns.RemoveAll();
9729+
#endif
9730+
m_iStunIndex = -1;
96819731
return;
96829732
}
96839733

@@ -9699,7 +9749,16 @@ void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iSt
96999749
// This can happen when stuns use TF_STUN_CONTROLS or TF_STUN_LOSER_STATE.
97009750
float flOldStun = GetActiveStunInfo() ? GetActiveStunInfo()->flStunAmount : 0.f;
97019751

9752+
#ifdef GAME_DLL
97029753
m_iStunIndex = m_PlayerStuns.AddToTail( stunEvent );
9754+
#else
9755+
m_iStunIndex = 0;
9756+
9757+
if ( prediction->IsFirstTimePredicted() )
9758+
{
9759+
m_ActiveStunInfo = stunEvent;
9760+
}
9761+
#endif
97039762

97049763
if ( flOldStun > flRemapAmount )
97059764
{
@@ -9709,10 +9768,18 @@ void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iSt
97099768
else
97109769
{
97119770
// Done for now
9771+
#ifdef GAME_DLL
97129772
m_PlayerStuns.AddToTail( stunEvent );
9773+
#else
9774+
if ( prediction->IsFirstTimePredicted() )
9775+
{
9776+
m_ActiveStunInfo = stunEvent;
9777+
}
9778+
#endif
97139779
return;
97149780
}
97159781

9782+
#ifdef GAME_DLL
97169783
// Add in extra time when TF_STUN_CONTROLS
97179784
if ( GetActiveStunInfo()->iStunFlags & TF_STUN_CONTROLS )
97189785
{
@@ -9766,10 +9833,10 @@ void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iSt
97669833
m_pOuter->ClearExpression();
97679834
m_pOuter->ClearWeaponFireScene();
97689835
}
9836+
#endif
97699837

97709838
AddCond( TF_COND_STUNNED, -1.f, pAttacker );
97719839
}
9772-
#endif // GAME_DLL
97739840

97749841
//-----------------------------------------------------------------------------
97759842
// Purpose: Returns the intensity of the current stun effect, if we have the type of stun indicated.

src/game/shared/tf/tf_player_shared.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,9 +560,7 @@ class CTFPlayerShared : public CGameEventListener
560560

561561
// Stuns
562562
stun_struct_t *GetActiveStunInfo( void ) const;
563-
#ifdef GAME_DLL
564563
void StunPlayer( float flTime, float flReductionAmount, int iStunFlags = TF_STUN_MOVEMENT, CTFPlayer* pAttacker = NULL );
565-
#endif // GAME_DLL
566564
float GetAmountStunned( int iStunFlags );
567565
bool IsLoserStateStunned( void ) const;
568566
bool IsControlStunned( void );

0 commit comments

Comments
 (0)