Merge branch 'ValveSoftware:master' into ejectbrass_fix

This commit is contained in:
NachosChipeados 2025-03-25 10:07:45 -04:00 committed by GitHub
commit 9bcd2454eb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
30 changed files with 217 additions and 128 deletions

View file

@ -18,6 +18,6 @@ WARRANTY OF ANY KIND. VALVE EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS O
INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, TITLE AND FITNESS FOR A PARTICULAR PURPOSE.
LIMITATION OF LIABILITY. VALVE AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL,
OR CONSEQUENTIAL DAMAGES WHATSOEVER ) THAT MAY BE INCURRED BY YOU EVEN IF VALVE HAS BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF SUCH DAMAGES.
OR CONSEQUENTIAL DAMAGES WHATSOEVER THAT MAY BE INCURRED BY YOU EVEN IF VALVE HAS BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF SUCH DAMAGES.

View file

@ -16,7 +16,11 @@ Clone the repository using the following command:
Requirements:
- Source SDK 2013 Multiplayer installed via Steam
- Visual Studio 2022
- Visual Studio 2022 with the following workload and components:
- Desktop development with C++:
- MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)
- Windows 11 SDK (10.0.22621.0) or Windows 10 SDK (10.0.19041.1)
- Python 3.13 or later
Inside the cloned directory, navigate to `src`, run:
```bat

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -191,12 +191,12 @@ void CMoveHelperClient::ProcessImpacts( void )
}
// misyl: Debug
if ( vOldLocalVel != vOldAbsVel )
{
Msg( "%d\n", gpGlobals->tickcount );
Msg( "vOldLocalVel: %f %f %f\n", vOldLocalVel.x, vOldLocalVel.y, vOldLocalVel.z );
Msg( "vOldAbsVel: %f %f %f\n", vOldAbsVel.x, vOldAbsVel.y, vOldAbsVel.z );
}
// if ( vOldLocalVel != vOldAbsVel )
// {
// Msg( "%d\n", gpGlobals->tickcount );
// Msg( "vOldLocalVel: %f %f %f\n", vOldLocalVel.x, vOldLocalVel.y, vOldLocalVel.z );
// Msg( "vOldAbsVel: %f %f %f\n", vOldAbsVel.x, vOldAbsVel.y, vOldAbsVel.z );
// }
// Restore the velocity
m_pHost->SetAbsVelocity( vOldAbsVel );
//m_pHost->SetLocalVelocity( vOldLocalVel );

View file

@ -547,7 +547,7 @@ void CTFAutoRP::ModifySpeech( const char *pszInText, char *pszOutText, int iOutL
{
szStoredWord[0] = toupper( szStoredWord[0] );
}
else if ( pszCurWord[0] >= 'a' && pszCurWord[0] <= 'a' )
else if ( pszCurWord[0] >= 'a' && pszCurWord[0] <= 'z' )
{
szStoredWord[0] = tolower( szStoredWord[0] );
}

View file

@ -40,6 +40,7 @@ public:
virtual Vector EyePosition( void );
virtual INextBot *MyNextBotPointer( void ) { return this; }
virtual bool IsNextBot(void) const { return true; }
// Event hooks into NextBot system ---------------------------------------
virtual int OnTakeDamage_Alive( const CTakeDamageInfo &info );

View file

@ -996,6 +996,9 @@ public:
void TraceBleed( float flDamage, const Vector &vecDir, trace_t *ptr, int bitsDamageType );
virtual bool IsTriggered( CBaseEntity *pActivator ) {return true;}
virtual bool IsNPC( void ) const { return false; }
#ifdef NEXT_BOT
virtual bool IsNextBot(void) const { return false; }
#endif
CAI_BaseNPC *MyNPCPointer( void );
virtual CBaseCombatCharacter *MyCombatCharacterPointer( void ) { return NULL; }
virtual INextBot *MyNextBotPointer( void ) { return NULL; }

View file

@ -95,9 +95,9 @@ ConVar spec_freeze_traveltime( "spec_freeze_traveltime", "0.4", FCVAR_CHEAT | FC
ConVar sv_bonus_challenge( "sv_bonus_challenge", "0", FCVAR_REPLICATED, "Set to values other than 0 to select a bonus map challenge type." );
ConVar sv_chat_bucket_size_tier1( "sv_chat_bucket_size_tier1", "4", FCVAR_NONE, "The maxmimum size of the short term chat msg bucket." );
ConVar sv_chat_bucket_size_tier1( "sv_chat_bucket_size_tier1", "4", FCVAR_NONE, "The maximum size of the short term chat msg bucket." );
ConVar sv_chat_seconds_per_msg_tier1( "sv_chat_seconds_per_msg_tier1", "3", FCVAR_NONE, "The number of seconds to accrue an additional short term chat msg." );
ConVar sv_chat_bucket_size_tier2( "sv_chat_bucket_size_tier2", "30", FCVAR_NONE, "The maxmimum size of the long term chat msg bucket." );
ConVar sv_chat_bucket_size_tier2( "sv_chat_bucket_size_tier2", "30", FCVAR_NONE, "The maximum size of the long term chat msg bucket." );
ConVar sv_chat_seconds_per_msg_tier2( "sv_chat_seconds_per_msg_tier2", "10", FCVAR_NONE, "The number of seconds to accrue an additional long term chat msg." );
static ConVar sv_maxusrcmdprocessticks( "sv_maxusrcmdprocessticks", "24", FCVAR_NOTIFY, "Maximum number of client-issued usrcmd ticks that can be replayed in packet loss conditions, 0 to allow no restrictions" );
@ -8101,13 +8101,6 @@ void CMovementSpeedMod::InputSpeedMod(inputdata_t &data)
}
}
void SendProxy_CropFlagsToPlayerFlagBitsLength( const SendProp* pProp, const void* pStruct, const void* pVarData, DVariant* pOut, int iElement, int objectID )
{
int mask = ( 1 << PLAYER_FLAG_BITS ) - 1;
int data = *( int* )pVarData;
pOut->m_Int = ( data & mask );
}
// -------------------------------------------------------------------------------- //
// SendTable for CPlayerState.
@ -8187,7 +8180,7 @@ void SendProxy_CropFlagsToPlayerFlagBitsLength( const SendProp* pProp, const voi
SendPropInt (SENDINFO(m_iBonusProgress), 15 ),
SendPropInt (SENDINFO(m_iBonusChallenge), 4 ),
SendPropFloat (SENDINFO(m_flMaxspeed), 12, SPROP_ROUNDDOWN, 0.0f, 2048.0f ), // CL
SendPropInt (SENDINFO(m_fFlags), PLAYER_FLAG_BITS, SPROP_UNSIGNED|SPROP_CHANGES_OFTEN, SendProxy_CropFlagsToPlayerFlagBitsLength ),
SendPropInt (SENDINFO(m_fFlags), 0, SPROP_UNSIGNED|SPROP_CHANGES_OFTEN ),
SendPropInt (SENDINFO(m_iObserverMode), 3, SPROP_UNSIGNED ),
SendPropEHandle (SENDINFO(m_hObserverTarget) ),
SendPropInt (SENDINFO(m_iFOV), 8, SPROP_UNSIGNED ),

View file

@ -1156,7 +1156,8 @@ int CTeamControlPointMaster::GetNumPointsOwnedByTeam( int iTeam )
//-----------------------------------------------------------------------------
int CTeamControlPointMaster::CalcNumRoundsRemaining( int iTeam )
{
if (m_ControlPointRounds.Count() == 0) return 0;
if ( m_ControlPointRounds.IsEmpty() )
return 0;
// To determine how many rounds remain for a given team if it consistently wins mini-rounds, we have to
// simulate forward each mini-round and track the control point ownership that would result

View file

@ -70,7 +70,14 @@ ActionResult< CTFBot > CTFBotSpyHide::Update( CTFBot *me, float interval )
if ( m_talkTimer.IsElapsed() )
{
m_talkTimer.Start( RandomFloat( 5.0f, 10.0f ) );
me->EmitSound( "Spy.TeaseVictim" );
if ( TFGameRules()->IsMannVsMachineMode() && me->GetTeamNumber() == TF_TEAM_PVE_INVADERS )
{
me->EmitSound( "Spy.MVM_TeaseVictim" );
}
else
{
me->EmitSound( "Spy.TeaseVictim" );
}
}
if ( m_isAtGoal )

View file

@ -126,7 +126,6 @@
#include "tf_revive.h"
#include "tf_logic_halloween_2014.h"
#include "tf_logic_player_destruction.h"
#include "tf_weapon_rocketpack.h"
#include "tf_weapon_slap.h"
#include "func_croc.h"
#include "tf_weapon_bonesaw.h"
@ -997,7 +996,6 @@ CTFPlayer::CTFPlayer()
m_flNextChangeClassTime = 0.0f;
m_flNextChangeTeamTime = 0.0f;
m_bScattergunJump = false;
m_iOldStunFlags = 0;
m_iLastWeaponSlot = 1;
m_iNumberofDominations = 0;
@ -1453,35 +1451,6 @@ void CTFPlayer::TFPlayerThink()
else
{
m_iLeftGroundHealth = -1;
if ( GetFlags() & FL_ONGROUND )
{
// Airborne conditions end on ground contact
m_Shared.RemoveCond( TF_COND_KNOCKED_INTO_AIR );
m_Shared.RemoveCond( TF_COND_AIR_CURRENT );
if ( m_Shared.InCond( TF_COND_ROCKETPACK ) )
{
// Make sure we're still not dealing with launch, where it's possible
// to hit your head and fall to the ground before the second stage.
CTFWeaponBase *pRocketPack = Weapon_OwnsThisID( TF_WEAPON_ROCKETPACK );
if ( pRocketPack )
{
if ( gpGlobals->curtime > ( static_cast< CTFRocketPack* >( pRocketPack )->GetRefireTime() ) )
{
EmitSound( "Weapon_RocketPack.BoostersShutdown" );
EmitSound( "Weapon_RocketPack.Land" );
m_Shared.RemoveCond( TF_COND_ROCKETPACK );
IGameEvent *pEvent = gameeventmanager->CreateEvent( "rocketpack_landed" );
if ( pEvent )
{
pEvent->SetInt( "userid", GetUserID() );
gameeventmanager->FireEvent( pEvent );
}
}
}
}
}
if ( m_iBlastJumpState )
{
@ -2833,6 +2802,7 @@ void CTFPlayer::PrecacheMvM()
PrecacheScriptSound( "MVM.DeployBombGiant" );
PrecacheScriptSound( "Weapon_Upgrade.ExplosiveHeadshot" );
PrecacheScriptSound( "Spy.MVM_Chuckle" );
PrecacheScriptSound( "Spy.MVM_TeaseVictim" );
PrecacheScriptSound( "MVM.Robot_Engineer_Spawn" );
PrecacheScriptSound( "MVM.Robot_Teleporter_Deliver" );
PrecacheScriptSound( "MVM.MoneyPickup" );
@ -3781,7 +3751,6 @@ void CTFPlayer::Spawn()
m_Shared.SetFeignDeathReady( false );
m_bScattergunJump = false;
m_iOldStunFlags = 0;
m_flAccumulatedHealthRegen = 0;

View file

@ -938,7 +938,6 @@ public:
bool m_bSuicideExplode;
bool m_bScattergunJump;
int m_iOldStunFlags;
bool m_bFlipViewModels;

View file

@ -54,8 +54,6 @@ BEGIN_DATADESC( CBaseGrenade )
END_DATADESC()
void SendProxy_CropFlagsToPlayerFlagBitsLength( const SendProp *pProp, const void *pStruct, const void *pVarData, DVariant *pOut, int iElement, int objectID);
#endif
IMPLEMENT_NETWORKCLASS_ALIASED( BaseGrenade, DT_BaseGrenade )
@ -70,7 +68,7 @@ BEGIN_NETWORK_TABLE( CBaseGrenade, DT_BaseGrenade )
SendPropVector( SENDINFO( m_vecVelocity ), 0, SPROP_NOSCALE ),
// HACK: Use same flag bits as player for now
SendPropInt ( SENDINFO(m_fFlags), PLAYER_FLAG_BITS, SPROP_UNSIGNED, SendProxy_CropFlagsToPlayerFlagBitsLength ),
SendPropInt ( SENDINFO(m_fFlags), 0, SPROP_UNSIGNED ),
#else
RecvPropFloat( RECVINFO( m_flDamage ) ),
RecvPropFloat( RECVINFO( m_DmgRadius ) ),

View file

@ -11,6 +11,7 @@
#ifdef CLIENT_DLL
#include "c_hl2mp_player.h"
#include <prediction.h>
#else
#include "hl2mp_player.h"
#endif
@ -133,16 +134,18 @@ void CWeapon357::PrimaryAttack( void )
// Fire the bullets, and force the first shot to be perfectly accuracy
pPlayer->FireBullets( info );
#ifdef CLIENT_DLL
//Disorient the player
QAngle angles = pPlayer->GetLocalAngles();
angles.x += random->RandomInt( -1, 1 );
angles.y += random->RandomInt( -1, 1 );
angles.z = 0;
#ifndef CLIENT_DLL
pPlayer->SnapEyeAngles( angles );
#endif
if ( prediction->IsFirstTimePredicted() )
{
QAngle angles;
engine->GetViewAngles( angles );
angles.x += random->RandomInt( -1, 1 );
angles.y += random->RandomInt( -1, 1 );
angles.z += 0.0f;
engine->SetViewAngles( angles );
}
#endif // CLIENT_DLL
pPlayer->ViewPunch( QAngle( -8, random->RandomFloat( -2, 2 ), 0 ) );

View file

@ -2957,9 +2957,9 @@ void CTFGameMovement::SetGroundEntity( trace_t *pm )
{
m_pTFPlayer->SpeakConceptIfAllowed( MP_CONCEPT_DOUBLE_JUMP, "started_jumping:0" );
}
m_pTFPlayer->m_Shared.SetWeaponKnockbackID( -1 );
m_pTFPlayer->m_bScattergunJump = false;
#endif // GAME_DLL
m_pTFPlayer->m_Shared.SetWeaponKnockbackID( -1 );
m_pTFPlayer->m_Shared.m_bScattergunJump = false;
m_pTFPlayer->m_Shared.SetAirDash( 0 );
m_pTFPlayer->m_Shared.SetAirDucked( 0 );

View file

@ -31,6 +31,7 @@
#include "tf_mapinfo.h"
#include "tf_dropped_weapon.h"
#include "tf_weapon_passtime_gun.h"
#include "tf_weapon_rocketpack.h"
#include <functional>
// Client specific.
@ -471,7 +472,10 @@ BEGIN_PREDICTION_DATA_NO_BASE( CTFPlayerShared )
DEFINE_PRED_FIELD( m_bHasPasstimeBall, FIELD_BOOLEAN, FTYPEDESC_INSENDTABLE ),
DEFINE_PRED_FIELD( m_bIsTargetedForPasstimePass, FIELD_BOOLEAN, FTYPEDESC_INSENDTABLE ), // does this belong here?
DEFINE_PRED_FIELD( m_askForBallTime, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
DEFINE_PRED_FIELD( m_flHolsterAnimTime, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
DEFINE_PRED_ARRAY( m_flItemChargeMeter, FIELD_FLOAT, LAST_LOADOUT_SLOT_WITH_CHARGE_METER, FTYPEDESC_INSENDTABLE ),
DEFINE_PRED_FIELD( m_iStunIndex, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ),
DEFINE_PRED_FIELD( m_bScattergunJump, FIELD_BOOLEAN, 0 ),
END_PREDICTION_DATA()
// Server specific.
@ -784,6 +788,8 @@ CTFPlayerShared::CTFPlayerShared()
m_flPrevInvisibility = 0.f;
m_flTmpDamageBonusAmount = 1.0f;
m_bScattergunJump = false;
m_bFeignDeathReady = false;
m_fCloakConsumeRate = tf_spy_cloak_consume_rate.GetFloat();
@ -1005,7 +1011,6 @@ void CTFPlayerShared::Spawn( void )
SetRevengeCrits( 0 );
m_PlayerStuns.RemoveAll();
m_iStunIndex = -1;
m_iPasstimeThrowAnimState = PASSTIME_THROW_ANIM_NONE;
m_bHasPasstimeBall = false;
@ -1014,6 +1019,7 @@ void CTFPlayerShared::Spawn( void )
#else
m_bSyncingConditions = false;
#endif
m_iStunIndex = -1;
m_bKingRuneBuffActive = false;
// Reset our assist here incase something happens before we get killed
@ -3090,9 +3096,48 @@ void CTFPlayerShared::ConditionThink( void )
VehicleThink();
if ( m_pOuter->GetFlags() & FL_ONGROUND && InCond( TF_COND_PARACHUTE_ACTIVE ) )
if ( m_pOuter->GetFlags() & FL_ONGROUND )
{
RemoveCond( TF_COND_PARACHUTE_ACTIVE );
// Airborne conditions end on ground contact
RemoveCond( TF_COND_KNOCKED_INTO_AIR );
RemoveCond( TF_COND_AIR_CURRENT );
if ( InCond( TF_COND_PARACHUTE_ACTIVE ) )
{
RemoveCond( TF_COND_PARACHUTE_ACTIVE );
}
if ( InCond( TF_COND_ROCKETPACK ) )
{
// Make sure we're still not dealing with launch, where it's possible
// to hit your head and fall to the ground before the second stage.
CTFWeaponBase *pRocketPack = m_pOuter->Weapon_OwnsThisID( TF_WEAPON_ROCKETPACK );
if ( pRocketPack )
{
if ( gpGlobals->curtime > ( static_cast< CTFRocketPack* >( pRocketPack )->GetRefireTime() ) )
{
#ifdef CLIENT_DLL
if ( prediction->IsFirstTimePredicted() )
#endif
{
CPASAttenuationFilter filter( m_pOuter );
filter.UsePredictionRules();
m_pOuter->EmitSound( filter, m_pOuter->entindex(), "Weapon_RocketPack.BoostersShutdown" );
m_pOuter->EmitSound( filter, m_pOuter->entindex(), "Weapon_RocketPack.Land" );
}
RemoveCond( TF_COND_ROCKETPACK );
#ifdef GAME_DLL
IGameEvent *pEvent = gameeventmanager->CreateEvent( "rocketpack_landed" );
if ( pEvent )
{
pEvent->SetInt( "userid", m_pOuter->GetUserID() );
gameeventmanager->FireEvent( pEvent );
}
#endif
}
}
}
}
// See if we should be pulsing our radius heal
@ -7301,6 +7346,8 @@ void CTFPlayerShared::OnRemoveStunned( void )
m_iStunFlags = 0;
m_hStunner = NULL;
m_iStunIndex = -1;
#ifdef CLIENT_DLL
if ( m_pOuter->m_pStunnedEffect )
{
@ -7310,7 +7357,6 @@ void CTFPlayerShared::OnRemoveStunned( void )
m_pOuter->m_pStunnedEffect = NULL;
}
#else
m_iStunIndex = -1;
m_PlayerStuns.RemoveAll();
#endif
@ -9624,15 +9670,16 @@ bool CTFPlayerShared::AddToSpyCloakMeter( float val, bool bForce )
#endif
#ifdef GAME_DLL
//-----------------------------------------------------------------------------
// Purpose: Stun & Snare Application
//-----------------------------------------------------------------------------
void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iStunFlags, CTFPlayer* pAttacker )
{
#ifdef GAME_DLL
// Insanity prevention
if ( ( m_PlayerStuns.Count() + 1 ) >= 250 )
return;
#endif
if ( InCond( TF_COND_PHASE ) || InCond( TF_COND_PASSTIME_INTERCEPTION ) )
return;
@ -9643,11 +9690,13 @@ void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iSt
if ( InCond( TF_COND_INVULNERABLE_HIDE_UNLESS_DAMAGED ) && !InCond( TF_COND_MVM_BOT_STUN_RADIOWAVE ) )
return;
#ifdef GAME_DLL
if ( pAttacker && TFGameRules() && TFGameRules()->IsTruceActive() && pAttacker->IsTruceValidForEnt() )
{
if ( ( pAttacker->GetTeamNumber() == TF_TEAM_RED ) || ( pAttacker->GetTeamNumber() == TF_TEAM_BLUE ) )
return;
}
#endif
float flRemapAmount = RemapValClamped( flReductionAmount, 0.0, 1.0, 0, 255 );
@ -9674,10 +9723,13 @@ void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iSt
}
else if ( GetActiveStunInfo() )
{
#ifdef GAME_DLL
// Something yanked our TF_COND_STUNNED in an unexpected way
if ( !HushAsserts() )
Assert( !"Something yanked out TF_COND_STUNNED." );
m_PlayerStuns.RemoveAll();
#endif
m_iStunIndex = -1;
return;
}
@ -9699,7 +9751,16 @@ void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iSt
// This can happen when stuns use TF_STUN_CONTROLS or TF_STUN_LOSER_STATE.
float flOldStun = GetActiveStunInfo() ? GetActiveStunInfo()->flStunAmount : 0.f;
#ifdef GAME_DLL
m_iStunIndex = m_PlayerStuns.AddToTail( stunEvent );
#else
m_iStunIndex = 0;
if ( prediction->IsFirstTimePredicted() )
{
m_ActiveStunInfo = stunEvent;
}
#endif
if ( flOldStun > flRemapAmount )
{
@ -9709,10 +9770,18 @@ void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iSt
else
{
// Done for now
#ifdef GAME_DLL
m_PlayerStuns.AddToTail( stunEvent );
#else
if ( prediction->IsFirstTimePredicted() )
{
m_ActiveStunInfo = stunEvent;
}
#endif
return;
}
#ifdef GAME_DLL
// Add in extra time when TF_STUN_CONTROLS
if ( GetActiveStunInfo()->iStunFlags & TF_STUN_CONTROLS )
{
@ -9766,10 +9835,10 @@ void CTFPlayerShared::StunPlayer( float flTime, float flReductionAmount, int iSt
m_pOuter->ClearExpression();
m_pOuter->ClearWeaponFireScene();
}
#endif
AddCond( TF_COND_STUNNED, -1.f, pAttacker );
}
#endif // GAME_DLL
//-----------------------------------------------------------------------------
// Purpose: Returns the intensity of the current stun effect, if we have the type of stun indicated.

View file

@ -560,9 +560,7 @@ public:
// Stuns
stun_struct_t *GetActiveStunInfo( void ) const;
#ifdef GAME_DLL
void StunPlayer( float flTime, float flReductionAmount, int iStunFlags = TF_STUN_MOVEMENT, CTFPlayer* pAttacker = NULL );
#endif // GAME_DLL
float GetAmountStunned( int iStunFlags );
bool IsLoserStateStunned( void ) const;
bool IsControlStunned( void );
@ -1218,6 +1216,8 @@ private:
#endif
public:
bool m_bScattergunJump;
float m_flStunFade;
float m_flStunEnd;
float m_flStunMid;

View file

@ -1144,7 +1144,7 @@ protected:
int nNumJumps = pNonConstPlayer->GetGroundEntity() == NULL ? 1 : 0;
nNumJumps += pPlayer->m_Shared.GetAirDash();
nNumJumps += pPlayer->m_bScattergunJump;
nNumJumps += pPlayer->m_Shared.m_bScattergunJump;
if ( m_eJumpingState == JUMPING_STATE_IS_NOT_JUMPING )
{
@ -3027,7 +3027,7 @@ bool CTFJumpStateQuestModifier::BPassesModifier( const CTFPlayer *pOwner, Invali
#else
int nNumJumps = const_cast< CTFPlayer* >( pOwner )->GetGroundEntity() == NULL ? 1 : 0;
nNumJumps += pOwner->m_Shared.GetAirDash();
nNumJumps += pOwner->m_bScattergunJump;
nNumJumps += pOwner->m_Shared.m_bScattergunJump;
// If we want them on the ground, make sure they're on the ground
if ( m_nJumpCount == 0 )

View file

@ -13,6 +13,7 @@
#ifdef CLIENT_DLL
#include "c_tf_player.h"
#include "c_rope.h"
#include "prediction.h"
// Server specific.
#else
#include "tf_player.h"
@ -47,7 +48,10 @@ END_NETWORK_TABLE()
#ifdef CLIENT_DLL
BEGIN_PREDICTION_DATA( CTFRocketPack )
DEFINE_PRED_FIELD( m_flInitLaunchTime, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
DEFINE_PRED_FIELD( m_flLaunchTime, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
DEFINE_PRED_FIELD( m_flToggleEndTime, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ),
DEFINE_PRED_FIELD( m_flRefireTime, FIELD_FLOAT, 0 ),
DEFINE_PRED_FIELD( m_bLaunchedFromGround, FIELD_BOOLEAN, 0 ),
END_PREDICTION_DATA()
#endif // CLIENT_DLL
@ -211,10 +215,13 @@ bool CTFRocketPack::InitiateLaunch( void )
CTFPlayer *pOwner = GetTFPlayerOwner();
if ( !pOwner->m_Shared.IsRocketPackReady() )
{
#ifdef GAME_DLL
CPVSFilter filter( WorldSpaceCenter() );
pOwner->EmitSound( filter, entindex(), "Weapon_RocketPack.BoostersNotReady" );
#endif // GAME_DLL
// note: this is never reached
#ifdef CLIENT_DLL
if ( prediction->IsFirstTimePredicted() )
{
pOwner->EmitSound( "Weapon_RocketPack.BoostersNotReady" );
}
#endif
return false;
}
@ -224,16 +231,18 @@ bool CTFRocketPack::InitiateLaunch( void )
return false;
}
#ifdef GAME_DLL
if ( pOwner->m_Shared.IsLoser() )
#ifdef CLIENT_DLL
if ( prediction->IsFirstTimePredicted() )
#endif
{
pOwner->EmitSound( "Weapon_RocketPack.BoostersNotReady" );
CPASAttenuationFilter filter( pOwner );
filter.UsePredictionRules();
pOwner->EmitSound(
filter,
entindex(),
pOwner->m_Shared.IsLoser() ? "Weapon_RocketPack.BoostersNotReady" : "Weapon_RocketPack.BoostersCharge"
);
}
else
{
pOwner->EmitSound( "Weapon_RocketPack.BoostersCharge" );
}
#endif // GAME_DLL
m_flInitLaunchTime = gpGlobals->curtime;
@ -369,7 +378,6 @@ bool CTFRocketPack::ShouldDraw()
#endif // CLIENT_DLL
#ifdef GAME_DLL
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
@ -384,7 +392,7 @@ Vector CTFRocketPack::CalcRocketForceFromPlayer( CTFPlayer *pPlayer )
const float flVertPushScale = ( bOnGround ) ? 0.7f : 0.25f; // Less vertical force while airborne
Vector vecForward, vecRight;
QAngle angAim = ( bOnGround ) ? pPlayer->GetAbsAngles() : pPlayer->EyeAngles();
QAngle angAim = pPlayer->EyeAngles();
AngleVectors( angAim, &vecForward, &vecRight, NULL );
bool bNone = !( pPlayer->m_nButtons & IN_FORWARD ) &&
!( pPlayer->m_nButtons & IN_BACK ) /* &&
@ -468,7 +476,6 @@ void CTFRocketPack::RocketLaunchPlayer( CTFPlayer *pPlayer, const Vector& vecFor
pPlayer->ApplyAbsVelocityImpulse( vecForce );
}
#endif // GAME_DLL
//-----------------------------------------------------------------------------
// Purpose:
@ -482,7 +489,6 @@ bool CTFRocketPack::PreLaunch( void )
pOwner->DoAnimationEvent( PLAYERANIMEVENT_CUSTOM, ACT_MP_ATTACK_STAND_PRIMARYFIRE );
SendWeaponAnim( ACT_VM_PRIMARYATTACK );
#ifdef GAME_DLL
// Negate any fall
Vector vecVel = pOwner->GetAbsVelocity();
if ( vecVel.z < 0.f )
@ -496,14 +502,15 @@ bool CTFRocketPack::PreLaunch( void )
pOwner->ApplyAbsVelocityImpulse( vForward );
pOwner->m_Shared.AddCond( TF_COND_PARACHUTE_ACTIVE );
#ifdef GAME_DLL
const Vector &vecOrigin = pOwner->GetAbsOrigin();
CPVSFilter filter( vecOrigin );
TE_TFParticleEffect( filter, 0.f, "heavy_ring_of_fire", vecOrigin, vec3_angle );
DispatchParticleEffect( "rocketjump_smoke", PATTACH_POINT_FOLLOW, pOwner, "foot_L" );
DispatchParticleEffect( "rocketjump_smoke", PATTACH_POINT_FOLLOW, pOwner, "foot_R" );
#endif // GAME_DLL
m_flLaunchTime = gpGlobals->curtime + tf_rocketpack_launch_delay.GetFloat();
#endif // GAME_DLL
return true;
}
@ -519,16 +526,20 @@ bool CTFRocketPack::Launch( void )
pOwner->StopSound( "Weapon_LooseCannon.Charge" );
#ifdef GAME_DLL
m_flLaunchTime = 0.f;
pOwner->m_Shared.RemoveCond( TF_COND_PARACHUTE_ACTIVE );
#ifdef CLIENT_DLL
Vector m_vecLaunchDir;
#endif
// Launch
m_vecLaunchDir = CalcRocketForceFromPlayer( pOwner );
RocketLaunchPlayer( pOwner, m_vecLaunchDir, false );
#ifdef GAME_DLL
SetContextThink( &CTFRocketPack::PassengerDelayLaunchThink, gpGlobals->curtime + TF_ROCKETPACK_PASSENGER_DELAY_LAUNCH, "PassengerDelayLaunchThink" );
#endif
m_flRefireTime = gpGlobals->curtime + 0.5f;
@ -536,6 +547,7 @@ bool CTFRocketPack::Launch( void )
pOwner->m_Shared.SetRocketPackCharge( pOwner->m_Shared.GetRocketPackCharge() - tf_rocketpack_cost.GetFloat() );
}
#ifdef GAME_DLL
// Knock-back nearby enemies
float flRadius = 150.f;
CUtlVector< CTFPlayer* > vecPushedPlayers;
@ -594,6 +606,7 @@ bool CTFRocketPack::Launch( void )
}
CPASAttenuationFilter filter( pOwner );
filter.UsePredictionRules();
pOwner->EmitSound( filter, pOwner->entindex(), "Weapon_RocketPack.BoostersFire" );
IGameEvent *pEvent = gameeventmanager->CreateEvent( "rocketpack_launch" );
@ -610,7 +623,12 @@ bool CTFRocketPack::Launch( void )
DispatchParticleEffect( ROCKET_PACK_LAUNCH_EFFECT, PATTACH_POINT_FOLLOW, pWearable, "charge_LA" );
DispatchParticleEffect( ROCKET_PACK_LAUNCH_EFFECT, PATTACH_POINT_FOLLOW, pWearable, "charge_RA" );
}
#endif // GAME_DLL
#else
if ( prediction->IsFirstTimePredicted() )
{
pOwner->EmitSound( "Weapon_RocketPack.BoostersFire" );
}
#endif // CLIENT_DLL
return true;
}
@ -748,7 +766,7 @@ void CTFRocketPack::ItemPostFrame( void )
{
ResetTransition();
#ifdef CLIENT_DLL
if ( pOwner == C_TFPlayer::GetLocalTFPlayer() )
if ( pOwner == C_TFPlayer::GetLocalTFPlayer() && prediction->IsFirstTimePredicted() )
{
pOwner->EmitSound( "Weapon_RocketPack.BoostersReady" );
}
@ -757,7 +775,7 @@ void CTFRocketPack::ItemPostFrame( void )
else if ( pOwner->m_afButtonPressed & IN_ATTACK2 )
{
#ifdef CLIENT_DLL
if ( pOwner == C_TFPlayer::GetLocalTFPlayer() )
if ( pOwner == C_TFPlayer::GetLocalTFPlayer() && prediction->IsFirstTimePredicted() )
{
pOwner->EmitSound( "Player.DenyWeaponSelection" );
}
@ -841,14 +859,21 @@ const CEconItemView *CTFRocketPack::GetTauntItem() const
//-----------------------------------------------------------------------------
bool CTFRocketPack::Deploy( void )
{
#ifdef GAME_DLL
CTFPlayer *pOwner = GetTFPlayerOwner();
if ( pOwner )
{
EmitSound( "Weapon_RocketPack.BoostersExtend" );
#ifdef CLIENT_DLL
if ( prediction->IsFirstTimePredicted() )
#endif
{
CPASAttenuationFilter filter( pOwner );
filter.UsePredictionRules();
EmitSound( filter, entindex(), "Weapon_RocketPack.BoostersExtend" );
}
#ifdef GAME_DLL
SetEnabled( true );
#endif
}
#endif // GAME_DLL
return BaseClass::Deploy();
}
@ -861,14 +886,21 @@ void CTFRocketPack::StartHolsterAnim( void )
{
BaseClass::StartHolsterAnim();
#ifdef GAME_DLL
CTFPlayer *pOwner = GetTFPlayerOwner();
if ( pOwner )
{
EmitSound( "Weapon_RocketPack.BoostersRetract" );
#ifdef CLIENT_DLL
if ( prediction->IsFirstTimePredicted() )
#endif
{
CPASAttenuationFilter filter( pOwner );
filter.UsePredictionRules();
EmitSound( filter, entindex(), "Weapon_RocketPack.BoostersRetract" );
}
#ifdef GAME_DLL
SetEnabled( false );
#endif
}
#endif // GAME_DLL
}
@ -890,7 +922,7 @@ void CTFRocketPack::OnResourceMeterFilled()
{
#ifdef CLIENT_DLL
CBasePlayer *pPlayer = GetPlayerOwner();
if ( pPlayer->IsLocalPlayer() )
if ( pPlayer->IsLocalPlayer() && prediction->IsFirstTimePredicted() )
{
pPlayer->EmitSound( "TFPlayer.ReCharged" );
}

View file

@ -71,14 +71,14 @@ private:
bool IsTransitionCompleted( void ) const;
void WaitToLaunch( void );
void RocketLaunchPlayer( CTFPlayer *pPlayer, const Vector& vecForce, bool bIsPassenger );
Vector CalcRocketForceFromPlayer( CTFPlayer *pPlayer );
#ifdef GAME_DLL
void SetEnabled( bool bEnabled );
void PassengerDelayLaunchThink( void );
void RocketLaunchPlayer( CTFPlayer *pPlayer, const Vector& vecForce, bool bIsPassenger );
Vector CalcRocketForceFromPlayer( CTFPlayer *pPlayer );
#else
void CleanupParticles( void );
#endif // GAME_DLL
#endif // CLIENT_DLL
CNetworkVar( float, m_flInitLaunchTime );
CNetworkVar( float, m_flLaunchTime );

View file

@ -316,7 +316,6 @@ extern float AirBurstDamageForce( const Vector &size, float damage, float scale
//-----------------------------------------------------------------------------
void CTFScatterGun::FireBullet( CTFPlayer *pPlayer )
{
#ifndef CLIENT_DLL
if ( HasKnockback() )
{
// Perform some knock back.
@ -329,9 +328,9 @@ void CTFScatterGun::FireBullet( CTFPlayer *pPlayer )
return;
// Knock the firer back!
if ( !(pOwner->GetFlags() & FL_ONGROUND) && !pPlayer->m_bScattergunJump )
if ( !(pOwner->GetFlags() & FL_ONGROUND) && !pPlayer->m_Shared.m_bScattergunJump )
{
pPlayer->m_bScattergunJump = true;
pPlayer->m_Shared.m_bScattergunJump = true;
pOwner->m_Shared.StunPlayer( 0.3f, 1.f, TF_STUN_MOVEMENT | TF_STUN_MOVEMENT_FORWARD_ONLY );
@ -341,15 +340,15 @@ void CTFScatterGun::FireBullet( CTFPlayer *pPlayer )
AngleVectors( pOwner->EyeAngles(), &vecForward );
Vector vecForce = vecForward * -flForce;
EntityMatrix mtxPlayer;
mtxPlayer.InitFromEntity( pOwner );
VMatrix mtxPlayer;
mtxPlayer.SetupMatrixOrgAngles( pOwner->GetAbsOrigin(), pOwner->EyeAngles() );
Vector vecAbsVelocity = pOwner->GetAbsVelocity();
Vector vecAbsVelocityAsPoint = vecAbsVelocity + pOwner->GetAbsOrigin();
Vector vecLocalVelocity = mtxPlayer.WorldToLocal( vecAbsVelocityAsPoint );
Vector vecLocalVelocity = mtxPlayer.VMul4x3Transpose( vecAbsVelocityAsPoint );
vecLocalVelocity.x = -300;
vecAbsVelocityAsPoint = mtxPlayer.LocalToWorld( vecLocalVelocity );
vecAbsVelocityAsPoint = mtxPlayer.VMul4x3( vecLocalVelocity );
vecAbsVelocity = vecAbsVelocityAsPoint - pOwner->GetAbsOrigin();
pOwner->SetAbsVelocity( vecAbsVelocity );
@ -360,7 +359,6 @@ void CTFScatterGun::FireBullet( CTFPlayer *pPlayer )
pOwner->RemoveFlag( FL_ONGROUND );
}
}
#endif
BaseClass::FireBullet( pPlayer );
}

View file

@ -7,7 +7,7 @@
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
@ -43,7 +43,7 @@ END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"#include ""winres.h""\r\n"
"\0"
END

View file

@ -7,7 +7,7 @@
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
@ -43,7 +43,7 @@ END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"#include ""winres.h""\r\n"
"\0"
END

View file

@ -155,7 +155,7 @@ float4 main( PS_INPUT i ) : COLOR
if( bFlashlight )
{
float3 worldSpaceNormal;
// Make the unbumped version not so fucking stupid and not need tangentSpaceTranspose you knob.
// Make the unbumped version not need tangentSpaceTranspose
worldSpaceNormal = mul( normal, i.tangentSpaceTranspose );
int nShadowSampleLevel = 0;

View file

@ -41,7 +41,11 @@ protected:
virtual void PerformLayout();
virtual void Paint();
MESSAGE_FUNC( OnMenuClose, "MenuClose" );
MESSAGE_FUNC_INT( OnCursorEnteredMenuButton, "CursorEnteredMenuButton", VPanel);
#ifdef PLATFORM_64BITS
MESSAGE_FUNC_PTR( OnCursorEnteredMenuButton, "CursorEnteredMenuButton", VPanel );
#else
MESSAGE_FUNC_INT( OnCursorEnteredMenuButton, "CursorEnteredMenuButton", VPanel );
#endif
private:
CUtlVector<MenuButton *> m_pMenuButtons;

View file

@ -221,7 +221,11 @@ void MenuBar::OnMenuClose()
//-----------------------------------------------------------------------------
// Purpose: Message map
//-----------------------------------------------------------------------------
#ifdef PLATFORM_64BITS
void MenuBar::OnCursorEnteredMenuButton(vgui::Panel* VPanel)
#else
void MenuBar::OnCursorEnteredMenuButton(int VPanel)
#endif
{
VPANEL menuButton = (VPANEL)VPanel;
// see if we had a menu open

View file

@ -238,7 +238,11 @@ void MenuButton::OnCursorEntered()
// forward the message on to the parent of this menu.
KeyValues *msg = new KeyValues ("CursorEnteredMenuButton");
// tell the parent this menuitem is the one that was entered so it can open the menu if it wants
#ifdef PLATFORM_64BITS
msg->SetPtr("VPanel", (void*)GetVPanel());
#else
msg->SetInt("VPanel", GetVPanel());
#endif
ivgui()->PostMessage(GetVParent(), msg, NULL);
}

View file

@ -1022,11 +1022,11 @@ void PropertySheet::PerformLayout()
if(_showTabs)
{
_activePage->SetBounds(0, tabHeight, wide, tall - tabHeight);
_activePage->SetBounds(0, tabHeight + m_iPageYOffset, wide, tall - tabHeight);
}
else
{
_activePage->SetBounds(0, 0, wide, tall );
_activePage->SetBounds(0, m_iPageYOffset, wide, tall );
}
_activePage->InvalidateLayout();
}
@ -1060,11 +1060,11 @@ void PropertySheet::PerformLayout()
if (m_PageTabs[i] == _activeTab)
{
// active tab is taller
_activeTab->SetBounds(xtab, 2, width, tabHeight);
_activeTab->SetBounds(xtab, 2 + m_iPageYOffset, width, tabHeight);
}
else
{
m_PageTabs[i]->SetBounds(xtab, 4, width, tabHeight - 2);
m_PageTabs[i]->SetBounds(xtab, 4 + m_iPageYOffset, width, tabHeight - 2);
}
m_PageTabs[i]->SetVisible(true);
xtab += (width + 1) + m_iTabXDelta;