mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-29 17:43:01 +00:00
455 lines
12 KiB
C++
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 );
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------------------
|