Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

542 lines
13 KiB

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