Added plant orientation to combine_mine

This commit is contained in:
Blixibon 2021-11-07 14:01:27 -06:00
parent 188293b93c
commit c8f48407c1
2 changed files with 65 additions and 2 deletions

View File

@ -58,6 +58,10 @@ char *pszMineStateNames[] =
// Approximate radius of the bomb's model
#define BOUNCEBOMB_RADIUS 24
#ifdef MAPBASE
ConVar combine_mine_trace_dist( "combine_mine_trace_dist", "1024" );
#endif
BEGIN_DATADESC( CBounceBomb )
DEFINE_THINKFUNC( ExplodeThink ),
DEFINE_ENTITYFUNC( ExplodeTouch ),
@ -129,6 +133,8 @@ BEGIN_DATADESC( CBounceBomb )
#ifdef MAPBASE
DEFINE_INPUTFUNC( FIELD_VOID, "Bounce", InputBounce ),
DEFINE_INPUTFUNC( FIELD_EHANDLE, "BounceAtTarget", InputBounceAtTarget ),
DEFINE_INPUTFUNC( FIELD_VECTOR, "SetPlantOrientation", InputSetPlantOrientation ),
DEFINE_INPUTFUNC( FIELD_VECTOR, "SetPlantOrientationRaw", InputSetPlantOrientationRaw ),
DEFINE_OUTPUT( m_OnTriggered, "OnTriggered" ),
DEFINE_OUTPUT( m_OnExplode, "OnExplode" ),
@ -266,6 +272,14 @@ void CBounceBomb::Spawn()
// pretend like the player set me down.
m_bPlacedByPlayer = true;
}
#ifdef MAPBASE
if (m_vecPlantOrientation != vec3_invalid)
{
// Turn angles into direction
AngleVectors( QAngle( m_vecPlantOrientation.x, m_vecPlantOrientation.y, m_vecPlantOrientation.z ), &m_vecPlantOrientation );
}
#endif
}
//---------------------------------------------------------
@ -694,7 +708,20 @@ void CBounceBomb::SettleThink()
{
// If i'm not resting on the world, jump randomly.
trace_t tr;
UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() - Vector( 0, 0, 1024 ), MASK_SHOT|CONTENTS_GRATE, this, COLLISION_GROUP_NONE, &tr );
#ifdef MAPBASE
Vector vecTraceDir;
if (m_vecPlantOrientation != vec3_invalid)
{
vecTraceDir = m_vecPlantOrientation * combine_mine_trace_dist.GetFloat();
}
else
{
vecTraceDir = Vector( 0, 0, combine_mine_trace_dist.GetFloat() );
}
#else
Vector vecTraceDir = Vector( 0, 0, 1024 );
#endif
UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() - vecTraceDir, MASK_SHOT|CONTENTS_GRATE, this, COLLISION_GROUP_NONE, &tr );
bool bHop = false;
if( tr.m_pEnt )
@ -728,6 +755,20 @@ void CBounceBomb::SettleThink()
// Check for upside-down
Vector vecUp;
GetVectors( NULL, NULL, &vecUp );
#ifdef MAPBASE
if (m_vecPlantOrientation != vec3_invalid)
{
float flDiff = abs(m_vecPlantOrientation.z - vecUp.z);
if ( flDiff >= 0.2f )
{
// Landed upside down. Right self
Vector vecForce( 0, 0, 2500 );
Flip( vecForce, AngularImpulse( 60, 0, 0 ) );
return;
}
}
else
#endif
if( vecUp.z <= 0.8 )
{
// Landed upside down. Right self
@ -1442,6 +1483,22 @@ void CBounceBomb::InputBounceAtTarget( inputdata_t &inputdata )
m_hNearestNPC = inputdata.value.Entity();
SetMineState(MINE_STATE_TRIGGERED);
}
//---------------------------------------------------------
//---------------------------------------------------------
void CBounceBomb::InputSetPlantOrientation( inputdata_t &inputdata )
{
Vector vecInput;
inputdata.value.Vector3D( vecInput );
AngleVectors( QAngle(vecInput.x, vecInput.y, vecInput.z), &m_vecPlantOrientation );
}
//---------------------------------------------------------
//---------------------------------------------------------
void CBounceBomb::InputSetPlantOrientationRaw( inputdata_t &inputdata )
{
inputdata.value.Vector3D( m_vecPlantOrientation );
}
#endif
//---------------------------------------------------------

View File

@ -34,7 +34,7 @@ class CBounceBomb : public CBaseAnimating, public CDefaultPlayerPickupVPhysics
public:
#ifdef MAPBASE
CBounceBomb() { m_pWarnSound = NULL; m_bPlacedByPlayer = false; m_flExplosionDelay = 0.5f; m_iLOSMask = MASK_SOLID_BRUSHONLY; }
CBounceBomb() { m_pWarnSound = NULL; m_bPlacedByPlayer = false; m_flExplosionDelay = 0.5f; m_iLOSMask = MASK_SOLID_BRUSHONLY; m_vecPlantOrientation = vec3_invalid; }
#else
CBounceBomb() { m_pWarnSound = NULL; m_bPlacedByPlayer = false; }
#endif
@ -130,6 +130,10 @@ private:
int m_iLOSMask;
bool m_bUnavoidable;
// What direction the mine should be facing when planting itself (i.e. facing up, facing left, etc.)
// vec3_invalid = use default (0 0 1 or -90 0 0)
Vector m_vecPlantOrientation;
#endif
bool m_bPlacedByPlayer;
@ -164,6 +168,8 @@ private:
#ifdef MAPBASE
void InputBounce( inputdata_t &inputdata );
void InputBounceAtTarget( inputdata_t &inputdata );
void InputSetPlantOrientation( inputdata_t &inputdata );
void InputSetPlantOrientationRaw( inputdata_t &inputdata );
COutputEvent m_OnTriggered;
COutputEvent m_OnExplode;
#endif