Fixed bullsquid behavior, added test npc

This commit is contained in:
Derek Dik 2016-04-27 12:18:34 -04:00 committed by 1upD
parent 40f8ec6487
commit 5c2c7c399c
6 changed files with 431 additions and 29 deletions

View File

@ -120,6 +120,7 @@ enum Class_T
CLASS_EARTH_FAUNA,
CLASS_HACKED_ROLLERMINE,
CLASS_COMBINE_HUNTER,
CLASS_TEST,
NUM_AI_CLASSES
};

View File

@ -128,6 +128,10 @@ void CGrenadeSpit::Event_Killed( const CTakeDamageInfo &info )
//-----------------------------------------------------------------------------
void CGrenadeSpit::GrenadeSpitTouch( CBaseEntity *pOther )
{
if ( pOther->Classify() == CLASS_BULLSQUID)
return; // Don't hit bullsquids!
if ( pOther->IsSolidFlagSet(FSOLID_VOLUME_CONTENTS | FSOLID_TRIGGER) )
{
// Some NPCs are triggers that can take damage (like antlion grubs). We should hit them.

View File

@ -29,6 +29,7 @@
#include "vstdlib/random.h"
#include "engine/IEngineSound.h"
#include "movevars_shared.h"
#include "particle_parse.h" // DispatchParticleEffect
#include "AI_Hint.h"
#include "AI_Senses.h"
@ -41,6 +42,7 @@
ConVar sk_bullsquid_health( "sk_bullsquid_health", "100" );
ConVar sk_bullsquid_dmg_bite( "sk_bullsquid_dmg_bite", "15" );
ConVar sk_bullsquid_dmg_whip( "sk_bullsquid_dmg_whip", "25" );
ConVar sk_bullsquid_spit_speed( "sk_bullsquid_spit_speed", "100", FCVAR_NONE, "Speed at which an antlion spit grenade travels." );
//=========================================================
// monster-specific schedule types
@ -87,6 +89,7 @@ int g_interactionBullsquidThrow = 0;
#define BSQUID_AE_HOP ( 5 )
#define BSQUID_AE_THROW ( 6 )
#define BSQUID_AE_WHIP_SND ( 7 )
//#define BSQUID_AE_TAILWHIP ( 8 )
LINK_ENTITY_TO_CLASS( npc_bullsquid, CNPC_Bullsquid );
@ -107,7 +110,9 @@ BEGIN_DATADESC( CNPC_Bullsquid )
// DEFINE_FIELD( m_nSquidSpitSprite, FIELD_INTEGER ),
DEFINE_FIELD( m_flHungryTime, FIELD_TIME ),
DEFINE_FIELD( m_nextSquidSoundTime, FIELD_TIME ),
DEFINE_FIELD( m_vecSaveSpitVelocity, FIELD_VECTOR),
END_DATADESC()
@ -154,6 +159,8 @@ void CNPC_Bullsquid::Precache()
UTIL_PrecacheOther( "grenade_spit" );
PrecacheParticleSystem( "blood_impact_yellow_01" );
PrecacheScriptSound( "NPC_Bullsquid.Idle" );
PrecacheScriptSound( "NPC_Bullsquid.Pain" );
PrecacheScriptSound( "NPC_Bullsquid.Alert" );
@ -161,7 +168,9 @@ void CNPC_Bullsquid::Precache()
PrecacheScriptSound( "NPC_Bullsquid.Attack1" );
PrecacheScriptSound( "NPC_Bullsquid.Growl" );
PrecacheScriptSound( "NPC_Bullsquid.TailWhip");
PrecacheScriptSound( "NPC_Antlion.PoisonShoot" );
PrecacheScriptSound( "NPC_Antlion.PoisonBall" );
BaseClass::Precache();
}
@ -262,6 +271,8 @@ void CNPC_Bullsquid::HandleAnimEvent( animevent_t *pEvent )
{
if ( GetEnemy() )
{
// Replace original bullsquid spit code with antlion worker code
/*
Vector vSpitPos;
GetAttachment( "Mouth", vSpitPos );
@ -272,7 +283,8 @@ void CNPC_Bullsquid::HandleAnimEvent( animevent_t *pEvent )
float flGravity = SPIT_GRAVITY;
ThrowLimit(vSpitPos, vTarget, flGravity, 3, Vector(0,0,0), Vector(0,0,0), GetEnemy(), &vToss, &pBlocker);
CGrenadeSpit *pGrenade = (CGrenadeSpit*)CreateNoSpawn( "grenade_spit", vSpitPos, vec3_angle, this );
//CGrenadeSpit *pGrenade = (CGrenadeSpit*)CreateNoSpawn( "grenade_spit", vSpitPos, vec3_angle, this );
CGrenadeSpit *pGrenade = (CGrenadeSpit*) CreateEntityByName( "grenade_spit" );
//pGrenade->KeyValue( "velocity", vToss );
pGrenade->Spawn( );
pGrenade->SetThrower( this );
@ -292,11 +304,95 @@ void CNPC_Bullsquid::HandleAnimEvent( animevent_t *pEvent )
AttackSound();
CPVSFilter filter( vSpitPos );
te->SpriteSpray( filter, 0.0,
&vSpitPos, &vToss, m_nSquidSpitSprite, 5, 10, 15 );
//don't emit sprites
//te->SpriteSpray( filter, 0.0,
// &vSpitPos, &vToss, m_nSquidSpitSprite, 5, 10, 15 );
}
*/
Vector vSpitPos;
GetAttachment( "Mouth", vSpitPos );
Vector vTarget;
// If our enemy is looking at us and far enough away, lead him
if ( HasCondition( COND_ENEMY_FACING_ME ) && UTIL_DistApprox( GetAbsOrigin(), GetEnemy()->GetAbsOrigin() ) > (40*12) )
{
UTIL_PredictedPosition( GetEnemy(), 0.5f, &vTarget );
vTarget.z = GetEnemy()->GetAbsOrigin().z;
}
else
{
// Otherwise he can't see us and he won't be able to dodge
vTarget = GetEnemy()->BodyTarget( vSpitPos, true );
}
vTarget[2] += random->RandomFloat( 0.0f, 32.0f );
// Try and spit at our target
Vector vecToss;
if ( GetSpitVector( vSpitPos, vTarget, &vecToss ) == false )
{
// Now try where they were
if ( GetSpitVector( vSpitPos, m_vSavePosition, &vecToss ) == false )
{
// Failing that, just shoot with the old velocity we calculated initially!
vecToss = m_vecSaveSpitVelocity;
}
}
// Find what our vertical theta is to estimate the time we'll impact the ground
Vector vecToTarget = ( vTarget - vSpitPos );
VectorNormalize( vecToTarget );
float flVelocity = VectorNormalize( vecToss );
float flCosTheta = DotProduct( vecToTarget, vecToss );
float flTime = (vSpitPos-vTarget).Length2D() / ( flVelocity * flCosTheta );
// Emit a sound where this is going to hit so that targets get a chance to act correctly
CSoundEnt::InsertSound( SOUND_DANGER, vTarget, (15*12), flTime, this );
// Don't fire again until this volley would have hit the ground (with some lag behind it)
SetNextAttack( gpGlobals->curtime + flTime + random->RandomFloat( 0.5f, 2.0f ) );
for ( int i = 0; i < 6; i++ )
{
CGrenadeSpit *pGrenade = (CGrenadeSpit*) CreateEntityByName( "grenade_spit" );
pGrenade->SetAbsOrigin( vSpitPos );
pGrenade->SetAbsAngles( vec3_angle );
DispatchSpawn( pGrenade );
pGrenade->SetThrower( this );
pGrenade->SetOwnerEntity( this );
if ( i == 0 )
{
pGrenade->SetSpitSize( SPIT_LARGE );
pGrenade->SetAbsVelocity( vecToss * flVelocity );
}
else
{
pGrenade->SetAbsVelocity( ( vecToss + RandomVector( -0.035f, 0.035f ) ) * flVelocity );
pGrenade->SetSpitSize( random->RandomInt( SPIT_SMALL, SPIT_MEDIUM ) );
}
// Tumble through the air
pGrenade->SetLocalAngularVelocity(
QAngle( random->RandomFloat( -250, -500 ),
random->RandomFloat( -250, -500 ),
random->RandomFloat( -250, -500 ) ) );
}
for ( int i = 0; i < 8; i++ )
{
DispatchParticleEffect( "blood_impact_yellow_01", vSpitPos + RandomVector( -12.0f, 12.0f ), RandomAngle( 0, 360 ) );
}
AttackSound();
EmitSound( "NPC_Antlion.PoisonShoot" );
}
}
break;
case BSQUID_AE_BITE:
{
@ -319,7 +415,7 @@ void CNPC_Bullsquid::HandleAnimEvent( animevent_t *pEvent )
}
/*
case BSQUID_AE_TAILWHIP:
case BSQUID_AE_TAILWHIP: // this function was commented out
{
CBaseEntity *pHurt = CheckTraceHullAttack( 70, Vector(-16,-16,-16), Vector(16,16,16), sk_bullsquid_dmg_whip.GetFloat(), DMG_SLASH | DMG_ALWAYSGIB );
if ( pHurt )
@ -405,6 +501,8 @@ void CNPC_Bullsquid::HandleAnimEvent( animevent_t *pEvent )
int CNPC_Bullsquid::RangeAttack1Conditions( float flDot, float flDist )
{
// Code to determine whether or not this NPC can attack ranged commented out until I can sort out the issue with the projectile
if ( IsMoving() && flDist >= 512 )
{
// squid will far too far behind if he stops running to spit at this distance from the enemy.
@ -435,10 +533,118 @@ int CNPC_Bullsquid::RangeAttack1Conditions( float flDot, float flDist )
return( COND_CAN_RANGE_ATTACK1 );
}
return( COND_NONE );
}
//
// FIXME: Create this in a better fashion!
//
Vector VecCheckThrowToleranceSquid( CBaseEntity *pEdict, const Vector &vecSpot1, Vector vecSpot2, float flSpeed, float flTolerance )
{
flSpeed = MAX( 1.0f, flSpeed );
float flGravity = GetCurrentGravity();
Vector vecGrenadeVel = (vecSpot2 - vecSpot1);
// throw at a constant time
float time = vecGrenadeVel.Length( ) / flSpeed;
vecGrenadeVel = vecGrenadeVel * (1.0 / time);
// adjust upward toss to compensate for gravity loss
vecGrenadeVel.z += flGravity * time * 0.5;
Vector vecApex = vecSpot1 + (vecSpot2 - vecSpot1) * 0.5;
vecApex.z += 0.5 * flGravity * (time * 0.5) * (time * 0.5);
trace_t tr;
UTIL_TraceLine( vecSpot1, vecApex, MASK_SOLID, pEdict, COLLISION_GROUP_NONE, &tr );
if (tr.fraction != 1.0)
{
// fail!
//if ( g_debug_antlion_worker.GetBool() )
//{
NDebugOverlay::Line( vecSpot1, vecApex, 255, 0, 0, true, 5.0 );
//}
return vec3_origin;
}
//if ( g_debug_antlion_worker.GetBool() )
//{
NDebugOverlay::Line( vecSpot1, vecApex, 0, 255, 0, true, 5.0 );
//}
UTIL_TraceLine( vecApex, vecSpot2, MASK_SOLID_BRUSHONLY, pEdict, COLLISION_GROUP_NONE, &tr );
if ( tr.fraction != 1.0 )
{
bool bFail = true;
// Didn't make it all the way there, but check if we're within our tolerance range
if ( flTolerance > 0.0f )
{
float flNearness = ( tr.endpos - vecSpot2 ).LengthSqr();
if ( flNearness < Square( flTolerance ) )
{
//if ( g_debug_antlion_worker.GetBool() )
//{
NDebugOverlay::Sphere( tr.endpos, vec3_angle, flTolerance, 0, 255, 0, 0, true, 5.0 );
//}
bFail = false;
}
}
if ( bFail )
{
NDebugOverlay::Line( vecApex, vecSpot2, 255, 0, 0, true, 5.0 );
NDebugOverlay::Sphere( tr.endpos, vec3_angle, flTolerance, 255, 0, 0, 0, true, 5.0 );
return vec3_origin;
}
}
return vecGrenadeVel;
}
//-----------------------------------------------------------------------------
// Purpose: Get a toss direction that will properly lob spit to hit a target
// Input : &vecStartPos - Where the spit will start from
// &vecTarget - Where the spit is meant to land
// *vecOut - The resulting vector to lob the spit
// Output : Returns true on success, false on failure.
//-----------------------------------------------------------------------------
bool CNPC_Bullsquid::GetSpitVector( const Vector &vecStartPos, const Vector &vecTarget, Vector *vecOut )
{
// Try the most direct route
Vector vecToss = VecCheckThrowToleranceSquid( this, vecStartPos, vecTarget, sk_bullsquid_spit_speed.GetFloat(), (10.0f*12.0f) );
// If this failed then try a little faster (flattens the arc)
if ( vecToss == vec3_origin )
{
vecToss = VecCheckThrowToleranceSquid( this, vecStartPos, vecTarget, sk_bullsquid_spit_speed.GetFloat() * 1.5f, (10.0f*12.0f) );
if ( vecToss == vec3_origin )
return false;
}
// Save out the result
if ( vecOut )
{
*vecOut = vecToss;
}
return true;
}
//=========================================================
// MeleeAttack2Conditions - bullsquid is a big guy, so has a longer
// melee range than most monsters. This is the tailwhip attack

View File

@ -57,6 +57,9 @@ public:
void StartTask ( const Task_t *pTask );
void RunTask ( const Task_t *pTask );
// Copied from antlion
virtual bool GetSpitVector( const Vector &vecStartPos, const Vector &vecTarget, Vector *vecOut );
NPC_STATE SelectIdealState ( void );
DEFINE_CUSTOM_AI;
@ -70,5 +73,7 @@ private:
float m_flHungryTime;// set this is a future time to stop the monster from eating for a while.
float m_nextSquidSoundTime;
Vector m_vecSaveSpitVelocity;
};
#endif // NPC_BULLSQUID_H

View File

@ -0,0 +1,176 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
// This is a skeleton file for use when creating a new
// NPC. Copy and rename this file for the new
// NPC and add the copy to the build.
//
// Leave this file in the build until we ship! Allowing
// this file to be rebuilt with the rest of the game ensures
// that it stays up to date with the rest of the NPC code.
//
// Replace occurances of CNPC_Test with the new NPC's
// classname. Don't forget the lower-case occurance in
// LINK_ENTITY_TO_CLASS()
//
//
// ASSUMPTIONS MADE:
//
// You're making a character based on CAI_BaseNPC. If this
// is not true, make sure you replace all occurances
// of 'CAI_BaseNPC' in this file with the appropriate
// parent class.
//
// You're making a human-sized NPC that walks.
//
//=============================================================================//
#include "cbase.h"
#include "ai_default.h"
#include "ai_task.h"
#include "ai_schedule.h"
#include "ai_hull.h"
#include "soundent.h"
#include "game.h"
#include "npcevent.h"
#include "entitylist.h"
#include "activitylist.h"
#include "ai_basenpc.h"
#include "engine/IEngineSound.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
//=========================================================
// Private activities
//=========================================================
int ACT_TESTCUSTOMACTIVITY = -1;
//=========================================================
// Custom schedules
//=========================================================
enum
{
SCHED_TESTCUSTOMSCHEDULE = LAST_SHARED_SCHEDULE,
};
//=========================================================
// Custom tasks
//=========================================================
enum
{
TASK_TESTCUSTOMTASK = LAST_SHARED_TASK,
};
//=========================================================
// Custom Conditions
//=========================================================
enum
{
COND_TESTCUSTOMCONDITION = LAST_SHARED_CONDITION,
};
//=========================================================
//=========================================================
class CNPC_Test : public CAI_BaseNPC
{
DECLARE_CLASS( CNPC_Test, CAI_BaseNPC );
public:
void Precache( void );
void Spawn( void );
Class_T Classify( void );
DECLARE_DATADESC();
// This is a dummy field. In order to provide save/restore
// code in this file, we must have at least one field
// for the code to operate on. Delete this field when
// you are ready to do your own save/restore for this
// character.
int m_iDeleteThisField;
DEFINE_CUSTOM_AI;
};
LINK_ENTITY_TO_CLASS( npc_test, CNPC_Test );
IMPLEMENT_CUSTOM_AI( npc_citizen,CNPC_Test );
//---------------------------------------------------------
// Save/Restore
//---------------------------------------------------------
BEGIN_DATADESC( CNPC_Test )
DEFINE_FIELD( m_iDeleteThisField, FIELD_INTEGER ),
END_DATADESC()
//-----------------------------------------------------------------------------
// Purpose: Initialize the custom schedules
// Input :
// Output :
//-----------------------------------------------------------------------------
void CNPC_Test::InitCustomSchedules(void)
{
INIT_CUSTOM_AI(CNPC_Test);
ADD_CUSTOM_TASK(CNPC_Test, TASK_TESTCUSTOMTASK);
ADD_CUSTOM_SCHEDULE(CNPC_Test, SCHED_TESTCUSTOMSCHEDULE);
ADD_CUSTOM_ACTIVITY(CNPC_Test, ACT_TESTCUSTOMACTIVITY);
ADD_CUSTOM_CONDITION(CNPC_Test, COND_TESTCUSTOMCONDITION);
}
//-----------------------------------------------------------------------------
// Purpose:
//
//
//-----------------------------------------------------------------------------
void CNPC_Test::Precache( void )
{
PrecacheModel("models/humans/group01/female_01.mdl");
BaseClass::Precache();
}
//-----------------------------------------------------------------------------
// Purpose:
//
//
//-----------------------------------------------------------------------------
void CNPC_Test::Spawn( void )
{
Precache();
SetModel( "models/humans/group01/female_01.mdl" );
SetHullType(HULL_HUMAN);
SetHullSizeNormal();
SetSolid( SOLID_BBOX );
AddSolidFlags( FSOLID_NOT_STANDABLE );
SetMoveType( MOVETYPE_STEP );
SetBloodColor( BLOOD_COLOR_RED );
m_iHealth = 20;
m_flFieldOfView = 0.5;
m_NPCState = NPC_STATE_NONE;
CapabilitiesClear();
//CapabilitiesAdd( bits_CAP_NONE );
NPCInit();
}
//-----------------------------------------------------------------------------
// Purpose:
//
//
// Output :
//-----------------------------------------------------------------------------
Class_T CNPC_Test::Classify( void )
{
return CLASS_TEST;
}

View File

@ -404,6 +404,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_BARNACLE
@ -439,7 +440,8 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_BULLSEYE
// ------------------------------------------------------------
@ -504,6 +506,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_CITIZEN_PASSIVE
@ -536,7 +539,8 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_PLAYER_ALLY, D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_HACKED_ROLLERMINE,D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_TEST,D_FR, 0);
// ------------------------------------------------------------
// > CLASS_CITIZEN_REBEL
// ------------------------------------------------------------
@ -568,7 +572,8 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_PLAYER_ALLY, D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_HACKED_ROLLERMINE,D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_COMBINE
// ------------------------------------------------------------
@ -600,7 +605,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_COMBINE_GUNSHIP
// ------------------------------------------------------------
@ -632,7 +637,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_COMBINE_HUNTER
// ------------------------------------------------------------
@ -664,7 +669,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_CONSCRIPT
// ------------------------------------------------------------
@ -696,7 +701,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_PLAYER_ALLY, D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_HACKED_ROLLERMINE,D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_FLARE
// ------------------------------------------------------------
@ -761,7 +766,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_HACKED_ROLLERMINE,D_FR, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_HOUNDEYE
// ------------------------------------------------------------
@ -794,7 +799,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_MANHACK
@ -827,7 +832,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_METROPOLICE
// ------------------------------------------------------------
@ -859,6 +864,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_MILITARY
@ -891,7 +897,8 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_MISSILE
// ------------------------------------------------------------
@ -923,7 +930,8 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_NONE
// ------------------------------------------------------------
@ -986,7 +994,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_PLAYER_ALLY, D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_PLAYER_ALLY_VITAL,D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_HACKED_ROLLERMINE,D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_PLAYER_ALLY
// ------------------------------------------------------------
@ -1018,7 +1026,8 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_PLAYER_ALLY, D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_PLAYER_ALLY_VITAL,D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_HACKED_ROLLERMINE,D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_PLAYER_ALLY_VITAL
// ------------------------------------------------------------
@ -1050,7 +1059,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_PLAYER_ALLY, D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_PLAYER_ALLY_VITAL,D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_HACKED_ROLLERMINE,D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_SCANNER
// ------------------------------------------------------------
@ -1081,8 +1090,8 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_EARTH_FAUNA, D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_STALKER
// ------------------------------------------------------------
@ -1114,7 +1123,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_VORTIGAUNT
// ------------------------------------------------------------
@ -1146,7 +1155,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_PLAYER_ALLY, D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_PLAYER_ALLY_VITAL,D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_HACKED_ROLLERMINE,D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_ZOMBIE
// ------------------------------------------------------------
@ -1178,7 +1187,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_PROTOSNIPER
// ------------------------------------------------------------
@ -1210,7 +1219,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_HACKED_ROLLERMINE,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_EARTH_FAUNA
//
@ -1245,7 +1254,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_PLAYER_ALLY, D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_HACKED_ROLLERMINE,D_NU, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_TEST,D_HT, 0);
// ------------------------------------------------------------
// > CLASS_HACKED_ROLLERMINE
// ------------------------------------------------------------
@ -1277,6 +1286,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_PLAYER_ALLY, D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_PLAYER_ALLY_VITAL,D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_HACKED_ROLLERMINE,D_LI, 0);
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_TEST,D_HT, 0);
}