diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf/tf_weapon_parse.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/tf/tf_weapon_parse.cpp')
| -rw-r--r-- | game/shared/tf/tf_weapon_parse.cpp | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/game/shared/tf/tf_weapon_parse.cpp b/game/shared/tf/tf_weapon_parse.cpp new file mode 100644 index 0000000..37fec27 --- /dev/null +++ b/game/shared/tf/tf_weapon_parse.cpp @@ -0,0 +1,231 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= +#include "cbase.h" +#include <KeyValues.h> +#include "tf_weapon_parse.h" +#include "tf_shareddefs.h" +#include "tf_playerclass_shared.h" + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +FileWeaponInfo_t *CreateWeaponInfo() +{ + return new CTFWeaponInfo; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CTFWeaponInfo::CTFWeaponInfo() +{ + m_WeaponData[0].Init(); + m_WeaponData[1].Init(); + + m_bGrenade = false; + m_flDamageRadius = 0.0f; + m_flPrimerTime = 0.0f; + m_bSuppressGrenTimer = false; + m_bLowerWeapon = false; + + m_bHasTeamSkins_Viewmodel = false; + m_bHasTeamSkins_Worldmodel = false; + + m_szMuzzleFlashModel[0] = '\0'; + m_flMuzzleFlashModelDuration = 0; + m_szMuzzleFlashParticleEffect[0] = '\0'; + + m_szTracerEffect[0] = '\0'; + + m_szBrassModel[0] = '\0'; + m_bDoInstantEjectBrass = true; + + m_szExplosionSound[0] = '\0'; + m_szExplosionEffect[0] = '\0'; + m_szExplosionPlayerEffect[0] = '\0'; + m_szExplosionWaterEffect[0] = '\0'; + + m_iWeaponType = TF_WPN_TYPE_PRIMARY; +} + +CTFWeaponInfo::~CTFWeaponInfo() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFWeaponInfo::Parse( KeyValues *pKeyValuesData, const char *szWeaponName ) +{ + int i; + + BaseClass::Parse( pKeyValuesData, szWeaponName ); + + // Primary fire mode. + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_nDamage = pKeyValuesData->GetInt( "Damage", 0 ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flRange = pKeyValuesData->GetFloat( "Range", 8192.0f ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_nBulletsPerShot = pKeyValuesData->GetInt( "BulletsPerShot", 0 ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flSpread = pKeyValuesData->GetFloat( "Spread", 0.0f ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flPunchAngle = pKeyValuesData->GetFloat( "PunchAngle", 0.0f ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flTimeFireDelay = pKeyValuesData->GetFloat( "TimeFireDelay", 0.0f ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flTimeIdle = pKeyValuesData->GetFloat( "TimeIdle", 0.0f ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flTimeIdleEmpty = pKeyValuesData->GetFloat( "TimeIdleEmpy", 0.0f ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flTimeReloadStart = pKeyValuesData->GetFloat( "TimeReloadStart", 0.0f ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flTimeReload = pKeyValuesData->GetFloat( "TimeReload", 0.0f ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_bDrawCrosshair = pKeyValuesData->GetInt( "DrawCrosshair", 1 ) > 0; + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_iAmmoPerShot = pKeyValuesData->GetInt( "AmmoPerShot", 1 ); + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_bUseRapidFireCrits = ( pKeyValuesData->GetInt( "UseRapidFireCrits", 0 ) != 0 ); + + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_iProjectile = TF_PROJECTILE_NONE; + const char *pszProjectileType = pKeyValuesData->GetString( "ProjectileType", "projectile_none" ); + + for ( i=0;i<TF_NUM_PROJECTILES;i++ ) + { + if ( FStrEq( pszProjectileType, g_szProjectileNames[i] ) ) + { + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_iProjectile = i; + break; + } + } + + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flProjectileSpeed = pKeyValuesData->GetFloat( "ProjectileSpeed", 0.0f ); + + m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flSmackDelay = pKeyValuesData->GetFloat( "SmackDelay", 0.2f ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_flSmackDelay = pKeyValuesData->GetFloat( "Secondary_SmackDelay", 0.2f ); + + m_bDoInstantEjectBrass = ( pKeyValuesData->GetInt( "DoInstantEjectBrass", 1 ) != 0 ); + const char *pszBrassModel = pKeyValuesData->GetString( "BrassModel", NULL ); + if ( pszBrassModel ) + { + Q_strncpy( m_szBrassModel, pszBrassModel, sizeof( m_szBrassModel ) ); + } + + // Secondary fire mode. + // Inherit from primary fire mode + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_nDamage = pKeyValuesData->GetInt( "Secondary_Damage", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_nDamage ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_flRange = pKeyValuesData->GetFloat( "Secondary_Range", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flRange ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_nBulletsPerShot = pKeyValuesData->GetInt( "Secondary_BulletsPerShot", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_nBulletsPerShot ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_flSpread = pKeyValuesData->GetFloat( "Secondary_Spread", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flSpread ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_flPunchAngle = pKeyValuesData->GetFloat( "Secondary_PunchAngle", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flPunchAngle ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_flTimeFireDelay = pKeyValuesData->GetFloat( "Secondary_TimeFireDelay", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flTimeFireDelay ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_flTimeIdle = pKeyValuesData->GetFloat( "Secondary_TimeIdle", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flTimeIdle ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_flTimeIdleEmpty = pKeyValuesData->GetFloat( "Secondary_TimeIdleEmpy", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flTimeIdleEmpty ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_flTimeReloadStart = pKeyValuesData->GetFloat( "Secondary_TimeReloadStart", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flTimeReloadStart ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_flTimeReload = pKeyValuesData->GetFloat( "Secondary_TimeReload", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_flTimeReload ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_bDrawCrosshair = pKeyValuesData->GetInt( "Secondary_DrawCrosshair", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_bDrawCrosshair ) > 0; + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_iAmmoPerShot = pKeyValuesData->GetInt( "Secondary_AmmoPerShot", m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_iAmmoPerShot ); + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_bUseRapidFireCrits = ( pKeyValuesData->GetInt( "Secondary_UseRapidFireCrits", 0 ) != 0 ); + + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_iProjectile = m_WeaponData[TF_WEAPON_PRIMARY_MODE].m_iProjectile; + pszProjectileType = pKeyValuesData->GetString( "Secondary_ProjectileType", "projectile_none" ); + + for ( i=0;i<TF_NUM_PROJECTILES;i++ ) + { + if ( FStrEq( pszProjectileType, g_szProjectileNames[i] ) ) + { + m_WeaponData[TF_WEAPON_SECONDARY_MODE].m_iProjectile = i; + break; + } + } + + const char *pszWeaponType = pKeyValuesData->GetString( "WeaponType" ); + + if ( !Q_strcmp( pszWeaponType, "primary" ) ) + { + m_iWeaponType = TF_WPN_TYPE_PRIMARY; + } + else if ( !Q_strcmp( pszWeaponType, "secondary" ) ) + { + m_iWeaponType = TF_WPN_TYPE_SECONDARY; + } + else if ( !Q_strcmp( pszWeaponType, "melee" ) ) + { + m_iWeaponType = TF_WPN_TYPE_MELEE; + } + else if ( !Q_strcmp( pszWeaponType, "grenade" ) ) + { + m_iWeaponType = TF_WPN_TYPE_GRENADE; + } + else if ( !Q_strcmp( pszWeaponType, "building" ) ) + { + m_iWeaponType = TF_WPN_TYPE_BUILDING; + } + else if ( !Q_strcmp( pszWeaponType, "pda" ) ) + { + m_iWeaponType = TF_WPN_TYPE_PDA; + } + else if ( !Q_strcmp( pszWeaponType, "item1" ) ) + { + m_iWeaponType = TF_WPN_TYPE_ITEM1; + } + else if ( !Q_strcmp( pszWeaponType, "item2" ) ) + { + m_iWeaponType = TF_WPN_TYPE_ITEM2; + } + + // Grenade data. + m_bGrenade = ( pKeyValuesData->GetInt( "Grenade", 0 ) != 0 ); + m_flDamageRadius = pKeyValuesData->GetFloat( "DamageRadius", 0.0f ); + m_flPrimerTime = pKeyValuesData->GetFloat( "PrimerTime", 0.0f ); + m_bSuppressGrenTimer = ( pKeyValuesData->GetInt( "PlayGrenTimer", 1 ) <= 0 ); + + m_bLowerWeapon = ( pKeyValuesData->GetInt( "LowerMainWeapon", 0 ) != 0 ); + m_bHasTeamSkins_Viewmodel = ( pKeyValuesData->GetInt( "HasTeamSkins_Viewmodel", 0 ) != 0 ); + m_bHasTeamSkins_Worldmodel = ( pKeyValuesData->GetInt( "HasTeamSkins_Worldmodel", 0 ) != 0 ); + + // Model muzzleflash + const char *pszMuzzleFlashModel = pKeyValuesData->GetString( "MuzzleFlashModel", NULL ); + + if ( pszMuzzleFlashModel ) + { + Q_strncpy( m_szMuzzleFlashModel, pszMuzzleFlashModel, sizeof( m_szMuzzleFlashModel ) ); + } + + m_flMuzzleFlashModelDuration = pKeyValuesData->GetFloat( "MuzzleFlashModelDuration", 0.2 ); + + const char *pszMuzzleFlashParticleEffect = pKeyValuesData->GetString( "MuzzleFlashParticleEffect", NULL ); + + if ( pszMuzzleFlashParticleEffect ) + { + Q_strncpy( m_szMuzzleFlashParticleEffect, pszMuzzleFlashParticleEffect, sizeof( m_szMuzzleFlashParticleEffect ) ); + } + + // Tracer particle effect + const char *pszTracerEffect = pKeyValuesData->GetString( "TracerEffect", NULL ); + + if ( pszTracerEffect ) + { + Q_strncpy( m_szTracerEffect, pszTracerEffect, sizeof( m_szTracerEffect ) ); + } + + + // Explosion effects (used for grenades) + const char *pszSound = pKeyValuesData->GetString( "ExplosionSound", NULL ); + if ( pszSound ) + { + Q_strncpy( m_szExplosionSound, pszSound, sizeof( m_szExplosionSound ) ); + } + + const char *pszEffect = pKeyValuesData->GetString( "ExplosionEffect", NULL ); + if ( pszEffect ) + { + Q_strncpy( m_szExplosionEffect, pszEffect, sizeof( m_szExplosionEffect ) ); + } + + pszEffect = pKeyValuesData->GetString( "ExplosionPlayerEffect", NULL ); + if ( pszEffect ) + { + Q_strncpy( m_szExplosionPlayerEffect, pszEffect, sizeof( m_szExplosionPlayerEffect ) ); + } + + pszEffect = pKeyValuesData->GetString( "ExplosionWaterEffect", NULL ); + if ( pszEffect ) + { + Q_strncpy( m_szExplosionWaterEffect, pszEffect, sizeof( m_szExplosionWaterEffect ) ); + } + + m_bDontDrop = ( pKeyValuesData->GetInt( "DontDrop", 0 ) > 0 ); +} |