summaryrefslogtreecommitdiff
path: root/game/shared/tf/tf_weapon_bottle.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf/tf_weapon_bottle.cpp
downloadarchived-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.cpp286
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