summaryrefslogtreecommitdiff
path: root/game/shared/tf2/env_laserdesignation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/shared/tf2/env_laserdesignation.cpp')
-rw-r--r--game/shared/tf2/env_laserdesignation.cpp328
1 files changed, 328 insertions, 0 deletions
diff --git a/game/shared/tf2/env_laserdesignation.cpp b/game/shared/tf2/env_laserdesignation.cpp
new file mode 100644
index 0000000..543be1a
--- /dev/null
+++ b/game/shared/tf2/env_laserdesignation.cpp
@@ -0,0 +1,328 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Entity used to highlight laser designation points to clients
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "basetfplayer_shared.h"
+#include "tf_obj_manned_plasmagun.h"
+#include "env_laserdesignation.h"
+
+#if !defined( CLIENT_DLL )
+
+#include "tf_vehicle_tank.h"
+#include "tf_obj_manned_missilelauncher.h"
+
+#endif
+
+extern ConVar weapon_grenade_rocket_track_range_mod;
+extern ConVar vehicle_tank_range;
+extern ConVar weapon_rocket_launcher_range;
+extern ConVar obj_manned_missilelauncher_range_off;
+
+//-----------------------------------------------------------------------------
+// Stores a list of all laser designations
+//-----------------------------------------------------------------------------
+CUtlVector< EHANDLE > CEnvLaserDesignation::m_LaserDesignatorsTeam1;
+CUtlVector< EHANDLE > CEnvLaserDesignation::m_LaserDesignatorsTeam2;
+
+IMPLEMENT_NETWORKCLASS_ALIASED( EnvLaserDesignation, DT_EnvLaserDesignation )
+
+BEGIN_NETWORK_TABLE( CEnvLaserDesignation, DT_EnvLaserDesignation )
+#if !defined( CLIENT_DLL )
+ SendPropInt( SENDINFO( m_bActive ), 1, SPROP_UNSIGNED ),
+#else
+ RecvPropInt( RECVINFO( m_bActive ) ),
+#endif
+END_NETWORK_TABLE()
+
+BEGIN_PREDICTION_DATA( CEnvLaserDesignation )
+ DEFINE_PRED_FIELD( m_bActive, FIELD_BOOLEAN, FTYPEDESC_INSENDTABLE ),
+END_PREDICTION_DATA()
+
+LINK_ENTITY_TO_CLASS( env_laserdesignation, CEnvLaserDesignation );
+PRECACHE_REGISTER( env_laserdesignation );
+
+//-----------------------------------------------------------------------------
+// Purpose: Create a laser designation
+//-----------------------------------------------------------------------------
+CEnvLaserDesignation *CEnvLaserDesignation::Create( CBasePlayer *pOwner )
+{
+ CEnvLaserDesignation *pDesignation = (CEnvLaserDesignation*)CreateEntityByName("env_laserdesignation");
+ pDesignation->Spawn();
+ pDesignation->SetOwnerEntity( pOwner );
+ pDesignation->ChangeTeam( pOwner->GetTeamNumber() );
+ pDesignation->SetActive( false );
+
+ return pDesignation;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Create a laser designation
+//-----------------------------------------------------------------------------
+CEnvLaserDesignation *CEnvLaserDesignation::CreatePredicted( CBasePlayer *pOwner )
+{
+#if !defined( NO_ENTITY_PREDICTION )
+ CEnvLaserDesignation *pDesignation = (CEnvLaserDesignation*)CREATE_PREDICTED_ENTITY("env_laserdesignation");
+ if ( pDesignation )
+ {
+ pDesignation->Spawn();
+ pDesignation->SetOwnerEntity( pOwner );
+ pDesignation->SetPlayerSimulated( pOwner );
+ pDesignation->ChangeTeam( pOwner->GetTeamNumber() );
+ pDesignation->SetActive( false );
+ }
+
+ return pDesignation;
+#else
+ return NULL;
+#endif
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CEnvLaserDesignation::CEnvLaserDesignation( void )
+{
+ m_bActive = -1; // So the first setactive will take effect
+ m_bPrevActive = false;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CEnvLaserDesignation::~CEnvLaserDesignation( void )
+{
+ EHANDLE hLaser;
+ hLaser = this;
+
+ if ( GetTeamNumber() == 1 )
+ {
+ m_LaserDesignatorsTeam1.FindAndRemove( hLaser );
+ }
+ else if ( GetTeamNumber() == 2 )
+ {
+ m_LaserDesignatorsTeam2.FindAndRemove( hLaser );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CEnvLaserDesignation::Spawn( void )
+{
+ SetModel( "models/projectiles/grenade_limpet.mdl" );
+ SetMoveType( MOVETYPE_NONE );
+ SetSolid( SOLID_NONE );
+ SetSize( vec3_origin, vec3_origin );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CEnvLaserDesignation::ChangeTeam( int iTeamNum )
+{
+ Assert( iTeamNum > 0 && iTeamNum < MAX_TF_TEAMS );
+
+ EHANDLE hLaser;
+ hLaser = this;
+ if ( iTeamNum == 1 )
+ {
+ m_LaserDesignatorsTeam1.AddToTail( hLaser );
+ }
+ else if ( iTeamNum == 2 )
+ {
+ m_LaserDesignatorsTeam2.AddToTail( hLaser );
+ }
+
+ BaseClass::ChangeTeam( iTeamNum );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CEnvLaserDesignation::SetActive( bool bActive )
+{
+ if ( bActive == m_bActive )
+ return;
+
+ if ( !bActive )
+ {
+ AddEffects( EF_NODRAW );
+ }
+ else
+ {
+ IncrementInterpolationFrame();
+ RemoveEffects( EF_NODRAW );
+ }
+
+#if defined( CLIENT_DLL )
+ ENTITY_PANEL_ACTIVATE( "laserdesignation", bActive );
+#endif
+
+ m_bActive = bActive;
+}
+
+#if !defined( CLIENT_DLL )
+
+
+int CEnvLaserDesignation::UpdateTransmitState()
+{
+ return SetTransmitState( FL_EDICT_FULLCHECK );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int CEnvLaserDesignation::ShouldTransmit( const CCheckTransmitInfo *pInfo )
+{
+ // Only transmit to players who care about laser designation:
+ // - Player designating
+ // - Players in tanks
+ // - Commandos
+ CBaseEntity* pRecipientEntity = CBaseEntity::Instance( pInfo->m_pClientEnt );
+ if ( pRecipientEntity->IsPlayer() )
+ {
+ CBaseTFPlayer *pPlayer = (CBaseTFPlayer*)pRecipientEntity;
+
+ // Designating player?
+ if ( pPlayer == GetOwnerEntity() )
+ return SetTransmitState( FL_EDICT_ALWAYS );
+
+ if ( !InSameTeam( pPlayer ) )
+ return FL_EDICT_DONTSEND;
+
+ // In a tank?
+ if ( pPlayer->IsInAVehicle() )
+ {
+ CBaseEntity *pVehicle = pPlayer->GetVehicle()->GetVehicleEnt();
+ if ( dynamic_cast<CVehicleTank*>(pVehicle) )
+ {
+ // Make sure it's within range of the tank's fire
+ static float flTankRange = 0;
+ if ( !flTankRange )
+ {
+ flTankRange = vehicle_tank_range.GetFloat() * weapon_grenade_rocket_track_range_mod.GetFloat();
+ flTankRange *= flTankRange;
+ }
+
+ float flDistanceSqr = ( GetAbsOrigin() - pPlayer->GetAbsOrigin() ).LengthSqr();
+ if ( flDistanceSqr < flTankRange )
+ return FL_EDICT_ALWAYS;
+ }
+ else if ( dynamic_cast<CObjectMannedMissileLauncher*>(pVehicle) )
+ {
+ // Make sure it's within range of the manned missile launcher's fire
+ static float flGunRange = 0;
+ if ( !flGunRange )
+ {
+ flGunRange = obj_manned_missilelauncher_range_off.GetFloat() * weapon_grenade_rocket_track_range_mod.GetFloat();
+ flGunRange *= flGunRange;
+ }
+
+ float flDistanceSqr = ( GetAbsOrigin() - pPlayer->GetAbsOrigin() ).LengthSqr();
+ if ( flDistanceSqr < flGunRange )
+ return FL_EDICT_ALWAYS;
+ }
+ }
+
+ // Is the player a commando?
+ if ( pPlayer->PlayerClass() == TFCLASS_COMMANDO )
+ {
+ // Make sure it's within range of the commando's rockets
+ static float flCommandoRange = 0;
+ if ( !flCommandoRange )
+ {
+ flCommandoRange = weapon_rocket_launcher_range.GetFloat() * weapon_grenade_rocket_track_range_mod.GetFloat();
+ flCommandoRange *= flCommandoRange;
+ }
+
+ float flDistanceSqr = ( GetAbsOrigin() - pPlayer->GetAbsOrigin() ).LengthSqr();
+ if ( flDistanceSqr < flCommandoRange )
+ return FL_EDICT_ALWAYS;
+ }
+ }
+
+ return FL_EDICT_DONTSEND;
+}
+#endif
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int CEnvLaserDesignation::GetNumLaserDesignators( int iTeamNumber )
+{
+ Assert( iTeamNumber > 0 && iTeamNumber < MAX_TF_TEAMS );
+
+ if ( iTeamNumber == 1 )
+ return m_LaserDesignatorsTeam1.Count();
+
+ return m_LaserDesignatorsTeam2.Count();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool CEnvLaserDesignation::GetLaserDesignation( int iTeamNumber, int iDesignator, Vector *vecOrigin )
+{
+ Assert( iTeamNumber > 0 && iTeamNumber < MAX_TF_TEAMS );
+
+ CHandle<CEnvLaserDesignation> hLaser;
+ if ( iTeamNumber == 1 )
+ {
+ Assert( iDesignator < m_LaserDesignatorsTeam1.Count() );
+ hLaser = m_LaserDesignatorsTeam1[iDesignator];
+ }
+ else
+ {
+ Assert( iDesignator < m_LaserDesignatorsTeam2.Count() );
+ hLaser = m_LaserDesignatorsTeam2[iDesignator];
+ }
+
+ // Active?
+ if ( !hLaser.Get() || !hLaser->IsActive() )
+ return false;
+
+ *vecOrigin = hLaser->GetAbsOrigin();
+ return true;
+}
+
+#if defined( CLIENT_DLL )
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int CEnvLaserDesignation::DrawModel( int flags )
+{
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : updateType -
+//-----------------------------------------------------------------------------
+void CEnvLaserDesignation::OnDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnDataChanged( updateType );
+
+ if ( m_bActive != m_bPrevActive )
+ {
+ ENTITY_PANEL_ACTIVATE( "laserdesignation", m_bActive );
+ }
+ m_bPrevActive = m_bActive.Get();
+}
+
+//-----------------------------------------------------------------------------
+// Add, remove object from the panel
+//-----------------------------------------------------------------------------
+void CEnvLaserDesignation::SetDormant( bool bDormant )
+{
+ BaseClass::SetDormant( bDormant );
+
+ ENTITY_PANEL_ACTIVATE( "laserdesignation", (!bDormant && m_bActive) );
+}
+
+#endif \ No newline at end of file