|
|
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
|
|
|
//
|
|
|
|
|
// Purpose:
|
|
|
|
|
//
|
|
|
|
|
// $NoKeywords: $
|
|
|
|
|
//=============================================================================//
|
|
|
|
|
|
|
|
|
|
#include "cbase.h"
|
|
|
|
|
|
|
|
|
|
#include "tf_mann_vs_machine_stats.h"
|
|
|
|
|
#include "filesystem.h"
|
|
|
|
|
#include "steamworks_gamestats.h"
|
|
|
|
|
#include "econ_item_description.h"
|
|
|
|
|
#include "econ_item_system.h"
|
|
|
|
|
#include "econ_item_schema.h"
|
|
|
|
|
#include "econ_item_constants.h"
|
|
|
|
|
|
|
|
|
|
#ifdef GAME_DLL
|
|
|
|
|
#include "dt_utlvector_send.h"
|
|
|
|
|
#include "tf_gamerules.h"
|
|
|
|
|
#include "tf_player.h"
|
|
|
|
|
#include "tf_gc_server.h"
|
|
|
|
|
#else
|
|
|
|
|
#include "dt_utlvector_recv.h"
|
|
|
|
|
#include "c_tf_player.h"
|
|
|
|
|
#include "hud_macros.h"
|
|
|
|
|
#include "tf_hud_mann_vs_machine_status.h"
|
|
|
|
|
#include "c_tf_objective_resource.h"
|
|
|
|
|
#include "player_vs_environment/c_tf_upgrades.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
|
|
|
#include "tier0/memdbgon.h"
|
|
|
|
|
|
|
|
|
|
extern ConVar tf_mm_trusted;
|
|
|
|
|
|
|
|
|
|
extern ConVar tf_mvm_respec_limit;
|
|
|
|
|
extern ConVar tf_mvm_respec_credit_goal;
|
|
|
|
|
|
|
|
|
|
static CMannVsMachineStats *g_pMVMStats = NULL;
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
#ifdef CLIENT_DLL
|
|
|
|
|
// Avoid redef warnings
|
|
|
|
|
#undef CTFPlayer
|
|
|
|
|
#define CTFPlayer C_TFPlayer
|
|
|
|
|
#define CMannVsMachineStats C_MannVsMachineStats
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
BEGIN_NETWORK_TABLE_NOBASE( CMannVsMachineWaveStats, DT_CMannVsMachineWaveStats )
|
|
|
|
|
#if defined( GAME_DLL )
|
|
|
|
|
SendPropInt( SENDINFO( nCreditsDropped ), 16, SPROP_UNSIGNED ),
|
|
|
|
|
SendPropInt( SENDINFO( nCreditsAcquired ), 16, SPROP_UNSIGNED ),
|
|
|
|
|
SendPropInt( SENDINFO( nCreditsBonus ), 16, SPROP_UNSIGNED ),
|
|
|
|
|
SendPropInt( SENDINFO( nPlayerDeaths ), 16, SPROP_UNSIGNED ),
|
|
|
|
|
SendPropInt( SENDINFO( nBuyBacks ), 8, SPROP_UNSIGNED ),
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
RecvPropInt( RECVINFO( nCreditsDropped ) ),
|
|
|
|
|
RecvPropInt( RECVINFO( nCreditsAcquired ) ),
|
|
|
|
|
RecvPropInt( RECVINFO( nCreditsBonus ) ),
|
|
|
|
|
RecvPropInt( RECVINFO( nPlayerDeaths ) ),
|
|
|
|
|
RecvPropInt( RECVINFO( nBuyBacks ) ),
|
|
|
|
|
#endif
|
|
|
|
|
END_NETWORK_TABLE()
|
|
|
|
|
|
|
|
|
|
LINK_ENTITY_TO_CLASS( tf_mann_vs_machine_stats, CMannVsMachineStats );
|
|
|
|
|
IMPLEMENT_NETWORKCLASS_ALIASED( MannVsMachineStats, DT_MannVsMachineStats )
|
|
|
|
|
|
|
|
|
|
BEGIN_NETWORK_TABLE( CMannVsMachineStats, DT_MannVsMachineStats )
|
|
|
|
|
#if defined ( GAME_DLL )
|
|
|
|
|
SendPropInt( SENDINFO( m_iCurrentWaveIdx ), 8, SPROP_UNSIGNED ),
|
|
|
|
|
SendPropInt( SENDINFO( m_iServerWaveID ), 8, SPROP_UNSIGNED ),
|
|
|
|
|
SendPropDataTable( SENDINFO_DT(m_runningTotalWaveStats), &REFERENCE_SEND_TABLE(DT_CMannVsMachineWaveStats) ),
|
|
|
|
|
SendPropDataTable( SENDINFO_DT(m_previousWaveStats), &REFERENCE_SEND_TABLE(DT_CMannVsMachineWaveStats) ),
|
|
|
|
|
SendPropDataTable( SENDINFO_DT(m_currentWaveStats), &REFERENCE_SEND_TABLE(DT_CMannVsMachineWaveStats) ),
|
|
|
|
|
SendPropInt( SENDINFO( m_iCurrencyCollectedForRespec ), -1, SPROP_VARINT ),
|
|
|
|
|
SendPropInt( SENDINFO( m_nRespecsAwardedInWave ), 8, SPROP_UNSIGNED ),
|
|
|
|
|
#else
|
|
|
|
|
RecvPropInt( RECVINFO( m_iCurrentWaveIdx ) ),
|
|
|
|
|
RecvPropInt( RECVINFO( m_iServerWaveID ) ),
|
|
|
|
|
RecvPropDataTable(RECVINFO_DT(m_runningTotalWaveStats), 0, &REFERENCE_RECV_TABLE(DT_CMannVsMachineWaveStats)),
|
|
|
|
|
RecvPropDataTable(RECVINFO_DT(m_previousWaveStats), 0, &REFERENCE_RECV_TABLE(DT_CMannVsMachineWaveStats)),
|
|
|
|
|
RecvPropDataTable(RECVINFO_DT(m_currentWaveStats), 0, &REFERENCE_RECV_TABLE(DT_CMannVsMachineWaveStats)),
|
|
|
|
|
RecvPropInt( RECVINFO( m_iCurrencyCollectedForRespec ) ),
|
|
|
|
|
RecvPropInt( RECVINFO( m_nRespecsAwardedInWave ) ),
|
|
|
|
|
#endif
|
|
|
|
|
END_NETWORK_TABLE()
|
|
|
|
|
|
|
|
|
|
#ifdef CLIENT_DLL
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Server message that tells that a mann vs machine event occurred
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
static void __MsgFunc_MVMStatsReset( bf_read &msg )
|
|
|
|
|
{
|
|
|
|
|
if ( g_pMVMStats )
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats->ResetStats( );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Server message that tells that a mann vs machine event occurred
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
static void __MsgFunc_MVMPlayerEvent( bf_read &msg )
|
|
|
|
|
{
|
|
|
|
|
// Deprecated.
|
|
|
|
|
// Dont delete this or its HOOK_MESSAGE below or else demos will break
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Reports Player Spending
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
static void __MsgFunc_MVMLocalPlayerWaveSpendingValue( bf_read &msg )
|
|
|
|
|
{
|
|
|
|
|
if ( !g_pMVMStats )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// PlayerIdx(8), Wave(1), Type(1), Cost(2)
|
|
|
|
|
uint64 playerID;
|
|
|
|
|
if ( !msg.ReadBytes( &playerID, sizeof(playerID) ) )
|
|
|
|
|
{
|
|
|
|
|
DevMsg( " Unable to Get Player SteamID from __MsgFunc_MVMLocalPlayerWaveSpendingValue() " );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint8 idxWave = msg.ReadByte();
|
|
|
|
|
eMannVsMachineEvent eType = (eMannVsMachineEvent)msg.ReadByte();
|
|
|
|
|
int16 nCost = msg.ReadWord();
|
|
|
|
|
|
|
|
|
|
CPlayerWaveSpendingStats *pPlayerStats = g_pMVMStats->GetSpending( idxWave, playerID );
|
|
|
|
|
if ( !pPlayerStats )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
CSteamID steamId( playerID );
|
|
|
|
|
C_TFPlayer *pTFPlayer = ToTFPlayer( GetPlayerBySteamID( steamId ) );
|
|
|
|
|
C_TFPlayer *pTFLocalPlayer = C_TFPlayer::GetLocalTFPlayer();
|
|
|
|
|
|
|
|
|
|
switch ( eType )
|
|
|
|
|
{
|
|
|
|
|
case kMVMEvent_Player_BoughtInstantRespawn:
|
|
|
|
|
pPlayerStats->nCreditsSpentOnBuyBacks += nCost;
|
|
|
|
|
// Read the event msg and pass it on to MVMStats
|
|
|
|
|
if ( pTFPlayer == pTFLocalPlayer )
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats->SW_ReportClientBuyBackPurchase( idxWave, nCost );
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case kMVMEvent_Player_BoughtBottle:
|
|
|
|
|
pPlayerStats->nCreditsSpentOnBottles += nCost;
|
|
|
|
|
break;
|
|
|
|
|
case kMVMEvent_Player_BoughtUpgrade:
|
|
|
|
|
pPlayerStats->nCreditsSpentOnUpgrades += nCost;
|
|
|
|
|
break;
|
|
|
|
|
case kMVMEvent_Player_ActiveUpgrades:
|
|
|
|
|
g_pMVMStats->SetPlayerActiveUpgradeCosts( playerID, nCost );
|
|
|
|
|
break;
|
|
|
|
|
} // switch
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Server message that tells that a mann vs machine event occurred
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
static void __MsgFunc_MVMResetPlayerStats( bf_read &msg )
|
|
|
|
|
{
|
|
|
|
|
if ( !g_pMVMStats )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
uint8 playerIndex = msg.ReadByte();
|
|
|
|
|
|
|
|
|
|
C_TFPlayer *pTFPlayer = ToTFPlayer( UTIL_PlayerByIndex( playerIndex ) );
|
|
|
|
|
if ( !pTFPlayer )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
g_pMVMStats->ResetPlayerEvents( pTFPlayer );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Handling a Server message that notifies that a player has upgraded in MvM
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
static void __MsgFunc_MVMPlayerUpgradedEvent( bf_read &msg )
|
|
|
|
|
{
|
|
|
|
|
//if ( !g_pMVMStats )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
//// Read the data
|
|
|
|
|
//// PlayerIdx(1), WaveIdx(1), ItemDef(2), AttributeDef(2), Quality(1), cost(2)
|
|
|
|
|
//uint8 playerIndex = msg.ReadByte();
|
|
|
|
|
//uint8 idxWave = msg.ReadByte();
|
|
|
|
|
//uint16 nItemDef = msg.ReadWord();
|
|
|
|
|
//uint16 nAttributeDef = msg.ReadWord();
|
|
|
|
|
//uint8 nQuality = msg.ReadByte();
|
|
|
|
|
//int16 nCost = msg.ReadWord();
|
|
|
|
|
|
|
|
|
|
//CMannVsMachineUpgradeEvent upgrade;
|
|
|
|
|
//upgrade.nItemDef = nItemDef;
|
|
|
|
|
//upgrade.nAttributeDef = nAttributeDef;
|
|
|
|
|
//upgrade.nQuality = nQuality;
|
|
|
|
|
|
|
|
|
|
//C_TFPlayer *pTFPlayer = ToTFPlayer( UTIL_PlayerByIndex( playerIndex ) );
|
|
|
|
|
//C_TFPlayer *pTFLocalPlayer = C_TFPlayer::GetLocalTFPlayer();
|
|
|
|
|
|
|
|
|
|
//// Report Stats if Local Player
|
|
|
|
|
//if ( pTFPlayer && pTFLocalPlayer && ( pTFPlayer == pTFLocalPlayer ) )
|
|
|
|
|
//{
|
|
|
|
|
// // Read the event msg and pass it on to MVMStats
|
|
|
|
|
// g_pMVMStats->SW_ReportClientUpgradePurchase( idxWave, nItemDef, nAttributeDef, nQuality, nCost );
|
|
|
|
|
//}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Message for the Local Player that it should clear its upgrade vector
|
|
|
|
|
static void __MsgFunc_MVMLocalPlayerUpgradesClear( bf_read &msg )
|
|
|
|
|
{
|
|
|
|
|
if ( !g_pMVMStats )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Read the data
|
|
|
|
|
//uint8 count = msg.ReadByte();
|
|
|
|
|
|
|
|
|
|
g_pMVMStats->ClearLocalPlayerUpgrades();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Message for the local player about an upgrade that it owns
|
|
|
|
|
static void __MsgFunc_MVMLocalPlayerUpgradesValue( bf_read &msg )
|
|
|
|
|
{
|
|
|
|
|
if ( !g_pMVMStats )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Read the data
|
|
|
|
|
// Class(1), ItemDef(2), Upgrade(1), cost(1)
|
|
|
|
|
uint8 playerClass = msg.ReadByte();
|
|
|
|
|
uint16 nItemDef = msg.ReadWord();
|
|
|
|
|
//uint8 upgrade = msg.ReadByte();
|
|
|
|
|
//uint16 cost = msg.ReadByte();
|
|
|
|
|
|
|
|
|
|
g_pMVMStats->AddLocalPlayerUpgrade( playerClass, (item_definition_index_t)nItemDef );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Message for the player that it should clear spending stats history for target wave
|
|
|
|
|
static void __MsgFunc_MVMResetPlayerWaveSpendingStats( bf_read &msg )
|
|
|
|
|
{
|
|
|
|
|
if ( !g_pMVMStats )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Read the data
|
|
|
|
|
// Wave(1)
|
|
|
|
|
uint8 idxWave = msg.ReadByte();
|
|
|
|
|
|
|
|
|
|
g_pMVMStats->ClearCurrentPlayerWaveSpendingStats( idxWave );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Server message that tells that the current wave has ended and a new one has begun (including resets)
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
static void __MsgFunc_MVMWaveChange( bf_read &msg )
|
|
|
|
|
{
|
|
|
|
|
if ( !g_pMVMStats )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Read the data
|
|
|
|
|
uint16 waveID = msg.ReadWord();
|
|
|
|
|
|
|
|
|
|
CMannVsMachinePlayerStats stats;
|
|
|
|
|
|
|
|
|
|
stats.nDeaths = msg.ReadByte();
|
|
|
|
|
stats.nBotDamage = msg.ReadLong();
|
|
|
|
|
stats.nGiantDamage = msg.ReadLong();
|
|
|
|
|
stats.nTankDamage = msg.ReadLong();
|
|
|
|
|
|
|
|
|
|
// Send the Stats
|
|
|
|
|
g_pMVMStats->SW_ReportClientWaveSummary( waveID, stats );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
static void __MsgFunc_MVMResetPlayerUpgradeSpending( bf_read &msg )
|
|
|
|
|
{
|
|
|
|
|
if ( !g_pMVMStats )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
uint8 playerIndex = msg.ReadByte();
|
|
|
|
|
|
|
|
|
|
C_TFPlayer *pTFPlayer = ToTFPlayer( UTIL_PlayerByIndex( playerIndex ) );
|
|
|
|
|
if ( !pTFPlayer )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
g_pMVMStats->ResetUpgradeSpending( pTFPlayer );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif // CLIENT_DLL
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
// CMannVsMachineStats
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
CMannVsMachineStats::CMannVsMachineStats()
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats = this;
|
|
|
|
|
|
|
|
|
|
#ifdef GAME_DLL
|
|
|
|
|
SetCurrentWave( 0 );
|
|
|
|
|
Q_memset( m_playerStats, 0, sizeof( m_playerStats ) );
|
|
|
|
|
#else
|
|
|
|
|
m_iCurrentWaveIdx = 0;
|
|
|
|
|
|
|
|
|
|
m_teamActiveUpgrades.Purge();
|
|
|
|
|
m_teamActiveUpgrades.SetLessFunc( DefLessFunc (uint64) );
|
|
|
|
|
#endif
|
|
|
|
|
m_currWaveSpendingStats.SetLessFunc( DefLessFunc (uint64) );
|
|
|
|
|
m_prevWaveSpendingStats.SetLessFunc( DefLessFunc (uint64) );
|
|
|
|
|
m_allPrevWaveSpendingStats.SetLessFunc( DefLessFunc (uint64) );
|
|
|
|
|
|
|
|
|
|
m_iCurrencyCollectedForRespec = 0;
|
|
|
|
|
m_nRespecsAwardedInWave = 0;
|
|
|
|
|
//m_nEventID = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: DTOR
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
CMannVsMachineStats::~CMannVsMachineStats()
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::ResetStats( )
|
|
|
|
|
{
|
|
|
|
|
#ifdef GAME_DLL
|
|
|
|
|
// notify everyone to reset everything
|
|
|
|
|
CBroadcastRecipientFilter filter;
|
|
|
|
|
filter.MakeReliable();
|
|
|
|
|
UserMessageBegin( filter, "MVMStatsReset" );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
|
|
|
|
|
SetCurrentWave( 0 );
|
|
|
|
|
|
|
|
|
|
m_runningTotalWaveStats.ClearStats();
|
|
|
|
|
m_previousWaveStats.ClearStats();
|
|
|
|
|
m_currentWaveStats.ClearStats();
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
m_vecLocalPlayerUpgrades.Purge();
|
|
|
|
|
m_teamActiveUpgrades.Purge();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
m_currWaveSpendingStats.RemoveAll();
|
|
|
|
|
m_prevWaveSpendingStats.RemoveAll();
|
|
|
|
|
m_allPrevWaveSpendingStats.RemoveAll();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::ResetPlayerEvents( CTFPlayer *pTFPlayer )
|
|
|
|
|
{
|
|
|
|
|
if ( pTFPlayer->IsBot() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
#ifdef GAME_DLL
|
|
|
|
|
CBroadcastRecipientFilter filter;
|
|
|
|
|
filter.MakeReliable();
|
|
|
|
|
UserMessageBegin( filter, "MVMResetPlayerStats" );
|
|
|
|
|
WRITE_BYTE( (uint8)pTFPlayer->entindex() );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::ResetUpgradeSpending( CTFPlayer *pTFPlayer )
|
|
|
|
|
{
|
|
|
|
|
if ( !pTFPlayer )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if ( pTFPlayer->IsBot() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
CSteamID steamID;
|
|
|
|
|
if ( pTFPlayer && pTFPlayer->GetSteamID( &steamID ) )
|
|
|
|
|
{
|
|
|
|
|
int iWave = m_currWaveSpendingStats.Find( steamID.ConvertToUint64() );
|
|
|
|
|
if ( iWave != m_currWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
m_currWaveSpendingStats[iWave].nCreditsSpentOnUpgrades = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iWave = m_allPrevWaveSpendingStats.Find( steamID.ConvertToUint64() );
|
|
|
|
|
if ( iWave != m_allPrevWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
m_allPrevWaveSpendingStats[iWave].nCreditsSpentOnUpgrades = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iWave = m_prevWaveSpendingStats.Find( steamID.ConvertToUint64() );
|
|
|
|
|
if ( iWave != m_prevWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
m_prevWaveSpendingStats[iWave].nCreditsSpentOnUpgrades = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef GAME_DLL
|
|
|
|
|
CBroadcastRecipientFilter filter;
|
|
|
|
|
filter.MakeReliable();
|
|
|
|
|
UserMessageBegin( filter, "MVMResetPlayerUpgradeSpending" );
|
|
|
|
|
WRITE_BYTE( (uint8)pTFPlayer->entindex() );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Returns acquired credits - default is all waves
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
uint32 CMannVsMachineStats::GetAcquiredCredits( int iWaveIdx, bool bWithBonus /*= true*/ )
|
|
|
|
|
{
|
|
|
|
|
CMannVsMachineLocalWaveStats waveStats = GetWaveStats( iWaveIdx );
|
|
|
|
|
|
|
|
|
|
if ( bWithBonus )
|
|
|
|
|
return waveStats.nCreditsAcquired + waveStats.nCreditsBonus;
|
|
|
|
|
else
|
|
|
|
|
return waveStats.nCreditsAcquired;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Returns dropped credits for a target wave. If target wave is -1, returns sum of all waves
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
uint32 CMannVsMachineStats::GetDroppedCredits( int iWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
CMannVsMachineLocalWaveStats waveStats = GetWaveStats( iWaveIdx );
|
|
|
|
|
return waveStats.nCreditsDropped;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Number of Credits missed (dropped and not collected)
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
uint32 CMannVsMachineStats::GetMissedCredits( int iWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
CMannVsMachineLocalWaveStats waveStats = GetWaveStats( iWaveIdx );
|
|
|
|
|
return waveStats.nCreditsDropped - waveStats.nCreditsAcquired;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Returns credit bonus for a target wave. If target wave is -1, returns sum of all waves
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
uint32 CMannVsMachineStats::GetBonusCredits( int iWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
CMannVsMachineLocalWaveStats waveStats = GetWaveStats( iWaveIdx );
|
|
|
|
|
return waveStats.nCreditsBonus;
|
|
|
|
|
}
|
|
|
|
|
//=============================================================================//
|
|
|
|
|
#ifdef GAME_DLL
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::RoundOver( bool bHumansWon )
|
|
|
|
|
{
|
|
|
|
|
// Send Stats to OGS
|
|
|
|
|
// Increment server wave id since victory uses the previous "wave" and this one has yet to be incremented
|
|
|
|
|
m_iServerWaveID++;
|
|
|
|
|
SW_ReportWaveSummary( m_iCurrentWaveIdx, bHumansWon );
|
|
|
|
|
m_iServerWaveID--;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::SetCurrentWave( uint32 idxWave )
|
|
|
|
|
{
|
|
|
|
|
// Advancing Wave, compact in the stats
|
|
|
|
|
if ( idxWave > m_iCurrentWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
m_runningTotalWaveStats += m_previousWaveStats;
|
|
|
|
|
m_previousWaveStats = m_currentWaveStats;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( idxWave == 0 )
|
|
|
|
|
{
|
|
|
|
|
// Purge it all
|
|
|
|
|
m_runningTotalWaveStats.ClearStats();
|
|
|
|
|
m_previousWaveStats.ClearStats();
|
|
|
|
|
m_currentWaveStats.ClearStats();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_iCurrentWaveIdx = idxWave;
|
|
|
|
|
|
|
|
|
|
// Notify Players of Reset of current Wave for PlayerStats
|
|
|
|
|
CBroadcastRecipientFilter filter;
|
|
|
|
|
filter.MakeReliable();
|
|
|
|
|
|
|
|
|
|
UserMessageBegin( filter, "MVMResetPlayerWaveSpendingStats" );
|
|
|
|
|
WRITE_BYTE( (uint8)m_iCurrentWaveIdx );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
|
|
|
|
|
ResetWaveStats();
|
|
|
|
|
OnStatsChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::RoundEvent_WaveStart()
|
|
|
|
|
{
|
|
|
|
|
// Starting a new wave
|
|
|
|
|
// Report the previous successful wave.
|
|
|
|
|
if ( m_iCurrentWaveIdx > 0 && m_currentWaveStats.nAttempts == 0)
|
|
|
|
|
{
|
|
|
|
|
SW_ReportWaveSummary( m_iCurrentWaveIdx - 1, true );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// reset stats
|
|
|
|
|
ResetWaveStats();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::RoundEvent_WaveEnd( bool bSuccess )
|
|
|
|
|
{
|
|
|
|
|
// if failed, report immediately,
|
|
|
|
|
// report successes on starting the next wave because of currency picked up late
|
|
|
|
|
ConVar *sv_cheats = g_pCVar->FindVar( "sv_cheats" );
|
|
|
|
|
if ( !bSuccess && ( !sv_cheats || !sv_cheats->GetBool() ) )
|
|
|
|
|
{
|
|
|
|
|
m_currentWaveStats.nAttempts++;
|
|
|
|
|
SW_ReportWaveSummary( m_iCurrentWaveIdx, false );
|
|
|
|
|
ResetWaveStats();
|
|
|
|
|
OnStatsChanged();
|
|
|
|
|
|
|
|
|
|
CBroadcastRecipientFilter filter;
|
|
|
|
|
filter.MakeReliable();
|
|
|
|
|
UserMessageBegin( filter, "MVMWaveFailed" );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Send a User message to Clients to send there data
|
|
|
|
|
// Tell each client their damage
|
|
|
|
|
CUtlVector< CTFPlayer * > playerVector;
|
|
|
|
|
CollectPlayers( &playerVector, TF_TEAM_PVE_DEFENDERS );
|
|
|
|
|
for( int i=0; i<playerVector.Count(); ++i )
|
|
|
|
|
{
|
|
|
|
|
CTFPlayer *player = playerVector[i];
|
|
|
|
|
CMannVsMachinePlayerStats stats = m_playerStats[player->entindex()];
|
|
|
|
|
|
|
|
|
|
CSingleUserRecipientFilter filter( player );
|
|
|
|
|
filter.MakeReliable();
|
|
|
|
|
|
|
|
|
|
// ServerWaveID(2), deaths(1), damageBot(4), damageGiant(4), damageTank(4)
|
|
|
|
|
UserMessageBegin( filter, "MVMWaveChange" );
|
|
|
|
|
WRITE_WORD( (uint16)m_iServerWaveID );
|
|
|
|
|
WRITE_BYTE( (uint8)stats.nDeaths );
|
|
|
|
|
WRITE_LONG( stats.nBotDamage );
|
|
|
|
|
WRITE_LONG( stats.nGiantDamage );
|
|
|
|
|
WRITE_LONG( stats.nTankDamage );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Increment the ServerId
|
|
|
|
|
m_iServerWaveID++;
|
|
|
|
|
Q_memset( m_playerStats, 0, sizeof( m_playerStats ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::RoundEvent_AcquiredCredits( uint32 idxWave, int nAmount, bool bIsBonus )
|
|
|
|
|
{
|
|
|
|
|
if ( idxWave == (int)m_iCurrentWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
if ( bIsBonus )
|
|
|
|
|
{
|
|
|
|
|
m_currentWaveStats.nCreditsBonus += nAmount;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_currentWaveStats.nCreditsAcquired += nAmount;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ( idxWave == m_iCurrentWaveIdx - 1 )
|
|
|
|
|
{
|
|
|
|
|
if ( bIsBonus )
|
|
|
|
|
{
|
|
|
|
|
m_previousWaveStats.nCreditsBonus += nAmount;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_previousWaveStats.nCreditsAcquired += nAmount;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OnStatsChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::RoundEvent_CreditsDropped( uint32 idxWave, int nAmount )
|
|
|
|
|
{
|
|
|
|
|
if ( idxWave == m_iCurrentWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
m_currentWaveStats.nCreditsDropped += nAmount;
|
|
|
|
|
}
|
|
|
|
|
else if ( idxWave == m_iCurrentWaveIdx - 1 )
|
|
|
|
|
{
|
|
|
|
|
m_previousWaveStats.nCreditsDropped += nAmount;
|
|
|
|
|
}
|
|
|
|
|
OnStatsChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::PlayerEvent_PointsChanged( CTFPlayer *pTFPlayer, int nPoints )
|
|
|
|
|
{
|
|
|
|
|
//
|
|
|
|
|
// Deprecated
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
//if ( pTFPlayer->IsBot() || !TFGameRules() || !TFGameRules()->IsPVEModeActive() )
|
|
|
|
|
// return;
|
|
|
|
|
|
|
|
|
|
//OnStatsChanged();
|
|
|
|
|
//NotifyPlayerEvent( pTFPlayer, m_iCurrentWaveIdx, kMVMEvent_Player_Points, nPoints );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::PlayerEvent_Died( CTFPlayer *pTFPlayer )
|
|
|
|
|
{
|
|
|
|
|
if ( pTFPlayer->IsBot() || !TFGameRules() || !TFGameRules()->IsPVEModeActive() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_playerStats[pTFPlayer->entindex()].nDeaths += 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::PlayerEvent_Upgraded( CTFPlayer *pTFPlayer, uint16 nItemDef, uint16 nAttributeDef, uint8 nQuality, int16 nCost, bool bIsBottle )
|
|
|
|
|
{
|
|
|
|
|
if ( pTFPlayer->IsBot() || !TFGameRules() || !TFGameRules()->IsPVEModeActive() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
OnStatsChanged();
|
|
|
|
|
|
|
|
|
|
CBroadcastRecipientFilter filter;
|
|
|
|
|
filter.MakeReliable();
|
|
|
|
|
|
|
|
|
|
// PlayerIdx(1), WaveIdx(1), ItemDef(2), AttributeDef(2), Quality(1), cost(2)
|
|
|
|
|
// send user message
|
|
|
|
|
UserMessageBegin( filter, "MVMPlayerUpgradedEvent" );
|
|
|
|
|
WRITE_BYTE( (uint8)pTFPlayer->entindex() );
|
|
|
|
|
WRITE_BYTE( (uint8)m_iCurrentWaveIdx );
|
|
|
|
|
WRITE_WORD( nItemDef );
|
|
|
|
|
WRITE_WORD( nAttributeDef );
|
|
|
|
|
WRITE_BYTE( nQuality);
|
|
|
|
|
WRITE_WORD( nCost );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
|
|
|
|
|
if ( bIsBottle )
|
|
|
|
|
{
|
|
|
|
|
NotifyTargetPlayerEvent( pTFPlayer, m_iCurrentWaveIdx, kMVMEvent_Player_BoughtBottle, nCost );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
NotifyTargetPlayerEvent( pTFPlayer, m_iCurrentWaveIdx, kMVMEvent_Player_BoughtUpgrade, nCost );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::PlayerEvent_PickedUpCredits( CTFPlayer *pTFPlayer, uint32 idxWave, int nCreditsAmount )
|
|
|
|
|
{
|
|
|
|
|
if ( pTFPlayer->IsBot() || !TFGameRules() || !TFGameRules()->IsPVEModeActive() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
OnStatsChanged();
|
|
|
|
|
NotifyPlayerEvent( pTFPlayer, idxWave, kMVMEvent_Player_PickedUpCredits, nCreditsAmount );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::PlayerEvent_BoughtInstantRespawn( CTFPlayer *pTFPlayer, int nCost )
|
|
|
|
|
{
|
|
|
|
|
if ( pTFPlayer->IsBot() || !TFGameRules() || !TFGameRules()->IsPVEModeActive() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_currentWaveStats.nBuyBacks++;
|
|
|
|
|
OnStatsChanged();
|
|
|
|
|
|
|
|
|
|
NotifyTargetPlayerEvent( pTFPlayer, m_iCurrentWaveIdx, kMVMEvent_Player_BoughtInstantRespawn, nCost );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::PlayerEvent_DealtDamageToBots( CTFPlayer *pTFPlayer, int damage )
|
|
|
|
|
{
|
|
|
|
|
if ( pTFPlayer->IsBot() || !TFGameRules() || !TFGameRules()->IsPVEModeActive() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_playerStats[pTFPlayer->entindex()].nBotDamage += damage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::PlayerEvent_DealtDamageToGiants( CTFPlayer *pTFPlayer, int damage )
|
|
|
|
|
{
|
|
|
|
|
if ( pTFPlayer->IsBot() || !TFGameRules() || !TFGameRules()->IsPVEModeActive() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_playerStats[pTFPlayer->entindex()].nGiantDamage += damage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::PlayerEvent_DealtDamageToTanks( CTFPlayer *pTFPlayer, int damage )
|
|
|
|
|
{
|
|
|
|
|
if ( pTFPlayer->IsBot() || !TFGameRules() || !TFGameRules()->IsPVEModeActive() )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_playerStats[pTFPlayer->entindex()].nTankDamage += damage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::NotifyPlayerEvent( CTFPlayer *pTFPlayer, uint32 idxWave, eMannVsMachineEvent eType, int nValue, int nParam )
|
|
|
|
|
{
|
|
|
|
|
// Deprecated
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::NotifyTargetPlayerEvent( CTFPlayer *pTFPlayer, uint32 idxWave, eMannVsMachineEvent eType, int nCost )
|
|
|
|
|
{
|
|
|
|
|
CBroadcastRecipientFilter filter;
|
|
|
|
|
filter.MakeReliable();
|
|
|
|
|
|
|
|
|
|
// Client
|
|
|
|
|
UserMessageBegin( filter, "MVMLocalPlayerWaveSpendingValue" );
|
|
|
|
|
uint64 id = pTFPlayer->GetSteamIDAsUInt64();
|
|
|
|
|
|
|
|
|
|
WRITE_BITS( &id, 64 );
|
|
|
|
|
WRITE_BYTE( (uint8)idxWave );
|
|
|
|
|
WRITE_BYTE( (uint8)eType );
|
|
|
|
|
WRITE_WORD( (uint16)nCost );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
|
|
|
|
|
// Server
|
|
|
|
|
uint64 steamID = pTFPlayer->GetSteamIDAsUInt64();
|
|
|
|
|
CPlayerWaveSpendingStats *pPlayerStats = g_pMVMStats->GetSpending( idxWave, steamID );
|
|
|
|
|
if ( !pPlayerStats )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
switch ( eType )
|
|
|
|
|
{
|
|
|
|
|
case kMVMEvent_Player_BoughtInstantRespawn:
|
|
|
|
|
// Don't track refunds (permanent cost)
|
|
|
|
|
pPlayerStats->nCreditsSpentOnBuyBacks += nCost;
|
|
|
|
|
break;
|
|
|
|
|
case kMVMEvent_Player_BoughtBottle:
|
|
|
|
|
// Don't track refunds (permanent cost)
|
|
|
|
|
pPlayerStats->nCreditsSpentOnBottles += nCost;
|
|
|
|
|
break;
|
|
|
|
|
case kMVMEvent_Player_BoughtUpgrade:
|
|
|
|
|
pPlayerStats->nCreditsSpentOnUpgrades += nCost;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Tell the Player What Upgrades they have
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::SendUpgradesToPlayer( CTFPlayer *pTFPlayer, CUtlVector< CUpgradeInfo > *upgrades )
|
|
|
|
|
{
|
|
|
|
|
CRecipientFilter filter;
|
|
|
|
|
filter.AddRecipient( pTFPlayer );
|
|
|
|
|
|
|
|
|
|
if ( upgrades == NULL )
|
|
|
|
|
{
|
|
|
|
|
UserMessageBegin( filter, "MVMLocalPlayerUpgradesClear" );
|
|
|
|
|
WRITE_BYTE( 0 );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Send the reset command
|
|
|
|
|
UserMessageBegin( filter, "MVMLocalPlayerUpgradesClear" );
|
|
|
|
|
WRITE_BYTE( 0 );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
|
|
|
|
|
// send all the upgrades
|
|
|
|
|
// Class(1), ItemDef(2), Upgrade(1), cost(2)
|
|
|
|
|
for ( int i = 0; i < upgrades->Count(); ++i )
|
|
|
|
|
{
|
|
|
|
|
UserMessageBegin( filter, "MVMLocalPlayerUpgradesValue" );
|
|
|
|
|
WRITE_BYTE( (uint8)upgrades->Element(i).m_iPlayerClass );
|
|
|
|
|
WRITE_WORD( (uint16)upgrades->Element(i).m_itemDefIndex );
|
|
|
|
|
WRITE_BYTE( (uint8)upgrades->Element(i).m_upgrade );
|
|
|
|
|
WRITE_WORD( (uint16)upgrades->Element(i).m_nCost );
|
|
|
|
|
MessageEnd();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//=============================================================================//
|
|
|
|
|
void CMannVsMachineStats::NotifyPlayerActiveUpgradeCosts( CTFPlayer *pTFPlayer, int nSpending )
|
|
|
|
|
{
|
|
|
|
|
NotifyTargetPlayerEvent( pTFPlayer, 0, kMVMEvent_Player_ActiveUpgrades, nSpending );
|
|
|
|
|
}
|
|
|
|
|
#endif // GAME_DLL
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Clear The Player spending stats for this wave
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::ClearCurrentPlayerWaveSpendingStats( int idxWave )
|
|
|
|
|
{
|
|
|
|
|
// If the wave is different then the current, we're changing waves and need to save this stuff off if we're advancing
|
|
|
|
|
|
|
|
|
|
if ( idxWave != (int)m_iCurrentWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
// if wave incremented, we changed waves to save off the previous wave data
|
|
|
|
|
m_prevWaveSpendingStats.RemoveAll();
|
|
|
|
|
|
|
|
|
|
FOR_EACH_MAP_FAST( m_currWaveSpendingStats, i )
|
|
|
|
|
{
|
|
|
|
|
// Save off current wave in to previous
|
|
|
|
|
int iWave = m_prevWaveSpendingStats.Insert(m_currWaveSpendingStats.Key(i), CPlayerWaveSpendingStats() );
|
|
|
|
|
m_prevWaveSpendingStats[iWave] = m_currWaveSpendingStats[i];
|
|
|
|
|
|
|
|
|
|
// Append current wave in to all prev
|
|
|
|
|
int allIndex = m_allPrevWaveSpendingStats.Find( m_currWaveSpendingStats.Key(i) );
|
|
|
|
|
if ( allIndex != m_allPrevWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
m_allPrevWaveSpendingStats[allIndex] += m_currWaveSpendingStats[i];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
allIndex = m_allPrevWaveSpendingStats.Insert( m_currWaveSpendingStats.Key(i), CPlayerWaveSpendingStats() );
|
|
|
|
|
m_allPrevWaveSpendingStats[allIndex] = m_currWaveSpendingStats[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Purge away current stats
|
|
|
|
|
m_currWaveSpendingStats.RemoveAll();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
CPlayerWaveSpendingStats *CMannVsMachineStats::GetSpending( int iWaveIndex, uint64 steamId )
|
|
|
|
|
{
|
|
|
|
|
if ( iWaveIndex == (int)m_iCurrentWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
int iWave = m_currWaveSpendingStats.Find( steamId );
|
|
|
|
|
if ( iWave != m_currWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
return &m_currWaveSpendingStats[iWave];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
iWave = m_currWaveSpendingStats.Insert( steamId, CPlayerWaveSpendingStats() );
|
|
|
|
|
return &m_currWaveSpendingStats[iWave];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ( iWaveIndex == -1 )
|
|
|
|
|
{
|
|
|
|
|
int iWave = m_allPrevWaveSpendingStats.Find( steamId );
|
|
|
|
|
if ( iWave != m_allPrevWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
return &m_allPrevWaveSpendingStats[iWave];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
iWave = m_allPrevWaveSpendingStats.Insert( steamId, CPlayerWaveSpendingStats() );
|
|
|
|
|
return &m_allPrevWaveSpendingStats[iWave];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ( iWaveIndex == (int)(m_iCurrentWaveIdx - 1) )
|
|
|
|
|
{
|
|
|
|
|
int iWave = m_prevWaveSpendingStats.Find( steamId );
|
|
|
|
|
if ( iWave != m_prevWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
return &m_prevWaveSpendingStats[iWave];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
iWave = m_prevWaveSpendingStats.Insert( steamId, CPlayerWaveSpendingStats() );
|
|
|
|
|
return &m_prevWaveSpendingStats[iWave];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
int CMannVsMachineStats::GetUpgradeSpending( CTFPlayer *pTFPlayer /*= NULL*/ )
|
|
|
|
|
{
|
|
|
|
|
int spending = 0;
|
|
|
|
|
|
|
|
|
|
CSteamID steamID;
|
|
|
|
|
if ( pTFPlayer && pTFPlayer->GetSteamID( &steamID ) )
|
|
|
|
|
{
|
|
|
|
|
int iWave = m_currWaveSpendingStats.Find( steamID.ConvertToUint64() );
|
|
|
|
|
if ( iWave != m_currWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
spending += m_currWaveSpendingStats[iWave].nCreditsSpentOnUpgrades;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iWave = m_allPrevWaveSpendingStats.Find( steamID.ConvertToUint64() );
|
|
|
|
|
if ( iWave != m_allPrevWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
spending += m_allPrevWaveSpendingStats[iWave].nCreditsSpentOnUpgrades;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FOR_EACH_MAP_FAST ( m_currWaveSpendingStats, iPlayer )
|
|
|
|
|
{
|
|
|
|
|
CBasePlayer * pPlayer = GetPlayerBySteamID( CSteamID( m_currWaveSpendingStats.Key( iPlayer ) ) );
|
|
|
|
|
if ( pPlayer )
|
|
|
|
|
{
|
|
|
|
|
spending += m_currWaveSpendingStats[iPlayer].nCreditsSpentOnUpgrades;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FOR_EACH_MAP_FAST ( m_allPrevWaveSpendingStats, iPlayer )
|
|
|
|
|
{
|
|
|
|
|
CBasePlayer * pPlayer = GetPlayerBySteamID( CSteamID( m_allPrevWaveSpendingStats.Key( iPlayer ) ) );
|
|
|
|
|
if ( pPlayer )
|
|
|
|
|
{
|
|
|
|
|
spending += m_allPrevWaveSpendingStats[iPlayer].nCreditsSpentOnUpgrades;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return spending;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
int CMannVsMachineStats::GetBottleSpending( CTFPlayer *pTFPlayer /*= NULL*/ )
|
|
|
|
|
{
|
|
|
|
|
int spending = 0;
|
|
|
|
|
|
|
|
|
|
CSteamID steamID;
|
|
|
|
|
if ( pTFPlayer && pTFPlayer->GetSteamID( &steamID ) )
|
|
|
|
|
{
|
|
|
|
|
int iWave = m_currWaveSpendingStats.Find( steamID.ConvertToUint64() );
|
|
|
|
|
if ( iWave != m_currWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
spending += m_currWaveSpendingStats[iWave].nCreditsSpentOnBottles;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iWave = m_allPrevWaveSpendingStats.Find( steamID.ConvertToUint64() );
|
|
|
|
|
if ( iWave != m_allPrevWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
spending += m_allPrevWaveSpendingStats[iWave].nCreditsSpentOnBottles;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FOR_EACH_MAP_FAST ( m_currWaveSpendingStats, iPlayer )
|
|
|
|
|
{
|
|
|
|
|
CBasePlayer * pPlayer = GetPlayerBySteamID( CSteamID( m_currWaveSpendingStats.Key( iPlayer ) ) );
|
|
|
|
|
if ( pPlayer )
|
|
|
|
|
{
|
|
|
|
|
spending += m_currWaveSpendingStats[iPlayer].nCreditsSpentOnBottles;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FOR_EACH_MAP_FAST ( m_allPrevWaveSpendingStats, iPlayer )
|
|
|
|
|
{
|
|
|
|
|
CBasePlayer * pPlayer = GetPlayerBySteamID( CSteamID( m_allPrevWaveSpendingStats.Key( iPlayer ) ) );
|
|
|
|
|
if ( pPlayer )
|
|
|
|
|
{
|
|
|
|
|
spending += m_allPrevWaveSpendingStats[iPlayer].nCreditsSpentOnBottles;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return spending;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
int CMannVsMachineStats::GetBuyBackSpending( CTFPlayer *pTFPlayer /*= NULL*/ )
|
|
|
|
|
{
|
|
|
|
|
int spending = 0;
|
|
|
|
|
|
|
|
|
|
CSteamID steamID;
|
|
|
|
|
if ( pTFPlayer && pTFPlayer->GetSteamID( &steamID ) )
|
|
|
|
|
{
|
|
|
|
|
int iWave = m_currWaveSpendingStats.Find( steamID.ConvertToUint64() );
|
|
|
|
|
if ( iWave != m_currWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
spending += m_currWaveSpendingStats[iWave].nCreditsSpentOnBuyBacks;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iWave = m_allPrevWaveSpendingStats.Find( steamID.ConvertToUint64() );
|
|
|
|
|
if ( iWave != m_allPrevWaveSpendingStats.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
spending += m_allPrevWaveSpendingStats[iWave].nCreditsSpentOnBuyBacks;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FOR_EACH_MAP_FAST ( m_currWaveSpendingStats, iPlayer )
|
|
|
|
|
{
|
|
|
|
|
CBasePlayer * pPlayer = GetPlayerBySteamID( CSteamID( m_currWaveSpendingStats.Key( iPlayer ) ) );
|
|
|
|
|
if ( pPlayer )
|
|
|
|
|
{
|
|
|
|
|
spending += m_currWaveSpendingStats[iPlayer].nCreditsSpentOnBuyBacks;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FOR_EACH_MAP_FAST ( m_allPrevWaveSpendingStats, iPlayer )
|
|
|
|
|
{
|
|
|
|
|
CBasePlayer * pPlayer = GetPlayerBySteamID( CSteamID( m_allPrevWaveSpendingStats.Key( iPlayer ) ) );
|
|
|
|
|
if ( pPlayer )
|
|
|
|
|
{
|
|
|
|
|
spending += m_allPrevWaveSpendingStats[iPlayer].nCreditsSpentOnBuyBacks;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return spending;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//=============================================================================//
|
|
|
|
|
#ifdef CLIENT_DLL
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose:
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::OnDataChanged( DataUpdateType_t updateType )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Clear Local Player Upgrades
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
CPlayerWaveSpendingStats *CMannVsMachineStats::GetLocalSpending ( int iWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
CSteamID steamId;
|
|
|
|
|
if ( C_TFPlayer::GetLocalTFPlayer()->GetSteamID( &steamId ) )
|
|
|
|
|
{
|
|
|
|
|
return GetSpending( iWaveIdx, steamId.ConvertToUint64() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Set the active upgrade costs for this player
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::SetPlayerActiveUpgradeCosts( uint64 steamId, int nSpending )
|
|
|
|
|
{
|
|
|
|
|
int iUpgrade = m_teamActiveUpgrades.Find(steamId);
|
|
|
|
|
if ( iUpgrade != m_teamActiveUpgrades.InvalidIndex() )
|
|
|
|
|
{
|
|
|
|
|
m_teamActiveUpgrades[iUpgrade] = nSpending;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_teamActiveUpgrades.Insert( steamId, nSpending );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Get Player Active Upgrade Costs
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
int CMannVsMachineStats::GetPlayerActiveUpgradeCosts( uint64 steamId64 )
|
|
|
|
|
{
|
|
|
|
|
// 0, give team total
|
|
|
|
|
if ( steamId64 == 0 )
|
|
|
|
|
{
|
|
|
|
|
int nSpending = 0;
|
|
|
|
|
FOR_EACH_MAP_FAST ( m_teamActiveUpgrades, i )
|
|
|
|
|
{
|
|
|
|
|
CSteamID steamId( m_teamActiveUpgrades.Key( i ) );
|
|
|
|
|
CBasePlayer * pPlayer = GetPlayerBySteamID( steamId );
|
|
|
|
|
if ( pPlayer )
|
|
|
|
|
{
|
|
|
|
|
nSpending += m_teamActiveUpgrades[ i ];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nSpending;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
CSteamID steamId( steamId64 );
|
|
|
|
|
CBasePlayer * pPlayer = GetPlayerBySteamID( steamId );
|
|
|
|
|
if ( pPlayer )
|
|
|
|
|
{
|
|
|
|
|
int iUpgrade = m_teamActiveUpgrades.Find( steamId64 );
|
|
|
|
|
if ( iUpgrade != m_teamActiveUpgrades.InvalidIndex() )
|
|
|
|
|
return m_teamActiveUpgrades[iUpgrade];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Clear Local Player Upgrades
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::ClearLocalPlayerUpgrades ()
|
|
|
|
|
{
|
|
|
|
|
m_vecLocalPlayerUpgrades.Purge();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Add Local Player Upgrade
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::AddLocalPlayerUpgrade ( int iPlayerClass, item_definition_index_t iItemDef )
|
|
|
|
|
{
|
|
|
|
|
CUpgradeInfo upgrade;
|
|
|
|
|
upgrade.m_iPlayerClass = iPlayerClass;
|
|
|
|
|
upgrade.m_itemDefIndex = iItemDef;
|
|
|
|
|
upgrade.m_upgrade = 0;
|
|
|
|
|
upgrade.m_nCost = 0;
|
|
|
|
|
|
|
|
|
|
m_vecLocalPlayerUpgrades.AddToTail( upgrade );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
int CMannVsMachineStats::GetLocalPlayerUpgradeSpending( int idxWave )
|
|
|
|
|
{
|
|
|
|
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
|
|
|
|
|
if ( pPlayer == NULL )
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
CPlayerWaveSpendingStats *pStats = GetLocalSpending( idxWave );
|
|
|
|
|
return pStats ? pStats->nCreditsSpentOnUpgrades : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
int CMannVsMachineStats::GetLocalPlayerBottleSpending( int idxWave )
|
|
|
|
|
{
|
|
|
|
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
|
|
|
|
|
if ( pPlayer == NULL )
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
CPlayerWaveSpendingStats *pStats = GetLocalSpending( idxWave );
|
|
|
|
|
return pStats ? pStats->nCreditsSpentOnBottles : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
int CMannVsMachineStats::GetLocalPlayerBuyBackSpending ( int idxWave )
|
|
|
|
|
{
|
|
|
|
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
|
|
|
|
|
if ( pPlayer == NULL )
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
CPlayerWaveSpendingStats *pStats = GetLocalSpending( idxWave );
|
|
|
|
|
return pStats ? pStats->nCreditsSpentOnBuyBacks : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Submits the use of MvM Credits
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::SW_ReportClientUpgradePurchase( uint8 waveIdx, uint16 nItemDef, uint16 nAttributeDef, uint8 nQuality, int16 nCost )
|
|
|
|
|
{
|
|
|
|
|
// Disabled due to bad key indexing.
|
|
|
|
|
// Make a V2 if this data is wanted
|
|
|
|
|
|
|
|
|
|
// Old Table
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// OGS TF2ClientMvMWaveCreditSpend: MvM mode - credit spend
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
//START_TABLE( k_ESchemaCatalogOGS, TF2ClientMvMWaveCreditSpend, TABLE_PROP_NORMAL )
|
|
|
|
|
//INT_FIELD( nID, ID, int32 ) // Auto-increment fake key
|
|
|
|
|
//INT_FIELD( llSessionID, SessionID, uint64 )
|
|
|
|
|
//INT_FIELD( llServerSessionID, ServerSessionID, uint64 ) // Duplicated data from Session table due to game client anomalies
|
|
|
|
|
//INT_FIELD( nServerWaveID, ServerWaveID, int32 ) // Incrementing WaveId PerAttempt
|
|
|
|
|
//INT_FIELD( ulAccountID, AccountID, uint64 ) // Duplicated data from Session table due to game client anomalies
|
|
|
|
|
//INT_FIELD( nWaveNumber, WaveNumber, uint8 )
|
|
|
|
|
//INT_FIELD( nItemCategoryID, MvMItemCategoryID, int16 ) // References TF2MvMItemCategoryReference
|
|
|
|
|
//INT_FIELD( nItemNameID, MvMItemNameID, int32 ) // References TF2MvMItemNameReference
|
|
|
|
|
//INT_FIELD( nItemCost, ItemCost, int32 )
|
|
|
|
|
//INT_FIELD( RTime32EventTime, EventTime, RTime32 )
|
|
|
|
|
//PRIMARY_KEY_CLUSTERED( 100, nID )
|
|
|
|
|
//WIPE_TABLE_BETWEEN_TESTS( k_EWipePolicyWipeForAllTests )
|
|
|
|
|
//AUTOINCREMENT_FIELD( nID )
|
|
|
|
|
//PARTITION_INTERVAL( k_EPartitionIntervalDaily )
|
|
|
|
|
//OWNING_APPLICATION( 440 )
|
|
|
|
|
//END_TABLE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#if !defined(NO_STEAM)
|
|
|
|
|
// ConVar *sv_cheats = g_pCVar->FindVar( "sv_cheats" );
|
|
|
|
|
// if ( sv_cheats && sv_cheats->GetBool() )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// C_TFPlayer *pTFPlayer = C_TFPlayer::GetLocalTFPlayer();
|
|
|
|
|
// if ( !pTFPlayer )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// // Get Data needed for this report
|
|
|
|
|
// const CEconItemAttributeDefinition *pAttributeDef = ItemSystem()->GetItemSchema()->GetAttributeDefinition( nAttributeDef );
|
|
|
|
|
// if ( !pAttributeDef )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// float flValue = 1.0f;
|
|
|
|
|
// if ( !MannVsMachine_GetUpgradeInfo( pAttributeDef->GetDefinitionIndex(), nQuality, flValue ) )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// CSteamID steamIDForPlayer;
|
|
|
|
|
// if ( !pTFPlayer->GetSteamID( &steamIDForPlayer ) )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// KeyValuesAD pKeyValues( "data" );
|
|
|
|
|
//
|
|
|
|
|
// // Create and Send the report
|
|
|
|
|
// //SessionId, ServerSessionId, AccountID, ServerWaveID, WaveNumber, MvMItemCategoryID, MvMItemNameID, ItemCost, EventTime
|
|
|
|
|
// KeyValues* pKVData = new KeyValues( "TF2ClientMvMWaveCreditSpend" );
|
|
|
|
|
// pKVData->SetInt( "ID", ++m_nEventID );
|
|
|
|
|
//
|
|
|
|
|
// // ServerSessionID - Auto
|
|
|
|
|
// // SessionID - Auto
|
|
|
|
|
//
|
|
|
|
|
// // AccountID
|
|
|
|
|
// pKVData->SetUint64( "AccountID", steamIDForPlayer.ConvertToUint64() );
|
|
|
|
|
//
|
|
|
|
|
// //ServerWaveID - Use provided ID not m_iServerWaveID as that may have changed
|
|
|
|
|
// pKVData->SetInt( "ServerWaveID", m_iServerWaveID );
|
|
|
|
|
//
|
|
|
|
|
// // WaveNumber
|
|
|
|
|
// pKVData->SetInt( "WaveNumber", waveIdx + 1 );
|
|
|
|
|
//
|
|
|
|
|
// // MvMItemNameID
|
|
|
|
|
// if ( nItemDef )
|
|
|
|
|
// {
|
|
|
|
|
// const CEconItemDefinition *pItemDef = ItemSystem()->GetItemSchema()->GetItemDefinition( nItemDef );
|
|
|
|
|
// pKVData->SetString( "MvMItemNameID", pItemDef->GetDefinitionName() );
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// {
|
|
|
|
|
// pKVData->SetString( "MvMItemNameID", g_aPlayerClassNames_NonLocalized[ pTFPlayer->GetPlayerClass()->GetClassIndex() ] );
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// // MvMItemCategoryID
|
|
|
|
|
// pKVData->SetString( "MvMItemCategoryID", pAttributeDef->GetDefinitionName() );
|
|
|
|
|
//
|
|
|
|
|
// // ItemCost
|
|
|
|
|
// pKVData->SetInt( "ItemCost", nCost );
|
|
|
|
|
//
|
|
|
|
|
// // EventTime
|
|
|
|
|
// pKVData->SetInt( "EventTime", GetSteamWorksSGameStatsUploader().GetTimeSinceEpoch() );
|
|
|
|
|
//
|
|
|
|
|
// // Send to DB
|
|
|
|
|
// GetSteamWorksSGameStatsUploader().AddStatsForUpload( pKVData );
|
|
|
|
|
//
|
|
|
|
|
//#endif // !defined(NO_STEAM)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Submits the use of MvM Credits
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::SW_ReportClientBuyBackPurchase ( uint8 waveIdx, uint16 nCost )
|
|
|
|
|
{
|
|
|
|
|
//#if !defined(NO_STEAM)
|
|
|
|
|
// ConVar *sv_cheats = g_pCVar->FindVar( "sv_cheats" );
|
|
|
|
|
// if ( sv_cheats && sv_cheats->GetBool() )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// C_TFPlayer *pTFPlayer = C_TFPlayer::GetLocalTFPlayer();
|
|
|
|
|
// if ( !pTFPlayer )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// CSteamID steamIDForPlayer;
|
|
|
|
|
// if ( !pTFPlayer->GetSteamID( &steamIDForPlayer ) )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// // Create and Send the report
|
|
|
|
|
// //SessionId, ServerSessionId, AccountID, ServerWaveID, WaveNumber, MvMItemCategoryID, MvMItemNameID, ItemCost, EventTime
|
|
|
|
|
// KeyValues* pKVData = new KeyValues( "TF2ClientMvMWaveCreditSpend" );
|
|
|
|
|
//
|
|
|
|
|
// // ID - Auto
|
|
|
|
|
// // ServerSessionID - Auto
|
|
|
|
|
// // SessionID - Auto
|
|
|
|
|
//
|
|
|
|
|
// // AccountID
|
|
|
|
|
// pKVData->SetUint64( "AccountID", steamIDForPlayer.ConvertToUint64() );
|
|
|
|
|
//
|
|
|
|
|
// //ServerWaveID - Use provided ID not m_iServerWaveID as that may have changed
|
|
|
|
|
// pKVData->SetInt( "ServerWaveID", m_iServerWaveID );
|
|
|
|
|
//
|
|
|
|
|
// // WaveNumber
|
|
|
|
|
// pKVData->SetInt( "WaveNumber", waveIdx + 1 );
|
|
|
|
|
//
|
|
|
|
|
// // MvMItemNameID
|
|
|
|
|
// static char szAnsi[64];
|
|
|
|
|
// g_pVGuiLocalize->ConvertUnicodeToANSI( g_pVGuiLocalize->Find( g_aPlayerClassNames[ pTFPlayer->GetPlayerClass()->GetClassIndex() ] ), szAnsi, sizeof(szAnsi) );
|
|
|
|
|
// pKVData->SetString( "MvMItemNameID", szAnsi );
|
|
|
|
|
//
|
|
|
|
|
// // MvMItemCategoryID
|
|
|
|
|
// pKVData->SetString( "MvMItemCategoryID", "BuyBack");
|
|
|
|
|
//
|
|
|
|
|
// // ItemCost
|
|
|
|
|
// pKVData->SetInt( "ItemCost", nCost );
|
|
|
|
|
//
|
|
|
|
|
// // EventTime
|
|
|
|
|
// pKVData->SetInt( "EventTime", GetSteamWorksSGameStatsUploader().GetTimeSinceEpoch() );
|
|
|
|
|
//
|
|
|
|
|
// // Send to DB
|
|
|
|
|
// GetSteamWorksSGameStatsUploader().AddStatsForUpload( pKVData );
|
|
|
|
|
//
|
|
|
|
|
//#endif // !defined(NO_STEAM)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Submits the use of MvM Credits
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::SW_ReportClientWaveSummary( uint16 waveID, CMannVsMachinePlayerStats stats )
|
|
|
|
|
{
|
|
|
|
|
// Disabled due to bad key indexing.
|
|
|
|
|
// Make a V2 if this data is wanted
|
|
|
|
|
// Old Table
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// OGS TF2ClientMvMWaveSummary: MvM mode <EFBFBD> Player wave summary information
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
//START_TABLE( k_ESchemaCatalogOGS, TF2ClientMvMWaveSummary, TABLE_PROP_NORMAL )
|
|
|
|
|
//INT_FIELD( nID, ID, int32 ) // Auto-increment fake key
|
|
|
|
|
//INT_FIELD( nServerWaveID, ServerWaveID, int32 ) // ID of ServerMvMWaveSummary Entry this is linked with, How do we get this?
|
|
|
|
|
//INT_FIELD( llSessionID, SessionID, uint64 )
|
|
|
|
|
//INT_FIELD( llServerSessionID, ServerSessionID, uint64 ) // Duplicated data from Session table due to game client anomalies
|
|
|
|
|
//INT_FIELD( ulAccountID, AccountID, uint64 ) // Duplicated data from Session table due to game client anomalies
|
|
|
|
|
//INT_FIELD( nDamageToBots, DamageToBots, int32 )
|
|
|
|
|
//INT_FIELD( nDamageToTanks, DamageToTanks, int32 )
|
|
|
|
|
//INT_FIELD( nDamageToGiants, DamageToGiants, int32 )
|
|
|
|
|
//INT_FIELD( nDeaths, Deaths, uint8 )
|
|
|
|
|
//INT_FIELD( nClass, Class, int64 ) // References TF2ClassReference
|
|
|
|
|
//INT_FIELD( nPrimaryWeapon, PrimaryWeapon, int32 ) // References TF2MvMItemNameReference
|
|
|
|
|
//INT_FIELD( nSecondaryWeapon, SecondaryWeapon, int32 ) // References TF2MvMItemNameReference
|
|
|
|
|
//INT_FIELD( nMeleeWeapon, MeleeWeapon, int32 ) // References TF2MvMItemNameReference
|
|
|
|
|
//INT_FIELD( bHasBottle, HasBottle, int8 )
|
|
|
|
|
//PRIMARY_KEY_CLUSTERED( 100, nID )
|
|
|
|
|
//WIPE_TABLE_BETWEEN_TESTS( k_EWipePolicyWipeForAllTests )
|
|
|
|
|
//AUTOINCREMENT_FIELD( nID )
|
|
|
|
|
//PARTITION_INTERVAL( k_EPartitionIntervalDaily )
|
|
|
|
|
//OWNING_APPLICATION( 440 )
|
|
|
|
|
//END_TABLE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#if !defined(NO_STEAM)
|
|
|
|
|
// ConVar *sv_cheats = g_pCVar->FindVar( "sv_cheats" );
|
|
|
|
|
// if ( sv_cheats && sv_cheats->GetBool() )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// C_TFPlayer *pTFPlayer = C_TFPlayer::GetLocalTFPlayer();
|
|
|
|
|
// if ( !pTFPlayer )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// CSteamID steamIDForPlayer;
|
|
|
|
|
// if ( !pTFPlayer->GetSteamID( &steamIDForPlayer ) )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// // Class
|
|
|
|
|
// int iClass = pTFPlayer->GetPlayerClass()->GetClassIndex();
|
|
|
|
|
//
|
|
|
|
|
// // Invalid Class, Spectators?
|
|
|
|
|
// if ( iClass < TF_FIRST_NORMAL_CLASS || iClass >= TF_LAST_NORMAL_CLASS )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// // Create and Send the report
|
|
|
|
|
// //[ID] ,[ServerWaveID] ,[SessionID] ,[AccountID] ,[DamageToBots] ,[DamageToTanks] ,[DamageToGiants]
|
|
|
|
|
// //,[Deaths] ,[Class] ,[PrimaryWeapon] ,[SecondaryWeapon] ,[MeleeWeapon] ,[HasBottle]
|
|
|
|
|
// KeyValues* pKVData = new KeyValues( "TF2ClientMvMWaveSummary" );
|
|
|
|
|
// pKVData->SetInt( "ID", ++m_nEventID );
|
|
|
|
|
//
|
|
|
|
|
// // ServerSessionID - Auto
|
|
|
|
|
// // SessionID - Auto
|
|
|
|
|
//
|
|
|
|
|
// // AccountID
|
|
|
|
|
// pKVData->SetUint64( "AccountID", steamIDForPlayer.ConvertToUint64() );
|
|
|
|
|
//
|
|
|
|
|
// //Damage
|
|
|
|
|
// pKVData->SetInt( "DamageToBots", stats.nBotDamage );
|
|
|
|
|
// pKVData->SetInt( "DamageToGiants", stats.nGiantDamage );
|
|
|
|
|
// pKVData->SetInt( "DamageToTanks", stats.nTankDamage );
|
|
|
|
|
//
|
|
|
|
|
// // Death
|
|
|
|
|
// pKVData->SetInt( "Deaths", stats.nDeaths );
|
|
|
|
|
//
|
|
|
|
|
// //ServerWaveID - Use provided ID not m_iServerWaveID as that may have changed
|
|
|
|
|
// pKVData->SetInt( "ServerWaveID", waveID );
|
|
|
|
|
//
|
|
|
|
|
// static char szAnsi[512];
|
|
|
|
|
// pKVData->SetString( "Class", g_aPlayerClassNames_NonLocalized[ iClass ] );
|
|
|
|
|
//
|
|
|
|
|
// // Primary
|
|
|
|
|
// CEconItemView *pPrimaryView = TFInventoryManager()->GetItemInLoadoutForClass( iClass, LOADOUT_POSITION_PRIMARY );
|
|
|
|
|
// const CEconItemDefinition *pPrimaryDef = pPrimaryView->GetItemDefinition();
|
|
|
|
|
//
|
|
|
|
|
// if ( pPrimaryDef )
|
|
|
|
|
// {
|
|
|
|
|
// g_pVGuiLocalize->ConvertUnicodeToANSI( g_pVGuiLocalize->Find ( pPrimaryDef->GetItemBaseName() ) , szAnsi, sizeof(szAnsi) );
|
|
|
|
|
// pKVData->SetString( "PrimaryWeapon", szAnsi );
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// // Secondary
|
|
|
|
|
// CEconItemView *pSecondaryView = TFInventoryManager()->GetItemInLoadoutForClass( iClass, LOADOUT_POSITION_SECONDARY );
|
|
|
|
|
// const CEconItemDefinition *pSecondaryDef = pSecondaryView->GetItemDefinition();
|
|
|
|
|
//
|
|
|
|
|
// if ( pSecondaryDef )
|
|
|
|
|
// {
|
|
|
|
|
// g_pVGuiLocalize->ConvertUnicodeToANSI( g_pVGuiLocalize->Find ( pSecondaryDef->GetItemBaseName() ) , szAnsi, sizeof(szAnsi) );
|
|
|
|
|
// pKVData->SetString( "SecondaryWeapon", szAnsi );
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// // Melee
|
|
|
|
|
// CEconItemView *pMeleeView = TFInventoryManager()->GetItemInLoadoutForClass( iClass, LOADOUT_POSITION_MELEE );
|
|
|
|
|
// const CEconItemDefinition *pMeleeDef = pMeleeView->GetItemDefinition();
|
|
|
|
|
//
|
|
|
|
|
// if ( pMeleeDef )
|
|
|
|
|
// {
|
|
|
|
|
// g_pVGuiLocalize->ConvertUnicodeToANSI( g_pVGuiLocalize->Find ( pMeleeDef->GetItemBaseName() ) , szAnsi, sizeof(szAnsi) );
|
|
|
|
|
// pKVData->SetString( "MeleeWeapon", szAnsi );
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// // Check for power up bottle
|
|
|
|
|
// CEconItemView *pActionView = TFInventoryManager()->GetItemInLoadoutForClass( iClass, LOADOUT_POSITION_ACTION );
|
|
|
|
|
// //489 is bottle - Power Up Canteen (MvM)
|
|
|
|
|
// pKVData->SetBool( "HasBottle", pActionView->GetItemDefIndex() == 489 );
|
|
|
|
|
//
|
|
|
|
|
// // Send to DB
|
|
|
|
|
// GetSteamWorksSGameStatsUploader().AddStatsForUpload( pKVData );
|
|
|
|
|
//
|
|
|
|
|
//#endif // !defined(NO_STEAM)
|
|
|
|
|
}
|
|
|
|
|
#endif // CLIENT_DLL
|
|
|
|
|
//=============================================================================//
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// PRIVATE
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Returns a copy of the WaveStats if legit
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
CMannVsMachineLocalWaveStats CMannVsMachineStats::GetWaveStats( int iWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
CMannVsMachineLocalWaveStats waveStats;
|
|
|
|
|
|
|
|
|
|
if ( iWaveIdx == (int)m_iCurrentWaveIdx )
|
|
|
|
|
{
|
|
|
|
|
waveStats = m_currentWaveStats;
|
|
|
|
|
}
|
|
|
|
|
else if ( iWaveIdx >= 0 && iWaveIdx == (int)m_iCurrentWaveIdx - 1 )
|
|
|
|
|
{
|
|
|
|
|
waveStats = m_previousWaveStats;
|
|
|
|
|
}
|
|
|
|
|
else if ( iWaveIdx == -1 )
|
|
|
|
|
{
|
|
|
|
|
waveStats = m_runningTotalWaveStats;
|
|
|
|
|
waveStats += m_previousWaveStats;
|
|
|
|
|
waveStats += m_currentWaveStats;
|
|
|
|
|
}
|
|
|
|
|
return waveStats;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Advances Event time for the next set of events
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::OnStatsChanged()
|
|
|
|
|
{
|
|
|
|
|
NetworkStateChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef GAME_DLL
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Reset the tracked wave stats
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::ResetWaveStats()
|
|
|
|
|
{
|
|
|
|
|
m_currentWaveStats.ClearStats();
|
|
|
|
|
m_nRespecsAwardedInWave = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Purpose: Submits the WaveSummary Data to OGS
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
void CMannVsMachineStats::SW_ReportWaveSummary ( int waveIdx, bool bIsSuccess )
|
|
|
|
|
{
|
|
|
|
|
// Disabled due to bad key indexing.
|
|
|
|
|
// Make a V2 if this data is wanted
|
|
|
|
|
//#if !defined(NO_STEAM)
|
|
|
|
|
// ConVar *sv_cheats = g_pCVar->FindVar( "sv_cheats" );
|
|
|
|
|
// if ( sv_cheats && sv_cheats->GetBool() )
|
|
|
|
|
// return;
|
|
|
|
|
//
|
|
|
|
|
// CMannVsMachineWaveStats stats;
|
|
|
|
|
// if ( waveIdx == (int)m_iCurrentWaveIdx )
|
|
|
|
|
// {
|
|
|
|
|
// stats = m_currentWaveStats;
|
|
|
|
|
// }
|
|
|
|
|
// else if ( waveIdx == (int)m_iCurrentWaveIdx - 1)
|
|
|
|
|
// {
|
|
|
|
|
// stats = m_previousWaveStats;
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// {
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// KeyValues* pKVData = new KeyValues( "TF2ServerMvMWaveSummary" );
|
|
|
|
|
//
|
|
|
|
|
// // ServerSessionID - Auto
|
|
|
|
|
// pKVData->SetUint64( "ServerSessionID", GetSteamWorksSGameStatsUploader().GetSessionID());
|
|
|
|
|
// pKVData->SetInt( "ID", ++m_nEventID );
|
|
|
|
|
// //ServerWaveID, if we won this wave, use the previous WaveID
|
|
|
|
|
// int iServerWaveID = m_iServerWaveID;
|
|
|
|
|
// if ( bIsSuccess )
|
|
|
|
|
// {
|
|
|
|
|
// iServerWaveID--;
|
|
|
|
|
// }
|
|
|
|
|
// pKVData->SetInt( "ServerWaveID", iServerWaveID );
|
|
|
|
|
//
|
|
|
|
|
// // WaveNumber
|
|
|
|
|
// pKVData->SetInt( "WaveNumber", waveIdx + 1 );
|
|
|
|
|
//
|
|
|
|
|
// // PopulationFileID
|
|
|
|
|
// pKVData->SetString( "PopulationFileID", m_pPopFileName );
|
|
|
|
|
//
|
|
|
|
|
// //// MoneyCollected
|
|
|
|
|
// pKVData->SetInt( "MoneyCollected", stats.nCreditsAcquired );
|
|
|
|
|
// //
|
|
|
|
|
// //// MoneyMissed
|
|
|
|
|
// pKVData->SetInt( "MoneyMissed", stats.nCreditsDropped - stats.nCreditsAcquired );
|
|
|
|
|
// //
|
|
|
|
|
// //// Attempts
|
|
|
|
|
// pKVData->SetInt( "Attempts", stats.nAttempts );
|
|
|
|
|
//
|
|
|
|
|
// // IsSuccess
|
|
|
|
|
// pKVData->SetBool( "IsSuccess", bIsSuccess );
|
|
|
|
|
//
|
|
|
|
|
// // IsSuccess
|
|
|
|
|
// bool bMannUp = false;
|
|
|
|
|
// bool bInLobby = false;
|
|
|
|
|
// CTFLobby *pLobby = GTFGCClientSystem()->GetLobby();
|
|
|
|
|
// if ( pLobby )
|
|
|
|
|
// {
|
|
|
|
|
// bInLobby = true;
|
|
|
|
|
// bMannUp = IsMannUpGroup( pLobby->GetMatchGroup() );
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// pKVData->SetBool( "IsTrustedServer", bInLobby );
|
|
|
|
|
//
|
|
|
|
|
// pKVData->SetBool( "IsMannUp", bMannUp );
|
|
|
|
|
//
|
|
|
|
|
// // EventTime
|
|
|
|
|
// pKVData->SetInt( "EventTime", GetSteamWorksSGameStatsUploader().GetTimeSinceEpoch() );
|
|
|
|
|
//
|
|
|
|
|
// // Send to DB
|
|
|
|
|
// GetSteamWorksSGameStatsUploader().AddStatsForUpload( pKVData );
|
|
|
|
|
//
|
|
|
|
|
//#endif // !defined(NO_STEAM)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif // GAME_DLL
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// End CMannVsMachineStats
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
void MannVsMachineStats_Init()
|
|
|
|
|
{
|
|
|
|
|
#ifdef GAME_DLL
|
|
|
|
|
CBaseEntity::Create( "tf_mann_vs_machine_stats", vec3_origin, vec3_angle );
|
|
|
|
|
#else
|
|
|
|
|
HOOK_MESSAGE( MVMPlayerEvent );
|
|
|
|
|
HOOK_MESSAGE( MVMResetPlayerStats );
|
|
|
|
|
HOOK_MESSAGE( MVMStatsReset );
|
|
|
|
|
HOOK_MESSAGE( MVMPlayerUpgradedEvent );
|
|
|
|
|
HOOK_MESSAGE( MVMLocalPlayerUpgradesClear );
|
|
|
|
|
HOOK_MESSAGE( MVMLocalPlayerUpgradesValue );
|
|
|
|
|
HOOK_MESSAGE( MVMResetPlayerWaveSpendingStats );
|
|
|
|
|
HOOK_MESSAGE( MVMLocalPlayerWaveSpendingValue );
|
|
|
|
|
HOOK_MESSAGE( MVMWaveChange );
|
|
|
|
|
HOOK_MESSAGE( MVMResetPlayerUpgradeSpending );
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// Helper Functions
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
uint32 MannVsMachineStats_GetCurrentWave()
|
|
|
|
|
{
|
|
|
|
|
return g_pMVMStats ? g_pMVMStats->GetCurrentWave() : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32 MannVsMachineStats_GetAcquiredCredits( int idxWave /*= - 1 */, bool bIncludeBonus /*= true*/ )
|
|
|
|
|
{
|
|
|
|
|
return g_pMVMStats ? g_pMVMStats->GetAcquiredCredits( idxWave, bIncludeBonus ) : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32 MannVsMachineStats_GetDroppedCredits( int idxWave )
|
|
|
|
|
{
|
|
|
|
|
return g_pMVMStats ? g_pMVMStats->GetDroppedCredits( idxWave ) : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32 MannVsMachineStats_GetMissedCredits( int idxWave )
|
|
|
|
|
{
|
|
|
|
|
return g_pMVMStats ? g_pMVMStats->GetMissedCredits( idxWave ) : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CMannVsMachineStats *MannVsMachineStats_GetInstance()
|
|
|
|
|
{
|
|
|
|
|
return g_pMVMStats;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef GAME_DLL
|
|
|
|
|
|
|
|
|
|
void MannVsMachineStats_ResetPlayerEvents( CTFPlayer *pTFPlayer )
|
|
|
|
|
{
|
|
|
|
|
if ( g_pMVMStats )
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats->ResetPlayerEvents( pTFPlayer );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MannVsMachineStats_RoundEvent_CreditsDropped( uint32 waveIdx, int nAmount )
|
|
|
|
|
{
|
|
|
|
|
if ( g_pMVMStats )
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats->RoundEvent_CreditsDropped( waveIdx, nAmount );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MannVsMachineStats_PlayerEvent_PointsChanged( CTFPlayer *pTFPlayer, int nPoints )
|
|
|
|
|
{
|
|
|
|
|
if ( g_pMVMStats )
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats->PlayerEvent_PointsChanged( pTFPlayer, nPoints );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MannVsMachineStats_PlayerEvent_Died( CTFPlayer *pTFPlayer )
|
|
|
|
|
{
|
|
|
|
|
if ( g_pMVMStats )
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats->PlayerEvent_Died( pTFPlayer );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MannVsMachineStats_PlayerEvent_Upgraded( CTFPlayer *pTFPlayer, uint16 nItemDef, uint16 nAttributeDef, uint16 nQuality, int16 nCost, bool bIsBottle )
|
|
|
|
|
{
|
|
|
|
|
if ( g_pMVMStats )
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats->PlayerEvent_Upgraded( pTFPlayer, nItemDef, nAttributeDef, nQuality, nCost, bIsBottle );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MannVsMachineStats_PlayerEvent_PickedUpCredits( CTFPlayer *pTFPlayer, uint32 idxWave, int nCreditsAmount )
|
|
|
|
|
{
|
|
|
|
|
if ( g_pMVMStats )
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats->PlayerEvent_PickedUpCredits( pTFPlayer, idxWave, nCreditsAmount );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MannVsMachineStats_PlayerEvent_BoughtInstantRespawn( CTFPlayer *pTFPlayer, int nCost )
|
|
|
|
|
{
|
|
|
|
|
if ( g_pMVMStats )
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats->PlayerEvent_BoughtInstantRespawn( pTFPlayer, nCost );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MannVsMachineStats_SetPopulationFile( const char * pPopulationFile)
|
|
|
|
|
{
|
|
|
|
|
if ( g_pMVMStats )
|
|
|
|
|
{
|
|
|
|
|
g_pMVMStats->SetPopFile( pPopulationFile );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif // GAME_DLL
|
|
|
|
|
|