You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1798 lines
47 KiB
1798 lines
47 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
|
|
#include "cbase.h" |
|
|
|
#ifdef CLIENT_DLL |
|
|
|
#include "achievementmgr.h" |
|
#include "baseachievement.h" |
|
#include "tf_hud_statpanel.h" |
|
#include "c_tf_team.h" |
|
#include "c_tf_player.h" |
|
#include "c_tf_playerresource.h" |
|
#include "c_tf_objective_resource.h" |
|
#include "tf_gamerules.h" |
|
#include "achievements_tf.h" |
|
#include "tf_item_powerup_bottle.h" |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_CompletePopFile : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
m_bPlayedEntireMission = false; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_begin_wave" ); |
|
ListenForGameEvent( "mvm_mission_complete" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "mvm_begin_wave" ) ) |
|
{ |
|
if ( event->GetInt( "wave_index" ) == 0 ) |
|
{ |
|
m_bPlayedEntireMission = true; |
|
} |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_mission_complete" ) ) |
|
{ |
|
if ( m_bPlayedEntireMission ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
bool m_bPlayedEntireMission; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_CompletePopFile, ACHIEVEMENT_TF_MVM_COMPLETE_POP_FILE, "TF_MVM_COMPLETE_POP_FILE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_EarnMoneyBonus : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
m_bPlayedEntireWave = false; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "teamplay_round_active" ); |
|
ListenForGameEvent( "mvm_creditbonus_wave" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "teamplay_round_active" ) ) |
|
{ |
|
m_bPlayedEntireWave = true; |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_creditbonus_wave" ) ) |
|
{ |
|
if ( m_bPlayedEntireWave ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
bool m_bPlayedEntireWave; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_EarnMoneyBonus, ACHIEVEMENT_TF_MVM_EARN_MONEY_BONUS, "TF_MVM_EARN_MONEY_BONUS", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_AdvancedEarnAllBonuses : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
m_bPlayedEntireMission = false; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_begin_wave" ); |
|
ListenForGameEvent( "mvm_creditbonus_all_advanced" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "mvm_begin_wave" ) ) |
|
{ |
|
if ( event->GetInt( "wave_index" ) == 0 ) |
|
{ |
|
m_bPlayedEntireMission = true; |
|
} |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_creditbonus_all_advanced" ) ) |
|
{ |
|
if ( m_bPlayedEntireMission ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
bool m_bPlayedEntireMission; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_AdvancedEarnAllBonuses, ACHIEVEMENT_TF_MVM_ADVANCED_EARN_ALL_BONUSES, "TF_MVM_ADVANCED_EARN_ALL_BONUSES", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_PickupMoneyAboutToExpire : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_PickupMoneyAboutToExpire, ACHIEVEMENT_TF_MVM_PICKUP_MONEY_ABOUT_TO_EXPIRE, "TF_MVM_PICKUP_MONEY_ABOUT_TO_EXPIRE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_CollectMoneyGrind : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1000000 ); |
|
SetStoreProgressInSteam( true ); |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_pickup_currency" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
if ( FStrEq( event->GetName(), "mvm_pickup_currency" ) ) |
|
{ |
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
IncrementCount( event->GetInt( "currency" ) ); |
|
} |
|
} |
|
} |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_CollectMoneyGrind, ACHIEVEMENT_TF_MVM_COLLECT_MONEY_GRIND, "TF_MVM_COLLECT_MONEY_GRIND", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_PlayGameFriends : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_mission_complete" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
if ( FStrEq( event->GetName(), "mvm_mission_complete" ) ) |
|
{ |
|
if ( CalcPlayersOnFriendsList( 5 ) ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_PlayGameFriends, ACHIEVEMENT_TF_MVM_PLAY_GAME_FRIENDS, "TF_MVM_PLAY_GAME_FRIENDS", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_PlayEachClass : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL | ACH_HAS_COMPONENTS ); |
|
SetGoal( ( TF_LAST_NORMAL_CLASS - 1 ) - TF_FIRST_NORMAL_CLASS + 1 ); //( TF_LAST_NORMAL_CLASS - 1 ) to exclude the new civilian class |
|
|
|
m_bChangedClass = true; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_begin_wave" ); |
|
ListenForGameEvent( "localplayer_changeclass" ); |
|
ListenForGameEvent( "localplayer_changeteam" ); |
|
ListenForGameEvent( "mvm_mission_complete" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "mvm_begin_wave" ) ) |
|
{ |
|
if ( event->GetInt( "wave_index" ) == 0 ) |
|
{ |
|
// beginning the first wave...lock down class changes |
|
m_bChangedClass = false; |
|
} |
|
} |
|
else if ( FStrEq( pszEventName, "localplayer_changeclass" ) || // can't change class or team after the first round starts |
|
FStrEq( pszEventName, "localplayer_changeteam" ) ) |
|
{ |
|
m_bChangedClass = true; |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_mission_complete" ) ) |
|
{ |
|
if ( !m_bChangedClass ) |
|
{ |
|
C_TFPlayer *pTFPlayer = C_TFPlayer::GetLocalTFPlayer(); |
|
if ( pTFPlayer ) |
|
{ |
|
int iClass = pTFPlayer->GetPlayerClass()->GetClassIndex(); |
|
if ( iClass >= TF_FIRST_NORMAL_CLASS && iClass <= ( TF_LAST_NORMAL_CLASS - 1 ) ) //( TF_LAST_NORMAL_CLASS - 1 ) to exclude the new civilian class |
|
{ |
|
// yes, the achievement is satisfied for this class, set the corresponding bit |
|
int iBitNumber =( iClass - TF_FIRST_NORMAL_CLASS ); |
|
EnsureComponentBitSetAndEvaluate( iBitNumber ); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
bool m_bChangedClass; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_PlayEachClass, ACHIEVEMENT_TF_MVM_PLAY_EACH_CLASS, "TF_MVM_PLAY_EACH_CLASS", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_DestroyTwoTanks : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
m_flLastTankDestroyedTime = 0.0f; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_tank_destroyed_by_players" ); |
|
ListenForGameEvent( "mvm_begin_wave" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
if ( FStrEq( event->GetName(), "mvm_tank_destroyed_by_players" ) ) |
|
{ |
|
if ( m_flLastTankDestroyedTime > 0.0f ) |
|
{ |
|
if ( fabs( gpGlobals->curtime - m_flLastTankDestroyedTime ) <= 5.0f ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
|
|
m_flLastTankDestroyedTime = gpGlobals->curtime; |
|
} |
|
|
|
if ( FStrEq( event->GetName(), "mvm_begin_wave" ) ) |
|
{ |
|
m_flLastTankDestroyedTime = 0.f; |
|
} |
|
} |
|
|
|
private: |
|
float m_flLastTankDestroyedTime; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_DestroyTwoTanks, ACHIEVEMENT_TF_MVM_DESTROY_TWO_TANKS, "TF_MVM_DESTROY_TWO_TANKS", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_DestroyTankWhileDeploying : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_DestroyTankWhileDeploying, ACHIEVEMENT_TF_MVM_DESTROY_TANK_WHILE_DEPLOYING, "TF_MVM_DESTROY_TANK_WHILE_DEPLOYING", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_DestroyTankQuickly : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_DestroyTankQuickly, ACHIEVEMENT_TF_MVM_DESTROY_TANK_QUICKLY, "TF_MVM_DESTROY_TANK_QUICKLY", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_DefendCap : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
iCount = 0; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "teamplay_round_active" ); |
|
ListenForGameEvent( "mvm_kill_robot_delivering_bomb" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "teamplay_round_active" ) ) |
|
{ |
|
iCount = 0; |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_kill_robot_delivering_bomb" ) ) |
|
{ |
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
iCount++; |
|
if ( iCount >= 10 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
int iCount; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_DefendCap, ACHIEVEMENT_TF_MVM_DEFEND_CAP, "TF_MVM_DEFEND_CAP", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_KillBombCarriers : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
m_nConsecutiveKillCount = 0; |
|
ACHIEVEMENT_COUNT = 15; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_bomb_carrier_killed" ); |
|
ListenForGameEvent( "teamplay_round_active" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
if ( Q_strcmp( event->GetName(), "mvm_bomb_carrier_killed" ) == 0 ) |
|
{ |
|
if ( GetLocalPlayerTeam() != TF_TEAM_PVE_DEFENDERS ) |
|
return; |
|
|
|
int nLevel = event->GetInt( "level" ); |
|
if ( !nLevel ) |
|
{ |
|
m_nConsecutiveKillCount++; |
|
} |
|
else |
|
{ |
|
m_nConsecutiveKillCount = 0; |
|
} |
|
} |
|
else if ( Q_strcmp( event->GetName(), "teamplay_round_active" ) == 0 ) |
|
{ |
|
m_nConsecutiveKillCount = 0; |
|
} |
|
|
|
if ( m_nConsecutiveKillCount >= ACHIEVEMENT_COUNT ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
|
|
private: |
|
int m_nConsecutiveKillCount; |
|
int ACHIEVEMENT_COUNT; |
|
|
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_KillBombCarriers, ACHIEVEMENT_TF_MVM_KILL_BOMB_CARRIERS, "TF_MVM_KILL_BOMB_CARRIERS", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_CompleteWaveWithoutDying : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL | ACH_LISTEN_KILL_EVENTS ); |
|
SetGoal( 1 ); |
|
|
|
bSurvivedEntireWave = false; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "teamplay_round_active" ); |
|
ListenForGameEvent( "mvm_wave_complete" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "teamplay_round_active" ) ) |
|
{ |
|
bSurvivedEntireWave = true; |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_wave_complete" ) ) |
|
{ |
|
if ( event->GetBool( "advanced" ) ) |
|
{ |
|
if ( bSurvivedEntireWave ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) |
|
{ |
|
if ( pVictim && ( pVictim == C_BasePlayer::GetLocalPlayer() ) ) |
|
{ |
|
bSurvivedEntireWave = false; |
|
} |
|
} |
|
|
|
private: |
|
bool bSurvivedEntireWave; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_CompleteWaveWithoutDying, ACHIEVEMENT_TF_MVM_COMPLETE_WAVE_WITHOUT_DYING, "TF_MVM_COMPLETE_WAVE_WITHOUT_DYING", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_CompleteTour : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL | ACH_HAS_COMPONENTS ); |
|
|
|
static const char *szComponents[] = |
|
{ |
|
"scripts/population/mvm_decoy.pop", "scripts/population/mvm_coaltown.pop", "scripts/population/mvm_mannworks.pop" |
|
}; |
|
m_pszComponentNames = szComponents; |
|
m_iNumComponents = ARRAYSIZE( szComponents ); |
|
SetGoal( m_iNumComponents ); |
|
|
|
m_bPlayedEntireMission = false; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_begin_wave" ); |
|
ListenForGameEvent( "mvm_mission_complete" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "mvm_begin_wave" ) ) |
|
{ |
|
if ( event->GetInt( "wave_index" ) == 0 ) |
|
{ |
|
m_bPlayedEntireMission = true; |
|
} |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_mission_complete" ) ) |
|
{ |
|
if ( m_bPlayedEntireMission ) |
|
{ |
|
OnComponentEvent( event->GetString( "mission" ) ); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
bool m_bPlayedEntireMission; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_CompleteTour, ACHIEVEMENT_TF_MVM_COMPLETE_TOUR, "TF_MVM_COMPLETE_TOUR", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_UseTeleportBottle : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
m_flAchievementEndTime = 0.0f; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "player_used_powerup_bottle" ); |
|
ListenForGameEvent( "teamplay_flag_event" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "player_used_powerup_bottle" ) ) |
|
{ |
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
if ( event->GetInt( "type" ) == POWERUP_BOTTLE_RECALL ) |
|
{ |
|
// defend the bomb within 5 seconds |
|
m_flAchievementEndTime = gpGlobals->curtime + 5.0f; |
|
} |
|
} |
|
} |
|
else if ( FStrEq( pszEventName, "teamplay_flag_event" ) ) |
|
{ |
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
if ( event->GetInt( "eventtype" ) == TF_FLAGEVENT_DEFEND ) |
|
{ |
|
if ( gpGlobals->curtime < m_flAchievementEndTime ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
float m_flAchievementEndTime; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_UseTeleportBottle, ACHIEVEMENT_TF_MVM_USE_TELEPORT_BOTTLE, "TF_MVM_USE_TELEPORT_BOTTLE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_UseCritBottle : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL | ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS ); |
|
SetGoal( 1 ); |
|
|
|
m_flAchievementEndTime = 0.0f; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "player_used_powerup_bottle" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "player_used_powerup_bottle" ) ) |
|
{ |
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
if ( event->GetInt( "type" ) == POWERUP_BOTTLE_CRITBOOST ) |
|
{ |
|
C_TFPlayer *pLocalTFPlayer = C_TFPlayer::GetLocalTFPlayer(); |
|
if ( pLocalTFPlayer ) |
|
{ |
|
m_flAchievementEndTime = gpGlobals->curtime + event->GetFloat( "time" ); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) |
|
{ |
|
if ( gpGlobals->curtime < m_flAchievementEndTime ) |
|
{ |
|
C_TFPlayer *pTFVictim = ToTFPlayer( pVictim ); |
|
if ( pTFVictim && pTFVictim->IsMiniBoss() ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
float m_flAchievementEndTime; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_UseCritBottle, ACHIEVEMENT_TF_MVM_USE_CRIT_BOTTLE, "TF_MVM_USE_CRIT_BOTTLE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_UseUberBottle : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL | ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS ); |
|
SetGoal( 1 ); |
|
|
|
m_iKillCount = 0; |
|
m_flAchievementEndTime = 0.0f; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "player_used_powerup_bottle" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "player_used_powerup_bottle" ) ) |
|
{ |
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
if ( event->GetInt( "type" ) == POWERUP_BOTTLE_UBERCHARGE ) |
|
{ |
|
m_flAchievementEndTime = gpGlobals->curtime + event->GetFloat( "time" ); |
|
m_iKillCount = 0; |
|
} |
|
} |
|
} |
|
} |
|
|
|
virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) |
|
{ |
|
if ( gpGlobals->curtime < m_flAchievementEndTime ) |
|
{ |
|
m_iKillCount++; |
|
if ( m_iKillCount >= 15 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
float m_flAchievementEndTime; |
|
int m_iKillCount; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_UseUberBottle, ACHIEVEMENT_TF_MVM_USE_UBER_BOTTLE, "TF_MVM_USE_UBER_BOTTLE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_UseBuildBottle : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
m_flAchievementEndTime = 0.0f; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "object_destroyed" ); |
|
ListenForGameEvent( "mvm_quick_sentry_upgrade" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "object_destroyed" ) ) |
|
{ |
|
if ( TFGameRules() && ( TFGameRules()->State_Get() == GR_STATE_RND_RUNNING ) ) |
|
{ |
|
int iObject = event->GetInt( "objecttype" ); |
|
if ( iObject == OBJ_SENTRYGUN ) |
|
{ |
|
int iEngineerIdx = engine->GetPlayerForUserID( event->GetInt( "userid" ) ); |
|
if ( iEngineerIdx == GetLocalPlayerIndex() ) |
|
{ |
|
m_flAchievementEndTime = gpGlobals->curtime + 3.0f; |
|
} |
|
} |
|
} |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_quick_sentry_upgrade" ) ) |
|
{ |
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
if ( gpGlobals->curtime < m_flAchievementEndTime ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
float m_flAchievementEndTime; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_UseBuildBottle, ACHIEVEMENT_TF_MVM_USE_BUILD_BOTTLE, "TF_MVM_USE_BUILD_BOTTLE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_UseAmmoBottle : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_UseAmmoBottle, ACHIEVEMENT_TF_MVM_USE_AMMO_BOTTLE, "TF_MVM_USE_AMMO_BOTTLE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_MaxPrimaryUpgrades : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_MaxPrimaryUpgrades, ACHIEVEMENT_TF_MVM_MAX_PRIMARY_UPGRADES, "TF_MVM_MAX_PRIMARY_UPGRADES", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_MaxPlayerResistances : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_MaxPlayerResistances, ACHIEVEMENT_TF_MVM_MAX_PLAYER_RESISTANCES, "TF_MVM_MAX_PLAYER_RESISTANCES", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_NoAlarmsInFinalWave : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
m_bAlarmTriggered = true; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_begin_wave" ); |
|
ListenForGameEvent( "mvm_bomb_alarm_triggered" ); |
|
ListenForGameEvent( "mvm_mission_complete" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "mvm_begin_wave" ) ) |
|
{ |
|
if ( event->GetInt( "advanced" ) > 0 ) |
|
{ |
|
if ( event->GetInt( "wave_index" ) == ( event->GetInt( "max_waves" ) - 1 ) ) |
|
{ |
|
m_bAlarmTriggered = false; |
|
} |
|
else |
|
{ |
|
m_bAlarmTriggered = true; |
|
} |
|
} |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_bomb_alarm_triggered" ) ) |
|
{ |
|
m_bAlarmTriggered = true; |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_mission_complete" ) ) |
|
{ |
|
if ( !m_bAlarmTriggered ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
bool m_bAlarmTriggered; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_NoAlarmsInFinalWave, ACHIEVEMENT_TF_MVM_NO_ALARMS_IN_FINAL_WAVE, "TF_MVM_NO_ALARMS_IN_FINAL_WAVE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_KillMedicsCharged : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL | ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS ); |
|
SetGoal( 1 ); |
|
|
|
iCount = 0; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "teamplay_round_active" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
if ( FStrEq( event->GetName(), "teamplay_round_active" ) ) |
|
{ |
|
iCount = 0; |
|
} |
|
} |
|
|
|
virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) |
|
{ |
|
C_TFPlayer *pTFVictim = ToTFPlayer( pVictim ); |
|
if ( pTFVictim && pTFVictim->IsPlayerClass( TF_CLASS_MEDIC ) && ( pTFVictim->MedicGetChargeLevel() >= 1.0 ) ) |
|
{ |
|
iCount++; |
|
|
|
if ( iCount >= 5 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
int iCount; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_KillMedicsCharged, ACHIEVEMENT_TF_MVM_KILL_MEDICS_CHARGED, "TF_MVM_KILL_MEDICS_CHARGED", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_KillRobotGrind : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL | ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS ); |
|
SetGoal( 100000 ); |
|
SetStoreProgressInSteam( true ); |
|
} |
|
|
|
virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) |
|
{ |
|
IncrementCount(); |
|
} |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_KillRobotGrind, ACHIEVEMENT_TF_MVM_KILL_ROBOT_GRIND, "TF_MVM_KILL_ROBOT_GRIND", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_KillRobotMegaGrind : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL | ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS ); |
|
SetGoal( 1000000 ); |
|
SetStoreProgressInSteam( true ); |
|
} |
|
|
|
virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) |
|
{ |
|
IncrementCount(); |
|
} |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_KillRobotMegaGrind, ACHIEVEMENT_TF_MVM_KILL_ROBOT_MEGA_GRIND, "TF_MVM_KILL_ROBOT_MEGA_GRIND", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_KillSentryBuster : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_KillSentryBuster, ACHIEVEMENT_TF_MVM_KILL_SENTRY_BUSTER, "TF_MVM_KILL_SENTRY_BUSTER", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_SpySapRobots : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_SpySapRobots, ACHIEVEMENT_TF_MVM_SPY_SAP_ROBOTS, "TF_MVM_SPY_SAP_ROBOTS", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_SoldierBuffTeam : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_SoldierBuffTeam, ACHIEVEMENT_TF_MVM_SOLDIER_BUFF_TEAM, "TF_MVM_SOLDIER_BUFF_TEAM", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_HeavyRagePushDeployingRobot : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_bomb_deploy_reset_by_player" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
if ( FStrEq( event->GetName(), "mvm_bomb_deploy_reset_by_player" ) ) |
|
{ |
|
if ( GetLocalPlayerTeam() != TF_TEAM_PVE_DEFENDERS ) |
|
return; |
|
|
|
C_TFPlayer *pLocalTFPlayer = C_TFPlayer::GetLocalTFPlayer(); |
|
if ( !pLocalTFPlayer ) |
|
return; |
|
|
|
if ( !pLocalTFPlayer->IsPlayerClass( TF_CLASS_HEAVYWEAPONS ) ) |
|
return; |
|
|
|
if ( !pLocalTFPlayer->m_Shared.IsRageDraining() ) |
|
return; |
|
|
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_HeavyRagePushDeployingRobot, ACHIEVEMENT_TF_MVM_HEAVY_RAGE_PUSH_DEPLOYING_ROBOT, "TF_MVM_HEAVY_RAGE_PUSH_DEPLOYING_ROBOT", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_MedicShareBottles : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
iCount = 0; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "teamplay_round_active" ); |
|
ListenForGameEvent( "mvm_medic_powerup_shared" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "teamplay_round_active" ) ) |
|
{ |
|
iCount = 0; |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_medic_powerup_shared" ) ) |
|
{ |
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
iCount++; |
|
|
|
if ( iCount >= 5 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
int iCount; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_MedicShareBottles, ACHIEVEMENT_TF_MVM_MEDIC_SHARE_BOTTLES, "TF_MVM_MEDIC_SHARE_BOTTLES", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_DemoGroupKill : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_DemoGroupKill, ACHIEVEMENT_TF_MVM_DEMO_GROUP_KILL, "TF_MVM_DEMO_GROUP_KILL", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_ScoutMarkForDeath : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
iCount = 0; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "teamplay_round_active" ); |
|
ListenForGameEvent( "mvm_scout_marked_for_death" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "teamplay_round_active" ) ) |
|
{ |
|
iCount = 0; |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_scout_marked_for_death" ) ) |
|
{ |
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
iCount++; |
|
|
|
if ( iCount >= 15 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
int iCount; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_ScoutMarkForDeath, ACHIEVEMENT_TF_MVM_SCOUT_MARK_FOR_DEATH, "TF_MVM_SCOUT_MARK_FOR_DEATH", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_SniperKillGroup : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_SniperKillGroup, ACHIEVEMENT_TF_MVM_SNIPER_KILL_GROUP, "TF_MVM_SNIPER_KILL_GROUP", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_PyroBombReset : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
RESET_COUNT = 3; |
|
m_iResetCountInWave = 0; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_bomb_reset_by_player" ); |
|
ListenForGameEvent( "mvm_wave_complete" ); |
|
ListenForGameEvent( "teamplay_round_active" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
if ( FStrEq( pszEventName, "mvm_bomb_reset_by_player" ) ) |
|
{ |
|
if ( GetLocalPlayerTeam() != TF_TEAM_PVE_DEFENDERS ) |
|
return; |
|
|
|
C_TFPlayer *pLocalTFPlayer = C_TFPlayer::GetLocalTFPlayer(); |
|
if ( !pLocalTFPlayer ) |
|
return; |
|
|
|
if ( !pLocalTFPlayer->IsPlayerClass( TF_CLASS_PYRO ) ) |
|
return; |
|
|
|
if ( event->GetInt( "player" ) == GetLocalPlayerIndex() ) |
|
{ |
|
m_iResetCountInWave++; |
|
} |
|
|
|
if ( m_iResetCountInWave >= RESET_COUNT ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_wave_complete" ) || |
|
FStrEq( pszEventName, "teamplay_round_active" ) ) |
|
{ |
|
m_iResetCountInWave = 0; |
|
} |
|
} |
|
|
|
private: |
|
|
|
int RESET_COUNT; |
|
int m_iResetCountInWave; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_PyroBombReset, ACHIEVEMENT_TF_MVM_PYRO_BOMB_RESET, "TF_MVM_PYRO_BOMB_RESET", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_EngineerEscapeSentryBuster : public CBaseTFAchievementSimple |
|
{ |
|
public: |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
|
|
ListenForGameEvent( "mvm_sentrybuster_detonate" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
// We should only be here if the sentry buster thinks it was successful |
|
// which is to say started to detonate because they were within range |
|
if ( FStrEq( event->GetName(), "mvm_sentrybuster_detonate" ) ) |
|
{ |
|
if ( GetLocalPlayerTeam() != TF_TEAM_PVE_DEFENDERS ) |
|
return; |
|
|
|
int iTargetIdx = event->GetInt( "player" ); |
|
|
|
C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer(); |
|
if ( !pLocalPlayer ) |
|
return; |
|
|
|
if ( !pLocalPlayer->IsAlive() ) |
|
return; |
|
|
|
if ( !pLocalPlayer->IsPlayerClass( TF_CLASS_ENGINEER ) ) |
|
return; |
|
|
|
// Where it exploded |
|
float x, y, z = 0; |
|
x = event->GetFloat( "det_x" ); |
|
y = event->GetFloat( "det_y" ); |
|
z = event->GetFloat( "det_z" ); |
|
|
|
// If we're not the target, but within a reasonable range of the sentry buster, |
|
// also give credit, otherwise we give the target credit for still being alive. |
|
if ( GetLocalPlayerIndex() != iTargetIdx ) |
|
{ |
|
Vector vDist = pLocalPlayer->GetAbsOrigin() - Vector( x, y, z ); |
|
if ( vDist.LengthSqr() > 400 * 400 ) |
|
return; |
|
} |
|
|
|
AwardAchievement(); |
|
} |
|
} |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_EngineerEscapeSentryBuster, ACHIEVEMENT_TF_MVM_ENGINEER_ESCAPE_SENTRY_BUSTER, "TF_MVM_ENGINEER_ESCAPE_SENTRY_BUSTER", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Maps_Rottenburg_Tank : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Maps_Rottenburg_Tank, ACHIEVEMENT_TF_MVM_MAPS_ROTTENBURG_TANK, "TF_MVM_MAPS_ROTTENBURG_TANK", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Maps_Rottenburg_Bomb : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
SetMapNameFilter( "mvm_rottenburg" ); |
|
m_bValidWave = false; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_begin_wave" ); |
|
ListenForGameEvent( "mvm_wave_complete" ); |
|
ListenForGameEvent( "flag_carried_in_detection_zone" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "mvm_begin_wave" ) ) |
|
{ |
|
m_bValidWave = true; |
|
} |
|
else if ( FStrEq( pszEventName, "flag_carried_in_detection_zone" ) ) |
|
{ |
|
m_bValidWave = false; |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_wave_complete" ) ) |
|
{ |
|
if ( event->GetBool( "advanced" ) ) |
|
{ |
|
if ( m_bValidWave ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
bool m_bValidWave; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Maps_Rottenburg_Bomb, ACHIEVEMENT_TF_MVM_MAPS_ROTTENBURG_BOMB, "TF_MVM_MAPS_ROTTENBURG_BOMB", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Maps_Rottenburg_PitGrind : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 100 ); |
|
SetStoreProgressInSteam( true ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Maps_Rottenburg_PitGrind, ACHIEVEMENT_TF_MVM_MAPS_ROTTENBURG_PIT_GRIND, "TF_MVM_MAPS_ROTTENBURG_PIT_GRIND", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Maps_Manhattan_Pit : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
SetMapNameFilter( "mvm_mannhattan" ); |
|
m_iCount = 0; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_begin_wave" ); |
|
ListenForGameEvent( "mvm_mannhattan_pit" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "mvm_begin_wave" ) ) |
|
{ |
|
m_iCount = 0; |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_mannhattan_pit" ) ) |
|
{ |
|
m_iCount++; |
|
if ( m_iCount >= 10 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
int m_iCount; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Maps_Manhattan_Pit, ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_PIT, "TF_MVM_MAPS_MANNHATTAN_PIT", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Maps_Manhattan_Mystery : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Maps_Manhattan_Mystery, ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_MYSTERY, "TF_MVM_MAPS_MANNHATTAN_MYSTERY", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Maps_Manhattan_NoGates : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
SetMapNameFilter( "mvm_mannhattan" ); |
|
m_iWaveBits = 0; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_begin_wave" ); |
|
ListenForGameEvent( "mvm_adv_wave_complete_no_gates" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEventName = event->GetName(); |
|
|
|
if ( FStrEq( pszEventName, "mvm_begin_wave" ) ) |
|
{ |
|
if ( event->GetInt( "wave_index" ) == 0 ) |
|
{ |
|
m_iWaveBits = 0; |
|
} |
|
} |
|
else if ( FStrEq( pszEventName, "mvm_adv_wave_complete_no_gates" ) ) |
|
{ |
|
m_iWaveBits |= ( 1 << event->GetInt( "index" ) ); |
|
|
|
int iComponentBits = m_iWaveBits; |
|
int iNumBitsSet = 0; |
|
|
|
while ( iComponentBits > 0 ) |
|
{ |
|
if ( iComponentBits & 1 ) |
|
{ |
|
iNumBitsSet++; |
|
} |
|
iComponentBits >>= 1; |
|
} |
|
|
|
if ( TFObjectiveResource() ) |
|
{ |
|
if ( iNumBitsSet >= TFObjectiveResource()->GetMannVsMachineMaxWaveCount() ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
int m_iWaveBits; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Maps_Manhattan_NoGates, ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_NO_GATES, "TF_MVM_MAPS_MANNHATTAN_NO_GATES", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Maps_Manhattan_KillStunRadiowave : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
SetMapNameFilter( "mvm_mannhattan" ); |
|
m_nRobotsKilled = 0; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_adv_wave_killed_stun_radio" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
if ( FStrEq( event->GetName(), "mvm_adv_wave_killed_stun_radio" ) ) |
|
{ |
|
m_nRobotsKilled++; |
|
if ( m_nRobotsKilled >= 50 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
|
|
private: |
|
int m_nRobotsKilled; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Maps_Manhattan_KillStunRadiowave, ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_STUN_RADIOWAVE, "TF_MVM_MAPS_MANNHATTAN_STUN_RADIOWAVE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Maps_Manhattan_BombBotGrind : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 500 ); |
|
SetStoreProgressInSteam( true ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Maps_Manhattan_BombBotGrind, ACHIEVEMENT_TF_MVM_MAPS_MANNHATTAN_BOMB_BOT_GRIND, "TF_MVM_MAPS_MANNHATTAN_BOMB_BOT_GRIND", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_SentryBusterFriendlyFire : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL | ACH_LISTEN_KILL_EVENTS ); |
|
SetGoal( 1 ); |
|
|
|
m_flDetonateTime = 0.f; |
|
m_pSentryBuster = NULL; |
|
m_Victims.EnsureCapacity( MAX_PLAYERS ); |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_sentrybuster_killed" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
if ( FStrEq( event->GetName(), "mvm_sentrybuster_killed" ) ) |
|
{ |
|
m_pSentryBuster = UTIL_PlayerByIndex( event->GetInt( "sentry_buster" ) ); |
|
if ( m_pSentryBuster ) |
|
{ |
|
m_flDetonateTime = gpGlobals->curtime; |
|
SetNextThink( 0.1 ); |
|
} |
|
} |
|
} |
|
|
|
virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) |
|
{ |
|
if ( pAttacker && pVictim ) |
|
{ |
|
CBasePlayer *pAttackerPlayer = UTIL_PlayerByIndex( pAttacker->entindex() ); |
|
if ( m_pSentryBuster && m_pSentryBuster == pAttackerPlayer && gpGlobals->curtime <= m_flDetonateTime + 0.25f ) |
|
{ |
|
if ( pVictim->GetTeamNumber() == TF_TEAM_PVE_INVADERS ) |
|
{ |
|
if ( m_Victims.Find( pVictim->entindex() ) == m_Victims.InvalidIndex() ) |
|
{ |
|
m_Victims.AddToTail( pVictim->entindex() ); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
virtual void Think( void ) |
|
{ |
|
if ( gpGlobals->curtime <= m_flDetonateTime + 0.25f ) |
|
{ |
|
int nVictims = m_Victims.Count(); |
|
if ( nVictims >= 5 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
|
|
SetNextThink( 0.1 ); |
|
return; |
|
} |
|
|
|
m_pSentryBuster = NULL; |
|
m_Victims.RemoveAll(); |
|
} |
|
|
|
private: |
|
CUtlVector< int > m_Victims; |
|
CBasePlayer *m_pSentryBuster; |
|
float m_flDetonateTime; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_SentryBusterFriendlyFire, ACHIEVEMENT_TF_MVM_SENTRY_BUSTER_FRIENDLY_FIRE, "TF_MVM_SENTRY_BUSTER_FRIENDLY_FIRE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Sniper_CollectHeadshotMoney : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
SetMapNameFilter( "mvm_mannhattan" ); |
|
m_nCurrencyCollected = 0; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "mvm_sniper_headshot_currency" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
if ( FStrEq( event->GetName(), "mvm_sniper_headshot_currency" ) ) |
|
{ |
|
C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer(); |
|
if ( pLocalPlayer ) |
|
{ |
|
if ( event->GetInt( "userid" ) == pLocalPlayer->GetUserID() ) |
|
{ |
|
m_nCurrencyCollected += event->GetFloat( "currency" ); |
|
if ( m_nCurrencyCollected >= 500 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
int m_nCurrencyCollected; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Sniper_CollectHeadshotMoney, ACHIEVEMENT_TF_MVM_SNIPER_COLLECT_HEADSHOT_MONEY, "TF_MVM_SNIPER_COLLECT_HEADSHOT_MONEY", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Medic_ShieldBlockDamage : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
SetMapNameFilter( "mvm_mannhattan" ); |
|
m_flDamage = 0.0f; |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "teamplay_round_active" ); |
|
ListenForGameEvent( "localplayer_respawn" ); |
|
ListenForGameEvent( "medigun_shield_blocked_damage" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEvent = event->GetName(); |
|
|
|
if ( FStrEq( pszEvent, "teamplay_round_active" ) || |
|
FStrEq( pszEvent, "localplayer_respawn" ) ) |
|
{ |
|
m_flDamage = 0.0f; |
|
} |
|
else if ( FStrEq( pszEvent, "medigun_shield_blocked_damage" ) ) |
|
{ |
|
C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer(); |
|
if ( pLocalPlayer ) |
|
{ |
|
if ( event->GetInt( "userid" ) == pLocalPlayer->GetUserID() ) |
|
{ |
|
m_flDamage += event->GetFloat( "damage" ); |
|
if ( m_flDamage >= 5000.0f ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
float m_flDamage; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Medic_ShieldBlockDamage, ACHIEVEMENT_TF_MVM_MEDIC_SHIELD_BLOCK_DAMAGE, "TF_MVM_MEDIC_SHIELD_BLOCK_DAMAGE", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_Medic_ReviveTeammates : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 1 ); |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "revive_player_complete" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
if ( FStrEq( event->GetName(), "revive_player_complete" ) ) |
|
{ |
|
if ( TFGameRules() && TFGameRules()->IsMannVsMachineMode() ) |
|
{ |
|
C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer(); |
|
if ( pLocalPlayer && pLocalPlayer->MedicIsReleasingCharge() ) |
|
{ |
|
if ( event->GetInt( "entindex" ) == GetLocalPlayerIndex() ) |
|
{ |
|
int iNewIndex = m_Times.AddToTail(); |
|
m_Times[iNewIndex] = gpGlobals->curtime; |
|
|
|
// we only care about the last two times we revived someone |
|
if ( m_Times.Count() > 2 ) |
|
{ |
|
m_Times.Remove( 0 ); |
|
} |
|
|
|
if ( m_Times.Count() == 2 ) |
|
{ |
|
if ( m_Times.Tail() - m_Times.Head() <= 5.0 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
private: |
|
CUtlVector< float > m_Times; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_Medic_ReviveTeammates, ACHIEVEMENT_TF_MVM_MEDIC_REVIVE_TEAMMATES, "TF_MVM_MEDIC_REVIVE_TEAMMATES", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_RocketSpecialistKillGrind : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL | ACH_LISTEN_KILL_EVENTS ); |
|
SetGoal( 1 ); |
|
|
|
m_flLastDirectTime = 0.f; |
|
m_Victims.EnsureCapacity( MAX_PLAYERS ); |
|
} |
|
|
|
virtual void ListenForEvents() |
|
{ |
|
ListenForGameEvent( "player_directhit_stun" ); |
|
} |
|
|
|
void FireGameEvent_Internal( IGameEvent *event ) |
|
{ |
|
const char *pszEvent = event->GetName(); |
|
|
|
// If we hit a bot directly, track player deaths over the next 0.25 seconds and see if we're the attacker |
|
if ( FStrEq( pszEvent, "player_directhit_stun" ) ) |
|
{ |
|
int iLocalPlayerIndex = C_BasePlayer::GetLocalPlayer()->entindex(); |
|
int iAttackerIndex = event->GetInt( "attacker" ); |
|
CBasePlayer *pVictim = UTIL_PlayerByIndex( event->GetInt( "victim" ) ); |
|
|
|
if ( pVictim && pVictim->IsPlayer() && iLocalPlayerIndex == iAttackerIndex ) |
|
{ |
|
m_flLastDirectTime = gpGlobals->curtime; |
|
SetNextThink( 0.1 ); |
|
} |
|
} |
|
} |
|
|
|
virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event ) |
|
{ |
|
if ( gpGlobals->curtime <= m_flLastDirectTime + 0.25f ) |
|
{ |
|
if ( pAttacker && pVictim && pAttacker != pVictim && pAttacker == C_BasePlayer::GetLocalPlayer() ) |
|
{ |
|
CBasePlayer *pPlayerVictim = UTIL_PlayerByIndex( pVictim->entindex() ); |
|
if ( m_Victims.Find( pPlayerVictim ) == m_Victims.InvalidIndex() ) |
|
{ |
|
m_Victims.AddToTail( pPlayerVictim ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
virtual void Think( void ) |
|
{ |
|
int nVictims = m_Victims.Count(); |
|
if ( nVictims ) |
|
{ |
|
if ( gpGlobals->curtime <= m_flLastDirectTime + 0.25f ) |
|
{ |
|
if ( nVictims >= 5 ) |
|
{ |
|
AwardAchievement(); |
|
} |
|
} |
|
else |
|
{ |
|
m_Victims.RemoveAll(); |
|
return; |
|
} |
|
|
|
SetNextThink( 0.1 ); |
|
} |
|
} |
|
|
|
private: |
|
CUtlVector< CBasePlayer* > m_Victims; |
|
float m_flLastDirectTime; |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_RocketSpecialistKillGrind, ACHIEVEMENT_TF_MVM_ROCKET_SPECIALIST_KILL_GRIND, "TF_MVM_ROCKET_SPECIALIST_KILL_GRIND", 5 ); |
|
|
|
//---------------------------------------------------------------------------------------------------------------- |
|
class CAchievementTF_MvM_RocketSpecialistStunGrind : public CBaseTFAchievementSimple |
|
{ |
|
void Init() |
|
{ |
|
SetFlags( ACH_SAVE_GLOBAL ); |
|
SetGoal( 50 ); |
|
SetStoreProgressInSteam( true ); |
|
} |
|
|
|
// server awards this achievement, no other code within achievement necessary |
|
}; |
|
DECLARE_ACHIEVEMENT( CAchievementTF_MvM_RocketSpecialistStunGrind, ACHIEVEMENT_TF_MVM_ROCKET_SPECIALIST_STUN_GRIND, "TF_MVM_ROCKET_SPECIALIST_STUN_GRIND", 5 ); |
|
|
|
#endif // CLIENT_DLL |
|
|
|
|
|
|
|
|