source-engine/game/client/cstrike/buy_presets/buy_presets.cpp
FluorescentCIAAfricanAmerican 3bf9df6b27 1
2020-04-22 12:56:21 -04:00

455 lines
12 KiB
C++

//========= 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 );
}
//--------------------------------------------------------------------------------------------------------------