mirror of
https://github.com/mapbase-source/source-sdk-2013.git
synced 2025-04-20 16:32:30 +03:00
commit
672ce05271
4
.gitignore
vendored
4
.gitignore
vendored
@ -54,3 +54,7 @@ config.cfg
|
||||
# shader files
|
||||
*.tmp
|
||||
|
||||
*.lib
|
||||
*.filters
|
||||
*.vpc_crc
|
||||
*.sentinel
|
||||
|
@ -1471,25 +1471,6 @@ void CDetailObjectSystem::LevelInitPreEntity()
|
||||
}
|
||||
}
|
||||
|
||||
if ( m_DetailObjects.Count() || m_DetailSpriteDict.Count() )
|
||||
{
|
||||
// There are detail objects in the level, so precache the material
|
||||
PrecacheMaterial( DETAIL_SPRITE_MATERIAL );
|
||||
IMaterial *pMat = m_DetailSpriteMaterial;
|
||||
// adjust for non-square textures (cropped)
|
||||
float flRatio = (float)( pMat->GetMappingWidth() ) / pMat->GetMappingHeight();
|
||||
if ( flRatio > 1.0 )
|
||||
{
|
||||
for( int i = 0; i<m_DetailSpriteDict.Count(); i++ )
|
||||
{
|
||||
m_DetailSpriteDict[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDict[i].m_TexLR.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexLR.y *= flRatio;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int detailPropLightingLump;
|
||||
if( g_pMaterialSystemHardwareConfig->GetHDRType() != HDR_TYPE_NONE )
|
||||
{
|
||||
@ -1512,13 +1493,30 @@ void CDetailObjectSystem::LevelInitPreEntity()
|
||||
|
||||
void CDetailObjectSystem::LevelInitPostEntity()
|
||||
{
|
||||
const char *pDetailSpriteMaterial = DETAIL_SPRITE_MATERIAL;
|
||||
C_World *pWorld = GetClientWorldEntity();
|
||||
if ( pWorld && pWorld->GetDetailSpriteMaterial() && *(pWorld->GetDetailSpriteMaterial()) )
|
||||
if ( m_DetailObjects.Count() || m_DetailSpriteDict.Count() )
|
||||
{
|
||||
pDetailSpriteMaterial = pWorld->GetDetailSpriteMaterial();
|
||||
const char *pDetailSpriteMaterial = DETAIL_SPRITE_MATERIAL;
|
||||
C_World *pWorld = GetClientWorldEntity();
|
||||
if ( pWorld && pWorld->GetDetailSpriteMaterial() && *(pWorld->GetDetailSpriteMaterial()) )
|
||||
pDetailSpriteMaterial = pWorld->GetDetailSpriteMaterial();
|
||||
|
||||
m_DetailSpriteMaterial.Init( pDetailSpriteMaterial, TEXTURE_GROUP_OTHER );
|
||||
PrecacheMaterial( pDetailSpriteMaterial );
|
||||
IMaterial *pMat = m_DetailSpriteMaterial;
|
||||
|
||||
// adjust for non-square textures (cropped)
|
||||
float flRatio = pMat->GetMappingWidth() / pMat->GetMappingHeight();
|
||||
if ( flRatio > 1.0 )
|
||||
{
|
||||
for( int i = 0; i<m_DetailSpriteDict.Count(); i++ )
|
||||
{
|
||||
m_DetailSpriteDict[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDict[i].m_TexLR.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexLR.y *= flRatio;
|
||||
}
|
||||
}
|
||||
}
|
||||
m_DetailSpriteMaterial.Init( pDetailSpriteMaterial, TEXTURE_GROUP_OTHER );
|
||||
|
||||
if ( GetDetailController() )
|
||||
{
|
||||
|
@ -2565,7 +2565,7 @@ void CNPC_Combine::SpeakSentence( int sentenceType )
|
||||
//=========================================================
|
||||
// PainSound
|
||||
//=========================================================
|
||||
void CNPC_Combine::PainSound ( void )
|
||||
void CNPC_Combine::PainSound ( const CTakeDamageInfo &info )
|
||||
{
|
||||
// NOTE: The response system deals with this at the moment
|
||||
if ( GetFlags() & FL_DISSOLVING )
|
||||
|
@ -126,7 +126,7 @@ public:
|
||||
// Sounds
|
||||
// -------------
|
||||
void DeathSound( void );
|
||||
void PainSound( void );
|
||||
void PainSound( const CTakeDamageInfo &info );
|
||||
void IdleSound( void );
|
||||
void AlertSound( void );
|
||||
void LostEnemySound( void );
|
||||
|
@ -206,7 +206,7 @@ bool CHalfLife2::Damage_IsTimeBased( int iDmgType )
|
||||
// Damage types that are time-based.
|
||||
#ifdef HL2_EPISODIC
|
||||
// This makes me think EP2 should have its own rules, but they are #ifdef all over in here.
|
||||
return ( ( iDmgType & ( DMG_PARALYZE | DMG_NERVEGAS | DMG_POISON | DMG_RADIATION | DMG_DROWNRECOVER | DMG_SLOWBURN ) ) != 0 );
|
||||
return ( ( iDmgType & ( DMG_PARALYZE | DMG_NERVEGAS | DMG_POISON | DMG_ACID | DMG_RADIATION | DMG_DROWNRECOVER | DMG_SLOWBURN ) ) != 0 );
|
||||
#else
|
||||
return BaseClass::Damage_IsTimeBased( iDmgType );
|
||||
#endif
|
||||
|
18
sp/game/mod_episodic/bullsquid.fgd
Normal file
18
sp/game/mod_episodic/bullsquid.fgd
Normal file
@ -0,0 +1,18 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Purpose: Half-Life 2 mod game definition file (.fgd)
|
||||
// Defines new entities for bullsquid
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
@include "base.fgd"
|
||||
@include "halflife2.fgd"
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// NPCs
|
||||
//
|
||||
//-------------------------------------------------------------------------
|
||||
@NPCClass base(BaseNPC) studio(" "models/bullsquid.mdl" ) = npc_bullsquid : "Bullsquid"
|
||||
[
|
||||
]
|
11
sp/game/mod_episodic/flaregun.fgd
Normal file
11
sp/game/mod_episodic/flaregun.fgd
Normal file
@ -0,0 +1,11 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Purpose: Half-Life 2 mod game definition file (.fgd)
|
||||
// Defines new entities for the flaregun weapon
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
@include "halflife2.fgd"
|
||||
|
||||
@PointClass base(Item) studio("models/items/boxflares.mdl")= item_box_flare_rounds : "Box of Flare Rounds" []
|
||||
@PointClass base(Weapon) studio("models/weapons/w_pistol.mdl") = weapon_flaregun : "Flaregun" []
|
4672
sp/game/mod_episodic/halflife2.fgd
Normal file
4672
sp/game/mod_episodic/halflife2.fgd
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -119,8 +119,11 @@ game_sounds_manifest
|
||||
"precache_file" "scripts/npc_sounds_alyx_episodic2.txt"
|
||||
"precache_file" "scripts/npc_sounds_turret_episodic2.txt"
|
||||
|
||||
// 1upD's Halloween NPCs
|
||||
// 1upD's Custom NPCs
|
||||
"precache_file" "scripts/npc_sounds_shadow_walker.txt"
|
||||
"precache_file" "scripts/npc_sounds_lost_soul.txt"
|
||||
"precache_file" "scripts/npc_sounds_bullsquid.txt"
|
||||
|
||||
|
||||
|
||||
}
|
1523
sp/game/mod_episodic/scripts/game_sounds_weapons.txt
Normal file
1523
sp/game/mod_episodic/scripts/game_sounds_weapons.txt
Normal file
File diff suppressed because it is too large
Load Diff
98
sp/game/mod_episodic/scripts/npc_sounds_bullsquid.txt
Normal file
98
sp/game/mod_episodic/scripts/npc_sounds_bullsquid.txt
Normal file
@ -0,0 +1,98 @@
|
||||
// Bullsquid
|
||||
"NPC_Bullsquid.Idle"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_75dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_idle1.wav"
|
||||
"wave" "bullchicken/bc_idle2.wav"
|
||||
"wave" "bullchicken/bc_idle3.wav"
|
||||
"wave" "bullchicken/bc_idle4.wav"
|
||||
"wave" "bullchicken/bc_idle5.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_Bullsquid.Pain"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_85dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_pain1.wav"
|
||||
"wave" "bullchicken/bc_pain2.wav"
|
||||
"wave" "bullchicken/bc_pain3.wav"
|
||||
"wave" "bullchicken/bc_pain4.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"npc_bullsquid.Alert"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_85dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_idle1.wav"
|
||||
"wave" "bullchicken/bc_idle2.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_Bullsquid.Die"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_85dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_die1.wav"
|
||||
"wave" "bullchicken/bc_die2.wav"
|
||||
"wave" "bullchicken/bc_die3.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_Bullsquid.Attack1"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_100dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_attack2.wav"
|
||||
"wave" "bullchicken/bc_attack3.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_Bullsquid.Bite"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_85dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_bite2.wav"
|
||||
"wave" "bullchicken/bc_bite3.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_Bullsquid.Growl"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_80dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_attackgrowl.wav"
|
||||
"wave" "bullchicken/bc_attackgrowl2.wav"
|
||||
"wave" "bullchicken/bc_attackgrowl3.wav"
|
||||
}
|
||||
}
|
74
sp/game/mod_episodic/scripts/weapon_flaregun.txt
Normal file
74
sp/game/mod_episodic/scripts/weapon_flaregun.txt
Normal file
@ -0,0 +1,74 @@
|
||||
// Pistol
|
||||
|
||||
WeaponData
|
||||
{
|
||||
// Weapon data is loaded by both the Game and Client DLLs.
|
||||
"printname" "#HL2_Flaregun"
|
||||
"viewmodel" "models/weapons/v_flaregun.mdl"
|
||||
"playermodel" "models/weapons/w_flaregun.mdl"
|
||||
"anim_prefix" "pistol"
|
||||
"bucket" "1"
|
||||
"bucket_position" "2"
|
||||
"bucket_360" "0"
|
||||
"bucket_position_360" "0"
|
||||
|
||||
"clip_size" "1"
|
||||
"primary_ammo" "FlareRound"
|
||||
"secondary_ammo" "None"
|
||||
|
||||
"weight" "2"
|
||||
"rumble" "1"
|
||||
"item_flags" "0"
|
||||
|
||||
// Sounds for the weapon. There is a max of 16 sounds per category (i.e. max 16 "single_shot" sounds)
|
||||
SoundData
|
||||
{
|
||||
|
||||
"reload" "Weapon_FlareGun.Reload"
|
||||
"reload_npc" "Weapon_FlareGun.Reload"
|
||||
"empty" "Weapon_Pistol.Empty"
|
||||
"single_shot" "Weapon_FlareGun.Single"
|
||||
"single_shot_npc" "Weapon_FlareGun.Single"
|
||||
"special1" "Weapon_Pistol.Special1"
|
||||
"special2" "Weapon_Pistol.Special2"
|
||||
"burst" "Weapon_Pistol.Burst"
|
||||
}
|
||||
|
||||
// Weapon Sprite data is loaded by the Client DLL.
|
||||
TextureData
|
||||
{
|
||||
"weapon"
|
||||
{
|
||||
"font" "WeaponIcons"
|
||||
"character" "d"
|
||||
}
|
||||
"weapon_s"
|
||||
{
|
||||
"font" "WeaponIconsSelected"
|
||||
"character" "d"
|
||||
}
|
||||
"weapon_small"
|
||||
{
|
||||
"font" "WeaponIconsSmall"
|
||||
"character" "d"
|
||||
}
|
||||
"ammo"
|
||||
{
|
||||
"font" "WeaponIconsSmall"
|
||||
"character" "p"
|
||||
}
|
||||
"crosshair"
|
||||
{
|
||||
"font" "Crosshairs"
|
||||
"character" "Q"
|
||||
}
|
||||
"autoaim"
|
||||
{
|
||||
"file" "sprites/crosshairs"
|
||||
"x" "0"
|
||||
"y" "48"
|
||||
"width" "24"
|
||||
"height" "24"
|
||||
}
|
||||
}
|
||||
}
|
@ -21,4 +21,5 @@ weapon_manifest
|
||||
|
||||
// Custom
|
||||
"file" "scripts/weapon_custommelee.txt"
|
||||
"file" "scripts/weapon_flaregun.txt"
|
||||
}
|
@ -1149,7 +1149,7 @@ void C_BaseFlex::SetupWeights( const matrix3x4_t *pBoneToWorld, int nFlexWeightC
|
||||
{
|
||||
// hack in an initialization
|
||||
LinkToGlobalFlexControllers( GetModelPtr() );
|
||||
m_iBlink = AddGlobalFlexController( "UH" );
|
||||
m_iBlink = AddGlobalFlexController( "blink" );
|
||||
|
||||
if ( SetupGlobalWeights( pBoneToWorld, nFlexWeightCount, pFlexWeights, pFlexDelayedWeights ) )
|
||||
{
|
||||
|
@ -221,15 +221,24 @@ void C_EnvProjectedTexture::UpdateLight( bool bForceUpdate )
|
||||
|
||||
g_pClientShadowMgr->SetFlashlightLightWorld( m_LightHandle, m_bLightWorld );
|
||||
|
||||
if ( bForceUpdate == false )
|
||||
{
|
||||
|
||||
// The conditional to check if bForceUpdate == false is commented out based on a guide on VDC
|
||||
// https://developer.valvesoftware.com/wiki/Env_projectedtexture/fixes
|
||||
// This was done so that projected textures may be parented.
|
||||
// Change made by Derek Dik on 9/4/2016
|
||||
|
||||
//if ( bForceUpdate == false )
|
||||
//{
|
||||
g_pClientShadowMgr->UpdateProjectedTexture( m_LightHandle, true );
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
void C_EnvProjectedTexture::Simulate( void )
|
||||
{
|
||||
UpdateLight( false );
|
||||
// According to VDC, we want to update the light based on when there is a movement parent
|
||||
//https://developer.valvesoftware.com/wiki/Env_projectedtexture/fixes
|
||||
// Change made by Derek Dik on 9/4/2016
|
||||
UpdateLight( GetMoveParent() != NULL );
|
||||
|
||||
BaseClass::Simulate();
|
||||
}
|
||||
|
@ -1290,9 +1290,13 @@ bool CClientShadowMgr::Init()
|
||||
|
||||
SetShadowBlobbyCutoffArea( 0.005 );
|
||||
|
||||
bool bTools = CommandLine()->CheckParm( "-tools" ) != NULL;
|
||||
m_nMaxDepthTextureShadows = bTools ? 4 : 1; // Just one shadow depth texture in games, more in tools
|
||||
|
||||
// Raise the max projected texture limit to 8
|
||||
// https://developer.valvesoftware.com/wiki/Env_projectedtexture/fixes
|
||||
//bool bTools = CommandLine()->CheckParm( "-tools" ) != NULL;
|
||||
//m_nMaxDepthTextureShadows = bTools ? 4 : 1; // Just one shadow depth texture in games, more in tools
|
||||
m_nMaxDepthTextureShadows = 8; //with your number
|
||||
|
||||
|
||||
bool bLowEnd = ( g_pMaterialSystemHardwareConfig->GetDXSupportLevel() < 80 );
|
||||
|
||||
if ( !bLowEnd && r_shadowrendertotexture.GetBool() )
|
||||
|
@ -1471,24 +1471,6 @@ void CDetailObjectSystem::LevelInitPreEntity()
|
||||
}
|
||||
}
|
||||
|
||||
if ( m_DetailObjects.Count() || m_DetailSpriteDict.Count() )
|
||||
{
|
||||
// There are detail objects in the level, so precache the material
|
||||
PrecacheMaterial( DETAIL_SPRITE_MATERIAL );
|
||||
IMaterial *pMat = m_DetailSpriteMaterial;
|
||||
// adjust for non-square textures (cropped)
|
||||
float flRatio = (float)( pMat->GetMappingWidth() ) / pMat->GetMappingHeight();
|
||||
if ( flRatio > 1.0 )
|
||||
{
|
||||
for( int i = 0; i<m_DetailSpriteDict.Count(); i++ )
|
||||
{
|
||||
m_DetailSpriteDict[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDict[i].m_TexLR.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexLR.y *= flRatio;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int detailPropLightingLump;
|
||||
if( g_pMaterialSystemHardwareConfig->GetHDRType() != HDR_TYPE_NONE )
|
||||
@ -1512,13 +1494,29 @@ void CDetailObjectSystem::LevelInitPreEntity()
|
||||
|
||||
void CDetailObjectSystem::LevelInitPostEntity()
|
||||
{
|
||||
if ( m_DetailObjects.Count() || m_DetailSpriteDict.Count() )
|
||||
{
|
||||
const char *pDetailSpriteMaterial = DETAIL_SPRITE_MATERIAL;
|
||||
C_World *pWorld = GetClientWorldEntity();
|
||||
if ( pWorld && pWorld->GetDetailSpriteMaterial() && *(pWorld->GetDetailSpriteMaterial()) )
|
||||
{
|
||||
pDetailSpriteMaterial = pWorld->GetDetailSpriteMaterial();
|
||||
}
|
||||
|
||||
m_DetailSpriteMaterial.Init( pDetailSpriteMaterial, TEXTURE_GROUP_OTHER );
|
||||
PrecacheMaterial( pDetailSpriteMaterial );
|
||||
IMaterial *pMat = m_DetailSpriteMaterial;
|
||||
// adjust for non-square textures (cropped)
|
||||
float flRatio = pMat->GetMappingWidth() / pMat->GetMappingHeight();
|
||||
if ( flRatio > 1.0 )
|
||||
{
|
||||
for( int i = 0; i<m_DetailSpriteDict.Count(); i++ )
|
||||
{
|
||||
m_DetailSpriteDict[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDict[i].m_TexLR.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexLR.y *= flRatio;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( GetDetailController() )
|
||||
{
|
||||
|
@ -99,14 +99,14 @@ enum Class_T
|
||||
CLASS_ANTLION,
|
||||
CLASS_BARNACLE,
|
||||
CLASS_BULLSEYE,
|
||||
//CLASS_BULLSQUID,
|
||||
CLASS_BULLSQUID,
|
||||
CLASS_CITIZEN_PASSIVE,
|
||||
CLASS_CITIZEN_REBEL,
|
||||
CLASS_COMBINE,
|
||||
CLASS_COMBINE_GUNSHIP,
|
||||
CLASS_CONSCRIPT,
|
||||
CLASS_HEADCRAB,
|
||||
//CLASS_HOUNDEYE,
|
||||
CLASS_HOUNDEYE,
|
||||
CLASS_MANHACK,
|
||||
CLASS_METROPOLICE,
|
||||
CLASS_MILITARY,
|
||||
@ -120,6 +120,7 @@ enum Class_T
|
||||
CLASS_EARTH_FAUNA,
|
||||
CLASS_HACKED_ROLLERMINE,
|
||||
CLASS_COMBINE_HUNTER,
|
||||
CLASS_TEST,
|
||||
|
||||
NUM_AI_CLASSES
|
||||
};
|
||||
|
@ -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.
|
||||
|
@ -606,6 +606,7 @@ enum
|
||||
AMMOCRATE_CROSSBOW,
|
||||
AMMOCRATE_AR2_ALTFIRE,
|
||||
AMMOCRATE_SMG_ALTFIRE,
|
||||
AMMOCRATE_FLAREROUND,
|
||||
NUM_AMMO_CRATE_TYPES,
|
||||
};
|
||||
|
||||
@ -693,6 +694,7 @@ const char *CItem_AmmoCrate::m_lpzModelNames[NUM_AMMO_CRATE_TYPES] =
|
||||
//FIXME: This model is incorrect!
|
||||
"models/items/ammocrate_ar2.mdl", // Combine Ball
|
||||
"models/items/ammocrate_smg2.mdl", // smg grenade
|
||||
"models/items/ammocrate_pistol.mdl", // Flareround
|
||||
};
|
||||
|
||||
// Ammo type names
|
||||
@ -708,6 +710,7 @@ const char *CItem_AmmoCrate::m_lpzAmmoNames[NUM_AMMO_CRATE_TYPES] =
|
||||
"XBowBolt",
|
||||
"AR2AltFire",
|
||||
"SMG1_Grenade",
|
||||
"FlareRound",
|
||||
};
|
||||
|
||||
// Ammo amount given per +use
|
||||
@ -723,6 +726,7 @@ int CItem_AmmoCrate::m_nAmmoAmounts[NUM_AMMO_CRATE_TYPES] =
|
||||
50, // Crossbow
|
||||
3, // AR2 alt-fire
|
||||
5,
|
||||
3
|
||||
};
|
||||
|
||||
const char *CItem_AmmoCrate::m_pGiveWeapon[NUM_AMMO_CRATE_TYPES] =
|
||||
@ -737,6 +741,7 @@ const char *CItem_AmmoCrate::m_pGiveWeapon[NUM_AMMO_CRATE_TYPES] =
|
||||
NULL, // Crossbow
|
||||
NULL, // AR2 alt-fire
|
||||
NULL, // SMG alt-fire
|
||||
NULL
|
||||
};
|
||||
|
||||
#define AMMO_CRATE_CLOSE_DELAY 1.5f
|
||||
|
@ -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"
|
||||
@ -38,10 +39,12 @@
|
||||
|
||||
#define SQUID_SPRINT_DIST 256 // how close the squid has to get before starting to sprint and refusing to swerve
|
||||
|
||||
ConVar sk_bullsquid_health( "sk_bullsquid_health", "0" );
|
||||
ConVar sk_bullsquid_dmg_bite( "sk_bullsquid_dmg_bite", "0" );
|
||||
ConVar sk_bullsquid_dmg_whip( "sk_bullsquid_dmg_whip", "0" );
|
||||
|
||||
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", "10");
|
||||
ConVar sk_bullsquid_spit_min_wait( "sk_bullsquid_spit_min_wait", "2");
|
||||
ConVar sk_bullsquid_spit_max_wait( "sk_bullsquid_spit_max_wait", "5");
|
||||
//=========================================================
|
||||
// monster-specific schedule types
|
||||
//=========================================================
|
||||
@ -87,6 +90,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 +111,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 +160,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 +169,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 +272,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 +284,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 +305,97 @@ 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 );
|
||||
|
||||
vSpitPos = GetAbsOrigin() + Vector(0, 0, 64); // The Bullsquid model does not have an origin!
|
||||
|
||||
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 +418,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 +504,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.
|
||||
@ -425,30 +526,139 @@ int CNPC_Bullsquid::RangeAttack1Conditions( float flDot, float flDist )
|
||||
if ( IsMoving() )
|
||||
{
|
||||
// don't spit again for a long time, resume chasing enemy.
|
||||
m_flNextSpitTime = gpGlobals->curtime + 5;
|
||||
m_flNextSpitTime = gpGlobals->curtime + sk_bullsquid_spit_max_wait.GetFloat();
|
||||
}
|
||||
else
|
||||
{
|
||||
// not moving, so spit again pretty soon.
|
||||
m_flNextSpitTime = gpGlobals->curtime + 0.5;
|
||||
m_flNextSpitTime = gpGlobals->curtime + sk_bullsquid_spit_min_wait.GetFloat(); // was 0.5, increased to 2 to prevent spamming behavior
|
||||
}
|
||||
|
||||
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, 1024.0f, (10.0f*12.0f) );
|
||||
|
||||
// If this failed then try a little faster (flattens the arc)
|
||||
if ( vecToss == vec3_origin )
|
||||
{
|
||||
vecToss = VecCheckThrowToleranceSquid( this, vecStartPos, vecTarget, 1024.0f * 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
|
||||
//=========================================================
|
||||
int CNPC_Bullsquid::MeleeAttack1Conditions( float flDot, float flDist )
|
||||
{
|
||||
if ( GetEnemy()->m_iHealth <= sk_bullsquid_dmg_whip.GetFloat() && flDist <= 85 && flDot >= 0.7 )
|
||||
{
|
||||
return ( COND_CAN_MELEE_ATTACK1 );
|
||||
}
|
||||
// Animation is broken - DO NOT tail whip!
|
||||
//if ( GetEnemy()->m_iHealth <= sk_bullsquid_dmg_whip.GetFloat() && flDist <= 85 && flDot >= 0.7 )
|
||||
//{
|
||||
// return ( COND_CAN_MELEE_ATTACK1 );
|
||||
//}
|
||||
|
||||
return( COND_NONE );
|
||||
}
|
||||
@ -461,7 +671,9 @@ int CNPC_Bullsquid::MeleeAttack1Conditions( float flDot, float flDist )
|
||||
//=========================================================
|
||||
int CNPC_Bullsquid::MeleeAttack2Conditions( float flDot, float flDist )
|
||||
{
|
||||
if ( flDist <= 85 && flDot >= 0.7 && !HasCondition( COND_CAN_MELEE_ATTACK1 ) ) // The player & bullsquid can be as much as their bboxes
|
||||
if ( flDist <= 85 && flDot >= 0.7
|
||||
//&& !HasCondition( COND_CAN_MELEE_ATTACK1 )
|
||||
) // The player & bullsquid can be as much as their bboxes
|
||||
return ( COND_CAN_MELEE_ATTACK2 );
|
||||
|
||||
return( COND_NONE );
|
||||
@ -491,14 +703,14 @@ void CNPC_Bullsquid::RemoveIgnoredConditions( void )
|
||||
if ( GetEnemy() != NULL )
|
||||
{
|
||||
// ( Unless after a tasty headcrab, yumm ^_^ )
|
||||
if ( FClassnameIs( GetEnemy(), "monster_headcrab" ) )
|
||||
if ( FClassnameIs( GetEnemy(), "npc_headcrab" ) )
|
||||
ClearCondition( COND_SMELL );
|
||||
}
|
||||
}
|
||||
|
||||
Disposition_t CNPC_Bullsquid::IRelationType( CBaseEntity *pTarget )
|
||||
{
|
||||
if ( gpGlobals->curtime - m_flLastHurtTime < 5 && FClassnameIs( pTarget, "monster_headcrab" ) )
|
||||
if ( gpGlobals->curtime - m_flLastHurtTime < 5 && FClassnameIs( pTarget, "npc_headcrab" ) )
|
||||
{
|
||||
// if squid has been hurt in the last 5 seconds, and is getting relationship for a headcrab,
|
||||
// tell squid to disregard crab.
|
||||
@ -543,7 +755,7 @@ int CNPC_Bullsquid::OnTakeDamage_Alive( const CTakeDamageInfo &inputInfo )
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( !FClassnameIs( inputInfo.GetAttacker(), "monster_headcrab" ) )
|
||||
if ( !FClassnameIs( inputInfo.GetAttacker(), "npc_headcrab" ) )
|
||||
{
|
||||
// don't forget about headcrabs if it was a headcrab that hurt the squid.
|
||||
m_flLastHurtTime = gpGlobals->curtime;
|
||||
@ -694,7 +906,7 @@ int CNPC_Bullsquid::SelectSchedule( void )
|
||||
|
||||
if ( HasCondition( COND_NEW_ENEMY ) )
|
||||
{
|
||||
if ( m_fCanThreatDisplay && IRelationType( GetEnemy() ) == D_HT && FClassnameIs( GetEnemy(), "monster_headcrab" ) )
|
||||
if ( m_fCanThreatDisplay && IRelationType( GetEnemy() ) == D_HT && FClassnameIs( GetEnemy(), "npc_headcrab" ) )
|
||||
{
|
||||
// this means squid sees a headcrab!
|
||||
m_fCanThreatDisplay = FALSE;// only do the headcrab dance once per lifetime.
|
||||
@ -727,10 +939,11 @@ int CNPC_Bullsquid::SelectSchedule( void )
|
||||
return SCHED_RANGE_ATTACK1;
|
||||
}
|
||||
|
||||
if ( HasCondition( COND_CAN_MELEE_ATTACK1 ) )
|
||||
{
|
||||
return SCHED_MELEE_ATTACK1;
|
||||
}
|
||||
// DO NOT tail whip!
|
||||
//if ( HasCondition( COND_CAN_MELEE_ATTACK1 ) )
|
||||
//{
|
||||
// return SCHED_MELEE_ATTACK1;
|
||||
//}
|
||||
|
||||
if ( HasCondition( COND_CAN_MELEE_ATTACK2 ) )
|
||||
{
|
||||
|
@ -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
|
@ -2565,7 +2565,7 @@ void CNPC_Combine::SpeakSentence( int sentenceType )
|
||||
//=========================================================
|
||||
// PainSound
|
||||
//=========================================================
|
||||
void CNPC_Combine::PainSound ( void )
|
||||
void CNPC_Combine::PainSound ( const CTakeDamageInfo &info )
|
||||
{
|
||||
// NOTE: The response system deals with this at the moment
|
||||
if ( GetFlags() & FL_DISSOLVING )
|
||||
|
@ -126,7 +126,7 @@ public:
|
||||
// Sounds
|
||||
// -------------
|
||||
void DeathSound( void );
|
||||
void PainSound( void );
|
||||
void PainSound( const CTakeDamageInfo &info );
|
||||
void IdleSound( void );
|
||||
void AlertSound( void );
|
||||
void LostEnemySound( void );
|
||||
|
@ -167,7 +167,7 @@ private:
|
||||
float m_flSuperFastAttackTime;
|
||||
float m_flGrenadePullTime;
|
||||
|
||||
int m_iGrenadeCount;
|
||||
int m_iGrenadeCount = ZOMBINE_MAX_GRENADES;
|
||||
|
||||
EHANDLE m_hGrenade;
|
||||
|
||||
@ -184,7 +184,7 @@ BEGIN_DATADESC( CNPC_Zombine )
|
||||
DEFINE_FIELD( m_flSuperFastAttackTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( m_hGrenade, FIELD_EHANDLE ),
|
||||
DEFINE_FIELD( m_flGrenadePullTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( m_iGrenadeCount, FIELD_INTEGER ),
|
||||
DEFINE_KEYFIELD( m_iGrenadeCount, FIELD_INTEGER, "NumGrenades" ),
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "StartSprint", InputStartSprint ),
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "PullGrenade", InputPullGrenade ),
|
||||
END_DATADESC()
|
||||
@ -225,8 +225,6 @@ void CNPC_Zombine::Spawn( void )
|
||||
|
||||
g_flZombineGrenadeTimes = gpGlobals->curtime;
|
||||
m_flGrenadePullTime = gpGlobals->curtime;
|
||||
|
||||
m_iGrenadeCount = ZOMBINE_MAX_GRENADES;
|
||||
}
|
||||
|
||||
void CNPC_Zombine::Precache( void )
|
||||
|
632
sp/src/game/server/mod/npc_base_custom.cpp
Normal file
632
sp/src/game/server/mod/npc_base_custom.cpp
Normal file
@ -0,0 +1,632 @@
|
||||
//=//=============================================================================//
|
||||
//
|
||||
// Purpose: A base class from which to extend new custom NPCs.
|
||||
// This class may seem redundant with CAI_BaseNPC and a lot of Valve's NPC classes.
|
||||
// However, the redundancy is necessary for compatibility with a variety of mods;
|
||||
// I want all new NPC content to be isolated from existing classes.
|
||||
//
|
||||
// Author: 1upD
|
||||
//
|
||||
//=============================================================================//
|
||||
#include "cbase.h"
|
||||
#include "npc_base_custom.h"
|
||||
#include "ai_hull.h"
|
||||
#include "soundent.h"
|
||||
#include "game.h"
|
||||
#include "npcevent.h"
|
||||
#include "engine/IEngineSound.h"
|
||||
#include "basehlcombatweapon_shared.h"
|
||||
#include "ai_squadslot.h"
|
||||
#include "ai_squad.h"
|
||||
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Constants
|
||||
//---------------------------------------------------------
|
||||
// TODO: Replace these with fields so that other NPCs can override them
|
||||
const float MIN_TIME_NEXT_SOUND = 0.5f;
|
||||
const float MAX_TIME_NEXT_SOUND = 1.0f;
|
||||
const float MIN_TIME_NEXT_FOUNDENEMY_SOUND = 2.0f;
|
||||
const float MAX_TIME_NEXT_FOUNDENEMY_SOUND = 5.0f;
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Save/Restore
|
||||
//---------------------------------------------------------
|
||||
BEGIN_DATADESC(CNPC_BaseCustomNPC)
|
||||
DEFINE_KEYFIELD(m_iszWeaponModelName, FIELD_STRING, "WeaponModel"),
|
||||
DEFINE_KEYFIELD(m_iHealth, FIELD_INTEGER, "Health"),
|
||||
DEFINE_KEYFIELD(m_iszFearSound, FIELD_SOUNDNAME, "FearSound"),
|
||||
DEFINE_KEYFIELD(m_iszDeathSound, FIELD_SOUNDNAME, "DeathSound"),
|
||||
DEFINE_KEYFIELD(m_iszIdleSound, FIELD_SOUNDNAME, "IdleSound"),
|
||||
DEFINE_KEYFIELD(m_iszPainSound, FIELD_SOUNDNAME, "PainSound"),
|
||||
DEFINE_KEYFIELD(m_iszAlertSound, FIELD_SOUNDNAME, "AlertSound"),
|
||||
DEFINE_KEYFIELD(m_iszLostEnemySound, FIELD_SOUNDNAME, "LostEnemySound"),
|
||||
DEFINE_KEYFIELD(m_iszFoundEnemySound, FIELD_SOUNDNAME, "FoundEnemySound"),
|
||||
DEFINE_KEYFIELD(m_bUseBothSquadSlots, FIELD_BOOLEAN, "UseBothSquadSlots"),
|
||||
DEFINE_KEYFIELD(m_bCannotOpenDoors, FIELD_BOOLEAN, "CannotOpenDoors"),
|
||||
DEFINE_KEYFIELD(m_bCanPickupWeapons, FIELD_BOOLEAN, "CanPickupWeapons"),
|
||||
|
||||
DEFINE_FIELD(m_iNumSquadmates, FIELD_INTEGER),
|
||||
DEFINE_FIELD(m_bWanderToggle, FIELD_BOOLEAN),
|
||||
DEFINE_FIELD(m_flNextSoundTime, FIELD_TIME),
|
||||
DEFINE_FIELD(m_flNextFoundEnemySoundTime, FIELD_TIME),
|
||||
DEFINE_FIELD(m_flSpeedModifier, FIELD_TIME),
|
||||
|
||||
DEFINE_INPUTFUNC(FIELD_FLOAT, "SetSpeedModifier", InputSetSpeedModifier),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "EnableOpenDoors", InputEnableOpenDoors),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "DisableOpenDoors", InputDisableOpenDoors),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "EnablePickupWeapons", InputEnablePickupWeapons),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "DisablePickupWeapons", InputDisablePickupWeapons)
|
||||
END_DATADESC()
|
||||
|
||||
AI_BEGIN_CUSTOM_NPC(npc_base_custom, CNPC_BaseCustomNPC)
|
||||
//=========================================================
|
||||
// > Melee_Attack_NoInterrupt
|
||||
//=========================================================
|
||||
DEFINE_SCHEDULE
|
||||
(
|
||||
SCHED_MELEE_ATTACK_NOINTERRUPT,
|
||||
|
||||
" Tasks"
|
||||
" TASK_STOP_MOVING 0"
|
||||
" TASK_FACE_ENEMY 0"
|
||||
" TASK_ANNOUNCE_ATTACK 1" // 1 = primary attack
|
||||
" TASK_MELEE_ATTACK1 0"
|
||||
""
|
||||
" Interrupts"
|
||||
" COND_ENEMY_DEAD"
|
||||
" COND_ENEMY_OCCLUDED"
|
||||
);
|
||||
|
||||
//=========================================================
|
||||
// SCHED_HIDE
|
||||
//=========================================================
|
||||
DEFINE_SCHEDULE
|
||||
(
|
||||
SCHED_HIDE,
|
||||
|
||||
" Tasks"
|
||||
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_COMBAT_FACE"
|
||||
" TASK_STOP_MOVING 0"
|
||||
" TASK_FIND_COVER_FROM_ENEMY 0"
|
||||
" TASK_RUN_PATH 0"
|
||||
" TASK_WAIT_FOR_MOVEMENT 0"
|
||||
" TASK_REMEMBER MEMORY:INCOVER"
|
||||
" TASK_FACE_ENEMY 0"
|
||||
""
|
||||
" Interrupts"
|
||||
" COND_HEAR_DANGER"
|
||||
" COND_NEW_ENEMY"
|
||||
" COND_ENEMY_DEAD"
|
||||
);
|
||||
AI_END_CUSTOM_NPC()
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::Precache( void )
|
||||
{
|
||||
// If no model name is supplied, use the default citizen model
|
||||
if (!GetModelName())
|
||||
{
|
||||
SetModelName(MAKE_STRING("models/monster/subject.mdl")); // TODO replace this with citizen
|
||||
}
|
||||
|
||||
if (&m_iszWeaponModelName && m_iszWeaponModelName != MAKE_STRING("")) {
|
||||
PrecacheModel(STRING(m_iszWeaponModelName));
|
||||
}
|
||||
else {
|
||||
PrecacheModel("models/props_canal/mattpipe.mdl"); // Default weapon model
|
||||
}
|
||||
|
||||
PrecacheModel(STRING(GetModelName()));
|
||||
PrecacheNPCSoundScript(&m_iszFearSound, MAKE_STRING("NPC_BaseCustomr.Fear"));
|
||||
PrecacheNPCSoundScript(&m_iszIdleSound, MAKE_STRING("NPC_BaseCustom.Idle"));
|
||||
PrecacheNPCSoundScript(&m_iszAlertSound, MAKE_STRING("NPC_BaseCustom.Alert"));
|
||||
PrecacheNPCSoundScript(&m_iszPainSound, MAKE_STRING("NPC_BaseCustom.Pain"));
|
||||
PrecacheNPCSoundScript(&m_iszLostEnemySound, MAKE_STRING("NPC_BaseCustom.LostEnemy"));
|
||||
PrecacheNPCSoundScript(&m_iszFoundEnemySound, MAKE_STRING("NPC_BaseCustom.FoundEnemy"));
|
||||
PrecacheNPCSoundScript(&m_iszDeathSound, MAKE_STRING("NPC_BaseCustom.Death"));
|
||||
|
||||
m_bWanderToggle = false;
|
||||
|
||||
BaseClass::Precache();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::Spawn( void )
|
||||
{
|
||||
Precache();
|
||||
|
||||
SetModel(STRING(GetModelName()));
|
||||
SetHullType(HULL_HUMAN);
|
||||
SetHullSizeNormal();
|
||||
|
||||
SetSolid( SOLID_BBOX );
|
||||
AddSolidFlags( FSOLID_NOT_STANDABLE );
|
||||
SetMoveType( MOVETYPE_STEP );
|
||||
SetBloodColor( BLOOD_COLOR_RED );
|
||||
|
||||
// If the health has not been set through Hammer, use a default health value of 75
|
||||
if (m_iHealth < 1)
|
||||
{
|
||||
m_iHealth = 75;
|
||||
}
|
||||
|
||||
m_flFieldOfView = 0.5;
|
||||
m_flNextSoundTime = gpGlobals->curtime;
|
||||
m_flNextFoundEnemySoundTime = gpGlobals->curtime;
|
||||
m_NPCState = NPC_STATE_NONE;
|
||||
m_flSpeedModifier = 1.0f;
|
||||
|
||||
CapabilitiesClear();
|
||||
|
||||
if (!HasSpawnFlags(SF_NPC_START_EFFICIENT))
|
||||
{
|
||||
CapabilitiesAdd(bits_CAP_ANIMATEDFACE | bits_CAP_TURN_HEAD); // The default model has no face animations, but a custom model might
|
||||
CapabilitiesAdd(bits_CAP_SQUAD);
|
||||
CapabilitiesAdd(bits_CAP_USE_WEAPONS | bits_CAP_AIM_GUN | bits_CAP_MOVE_SHOOT);
|
||||
CapabilitiesAdd(bits_CAP_WEAPON_MELEE_ATTACK1 || bits_CAP_WEAPON_MELEE_ATTACK2);
|
||||
CapabilitiesAdd(bits_CAP_DUCK);
|
||||
CapabilitiesAdd(bits_CAP_USE_SHOT_REGULATOR);
|
||||
|
||||
if (!m_bCannotOpenDoors) {
|
||||
CapabilitiesAdd(bits_CAP_DOORS_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
CapabilitiesAdd(bits_CAP_MOVE_GROUND);
|
||||
SetMoveType(MOVETYPE_STEP);
|
||||
|
||||
NPCInit();
|
||||
}
|
||||
|
||||
void CNPC_BaseCustomNPC::Activate()
|
||||
{
|
||||
BaseClass::Activate();
|
||||
FixupWeapon();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: If this NPC has some kind of custom weapon behavior,
|
||||
// set up the weapon after spawn.
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::FixupWeapon()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Choose a schedule after schedule failed
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectFailSchedule(int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode)
|
||||
{
|
||||
switch (failedSchedule)
|
||||
{
|
||||
case SCHED_NEW_WEAPON:
|
||||
// If failed trying to pick up a weapon, try again in one second. This is because other AI code
|
||||
// has put this off for 10 seconds under the assumption that the citizen would be able to
|
||||
// pick up the weapon that they found.
|
||||
m_flNextWeaponSearchTime = gpGlobals->curtime + 1.0f;
|
||||
break;
|
||||
}
|
||||
|
||||
return BaseClass::SelectFailSchedule(failedSchedule, failedTask, taskFailCode);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select a schedule to retrieve better weapons if they are available.
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectScheduleRetrieveItem()
|
||||
{
|
||||
if (m_bCanPickupWeapons && HasCondition(COND_BETTER_WEAPON_AVAILABLE))
|
||||
{
|
||||
CBaseHLCombatWeapon *pWeapon = dynamic_cast<CBaseHLCombatWeapon *>(Weapon_FindUsable(WEAPON_SEARCH_DELTA));
|
||||
if (pWeapon)
|
||||
{
|
||||
m_flNextWeaponSearchTime = gpGlobals->curtime + 10.0;
|
||||
// Now lock the weapon for several seconds while we go to pick it up.
|
||||
pWeapon->Lock(10.0, this);
|
||||
SetTarget(pWeapon);
|
||||
return SCHED_NEW_WEAPON;
|
||||
}
|
||||
}
|
||||
|
||||
return SCHED_NONE;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select ideal state.
|
||||
// Conditions for custom states are defined here.
|
||||
//-----------------------------------------------------------------------------
|
||||
NPC_STATE CNPC_BaseCustomNPC::SelectIdealState(void)
|
||||
{
|
||||
switch ((int)this->m_NPCState) {
|
||||
case NPC_STATE_AMBUSH:
|
||||
return SelectAmbushIdealState();
|
||||
case NPC_STATE_SURRENDER:
|
||||
return SelectSurrenderIdealState();
|
||||
default:
|
||||
return BaseClass::SelectIdealState();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
NPC_STATE CNPC_BaseCustomNPC::SelectAmbushIdealState()
|
||||
{
|
||||
// AMBUSH goes to ALERT upon death of enemy
|
||||
if (GetEnemy() == NULL)
|
||||
{
|
||||
return NPC_STATE_ALERT;
|
||||
}
|
||||
|
||||
// If I am not in a squad, there is no reason to ambush
|
||||
if (!m_pSquad) {
|
||||
return NPC_STATE_COMBAT;
|
||||
}
|
||||
|
||||
// If I am the last in a squad, attack!
|
||||
if (m_pSquad->NumMembers() == 1) {
|
||||
return NPC_STATE_COMBAT;
|
||||
}
|
||||
|
||||
if (OccupyStrategySlotRange(SQUAD_SLOT_CHASE_1, SQUAD_SLOT_CHASE_2)) {
|
||||
return NPC_STATE_COMBAT;
|
||||
}
|
||||
|
||||
// The best ideal state is the current ideal state.
|
||||
return (NPC_STATE)NPC_STATE_AMBUSH;
|
||||
}
|
||||
|
||||
NPC_STATE CNPC_BaseCustomNPC::SelectSurrenderIdealState()
|
||||
{
|
||||
return NPC_STATE_ALERT;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select a schedule to retrieve better weapons if they are available.
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectScheduleWander()
|
||||
{
|
||||
m_bWanderToggle = !m_bWanderToggle;
|
||||
if (m_bWanderToggle) {
|
||||
return SCHED_IDLE_WANDER;
|
||||
}
|
||||
else {
|
||||
return SCHED_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select a schedule to execute based on conditions.
|
||||
// This is the most critical AI method.
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectSchedule()
|
||||
{
|
||||
switch ((int)m_NPCState)
|
||||
{
|
||||
case NPC_STATE_IDLE:
|
||||
AssertMsgOnce(GetEnemy() == NULL, "NPC has enemy but is not in combat state?");
|
||||
return SelectIdleSchedule();
|
||||
|
||||
case NPC_STATE_ALERT:
|
||||
AssertMsgOnce(GetEnemy() == NULL, "NPC has enemy but is not in combat state?");
|
||||
return SelectAlertSchedule();
|
||||
|
||||
case NPC_STATE_COMBAT:
|
||||
return SelectCombatSchedule();
|
||||
case NPC_STATE_AMBUSH:
|
||||
return SelectAmbushSchedule();
|
||||
case NPC_STATE_SURRENDER:
|
||||
return SelectSurrenderSchedule();
|
||||
default:
|
||||
return BaseClass::SelectSchedule();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Idle schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectIdleSchedule()
|
||||
{
|
||||
int nSched = SelectFlinchSchedule();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
if (HasCondition(COND_HEAR_DANGER) ||
|
||||
HasCondition(COND_HEAR_COMBAT) ||
|
||||
HasCondition(COND_HEAR_WORLD) ||
|
||||
HasCondition(COND_HEAR_BULLET_IMPACT) ||
|
||||
HasCondition(COND_HEAR_PLAYER))
|
||||
{
|
||||
// Investigate sound source
|
||||
return SCHED_ALERT_FACE_BESTSOUND;
|
||||
}
|
||||
|
||||
nSched = SelectScheduleRetrieveItem();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
// no valid route! Wander instead
|
||||
if (GetNavigator()->GetGoalType() == GOALTYPE_NONE) {
|
||||
return SCHED_IDLE_STAND;
|
||||
}
|
||||
|
||||
// valid route. Get moving
|
||||
return SCHED_IDLE_WALK;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Alert schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectAlertSchedule()
|
||||
{
|
||||
// Per default base NPC, check flinch schedule first
|
||||
int nSched = SelectFlinchSchedule();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
// Scan around for new enemies
|
||||
if (HasCondition(COND_ENEMY_DEAD) && SelectWeightedSequence(ACT_VICTORY_DANCE) != ACTIVITY_NOT_AVAILABLE)
|
||||
return SCHED_ALERT_SCAN;
|
||||
|
||||
if (HasCondition(COND_HEAR_DANGER) ||
|
||||
HasCondition(COND_HEAR_PLAYER) ||
|
||||
HasCondition(COND_HEAR_WORLD) ||
|
||||
HasCondition(COND_HEAR_BULLET_IMPACT) ||
|
||||
HasCondition(COND_HEAR_COMBAT))
|
||||
{
|
||||
// Investigate sound source
|
||||
AlertSound();
|
||||
return SCHED_ALERT_FACE_BESTSOUND;
|
||||
}
|
||||
|
||||
nSched = SelectScheduleRetrieveItem();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
// no valid route! Wander instead
|
||||
if (GetNavigator()->GetGoalType() == GOALTYPE_NONE) {
|
||||
return SCHED_ALERT_STAND;
|
||||
}
|
||||
|
||||
// valid route. Get moving
|
||||
return SCHED_ALERT_WALK;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Combat schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectCombatSchedule()
|
||||
{
|
||||
return BaseClass::SelectSchedule(); // Let Base NPC handle it
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Combat schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectAmbushSchedule()
|
||||
{
|
||||
// Check enemy death
|
||||
if (HasCondition(COND_ENEMY_DEAD))
|
||||
{
|
||||
// clear the current (dead) enemy and try to find another.
|
||||
SetEnemy(NULL);
|
||||
|
||||
if (ChooseEnemy())
|
||||
{
|
||||
SetState(NPC_STATE_COMBAT);
|
||||
FoundEnemySound();
|
||||
ClearCondition(COND_ENEMY_DEAD);
|
||||
return SelectSchedule();
|
||||
}
|
||||
|
||||
SetState(NPC_STATE_ALERT);
|
||||
return SelectSchedule();
|
||||
}
|
||||
|
||||
|
||||
CBaseEntity* pEnemy = GetEnemy();
|
||||
if (pEnemy && EnemyDistance(pEnemy) < 128)
|
||||
{
|
||||
SetState(NPC_STATE_COMBAT);
|
||||
return SelectSchedule();
|
||||
}
|
||||
|
||||
if (pEnemy == NULL || HasCondition(COND_LOST_ENEMY)) {
|
||||
SetState(NPC_STATE_ALERT);
|
||||
return SelectSchedule();
|
||||
}
|
||||
|
||||
// If I am the last in a squad, attack!
|
||||
if (m_iNumSquadmates > m_pSquad->NumMembers())
|
||||
SetState(SelectAmbushIdealState());
|
||||
|
||||
if (HasCondition(COND_LIGHT_DAMAGE)) {
|
||||
SetState(NPC_STATE_COMBAT);
|
||||
}
|
||||
|
||||
if (HasCondition(COND_SEE_ENEMY) && HasCondition(COND_ENEMY_FACING_ME) && HasCondition(COND_HAVE_ENEMY_LOS)) {
|
||||
if(GetState() != NPC_STATE_COMBAT)
|
||||
SetState(SelectAmbushIdealState());
|
||||
return SCHED_HIDE;
|
||||
}
|
||||
|
||||
m_iNumSquadmates = m_pSquad->NumMembers();
|
||||
|
||||
return SCHED_COMBAT_FACE;
|
||||
}
|
||||
|
||||
int CNPC_BaseCustomNPC::SelectSurrenderSchedule()
|
||||
{
|
||||
return BaseClass::SelectSchedule();
|
||||
}
|
||||
|
||||
bool CNPC_BaseCustomNPC::HasRangedWeapon()
|
||||
{
|
||||
CBaseCombatWeapon *pWeapon = GetActiveWeapon();
|
||||
|
||||
if (pWeapon)
|
||||
return !(FClassnameIs(pWeapon, "weapon_crowbar") || FClassnameIs(pWeapon, "weapon_stunstick") || FClassnameIs(pWeapon, "weapon_custommelee"));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Override base class activiites
|
||||
//-----------------------------------------------------------------------------
|
||||
Activity CNPC_BaseCustomNPC::NPC_TranslateActivity(Activity activity)
|
||||
{
|
||||
switch (activity) {
|
||||
case ACT_RUN_AIM_SHOTGUN:
|
||||
return ACT_RUN_AIM_RIFLE;
|
||||
case ACT_WALK_AIM_SHOTGUN:
|
||||
return ACT_WALK_AIM_RIFLE;
|
||||
case ACT_IDLE_ANGRY_SHOTGUN:
|
||||
return ACT_IDLE_ANGRY_SMG1;
|
||||
case ACT_RANGE_ATTACK_SHOTGUN_LOW:
|
||||
return ACT_RANGE_ATTACK_SMG1_LOW;
|
||||
case ACT_IDLE_MELEE:
|
||||
case ACT_IDLE_ANGRY_MELEE: // If the NPC has a melee weapon but is in an idle state, don't raise the weapon
|
||||
if (m_NPCState == NPC_STATE_IDLE)
|
||||
return ACT_IDLE_SUITCASE;
|
||||
default:
|
||||
return BaseClass::NPC_TranslateActivity(activity);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Override base class schedules
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::TranslateSchedule(int scheduleType)
|
||||
{
|
||||
return BaseClass::TranslateSchedule(scheduleType);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Play sound when an enemy is spotted. This sound has a separate
|
||||
// timer from other sounds to prevent looping if the NPC gets caught
|
||||
// in a 'found enemy' condition.
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::FoundEnemySound(void)
|
||||
{
|
||||
if (gpGlobals->curtime > m_flNextFoundEnemySoundTime)
|
||||
{
|
||||
m_flNextFoundEnemySoundTime = gpGlobals->curtime + random->RandomFloat(MIN_TIME_NEXT_FOUNDENEMY_SOUND, MAX_TIME_NEXT_FOUNDENEMY_SOUND);
|
||||
PlaySound(m_iszFoundEnemySound, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Play NPC soundscript
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::PlaySound(string_t soundname, bool required /*= false */)
|
||||
{
|
||||
// TODO: Check if silent
|
||||
if (required || gpGlobals->curtime > m_flNextSoundTime)
|
||||
{
|
||||
m_flNextSoundTime = gpGlobals->curtime + random->RandomFloat(MIN_TIME_NEXT_SOUND, MAX_TIME_NEXT_SOUND);
|
||||
//CPASAttenuationFilter filter2(this, STRING(soundname));
|
||||
EmitSound(STRING(soundname));
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Assign a default soundscript if none is provided, then precache
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::PrecacheNPCSoundScript(string_t * SoundName, string_t defaultSoundName)
|
||||
{
|
||||
if (!SoundName) {
|
||||
*SoundName = defaultSoundName;
|
||||
}
|
||||
PrecacheScriptSound(STRING(*SoundName));
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Get movement speed, multipled by modifier
|
||||
//-----------------------------------------------------------------------------
|
||||
float CNPC_BaseCustomNPC::GetSequenceGroundSpeed(CStudioHdr *pStudioHdr, int iSequence)
|
||||
{
|
||||
float t = SequenceDuration(pStudioHdr, iSequence);
|
||||
|
||||
if (t > 0)
|
||||
{
|
||||
return (GetSequenceMoveDist(pStudioHdr, iSequence) * m_flSpeedModifier / t);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to change the speed of the NPC
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::InputSetSpeedModifier(inputdata_t &inputdata)
|
||||
{
|
||||
this->m_flSpeedModifier = inputdata.value.Float();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable opening doors
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::InputEnableOpenDoors(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCannotOpenDoors = false;
|
||||
if (!HasSpawnFlags(SF_NPC_START_EFFICIENT))
|
||||
{
|
||||
CapabilitiesAdd(bits_CAP_DOORS_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable opening doors
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::InputDisableOpenDoors(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCannotOpenDoors = true;
|
||||
if (!HasSpawnFlags(SF_NPC_START_EFFICIENT))
|
||||
{
|
||||
CapabilitiesRemove(bits_CAP_DOORS_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable weapon pickup behavior
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::InputEnablePickupWeapons(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCanPickupWeapons = true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable weapon pickup behavior
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::InputDisablePickupWeapons(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCanPickupWeapons = false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
// Output :
|
||||
//-----------------------------------------------------------------------------
|
||||
Class_T CNPC_BaseCustomNPC::Classify( void )
|
||||
{
|
||||
return CLASS_NONE;
|
||||
}
|
133
sp/src/game/server/mod/npc_base_custom.h
Normal file
133
sp/src/game/server/mod/npc_base_custom.h
Normal file
@ -0,0 +1,133 @@
|
||||
//=//=============================================================================//
|
||||
//
|
||||
// Purpose: A base class from which to extend new custom NPCs.
|
||||
// This class may seem redundant with CAI_BaseNPC and a lot of Valve's NPC classes.
|
||||
// However, the redundancy is necessary for compatibility with a variety of mods;
|
||||
// I want all new NPC content to be isolated from existing classes.
|
||||
//
|
||||
// Author: 1upD
|
||||
//
|
||||
//=============================================================================//
|
||||
#include "cbase.h"
|
||||
#include "ai_default.h"
|
||||
#include "ai_task.h"
|
||||
#include "ai_schedule.h"
|
||||
#include "entitylist.h"
|
||||
#include "activitylist.h"
|
||||
#include "ai_basenpc.h"
|
||||
#include "ai_blended_movement.h"
|
||||
#include "ai_behavior_actbusy.h"
|
||||
|
||||
//=========================================================
|
||||
// schedules
|
||||
//=========================================================
|
||||
enum
|
||||
{
|
||||
SCHED_MELEE_ATTACK_NOINTERRUPT = LAST_SHARED_SCHEDULE,
|
||||
SCHED_HIDE,
|
||||
|
||||
LAST_BASE_CUSTOM_SCHED
|
||||
};
|
||||
|
||||
//=========================================================
|
||||
// states
|
||||
//=========================================================
|
||||
enum
|
||||
{
|
||||
NPC_STATE_FIRST = NPC_STATE_DEAD,
|
||||
NPC_STATE_AMBUSH,
|
||||
NPC_STATE_SURRENDER,
|
||||
NPC_STATE_LAST_CUSTOM
|
||||
};
|
||||
|
||||
// -----------------------------------------------
|
||||
// Squad slots
|
||||
// -----------------------------------------------
|
||||
enum
|
||||
{
|
||||
LAST_SQUADSLOT = 100, // Custom NPCs might share a squad with any NPC, so let's just be safe and skip to a high number
|
||||
SQUAD_SLOT_CHASE_1,
|
||||
SQUAD_SLOT_CHASE_2,
|
||||
LAST_CUSTOM_SQUADSLOT
|
||||
};
|
||||
|
||||
//=========================================================
|
||||
//=========================================================
|
||||
typedef CAI_BlendingHost< CAI_BehaviorHost<CAI_BaseNPC> > CAI_CustomNPCBase;
|
||||
|
||||
class CNPC_BaseCustomNPC : public CAI_CustomNPCBase
|
||||
{
|
||||
DECLARE_CLASS(CNPC_BaseCustomNPC, CAI_CustomNPCBase);
|
||||
|
||||
public:
|
||||
void Precache(void);
|
||||
void Spawn(void);
|
||||
Class_T Classify(void);
|
||||
virtual int SelectFailSchedule(int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode);
|
||||
virtual int SelectScheduleRetrieveItem();
|
||||
virtual int SelectScheduleWander();
|
||||
virtual int SelectSchedule();
|
||||
virtual int SelectIdleSchedule();
|
||||
virtual int SelectAlertSchedule();
|
||||
virtual int SelectCombatSchedule();
|
||||
virtual int SelectAmbushSchedule();
|
||||
virtual int SelectSurrenderSchedule();
|
||||
virtual float GetSequenceGroundSpeed(CStudioHdr *pStudioHdr, int iSequence);
|
||||
virtual Activity NPC_TranslateActivity(Activity eNewActivity);
|
||||
virtual int TranslateSchedule(int scheduleType);
|
||||
|
||||
// Custom states
|
||||
virtual NPC_STATE SelectIdealState(void);
|
||||
NPC_STATE SelectAmbushIdealState();
|
||||
NPC_STATE SelectSurrenderIdealState();
|
||||
|
||||
// Sounds
|
||||
virtual void PlaySound(string_t soundname, bool optional);
|
||||
virtual void DeathSound(const CTakeDamageInfo &info) { PlaySound(m_iszDeathSound, true); }
|
||||
virtual void AlertSound(void) { PlaySound(m_iszAlertSound, false); };
|
||||
virtual void IdleSound(void) { PlaySound(m_iszIdleSound, false); };
|
||||
virtual void PainSound(const CTakeDamageInfo &info) { PlaySound(m_iszPainSound, true); };
|
||||
virtual void FearSound(void) { PlaySound(m_iszFearSound, false); };
|
||||
virtual void LostEnemySound(void) { PlaySound(m_iszLostEnemySound, false); };
|
||||
virtual void FoundEnemySound(void);
|
||||
|
||||
void Activate();
|
||||
virtual void FixupWeapon();
|
||||
|
||||
// Inputs
|
||||
virtual void InputSetSpeedModifier(inputdata_t &inputdata);
|
||||
virtual void InputEnableOpenDoors(inputdata_t &inputdata);
|
||||
virtual void InputDisableOpenDoors(inputdata_t &inputdata);
|
||||
virtual void InputEnablePickupWeapons(inputdata_t &inputdata);
|
||||
virtual void InputDisablePickupWeapons(inputdata_t &inputdata);
|
||||
|
||||
DECLARE_DATADESC();
|
||||
|
||||
string_t m_iszWeaponModelName; // Path/filename of model to override weapon model.
|
||||
|
||||
string_t m_iszFearSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszDeathSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszIdleSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszPainSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszAlertSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszLostEnemySound; // Path/filename of WAV file to play.
|
||||
string_t m_iszFoundEnemySound; // Path/filename of WAV file to play.
|
||||
|
||||
DEFINE_CUSTOM_AI;
|
||||
|
||||
protected:
|
||||
bool HasRangedWeapon();
|
||||
void PrecacheNPCSoundScript(string_t* SoundName, string_t defaultSoundName);
|
||||
|
||||
int m_iNumSquadmates;
|
||||
bool m_bUseBothSquadSlots; // If true use two squad slots, if false use one squad slot
|
||||
bool m_bCannotOpenDoors; // If true, this NPC cannot open doors. The condition is reversed because originally it could.
|
||||
bool m_bCanPickupWeapons; // If true, this NPC is able to pick up weapons off of the ground just like npc_citizen.
|
||||
bool m_bWanderToggle; // Boolean to toggle wandering / standing every think cycle
|
||||
float m_flNextSoundTime; // Next time at which this NPC is allowed to play an NPC sound
|
||||
float m_flNextFoundEnemySoundTime; // Next time at which this NPC is allowed to play an NPC sound
|
||||
float m_flSpeedModifier; // Modifier to apply to move distance
|
||||
};
|
||||
|
||||
|
||||
LINK_ENTITY_TO_CLASS(npc_base_custom, CNPC_BaseCustomNPC);
|
@ -13,25 +13,28 @@
|
||||
#include "cbase.h"
|
||||
#include "npc_shadow_walker.h"
|
||||
#include "ai_hull.h"
|
||||
#include "soundent.h"
|
||||
#include "game.h"
|
||||
#include "npcevent.h"
|
||||
#include "engine/IEngineSound.h"
|
||||
#include "basehlcombatweapon_shared.h"
|
||||
#include "ai_squadslot.h"
|
||||
#include "weapon_custom_melee.h"
|
||||
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Constants
|
||||
// Save/Restore
|
||||
//---------------------------------------------------------
|
||||
const float MIN_TIME_NEXT_SOUND = 0.5f;
|
||||
const float MAX_TIME_NEXT_SOUND = 1.0f;
|
||||
const float MIN_TIME_NEXT_FOUNDENEMY_SOUND = 2.0f;
|
||||
const float MAX_TIME_NEXT_FOUNDENEMY_SOUND = 5.0f;
|
||||
BEGIN_DATADESC(CNPC_ShadowWalker)
|
||||
/// Custom fields go here
|
||||
END_DATADESC()
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Custom AI
|
||||
//---------------------------------------------------------
|
||||
AI_BEGIN_CUSTOM_NPC(npc_shadow_walker, CNPC_ShadowWalker)
|
||||
// Custom schedules go here
|
||||
AI_END_CUSTOM_NPC()
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
@ -183,65 +186,6 @@ int CNPC_ShadowWalker::SelectFailSchedule(int failedSchedule, int failedTask, AI
|
||||
return BaseClass::SelectFailSchedule(failedSchedule, failedTask, taskFailCode);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select a schedule to retrieve better weapons if they are available.
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_ShadowWalker::SelectScheduleRetrieveItem()
|
||||
{
|
||||
if (m_bCanPickupWeapons && HasCondition(COND_BETTER_WEAPON_AVAILABLE))
|
||||
{
|
||||
CBaseHLCombatWeapon *pWeapon = dynamic_cast<CBaseHLCombatWeapon *>(Weapon_FindUsable(WEAPON_SEARCH_DELTA));
|
||||
if (pWeapon)
|
||||
{
|
||||
m_flNextWeaponSearchTime = gpGlobals->curtime + 10.0;
|
||||
// Now lock the weapon for several seconds while we go to pick it up.
|
||||
pWeapon->Lock(10.0, this);
|
||||
SetTarget(pWeapon);
|
||||
return SCHED_NEW_WEAPON;
|
||||
}
|
||||
}
|
||||
|
||||
return SCHED_NONE;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select a schedule to retrieve better weapons if they are available.
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_ShadowWalker::SelectScheduleWander()
|
||||
{
|
||||
m_bWanderToggle = !m_bWanderToggle;
|
||||
if (m_bWanderToggle) {
|
||||
return SCHED_IDLE_WANDER;
|
||||
}
|
||||
else {
|
||||
return SCHED_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select a schedule to execute based on conditions.
|
||||
// This is the most critical AI method.
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_ShadowWalker::SelectSchedule()
|
||||
{
|
||||
switch (m_NPCState)
|
||||
{
|
||||
case NPC_STATE_IDLE:
|
||||
AssertMsgOnce(GetEnemy() == NULL, "NPC has enemy but is not in combat state?");
|
||||
return SelectIdleSchedule();
|
||||
|
||||
case NPC_STATE_ALERT:
|
||||
AssertMsgOnce(GetEnemy() == NULL, "NPC has enemy but is not in combat state?");
|
||||
return SelectAlertSchedule();
|
||||
|
||||
case NPC_STATE_COMBAT:
|
||||
return SelectCombatSchedule();
|
||||
|
||||
default:
|
||||
return BaseClass::SelectSchedule();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Idle schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -337,7 +281,6 @@ int CNPC_ShadowWalker::SelectCombatSchedule()
|
||||
if (ChooseEnemy())
|
||||
{
|
||||
FoundEnemySound();
|
||||
|
||||
ClearCondition(COND_ENEMY_DEAD);
|
||||
return SelectSchedule();
|
||||
}
|
||||
@ -359,17 +302,20 @@ int CNPC_ShadowWalker::SelectCombatSchedule()
|
||||
|
||||
// If in a squad, only one or two shadow walkers can chase the player. This is configurable through Hammer.
|
||||
bool bCanChase = true;
|
||||
if (bEnemyCanSeeMe && m_bUseBothSquadSlots) {
|
||||
bCanChase = OccupyStrategySlotRange(SQUAD_SLOT_ATTACK1, SQUAD_SLOT_ATTACK2);
|
||||
if (m_bUseBothSquadSlots) {
|
||||
bCanChase = OccupyStrategySlotRange(SQUAD_SLOT_CHASE_1, SQUAD_SLOT_CHASE_2);
|
||||
}
|
||||
else if (bEnemyCanSeeMe){
|
||||
bCanChase = OccupyStrategySlot(SQUAD_SLOT_ATTACK1);
|
||||
else {
|
||||
bCanChase = OccupyStrategySlot(SQUAD_SLOT_CHASE_1);
|
||||
}
|
||||
|
||||
bCanChase = bCanChase || EnemyDistance(GetEnemy()) < 128 || (bEnemyCanSeeMe && (HasCondition(COND_LIGHT_DAMAGE) || HasCondition(COND_HEAVY_DAMAGE)));
|
||||
|
||||
// If I'm not allowed to chase this enemy of this enemy and he's looking at me, set up an ambush
|
||||
if (!bCanChase)
|
||||
{
|
||||
FearSound();
|
||||
SetState((NPC_STATE)NPC_STATE_AMBUSH);
|
||||
return SCHED_HIDE;
|
||||
|
||||
}
|
||||
@ -433,16 +379,6 @@ int CNPC_ShadowWalker::SelectCombatSchedule()
|
||||
return SCHED_FAIL;
|
||||
}
|
||||
|
||||
bool CNPC_ShadowWalker::HasRangedWeapon()
|
||||
{
|
||||
CBaseCombatWeapon *pWeapon = GetActiveWeapon();
|
||||
|
||||
if (pWeapon)
|
||||
return !(FClassnameIs(pWeapon, "weapon_crowbar") || FClassnameIs(pWeapon, "weapon_stunstick") || FClassnameIs(pWeapon, "weapon_custommelee"));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Override base class schedules
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -482,111 +418,6 @@ Activity CNPC_ShadowWalker::NPC_TranslateActivity(Activity activity)
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Play sound when an enemy is spotted. This sound has a separate
|
||||
// timer from other sounds to prevent looping if the NPC gets caught
|
||||
// in a 'found enemy' condition.
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::FoundEnemySound(void)
|
||||
{
|
||||
if (gpGlobals->curtime > m_flNextFoundEnemySoundTime)
|
||||
{
|
||||
m_flNextFoundEnemySoundTime = gpGlobals->curtime + random->RandomFloat(MIN_TIME_NEXT_FOUNDENEMY_SOUND, MAX_TIME_NEXT_FOUNDENEMY_SOUND);
|
||||
PlaySound(m_iszFoundEnemySound, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Play NPC soundscript
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::PlaySound(string_t soundname, bool required /*= false */)
|
||||
{
|
||||
// TODO: Check if silent
|
||||
if (required || gpGlobals->curtime > m_flNextSoundTime)
|
||||
{
|
||||
m_flNextSoundTime = gpGlobals->curtime + random->RandomFloat(MIN_TIME_NEXT_SOUND, MAX_TIME_NEXT_SOUND);
|
||||
//CPASAttenuationFilter filter2(this, STRING(soundname));
|
||||
EmitSound(STRING(soundname));
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Assign a default soundscript if none is provided, then precache
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::PrecacheNPCSoundScript(string_t * SoundName, string_t defaultSoundName)
|
||||
{
|
||||
if (!SoundName) {
|
||||
*SoundName = defaultSoundName;
|
||||
}
|
||||
PrecacheScriptSound(STRING(*SoundName));
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Get movement speed, multipled by modifier
|
||||
//-----------------------------------------------------------------------------
|
||||
float CNPC_ShadowWalker::GetSequenceGroundSpeed(CStudioHdr *pStudioHdr, int iSequence)
|
||||
{
|
||||
float t = SequenceDuration(pStudioHdr, iSequence);
|
||||
|
||||
if (t > 0)
|
||||
{
|
||||
return (GetSequenceMoveDist(pStudioHdr, iSequence) * m_flSpeedModifier / t);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to change the speed of the NPC
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::InputSetSpeedModifier(inputdata_t &inputdata)
|
||||
{
|
||||
this->m_flSpeedModifier = inputdata.value.Float();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable opening doors
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::InputEnableOpenDoors(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCannotOpenDoors = false;
|
||||
if (!HasSpawnFlags(SF_NPC_START_EFFICIENT))
|
||||
{
|
||||
CapabilitiesAdd(bits_CAP_DOORS_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable opening doors
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::InputDisableOpenDoors(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCannotOpenDoors = true;
|
||||
if (!HasSpawnFlags(SF_NPC_START_EFFICIENT))
|
||||
{
|
||||
CapabilitiesRemove(bits_CAP_DOORS_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable weapon pickup behavior
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::InputEnablePickupWeapons(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCanPickupWeapons = true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable weapon pickup behavior
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::InputDisablePickupWeapons(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCanPickupWeapons = false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
|
@ -12,168 +12,31 @@
|
||||
//=============================================================================//
|
||||
#include "cbase.h"
|
||||
#include "ai_default.h"
|
||||
#include "ai_task.h"
|
||||
#include "ai_schedule.h"
|
||||
#include "entitylist.h"
|
||||
#include "activitylist.h"
|
||||
#include "ai_basenpc.h"
|
||||
#include "ai_blended_movement.h"
|
||||
#include "ai_behavior_actbusy.h"
|
||||
#include "npc_base_custom.h"
|
||||
|
||||
|
||||
//=========================================================
|
||||
// schedules
|
||||
//=========================================================
|
||||
enum
|
||||
class CNPC_ShadowWalker : public CAI_BlendingHost<CNPC_BaseCustomNPC>
|
||||
{
|
||||
SCHED_MELEE_ATTACK_NOINTERRUPT = LAST_SHARED_SCHEDULE,
|
||||
SCHED_HIDE,
|
||||
|
||||
LAST_SHADOW_WALKER_SCHED
|
||||
};
|
||||
|
||||
//=========================================================
|
||||
//=========================================================
|
||||
typedef CAI_BlendingHost< CAI_BehaviorHost<CAI_BaseNPC> > CAI_CustomNPCBase;
|
||||
|
||||
class CNPC_ShadowWalker : public CAI_CustomNPCBase
|
||||
{
|
||||
DECLARE_CLASS(CNPC_ShadowWalker, CAI_CustomNPCBase);
|
||||
DECLARE_DATADESC();
|
||||
DECLARE_CLASS(CNPC_ShadowWalker, CAI_BlendingHost<CNPC_BaseCustomNPC>);
|
||||
|
||||
public:
|
||||
void Precache(void);
|
||||
void Spawn(void);
|
||||
Class_T Classify(void);
|
||||
virtual int SelectFailSchedule(int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode);
|
||||
virtual int SelectScheduleRetrieveItem();
|
||||
virtual int SelectScheduleWander();
|
||||
virtual int SelectSchedule();
|
||||
virtual int SelectIdleSchedule();
|
||||
virtual int SelectAlertSchedule();
|
||||
virtual int SelectCombatSchedule();
|
||||
virtual float GetSequenceGroundSpeed(CStudioHdr *pStudioHdr, int iSequence);
|
||||
virtual Activity NPC_TranslateActivity(Activity eNewActivity);
|
||||
virtual int TranslateSchedule(int scheduleType);
|
||||
|
||||
// Sounds
|
||||
virtual void PlaySound(string_t soundname, bool optional);
|
||||
virtual void DeathSound(const CTakeDamageInfo &info) { PlaySound(m_iszDeathSound, true); }
|
||||
virtual void AlertSound(void) { PlaySound(m_iszAlertSound, false); };
|
||||
virtual void IdleSound(void) { PlaySound(m_iszIdleSound, false); };
|
||||
virtual void PainSound(const CTakeDamageInfo &info) { PlaySound(m_iszPainSound, true); };
|
||||
virtual void FearSound(void) { PlaySound(m_iszFearSound, false); };
|
||||
virtual void LostEnemySound(void) { PlaySound(m_iszLostEnemySound, false); };
|
||||
virtual void FoundEnemySound(void);
|
||||
|
||||
void Activate();
|
||||
void FixupWeapon();
|
||||
|
||||
// Inputs
|
||||
virtual void InputSetSpeedModifier(inputdata_t &inputdata);
|
||||
virtual void InputEnableOpenDoors(inputdata_t &inputdata);
|
||||
virtual void InputDisableOpenDoors(inputdata_t &inputdata);
|
||||
virtual void InputEnablePickupWeapons(inputdata_t &inputdata);
|
||||
virtual void InputDisablePickupWeapons(inputdata_t &inputdata);
|
||||
|
||||
DECLARE_DATADESC();
|
||||
|
||||
string_t m_iszWeaponModelName; // Path/filename of model to override weapon model.
|
||||
|
||||
string_t m_iszFearSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszDeathSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszIdleSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszPainSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszAlertSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszLostEnemySound; // Path/filename of WAV file to play.
|
||||
string_t m_iszFoundEnemySound; // Path/filename of WAV file to play.
|
||||
|
||||
DEFINE_CUSTOM_AI;
|
||||
|
||||
private:
|
||||
bool HasRangedWeapon();
|
||||
void PrecacheNPCSoundScript(string_t* SoundName, string_t defaultSoundName);
|
||||
|
||||
|
||||
bool m_bUseBothSquadSlots; // If true use two squad slots, if false use one squad slot
|
||||
bool m_bCannotOpenDoors; // If true, this NPC cannot open doors. The condition is reversed because originally it could.
|
||||
bool m_bCanPickupWeapons; // If true, this NPC is able to pick up weapons off of the ground just like npc_citizen.
|
||||
bool m_bWanderToggle; // Boolean to toggle wandering / standing every think cycle
|
||||
float m_flNextSoundTime; // Next time at which this NPC is allowed to play an NPC sound
|
||||
float m_flNextFoundEnemySoundTime; // Next time at which this NPC is allowed to play an NPC sound
|
||||
float m_flSpeedModifier; // Modifier to apply to move distance
|
||||
};
|
||||
|
||||
|
||||
LINK_ENTITY_TO_CLASS(npc_shadow_walker, CNPC_ShadowWalker);
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Save/Restore
|
||||
//---------------------------------------------------------
|
||||
BEGIN_DATADESC(CNPC_ShadowWalker)
|
||||
DEFINE_KEYFIELD(m_iszWeaponModelName, FIELD_STRING, "WeaponModel"),
|
||||
DEFINE_KEYFIELD(m_iHealth, FIELD_INTEGER, "Health"),
|
||||
DEFINE_KEYFIELD(m_iszFearSound, FIELD_SOUNDNAME, "FearSound"),
|
||||
DEFINE_KEYFIELD(m_iszDeathSound, FIELD_SOUNDNAME, "DeathSound"),
|
||||
DEFINE_KEYFIELD(m_iszIdleSound, FIELD_SOUNDNAME, "IdleSound"),
|
||||
DEFINE_KEYFIELD(m_iszPainSound, FIELD_SOUNDNAME, "PainSound"),
|
||||
DEFINE_KEYFIELD(m_iszAlertSound, FIELD_SOUNDNAME, "AlertSound"),
|
||||
DEFINE_KEYFIELD(m_iszLostEnemySound, FIELD_SOUNDNAME, "LostEnemySound"),
|
||||
DEFINE_KEYFIELD(m_iszFoundEnemySound, FIELD_SOUNDNAME, "FoundEnemySound"),
|
||||
DEFINE_KEYFIELD(m_bUseBothSquadSlots, FIELD_BOOLEAN, "UseBothSquadSlots"),
|
||||
DEFINE_KEYFIELD(m_bCannotOpenDoors, FIELD_BOOLEAN, "CannotOpenDoors"),
|
||||
DEFINE_KEYFIELD(m_bCanPickupWeapons, FIELD_BOOLEAN, "CanPickupWeapons"),
|
||||
|
||||
DEFINE_FIELD(m_bWanderToggle, FIELD_BOOLEAN),
|
||||
DEFINE_FIELD(m_flNextSoundTime, FIELD_TIME),
|
||||
DEFINE_FIELD(m_flNextFoundEnemySoundTime, FIELD_TIME),
|
||||
DEFINE_FIELD(m_flSpeedModifier, FIELD_TIME),
|
||||
|
||||
DEFINE_INPUTFUNC(FIELD_FLOAT, "SetSpeedModifier", InputSetSpeedModifier),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "EnableOpenDoors", InputEnableOpenDoors),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "DisableOpenDoors", InputDisableOpenDoors),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "EnablePickupWeapons", InputEnablePickupWeapons),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "DisablePickupWeapons", InputDisablePickupWeapons)
|
||||
END_DATADESC()
|
||||
|
||||
|
||||
AI_BEGIN_CUSTOM_NPC(npc_shadow_walker, CNPC_ShadowWalker)
|
||||
//=========================================================
|
||||
// > Melee_Attack_NoInterrupt
|
||||
//=========================================================
|
||||
DEFINE_SCHEDULE
|
||||
(
|
||||
SCHED_MELEE_ATTACK_NOINTERRUPT,
|
||||
|
||||
" Tasks"
|
||||
" TASK_STOP_MOVING 0"
|
||||
" TASK_FACE_ENEMY 0"
|
||||
" TASK_ANNOUNCE_ATTACK 1" // 1 = primary attack
|
||||
" TASK_MELEE_ATTACK1 0"
|
||||
""
|
||||
" Interrupts"
|
||||
" COND_ENEMY_DEAD"
|
||||
" COND_ENEMY_OCCLUDED"
|
||||
);
|
||||
|
||||
//=========================================================
|
||||
// SCHED_HIDE
|
||||
//=========================================================
|
||||
DEFINE_SCHEDULE
|
||||
(
|
||||
SCHED_HIDE,
|
||||
|
||||
" Tasks"
|
||||
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_COMBAT_FACE"
|
||||
" TASK_STOP_MOVING 0"
|
||||
" TASK_FIND_COVER_FROM_ENEMY 0"
|
||||
" TASK_RUN_PATH 0"
|
||||
" TASK_WAIT_FOR_MOVEMENT 0"
|
||||
" TASK_REMEMBER MEMORY:INCOVER"
|
||||
" TASK_FACE_ENEMY 0"
|
||||
""
|
||||
" Interrupts"
|
||||
" COND_HEAR_DANGER"
|
||||
" COND_NEW_ENEMY"
|
||||
" COND_ENEMY_DEAD"
|
||||
);
|
||||
AI_END_CUSTOM_NPC()
|
||||
|
||||
|
350
sp/src/game/server/mod/weapon_custom_flaregun.cpp
Normal file
350
sp/src/game/server/mod/weapon_custom_flaregun.cpp
Normal file
@ -0,0 +1,350 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
// Purpose: Flare gun (fffsssssssssss!!)
|
||||
//
|
||||
// This is a custom extension of Valve's CFlaregun class.
|
||||
// Some commented-out code has been duplicated from
|
||||
// weapon_flaregun.cpp in order to keep the mod code isolated
|
||||
// from the base game.
|
||||
//
|
||||
// Author: 1upD
|
||||
//
|
||||
//=============================================================================//
|
||||
|
||||
#include "cbase.h"
|
||||
#include "player.h"
|
||||
#include "gamerules.h"
|
||||
#include "basehlcombatweapon.h"
|
||||
#include "decals.h"
|
||||
#include "soundenvelope.h"
|
||||
#include "IEffects.h"
|
||||
#include "engine/IEngineSound.h"
|
||||
#include "weapon_flaregun.h"
|
||||
#include "props.h"
|
||||
#include "ai_basenpc.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
// Custom convars for flaregun
|
||||
ConVar flaregun_primary_velocity("sv_flaregun_primary_velocity", "1500");
|
||||
ConVar flaregun_secondary_velocity("sv_flaregun_secondary_velocity", "500");
|
||||
ConVar flaregun_duration_seconds("sv_flaregun_lifetime_seconds", "30");
|
||||
ConVar flaregun_stop_velocity("sv_flaregun_stop_velocity", "128");
|
||||
ConVar flaregun_projectile_sticky("sv_flaregun_projectile_sticky", "0");
|
||||
ConVar flaregun_dynamic_lights("sv_flaregun_dynamic_lights", "1");
|
||||
|
||||
// Custom derived class for flare gun projectiles
|
||||
class CFlareGunProjectile : public CFlare
|
||||
{
|
||||
public:
|
||||
DECLARE_CLASS(CFlareGunProjectile, CFlare);
|
||||
static CFlareGunProjectile *Create(Vector vecOrigin, QAngle vecAngles, CBaseEntity *pOwner, float lifetime);
|
||||
void IgniteOtherIfAllowed(CBaseEntity *pOther);
|
||||
void FlareGunProjectileTouch(CBaseEntity *pOther);
|
||||
void FlareGunProjectileBurnTouch(CBaseEntity *pOther);
|
||||
};
|
||||
|
||||
class CFlaregunCustom : public CFlaregun
|
||||
{
|
||||
public:
|
||||
DECLARE_CLASS(CFlaregunCustom, CFlaregun);
|
||||
virtual bool Reload(void);
|
||||
};
|
||||
|
||||
IMPLEMENT_SERVERCLASS_ST(CFlaregun, DT_Flaregun)
|
||||
END_SEND_TABLE()
|
||||
|
||||
LINK_ENTITY_TO_CLASS( weapon_flaregun, CFlaregunCustom);
|
||||
PRECACHE_WEAPON_REGISTER( weapon_flaregun );
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Precache
|
||||
//-----------------------------------------------------------------------------
|
||||
void CFlaregun::Precache( void )
|
||||
{
|
||||
BaseClass::Precache();
|
||||
|
||||
PrecacheScriptSound( "Flare.Touch" );
|
||||
|
||||
PrecacheScriptSound( "Weapon_FlareGun.Burn" );
|
||||
|
||||
UTIL_PrecacheOther( "env_flare" );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Fires a flare from a given flaregun with a given velocity
|
||||
// Acts like an extension method for CFlaregun
|
||||
//-----------------------------------------------------------------------------
|
||||
static void AttackWithVelocity(CFlaregun * flaregun, float projectileVelocity)
|
||||
{
|
||||
CBasePlayer *pOwner = ToBasePlayer(flaregun->GetOwner());
|
||||
|
||||
if (pOwner == NULL)
|
||||
return;
|
||||
|
||||
if (flaregun->m_iClip1 <= 0)
|
||||
{
|
||||
flaregun->SendWeaponAnim(ACT_VM_DRYFIRE);
|
||||
pOwner->m_flNextAttack = gpGlobals->curtime + flaregun->SequenceDuration();
|
||||
return;
|
||||
}
|
||||
|
||||
flaregun->m_iClip1 = flaregun->m_iClip1 - 1;
|
||||
|
||||
flaregun->SendWeaponAnim(ACT_VM_PRIMARYATTACK);
|
||||
pOwner->m_flNextAttack = gpGlobals->curtime + 1;
|
||||
|
||||
CFlare *pFlare = CFlareGunProjectile::Create(pOwner->Weapon_ShootPosition(), pOwner->EyeAngles(), pOwner, FLARE_DURATION);
|
||||
|
||||
if (pFlare == NULL)
|
||||
return;
|
||||
|
||||
Vector forward;
|
||||
pOwner->EyeVectors(&forward);
|
||||
forward *= projectileVelocity;
|
||||
forward += pOwner->GetAbsVelocity(); // Add the player's velocity to the forward vector so that the flare follows the player's motion
|
||||
forward.Normalized();
|
||||
|
||||
pFlare->SetAbsVelocity(forward);
|
||||
pFlare->SetGravity(1.0f);
|
||||
pFlare->SetFriction(0.85f);
|
||||
pFlare->SetMoveType(MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE);
|
||||
|
||||
flaregun->WeaponSound(SINGLE);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Main attack
|
||||
//-----------------------------------------------------------------------------
|
||||
void CFlaregun::PrimaryAttack( void )
|
||||
{
|
||||
AttackWithVelocity(this, flaregun_primary_velocity.GetFloat());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Secondary attack - launches flares closer to the player
|
||||
//-----------------------------------------------------------------------------
|
||||
void CFlaregun::SecondaryAttack( void )
|
||||
{
|
||||
AttackWithVelocity(this, flaregun_secondary_velocity.GetFloat());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
bool CFlaregunCustom::Reload(void)
|
||||
{
|
||||
bool fRet = DefaultReload(GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD);
|
||||
if (fRet)
|
||||
{
|
||||
WeaponSound(RELOAD);
|
||||
}
|
||||
return fRet;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Create function for Flare Gun projectile
|
||||
// Input : vecOrigin -
|
||||
// vecAngles -
|
||||
// *pOwner -
|
||||
// Output : CFlare
|
||||
//-----------------------------------------------------------------------------
|
||||
CFlareGunProjectile *CFlareGunProjectile::Create(Vector vecOrigin, QAngle vecAngles, CBaseEntity *pOwner, float lifetime)
|
||||
{
|
||||
CFlareGunProjectile *pFlare = (CFlareGunProjectile *)CreateEntityByName("env_flare");
|
||||
|
||||
if (pFlare == NULL)
|
||||
return NULL;
|
||||
|
||||
UTIL_SetOrigin(pFlare, vecOrigin);
|
||||
|
||||
pFlare->SetLocalAngles(vecAngles);
|
||||
pFlare->Spawn();
|
||||
pFlare->SetTouch(&CFlareGunProjectile::FlareGunProjectileTouch);
|
||||
pFlare->SetThink(&CFlare::FlareThink);
|
||||
pFlare->m_bLight = flaregun_dynamic_lights.GetBool();
|
||||
|
||||
//Start up the flare
|
||||
pFlare->Start(lifetime);
|
||||
|
||||
//Don't start sparking immediately
|
||||
pFlare->SetNextThink(gpGlobals->curtime + 0.5f);
|
||||
|
||||
//Burn out time
|
||||
pFlare->m_flTimeBurnOut = gpGlobals->curtime + lifetime;
|
||||
|
||||
// Time to next burn damage
|
||||
pFlare->m_flNextDamage = gpGlobals->curtime;
|
||||
|
||||
|
||||
pFlare->RemoveSolidFlags(FSOLID_NOT_SOLID);
|
||||
pFlare->AddSolidFlags(FSOLID_NOT_STANDABLE);
|
||||
|
||||
pFlare->SetMoveType(MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE);
|
||||
|
||||
pFlare->SetOwnerEntity(pOwner);
|
||||
pFlare->m_pOwner = pOwner;
|
||||
|
||||
return pFlare;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Touch function for flaregun projectiles
|
||||
// Input : *pOther - The entity that the flare has collided with
|
||||
//-----------------------------------------------------------------------------
|
||||
void CFlareGunProjectile::FlareGunProjectileTouch(CBaseEntity *pOther)
|
||||
{
|
||||
Assert(pOther);
|
||||
if (!pOther->IsSolid())
|
||||
return;
|
||||
|
||||
if ((m_nBounces < 10) && (GetWaterLevel() < 1))
|
||||
{
|
||||
// Throw some real chunks here
|
||||
g_pEffects->Sparks(GetAbsOrigin());
|
||||
}
|
||||
|
||||
//If the flare hit a person or NPC, do damage here.
|
||||
if (pOther && pOther->m_takedamage)
|
||||
{
|
||||
Vector vecNewVelocity = GetAbsVelocity();
|
||||
vecNewVelocity *= 0.1f;
|
||||
SetAbsVelocity(vecNewVelocity);
|
||||
SetMoveType(MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE);
|
||||
SetGravity(1.0f);
|
||||
Die(0.5);
|
||||
IgniteOtherIfAllowed(pOther);
|
||||
m_nBounces++;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// hit the world, check the material type here, see if the flare should stick.
|
||||
trace_t tr;
|
||||
tr = CBaseEntity::GetTouchTrace();
|
||||
|
||||
//Only do this on the first bounce if the convar is set
|
||||
if (flaregun_projectile_sticky.GetBool() && m_nBounces == 0)
|
||||
{
|
||||
const surfacedata_t *pdata = physprops->GetSurfaceData(tr.surface.surfaceProps);
|
||||
|
||||
if (pdata != NULL)
|
||||
{
|
||||
//Only embed into concrete and wood (jdw: too obscure for players?)
|
||||
//if ( ( pdata->gameMaterial == 'C' ) || ( pdata->gameMaterial == 'W' ) )
|
||||
{
|
||||
Vector impactDir = (tr.endpos - tr.startpos);
|
||||
VectorNormalize(impactDir);
|
||||
|
||||
float surfDot = tr.plane.normal.Dot(impactDir);
|
||||
|
||||
//Do not stick to ceilings or on shallow impacts
|
||||
if ((tr.plane.normal.z > -0.5f) && (surfDot < -0.9f))
|
||||
{
|
||||
RemoveSolidFlags(FSOLID_NOT_SOLID);
|
||||
AddSolidFlags(FSOLID_TRIGGER);
|
||||
UTIL_SetOrigin(this, tr.endpos + (tr.plane.normal * 2.0f));
|
||||
SetAbsVelocity(vec3_origin);
|
||||
SetMoveType(MOVETYPE_NONE);
|
||||
|
||||
SetTouch(&CFlareGunProjectile::FlareGunProjectileBurnTouch);
|
||||
|
||||
int index = decalsystem->GetDecalIndexForName("SmallScorch");
|
||||
if (index >= 0)
|
||||
{
|
||||
CBroadcastRecipientFilter filter;
|
||||
te->Decal(filter, 0.0, &tr.endpos, &tr.startpos, ENTINDEX(tr.m_pEnt), tr.hitbox, index);
|
||||
}
|
||||
|
||||
CPASAttenuationFilter filter2(this, "Flare.Touch");
|
||||
EmitSound(filter2, entindex(), "Flare.Touch");
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Scorch decal
|
||||
if (GetAbsVelocity().LengthSqr() > (250 * 250))
|
||||
{
|
||||
int index = decalsystem->GetDecalIndexForName("FadingScorch");
|
||||
if (index >= 0)
|
||||
{
|
||||
CBroadcastRecipientFilter filter;
|
||||
te->Decal(filter, 0.0, &tr.endpos, &tr.startpos, ENTINDEX(tr.m_pEnt), tr.hitbox, index);
|
||||
}
|
||||
}
|
||||
|
||||
// Change our flight characteristics
|
||||
SetMoveType(MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE);
|
||||
SetGravity(UTIL_ScaleForGravity(640));
|
||||
|
||||
m_nBounces++;
|
||||
|
||||
//After the first bounce, smacking into whoever fired the flare is fair game
|
||||
SetOwnerEntity(this);
|
||||
|
||||
// Slow down
|
||||
Vector vecNewVelocity = GetAbsVelocity();
|
||||
vecNewVelocity.x *= 0.8f;
|
||||
vecNewVelocity.y *= 0.8f;
|
||||
SetAbsVelocity(vecNewVelocity);
|
||||
|
||||
//Stopped?
|
||||
if (GetAbsVelocity().Length() < flaregun_stop_velocity.GetFloat())
|
||||
{
|
||||
RemoveSolidFlags(FSOLID_NOT_SOLID);
|
||||
AddSolidFlags(FSOLID_TRIGGER);
|
||||
SetAbsVelocity(vec3_origin);
|
||||
SetMoveType(MOVETYPE_NONE);
|
||||
SetTouch(&CFlareGunProjectile::FlareGunProjectileBurnTouch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
// Input : *pOther -
|
||||
//-----------------------------------------------------------------------------
|
||||
void CFlareGunProjectile::FlareGunProjectileBurnTouch(CBaseEntity *pOther)
|
||||
{
|
||||
if (pOther && pOther->m_takedamage && (m_flNextDamage < gpGlobals->curtime))
|
||||
{
|
||||
// Don't do damage - I want consistent behavior between initial collisions and after landing collisions
|
||||
// pOther->TakeDamage(CTakeDamageInfo(this, m_pOwner, 1, (DMG_BULLET | DMG_BURN)));
|
||||
m_flNextDamage = gpGlobals->curtime + 1.0f;
|
||||
IgniteOtherIfAllowed(pOther);
|
||||
}
|
||||
}
|
||||
|
||||
void CFlareGunProjectile::IgniteOtherIfAllowed(CBaseEntity * pOther)
|
||||
{
|
||||
// Don't burn the player
|
||||
if (pOther->IsPlayer())
|
||||
return;
|
||||
|
||||
CAI_BaseNPC *pNPC;
|
||||
pNPC = dynamic_cast<CAI_BaseNPC*>(pOther);
|
||||
if (pNPC) {
|
||||
// Don't burn friendly NPCs
|
||||
if (pNPC->IsPlayerAlly())
|
||||
return;
|
||||
|
||||
// Don't burn boss enemies
|
||||
if (FStrEq(STRING(pNPC->m_iClassname), "npc_combinegunship")
|
||||
|| FStrEq(STRING(pNPC->m_iClassname), "npc_combinedropship")
|
||||
|| FStrEq(STRING(pNPC->m_iClassname), "npc_strider")
|
||||
|| FStrEq(STRING(pNPC->m_iClassname), "npc_helicopter")
|
||||
)
|
||||
return;
|
||||
|
||||
// Burn this NPC
|
||||
pNPC->IgniteLifetime(flaregun_duration_seconds.GetFloat());
|
||||
}
|
||||
|
||||
// If this is a breakable prop, ignite it!
|
||||
CBreakableProp *pBreakable;
|
||||
pBreakable = dynamic_cast<CBreakableProp*>(pOther);
|
||||
if (pBreakable)
|
||||
pBreakable->IgniteLifetime(flaregun_duration_seconds.GetFloat());
|
||||
}
|
@ -52,11 +52,16 @@ $Project "Server (Episodic)"
|
||||
{
|
||||
$Folder "Mod"
|
||||
{
|
||||
$File "mod\npc_lost_soul.cpp"
|
||||
$File "mod\npc_shadow_walker.h"
|
||||
$File "mod\npc_shadow_walker.cpp"
|
||||
$File "mod\weapon_custom_melee.h"
|
||||
}
|
||||
$File "mod\npc_base_custom.h"
|
||||
$File "mod\npc_base_custom.cpp"
|
||||
$File "mod\npc_lost_soul.cpp"
|
||||
$File "mod\npc_shadow_walker.h"
|
||||
$File "mod\npc_shadow_walker.cpp"
|
||||
$File "mod\weapon_custom_melee.h"
|
||||
$File "mod\weapon_custom_flaregun.cpp"
|
||||
$File "hl2\npc_bullsquid.h"
|
||||
$File "hl2\npc_bullsquid.cpp"
|
||||
}
|
||||
$File "$SRCDIR\game\shared\episodic\achievements_ep1.cpp"
|
||||
$File "$SRCDIR\game\shared\episodic\achievements_ep2.cpp"
|
||||
$File "$SRCDIR\game\shared\episodic\achievements_epx.cpp"
|
||||
|
@ -119,10 +119,9 @@ ConVar sk_plr_dmg_smg1 ( "sk_plr_dmg_smg1","0", FCVAR_REPLICATED );
|
||||
ConVar sk_npc_dmg_smg1 ( "sk_npc_dmg_smg1","0", FCVAR_REPLICATED);
|
||||
ConVar sk_max_smg1 ( "sk_max_smg1","0", FCVAR_REPLICATED);
|
||||
|
||||
// FIXME: remove these
|
||||
//ConVar sk_plr_dmg_flare_round ( "sk_plr_dmg_flare_round","0", FCVAR_REPLICATED);
|
||||
//ConVar sk_npc_dmg_flare_round ( "sk_npc_dmg_flare_round","0", FCVAR_REPLICATED);
|
||||
//ConVar sk_max_flare_round ( "sk_max_flare_round","0", FCVAR_REPLICATED);
|
||||
ConVar sk_plr_dmg_flare_round ( "sk_plr_dmg_flare_round","0", FCVAR_REPLICATED);
|
||||
ConVar sk_npc_dmg_flare_round ( "sk_npc_dmg_flare_round","0", FCVAR_REPLICATED);
|
||||
ConVar sk_max_flare_round ( "sk_max_flare_round","15", FCVAR_REPLICATED);
|
||||
|
||||
ConVar sk_plr_dmg_buckshot ( "sk_plr_dmg_buckshot","0", FCVAR_REPLICATED);
|
||||
ConVar sk_npc_dmg_buckshot ( "sk_npc_dmg_buckshot","0", FCVAR_REPLICATED);
|
||||
@ -206,7 +205,7 @@ bool CHalfLife2::Damage_IsTimeBased( int iDmgType )
|
||||
// Damage types that are time-based.
|
||||
#ifdef HL2_EPISODIC
|
||||
// This makes me think EP2 should have its own rules, but they are #ifdef all over in here.
|
||||
return ( ( iDmgType & ( DMG_PARALYZE | DMG_NERVEGAS | DMG_POISON | DMG_RADIATION | DMG_DROWNRECOVER | DMG_SLOWBURN ) ) != 0 );
|
||||
return ( ( iDmgType & ( DMG_PARALYZE | DMG_NERVEGAS | DMG_POISON | DMG_ACID | DMG_RADIATION | DMG_DROWNRECOVER | DMG_SLOWBURN ) ) != 0 );
|
||||
#else
|
||||
return BaseClass::Damage_IsTimeBased( iDmgType );
|
||||
#endif
|
||||
@ -380,7 +379,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_PLAYER, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_COMBINE, D_HT, 0);
|
||||
@ -389,7 +388,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_MILITARY, D_HT, 0);
|
||||
@ -404,6 +403,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
|
||||
@ -416,7 +416,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_BARNACLE, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_COMBINE, D_HT, 0);
|
||||
@ -425,7 +425,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_MANHACK, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_MILITARY, D_HT, 0);
|
||||
@ -439,7 +439,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
|
||||
// ------------------------------------------------------------
|
||||
@ -448,7 +449,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_ANTLION, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -457,7 +458,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -475,7 +476,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_BULLSQUID
|
||||
// ------------------------------------------------------------
|
||||
/*
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_NONE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_PLAYER, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_ANTLION, D_HT, 0);
|
||||
@ -504,7 +505,8 @@ 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
|
||||
// ------------------------------------------------------------
|
||||
@ -513,7 +515,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_BARNACLE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -522,7 +524,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_HEADCRAB, D_FR, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_HOUNDEYE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_HOUNDEYE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_MANHACK, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -536,7 +538,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
|
||||
// ------------------------------------------------------------
|
||||
@ -545,7 +548,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_BARNACLE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_COMBINE, D_HT, 0);
|
||||
@ -554,7 +557,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_MILITARY, D_HT, 0);
|
||||
@ -568,7 +571,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
|
||||
// ------------------------------------------------------------
|
||||
@ -577,7 +581,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_BARNACLE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_COMBINE, D_LI, 0);
|
||||
@ -586,7 +590,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -600,7 +604,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
|
||||
// ------------------------------------------------------------
|
||||
@ -609,7 +613,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_COMBINE, D_LI, 0);
|
||||
@ -618,7 +622,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_MILITARY, D_NU, 0);
|
||||
@ -632,7 +636,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
|
||||
// ------------------------------------------------------------
|
||||
@ -641,7 +645,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_COMBINE, D_LI, 0);
|
||||
@ -650,7 +654,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_MILITARY, D_NU, 0);
|
||||
@ -664,7 +668,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
|
||||
// ------------------------------------------------------------
|
||||
@ -673,7 +677,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_BARNACLE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_COMBINE, D_HT, 0);
|
||||
@ -682,7 +686,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_MILITARY, D_HT, 0);
|
||||
@ -696,7 +700,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
|
||||
// ------------------------------------------------------------
|
||||
@ -705,7 +709,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_ANTLION, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -714,7 +718,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -738,7 +742,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_COMBINE, D_HT, 0);
|
||||
@ -747,7 +751,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_MILITARY, D_NU, 0);
|
||||
@ -761,17 +765,17 @@ 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
|
||||
// ------------------------------------------------------------
|
||||
/*
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_NONE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_PLAYER, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_COMBINE, D_HT, 0);
|
||||
@ -794,7 +798,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
|
||||
@ -804,7 +808,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_COMBINE, D_NU, 0);
|
||||
@ -813,7 +817,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_HEADCRAB, D_HT,-1);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_HOUNDEYE, D_HT,-1);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_HOUNDEYE, D_HT,-1);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_MILITARY, D_NU, 0);
|
||||
@ -827,7 +831,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
|
||||
// ------------------------------------------------------------
|
||||
@ -836,7 +840,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -845,7 +849,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -859,6 +863,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
|
||||
@ -868,7 +873,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_COMBINE, D_NU, 0);
|
||||
@ -877,7 +882,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_MILITARY, D_NU, 0);
|
||||
@ -891,7 +896,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
|
||||
// ------------------------------------------------------------
|
||||
@ -900,7 +906,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -909,7 +915,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -923,7 +929,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
|
||||
// ------------------------------------------------------------
|
||||
@ -932,7 +939,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_ANTLION, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -941,7 +948,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -963,7 +970,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_BARNACLE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_BULLSEYE, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_CITIZEN_PASSIVE, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_CITIZEN_REBEL, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_COMBINE, D_HT, 0);
|
||||
@ -972,7 +979,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_MILITARY, D_HT, 0);
|
||||
@ -986,7 +993,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
|
||||
// ------------------------------------------------------------
|
||||
@ -995,7 +1002,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_BARNACLE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1004,7 +1011,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_HEADCRAB, D_FR, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_MILITARY, D_HT, 0);
|
||||
@ -1018,7 +1025,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
|
||||
// ------------------------------------------------------------
|
||||
@ -1027,7 +1035,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_BARNACLE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1036,7 +1044,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_MILITARY, D_HT, 0);
|
||||
@ -1050,7 +1058,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
|
||||
// ------------------------------------------------------------
|
||||
@ -1059,7 +1067,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_COMBINE, D_LI, 0);
|
||||
@ -1068,7 +1076,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_MANHACK, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_METROPOLICE, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_MILITARY, D_LI, 0);
|
||||
@ -1081,8 +1089,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
|
||||
// ------------------------------------------------------------
|
||||
@ -1091,7 +1099,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_COMBINE, D_NU, 0);
|
||||
@ -1100,7 +1108,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_MILITARY, D_NU, 0);
|
||||
@ -1114,7 +1122,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
|
||||
// ------------------------------------------------------------
|
||||
@ -1123,7 +1131,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_BARNACLE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_CITIZEN_PASSIVE, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_CITIZEN_REBEL, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1132,7 +1140,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_MILITARY, D_HT, 0);
|
||||
@ -1146,7 +1154,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
|
||||
// ------------------------------------------------------------
|
||||
@ -1155,7 +1163,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1164,7 +1172,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_MANHACK, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_MILITARY, D_FR, 0);
|
||||
@ -1178,7 +1186,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
|
||||
// ------------------------------------------------------------
|
||||
@ -1187,7 +1195,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_COMBINE, D_NU, 0);
|
||||
@ -1196,7 +1204,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_MILITARY, D_NU, 0);
|
||||
@ -1210,7 +1218,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
|
||||
//
|
||||
@ -1222,7 +1230,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1231,7 +1239,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_FLARE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_MILITARY, D_HT, 0);
|
||||
@ -1245,7 +1253,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
|
||||
// ------------------------------------------------------------
|
||||
@ -1254,7 +1262,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1263,7 +1271,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_MILITARY, D_HT, 0);
|
||||
@ -1277,6 +1285,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);
|
||||
}
|
||||
|
||||
|
||||
@ -1819,6 +1828,9 @@ CAmmoDef *GetAmmoDef()
|
||||
def.AddAmmoType("CombineCannon", DMG_BULLET, TRACER_LINE, "sk_npc_dmg_gunship_to_plr", "sk_npc_dmg_gunship", NULL, 1.5 * 750 * 12, 0 ); // hit like a 1.5kg weight at 750 ft/s
|
||||
def.AddAmmoType("AirboatGun", DMG_AIRBOAT, TRACER_LINE, "sk_plr_dmg_airboat", "sk_npc_dmg_airboat", NULL, BULLET_IMPULSE(10, 600), 0 );
|
||||
|
||||
// Custom
|
||||
def.AddAmmoType("FlareRound", DMG_BURN, TRACER_NONE, "sk_plr_dmg_flare_round", "sk_npc_dmg_flare_round", "sk_max_flare_round", 0, 0);
|
||||
|
||||
//=====================================================================
|
||||
// STRIDER MINIGUN DAMAGE - Pull up a chair and I'll tell you a tale.
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user