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.
235 lines
6.3 KiB
235 lines
6.3 KiB
//========= 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; |
|
}
|
|
|