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 ),
475479END_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// -----------------------------------------------------------------------------
96319674void 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.
0 commit comments