summaryrefslogtreecommitdiff
path: root/game/server/tf/halloween/merasmus/merasmus_behavior/merasmus_teleport.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/tf/halloween/merasmus/merasmus_behavior/merasmus_teleport.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/server/tf/halloween/merasmus/merasmus_behavior/merasmus_teleport.cpp')
-rw-r--r--game/server/tf/halloween/merasmus/merasmus_behavior/merasmus_teleport.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/game/server/tf/halloween/merasmus/merasmus_behavior/merasmus_teleport.cpp b/game/server/tf/halloween/merasmus/merasmus_behavior/merasmus_teleport.cpp
new file mode 100644
index 0000000..538b77f
--- /dev/null
+++ b/game/server/tf/halloween/merasmus/merasmus_behavior/merasmus_teleport.cpp
@@ -0,0 +1,189 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+//
+//
+//=============================================================================
+#include "cbase.h"
+
+#include "particle_parse.h"
+#include "tf/halloween/eyeball_boss/teleport_vortex.h"
+#include "player_vs_environment/monster_resource.h"
+#include "tf_gamerules.h"
+#include "nav_mesh/tf_nav_area.h"
+
+#include "../merasmus.h"
+#include "merasmus_teleport.h"
+#include "merasmus_aoe_attack.h"
+
+
+CMerasmusTeleport::CMerasmusTeleport( bool bShouldAOE, bool bGoToCap )
+ : m_bShouldAOE( bShouldAOE ), m_bShouldGoToCap( bGoToCap )
+{
+}
+
+
+//---------------------------------------------------------------------------------------------
+ActionResult< CMerasmus > CMerasmusTeleport::OnStart( CMerasmus *me, Action< CMerasmus > *priorAction )
+{
+ // teleport out
+ m_state = TELEPORTING_OUT;
+ me->GetBodyInterface()->StartActivity( ACT_SHIELD_DOWN );
+
+ return Continue();
+}
+
+
+//---------------------------------------------------------------------------------------------
+ActionResult< CMerasmus > CMerasmusTeleport::Update( CMerasmus *me, float interval )
+{
+ if ( me->IsActivityFinished() )
+ {
+ switch( m_state )
+ {
+ case TELEPORTING_OUT:
+ {
+ DispatchParticleEffect( "merasmus_tp", me->WorldSpaceCenter(), me->GetAbsAngles() );
+
+ me->AddEffects( EF_NOINTERP | EF_NODRAW );
+
+ me->SetAbsOrigin( GetTeleportPosition( me ) );
+
+ // wait on the other side for a moment
+ m_state = TELEPORTING_IN;
+ }
+ break;
+
+ case TELEPORTING_IN:
+ {
+ me->RemoveEffects( EF_NOINTERP | EF_NODRAW );
+
+ DispatchParticleEffect( "merasmus_tp", me->WorldSpaceCenter(), me->GetAbsAngles() );
+
+ me->GetBodyInterface()->StartActivity( ACT_SHIELD_UP );
+
+ m_state = DONE;
+ }
+ break;
+
+ case DONE:
+ {
+ if ( m_bShouldAOE )
+ {
+ m_bShouldAOE = false;
+ return SuspendFor( new CMerasmusAOEAttack, "AOE Attack!" );
+ }
+ }
+ return Done();
+ }
+ }
+
+ return Continue();
+}
+
+
+Vector CMerasmusTeleport::GetTeleportPosition( CMerasmus *me ) const
+{
+ Vector vGroundOffset( 0, 0, 75.0f );
+ if ( m_bShouldGoToCap )
+ {
+ return me->GetHomePosition() + vGroundOffset;
+ }
+ else
+ {
+ // pick a random spot
+ const float goodSize = 100.f;
+ CUtlVector< CTFNavArea * > spawnAreaVector;
+ for( int i=0; i<TheNavAreas.Count(); ++i )
+ {
+ CTFNavArea *area = (CTFNavArea *)TheNavAreas[i];
+
+ if ( !area->HasFuncNavPrefer() )
+ {
+ // don't spawn outside nav prefer
+ continue;
+ }
+
+ // don't use small nav areas
+ if ( area->GetSizeX() < goodSize || area->GetSizeY() < goodSize )
+ {
+ continue;
+ }
+
+ // don't use area containing player
+ if ( area->GetPlayerCount( TF_TEAM_BLUE ) || area->GetPlayerCount( TF_TEAM_RED ) )
+ {
+ continue;
+ }
+
+ spawnAreaVector.AddToTail( area );
+ }
+
+ if ( spawnAreaVector.Count() )
+ {
+ int which = RandomInt( 0, spawnAreaVector.Count() - 1 );
+ return spawnAreaVector[ which ]->GetCenter();
+ }
+ else
+ {
+ return me->GetHomePosition() + vGroundOffset;
+ }
+ }
+}
+
+
+//---------------------------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------------
+ActionResult< CMerasmus > CMerasmusEscape::OnStart( CMerasmus *me, Action< CMerasmus > *priorAction )
+{
+ me->GetBodyInterface()->StartActivity( ACT_FLY );
+
+ if (RandomInt(0,10) == 0)
+ {
+ me->PlayHighPrioritySound( "Halloween.MerasmusDepartRare" );
+ }
+ else
+ {
+ me->PlayHighPrioritySound( "Halloween.MerasmusDepart" );
+ }
+
+ UTIL_LogPrintf( "HALLOWEEN: merasmus_escaped (max_dps %3.2f) (health %d) (level %d)\n", me->GetMaxInjuryRate(), me->GetHealth(), me->GetLevel() );
+
+ return Continue();
+}
+
+
+//---------------------------------------------------------------------------------------------
+ActionResult< CMerasmus > CMerasmusEscape::Update( CMerasmus *me, float interval )
+{
+ if ( me->IsActivityFinished() )
+ {
+ Vector vPos;
+ QAngle qAngles;
+ me->GetAttachment( "effect_robe", vPos, qAngles );
+ DispatchParticleEffect( "merasmus_tp", vPos, qAngles );
+
+ if ( g_pMonsterResource )
+ {
+ g_pMonsterResource->HideBossHealthMeter();
+ }
+
+ IGameEvent *event = gameeventmanager->CreateEvent( "merasmus_escaped" );
+ if ( event )
+ {
+ event->SetInt( "level", me->GetLevel() );
+ gameeventmanager->FireEvent( event );
+ }
+ me->TriggerLogicRelay( "boss_exit_relay" );
+
+ // reset back to normal level
+ me->ResetLevel();
+
+ me->StartRespawnTimer();
+
+ UTIL_Remove( me );
+
+ return Done();
+ }
+
+ return Continue();
+}