diff options
Diffstat (limited to 'game/shared/tf/tf_weapon_pda.cpp')
| -rw-r--r-- | game/shared/tf/tf_weapon_pda.cpp | 542 |
1 files changed, 542 insertions, 0 deletions
diff --git a/game/shared/tf/tf_weapon_pda.cpp b/game/shared/tf/tf_weapon_pda.cpp new file mode 100644 index 0000000..c9398f8 --- /dev/null +++ b/game/shared/tf/tf_weapon_pda.cpp @@ -0,0 +1,542 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#include "cbase.h" + +#ifdef CLIENT_DLL +#include "iinput.h" +#endif + +#include "tf_weapon_pda.h" +#include "in_buttons.h" +#include "tf_gamerules.h" +#include "tf_weaponbase_gun.h" + +// Server specific. +#if !defined( CLIENT_DLL ) + #include "tf_player.h" + #include "vguiscreen.h" +// Client specific. +#else + #include "c_tf_player.h" + #include <igameevents.h> + #include "tf_hud_menu_engy_build.h" + #include "tf_hud_menu_engy_destroy.h" + #include "tf_hud_menu_spy_disguise.h" + #include "prediction.h" + #ifdef STAGING_ONLY + #include "tf_hud_menu_spy_build.h" + #endif // STAGING_ONLY +#endif + +//============================================================================= +// +// TFWeaponBase Melee tables. +// +IMPLEMENT_NETWORKCLASS_ALIASED( TFWeaponPDA, DT_TFWeaponPDA ) + +BEGIN_NETWORK_TABLE( CTFWeaponPDA, DT_TFWeaponPDA ) +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFWeaponPDA ) +END_PREDICTION_DATA() + +// Server specific. +#if !defined( CLIENT_DLL ) +BEGIN_DATADESC( CTFWeaponPDA ) +END_DATADESC() +#endif + +LINK_ENTITY_TO_CLASS( tf_pda_expansion_dispenser, CTFWeaponPDAExpansion_Dispenser ); +IMPLEMENT_NETWORKCLASS_ALIASED( TFWeaponPDAExpansion_Dispenser, DT_TFWeaponPDAExpansion_Dispenser ) + +// Network Table -- +BEGIN_NETWORK_TABLE( CTFWeaponPDAExpansion_Dispenser, DT_TFWeaponPDAExpansion_Dispenser ) +END_NETWORK_TABLE() +// -- Network Table + +// Data Desc -- +BEGIN_DATADESC( CTFWeaponPDAExpansion_Dispenser ) +END_DATADESC() + +//************************************************************************************************ +LINK_ENTITY_TO_CLASS( tf_pda_expansion_teleporter, CTFWeaponPDAExpansion_Teleporter ); +IMPLEMENT_NETWORKCLASS_ALIASED( TFWeaponPDAExpansion_Teleporter, DT_TFWeaponPDAExpansion_Teleporter ) + +// Network Table -- +BEGIN_NETWORK_TABLE( CTFWeaponPDAExpansion_Teleporter, DT_TFWeaponPDAExpansion_Teleporter ) +END_NETWORK_TABLE() +// -- Network Table + +// Data Desc -- +BEGIN_DATADESC( CTFWeaponPDAExpansion_Teleporter ) +END_DATADESC() + + +CTFWeaponPDA::CTFWeaponPDA() +{ +} + + +void CTFWeaponPDA::Spawn() +{ + BaseClass::Spawn(); +} + +//----------------------------------------------------------------------------- +// Purpose: cancel menu +//----------------------------------------------------------------------------- +void CTFWeaponPDA::PrimaryAttack( void ) +{ + CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); + if ( !pOwner ) + { + return; + } + + pOwner->SelectLastItem(); +} + +//----------------------------------------------------------------------------- +// Purpose: toggle invis +//----------------------------------------------------------------------------- +void CTFWeaponPDA::SecondaryAttack( void ) +{ + // semi-auto behaviour + if ( m_bInAttack2 ) + return; + + // Get the player owning the weapon. + CTFPlayer *pPlayer = ToTFPlayer( GetPlayerOwner() ); + if ( !pPlayer ) + return; + + pPlayer->DoClassSpecialSkill(); + + m_bInAttack2 = true; + + m_flNextSecondaryAttack = gpGlobals->curtime + 0.5; +} + +#if !defined( CLIENT_DLL ) + + void CTFWeaponPDA::Precache() + { + BaseClass::Precache(); + PrecacheVGuiScreen( GetPanelName() ); + } + + //----------------------------------------------------------------------------- + // Purpose: Gets info about the control panels + //----------------------------------------------------------------------------- + void CTFWeaponPDA::GetControlPanelInfo( int nPanelIndex, const char *&pPanelName ) + { + pPanelName = GetPanelName(); + } + +#else + + float CTFWeaponPDA::CalcViewmodelBob( void ) + { + // no bob + return BaseClass::CalcViewmodelBob(); + } + +#endif + +//----------------------------------------------------------------------------- +// Purpose: +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CTFWeaponPDA::ShouldShowControlPanels( void ) +{ + return true; +} + +#ifdef CLIENT_DLL +void CTFWeaponPDA::OnDataChanged( DataUpdateType_t type ) +{ + if ( m_iState != m_iOldState && GetOwner() == C_TFPlayer::GetLocalTFPlayer() ) + { + // Was active, now not + if ( m_iOldState == WEAPON_IS_ACTIVE && m_iState != m_iOldState ) + { + CHudBaseBuildMenu *pBuildMenu = GetBuildMenu(); + Assert( pBuildMenu ); + if ( pBuildMenu ) + { + pBuildMenu->SetBuilderEquipped( false ); + } + } + else if ( m_iState == WEAPON_IS_ACTIVE && m_iOldState == WEAPON_IS_CARRIED_BY_PLAYER ) // Was inactive, now is + { + CHudBaseBuildMenu *pBuildMenu = GetBuildMenu(); + Assert( pBuildMenu ); + if ( pBuildMenu ) + { + pBuildMenu->SetBuilderEquipped( true ); + } + } + } + + BaseClass::OnDataChanged( type ); +} + + +void CTFWeaponPDA::UpdateOnRemove() +{ + CHudBaseBuildMenu *pBuildMenu = GetBuildMenu(); + Assert( pBuildMenu ); + if ( pBuildMenu ) + { + pBuildMenu->SetBuilderEquipped( false ); + } + return BaseClass::UpdateOnRemove(); +} + +#endif + +//============================== + +IMPLEMENT_NETWORKCLASS_ALIASED( TFWeaponPDA_Engineer_Build, DT_TFWeaponPDA_Engineer_Build ) + +BEGIN_NETWORK_TABLE( CTFWeaponPDA_Engineer_Build, DT_TFWeaponPDA_Engineer_Build ) +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFWeaponPDA_Engineer_Build ) +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( tf_weapon_pda_engineer_build, CTFWeaponPDA_Engineer_Build ); +PRECACHE_WEAPON_REGISTER( tf_weapon_pda_engineer_build ); + +#ifdef CLIENT_DLL +CHudBaseBuildMenu *CTFWeaponPDA_Engineer_Build::GetBuildMenu() const +{ + return GET_HUDELEMENT( CHudMenuEngyBuild ); +} +#endif // CLIENT_DLL + + +//============================== + +IMPLEMENT_NETWORKCLASS_ALIASED( TFWeaponPDA_Engineer_Destroy, DT_TFWeaponPDA_Engineer_Destroy ) + +BEGIN_NETWORK_TABLE( CTFWeaponPDA_Engineer_Destroy, DT_TFWeaponPDA_Engineer_Destroy ) +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFWeaponPDA_Engineer_Destroy ) +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( tf_weapon_pda_engineer_destroy, CTFWeaponPDA_Engineer_Destroy ); +PRECACHE_WEAPON_REGISTER( tf_weapon_pda_engineer_destroy ); + +#ifdef CLIENT_DLL +CHudBaseBuildMenu *CTFWeaponPDA_Engineer_Destroy::GetBuildMenu() const +{ + return GET_HUDELEMENT( CHudMenuEngyDestroy ); +} +#endif // CLIENT_DLL + +//============================== + +IMPLEMENT_NETWORKCLASS_ALIASED( TFWeaponPDA_Spy, DT_TFWeaponPDA_Spy ) + +BEGIN_NETWORK_TABLE( CTFWeaponPDA_Spy, DT_TFWeaponPDA_Spy ) +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFWeaponPDA_Spy ) +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( tf_weapon_pda_spy, CTFWeaponPDA_Spy ); +PRECACHE_WEAPON_REGISTER( tf_weapon_pda_spy ); + +#ifdef CLIENT_DLL +CHudBaseBuildMenu *CTFWeaponPDA_Spy::GetBuildMenu() const +{ + return GET_HUDELEMENT( CHudMenuSpyDisguise ); +} +#endif // CLIENT_DLL + +#ifdef STAGING_ONLY +//============================== + +IMPLEMENT_NETWORKCLASS_ALIASED( TFWeaponPDA_Spy_Build, DT_TFWeaponPDA_Spy_Build ) + +BEGIN_NETWORK_TABLE( CTFWeaponPDA_Spy_Build, DT_TFWeaponPDA_Spy_Build ) +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFWeaponPDA_Spy_Build ) +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( tf_weapon_pda_spy_build, CTFWeaponPDA_Spy_Build ); +PRECACHE_WEAPON_REGISTER( tf_weapon_pda_spy_build ); + +#ifdef CLIENT_DLL +CHudBaseBuildMenu *CTFWeaponPDA_Spy_Build::GetBuildMenu() const +{ + return GET_HUDELEMENT( CHudMenuSpyBuild ); +} +#endif // CLIENT_DLL +#endif // STAGING_ONLY + +//============================== + +void CTFWeaponPDA_Spy::ItemPreFrame( void ) +{ + BaseClass::ItemPreFrame(); + + ProcessDisguiseImpulse(); + CheckDisguiseTimer(); +} + +void CTFWeaponPDA_Spy::ItemBusyFrame( void ) +{ + BaseClass::ItemBusyFrame(); + + ProcessDisguiseImpulse(); + CheckDisguiseTimer(); +} + +void CTFWeaponPDA_Spy::ItemHolsterFrame( void ) +{ + BaseClass::ItemHolsterFrame(); + + ProcessDisguiseImpulse(); + CheckDisguiseTimer(); +} + +void CTFWeaponPDA_Spy::ProcessDisguiseImpulse( void ) +{ + CTFPlayer *pPlayer = ToTFPlayer( GetPlayerOwner() ); + if ( !pPlayer ) + return; + + pPlayer->m_Shared.ProcessDisguiseImpulse( pPlayer ); +} + +void CTFWeaponPDA_Spy::CheckDisguiseTimer( void ) +{ + /* + // Get the player owning the weapon. + CTFPlayer *pPlayer = ToTFPlayer( GetPlayerOwner() ); + if ( !pPlayer ) + return; + + if ( pPlayer->m_Shared.InCond( TF_COND_DISGUISING ) ) + { + if ( gpGlobals->curtime > pPlayer->m_Shared.GetDisguiseCompleteTime() ) + { + pPlayer->m_Shared.CompleteDisguise(); + } + } + */ +} + +#ifdef CLIENT_DLL + +bool CTFWeaponPDA_Spy::Deploy( void ) +{ + bool bDeploy = BaseClass::Deploy(); + + if ( bDeploy ) + { + // let the spy pda menu know to reset + IGameEvent *event = gameeventmanager->CreateEvent( "spy_pda_reset" ); + if ( event ) + { + gameeventmanager->FireEventClientSide( event ); + } + } + + return bDeploy; +} + +#endif + + +bool CTFWeaponPDA_Spy::CanBeSelected( void ) +{ + CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); + if ( pOwner && !pOwner->CanDisguise() ) + { + return false; + } + + return BaseClass::CanBeSelected(); +} + + +bool CTFWeaponPDA_Spy::VisibleInWeaponSelection( void ) +{ + if ( !CanBeSelected() ) + return false; + + return BaseClass::VisibleInWeaponSelection(); +} + + +//----------------------------------------------------------------------------- +// PDA Expansion Slots +void CTFWeaponPDAExpansion_Dispenser::Equip( CBasePlayer *pOwner ) +{ +#ifdef GAME_DLL + CTFPlayer *pPlayer = ToTFPlayer( pOwner ); + if ( pPlayer ) + { + // Detonate + CBaseObject *pObject = pPlayer->GetObjectOfType( OBJ_DISPENSER ); + if ( pObject ) + { + pObject->DetonateObject(); + } + } +#endif + BaseClass::Equip( pOwner ); +} +//----------------------------------------------------------------------------- +void CTFWeaponPDAExpansion_Dispenser::UnEquip( CBasePlayer *pOwner ) +{ +#ifdef GAME_DLL + CTFPlayer *pPlayer = ToTFPlayer( pOwner ); + if ( pPlayer ) + { + // Detonate + CBaseObject *pObject = pPlayer->GetObjectOfType( OBJ_DISPENSER ); + if ( pObject ) + { + pObject->DetonateObject(); + } + } +#endif + BaseClass::UnEquip( pOwner ); +} + +//----------------------------------------------------------------------------- +void CTFWeaponPDAExpansion_Teleporter::Equip( CBasePlayer *pOwner ) +{ +#ifdef GAME_DLL + CTFPlayer *pPlayer = ToTFPlayer( pOwner ); + if ( pPlayer ) + { + // Detonate entrance and exit + CBaseObject *pObject = pPlayer->GetObjectOfType( OBJ_TELEPORTER, 0 ); + if ( pObject ) + { + pObject->DetonateObject(); + } + pObject = pPlayer->GetObjectOfType( OBJ_TELEPORTER, 1 ); + if ( pObject ) + { + pObject->DetonateObject(); + } + + pObject = pPlayer->GetObjectOfType( OBJ_TELEPORTER, 2 ); + if ( pObject ) + { + pObject->DetonateObject(); + } + pObject = pPlayer->GetObjectOfType( OBJ_TELEPORTER, 3 ); + if ( pObject ) + { + pObject->DetonateObject(); + } + } +#endif + BaseClass::Equip( pOwner ); +} +//----------------------------------------------------------------------------- +void CTFWeaponPDAExpansion_Teleporter::UnEquip( CBasePlayer *pOwner ) +{ +#ifdef GAME_DLL + CTFPlayer *pPlayer = ToTFPlayer( pOwner ); + if ( pPlayer ) + { + // Detonate entrance and exit + CBaseObject *pObject = pPlayer->GetObjectOfType( OBJ_TELEPORTER, 0 ); + if ( pObject ) + { + pObject->DetonateObject(); + } + pObject = pPlayer->GetObjectOfType( OBJ_TELEPORTER, 1 ); + if ( pObject ) + { + pObject->DetonateObject(); + } + + pObject = pPlayer->GetObjectOfType( OBJ_TELEPORTER, 2 ); + if ( pObject ) + { + pObject->DetonateObject(); + } + pObject = pPlayer->GetObjectOfType( OBJ_TELEPORTER, 3 ); + if ( pObject ) + { + pObject->DetonateObject(); + } + } +#endif + BaseClass::UnEquip( pOwner ); +} + +//----------------------------------------------------------------------------- +// Purpose: Check if we should show the "destroy" panel +//----------------------------------------------------------------------------- +bool CTFWeaponPDA_Engineer_Destroy::VisibleInWeaponSelection( void ) +{ + if ( IsConsole() +#ifdef CLIENT_DLL + || ::input->IsSteamControllerActive() + || tf_build_menu_controller_mode.GetBool() +#endif + ) + { + return false; + } + + return BaseClass::VisibleInWeaponSelection(); +} + + + +#ifdef STAGING_ONLY +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CTFWeaponPDA_Spy_Build::CanDeploy( void ) +{ + if ( !TFGameRules() || !TFGameRules()->GameModeUsesUpgrades() ) + return false; + + CTFPlayer *pPlayer = GetTFPlayerOwner(); + if ( !pPlayer || !pPlayer->m_Shared.CanBuildSpyTraps() ) + return false; + + return BaseClass::CanDeploy(); +} + +//----------------------------------------------------------------------------- +// Purpose: UI Progress +//----------------------------------------------------------------------------- +float CTFWeaponPDA_Spy_Build::GetProgress( void ) +{ + CTFPlayer *pPlayer = GetTFPlayerOwner(); + if ( !pPlayer ) + return 0.f; + + return pPlayer->m_Shared.GetRageMeter() / 100.0f; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CTFWeaponPDA_Spy_Build::VisibleInWeaponSelection( void ) +{ + if ( !BaseClass::VisibleInWeaponSelection() ) + return false; + + return TFGameRules() && TFGameRules()->GameModeUsesUpgrades(); +} +#endif // STAGING_ONLY
\ No newline at end of file |