summaryrefslogtreecommitdiff
path: root/game/client/cstrike/buy_presets/buy_preset_weapon_info.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/cstrike/buy_presets/buy_preset_weapon_info.cpp')
-rw-r--r--game/client/cstrike/buy_presets/buy_preset_weapon_info.cpp364
1 files changed, 364 insertions, 0 deletions
diff --git a/game/client/cstrike/buy_presets/buy_preset_weapon_info.cpp b/game/client/cstrike/buy_presets/buy_preset_weapon_info.cpp
new file mode 100644
index 0000000..24c4751
--- /dev/null
+++ b/game/client/cstrike/buy_presets/buy_preset_weapon_info.cpp
@@ -0,0 +1,364 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: BuyPresetWeapon implementation, and misc knowledge relating to weapons
+//
+//=============================================================================
+
+#include "cbase.h"
+
+#include "buy_preset_debug.h"
+#include "buy_presets.h"
+#include "weapon_csbase.h"
+#include "cs_ammodef.h"
+#include "cs_gamerules.h"
+#include "cstrike/bot/shared_util.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"
+
+//--------------------------------------------------------------------------------------------------------------
+struct WeaponDisplayNameInfo
+{
+ CSWeaponID id;
+ const char *displayName;
+};
+
+
+//--------------------------------------------------------------------------------------------------------------
+// NOTE: Array must be NULL-terminated
+static WeaponDisplayNameInfo weaponDisplayNameInfo[] =
+{
+ { WEAPON_P228, "#Cstrike_TitlesTXT_P228" },
+ { WEAPON_GLOCK, "#Cstrike_TitlesTXT_Glock18" },
+ { WEAPON_SCOUT, "#Cstrike_TitlesTXT_Scout" },
+ { WEAPON_XM1014, "#Cstrike_TitlesTXT_AutoShotgun" },
+ { WEAPON_MAC10, "#Cstrike_TitlesTXT_Mac10_Short" },
+ { WEAPON_AUG, "#Cstrike_TitlesTXT_Aug" },
+ { WEAPON_ELITE, "#Cstrike_TitlesTXT_Beretta96G" },
+ { WEAPON_FIVESEVEN, "#Cstrike_TitlesTXT_ESFiveSeven" },
+ { WEAPON_UMP45, "#Cstrike_TitlesTXT_KMUMP45" },
+ { WEAPON_SG550, "#Cstrike_TitlesTXT_SG550" },
+ { WEAPON_GALIL, "#Cstrike_TitlesTXT_Galil" },
+ { WEAPON_FAMAS, "#Cstrike_TitlesTXT_Famas" },
+ { WEAPON_USP, "#Cstrike_TitlesTXT_USP45" },
+ { WEAPON_AWP, "#Cstrike_TitlesTXT_ArcticWarfareMagnum" },
+ { WEAPON_MP5NAVY, "#Cstrike_TitlesTXT_mp5navy" },
+ { WEAPON_M249, "#Cstrike_TitlesTXT_ESM249" },
+ { WEAPON_M3, "#Cstrike_TitlesTXT_Leone12" },
+ { WEAPON_M4A1, "#Cstrike_TitlesTXT_M4A1_Short" },
+ { WEAPON_TMP, "#Cstrike_TitlesTXT_tmp" },
+ { WEAPON_G3SG1, "#Cstrike_TitlesTXT_G3SG1" },
+ { WEAPON_DEAGLE, "#Cstrike_TitlesTXT_DesertEagle" },
+ { WEAPON_SG552, "#Cstrike_TitlesTXT_SG552" },
+ { WEAPON_AK47, "#Cstrike_TitlesTXT_AK47" },
+ { WEAPON_P90, "#Cstrike_TitlesTXT_ESC90" },
+ { WEAPON_SHIELDGUN, "#Cstrike_TitlesTXT_TactShield" },
+
+ { WEAPON_NONE, "#Cstrike_CurrentWeapon" }
+};
+
+
+//--------------------------------------------------------------------------------------------------------------
+/**
+ * Returns the display name for a weapon, based on it's weaponID
+ */
+const wchar_t* WeaponIDToDisplayName( CSWeaponID weaponID )
+{
+ for( int i=0; weaponDisplayNameInfo[i].displayName; ++i )
+ if ( weaponDisplayNameInfo[i].id == weaponID )
+ return g_pVGuiLocalize->Find( weaponDisplayNameInfo[i].displayName );
+
+ return NULL;
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------------------------------------
+BuyPresetWeapon::BuyPresetWeapon()
+{
+ m_name = NULL;
+ m_weaponID = WEAPON_NONE;
+ m_ammoType = AMMO_CLIPS;
+ m_ammoAmount = 0;
+ m_fillAmmo = true;
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+BuyPresetWeapon::BuyPresetWeapon( CSWeaponID weaponID )
+{
+ m_name = WeaponIDToDisplayName( weaponID );
+ m_weaponID = weaponID;
+ m_ammoType = AMMO_CLIPS;
+ m_ammoAmount = (weaponID == WEAPON_NONE) ? 0 : 1;
+ m_fillAmmo = true;
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+BuyPresetWeapon& BuyPresetWeapon::operator= (const BuyPresetWeapon& other)
+{
+ m_name = other.m_name;
+ m_weaponID = other.m_weaponID;
+ m_ammoType = other.m_ammoType;
+ m_ammoAmount = other.m_ammoAmount;
+ m_fillAmmo = other.m_fillAmmo;
+
+ return *this;
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+/**
+ * Sets the WEAPON_* weapon ID (and resets ammo, etc)
+ */
+void BuyPresetWeapon::SetWeaponID( CSWeaponID weaponID )
+{
+ m_name = WeaponIDToDisplayName( weaponID );
+ m_weaponID = weaponID;
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+/**
+ * Returns the number of clips that will have to be bought for the specified BuyPresetWeapon
+ */
+int CalcClipsNeeded( const BuyPresetWeapon *pWeapon, const CCSWeaponInfo *pInfo, const int ammo[MAX_AMMO_TYPES] )
+{
+ if ( !pWeapon || !pInfo )
+ return 0;
+
+ int maxRounds = GetCSAmmoDef()->MaxCarry( pInfo->iAmmoType );
+ int buySize = GetCSAmmoDef()->GetBuySize( pInfo->iAmmoType );
+
+ int numClips = 0;
+ if ( buySize && pInfo->iAmmoType >= 0 )
+ {
+ switch ( pWeapon->GetAmmoType() )
+ {
+ case AMMO_CLIPS:
+ numClips = pWeapon->GetAmmoAmount();
+ if ( pWeapon->GetWeaponID() == WEAPON_NONE && numClips >= 4 )
+ {
+ numClips = ceil(maxRounds/(float)buySize);
+ }
+ numClips = MIN( ceil(maxRounds/(float)buySize), numClips );
+
+ numClips -= ammo[pInfo->iAmmoType]/buySize;
+ if ( numClips < 0 || ammo[pInfo->iAmmoType] == maxRounds )
+ {
+ numClips = 0;
+ }
+ break;
+ case AMMO_ROUNDS:
+ {
+ int roundsNeeded = pWeapon->GetAmmoAmount() - ammo[pInfo->iAmmoType];
+ if ( roundsNeeded > 0 )
+ {
+ numClips = ceil(roundsNeeded/(float)buySize);
+ }
+ else
+ {
+ numClips = 0;
+ }
+ }
+ break;
+ case AMMO_PERCENT:
+ {
+ int roundsNeeded = maxRounds*pWeapon->GetAmmoAmount() - ammo[pInfo->iAmmoType];
+ roundsNeeded *= 0.01f;
+ if ( roundsNeeded > 0 )
+ {
+ numClips = ceil(roundsNeeded/(float)buySize);
+ }
+ else
+ {
+ numClips = 0;
+ }
+ }
+ break;
+ }
+ }
+ return numClips;
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+/**
+ * Returns true if the client can currently buy the weapon according to class/gamemode restrictions. Returns
+ * true also if the player owns the weapon already.
+ */
+bool CanBuyWeapon( CSWeaponID currentPrimaryID, CSWeaponID currentSecondaryID, CSWeaponID weaponID )
+{
+ if ( currentPrimaryID == WEAPON_SHIELDGUN && weaponID == WEAPON_ELITE )
+ {
+ return false;
+ }
+
+ if ( currentSecondaryID == WEAPON_ELITE && weaponID == WEAPON_SHIELDGUN )
+ {
+ return false;
+ }
+
+ C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer();
+ if ( !pPlayer )
+ return false;
+
+ CCSWeaponInfo *info = GetWeaponInfo( weaponID );
+ if ( !info )
+ return false;
+
+ /// @TODO: assasination maps have a specific set of weapons that can be used in them.
+ if ( info->m_iTeam != TEAM_UNASSIGNED && pPlayer->GetTeamNumber() != info->m_iTeam )
+ return false;
+
+ return true;
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+/**
+ * Returns true if the CSWeaponType is a primary class
+ */
+static bool IsPrimaryWeaponClassID( CSWeaponType classId )
+{
+ switch (classId)
+ {
+ case WEAPONTYPE_SUBMACHINEGUN:
+ case WEAPONTYPE_SHOTGUN:
+ case WEAPONTYPE_MACHINEGUN:
+ case WEAPONTYPE_RIFLE:
+ case WEAPONTYPE_SNIPER_RIFLE:
+ return true;
+ }
+
+ return false;
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+/**
+ * Returns true if the weapon ID is for a primary weapon
+ */
+static bool IsPrimaryWeaponID( CSWeaponID id )
+{
+ if ( id == WEAPON_SHIELDGUN )
+ return true;
+
+ CCSWeaponInfo *info = GetWeaponInfo( id );
+ if ( !info )
+ return false;
+
+ return IsPrimaryWeaponClassID( info->m_WeaponType );
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+/**
+ * Returns true if the CSWeaponType is a secondary class
+ */
+static bool IsSecondaryWeaponClassID( CSWeaponType classId )
+{
+ return (classId == WEAPONTYPE_PISTOL);
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+/**
+ * Returns true if the weapon ID is for a secondary weapon
+ */
+static bool IsSecondaryWeaponID( CSWeaponID id )
+{
+ if ( id == WEAPON_SHIELDGUN )
+ return false;
+
+ CCSWeaponInfo *info = GetWeaponInfo( id );
+ if ( !info )
+ return false;
+
+ return IsSecondaryWeaponClassID( info->m_WeaponType );
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+/**
+ * Fills the ammo array with the ammo currently owned by the local player
+ */
+void FillClientAmmo( int ammo[MAX_AMMO_TYPES] )
+{
+ int i;
+ for ( i=0; i<MAX_AMMO_TYPES; ++i )
+ {
+ ammo[i] = 0;
+ }
+
+ C_CSPlayer *localPlayer = CCSPlayer::GetLocalCSPlayer();
+ if ( !localPlayer )
+ return;
+
+ for ( i=0; i<WEAPON_MAX; ++i )
+ {
+ CSWeaponID gameWeaponID = (CSWeaponID)i;
+ if ( gameWeaponID == WEAPON_NONE || gameWeaponID >= WEAPON_SHIELDGUN )
+ continue;
+
+ const CCSWeaponInfo *info = GetWeaponInfo( gameWeaponID );
+ if ( !info )
+ continue;
+
+ int clientAmmoType = info->iAmmoType;
+ int clientAmmoCount = localPlayer->GetAmmoCount( clientAmmoType );
+ if ( clientAmmoCount > 0 )
+ {
+ ammo[ clientAmmoType ] = MAX( ammo[ clientAmmoType ], clientAmmoCount );
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: returns the weapon in the specified slot
+//-----------------------------------------------------------------------------
+CWeaponCSBase *GetWeaponInSlot( int iSlot, int iSlotPos )
+{
+ C_CSPlayer *player = C_CSPlayer::GetLocalCSPlayer();
+ if ( !player )
+ return NULL;
+
+ for ( int i = 0; i < MAX_WEAPONS; i++ )
+ {
+ CWeaponCSBase *pWeapon = dynamic_cast< CWeaponCSBase * >(player->GetWeapon(i));
+
+ if ( pWeapon == NULL )
+ continue;
+
+ if ( pWeapon->GetSlot() == iSlot && pWeapon->GetPosition() == iSlotPos )
+ return pWeapon;
+ }
+
+ return NULL;
+}
+
+
+//--------------------------------------------------------------------------------------------------------------
+/**
+ * Returns the client's WEAPON_* value for the currently owned weapon, or WEAPON_NONE if no weapon is owned
+ */
+CSWeaponID GetClientWeaponID( bool primary )
+{
+ C_CSPlayer *localPlayer = CCSPlayer::GetLocalCSPlayer();
+ if ( !localPlayer )
+ return WEAPON_NONE;
+
+ int slot = (primary)?0:1;
+ CWeaponCSBase *pWeapon = GetWeaponInSlot( slot, slot );
+ if ( !pWeapon )
+ return WEAPON_NONE;
+
+ return pWeapon->GetWeaponID();
+}
+
+//--------------------------------------------------------------------------------------------------------------