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.
454 lines
12 KiB
454 lines
12 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "cbase.h" |
|
|
|
#include "buy_preset_debug.h" |
|
#include "buy_presets.h" |
|
#include "weapon_csbase.h" |
|
#include "game/client/iviewport.h" |
|
#include "filesystem.h" |
|
#include <vgui/ILocalize.h> |
|
#include <vgui_controls/Controls.h> |
|
#include "c_cs_player.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
BuyPresetManager *TheBuyPresets = NULL; |
|
|
|
#if USE_BUY_PRESETS |
|
//-------------------------------------------------------------------------------------------------------------- |
|
ConVar cl_buy_favorite_quiet( "cl_buy_favorite_quiet", "0", FCVAR_ARCHIVE | FCVAR_CLIENTCMD_CAN_EXECUTE, "Skips the prompt when saving a buy favorite in the buy menu" ); |
|
ConVar cl_buy_favorite_nowarn( "cl_buy_favorite_nowarn", "0", FCVAR_ARCHIVE | FCVAR_CLIENTCMD_CAN_EXECUTE, "Skips the error prompt when saving an invalid buy favorite" ); |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
static void PrintBuyPresetUsage( void ) |
|
{ |
|
if ( TheBuyPresets->GetNumPresets() ) |
|
{ |
|
Msg( "usage: cl_buy_favorite <1...%d>\n", TheBuyPresets->GetNumPresets() ); |
|
for ( int i=0; i<TheBuyPresets->GetNumPresets(); ++i ) |
|
{ |
|
const BuyPreset *preset = TheBuyPresets->GetPreset( i ); |
|
if ( preset && preset->GetName() && preset->GetName()[0] ) |
|
{ |
|
char buffer[64]; |
|
g_pVGuiLocalize->ConvertUnicodeToANSI( preset->GetName(), buffer, sizeof( buffer ) ); |
|
Msg( " %d. %s\n", i+1, buffer ); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
Msg( "cl_buy_favorite: no favorites are defined\n" ); |
|
} |
|
} |
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Callback function for handling the "cl_buy_favorite" command |
|
*/ |
|
CON_COMMAND_F( cl_buy_favorite, "Purchase a favorite weapon/equipment loadout", FCVAR_CLIENTCMD_CAN_EXECUTE ) |
|
{ |
|
if ( !engine->IsConnected() ) |
|
return; |
|
|
|
if ( !TheBuyPresets ) |
|
TheBuyPresets = new BuyPresetManager(); |
|
|
|
if ( args.ArgC() != 2 ) |
|
{ |
|
PRESET_DEBUG( "cl_buy_favorite: no favorite specified\n" ); |
|
PrintBuyPresetUsage(); |
|
return; |
|
} |
|
|
|
int presetIndex = atoi( args[1] ) - 1; |
|
if ( presetIndex < 0 || presetIndex >= TheBuyPresets->GetNumPresets() ) |
|
{ |
|
PRESET_DEBUG( "cl_buy_favorite: favorite %d doesn't exist\n", presetIndex ); |
|
PrintBuyPresetUsage(); |
|
return; |
|
} |
|
|
|
TheBuyPresets->PurchasePreset( presetIndex ); |
|
} |
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Callback function for handling the "cl_buy_favorite_set" command |
|
*/ |
|
CON_COMMAND_F( cl_buy_favorite_set, "Saves the current loadout as a favorite", FCVAR_CLIENTCMD_CAN_EXECUTE ) |
|
{ |
|
if ( !engine->IsConnected() ) |
|
return; |
|
|
|
if ( !TheBuyPresets ) |
|
TheBuyPresets = new BuyPresetManager(); |
|
|
|
if ( args.ArgC() != 2 ) |
|
{ |
|
PRESET_DEBUG( "cl_buy_favorite_set: no favorite specified\n" ); |
|
PrintBuyPresetUsage(); |
|
return; |
|
} |
|
|
|
int presetIndex = atoi( args[ 1 ] ) - 1; |
|
if ( presetIndex < 0 || presetIndex >= TheBuyPresets->GetNumPresets() ) |
|
{ |
|
PRESET_DEBUG( "cl_buy_favorite_set: favorite %d doesn't exist\n", presetIndex ); |
|
PrintBuyPresetUsage(); |
|
return; |
|
} |
|
|
|
const BuyPreset *preset = TheBuyPresets->GetPreset( presetIndex ); |
|
if ( !preset ) |
|
{ |
|
return; |
|
} |
|
|
|
WeaponSet ws; |
|
TheBuyPresets->GetCurrentLoadout( &ws ); |
|
BuyPreset newPreset( *preset ); |
|
newPreset.ReplaceSet( 0, ws ); |
|
|
|
TheBuyPresets->SetPreset( presetIndex, &newPreset ); |
|
TheBuyPresets->Save(); |
|
|
|
C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer(); |
|
if ( pPlayer ) |
|
{ |
|
pPlayer->EmitSound( "BuyPreset.Updated" ); |
|
} |
|
} |
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Callback function for handling the "cl_buy_favorite_reset" command |
|
*/ |
|
void __CmdFunc_BuyPresetsReset(void) |
|
{ |
|
if ( !engine->IsConnected() ) |
|
return; |
|
|
|
if ( !TheBuyPresets ) |
|
TheBuyPresets = new BuyPresetManager(); |
|
|
|
C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer(); |
|
if ( !pPlayer || ( pPlayer->GetTeamNumber() != TEAM_CT && pPlayer->GetTeamNumber() != TEAM_TERRORIST ) ) |
|
{ |
|
return; |
|
} |
|
|
|
TheBuyPresets->ResetEditToDefaults(); |
|
TheBuyPresets->SetPresets( TheBuyPresets->GetEditPresets() ); |
|
TheBuyPresets->Save(); |
|
} |
|
ConCommand cl_buy_favorite_reset( "cl_buy_favorite_reset", __CmdFunc_BuyPresetsReset, "Reset favorite loadouts to the default", FCVAR_CLIENTCMD_CAN_EXECUTE ); |
|
#endif // USE_BUY_PRESETS |
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Creates the BuyPresetManager singleton |
|
*/ |
|
BuyPresetManager::BuyPresetManager() |
|
{ |
|
m_loadedTeam = TEAM_UNASSIGNED; |
|
} |
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Resets the BuyPresetManager, loading BuyPresets from disk. If no presets are defined, it loads the |
|
* default presets instead. |
|
*/ |
|
void BuyPresetManager::VerifyLoadedTeam( void ) |
|
{ |
|
#if USE_BUY_PRESETS |
|
C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer(); |
|
if ( !pPlayer ) |
|
return; |
|
|
|
int playerTeam = pPlayer->GetTeamNumber(); |
|
|
|
if ( playerTeam == m_loadedTeam ) |
|
return; |
|
|
|
if ( playerTeam != TEAM_CT && playerTeam != TEAM_TERRORIST ) |
|
return; |
|
|
|
m_presets.RemoveAll(); |
|
|
|
const char *filename = "cfg/BuyPresets_TER.vdf"; |
|
if ( playerTeam == TEAM_CT ) |
|
{ |
|
filename = "cfg/BuyPresets_CT.vdf"; |
|
} |
|
|
|
KeyValues *data; |
|
KeyValues *presetKey; |
|
data = new KeyValues( "Presets" ); |
|
bool fileExists = data->LoadFromFile( filesystem, filename, NULL ); |
|
|
|
presetKey = data->GetFirstSubKey(); |
|
while ( presetKey ) |
|
{ |
|
BuyPreset preset; |
|
preset.Parse( presetKey ); |
|
m_presets.AddToTail(preset); |
|
|
|
presetKey = presetKey->GetNextKey(); |
|
} |
|
|
|
if ( !m_presets.Count() ) |
|
{ |
|
const char *filename = "cfg/BuyPresetsDefault_TER.vdf"; |
|
if ( playerTeam == TEAM_CT ) |
|
{ |
|
filename = "cfg/BuyPresetsDefault_CT.vdf"; |
|
} |
|
|
|
KeyValues *data; |
|
KeyValues *presetKey; |
|
data = new KeyValues( "Presets" ); |
|
data->LoadFromFile( filesystem, filename, NULL ); |
|
|
|
presetKey = data->GetFirstSubKey(); |
|
while ( presetKey ) |
|
{ |
|
BuyPreset preset; |
|
preset.Parse( presetKey ); |
|
m_presets.AddToTail(preset); |
|
|
|
presetKey = presetKey->GetNextKey(); |
|
} |
|
|
|
data->deleteThis(); |
|
} |
|
|
|
// Guarantee we have at least this many presets, even if they are blank |
|
while ( m_presets.Count() < NUM_PRESETS ) |
|
{ |
|
BuyPreset preset; |
|
m_presets.AddToTail(preset); |
|
} |
|
|
|
data->deleteThis(); |
|
m_editPresets = m_presets; |
|
|
|
if ( !fileExists ) |
|
Save(); |
|
#endif // USE_BUY_PRESETS |
|
} |
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Loads the default presets into the editing presets (e.g. when hitting the "Use Defaults" button) |
|
*/ |
|
void BuyPresetManager::ResetEditToDefaults( void ) |
|
{ |
|
#if USE_BUY_PRESETS |
|
VerifyLoadedTeam(); |
|
|
|
C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer(); |
|
if ( !pPlayer ) |
|
return; |
|
|
|
int playerTeam = pPlayer->GetTeamNumber(); |
|
|
|
if ( playerTeam != TEAM_CT && playerTeam != TEAM_TERRORIST ) |
|
return; |
|
|
|
m_editPresets.RemoveAll(); |
|
|
|
const char *filename = "cfg/BuyPresetsDefault_TER.vdf"; |
|
if ( playerTeam == TEAM_CT ) |
|
{ |
|
filename = "cfg/BuyPresetsDefault_CT.vdf"; |
|
} |
|
|
|
KeyValues *data; |
|
KeyValues *presetKey; |
|
data = new KeyValues( "Presets" ); |
|
data->LoadFromFile( filesystem, filename, NULL ); |
|
|
|
presetKey = data->GetFirstSubKey(); |
|
while ( presetKey ) |
|
{ |
|
BuyPreset preset; |
|
preset.Parse( presetKey ); |
|
m_editPresets.AddToTail(preset); |
|
|
|
presetKey = presetKey->GetNextKey(); |
|
} |
|
|
|
data->deleteThis(); |
|
#endif // USE_BUY_PRESETS |
|
} |
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Saves the current BuyPresets to disk |
|
*/ |
|
void BuyPresetManager::Save() |
|
{ |
|
#if USE_BUY_PRESETS |
|
C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer(); |
|
if ( !pPlayer ) |
|
return; |
|
|
|
const char *filename = "cfg/BuyPresets_TER.vdf"; |
|
switch ( pPlayer->GetTeamNumber() ) |
|
{ |
|
case TEAM_CT: |
|
filename = "cfg/BuyPresets_CT.vdf"; |
|
break; |
|
case TEAM_TERRORIST: |
|
filename = "cfg/BuyPresets_TER.vdf"; |
|
break; |
|
default: |
|
return; // don't bother saving presets unless we're on a team |
|
} |
|
|
|
KeyValues *data = new KeyValues( "Presets" ); |
|
for( int i=0; i<m_presets.Count(); ++i ) |
|
{ |
|
m_presets[i].Save( data ); |
|
} |
|
data->SaveToFile( filesystem, filename, NULL ); |
|
data->deleteThis(); |
|
#endif // USE_BUY_PRESETS |
|
} |
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Returns the specified "live" preset, or NULL if it doesn't exist |
|
*/ |
|
const BuyPreset * BuyPresetManager::GetPreset( int index ) const |
|
{ |
|
if ( index < 0 || index >= m_presets.Count() ) |
|
{ |
|
return NULL; |
|
} |
|
|
|
return &(m_presets[index]); |
|
} |
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
void BuyPresetManager::SetPreset( int index, const BuyPreset *preset ) |
|
{ |
|
if ( index < 0 || index >= m_presets.Count() || !preset ) |
|
{ |
|
return; |
|
} |
|
|
|
m_presets[index] = *preset; |
|
} |
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Returns the specified editing preset, or NULL if it doesn't exist |
|
*/ |
|
BuyPreset * BuyPresetManager::GetEditPreset( int index ) |
|
{ |
|
if ( index < 0 || index >= m_editPresets.Count() ) |
|
{ |
|
return NULL; |
|
} |
|
|
|
return &(m_editPresets[index]); |
|
} |
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Generates and sends buy commands to buy a specific preset |
|
*/ |
|
void BuyPresetManager::PurchasePreset( int presetIndex ) |
|
{ |
|
if ( presetIndex >= 0 && presetIndex < m_presets.Count() ) |
|
{ |
|
const BuyPreset *preset = &(m_presets[presetIndex]); |
|
|
|
int setIndex; |
|
for ( setIndex = 0; setIndex < preset->GetNumSets(); ++setIndex ) |
|
{ |
|
// Try to buy this weapon set. |
|
const WeaponSet *itemSet = preset->GetSet( setIndex ); |
|
if ( itemSet ) |
|
{ |
|
int currentCost; |
|
WeaponSet currentSet; |
|
itemSet->GetCurrent( currentCost, currentSet ); |
|
if ( currentCost > 0 ) |
|
{ |
|
PRESET_DEBUG( "cl_buy_favorite: buying %ls for a total of $%d.\n", |
|
preset->GetName(), |
|
currentCost ); |
|
char buf[BUY_PRESET_COMMAND_LEN]; |
|
currentSet.GenerateBuyCommands( buf ); |
|
|
|
// Send completed string |
|
PRESET_DEBUG( "%s\n", buf ); |
|
engine->ClientCmd( buf ); |
|
return; |
|
} |
|
else if ( currentCost == 0 ) |
|
{ |
|
C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer(); |
|
if ( pPlayer ) |
|
{ |
|
pPlayer->EmitSound( "BuyPreset.AlreadyBought" ); |
|
} |
|
|
|
// We have everything already. Let the player know. |
|
if ( setIndex == 0 ) |
|
{ |
|
PRESET_DEBUG( "cl_buy_favorite: already have a complete %ls set.\n", preset->GetName() ); |
|
} |
|
else |
|
{ |
|
PRESET_DEBUG( "cl_buy_favorite: can't afford anything better from %ls.\n", preset->GetName() ); |
|
} |
|
return; |
|
} |
|
} |
|
} |
|
|
|
C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer(); |
|
if ( pPlayer ) |
|
{ |
|
pPlayer->EmitSound( "BuyPreset.CantBuy" ); |
|
} |
|
|
|
PRESET_DEBUG( "cl_buy_favorite: can't afford anything better from %ls.\n", preset->GetName() ); |
|
return; |
|
} |
|
|
|
// We failed to buy anything. Let the player know. |
|
C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer(); |
|
if ( pPlayer ) |
|
{ |
|
pPlayer->EmitSound( "BuyPreset.CantBuy" ); |
|
} |
|
|
|
PRESET_DEBUG( "cl_buy_favorite: preset %d doesn't exist.\n", presetIndex ); |
|
} |
|
|
|
|
|
//--------------------------------------------------------------------------------------------------------------
|
|
|