//========= 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 #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