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