diff options
Diffstat (limited to 'utils/blackmarket')
| -rw-r--r-- | utils/blackmarket/blackmarket.cpp | 674 | ||||
| -rw-r--r-- | utils/blackmarket/blackmarket.vcproj | 185 | ||||
| -rw-r--r-- | utils/blackmarket/stdafx.cpp | 9 | ||||
| -rw-r--r-- | utils/blackmarket/stdafx.h | 26 |
4 files changed, 894 insertions, 0 deletions
diff --git a/utils/blackmarket/blackmarket.cpp b/utils/blackmarket/blackmarket.cpp new file mode 100644 index 0000000..928ea7c --- /dev/null +++ b/utils/blackmarket/blackmarket.cpp @@ -0,0 +1,674 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// blackmarket.cpp : Defines the entry point for the console application. +// + +#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 "mathlib.h" +#include "filesystem.h" +#include "filesystem_helpers.h" +#include "tier2/tier2.h" +#include "utlbuffer.h" + +#include <ATLComTime.h> + +const char *pDBName = "blackmarket_history"; +const char *pHostName = "gamestats"; +const char *pUserName = "root"; +const char *pPassword = "r77GH34p"; + +CSysModule *sql = NULL; +CreateInterfaceFn factory = NULL; +IMySQL *mysql = NULL; + +enum CSWeaponID +{ + WEAPON_NONE = 0, + + WEAPON_P228, + WEAPON_GLOCK, + WEAPON_SCOUT, + WEAPON_HEGRENADE, + WEAPON_XM1014, + WEAPON_C4, + WEAPON_MAC10, + WEAPON_AUG, + WEAPON_SMOKEGRENADE, + WEAPON_ELITE, + WEAPON_FIVESEVEN, + WEAPON_UMP45, + WEAPON_SG550, + + WEAPON_GALIL, + WEAPON_FAMAS, + WEAPON_USP, + WEAPON_AWP, + WEAPON_MP5NAVY, + WEAPON_M249, + WEAPON_M3, + WEAPON_M4A1, + WEAPON_TMP, + WEAPON_G3SG1, + WEAPON_FLASHBANG, + WEAPON_DEAGLE, + WEAPON_SG552, + WEAPON_AK47, + WEAPON_KNIFE, + WEAPON_P90, + + WEAPON_SHIELDGUN, // BOTPORT: Is this still needed? + + WEAPON_KEVLAR, + WEAPON_ASSAULTSUIT, + WEAPON_NVG, + + WEAPON_MAX, // number of weapons weapon index +}; + +#define PRICE_BLOB_VERSION 1 +#define PRICE_BLOB_NAME "weeklyprices.dat" +struct weeklyprice_t +{ + short iVersion; + short iPreviousPrice[WEAPON_MAX]; + short iCurrentPrice[WEAPON_MAX]; +}; + +int g_iCurrentWeaponPurchases[WEAPON_MAX]; +int g_iNewWeaponPrices[WEAPON_MAX]; +int g_iPriceDelta[WEAPON_MAX]; +int g_iPurchaseDelta[WEAPON_MAX]; +int g_iCounter = 0; +int g_iResetCounter = 0; +bool g_bWeeklyUpdate = false; + +#define PRICE_SCALE 0.01f + +struct weapons_t +{ + int iWeaponType; + int iDefaultPrice; + int iID; + int iPurchaseCount; + int iCurrentPrice; +}; + +#define WEAPON_NOTHING 0 +#define WEAPON_PISTOL 1 +#define WEAPON_EVERYTHING 2 + +static weapons_t g_Weapons[] = +{ + { WEAPON_NOTHING, 0, WEAPON_NONE, 0, 0, }, + { WEAPON_PISTOL, 600, WEAPON_P228, 0, 0, }, + { WEAPON_PISTOL, 400, WEAPON_GLOCK, 0, 0, }, + { WEAPON_EVERYTHING, 2750, WEAPON_SCOUT, 0, 0, }, + { WEAPON_EVERYTHING, 300, WEAPON_HEGRENADE, 0, 0, }, + { WEAPON_EVERYTHING, 3000, WEAPON_XM1014, 0, 0, }, + { WEAPON_NOTHING, 0, WEAPON_C4, 0, 0, }, + { WEAPON_EVERYTHING, 1400, WEAPON_MAC10, 0, 0, }, + { WEAPON_EVERYTHING, 3500, WEAPON_AUG, 0, 0, }, + { WEAPON_EVERYTHING, 300, WEAPON_SMOKEGRENADE, 0, 0, }, + { WEAPON_PISTOL, 800, WEAPON_ELITE, 0, 0, }, + { WEAPON_PISTOL, 750, WEAPON_FIVESEVEN, 0, 0, }, + { WEAPON_EVERYTHING, 1700, WEAPON_UMP45, 0, 0, }, + { WEAPON_EVERYTHING, 4200, WEAPON_SG550, 0, 0, }, + { WEAPON_EVERYTHING, 2000, WEAPON_GALIL, 0, 0, }, + { WEAPON_EVERYTHING, 2250, WEAPON_FAMAS, 0, 0, }, + { WEAPON_PISTOL, 500, WEAPON_USP, 0, 0, }, + { WEAPON_EVERYTHING, 4750, WEAPON_AWP, 0, 0, }, + { WEAPON_EVERYTHING, 1500, WEAPON_MP5NAVY, 0, 0, }, + { WEAPON_EVERYTHING, 5750, WEAPON_M249, 0, 0, }, + { WEAPON_EVERYTHING, 1700, WEAPON_M3, 0, 0, }, + { WEAPON_EVERYTHING, 3100, WEAPON_M4A1, 0, 0, }, + { WEAPON_EVERYTHING, 1250, WEAPON_TMP, 0, 0, }, + { WEAPON_EVERYTHING, 5000, WEAPON_G3SG1, 0, 0, }, + { WEAPON_EVERYTHING, 200, WEAPON_FLASHBANG, 0, 0, }, + { WEAPON_PISTOL, 650, WEAPON_DEAGLE, 0, 0, }, + { WEAPON_EVERYTHING, 3500, WEAPON_SG552, 0, 0, }, + { WEAPON_EVERYTHING, 2500, WEAPON_AK47, 0, 0, }, + { WEAPON_NOTHING, 0, WEAPON_KNIFE, 0, 0, }, + { WEAPON_EVERYTHING, 2350, WEAPON_P90, 0, 0, }, + { WEAPON_NOTHING, 0, WEAPON_SHIELDGUN, 0, 0, }, + { WEAPON_EVERYTHING, 650, WEAPON_KEVLAR, 0, 0, }, + { WEAPON_EVERYTHING, 1000, WEAPON_ASSAULTSUIT, 0, 0, }, + { WEAPON_EVERYTHING, 1250, WEAPON_NVG, 0, 0, }, +}; + +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", + "kev+helm", + "ngvision", + NULL, // WEAPON_NONE +}; + + +enum sorttype +{ + SORT_PURCHASE = 0, + SORT_NEWPRICE, + SORT_PRICEDELTA, + SORT_PERCENTCHANGE, +}; + +void SortWeaponRanks( int iWeaponType, weapons_t *pWeaponsArray, int iSortType ); + +bool GetCurrentPurchaseCount( void ) +{ + if ( mysql->InitMySQL( "gamestats_cstrike", pHostName, pUserName, pPassword ) ) + { + Msg( "Successfully connected to database %s on host %s, user %s\n", "gamestats_cstrike", pHostName, pUserName ); + + //Get purchase counts. + mysql->Execute( "select * from weapons;" ); + + bool bFoundNext = mysql->SeekToFirstRow(); + int iIndex = WEAPON_P228; + + while( bFoundNext && iIndex < WEAPON_MAX ) + { + bFoundNext = mysql->NextRow(); + g_iCurrentWeaponPurchases[iIndex] = mysql->GetColumnValue_Int( mysql->GetColumnIndex( "Count" ) ); + g_Weapons[iIndex].iPurchaseCount = g_iCurrentWeaponPurchases[iIndex]; + iIndex++; + } + + mysql->Execute( "select * from snapshot_counter;" ); + mysql->SeekToFirstRow(); + mysql->NextRow(); + + //Get snapshot counter. + g_iCounter = mysql->GetColumnValue_Int( mysql->GetColumnIndex( "counter" ) ); + + mysql->Execute( "select * from reset_counter;" ); + mysql->SeekToFirstRow(); + mysql->NextRow(); + + //Get reset snapshot counter. + g_iResetCounter = mysql->GetColumnValue_Int( mysql->GetColumnIndex( "counter" ) ); + + + + //Get current price and purchase count + mysql->Execute( "select * from weapon_info;" ); + + bFoundNext = mysql->SeekToFirstRow(); + iIndex = WEAPON_P228; + + while( bFoundNext && iIndex < WEAPON_MAX ) + { + bFoundNext = mysql->NextRow(); + + int iWeaponID = mysql->GetColumnValue_Int( mysql->GetColumnIndex( "WeaponID" ) ); + g_Weapons[iWeaponID].iCurrentPrice = mysql->GetColumnValue_Int( mysql->GetColumnIndex( "current_price" ) ); + + if ( g_bWeeklyUpdate == true ) + { + int iPreviousPurchases = mysql->GetColumnValue_Int( mysql->GetColumnIndex( "purchases_thisweek" ) ); + g_Weapons[iWeaponID].iPurchaseCount = g_iPurchaseDelta[iWeaponID] = iPreviousPurchases; + } + else + { + int iPreviousPurchases = mysql->GetColumnValue_Int( mysql->GetColumnIndex( "purchases" ) ); + int iPurchasesThisWeek = mysql->GetColumnValue_Int( mysql->GetColumnIndex( "purchases_thisweek" ) ); + + g_iPurchaseDelta[iWeaponID] = g_iCurrentWeaponPurchases[iWeaponID] - iPreviousPurchases; + + g_Weapons[iWeaponID].iPurchaseCount = g_iPurchaseDelta[iWeaponID] + iPurchasesThisWeek; + } + + + iIndex++; + } + + + if ( g_bWeeklyUpdate == true ) + { + iIndex = WEAPON_P228; + + while( iIndex < WEAPON_MAX ) + { + char szQueryString[512]; + + Q_snprintf( szQueryString, 512, "select * from purchases_pricing where snapshot=\"%d_%d\"", g_iCounter, iIndex ); + + //Get current price and purchase count + mysql->Execute( szQueryString ); + mysql->SeekToFirstRow(); + mysql->NextRow(); + + g_iPurchaseDelta[iIndex] = mysql->GetColumnValue_Int( mysql->GetColumnIndex( "purchases" ) ); + + iIndex++; + } + } + + return true; + } + + Msg( "mysql->InitMySQL( %s, %s, %s, [password]) failed\n", "gamestats_cstrike", pHostName, pUserName ); + + return false; +} + +int GetWeaponTypeCount( int iType ) +{ + int iCount = 0; + + for ( int j = 0; j < WEAPON_MAX; j++ ) + { + if ( g_Weapons[j].iWeaponType == iType ) + { + iCount++; + } + } + + return iCount; +} + +weapons_t g_PistolRanks[6]; +weapons_t g_RifleAndEquipmentRanks[24]; + +void PrintNewPrices( void ) +{ + int iTotalPistols = 0; + int iTotalRiflesEquipment = 0; + int iTotalCurrentPistols = 0; + int iTotalCurrentRiflesEquipment = 0; + + for ( int j = 0; j < WEAPON_MAX; j++ ) + { + //Msg( "%s - Default Price: %d - New Price: %d\n", s_WeaponAliasInfo[j], g_Weapons[j].iDefaultPrice, g_iNewWeaponPrices[j] ); + + if ( g_Weapons[j].iWeaponType == WEAPON_PISTOL ) + { + iTotalPistols += g_Weapons[j].iCurrentPrice; + iTotalCurrentPistols += g_iNewWeaponPrices[j]; + } + else if ( g_Weapons[j].iWeaponType == WEAPON_EVERYTHING ) + { + iTotalRiflesEquipment += g_Weapons[j].iCurrentPrice; + iTotalCurrentRiflesEquipment += g_iNewWeaponPrices[j]; + } + } + + int iCount = GetWeaponTypeCount( WEAPON_PISTOL ); + + SortWeaponRanks( WEAPON_PISTOL, g_PistolRanks, SORT_PERCENTCHANGE ); + + Msg( "\n" ); + Msg( "Pistol Rankings:\n\n"); + + for ( int i = 0; i < iCount; i++ ) + { + Msg( "#%d: %s \t\t| Purchases: %d \t| Current Price: %d \t| New Price: %d \t| Price Change: %d\n", i+1, s_WeaponAliasInfo[g_PistolRanks[i].iID], g_Weapons[g_PistolRanks[i].iID].iPurchaseCount, g_PistolRanks[i].iCurrentPrice, g_iNewWeaponPrices[g_PistolRanks[i].iID], g_iPriceDelta[g_PistolRanks[i].iID] ); + } + + iCount = GetWeaponTypeCount( WEAPON_EVERYTHING ); + + SortWeaponRanks( WEAPON_EVERYTHING, g_RifleAndEquipmentRanks, SORT_PERCENTCHANGE ); + + Msg( "\n\n" ); + Msg( "Other Weapons and Equipment Rankings:\n\n"); + + for ( int i = 0; i < iCount; i++ ) + { + Msg( "#%d: %s \t\t| Purchases: %d \t| Current Price: %d \t| New Price: %d \t| Price Change: %d\n", i+1, s_WeaponAliasInfo[g_RifleAndEquipmentRanks[i].iID], g_Weapons[g_RifleAndEquipmentRanks[i].iID].iPurchaseCount, g_RifleAndEquipmentRanks[i].iCurrentPrice, g_iNewWeaponPrices[g_RifleAndEquipmentRanks[i].iID], g_iPriceDelta[g_RifleAndEquipmentRanks[i].iID] ); + } + + Msg( "\n" ); + Msg( "Total Pistol Baseline: %d\n", iTotalPistols ); + Msg( "Current Pistol Total: %d\n", iTotalCurrentPistols ); + Msg( "Total Rifles/Equipment Baseline: %d\n", iTotalRiflesEquipment ); + Msg( "Current Rifles/Equipment Total: %d\n", iTotalCurrentRiflesEquipment ); + + Msg( "\n" ); +} + +float g_flTotalWeaponPurchasesPistols = 0; +float g_flTotalWeaponPurchasesRifleEquipment = 0; +float g_flTotalDollarsPistols = 1; +float g_flTotalDollarsRifleEquipment = 1; + +void SortWeaponRanks( int iWeaponType, weapons_t *pWeaponsArray, int iSortType ) +{ + int iCount = GetWeaponTypeCount( iWeaponType ); + + int iTotalPurchases = g_flTotalWeaponPurchasesPistols; + + if ( iWeaponType == WEAPON_EVERYTHING ) + { + iTotalPurchases = g_flTotalWeaponPurchasesRifleEquipment; + } + + bool bSorted = 1; + + while ( bSorted ) + { + bSorted = false; + + for ( int i = 1; i < iCount; i++ ) + { + float flSize1 = 0; // (pWeaponsArray[i].iPurchaseCount * PRICE_SCALE) * (pWeaponsArray[i].iCurrentPrice * PRICE_SCALE); + float flSize2 = 0; //(pWeaponsArray[i-1].iPurchaseCount * PRICE_SCALE) * (pWeaponsArray[i-1].iCurrentPrice * PRICE_SCALE); + + if ( iSortType == SORT_PURCHASE ) + { + flSize1 = pWeaponsArray[i].iPurchaseCount; + flSize2 = pWeaponsArray[i-1].iPurchaseCount; + } + else if ( iSortType == SORT_NEWPRICE ) + { + flSize1 = g_iNewWeaponPrices[pWeaponsArray[i].iID]; + flSize2 = g_iNewWeaponPrices[pWeaponsArray[i-1].iID]; + } + else if ( iSortType == SORT_PRICEDELTA ) + { + flSize1 = g_iPriceDelta[pWeaponsArray[i].iID]; + flSize2 = g_iPriceDelta[pWeaponsArray[i-1].iID]; + } + else if ( iSortType == SORT_PERCENTCHANGE ) + { + flSize1 = (pWeaponsArray[i].iCurrentPrice / g_iNewWeaponPrices[pWeaponsArray[i].iID]) - 1; + flSize2 = (pWeaponsArray[i-1].iCurrentPrice / g_iNewWeaponPrices[pWeaponsArray[i-1].iID]) - 1; + } + if ( flSize1 > flSize2 ) + { + weapons_t temp = pWeaponsArray[i]; + pWeaponsArray[i] = pWeaponsArray[i-1]; + pWeaponsArray[i-1] = temp; + bSorted = true; + } + } + } +} + +void CalculateNewPrices( weapons_t *pWeaponsArray, int iWeaponType ) +{ + int iTotalDollars = g_flTotalDollarsPistols; + int iTotalPurchases = g_flTotalWeaponPurchasesPistols; + int iTotalUp = 0; + int iTotalDown = 0; + + if ( iWeaponType == WEAPON_EVERYTHING ) + { + iTotalDollars = g_flTotalDollarsRifleEquipment; + iTotalPurchases = g_flTotalWeaponPurchasesRifleEquipment; + } + + SortWeaponRanks( iWeaponType, pWeaponsArray, SORT_PURCHASE ); + + int iCount = GetWeaponTypeCount( iWeaponType ); + float flPercentage = 0.0f; + int iSign = 1; + + for ( int i = 0; i < iCount; i++ ) + { + float flDollarAmount = ((float)pWeaponsArray[i].iCurrentPrice * PRICE_SCALE) * ((float)pWeaponsArray[i].iPurchaseCount * PRICE_SCALE); + float flTest = flDollarAmount / (float)iTotalDollars; + float flTest2 = (float)pWeaponsArray[i].iPurchaseCount / (float)iTotalPurchases; + + if ( iSign == 1 ) + { + float flMod = (float)pWeaponsArray[i].iDefaultPrice / (float)pWeaponsArray[i].iCurrentPrice; + + g_iNewWeaponPrices[pWeaponsArray[i].iID] = ceil( pWeaponsArray[i].iCurrentPrice + ( ( pWeaponsArray[i].iCurrentPrice * flTest2 ) * flMod ) ); + iTotalUp += iTotalDollars * flTest; + } + else + { + float flMod = (float)pWeaponsArray[i].iCurrentPrice / (float)pWeaponsArray[i].iDefaultPrice; + + g_iNewWeaponPrices[pWeaponsArray[i].iID] = pWeaponsArray[i].iCurrentPrice - (( 1.0f / flTest2 ) * flMod ); + iTotalDown += iTotalDollars * flTest; + } + + if ( g_iNewWeaponPrices[pWeaponsArray[i].iID] <= 0 ) + { + g_iNewWeaponPrices[pWeaponsArray[i].iID] = 1; + } + + g_iPriceDelta[pWeaponsArray[i].iID] = g_iNewWeaponPrices[pWeaponsArray[i].iID] - pWeaponsArray[i].iCurrentPrice; + + flPercentage = flPercentage + flTest; + + if ( flPercentage >= 0.5f ) + { + iSign = -1; + } + } +} + +void ProcessBlackMarket( void ) +{ + int iPistol = 0; + int iRifles = 0; + + for ( int i = 1; i < WEAPON_MAX; i++ ) + { + if ( g_Weapons[i].iWeaponType == WEAPON_PISTOL ) + { + g_flTotalDollarsPistols += ( (float)g_Weapons[i].iCurrentPrice * PRICE_SCALE) * ( (float)g_Weapons[i].iPurchaseCount * PRICE_SCALE); + g_flTotalWeaponPurchasesPistols += g_Weapons[i].iPurchaseCount; + + g_PistolRanks[iPistol] = g_Weapons[i]; + g_PistolRanks[iPistol].iPurchaseCount = g_Weapons[i].iPurchaseCount; //g_iCurrentWeaponPurchases[i]; + iPistol++; + } + else if ( g_Weapons[i].iWeaponType == WEAPON_EVERYTHING ) + { + g_flTotalDollarsRifleEquipment += ( (float)g_Weapons[i].iCurrentPrice * PRICE_SCALE ) * ( (float)g_Weapons[i].iPurchaseCount * PRICE_SCALE ); + g_flTotalWeaponPurchasesRifleEquipment += g_Weapons[i].iPurchaseCount; + + g_RifleAndEquipmentRanks[iRifles] = g_Weapons[i]; + g_RifleAndEquipmentRanks[iRifles].iPurchaseCount = g_Weapons[i].iPurchaseCount; //g_iCurrentWeaponPurchases[i]; + iRifles++; + } + } + + memset( g_iPriceDelta, 0, sizeof( g_iPriceDelta ) ); + + CalculateNewPrices( g_PistolRanks, WEAPON_PISTOL ); + CalculateNewPrices( g_RifleAndEquipmentRanks, WEAPON_EVERYTHING ); +} + + +//================================= +// Add the current snapshot to the db +//================================= +void AddSnapshotToDatabase( void ) +{ + char szSnapshot[1024]; + + //Only update the prices and close. + if ( g_bWeeklyUpdate == true ) + { + weeklyprice_t prices; + CUtlBuffer buf; + + prices.iVersion = PRICE_BLOB_VERSION; + + for ( int i = 1; i < WEAPON_MAX; i ++ ) + { + Q_snprintf( szSnapshot, sizeof( szSnapshot ), "update weapon_info set current_price=%d, purchases_thisweek=0 where WeaponID=%d", g_iNewWeaponPrices[i], i ); + + int retcode = mysql->Execute( szSnapshot ); + if ( retcode != 0 ) + { + Msg( "Query:\n %s\n failed - Retcode: %d\n", szSnapshot, retcode ); + } + + prices.iPreviousPrice[i] = g_Weapons[i].iCurrentPrice; + prices.iCurrentPrice[i] = g_iNewWeaponPrices[i]; + } + + + buf.Put( &prices, sizeof( weeklyprice_t ) ); + + if ( g_pFullFileSystem ) + { + g_pFullFileSystem->WriteFile( PRICE_BLOB_NAME, NULL, buf ); + } + + Q_snprintf( szSnapshot, sizeof( szSnapshot ), "update reset_counter set counter=counter+1" ); + + int retcode = mysql->Execute( szSnapshot ); + if ( retcode != 0 ) + { + Msg( "Query:\n %s\n failed - Retcode: %d\n", szSnapshot, retcode ); + } + + return; + } + + g_iCounter++; + + for ( int i = 1; i < WEAPON_MAX; i ++ ) + { + Q_snprintf( szSnapshot, sizeof( szSnapshot ), "Insert into purchases_pricing ( snapshot, dt2, weapon_id, purchases, current_price, projected_price, reset_counter ) values ( \"%d_%d\", NOW(), %d, %d, %d, %d, %d );", + g_iCounter, i, + i, + g_iPurchaseDelta[i], + g_Weapons[i].iCurrentPrice, + g_iNewWeaponPrices[i], + g_iResetCounter ); + + int retcode = mysql->Execute( szSnapshot ); + if ( retcode != 0 ) + { + Msg( "Query:\n %s\n failed - Retcode: %d\n", szSnapshot, retcode ); + } + } + + + Q_snprintf( szSnapshot, sizeof( szSnapshot ), "update snapshot_counter set counter=%d", g_iCounter ); + + int retcode = mysql->Execute( szSnapshot ); + if ( retcode != 0 ) + { + Msg( "Query:\n %s\n failed - Retcode: %d\n", szSnapshot, retcode ); + } + + for ( int i = 1; i < WEAPON_MAX; i ++ ) + { + Q_snprintf( szSnapshot, sizeof( szSnapshot ), "update weapon_info set purchases=%d, purchases_thisweek=purchases_thisweek+%d where WeaponID=%d", g_iCurrentWeaponPurchases[i], g_iPurchaseDelta[i], i ); + + int retcode = mysql->Execute( szSnapshot ); + if ( retcode != 0 ) + { + Msg( "Query:\n %s\n failed - Retcode: %d\n", szSnapshot, retcode ); + } + } + + Msg( "Added new snapshot to database\n", szSnapshot, retcode ); + +} + +int main(int argc, char* argv[]) +{ + bool bSnapShot = false; + + InitDefaultFileSystem(); + + if ( argc > 1 ) + { + for ( int i = 0; i < argc; i++ ) + { + if ( Q_stricmp( "-snapshot", argv[i] ) == 0 ) + { + bSnapShot = true; + } + + if( Q_stricmp( "-weeklyupdate", argv[i] ) == 0 ) + { + g_bWeeklyUpdate = true; + } + } + } + + // Now connect to steamweb and update the engineaccess table + sql = Sys_LoadModule( "mysql_wrapper" ); + if ( sql ) + { + factory = Sys_GetFactory( sql ); + if ( factory ) + { + mysql = ( IMySQL * )factory( MYSQL_WRAPPER_VERSION_NAME, NULL ); + if ( mysql == NULL ) + { + Msg( "Unable to get MYSQL_WRAPPER_VERSION_NAME(%s) from mysql_wrapper\n", MYSQL_WRAPPER_VERSION_NAME ); + exit( -1 ); + } + } + else + { + Msg( "Sys_GetFactory on mysql_wrapper failed\n" ); + exit( -1 ); + } + } + else + { + Msg( "Sys_LoadModule( mysql_wrapper ) failed\n" ); + exit( -1 ); + } + + if ( GetCurrentPurchaseCount() == false ) + exit( -1 ); + + ProcessBlackMarket(); + + if ( bSnapShot == true ) + { + AddSnapshotToDatabase(); + } + + PrintNewPrices(); + + if ( mysql ) + { + mysql->Release(); + } + + return 0; +} + diff --git a/utils/blackmarket/blackmarket.vcproj b/utils/blackmarket/blackmarket.vcproj new file mode 100644 index 0000000..40cfb3b --- /dev/null +++ b/utils/blackmarket/blackmarket.vcproj @@ -0,0 +1,185 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="7.10" + Name="blackmarket" + ProjectGUID="{A7B7CC7B-FD61-4695-9521-FB8CE559A3A4}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../../public/mathlib;../../utils/vmpi;../../public;../../public/tier1;../../game_shared;../../dlls" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="FALSE" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + UsePrecompiledHeader="0" + WarningLevel="4" + Detect64BitPortabilityProblems="FALSE" + DebugInformationFormat="4" + CompileAs="0"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + OutputFile="$(OutDir)/blackmarket_debug.exe" + LinkIncremental="2" + GenerateDebugInformation="TRUE" + ProgramDatabaseFile="$(OutDir)/blackmarket.pdb" + SubSystem="1" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../../public/mathlib;../../utils/vmpi;../../public;../../public/tier1;../../game_shared;../../dlls" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="4" + UsePrecompiledHeader="3" + WarningLevel="4" + Detect64BitPortabilityProblems="FALSE" + DebugInformationFormat="0"/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCLinkerTool" + OutputFile="$(OutDir)/blackmarket.exe" + LinkIncremental="1" + IgnoreAllDefaultLibraries="FALSE" + IgnoreDefaultLibraryNames="LIBCMT" + GenerateDebugInformation="TRUE" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> + <File + RelativePath=".\blackmarket.cpp"> + </File> + <File + RelativePath="..\..\public\filesystem_helpers.cpp"> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\public\filesystem_helpers.h"> + </File> + <File + RelativePath=".\stdafx.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1"/> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> + <File + RelativePath=".\stdafx.h"> + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> + </Filter> + <File + RelativePath="..\..\lib\public\mathlib.lib"> + </File> + <File + RelativePath=".\ReadMe.txt"> + </File> + <File + RelativePath="..\..\lib\public\tier0.lib"> + </File> + <File + RelativePath="..\..\lib\public\tier1.lib"> + </File> + <File + RelativePath="..\..\lib\public\tier2.lib"> + </File> + <File + RelativePath="..\..\lib\public\vstdlib.lib"> + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/utils/blackmarket/stdafx.cpp b/utils/blackmarket/stdafx.cpp new file mode 100644 index 0000000..7172510 --- /dev/null +++ b/utils/blackmarket/stdafx.cpp @@ -0,0 +1,9 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// stdafx.cpp : source file that includes just the standard includes +// blackmarket.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/utils/blackmarket/stdafx.h b/utils/blackmarket/stdafx.h new file mode 100644 index 0000000..cdaf1b9 --- /dev/null +++ b/utils/blackmarket/stdafx.h @@ -0,0 +1,26 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__BC019BF6_D3B1_4EA1_AA0E_044EEC919C6D__INCLUDED_) +#define AFX_STDAFX_H__BC019BF6_D3B1_4EA1_AA0E_044EEC919C6D__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +// TODO: reference additional headers your program requires here + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__BC019BF6_D3B1_4EA1_AA0E_044EEC919C6D__INCLUDED_)
\ No newline at end of file |