diff options
Diffstat (limited to 'devtools/processgamestats/cstrike_gamestats_parse.cpp')
| -rw-r--r-- | devtools/processgamestats/cstrike_gamestats_parse.cpp | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/devtools/processgamestats/cstrike_gamestats_parse.cpp b/devtools/processgamestats/cstrike_gamestats_parse.cpp new file mode 100644 index 0000000..6180279 --- /dev/null +++ b/devtools/processgamestats/cstrike_gamestats_parse.cpp @@ -0,0 +1,235 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// +// + +#include "stdafx.h" +#include <stdio.h> +#include <process.h> +#include <string.h> +#include <windows.h> +#include <sys/stat.h> + +#include "interface.h" +#include "imysqlwrapper.h" +#include "tier1/utlvector.h" +#include "tier1/utlbuffer.h" +#include "tier1/utlsymbol.h" +#include "tier1/utlstring.h" +#include "tier1/utldict.h" +#include "tier2/tier2.h" +#include "filesystem.h" + +#include "cbase.h" +#include "gamestats.h" +#include "cs_gamestats.h" +#include "base_gamestats_parse.h" + +extern CUtlDict< int, unsigned short > g_mapOrder; + +const char *pValidStatLevels[] = +{ + "cs_assault", + "cs_compound", + "cs_havana", + "cs_italy", + "cs_militia", + "cs_office", + "de_aztec", + "de_cbble", + "de_chateau", + "de_dust2", + "de_dust", + "de_inferno", + "de_nuke", + "de_piranesi", + "de_port", + "de_prodigy", + "de_tides", + "de_train", +}; + +static const char * s_WeaponAliasInfo[] = +{ + "none", // WEAPON_NONE + "p228", // WEAPON_P228 + "glock", // WEAPON_GLOCK // old glock + "scout", // WEAPON_SCOUT + "hegren", // WEAPON_HEGRENADE + "xm1014", // WEAPON_XM1014 // auto shotgun + "c4", // WEAPON_C4 + "mac10", // WEAPON_MAC10 // T only + "aug", // WEAPON_AUG + "sgren", // WEAPON_SMOKEGRENADE + "elite", // WEAPON_ELITE + "fiveseven",// WEAPON_FIVESEVEN + "ump45", // WEAPON_UMP45 + "sg550", // WEAPON_SG550 // auto-sniper + "galil", // WEAPON_GALIL + "famas", // WEAPON_FAMAS // CT cheap m4a1 + "usp", // WEAPON_USP + "awp", // WEAPON_AWP + "mp5navy", // WEAPON_MP5N + "m249", // WEAPON_M249 // big machinegun + "m3", // WEAPON_M3 // cheap shotgun + "m4a1", // WEAPON_M4A1 + "tmp", // WEAPON_TMP + "g3sg1", // WEAPON_G3SG1 // T auto-sniper + "flash", // WEAPON_FLASHBANG + "deagle", // WEAPON_DEAGLE + "sg552", // WEAPON_SG552 // T aug equivalent + "ak47", // WEAPON_AK47 + "knife", // WEAPON_KNIFE + "p90", // WEAPON_P90 + "shield", // WEAPON_SHIELDGUN + "kevlar", + "assaultsuit", + "nightvision", + NULL, // WEAPON_NONE +}; + +void DescribeData( cs_gamestats_t &stats ) +{ + Msg( " Blob version: %d\n", stats.header.iVersion ); + Msg( " Server Uptime: %d\n", stats.iMinutesPlayed ); + + for ( int i = 0; i < CS_NUM_LEVELS; i++ ) + { + Msg( "%s - Terrorists Wins: %d | Counter-Terrorists Wins: %d\n", pValidStatLevels[i], stats.iTerroristVictories[i], stats.iCounterTVictories[i] ); + } + + for ( int i = 0; i < WEAPON_MAX; i++ ) + { + Msg( "%s was purchased %d time(s)\n", s_WeaponAliasInfo[i], stats.iBlackMarketPurchases[i] ); + } + + + char q[ 512 ]; + + Q_snprintf( q, sizeof( q ), "Auto-Buy = %d\n", stats.iAutoBuyPurchases ); + Msg( q ); + + Q_snprintf( q, sizeof( q ), "Re-Buy = %d\n", stats.iReBuyPurchases ); + Msg( q ); + + Q_snprintf( q, sizeof( q ), "Auto-Buy: M4A1 = %d\n", stats.iAutoBuyM4A1Purchases ); + Msg( q ); + + Q_snprintf( q, sizeof( q ), "Auto-Buy: AK47 = %d\n", stats.iAutoBuyAK47Purchases ); + Msg( q ); + + Q_snprintf( q, sizeof( q ), "Auto-Buy: Famas = %d\n", stats.iAutoBuyFamasPurchases ); + Msg( q ); + + Q_snprintf( q, sizeof( q ), "Auto-Buy: Galil = %d\n", stats.iAutoBuyGalilPurchases ); + Msg( q ); + + Q_snprintf( q, sizeof( q ), "Auto-Buy: Suit = %d\n", stats.iAutoBuyVestHelmPurchases ); + Msg( q ); + + Q_snprintf( q, sizeof( q ), "Auto-Buy: Kev = %d\n", stats.iAutoBuyVestPurchases ); + Msg( q ); +} + +int CS_ParseCustomGameStatsData( ParseContext_t *ctx ) +{ + if ( g_pFullFileSystem == NULL ) + return CUSTOMDATA_FAILED; + + FileHandle_t FileHandle = g_pFullFileSystem->Open( ctx->file, "rb" ); + + if ( !FileHandle ) + { + return CUSTOMDATA_FAILED; + } + + if ( ctx->mysql == NULL && ctx->describeonly == false ) + return CUSTOMDATA_FAILED; + + char q[ 512 ]; + cs_gamestats_t stats; + g_pFullFileSystem->Read( &stats, sizeof( cs_gamestats_t ), FileHandle ); + + if ( Q_stricmp( stats.header.szGameName, "cstrike" ) ) + return CUSTOMDATA_FAILED; + + if ( stats.header.iVersion != CS_STATS_BLOB_VERSION ) + { + Msg( "Error: Incorrect Blob Version! Got: %d - Expected: %d\n", stats.header.iVersion, CS_STATS_BLOB_VERSION ); + return CUSTOMDATA_FAILED; + } + + if ( ctx->describeonly == true ) + { + DescribeData( stats ); + return CUSTOMDATA_SUCCESS; + } + + //Do maps first + for ( int i = 0; i < CS_NUM_LEVELS; i++ ) + { + Q_snprintf( q, sizeof( q ), "update maps set TerroristWins=TerroristWins+%d, CTWins=CTWins+%d where MapName = \"%s\";", stats.iTerroristVictories[i], stats.iCounterTVictories[i], pValidStatLevels[i] ); + + int retcode = ctx->mysql->Execute( q ); + if ( retcode != 0 ) + { + printf( "Query:\n %s\n failed\n", q ); + return CUSTOMDATA_FAILED; + } + } + + //Now do all weapons + for ( int i = 0; i < WEAPON_MAX; i++ ) + { + int iWeaponID = i; + + //HACKHACK: Fix up incorrect data for the smoke grenades. + if ( i == 0 && stats.iBlackMarketPurchases[i] != 0 ) + { + iWeaponID = 9; + } + + Q_snprintf( q, sizeof( q ), "update weapons set Count=Count+%d where WeaponID = %d;", stats.iBlackMarketPurchases[i], iWeaponID ); + + int retcode = ctx->mysql->Execute( q ); + if ( retcode != 0 ) + { + printf( "Query:\n %s\n failed\n", q ); + return CUSTOMDATA_FAILED; + } + } + + + Q_snprintf( q, sizeof( q ), "update autobuy set Count=Count+%d where Purchase = \"Auto-Buy\";", stats.iAutoBuyPurchases ); + ctx->mysql->Execute( q ); + + Q_snprintf( q, sizeof( q ), "update autobuy set Count=Count+%d where Purchase = \"Re-Buy\";", stats.iReBuyPurchases ); + ctx->mysql->Execute( q ); + + Q_snprintf( q, sizeof( q ), "update autobuy set Count=Count+%d where Purchase = \"Auto-Buy: M4A1\";", stats.iAutoBuyM4A1Purchases ); + ctx->mysql->Execute( q ); + + Q_snprintf( q, sizeof( q ), "update autobuy set Count=Count+%d where Purchase = \"Auto-Buy: AK47\";", stats.iAutoBuyAK47Purchases ); + ctx->mysql->Execute( q ); + + Q_snprintf( q, sizeof( q ), "update autobuy set Count=Count+%d where Purchase = \"Auto-Buy: Famas\";", stats.iAutoBuyFamasPurchases ); + ctx->mysql->Execute( q ); + + Q_snprintf( q, sizeof( q ), "update autobuy set Count=Count+%d where Purchase = \"Auto-Buy: Galil\";", stats.iAutoBuyGalilPurchases ); + ctx->mysql->Execute( q ); + + Q_snprintf( q, sizeof( q ), "update autobuy set Count=Count+%d where Purchase = \"Auto-Buy: Suit\";", stats.iAutoBuyVestHelmPurchases ); + ctx->mysql->Execute( q ); + + Q_snprintf( q, sizeof( q ), "update autobuy set Count=Count+%d where Purchase = \"Auto-Buy: Kev\";", stats.iAutoBuyVestPurchases ); + ctx->mysql->Execute( q ); + + + + return CUSTOMDATA_SUCCESS; +} |