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_bottle.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_bottle.cpp')
| -rw-r--r-- | game/shared/tf/tf_weapon_bottle.cpp | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/game/shared/tf/tf_weapon_bottle.cpp b/game/shared/tf/tf_weapon_bottle.cpp new file mode 100644 index 0000000..05b2054 --- /dev/null +++ b/game/shared/tf/tf_weapon_bottle.cpp @@ -0,0 +1,286 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#include "cbase.h" +#include "tf_weapon_bottle.h" +#include "decals.h" + +// Client specific. +#ifdef CLIENT_DLL +#include "c_tf_player.h" +// Server specific. +#else +#include "tf_player.h" +#include "tf_fx.h" +#include "tf_gamerules.h" +#endif + +//============================================================================= +// +// Weapon Bottle tables. +// +IMPLEMENT_NETWORKCLASS_ALIASED( TFBottle, DT_TFWeaponBottle ) + +BEGIN_NETWORK_TABLE( CTFBottle, DT_TFWeaponBottle ) +#if defined( CLIENT_DLL ) + RecvPropBool( RECVINFO( m_bBroken ) ) +#else + SendPropBool( SENDINFO( m_bBroken ) ) +#endif +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFBottle ) +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( tf_weapon_bottle, CTFBottle ); +PRECACHE_WEAPON_REGISTER( tf_weapon_bottle ); + +//============================================================================= +// +// Weapon Stickbomb tables. +// +IMPLEMENT_NETWORKCLASS_ALIASED( TFStickBomb, DT_TFWeaponStickBomb ) + +#ifdef CLIENT_DLL +void RecvProxy_Detonated( const CRecvProxyData *pData, void *pStruct, void *pOut ); +#endif + +BEGIN_NETWORK_TABLE( CTFStickBomb, DT_TFWeaponStickBomb ) +#if defined( CLIENT_DLL ) + RecvPropInt( RECVINFO( m_iDetonated ), 0, RecvProxy_Detonated ) +#else + SendPropInt( SENDINFO( m_iDetonated ), 1, SPROP_UNSIGNED ) +#endif +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFStickBomb ) +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( tf_weapon_stickbomb, CTFStickBomb ); +PRECACHE_WEAPON_REGISTER( tf_weapon_stickbomb ); + +#ifdef STAGING_ONLY +#define TF_WEAPON_STICKBOMB_NORMAL_MODEL "models/workshop/weapons/c_models/c_caber/c_caber.mdl" +#define TF_WEAPON_STICKBOMB_BROKEN_MODEL "models/workshop/weapons/c_models/c_caber/c_caber_exploded.mdl" +#else +#define TF_WEAPON_STICKBOMB_NORMAL_MODEL "models/weapons/c_models/c_caber/c_caber.mdl" +#define TF_WEAPON_STICKBOMB_BROKEN_MODEL "models/weapons/c_models/c_caber/c_caber_exploded.mdl" +#endif + +//============================================================================= + +#define TF_BOTTLE_SWITCHGROUP 1 +#define TF_BOTTLE_NOTBROKEN 0 +#define TF_BOTTLE_BROKEN 1 + +//============================================================================= +// +// Weapon Bottle functions. +// + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CTFBottle::CTFBottle() +{ +} + +void CTFBottle::WeaponReset( void ) +{ + BaseClass::WeaponReset(); + + m_bBroken = false; +} + +bool CTFBottle::DefaultDeploy( char *szViewModel, char *szWeaponModel, int iActivity, char *szAnimExt ) +{ + bool bRet = BaseClass::DefaultDeploy( szViewModel, szWeaponModel, iActivity, szAnimExt ); + + if ( bRet ) + { + SwitchBodyGroups(); + } + + return bRet; +} + +void CTFBottle::SwitchBodyGroups( void ) +{ + int iState = 0; + + if ( m_bBroken == true ) + { + iState = 1; + } + + SetBodygroup( TF_BOTTLE_SWITCHGROUP, iState ); + + CTFPlayer *pTFPlayer = ToTFPlayer( GetOwner() ); + + if ( pTFPlayer && pTFPlayer->GetActiveWeapon() == this ) + { + if ( pTFPlayer->GetViewModel() ) + { + pTFPlayer->GetViewModel()->SetBodygroup( TF_BOTTLE_SWITCHGROUP, iState ); + } + } +} + +void CTFBottle::Smack( void ) +{ + BaseClass::Smack(); + + if ( ConnectedHit() && IsCurrentAttackACrit() ) + { + m_bBroken = true; + SwitchBodyGroups(); + } +} + +CTFStickBomb::CTFStickBomb() +: CTFBottle() +{ + m_iDetonated = 0; +} + +void CTFStickBomb::Precache( void ) +{ + BaseClass::Precache(); + + PrecacheModel( TF_WEAPON_STICKBOMB_NORMAL_MODEL ); + PrecacheModel( TF_WEAPON_STICKBOMB_BROKEN_MODEL ); +} + +void CTFStickBomb::Smack( void ) +{ + CTFWeaponBaseMelee::Smack(); + + // Stick bombs detonate once, on impact. + if ( m_iDetonated == 0 && ConnectedHit() ) + { + m_iDetonated = 1; + m_bBroken = true; + SwitchBodyGroups(); + +#ifdef GAME_DLL + CTFPlayer *pTFPlayer = ToTFPlayer( GetOwner() ); + if ( pTFPlayer ) + { + Vector vecForward; + AngleVectors( pTFPlayer->EyeAngles(), &vecForward ); + Vector vecSwingStart = pTFPlayer->Weapon_ShootPosition(); + Vector vecSwingEnd = vecSwingStart + vecForward * GetSwingRange(); + + Vector explosion = vecSwingStart; + + CPVSFilter filter( explosion ); + + // Halloween Spell + int iHalloweenSpell = 0; + int iCustomParticleIndex = INVALID_STRING_INDEX; + if ( TF_IsHolidayActive( kHoliday_HalloweenOrFullMoon ) ) + { + CALL_ATTRIB_HOOK_INT_ON_OTHER( this, iHalloweenSpell, halloween_pumpkin_explosions ); + if ( iHalloweenSpell > 0 ) + { + iCustomParticleIndex = GetParticleSystemIndex( "halloween_explosion" ); + } + } + + TE_TFExplosion( filter, 0.0f, explosion, Vector(0,0,1), TF_WEAPON_GRENADELAUNCHER, pTFPlayer->entindex(), -1, SPECIAL1, iCustomParticleIndex ); + + int dmgType = DMG_BLAST | DMG_USEDISTANCEMOD; + if ( IsCurrentAttackACrit() ) + dmgType |= DMG_CRITICAL; + + CTakeDamageInfo info( pTFPlayer, pTFPlayer, this, explosion, explosion, 75.0f, dmgType, TF_DMG_CUSTOM_STICKBOMB_EXPLOSION, &explosion ); + CTFRadiusDamageInfo radiusinfo( &info, explosion, 100.f ); + TFGameRules()->RadiusDamage( radiusinfo ); + } +#endif + } +} + +void CTFStickBomb::WeaponReset( void ) +{ + BaseClass::WeaponReset(); + + m_iDetonated = 0; + + SwitchBodyGroups(); +} + +void CTFStickBomb::WeaponRegenerate( void ) +{ + BaseClass::WeaponRegenerate(); + + m_iDetonated = 0; + + SetContextThink( &CTFStickBomb::SwitchBodyGroups, gpGlobals->curtime + 0.01f, "SwitchBodyGroups" ); +} + +void CTFStickBomb::SwitchBodyGroups( void ) +{ +#ifdef CLIENT_DLL + if ( !GetViewmodelAttachment() ) + return; + + if ( m_iDetonated == 1 ) + { + GetViewmodelAttachment()->SetModel( TF_WEAPON_STICKBOMB_BROKEN_MODEL ); + } + else + { + GetViewmodelAttachment()->SetModel( TF_WEAPON_STICKBOMB_NORMAL_MODEL ); + } +#endif +} + +const char *CTFStickBomb::GetWorldModel( void ) const +{ + if ( m_iDetonated == 1 ) + { + return TF_WEAPON_STICKBOMB_BROKEN_MODEL; + } + else + { + return BaseClass::GetWorldModel(); + } +} + +#ifdef CLIENT_DLL +int CTFStickBomb::GetWorldModelIndex( void ) +{ + if ( !modelinfo ) + return BaseClass::GetWorldModelIndex(); + + if ( m_iDetonated == 1 ) + { + m_iWorldModelIndex = modelinfo->GetModelIndex( TF_WEAPON_STICKBOMB_BROKEN_MODEL ); + return m_iWorldModelIndex; + } + else + { + m_iWorldModelIndex = modelinfo->GetModelIndex( TF_WEAPON_STICKBOMB_NORMAL_MODEL ); + return m_iWorldModelIndex; + } +} +#endif + +#ifdef CLIENT_DLL + +void RecvProxy_Detonated( const CRecvProxyData *pData, void *pStruct, void *pOut ) +{ + C_TFStickBomb* pBomb = (C_TFStickBomb*) pStruct; + + if ( pData->m_Value.m_Int != pBomb->GetDetonated() ) + { + pBomb->SetDetonated( pData->m_Value.m_Int ); + pBomb->SwitchBodyGroups(); + } +} + +#endif |