summaryrefslogtreecommitdiff
path: root/game/server/tf/bot/map_entities/tf_bot_hint.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf/bot/map_entities/tf_bot_hint.cpp')
-rw-r--r--game/server/tf/bot/map_entities/tf_bot_hint.cpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/game/server/tf/bot/map_entities/tf_bot_hint.cpp b/game/server/tf/bot/map_entities/tf_bot_hint.cpp
new file mode 100644
index 0000000..b4dfa11
--- /dev/null
+++ b/game/server/tf/bot/map_entities/tf_bot_hint.cpp
@@ -0,0 +1,128 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+// tf_bot_hint.cpp
+// Designer-placed hint for TFBots
+
+#include "cbase.h"
+#include "bot/tf_bot.h"
+#include "tf_bot_hint.h"
+
+BEGIN_DATADESC( CTFBotHint )
+ DEFINE_KEYFIELD( m_team, FIELD_INTEGER, "team" ),
+ DEFINE_KEYFIELD( m_hint, FIELD_INTEGER, "hint" ),
+ DEFINE_KEYFIELD( m_isDisabled, FIELD_BOOLEAN, "StartDisabled" ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ),
+END_DATADESC()
+
+LINK_ENTITY_TO_CLASS( func_tfbot_hint, CTFBotHint );
+
+//
+// NOTE: For simplicity and runtime efficiency, this will not
+// play nice with nav area hints stored in the mesh,
+// nor will overlapping hints of the same type work well.
+//
+
+//------------------------------------------------------------------------------
+CTFBotHint::CTFBotHint( void )
+{
+ m_isDisabled = false;
+}
+
+
+//--------------------------------------------------------------------------------------------------------
+// Return true if this hint applies to the given entity
+bool CTFBotHint::IsFor( CTFBot *who ) const
+{
+ if ( m_isDisabled )
+ {
+ return false;
+ }
+
+ if ( m_team > 0 && who->GetTeamNumber() != m_team )
+ {
+ return false;
+ }
+
+ return true;
+}
+
+
+//--------------------------------------------------------------------------------------------------------
+void CTFBotHint::Spawn( void )
+{
+ BaseClass::Spawn();
+
+ SetSolid( SOLID_BSP );
+ AddSolidFlags( FSOLID_NOT_SOLID );
+
+ SetMoveType( MOVETYPE_NONE );
+ SetModel( STRING( GetModelName() ) );
+ AddEffects( EF_NODRAW );
+ SetCollisionGroup( COLLISION_GROUP_NONE );
+
+ VPhysicsInitShadow( false, false );
+
+ UpdateNavDecoration();
+}
+
+
+//--------------------------------------------------------------------------------------------------------
+void CTFBotHint::UpdateOnRemove( void )
+{
+ BaseClass::UpdateOnRemove();
+
+ UpdateNavDecoration();
+}
+
+
+//--------------------------------------------------------------------------------------------------------
+void CTFBotHint::InputEnable( inputdata_t &inputdata )
+{
+ m_isDisabled = false;
+ UpdateNavDecoration();
+}
+
+
+//--------------------------------------------------------------------------------------------------------
+void CTFBotHint::InputDisable( inputdata_t &inputdata )
+{
+ m_isDisabled = true;
+ UpdateNavDecoration();
+}
+
+
+//--------------------------------------------------------------------------------------------------------
+void CTFBotHint::UpdateNavDecoration( void )
+{
+ Extent extent;
+ extent.Init( this );
+
+ CUtlVector< CTFNavArea * > overlapVector;
+ TheNavMesh->CollectAreasOverlappingExtent( extent, &overlapVector );
+
+ int attributeBits = 0;
+ switch( m_hint )
+ {
+ case HINT_SNIPER_SPOT:
+ attributeBits = TF_NAV_SNIPER_SPOT;
+ break;
+
+ case HINT_SENTRY_SPOT:
+ attributeBits = TF_NAV_SENTRY_SPOT;
+ break;
+ }
+
+ for( int j=0; j<overlapVector.Count(); ++j )
+ {
+ if ( m_isDisabled )
+ {
+ overlapVector[j]->ClearAttributeTF( attributeBits );
+ }
+ else
+ {
+ overlapVector[j]->SetAttributeTF( attributeBits );
+ }
+ }
+}
+
+