mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-14 12:46:58 +00:00
1
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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_)
|
||||
Reference in New Issue
Block a user