236 lines
6.3 KiB
C++
236 lines
6.3 KiB
C++
//========= 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;
|
|
}
|