summaryrefslogtreecommitdiff
path: root/game/client/tf/halloween/c_eyeball_boss.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/client/tf/halloween/c_eyeball_boss.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/tf/halloween/c_eyeball_boss.cpp')
-rw-r--r--game/client/tf/halloween/c_eyeball_boss.cpp273
1 files changed, 273 insertions, 0 deletions
diff --git a/game/client/tf/halloween/c_eyeball_boss.cpp b/game/client/tf/halloween/c_eyeball_boss.cpp
new file mode 100644
index 0000000..30245a1
--- /dev/null
+++ b/game/client/tf/halloween/c_eyeball_boss.cpp
@@ -0,0 +1,273 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+// c_eyeball_boss.cpp
+
+#include "cbase.h"
+#include "NextBot/C_NextBot.h"
+#include "c_eyeball_boss.h"
+#include "tf_shareddefs.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#undef NextBot
+
+#ifdef STAGING_ONLY
+static ConVar cl_eyeball_boss_debug( "cl_eyeball_boss_debug", "0" );
+#endif
+
+
+//-----------------------------------------------------------------------------
+IMPLEMENT_CLIENTCLASS_DT( C_EyeballBoss, DT_EyeballBoss, CEyeballBoss )
+
+ RecvPropVector( RECVINFO( m_lookAtSpot ) ),
+ RecvPropInt( RECVINFO( m_attitude ) ),
+
+END_RECV_TABLE()
+
+
+//-----------------------------------------------------------------------------
+C_EyeballBoss::C_EyeballBoss()
+{
+ m_ghostEffect = NULL;
+ m_auraEffect = NULL;
+ m_attitude = EYEBALL_CALM;
+ m_priorAttitude = m_attitude;
+}
+
+
+//-----------------------------------------------------------------------------
+C_EyeballBoss::~C_EyeballBoss()
+{
+ if ( m_ghostEffect )
+ {
+ ParticleProp()->StopEmission( m_ghostEffect );
+ m_ghostEffect = NULL;
+ }
+
+ if ( m_auraEffect )
+ {
+ ParticleProp()->StopEmission( m_auraEffect );
+ m_auraEffect = NULL;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::Spawn( void )
+{
+ BaseClass::Spawn();
+
+ m_leftRightPoseParameter = -1;
+ m_upDownPoseParameter = -1;
+
+ m_myAngles = vec3_angle;
+
+ m_attitude = EYEBALL_CALM;
+ m_priorAttitude = m_attitude;
+
+ SetNextClientThink( CLIENT_THINK_ALWAYS );
+}
+
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::OnPreDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnPreDataChanged( updateType );
+
+ m_priorAttitude = m_attitude;
+}
+
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::OnDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnDataChanged( updateType );
+
+ if ( updateType == DATA_UPDATE_CREATED )
+ {
+ const char *pszMaterial = NULL;
+ const char *pszAuraEffect = "eyeboss_aura_calm";
+ switch ( GetTeamNumber() )
+ {
+ case TF_TEAM_RED:
+ {
+ pszAuraEffect = "eyeboss_team_red";
+ //pszMaterial = "models/effects/invulnfx_red.vmt";
+ }
+ break;
+ case TF_TEAM_BLUE:
+ {
+ pszAuraEffect = "eyeboss_team_blue";
+ //pszMaterial = "models/effects/invulnfx_blue.vmt";
+ }
+ break;
+ default:
+ {
+ if ( !m_ghostEffect )
+ {
+ m_ghostEffect = ParticleProp()->Create( "ghost_pumpkin", PATTACH_ABSORIGIN_FOLLOW );
+ }
+ }
+ break;
+ }
+
+ if ( !m_auraEffect )
+ {
+ m_auraEffect = ParticleProp()->Create( pszAuraEffect, PATTACH_ABSORIGIN_FOLLOW );
+ }
+
+ if ( pszMaterial )
+ {
+ m_InvulnerableMaterial.Init( pszMaterial, TEXTURE_GROUP_CLIENT_EFFECTS );
+ }
+ else
+ {
+ m_InvulnerableMaterial.Shutdown();
+ }
+ }
+ else if ( GetTeamNumber() == TF_TEAM_HALLOWEEN )
+ {
+ // update eyeball aura
+ if ( m_attitude != m_priorAttitude )
+ {
+ // kill the old aura
+ if ( m_auraEffect )
+ {
+ ParticleProp()->StopEmission( m_auraEffect );
+ }
+
+ switch( m_attitude )
+ {
+ case EYEBALL_CALM:
+ m_auraEffect = ParticleProp()->Create( "eyeboss_aura_calm", PATTACH_ABSORIGIN_FOLLOW );
+ break;
+
+ case EYEBALL_GRUMPY:
+ m_auraEffect = ParticleProp()->Create( "eyeboss_aura_grumpy", PATTACH_ABSORIGIN_FOLLOW );
+ break;
+
+ case EYEBALL_ANGRY:
+ m_auraEffect = ParticleProp()->Create( "eyeboss_aura_angry", PATTACH_ABSORIGIN_FOLLOW );
+ break;
+ }
+
+ m_priorAttitude = m_attitude;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::ClientThink( void )
+{
+ // update eyeball aim
+ if ( m_leftRightPoseParameter < 0 )
+ {
+ m_leftRightPoseParameter = LookupPoseParameter( "left_right" );
+ }
+
+ if ( m_upDownPoseParameter < 0 )
+ {
+ m_upDownPoseParameter = LookupPoseParameter( "up_down" );
+ }
+
+
+ Vector myForward, myRight, myUp;
+ AngleVectors( m_myAngles, &myForward, &myRight, &myUp );
+
+#ifdef STAGING_ONLY
+ if ( cl_eyeball_boss_debug.GetBool() )
+ {
+ QAngle myAbsAngles = GetAbsAngles();
+
+ DevMsg( "%3.2f: EYEBALL BEFORE AIM m_myAngles( %f, %f, %f ), myForward( %f, %f, %f ), GetAbsAngles( %f, %f, %f )\n",
+ gpGlobals->curtime, m_myAngles.x, m_myAngles.y, m_myAngles.z, myForward.x, myForward.y, myForward.z,
+ myAbsAngles.x, myAbsAngles.y, myAbsAngles.z );
+ }
+#endif
+
+ const float myApproachRate = 3.0f; // 1.0f;
+
+ Vector toTarget = m_lookAtSpot - WorldSpaceCenter();
+ toTarget.NormalizeInPlace();
+
+ myForward += toTarget * myApproachRate * gpGlobals->frametime;
+ myForward.NormalizeInPlace();
+
+ QAngle myNewAngles;
+ VectorAngles( myForward, myNewAngles );
+
+ SetAbsAngles( myNewAngles );
+ m_myAngles = myNewAngles;
+
+#ifdef STAGING_ONLY
+ if ( cl_eyeball_boss_debug.GetBool() )
+ {
+ QAngle myAbsAngles = GetAbsAngles();
+
+ DevMsg( "%3.2f: EYEBALL AFTER AIM m_myAngles( %f, %f, %f ), myForward( %f, %f, %f ), GetAbsAngles( %f, %f, %f )\n",
+ gpGlobals->curtime, m_myAngles.x, m_myAngles.y, m_myAngles.z, myForward.x, myForward.y, myForward.z,
+ myAbsAngles.x, myAbsAngles.y, myAbsAngles.z );
+ }
+#endif
+
+
+ // set pose parameters to aim pupil directly at target
+ float toTargetRight = DotProduct( myRight, toTarget );
+ float toTargetUp = DotProduct( myUp, toTarget );
+
+ if ( m_leftRightPoseParameter >= 0 )
+ {
+ int angle = -50 * toTargetRight;
+
+ SetPoseParameter( m_leftRightPoseParameter, angle );
+ }
+
+ if ( m_upDownPoseParameter >= 0 )
+ {
+ int angle = -50 * toTargetUp;
+
+ SetPoseParameter( m_upDownPoseParameter, angle );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::SetDormant( bool bDormant )
+{
+ BaseClass::SetDormant( bDormant );
+}
+
+
+//-----------------------------------------------------------------------------
+void C_EyeballBoss::FireEvent( const Vector& origin, const QAngle& angles, int event, const char *options )
+{
+}
+
+
+//-----------------------------------------------------------------------------
+QAngle const &C_EyeballBoss::GetRenderAngles( void )
+{
+ return m_myAngles;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_EyeballBoss::InternalDrawModel( int flags )
+{
+ bool bUseInvulnMaterial = ( GetTeamNumber() == TF_TEAM_RED ) || ( GetTeamNumber() == TF_TEAM_BLUE );
+
+ if ( bUseInvulnMaterial )
+ {
+ modelrender->ForcedMaterialOverride( m_InvulnerableMaterial );
+ }
+
+ int ret = BaseClass::InternalDrawModel( flags );
+
+ if ( bUseInvulnMaterial )
+ {
+ modelrender->ForcedMaterialOverride( NULL );
+ }
+
+ return ret;
+} \ No newline at end of file