summaryrefslogtreecommitdiff
path: root/game/client/cstrike/buy_presets/buy_presets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/cstrike/buy_presets/buy_presets.cpp')
-rw-r--r--game/client/cstrike/buy_presets/buy_presets.cpp454
1 files changed, 454 insertions, 0 deletions
diff --git a/game/client/cstrike/buy_presets/buy_presets.cpp b/game/client/cstrike/buy_presets/buy_presets.cpp
new file mode 100644
index 0000000..7badf8f
--- /dev/null
+++ b/game/client/cstrike/buy_presets/buy_presets.cpp
@@ -0,0 +1,454 @@
+//========= 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 );
+}
+
+
+//--------------------------------------------------------------------------------------------------------------