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.
270 lines
7.0 KiB
270 lines
7.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Weapons Resource implementation |
|
// |
|
// $Workfile: $ |
|
// $Date: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "history_resource.h" |
|
#include <vgui_controls/Controls.h> |
|
#include <vgui/ISurface.h> |
|
#include "c_baseplayer.h" |
|
#include "hud.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
WeaponsResource gWR; |
|
|
|
void FreeHudTextureList( CUtlDict< CHudTexture *, int >& list ); |
|
|
|
static CHudTexture *FindHudTextureInDict( CUtlDict< CHudTexture *, int >& list, const char *psz ) |
|
{ |
|
int idx = list.Find( psz ); |
|
if ( idx == list.InvalidIndex() ) |
|
return NULL; |
|
|
|
return list[ idx ]; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Output : |
|
//----------------------------------------------------------------------------- |
|
WeaponsResource::WeaponsResource( void ) |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Output : |
|
//----------------------------------------------------------------------------- |
|
WeaponsResource::~WeaponsResource( void ) |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void WeaponsResource::Init( void ) |
|
{ |
|
Reset(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void WeaponsResource::Reset( void ) |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Load all the sprites needed for all registered weapons |
|
//----------------------------------------------------------------------------- |
|
void WeaponsResource::LoadAllWeaponSprites( void ) |
|
{ |
|
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); |
|
if ( !player ) |
|
return; |
|
|
|
for (int i = 0; i < MAX_WEAPONS; i++) |
|
{ |
|
if ( player->GetWeapon(i) ) |
|
{ |
|
LoadWeaponSprites( player->GetWeapon(i)->GetWeaponFileInfoHandle() ); |
|
} |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void WeaponsResource::LoadWeaponSprites( WEAPON_FILE_INFO_HANDLE hWeaponFileInfo ) |
|
{ |
|
// WeaponsResource is a friend of C_BaseCombatWeapon |
|
FileWeaponInfo_t *pWeaponInfo = GetFileWeaponInfoFromHandle( hWeaponFileInfo ); |
|
|
|
if ( !pWeaponInfo ) |
|
return; |
|
|
|
// Already parsed the hud elements? |
|
if ( pWeaponInfo->bLoadedHudElements ) |
|
return; |
|
|
|
pWeaponInfo->bLoadedHudElements = true; |
|
|
|
pWeaponInfo->iconActive = NULL; |
|
pWeaponInfo->iconInactive = NULL; |
|
pWeaponInfo->iconAmmo = NULL; |
|
pWeaponInfo->iconAmmo2 = NULL; |
|
pWeaponInfo->iconCrosshair = NULL; |
|
pWeaponInfo->iconAutoaim = NULL; |
|
pWeaponInfo->iconSmall = NULL; |
|
|
|
char sz[128]; |
|
Q_snprintf(sz, sizeof( sz ), "scripts/%s", pWeaponInfo->szClassName); |
|
|
|
CUtlDict< CHudTexture *, int > tempList; |
|
|
|
LoadHudTextures( tempList, sz, g_pGameRules->GetEncryptionKey() ); |
|
|
|
if ( !tempList.Count() ) |
|
{ |
|
// no sprite description file for weapon, use default small blocks |
|
pWeaponInfo->iconActive = gHUD.GetIcon( "selection" ); |
|
pWeaponInfo->iconInactive = gHUD.GetIcon( "selection" ); |
|
pWeaponInfo->iconAmmo = gHUD.GetIcon( "bucket1" ); |
|
return; |
|
} |
|
|
|
CHudTexture *p; |
|
p = FindHudTextureInDict( tempList, "crosshair" ); |
|
if ( p ) |
|
{ |
|
pWeaponInfo->iconCrosshair = gHUD.AddUnsearchableHudIconToList( *p ); |
|
} |
|
|
|
p = FindHudTextureInDict( tempList, "autoaim" ); |
|
if ( p ) |
|
{ |
|
pWeaponInfo->iconAutoaim = gHUD.AddUnsearchableHudIconToList( *p ); |
|
} |
|
|
|
p = FindHudTextureInDict( tempList, "zoom" ); |
|
if ( p ) |
|
{ |
|
pWeaponInfo->iconZoomedCrosshair = gHUD.AddUnsearchableHudIconToList( *p ); |
|
} |
|
else |
|
{ |
|
pWeaponInfo->iconZoomedCrosshair = pWeaponInfo->iconCrosshair; //default to non-zoomed crosshair |
|
} |
|
|
|
p = FindHudTextureInDict( tempList, "zoom_autoaim" ); |
|
if ( p ) |
|
{ |
|
pWeaponInfo->iconZoomedAutoaim = gHUD.AddUnsearchableHudIconToList( *p ); |
|
} |
|
else |
|
{ |
|
pWeaponInfo->iconZoomedAutoaim = pWeaponInfo->iconZoomedCrosshair; //default to zoomed crosshair |
|
} |
|
|
|
CHudHistoryResource *pHudHR = GET_HUDELEMENT( CHudHistoryResource ); |
|
if( pHudHR ) |
|
{ |
|
p = FindHudTextureInDict( tempList, "weapon" ); |
|
if ( p ) |
|
{ |
|
pWeaponInfo->iconInactive = gHUD.AddUnsearchableHudIconToList( *p ); |
|
if ( pWeaponInfo->iconInactive ) |
|
{ |
|
pWeaponInfo->iconInactive->Precache(); |
|
pHudHR->SetHistoryGap( pWeaponInfo->iconInactive->Height() ); |
|
} |
|
} |
|
|
|
p = FindHudTextureInDict( tempList, "weapon_s" ); |
|
if ( p ) |
|
{ |
|
pWeaponInfo->iconActive = gHUD.AddUnsearchableHudIconToList( *p ); |
|
if ( pWeaponInfo->iconActive ) |
|
{ |
|
pWeaponInfo->iconActive->Precache(); |
|
} |
|
} |
|
|
|
p = FindHudTextureInDict( tempList, "weapon_small" ); |
|
if ( p ) |
|
{ |
|
pWeaponInfo->iconSmall = gHUD.AddUnsearchableHudIconToList( *p ); |
|
if ( pWeaponInfo->iconSmall ) |
|
{ |
|
pWeaponInfo->iconSmall->Precache(); |
|
} |
|
} |
|
|
|
p = FindHudTextureInDict( tempList, "ammo" ); |
|
if ( p ) |
|
{ |
|
pWeaponInfo->iconAmmo = gHUD.AddUnsearchableHudIconToList( *p ); |
|
if ( pWeaponInfo->iconAmmo ) |
|
{ |
|
pWeaponInfo->iconAmmo->Precache(); |
|
pHudHR->SetHistoryGap( pWeaponInfo->iconAmmo->Height() ); |
|
} |
|
} |
|
|
|
p = FindHudTextureInDict( tempList, "ammo2" ); |
|
if ( p ) |
|
{ |
|
pWeaponInfo->iconAmmo2 = gHUD.AddUnsearchableHudIconToList( *p ); |
|
if ( pWeaponInfo->iconAmmo2 ) |
|
{ |
|
pWeaponInfo->iconAmmo2->Precache(); |
|
pHudHR->SetHistoryGap( pWeaponInfo->iconAmmo2->Height() ); |
|
} |
|
} |
|
} |
|
|
|
FreeHudTextureList( tempList ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Helper function to return a Ammo pointer from id |
|
//----------------------------------------------------------------------------- |
|
CHudTexture *WeaponsResource::GetAmmoIconFromWeapon( int iAmmoId ) |
|
{ |
|
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); |
|
if ( !player ) |
|
return NULL; |
|
|
|
for ( int i = 0; i < MAX_WEAPONS; i++ ) |
|
{ |
|
C_BaseCombatWeapon *weapon = player->GetWeapon( i ); |
|
if ( !weapon ) |
|
continue; |
|
|
|
if ( weapon->GetPrimaryAmmoType() == iAmmoId ) |
|
{ |
|
return weapon->GetWpnData().iconAmmo; |
|
} |
|
else if ( weapon->GetSecondaryAmmoType() == iAmmoId ) |
|
{ |
|
return weapon->GetWpnData().iconAmmo2; |
|
} |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Get a pointer to a weapon using this ammo |
|
//----------------------------------------------------------------------------- |
|
const FileWeaponInfo_t *WeaponsResource::GetWeaponFromAmmo( int iAmmoId ) |
|
{ |
|
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); |
|
if ( !player ) |
|
return NULL; |
|
|
|
for ( int i = 0; i < MAX_WEAPONS; i++ ) |
|
{ |
|
C_BaseCombatWeapon *weapon = player->GetWeapon( i ); |
|
if ( !weapon ) |
|
continue; |
|
|
|
if ( weapon->GetPrimaryAmmoType() == iAmmoId ) |
|
{ |
|
return &weapon->GetWpnData(); |
|
} |
|
else if ( weapon->GetSecondaryAmmoType() == iAmmoId ) |
|
{ |
|
return &weapon->GetWpnData(); |
|
} |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
|