Team Fortress 2 Source Code as on 22/4/2020
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

//========= 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