aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/shared
diff options
context:
space:
mode:
Diffstat (limited to 'mp/src/game/shared')
-rw-r--r--mp/src/game/shared/activitylist.cpp5
-rw-r--r--mp/src/game/shared/ai_activity.h7
-rw-r--r--mp/src/game/shared/basecombatweapon_shared.h2
-rw-r--r--mp/src/game/shared/basegrenade_shared.h8
-rw-r--r--mp/src/game/shared/baseplayer_shared.cpp2
-rw-r--r--mp/src/game/shared/baseprojectile.cpp26
-rw-r--r--mp/src/game/shared/baseprojectile.h53
-rw-r--r--mp/src/game/shared/baseviewmodel_shared.cpp2
-rw-r--r--mp/src/game/shared/effect_color_tables.h1
-rw-r--r--mp/src/game/shared/gamemovement.cpp20
-rw-r--r--mp/src/game/shared/gamerules.h2
-rw-r--r--mp/src/game/shared/movevars_shared.cpp12
-rw-r--r--mp/src/game/shared/mp_shareddefs.cpp47
-rw-r--r--mp/src/game/shared/mp_shareddefs.h44
-rw-r--r--mp/src/game/shared/multiplay_gamerules.cpp41
-rw-r--r--mp/src/game/shared/multiplay_gamerules.h3
-rw-r--r--mp/src/game/shared/particle_property.cpp23
-rw-r--r--mp/src/game/shared/props_shared.cpp2
-rw-r--r--mp/src/game/shared/props_shared.h2
-rw-r--r--mp/src/game/shared/shareddefs.h12
-rw-r--r--mp/src/game/shared/takedamageinfo.cpp2
-rw-r--r--mp/src/game/shared/takedamageinfo.h3
-rw-r--r--mp/src/game/shared/teamplay_gamerules.cpp6
-rw-r--r--mp/src/game/shared/teamplay_gamerules.h2
-rw-r--r--mp/src/game/shared/teamplay_round_timer.cpp6
-rw-r--r--mp/src/game/shared/teamplayroundbased_gamerules.cpp19
-rw-r--r--mp/src/game/shared/teamplayroundbased_gamerules.h7
-rw-r--r--mp/src/game/shared/voice_banmgr.cpp6
28 files changed, 322 insertions, 43 deletions
diff --git a/mp/src/game/shared/activitylist.cpp b/mp/src/game/shared/activitylist.cpp
index 94bcff15..2b421252 100644
--- a/mp/src/game/shared/activitylist.cpp
+++ b/mp/src/game/shared/activitylist.cpp
@@ -2270,6 +2270,11 @@ void ActivityList_RegisterSharedActivities( void )
REGISTER_SHARED_ACTIVITY( ACT_THROWABLE_VM_IDLE );
REGISTER_SHARED_ACTIVITY( ACT_THROWABLE_VM_FIRE );
+ REGISTER_SHARED_ACTIVITY( ACT_SPELL_VM_DRAW );
+ REGISTER_SHARED_ACTIVITY( ACT_SPELL_VM_IDLE );
+ REGISTER_SHARED_ACTIVITY( ACT_SPELL_VM_ARM );
+ REGISTER_SHARED_ACTIVITY( ACT_SPELL_VM_FIRE );
+
AssertMsg( g_HighestActivity == LAST_SHARED_ACTIVITY - 1, "Not all activities from ai_activity.h registered in activitylist.cpp" );
}
diff --git a/mp/src/game/shared/ai_activity.h b/mp/src/game/shared/ai_activity.h
index 6c5f05c8..fbd10c39 100644
--- a/mp/src/game/shared/ai_activity.h
+++ b/mp/src/game/shared/ai_activity.h
@@ -2097,11 +2097,16 @@ typedef enum
// Throwable Animations
ACT_MP_THROW,
-
ACT_THROWABLE_VM_DRAW,
ACT_THROWABLE_VM_IDLE,
ACT_THROWABLE_VM_FIRE,
+ // Spell Animations
+ ACT_SPELL_VM_DRAW,
+ ACT_SPELL_VM_IDLE,
+ ACT_SPELL_VM_ARM,
+ ACT_SPELL_VM_FIRE,
+
// this is the end of the global activities, private per-monster activities start here.
LAST_SHARED_ACTIVITY,
} Activity;
diff --git a/mp/src/game/shared/basecombatweapon_shared.h b/mp/src/game/shared/basecombatweapon_shared.h
index d773c0c5..701403a0 100644
--- a/mp/src/game/shared/basecombatweapon_shared.h
+++ b/mp/src/game/shared/basecombatweapon_shared.h
@@ -248,7 +248,7 @@ public:
// but they are out of ammo. The default implementation
// either reloads, switches weapons, or plays an empty sound.
- virtual bool ShouldBlockPrimaryFire() { return !AutoFiresFullClip(); }
+ virtual bool ShouldBlockPrimaryFire() { return false; }
#ifdef CLIENT_DLL
virtual void CreateMove( float flInputSampleTime, CUserCmd *pCmd, const QAngle &vecOldViewAngles ) {}
diff --git a/mp/src/game/shared/basegrenade_shared.h b/mp/src/game/shared/basegrenade_shared.h
index 79e34801..38bb684d 100644
--- a/mp/src/game/shared/basegrenade_shared.h
+++ b/mp/src/game/shared/basegrenade_shared.h
@@ -11,6 +11,8 @@
#pragma once
#endif
+#include "baseprojectile.h"
+
#if defined( CLIENT_DLL )
#define CBaseGrenade C_BaseGrenade
@@ -29,12 +31,12 @@
class CTakeDamageInfo;
#if !defined( CLIENT_DLL )
-class CBaseGrenade : public CBaseAnimating, public CDefaultPlayerPickupVPhysics
+class CBaseGrenade : public CBaseProjectile, public CDefaultPlayerPickupVPhysics
#else
-class CBaseGrenade : public CBaseAnimating
+class CBaseGrenade : public CBaseProjectile
#endif
{
- DECLARE_CLASS( CBaseGrenade, CBaseAnimating );
+ DECLARE_CLASS( CBaseGrenade, CBaseProjectile );
public:
CBaseGrenade(void);
diff --git a/mp/src/game/shared/baseplayer_shared.cpp b/mp/src/game/shared/baseplayer_shared.cpp
index f56e72e4..cba09eb7 100644
--- a/mp/src/game/shared/baseplayer_shared.cpp
+++ b/mp/src/game/shared/baseplayer_shared.cpp
@@ -22,7 +22,7 @@
#include "view.h"
#include "client_virtualreality.h"
#define CRecipientFilter C_RecipientFilter
- #include "headtrack/isourcevirtualreality.h"
+ #include "sourcevr/isourcevirtualreality.h"
#else
diff --git a/mp/src/game/shared/baseprojectile.cpp b/mp/src/game/shared/baseprojectile.cpp
new file mode 100644
index 00000000..c695db93
--- /dev/null
+++ b/mp/src/game/shared/baseprojectile.cpp
@@ -0,0 +1,26 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "baseprojectile.h"
+
+
+IMPLEMENT_NETWORKCLASS_ALIASED( BaseProjectile, DT_BaseProjectile )
+
+BEGIN_NETWORK_TABLE( CBaseProjectile, DT_BaseProjectile )
+END_NETWORK_TABLE()
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor.
+//-----------------------------------------------------------------------------
+CBaseProjectile::CBaseProjectile()
+{
+#ifdef GAME_DLL
+ m_iDestroyableHitCount = 0;
+#endif
+}
diff --git a/mp/src/game/shared/baseprojectile.h b/mp/src/game/shared/baseprojectile.h
new file mode 100644
index 00000000..2ff00fc5
--- /dev/null
+++ b/mp/src/game/shared/baseprojectile.h
@@ -0,0 +1,53 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef BASEPROJECTILE_H
+#define BASEPROJECTILE_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "cbase.h"
+
+#ifdef GAME_DLL
+#include "baseanimating.h"
+#else
+#include "c_baseanimating.h"
+#endif
+
+#ifdef CLIENT_DLL
+#define CBaseProjectile C_BaseProjectile
+#endif // CLIENT_DLL
+
+//=============================================================================
+//
+// Base Projectile.
+//
+//=============================================================================
+class CBaseProjectile : public CBaseAnimating
+{
+public:
+ DECLARE_CLASS( CBaseProjectile, CBaseAnimating );
+ DECLARE_NETWORKCLASS();
+
+ CBaseProjectile();
+
+#ifdef GAME_DLL
+ virtual int GetDestroyableHitCount( void ) const { return m_iDestroyableHitCount; }
+ void IncrementDestroyableHitCount( void ) { ++m_iDestroyableHitCount; }
+#endif // GAME_DLL
+
+ virtual bool IsDestroyable( void ) { return false; }
+ virtual void Destroy( bool bBlinkOut = true, bool bBreakRocket = false ) {}
+
+protected:
+#ifdef GAME_DLL
+ int m_iDestroyableHitCount;
+#endif // GAME_DLL
+};
+
+#endif // BASEPROJECTILE_H
diff --git a/mp/src/game/shared/baseviewmodel_shared.cpp b/mp/src/game/shared/baseviewmodel_shared.cpp
index 99c4bfce..20538e8c 100644
--- a/mp/src/game/shared/baseviewmodel_shared.cpp
+++ b/mp/src/game/shared/baseviewmodel_shared.cpp
@@ -12,7 +12,7 @@
#include "iprediction.h"
#include "prediction.h"
#include "client_virtualreality.h"
-#include "headtrack/isourcevirtualreality.h"
+#include "sourcevr/isourcevirtualreality.h"
#else
#include "vguiscreen.h"
#endif
diff --git a/mp/src/game/shared/effect_color_tables.h b/mp/src/game/shared/effect_color_tables.h
index 54f6384f..322d0e08 100644
--- a/mp/src/game/shared/effect_color_tables.h
+++ b/mp/src/game/shared/effect_color_tables.h
@@ -44,6 +44,7 @@ static colorentry_t bloodcolors[] =
{ BLOOD_COLOR_RED, 72, 0, 0 },
{ BLOOD_COLOR_YELLOW, 195, 195, 0 },
{ BLOOD_COLOR_MECH, 20, 20, 20 },
+ { BLOOD_COLOR_GREEN, 195, 195, 0 },
};
#endif // EFFECT_COLOR_TABLES_H
diff --git a/mp/src/game/shared/gamemovement.cpp b/mp/src/game/shared/gamemovement.cpp
index 4f1132b1..8de6fc32 100644
--- a/mp/src/game/shared/gamemovement.cpp
+++ b/mp/src/game/shared/gamemovement.cpp
@@ -55,6 +55,12 @@ ConVar player_limit_jump_speed( "player_limit_jump_speed", "1", FCVAR_REPLICATED
// duck controls. Its value is meaningless anytime we don't have the options window open.
ConVar option_duck_method("option_duck_method", "1", FCVAR_REPLICATED|FCVAR_ARCHIVE );// 0 = HOLD to duck, 1 = Duck is a toggle
+#ifdef STAGING_ONLY
+#ifdef CLIENT_DLL
+ConVar debug_latch_reset_onduck( "debug_latch_reset_onduck", "1", FCVAR_CHEAT );
+#endif
+#endif
+
// [MD] I'll remove this eventually. For now, I want the ability to A/B the optimizations.
bool g_bMovementOptimizations = true;
@@ -4108,8 +4114,15 @@ void CGameMovement::FinishUnDuck( void )
mv->SetAbsOrigin( newOrigin );
#ifdef CLIENT_DLL
+#ifdef STAGING_ONLY
+ if ( debug_latch_reset_onduck.GetBool() )
+ {
+ player->ResetLatched();
+ }
+#else
player->ResetLatched();
#endif
+#endif // CLIENT_DLL
// Recategorize position since ducking can change origin
CategorizePosition();
@@ -4207,8 +4220,15 @@ void CGameMovement::FinishDuck( void )
mv->SetAbsOrigin( out );
#ifdef CLIENT_DLL
+#ifdef STAGING_ONLY
+ if ( debug_latch_reset_onduck.GetBool() )
+ {
+ player->ResetLatched();
+ }
+#else
player->ResetLatched();
#endif
+#endif // CLIENT_DLL
}
// See if we are stuck?
diff --git a/mp/src/game/shared/gamerules.h b/mp/src/game/shared/gamerules.h
index 6d99f64f..4b2f5124 100644
--- a/mp/src/game/shared/gamerules.h
+++ b/mp/src/game/shared/gamerules.h
@@ -271,7 +271,7 @@ public:
// Client damage rules
virtual float FlPlayerFallDamage( CBasePlayer *pPlayer ) = 0;// this client just hit the ground after a fall. How much damage?
- virtual bool FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker ) {return TRUE;};// can this player take damage from this attacker?
+ virtual bool FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker, const CTakeDamageInfo &info ) {return TRUE;};// can this player take damage from this attacker?
virtual bool ShouldAutoAim( CBasePlayer *pPlayer, edict_t *target ) { return TRUE; }
virtual float GetAutoAimScale( CBasePlayer *pPlayer ) { return 1.0f; }
virtual int GetAutoAimMode() { return AUTOAIM_ON; }
diff --git a/mp/src/game/shared/movevars_shared.cpp b/mp/src/game/shared/movevars_shared.cpp
index 3ef79945..b5b94c72 100644
--- a/mp/src/game/shared/movevars_shared.cpp
+++ b/mp/src/game/shared/movevars_shared.cpp
@@ -36,7 +36,7 @@ float GetCurrentGravity( void )
ConVar sv_gravity ( "sv_gravity", DEFAULT_GRAVITY_STRING, FCVAR_NOTIFY | FCVAR_REPLICATED, "World gravity." );
-#if defined( DOD_DLL ) || defined( CSTRIKE_DLL )
+#if defined( DOD_DLL ) || defined( CSTRIKE_DLL ) || defined( HL1MP_DLL )
ConVar sv_stopspeed ( "sv_stopspeed","100", FCVAR_NOTIFY | FCVAR_REPLICATED, "Minimum stopping speed when on ground." );
#else
ConVar sv_stopspeed ( "sv_stopspeed","100", FCVAR_NOTIFY | FCVAR_REPLICATED | FCVAR_DEVELOPMENTONLY, "Minimum stopping speed when on ground." );
@@ -48,7 +48,7 @@ ConVar sv_specaccelerate( "sv_specaccelerate", "5", FCVAR_NOTIFY | FCVAR_ARCHIVE
ConVar sv_specspeed ( "sv_specspeed", "3", FCVAR_ARCHIVE | FCVAR_NOTIFY | FCVAR_REPLICATED);
ConVar sv_specnoclip ( "sv_specnoclip", "1", FCVAR_ARCHIVE | FCVAR_NOTIFY | FCVAR_REPLICATED);
-#if defined( CSTRIKE_DLL )
+#if defined( CSTRIKE_DLL ) || defined( HL1MP_DLL )
ConVar sv_maxspeed ( "sv_maxspeed", "320", FCVAR_NOTIFY | FCVAR_REPLICATED);
#else
ConVar sv_maxspeed ( "sv_maxspeed", "320", FCVAR_NOTIFY | FCVAR_REPLICATED | FCVAR_DEVELOPMENTONLY);
@@ -58,7 +58,7 @@ ConVar sv_maxspeed ( "sv_maxspeed", "320", FCVAR_NOTIFY | FCVAR_REPLICATED | FC
ConVar sv_accelerate ( "sv_accelerate", "7", FCVAR_NOTIFY | FCVAR_REPLICATED);
#else
-#if defined( CSTRIKE_DLL )
+#if defined( CSTRIKE_DLL ) || defined( HL1MP_DLL )
ConVar sv_accelerate ( "sv_accelerate", "10", FCVAR_NOTIFY | FCVAR_REPLICATED);
#else
ConVar sv_accelerate ( "sv_accelerate", "10", FCVAR_NOTIFY | FCVAR_REPLICATED | FCVAR_DEVELOPMENTONLY);
@@ -66,7 +66,7 @@ ConVar sv_maxspeed ( "sv_maxspeed", "320", FCVAR_NOTIFY | FCVAR_REPLICATED | FC
#endif//_XBOX
-#if defined( CSTRIKE_DLL )
+#if defined( CSTRIKE_DLL ) || defined( HL1MP_DLL )
ConVar sv_airaccelerate( "sv_airaccelerate", "10", FCVAR_NOTIFY | FCVAR_REPLICATED);
ConVar sv_wateraccelerate( "sv_wateraccelerate", "10", FCVAR_NOTIFY | FCVAR_REPLICATED);
ConVar sv_waterfriction( "sv_waterfriction", "1", FCVAR_NOTIFY | FCVAR_REPLICATED);
@@ -82,13 +82,13 @@ ConVar sv_rollspeed ( "sv_rollspeed", "200", FCVAR_NOTIFY | FCVAR_REPLICATED | F
ConVar sv_rollangle ( "sv_rollangle", "0", FCVAR_NOTIFY | FCVAR_REPLICATED | FCVAR_DEVELOPMENTONLY, "Max view roll angle");
#endif // CSTRIKE_DLL
-#if defined( DOD_DLL ) || defined( CSTRIKE_DLL )
+#if defined( DOD_DLL ) || defined( CSTRIKE_DLL ) || defined( HL1MP_DLL )
ConVar sv_friction ( "sv_friction","4", FCVAR_NOTIFY | FCVAR_REPLICATED, "World friction." );
#else
ConVar sv_friction ( "sv_friction","4", FCVAR_NOTIFY | FCVAR_REPLICATED | FCVAR_DEVELOPMENTONLY, "World friction." );
#endif // DOD_DLL || CSTRIKE_DLL
-#if defined( CSTRIKE_DLL )
+#if defined( CSTRIKE_DLL ) || defined( HL1MP_DLL )
ConVar sv_bounce ( "sv_bounce","0", FCVAR_NOTIFY | FCVAR_REPLICATED, "Bounce multiplier for when physically simulated objects collide with other objects." );
ConVar sv_maxvelocity ( "sv_maxvelocity","3500", FCVAR_REPLICATED, "Maximum speed any ballistically moving object is allowed to attain per axis." );
ConVar sv_stepsize ( "sv_stepsize","18", FCVAR_NOTIFY | FCVAR_REPLICATED );
diff --git a/mp/src/game/shared/mp_shareddefs.cpp b/mp/src/game/shared/mp_shareddefs.cpp
index 561ba6fb..b555a88f 100644
--- a/mp/src/game/shared/mp_shareddefs.cpp
+++ b/mp/src/game/shared/mp_shareddefs.cpp
@@ -103,7 +103,7 @@ const char *g_pszMPConcepts[] =
"TLK_TAUNT_REPLAY", // MP_CONCEPT_TAUNT_REPLAY
"TLK_TAUNT_LAUGH", // MP_CONCEPT_TAUNT_LAUGH
"TLK_TAUNT_HEROIC_POSE", // MP_CONCEPT_TAUNT_HEROIC_POSE
- "TLK_HIGHFIVE_READY", // MP_CONCEPT_HIGHFIVE_READY
+ "TLK_PARTNER_TAUNT_READY", // MP_CONCEPT_PARTNER_TAUNT_READY
"TLK_PLAYER_HOLDTAUNT", // MP_CONCEPT_HOLDTAUNT
"TLK_TAUNT_PYRO_ARMAGEDDON", // MP_CONCEPT_TAUNT_PYRO_ARMAGEDDON
"TLK_ROCKET_DESTOYED", // MP_CONCEPT_ROCKET_DESTOYED
@@ -144,16 +144,55 @@ const char *g_pszMPConcepts[] =
"TLK_MAGIC_DANCE", // MP_CONCEPT_MAGIC_DANCE
"HalloweenLongFall", // MP_CONCEPT_HALLOWEEN_LONGFALL
"TLK_TAUNT_GUITAR_RIFF", // MP_CONCEPT_TAUNT_GUITAR_RIFF
+
+ // TF Halloween 2013 shenanigans.
+ "TLK_PLAYER_CAST_FIREBALL", // MP_CONCEPT_PLAYER_CAST_FIREBALL
+ "TLK_PLAYER_CAST_MERASMUS_ZAP", // MP_CONCEPT_PLAYER_CAST_MERASMUS_ZAP
+ "TLK_PLAYER_CAST_SELF_HEAL", // MP_CONCEPT_PLAYER_CAST_SELF_HEAL
+ "TLK_PLAYER_CAST_MIRV", // MP_CONCEPT_PLAYER_CAST_MIRV
+ "TLK_PLAYER_CAST_BLAST_JUMP", // MP_CONCEPT_PLAYER_CAST_BLAST_JUMP
+ "TLK_PLAYER_CAST_STEALTH", // MP_CONCEPT_PLAYER_CAST_STEALTH
+ "TLK_PLAYER_CAST_TELEPORT", // MP_CONCEPT_PLAYER_CAST_TELEPORT
+ "TLK_PLAYER_CAST_LIGHTNING_BALL", // MP_CONCEPT_PLAYER_CAST_LIGHTNING_BALL
+ "TLK_PLAYER_CAST_MOVEMENT_BUFF", // MP_CONCEPT_PLAYER_CAST_MOVEMENT_BUFF
+ "TLK_PLAYER_CAST_MONOCULOUS", // MP_CONCEPT_PLAYER_CAST_MONOCULOUS
+ "TLK_PLAYER_CAST_METEOR_SWARM", // MP_CONCEPT_PLAYER_CAST_METEOR_SWARM
+ "TLK_PLAYER_CAST_SKELETON_HORDE", // MP_CONCEPT_PLAYER_CAST_SKELETON_HORDE
+
+ "TLK_PLAYER_SPELL_FIREBALL", // MP_CONCEPT_PLAYER_SPELL_FIREBALL
+ "TLK_PLAYER_SPELL_MERASMUS_ZAP", // MP_CONCEPT_PLAYER_SPELL_MERASMUS_ZAP
+ "TLK_PLAYER_SPELL_SELF_HEAL", // MP_CONCEPT_PLAYER_SPELL_SELF_HEAL
+ "TLK_PLAYER_SPELL_MIRV", // MP_CONCEPT_PLAYER_SPELL_MIRV
+ "TLK_PLAYER_SPELL_BLAST_JUMP", // MP_CONCEPT_PLAYER_SPELL_BLAST_JUMP
+ "TLK_PLAYER_SPELL_STEALTH", // MP_CONCEPT_PLAYER_SPELL_STEALTH
+ "TLK_PLAYER_SPELL_TELEPORT", // MP_CONCEPT_PLAYER_SPELL_TELEPORT
+ "TLK_PLAYER_SPELL_LIGHTNING_BALL", // MP_CONCEPT_PLAYER_SPELL_LIGHTNING_BALL
+ "TLK_PLAYER_SPELL_MOVEMENT_BUFF", // MP_CONCEPT_PLAYER_SPELL_MOVEMENT_BUFF
+ "TLK_PLAYER_SPELL_MONOCULOUS", // MP_CONCEPT_PLAYER_SPELL_MONOCULOUS
+ "TLK_PLAYER_SPELL_METEOR_SWARM", // MP_CONCEPT_PLAYER_SPELL_METEOR_SWARM
+ "TLK_PLAYER_SPELL_SKELETON_HORDE", // MP_CONCEPT_PLAYER_SPELL_SKELETON_HORDE
+
+ // Events.
+ "TLK_PLAYER_SPELL_PICKUP_COMMON", // MP_CONCEPT_PLAYER_SPELL_PICKUP_COMMON
+ "TLK_PLAYER_SPELL_PICKUP_RARE", // MP_CONCEPT_PLAYER_SPELL_PICKUP_RARE
+ "TLK_PLAYER_HELLTOWER_MIDNIGHT", // MP_CONCEPT_PLAYER_HELLTOWER_MIDNIGHT
+ "TLK_PLAYER_SKELETON_KING_APPEAR", // MP_CONCEPT_PLAYER_SKELETON_KING_APPEAR
+
+ "TLK_MANNHATTAN_GATE_ATK", // MP_CONCEPT_MANNHATTAN_GATE_ATK
+ "TLK_MANNHATTAN_GATE_TAKE", // MP_CONCEPT_MANNHATTAN_GATE_TAKE
+ "TLK_RESURRECTED", // MP_CONCEPT_RESURRECTED
+ "TLK_MVM_LOOT_COMMON", // MP_CONCEPT_MVM_LOOT_COMMON
+ "TLK_MVM_LOOT_RARE", // MP_CONCEPT_MVM_LOOT_RARE
+ "TLK_MVM_LOOT_ULTRARARE", // MP_CONCEPT_MVM_LOOT_ULTRARARE
+ "TLK_MEDIC_HEAL_SHIELD", // MP_CONCEPT_MEDIC_HEAL_SHIELD
};
+COMPILE_TIME_ASSERT( ARRAYSIZE( g_pszMPConcepts ) == MP_TF_CONCEPT_COUNT );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int GetMPConceptIndexFromString( const char *pszConcept )
{
- // Make sure our concept string and enum arrays are the same length
- Assert( ARRAYSIZE( g_pszMPConcepts ) == MP_TF_CONCEPT_COUNT );
-
for ( int iConcept = 0; iConcept < ARRAYSIZE( g_pszMPConcepts ); ++iConcept )
{
if ( !Q_stricmp( pszConcept, g_pszMPConcepts[iConcept] ) )
diff --git a/mp/src/game/shared/mp_shareddefs.h b/mp/src/game/shared/mp_shareddefs.h
index bb173c52..8ad6011b 100644
--- a/mp/src/game/shared/mp_shareddefs.h
+++ b/mp/src/game/shared/mp_shareddefs.h
@@ -112,7 +112,7 @@ enum
MP_CONCEPT_TAUNT_REPLAY, // "TLK_TAUNT_REPLAY"
MP_CONCEPT_TAUNT_LAUGH, // "TLK_TAUNT_LAUGH"
MP_CONCEPT_TAUNT_HEROIC_POSE, // "TLK_TAUNT_HEROIC_POSE"
- MP_CONCEPT_HIGHFIVE_READY, // "TLK_HIGHFIVE_READY"
+ MP_CONCEPT_PARTNER_TAUNT_READY, // "TLK_PARTNER_TAUNT_READY"
MP_CONCEPT_HOLDTAUNT, // "TLK_PLAYER_HOLDTAUNT"
MP_CONCEPT_TAUNT_PYRO_ARMAGEDDON, // "TLK_TAUNT_PYRO_ARMAGEDDON"
MP_CONCEPT_ROCKET_DESTOYED, // "TLK_ROCKET_DESTOYED"
@@ -153,6 +153,48 @@ enum
MP_CONCEPT_MAGIC_DANCE, // "TLK_MAGIC_DANCE"
MP_CONCEPT_HALLOWEEN_LONGFALL,
MP_CONCEPT_TAUNT_GUITAR_RIFF, // "TLK_TAUNT_GUITAR_RIFF"
+
+ // TF Halloween 2013 shenanigans.
+ MP_CONCEPT_PLAYER_CAST_FIREBALL, // "TLK_PLAYER_CAST_FIREBALL"
+ MP_CONCEPT_PLAYER_CAST_MERASMUS_ZAP, // "TLK_PLAYER_CAST_MERASMUS_ZAP"
+ MP_CONCEPT_PLAYER_CAST_SELF_HEAL, // "TLK_PLAYER_CAST_SELF_HEAL"
+ MP_CONCEPT_PLAYER_CAST_MIRV, // "TLK_PLAYER_CAST_MIRV"
+ MP_CONCEPT_PLAYER_CAST_BLAST_JUMP, // "TLK_PLAYER_CAST_BLAST_JUMP"
+ MP_CONCEPT_PLAYER_CAST_STEALTH, // "TLK_PLAYER_CAST_STEALTH"
+ MP_CONCEPT_PLAYER_CAST_TELEPORT, // "TLK_PLAYER_CAST_TELEPORT"
+ MP_CONCEPT_PLAYER_CAST_LIGHTNING_BALL, // "TLK_PLAYER_CAST_LIGHTNING_BALL"
+ MP_CONCEPT_PLAYER_CAST_MOVEMENT_BUFF, // "TLK_PLAYER_CAST_MOVEMENT_BUFF"
+ MP_CONCEPT_PLAYER_CAST_MONOCULOUS, // "TLK_PLAYER_CAST_MONOCULOUS"
+ MP_CONCEPT_PLAYER_CAST_METEOR_SWARM, // "TLK_PLAYER_CAST_METEOR_SWARM"
+ MP_CONCEPT_PLAYER_CAST_SKELETON_HORDE, // "TLK_PLAYER_CAST_SKELETON_HORDE"
+
+ MP_CONCEPT_PLAYER_SPELL_FIREBALL, // "TLK_PLAYER_SPELL_FIREBALL"
+ MP_CONCEPT_PLAYER_SPELL_MERASMUS_ZAP, // "TLK_PLAYER_SPELL_MERASMUS_ZAP"
+ MP_CONCEPT_PLAYER_SPELL_SELF_HEAL, // "TLK_PLAYER_SPELL_SELF_HEAL"
+ MP_CONCEPT_PLAYER_SPELL_MIRV, // "TLK_PLAYER_SPELL_MIRV"
+ MP_CONCEPT_PLAYER_SPELL_BLAST_JUMP, // "TLK_PLAYER_SPELL_BLAST_JUMP"
+ MP_CONCEPT_PLAYER_SPELL_STEALTH, // "TLK_PLAYER_SPELL_STEALTH"
+ MP_CONCEPT_PLAYER_SPELL_TELEPORT, // "TLK_PLAYER_SPELL_TELEPORT"
+ MP_CONCEPT_PLAYER_SPELL_LIGHTNING_BALL, // "TLK_PLAYER_SPELL_LIGHTNING_BALL"
+ MP_CONCEPT_PLAYER_SPELL_MOVEMENT_BUFF, // "TLK_PLAYER_SPELL_MOVEMENT_BUFF"
+ MP_CONCEPT_PLAYER_SPELL_MONOCULOUS, // "TLK_PLAYER_SPELL_MONOCULOUS"
+ MP_CONCEPT_PLAYER_SPELL_METEOR_SWARM, // "TLK_PLAYER_SPELL_METEOR_SWARM"
+ MP_CONCEPT_PLAYER_SPELL_SKELETON_HORDE, // "TLK_PLAYER_SPELL_SKELETON_HORDE"
+
+ // Events.
+ MP_CONCEPT_PLAYER_SPELL_PICKUP_COMMON, // "TLK_PLAYER_SPELL_PICKUP_COMMON"
+ MP_CONCEPT_PLAYER_SPELL_PICKUP_RARE, // "TLK_PLAYER_SPELL_PICKUP_RARE"
+ MP_CONCEPT_PLAYER_HELLTOWER_MIDNIGHT, // "TLK_PLAYER_HELLTOWER_MIDNIGHT"
+ MP_CONCEPT_PLAYER_SKELETON_KING_APPEAR, // "TLK_PLAYER_SKELETON_KING_APPEAR"
+
+ MP_CONCEPT_MANNHATTAN_GATE_ATK, // "TLK_MANNHATTAN_GATE_ATK"
+ MP_CONCEPT_MANNHATTAN_GATE_TAKE, // "TLK_MANNHATTAN_GATE_TAKE"
+ MP_CONCEPT_RESURRECTED, // "TLK_RESURRECTED"
+ MP_CONCEPT_MVM_LOOT_COMMON, // "TLK_MVM_LOOT_COMMON"
+ MP_CONCEPT_MVM_LOOT_RARE, // "TLK_MVM_LOOT_RARE"
+ MP_CONCEPT_MVM_LOOT_ULTRARARE, // "TLK_MVM_LOOT_ULTRARARE"
+ MP_CONCEPT_MEDIC_HEAL_SHIELD, // "TLK_MEDIC_HEAL_SHIELD"
+
MP_TF_CONCEPT_COUNT
// Other MP_CONCEPT_* start he using MP_TF_CONCEPT_COUNT + 1 as start.
diff --git a/mp/src/game/shared/multiplay_gamerules.cpp b/mp/src/game/shared/multiplay_gamerules.cpp
index 409f2362..07932e92 100644
--- a/mp/src/game/shared/multiplay_gamerules.cpp
+++ b/mp/src/game/shared/multiplay_gamerules.cpp
@@ -641,7 +641,7 @@ ConVarRef suitcharger( "sk_suitcharger" );
//=========================================================
//=========================================================
- bool CMultiplayRules::FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker )
+ bool CMultiplayRules::FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker, const CTakeDamageInfo &info )
{
return true;
}
@@ -834,7 +834,11 @@ ConVarRef suitcharger( "sk_suitcharger" );
// If the inflictor is the killer, then it must be their current weapon doing the damage
if ( pScorer->GetActiveWeapon() )
{
+#ifdef HL1MP_DLL
+ killer_weapon_name = pScorer->GetActiveWeapon()->GetClassname();
+#else
killer_weapon_name = pScorer->GetActiveWeapon()->GetDeathNoticeName();
+#endif
}
}
else
@@ -870,7 +874,9 @@ ConVarRef suitcharger( "sk_suitcharger" );
event->SetInt("attacker", killer_ID );
event->SetInt("customkill", info.GetDamageCustom() );
event->SetInt("priority", 7 ); // HLTV event priority, not transmitted
-
+#ifdef HL1MP_DLL
+ event->SetString("weapon", killer_weapon_name );
+#endif
gameeventmanager->FireEvent( event );
}
@@ -1748,6 +1754,37 @@ ConVarRef suitcharger( "sk_suitcharger" );
}
}
+ void CMultiplayRules::RandomPlayersSpeakConceptIfAllowed( int iConcept, int iNumRandomPlayer /*= 1*/, int iTeam /*= TEAM_UNASSIGNED*/, const char *modifiers /*= NULL*/ )
+ {
+ CUtlVector< CBaseMultiplayerPlayer* > speakCandidates;
+
+ CBaseMultiplayerPlayer *pPlayer;
+ for ( int i = 1; i <= gpGlobals->maxClients; i++ )
+ {
+ pPlayer = ToBaseMultiplayerPlayer( UTIL_PlayerByIndex( i ) );
+
+ if ( !pPlayer )
+ continue;
+
+ if ( iTeam != TEAM_UNASSIGNED )
+ {
+ if ( pPlayer->GetTeamNumber() != iTeam )
+ continue;
+ }
+
+ speakCandidates.AddToTail( pPlayer );
+ }
+
+ int iSpeaker = iNumRandomPlayer;
+ while ( iSpeaker > 0 && speakCandidates.Count() > 0 )
+ {
+ int iRandomSpeaker = RandomInt( 0, speakCandidates.Count() - 1 );
+ speakCandidates[ iRandomSpeaker ]->SpeakConceptIfAllowed( iConcept, modifiers );
+ speakCandidates.FastRemove( iRandomSpeaker );
+ iSpeaker--;
+ }
+ }
+
void CMultiplayRules::ClientSettingsChanged( CBasePlayer *pPlayer )
{
// NVNT see if this user is still or has began using a haptic device
diff --git a/mp/src/game/shared/multiplay_gamerules.h b/mp/src/game/shared/multiplay_gamerules.h
index 4512c9c9..08e06e4a 100644
--- a/mp/src/game/shared/multiplay_gamerules.h
+++ b/mp/src/game/shared/multiplay_gamerules.h
@@ -136,7 +136,7 @@ public:
// Client damage rules
virtual float FlPlayerFallDamage( CBasePlayer *pPlayer );
- virtual bool FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker );
+ virtual bool FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker, const CTakeDamageInfo &info );
virtual bool AllowDamage( CBaseEntity *pVictim, const CTakeDamageInfo &info );
// Client spawn/respawn control
@@ -215,6 +215,7 @@ public:
void IncrementMapCycleIndex();
void HaveAllPlayersSpeakConceptIfAllowed( int iConcept, int iTeam = TEAM_UNASSIGNED, const char *modifiers = NULL );
+ void RandomPlayersSpeakConceptIfAllowed( int iConcept, int iNumRandomPlayer = 1, int iTeam = TEAM_UNASSIGNED, const char *modifiers = NULL );
virtual void GetTaggedConVarList( KeyValues *pCvarTagList );
diff --git a/mp/src/game/shared/particle_property.cpp b/mp/src/game/shared/particle_property.cpp
index e5a5487d..8ddc9784 100644
--- a/mp/src/game/shared/particle_property.cpp
+++ b/mp/src/game/shared/particle_property.cpp
@@ -557,6 +557,14 @@ void CParticleProperty::UpdateControlPoint( ParticleEffectList_t *pEffect, int i
if ( bUseHeadOrigin > 0 )
{
int iBone = Studio_BoneIndexByName( pAnimating->GetModelPtr(), "bip_head" );
+ if ( iBone < 0 )
+ {
+ iBone = Studio_BoneIndexByName( pAnimating->GetModelPtr(), "prp_helmet" );
+ if ( iBone < 0 )
+ {
+ iBone = Studio_BoneIndexByName( pAnimating->GetModelPtr(), "prp_hat" );
+ }
+ }
if ( iBone >= 0 )
{
bUsingHeadOrigin = true;
@@ -587,18 +595,23 @@ void CParticleProperty::UpdateControlPoint( ParticleEffectList_t *pEffect, int i
if ( !pAnimating->GetAttachment( pPoint->iAttachmentPoint, attachmentToWorld ) )
{
- Warning( "Cannot update control point %d for effect '%s'.\n", pPoint->iAttachmentPoint, pEffect->pParticleEffect->GetEffectName() );
- attachmentToWorld = pAnimating->RenderableToWorldTransform();
+ // try C_BaseAnimating if attach point is not on the weapon
+ if ( !pAnimating->C_BaseAnimating::GetAttachment( pPoint->iAttachmentPoint, attachmentToWorld ) )
+ {
+ Warning( "Cannot update control point %d for effect '%s'.\n", pPoint->iAttachmentPoint, pEffect->pParticleEffect->GetEffectName() );
+ attachmentToWorld = pAnimating->RenderableToWorldTransform();
+ }
}
- MatrixVectors( attachmentToWorld, &vecForward, &vecRight, &vecUp );
- MatrixPosition( attachmentToWorld, vecOrigin );
+ VMatrix vMat(attachmentToWorld);
+ MatrixTranslate( vMat, pPoint->vecOriginOffset );
+ MatrixVectors( vMat.As3x4(), &vecForward, &vecRight, &vecUp );
+ MatrixPosition( vMat.As3x4(), vecOrigin );
if ( pEffect->pParticleEffect->m_pDef->IsViewModelEffect() )
{
FormatViewModelAttachment( vecOrigin, true );
}
-
}
}
break;
diff --git a/mp/src/game/shared/props_shared.cpp b/mp/src/game/shared/props_shared.cpp
index 7cf4489b..6d0f9209 100644
--- a/mp/src/game/shared/props_shared.cpp
+++ b/mp/src/game/shared/props_shared.cpp
@@ -1323,7 +1323,7 @@ CBaseEntity *CreateGibsFromList( CUtlVector<breakmodel_t> &list, int modelindex,
if ( !pCollide )
return NULL;
- int nSkin = 0;
+ int nSkin = params.nDefaultSkin;
CBaseEntity *pOwnerEntity = pEntity;
CBaseAnimating *pOwnerAnim = NULL;
if ( pPhysics )
diff --git a/mp/src/game/shared/props_shared.h b/mp/src/game/shared/props_shared.h
index ee849ed2..c63cb212 100644
--- a/mp/src/game/shared/props_shared.h
+++ b/mp/src/game/shared/props_shared.h
@@ -227,6 +227,7 @@ struct breakablepropparams_t
impactEnergyScale = 0;
defBurstScale = 0;
defCollisionGroup = COLLISION_GROUP_NONE;
+ nDefaultSkin = 0;
}
const Vector &origin;
@@ -236,6 +237,7 @@ struct breakablepropparams_t
float impactEnergyScale;
float defBurstScale;
int defCollisionGroup;
+ int nDefaultSkin;
};
const char *GetMassEquivalent(float flMass);
diff --git a/mp/src/game/shared/shareddefs.h b/mp/src/game/shared/shareddefs.h
index b7103be3..842d2f06 100644
--- a/mp/src/game/shared/shareddefs.h
+++ b/mp/src/game/shared/shareddefs.h
@@ -151,8 +151,20 @@ typedef enum
VOTE_FAILED_MAP_NOT_VALID,
VOTE_FAILED_CANNOT_KICK_FOR_TIME,
VOTE_FAILED_CANNOT_KICK_DURING_ROUND,
+
+ // TF-specific?
+ VOTE_FAILED_MODIFICATION_ALREADY_ACTIVE,
} vote_create_failed_t;
+enum
+{
+#ifdef STAGING_ONLY
+ SERVER_MODIFICATION_ITEM_DURATION_IN_MINUTES = 2
+#else
+ SERVER_MODIFICATION_ITEM_DURATION_IN_MINUTES = 120
+#endif
+};
+
#define MAX_VOTE_DETAILS_LENGTH 64
#define INVALID_ISSUE -1
#define MAX_VOTE_OPTIONS 5
diff --git a/mp/src/game/shared/takedamageinfo.cpp b/mp/src/game/shared/takedamageinfo.cpp
index e83878cf..e9062d80 100644
--- a/mp/src/game/shared/takedamageinfo.cpp
+++ b/mp/src/game/shared/takedamageinfo.cpp
@@ -58,9 +58,9 @@ void CTakeDamageInfo::Init( CBaseEntity *pInflictor, CBaseEntity *pAttacker, CBa
m_vecReportedPosition = reportedPosition;
m_iAmmoType = -1;
m_iDamagedOtherPlayers = 0;
-
m_iPlayerPenetrationCount = 0;
m_flDamageBonus = 0.f;
+ m_bForceFriendlyFire = false;
}
CTakeDamageInfo::CTakeDamageInfo()
diff --git a/mp/src/game/shared/takedamageinfo.h b/mp/src/game/shared/takedamageinfo.h
index a4c01826..702e9322 100644
--- a/mp/src/game/shared/takedamageinfo.h
+++ b/mp/src/game/shared/takedamageinfo.h
@@ -77,6 +77,8 @@ public:
void SetDamageCustom( int iDamageCustom );
int GetDamageStats( void ) const;
void SetDamageStats( int iDamageStats );
+ void SetForceFriendlyFire( bool bValue ) { m_bForceFriendlyFire = bValue; }
+ bool IsForceFriendlyFire( void ) const { return m_bForceFriendlyFire; }
int GetAmmoType() const;
void SetAmmoType( int iAmmoType );
@@ -123,6 +125,7 @@ protected:
int m_iDamagedOtherPlayers;
int m_iPlayerPenetrationCount;
float m_flDamageBonus; // Anything that increases damage (crit) - store the delta
+ bool m_bForceFriendlyFire; // Ideally this would be a dmg type, but we can't add more
DECLARE_SIMPLE_DATADESC();
};
diff --git a/mp/src/game/shared/teamplay_gamerules.cpp b/mp/src/game/shared/teamplay_gamerules.cpp
index 1cbe368a..171313b3 100644
--- a/mp/src/game/shared/teamplay_gamerules.cpp
+++ b/mp/src/game/shared/teamplay_gamerules.cpp
@@ -352,9 +352,9 @@ bool CTeamplayRules::IsTeamplay( void )
return true;
}
-bool CTeamplayRules::FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker )
+bool CTeamplayRules::FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker, const CTakeDamageInfo &info )
{
- if ( pAttacker && PlayerRelationship( pPlayer, pAttacker ) == GR_TEAMMATE )
+ if ( pAttacker && PlayerRelationship( pPlayer, pAttacker ) == GR_TEAMMATE && !info.IsForceFriendlyFire() )
{
// my teammate hit me.
if ( (friendlyfire.GetInt() == 0) && (pAttacker != pPlayer) )
@@ -364,7 +364,7 @@ bool CTeamplayRules::FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pA
}
}
- return BaseClass::FPlayerCanTakeDamage( pPlayer, pAttacker );
+ return BaseClass::FPlayerCanTakeDamage( pPlayer, pAttacker, info );
}
//=========================================================
diff --git a/mp/src/game/shared/teamplay_gamerules.h b/mp/src/game/shared/teamplay_gamerules.h
index 10f953e1..952895eb 100644
--- a/mp/src/game/shared/teamplay_gamerules.h
+++ b/mp/src/game/shared/teamplay_gamerules.h
@@ -67,7 +67,7 @@ public:
virtual bool ClientCommand( CBaseEntity *pEdict, const CCommand &args );
virtual void ClientSettingsChanged( CBasePlayer *pPlayer );
virtual bool IsTeamplay( void );
- virtual bool FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker );
+ virtual bool FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker, const CTakeDamageInfo &info );
virtual int PlayerRelationship( CBaseEntity *pPlayer, CBaseEntity *pTarget );
virtual bool PlayerCanHearChat( CBasePlayer *pListener, CBasePlayer *pSpeaker );
virtual const char *GetTeamID( CBaseEntity *pEntity );
diff --git a/mp/src/game/shared/teamplay_round_timer.cpp b/mp/src/game/shared/teamplay_round_timer.cpp
index 63098cd6..f993749a 100644
--- a/mp/src/game/shared/teamplay_round_timer.cpp
+++ b/mp/src/game/shared/teamplay_round_timer.cpp
@@ -636,6 +636,12 @@ const char *CTeamRoundTimer::GetTimeWarningSound( int nWarning )
//-----------------------------------------------------------------------------
void CTeamRoundTimer::SendTimeWarning( int nWarning )
{
+#if defined( TF_CLIENT_DLL )
+ // don't play any time warnings for Helltower
+ if ( TFGameRules() && TFGameRules()->IsHalloweenScenario( CTFGameRules::HALLOWEEN_SCENARIO_HIGHTOWER ) )
+ return;
+#endif
+
// don't play sounds if the level designer has turned them off or if it's during the WaitingForPlayers time
if ( !m_bTimerPaused && m_bAutoCountdown && !TeamplayRoundBasedRules()->IsInWaitingForPlayers() )
{
diff --git a/mp/src/game/shared/teamplayroundbased_gamerules.cpp b/mp/src/game/shared/teamplayroundbased_gamerules.cpp
index 38f1294d..26a75b18 100644
--- a/mp/src/game/shared/teamplayroundbased_gamerules.cpp
+++ b/mp/src/game/shared/teamplayroundbased_gamerules.cpp
@@ -1267,7 +1267,7 @@ CGameRulesRoundStateInfo* CTeamplayRoundBasedRules::State_LookupInfo( gamerules_
{ GR_STATE_INIT, "GR_STATE_INIT", &CTeamplayRoundBasedRules::State_Enter_INIT, NULL, &CTeamplayRoundBasedRules::State_Think_INIT },
{ GR_STATE_PREGAME, "GR_STATE_PREGAME", &CTeamplayRoundBasedRules::State_Enter_PREGAME, NULL, &CTeamplayRoundBasedRules::State_Think_PREGAME },
{ GR_STATE_STARTGAME, "GR_STATE_STARTGAME", &CTeamplayRoundBasedRules::State_Enter_STARTGAME, NULL, &CTeamplayRoundBasedRules::State_Think_STARTGAME },
- { GR_STATE_PREROUND, "GR_STATE_PREROUND", &CTeamplayRoundBasedRules::State_Enter_PREROUND, NULL, &CTeamplayRoundBasedRules::State_Think_PREROUND },
+ { GR_STATE_PREROUND, "GR_STATE_PREROUND", &CTeamplayRoundBasedRules::State_Enter_PREROUND, &CTeamplayRoundBasedRules::State_Leave_PREROUND, &CTeamplayRoundBasedRules::State_Think_PREROUND },
{ GR_STATE_RND_RUNNING, "GR_STATE_RND_RUNNING", &CTeamplayRoundBasedRules::State_Enter_RND_RUNNING, NULL, &CTeamplayRoundBasedRules::State_Think_RND_RUNNING },
{ GR_STATE_TEAM_WIN, "GR_STATE_TEAM_WIN", &CTeamplayRoundBasedRules::State_Enter_TEAM_WIN, NULL, &CTeamplayRoundBasedRules::State_Think_TEAM_WIN },
{ GR_STATE_RESTART, "GR_STATE_RESTART", &CTeamplayRoundBasedRules::State_Enter_RESTART, NULL, &CTeamplayRoundBasedRules::State_Think_RESTART },
@@ -1427,6 +1427,14 @@ void CTeamplayRoundBasedRules::State_Enter_PREROUND( void )
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
+void CTeamplayRoundBasedRules::State_Leave_PREROUND( void )
+{
+ PreRound_End();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
void CTeamplayRoundBasedRules::State_Think_PREROUND( void )
{
if( gpGlobals->curtime > m_flStateTransitionTime )
@@ -2159,6 +2167,7 @@ void CTeamplayRoundBasedRules::SetWinningTeam( int team, int iWinReason, bool bF
if ( event )
{
event->SetInt( "team", team );
+ event->SetInt( "winreason", iWinReason );
event->SetBool( "full_round", bForceMapReset );
event->SetFloat( "round_time", gpGlobals->curtime - m_flRoundStartTime );
event->SetBool( "was_sudden_death", bWasSuddenDeath );
@@ -3062,11 +3071,11 @@ void CTeamplayRoundBasedRules::PlayWinSong( int team )
{
if ( i == team )
{
- BroadcastSound( i, "Game.YourTeamWon" );
+ BroadcastSound( i, WinSongName( i ) );
}
else
{
- const char *pchLoseSong = LoseSongName();
+ const char *pchLoseSong = LoseSongName( i );
if ( pchLoseSong )
{
BroadcastSound( i, pchLoseSong );
@@ -3094,11 +3103,11 @@ void CTeamplayRoundBasedRules::PlaySuddenDeathSong( void )
//-----------------------------------------------------------------------------
void CTeamplayRoundBasedRules::PlayStalemateSong( void )
{
- BroadcastSound( TEAM_UNASSIGNED, "Game.Stalemate" );
+ BroadcastSound( TEAM_UNASSIGNED, GetStalemateSong( TEAM_UNASSIGNED ) );
for ( int i = FIRST_GAME_TEAM; i < GetNumberOfTeams(); i++ )
{
- BroadcastSound( i, "Game.Stalemate" );
+ BroadcastSound( i, GetStalemateSong( i ) );
}
}
diff --git a/mp/src/game/shared/teamplayroundbased_gamerules.h b/mp/src/game/shared/teamplayroundbased_gamerules.h
index 61567d49..cf584092 100644
--- a/mp/src/game/shared/teamplayroundbased_gamerules.h
+++ b/mp/src/game/shared/teamplayroundbased_gamerules.h
@@ -297,6 +297,8 @@ public:
virtual void BetweenRounds_End( void ) { return; }
virtual void BetweenRounds_Think( void ) { return; }
+ virtual void PreRound_End( void ) { return; }
+
bool PrevRoundWasWaitingForPlayers() { return m_bPrevRoundWasWaitingForPlayers; }
virtual bool ShouldScorePerRound( void ){ return true; }
@@ -415,6 +417,7 @@ protected:
void State_Think_STARTGAME( void );
void State_Enter_PREROUND( void );
+ void State_Leave_PREROUND( void );
void State_Think_PREROUND( void );
void State_Enter_RND_RUNNING( void );
@@ -456,7 +459,9 @@ protected:
void PlayStalemateSong( void );
void PlaySuddenDeathSong( void );
- virtual const char* LoseSongName( void ) { return "Game.YourTeamLost"; }
+ virtual const char* GetStalemateSong( int nTeam ) { return "Game.Stalemate"; }
+ virtual const char* WinSongName( int nTeam ) { return "Game.YourTeamWon"; }
+ virtual const char* LoseSongName( int nTeam ) { return "Game.YourTeamLost"; }
virtual void RespawnTeam( int iTeam ) { RespawnPlayers( false, true, iTeam ); }
diff --git a/mp/src/game/shared/voice_banmgr.cpp b/mp/src/game/shared/voice_banmgr.cpp
index 7f4864d7..d362d58f 100644
--- a/mp/src/game/shared/voice_banmgr.cpp
+++ b/mp/src/game/shared/voice_banmgr.cpp
@@ -54,11 +54,9 @@ bool CVoiceBanMgr::Init(const char *pGameDir)
{
int version;
filesystem->Read(&version, sizeof(version), fh);
- if(version == BANMGR_FILEVERSION)
+ if(version == BANMGR_FILEVERSION && filesystem->Size(fh) > 4 )
{
- filesystem->Seek(fh, 0, FILESYSTEM_SEEK_TAIL);
- int nIDs = (filesystem->Tell(fh) - sizeof(version)) / SIGNED_GUID_LEN;
- filesystem->Seek(fh, sizeof(version), FILESYSTEM_SEEK_CURRENT);
+ int nIDs = ( filesystem->Size( fh ) - sizeof(version)) / SIGNED_GUID_LEN;
for(int i=0; i < nIDs; i++)
{