aboutsummaryrefslogtreecommitdiff
path: root/sp/src/game/shared/hl2
diff options
context:
space:
mode:
authorAlan Edwardes <[email protected]>2013-12-03 10:47:30 +0000
committerAlan Edwardes <[email protected]>2013-12-03 10:47:30 +0000
commit550992aebacbc7586553c15a3c2120f85a879126 (patch)
treec814cf654018acd5d69bb6e4be5dc9900391fd37 /sp/src/game/shared/hl2
parentVBSP now checks all search paths for an FGD file. (diff)
parentMake .xcconfigs text files too. (diff)
downloadsource-sdk-2013-550992aebacbc7586553c15a3c2120f85a879126.tar.xz
source-sdk-2013-550992aebacbc7586553c15a3c2120f85a879126.zip
Merge remote-tracking branch 'upstream/master' into vbsp-fixes.
Diffstat (limited to 'sp/src/game/shared/hl2')
-rw-r--r--sp/src/game/shared/hl2/achievements_hl2.cpp540
-rw-r--r--sp/src/game/shared/hl2/basehlcombatweapon_shared.cpp860
-rw-r--r--sp/src/game/shared/hl2/basehlcombatweapon_shared.h132
-rw-r--r--sp/src/game/shared/hl2/citadel_effects_shared.h124
-rw-r--r--sp/src/game/shared/hl2/env_alyxemp_shared.h126
-rw-r--r--sp/src/game/shared/hl2/env_headcrabcanister_shared.cpp786
-rw-r--r--sp/src/game/shared/hl2/env_headcrabcanister_shared.h360
-rw-r--r--sp/src/game/shared/hl2/hl2_gamerules.cpp3760
-rw-r--r--sp/src/game/shared/hl2/hl2_gamerules.h236
-rw-r--r--sp/src/game/shared/hl2/hl2_player_shared.h42
-rw-r--r--sp/src/game/shared/hl2/hl2_shareddefs.h98
-rw-r--r--sp/src/game/shared/hl2/hl2_usermessages.cpp104
-rw-r--r--sp/src/game/shared/hl2/hl2_vehicle_radar.h52
-rw-r--r--sp/src/game/shared/hl2/hl_gamemovement.cpp2302
-rw-r--r--sp/src/game/shared/hl2/hl_gamemovement.h258
-rw-r--r--sp/src/game/shared/hl2/hl_movedata.h102
-rw-r--r--sp/src/game/shared/hl2/survival_gamerules.cpp544
17 files changed, 5213 insertions, 5213 deletions
diff --git a/sp/src/game/shared/hl2/achievements_hl2.cpp b/sp/src/game/shared/hl2/achievements_hl2.cpp
index 393604e0..0f589457 100644
--- a/sp/src/game/shared/hl2/achievements_hl2.cpp
+++ b/sp/src/game/shared/hl2/achievements_hl2.cpp
@@ -1,271 +1,271 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//=============================================================================
-
-
-#include "cbase.h"
-
-#if GAME_DLL
-
-#include "achievementmgr.h"
-#include "baseachievement.h"
-
-CAchievementMgr g_AchievementMgrHL2; // global achievement mgr for HL2
-
-class CAchievementHL2KillBarnaclesWithOneBarrel : public CBaseAchievement
-{
-protected:
- virtual void Init()
- {
- SetFlags( ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME );
- SetInflictorFilter( "prop_physics" );
- SetVictimFilter( "npc_barnacle" );
- SetGoal( 1 );
- m_pLastInflictor = NULL;
- m_iBarnacleCount = 0;
- }
-
- virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event )
- {
- int iDamageBits = event->GetInt( "damagebits" );
- // only interested blast damage. (Barrels or other explosive phys objects are all OK)
- if ( !( iDamageBits & DMG_BLAST ) )
- return;
-
- if ( m_pLastInflictor != NULL && pInflictor != m_pLastInflictor )
- {
- m_iBarnacleCount = 1;
- }
- else
- {
- m_iBarnacleCount++;
- if ( 5 == m_iBarnacleCount )
- {
- IncrementCount();
- }
- }
- m_pLastInflictor = pInflictor;
- }
-
- CBaseEntity *m_pLastInflictor;
- int m_iBarnacleCount;
-};
-DECLARE_ACHIEVEMENT( CAchievementHL2KillBarnaclesWithOneBarrel, ACHIEVEMENT_HL2_KILL_BARNACLESWITHBARREL, "HL2_KILL_BARNACLESWITHBARREL", 5 );
-
-extern int CalcPlayerAttacks( bool bBulletOnly );
-
-class CAchievementHL2BeatRavenholmNoWeapons : public CFailableAchievement
-{
- DECLARE_CLASS( CAchievementHL2BeatRavenholmNoWeapons, CFailableAchievement );
-
- void Init()
- {
- SetFlags( ACH_LISTEN_MAP_EVENTS | ACH_SAVE_WITH_GAME );
- SetGoal( 1 );
- m_iInitialAttackCount = 0;
- }
-
- // map event where achievement is activated
- virtual const char *GetActivationEventName() { return "HL2_BEAT_RAVENHOLM_NOWEAPONS_START"; }
- // map event where achievement is evaluated for success
- virtual const char *GetEvaluationEventName() { return "HL2_BEAT_RAVENHOLM_NOWEAPONS_END"; }
-
- virtual void PreRestoreSavedGame()
- {
- m_iInitialAttackCount = 0;
- BaseClass::PreRestoreSavedGame();
- }
-
- virtual void OnActivationEvent()
- {
- // get current # of attacks by player w/all weapons (except grav gun) and store that
- m_iInitialAttackCount = CalcPlayerAttacks( false );
- BaseClass::OnActivationEvent();
- }
-
- virtual void OnEvaluationEvent()
- {
- // get current # of attacks by player w/all weapons (except grav gun)
- int iCurAttackCount = CalcPlayerAttacks( false );
- // compare to # of attacks when we started
- if ( iCurAttackCount > m_iInitialAttackCount )
- {
- // if there have been any more weapon attacks, achievement fails
- SetFailed();
- }
- BaseClass::OnEvaluationEvent();
- }
-
- // additional status for debugging
- virtual void PrintAdditionalStatus()
- {
- if ( m_bActivated )
- {
- Msg( "Starting wpn attacks: %d Current wpn attacks: %d\n", m_iInitialAttackCount, CalcPlayerAttacks( false ) );
- }
- }
-
- int m_iInitialAttackCount;
-public:
- DECLARE_DATADESC()
-};
-DECLARE_ACHIEVEMENT( CAchievementHL2BeatRavenholmNoWeapons, ACHIEVEMENT_HL2_BEAT_RAVENHOLM_NOWEAPONS, "HL2_BEAT_RAVENHOLM_NOWEAPONS", 25 );
-
-BEGIN_DATADESC( CAchievementHL2BeatRavenholmNoWeapons )
-DEFINE_FIELD( m_iInitialAttackCount, FIELD_INTEGER ),
-END_DATADESC()
-
-
-class CAchievementHL2KillGunships : public CBaseAchievement
-{
- void Init()
- {
- SetFlags( ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME );
- SetVictimFilter( "npc_combinegunship" );
- SetGoal( 6 ); // note: goal is really six, although #define is "THREEGUNSHIPS"
- }
-};
-DECLARE_ACHIEVEMENT( CAchievementHL2KillGunships, ACHIEVEMENT_HL2_KILL_THREEGUNSHIPS, "HL2_KILL_THREEGUNSHIPS", 5 );
-
-class CAchievementHL2KillEnemiesWithAntlions : public CBaseAchievement
-{
- void Init()
- {
- SetFlags( ACH_LISTEN_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME );
- SetInflictorFilter( "npc_antlion" );
- SetGoal( 50 );
- }
-
- virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event )
- {
- CBasePlayer *pPlayer = UTIL_GetLocalPlayer();
- if ( pPlayer )
- {
- // Only count antlion kills once player owns bugbait.
- if ( pPlayer->Weapon_OwnsThisType( "weapon_bugbait" ) )
- {
- IncrementCount();
- }
- }
- }
-};
-DECLARE_ACHIEVEMENT( CAchievementHL2KillEnemiesWithAntlions, ACHIEVEMENT_HL2_KILL_ENEMIES_WITHANTLIONS, "HL2_KILL_ENEMIES_WITHANTLIONS", 10 );
-
-class CAchievementHL2KillEnemyWithToilet : public CBaseAchievement
-{
- void Init()
- {
- SetFlags( ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME );
- SetInflictorFilter( "prop_physics" );
- SetGoal( 1 );
- }
-
- virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event )
- {
- const char *pszName = GetModelName( pInflictor );
-
- // skip past any directories and get just the file name
- pszName = V_UnqualifiedFileName( pszName );
- // if model name matches one of the toilets, this counts
- if ( ( 0 == Q_stricmp( pszName, "FurnitureToilet001a.mdl" ) ) || ( 0 == Q_stricmp( pszName, "prison_toilet01.mdl" ) ) )
- {
- IncrementCount();
- }
- }
-};
-DECLARE_ACHIEVEMENT( CAchievementHL2KillEnemyWithToilet, ACHIEVEMENT_HL2_KILL_ENEMY_WITHTOILET, "HL2_KILL_ENEMY_WITHTOILET", 5 );
-
-class CAchievementHL2DisintegrateSoldiersInField : public CBaseAchievement
-{
- void Init()
- {
- SetFlags( ACH_SAVE_WITH_GAME );
- SetGoal( 15 );
- }
-
- virtual void ListenForEvents()
- {
- ListenForGameEvent( "ragdoll_dissolved" );
- }
-
- void FireGameEvent_Internal( IGameEvent *event )
- {
- if ( 0 == Q_strcmp( event->GetName(), "ragdoll_dissolved" ) )
- {
- CBaseEntity *pRagdoll = UTIL_EntityByIndex( event->GetInt( "entindex", 0 ) );
- if ( pRagdoll )
- {
- const char *pszName = GetModelName( pRagdoll );
-
- // skip past any directories and get just the file name
- pszName = V_UnqualifiedFileName( pszName );
-
- if ( ( 0 == Q_stricmp( pszName, "combine_soldier.mdl" ) ) ||
- ( 0 == Q_stricmp( pszName, "combine_super_soldier.mdl" ) ) )
- {
- IncrementCount();
- }
- }
- }
- }
-};
-DECLARE_ACHIEVEMENT( CAchievementHL2DisintegrateSoldiersInField, ACHIEVEMENT_HL2_DISINTEGRATE_SOLDIERSINFIELD, "HL2_DISINTEGRATE_SOLDIERSINFIELD", 10 );
-
-class CAchievementHL2FindAllLambdas : public CBaseAchievement
-{
- virtual void Init()
- {
- static const char *szComponents[] =
- {
- "HL2_LAMDACACHE_KLEINERSLAB", "HL2_LAMDACACHE_CANALSSTATION", "HL2_LAMDACACHE_VENTCRAWL", "HL2_LAMDACACHE_CANALSTUNNEL",
- "HL2_LAMDACACHE_SEWERGRATE", "HL2_LAMDACACHE_STEAMPIPE", "HL2_LAMDACACHE_CURVEDROOM", "HL2_LAMDACACHE_SHANTYTOWN",
- "HL2_LAMDACACHE_TUNNELLADDER", "HL2_LAMDACACHE_REDBARN", "HL2_LAMDACACHE_ZOMBIEAMBUSH", "HL2_LAMDACACHE_BELOWAPCS",
- "HL2_LAMDACACHE_COUNTERWEIGHT", "HL2_LAMDACACHE_RAILWAYBRIDGE", "HL2_LAMDACACHE_TUNNELPLATFORMS", "HL2_LAMDACACHE_BANKEDCANAL",
- "HL2_LAMDACACHE_CANALWALL", "HL2_LAMDACACHE_CHANNELSPLIT", "HL2_LAMDACACHE_BMEDOCK", "HL2_LAMDACACHE_GENERATORS",
- "HL2_LAMDACACHE_CARCRUSHERARENA", "HL2_LAMDACACHE_RAVENHOLMATTIC", "HL2_LAMDACACHE_MINETUNNELEXIT",
- "HL2_LAMDACACHE_COASTSHACK", "HL2_LAMDACACHE_POISONSHACK", "HL2_LAMDACACHE_GUNSHIPVAN", "HL2_LAMDACACHE_SUICIDECITIZEN",
- "HL2_LAMDACACHE_RAILROADSHACK", "HL2_LAMDACACHE_COASTABOVEBATTERY", "HL2_LAMDACACHE_SANDSHACK", "HL2_LAMDACACHE_GMANCACHE",
- "HL2_LAMDACACHE_CELLCACHE", "HL2_LAMDACACHE_POISONLAUNDRY", "HL2_LAMDACACHE_SODAMACHINE",
- "HL2_LAMDACACHE_STREETWARDOGWALL", "HL2_LAMDACACHE_STREETWARSHACK", "HL2_LAMDACACHE_STREETWARFENCE", "HL2_LAMDACACHE_FREEWAYTUNNEL", "HL2_LAMDACACHE_DRAWBRIDGE",
- "HL2_LAMDACACHE_PLAZAFENCE", "HL2_LAMDACACHE_SEWERSCATWALKS", "HL2_LAMDACACHE_POISONZOMBIEALCOVE", "HL2_LAMDACACHE_PIPEHOPTUNNEL",
- "HL2_LAMDACACHE_ENDOFC1712B", "HL2_LAMDACACHE_EXITCATWALK"
- };
- SetFlags( ACH_HAS_COMPONENTS | ACH_LISTEN_COMPONENT_EVENTS | ACH_SAVE_GLOBAL );
- m_pszComponentNames = szComponents;
- m_iNumComponents = ARRAYSIZE( szComponents );
- SetComponentPrefix( "HL2_LAMDACACHE" );
- SetGoal( m_iNumComponents );
- }
-};
-DECLARE_ACHIEVEMENT( CAchievementHL2FindAllLambdas, ACHIEVEMENT_HL2_FIND_ALLLAMBDAS, "HL2_FIND_ALLLAMBDAS", 15 );
-
-// achievements which are won by a map event firing once
-DECLARE_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_HL2_HIT_CANCOP_WITHCAN, "HL2_HIT_CANCOP_WITHCAN", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_HL2_PUT_CANINTRASH, "HL2_PUT_CANINTRASH", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_ESCAPE_APARTMENTRAID, "HL2_ESCAPE_APARTMENTRAID", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BREAK_MINITELEPORTER, "HL2_BREAK_MINITELEPORTER", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_GET_CROWBAR, "HL2_GET_CROWBAR", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_GET_AIRBOAT, "HL2_GET_AIRBOAT", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_GET_AIRBOATGUN, "HL2_GET_AIRBOATGUN", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_FIND_VORTIGAUNTCAVE, "HL2_FIND_VORTIGAUNTCAVE", 13 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_KILL_CHOPPER, "HL2_KILL_CHOPPER", 10 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_FIND_HEVFACEPLATE, "HL2_FIND_HEVFACEPLATE", 10 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_GET_GRAVITYGUN, "HL2_GET_GRAVITYGUN", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_MAKEABASKET, "HL2_MAKEABASKET", 2 );
-DECLARE_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_HL2_BEAT_CEMETERY, "HL2_BEAT_CEMETERY", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_KILL_ENEMIES_WITHCRANE, "HL2_KILL_ENEMIES_WITHCRANE", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_PIN_SOLDIER_TOBILLBOARD, "HL2_PIN_SOLDIER_TOBILLBOARD", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_HL2_KILL_ODESSAGUNSHIP, "HL2_KILL_ODESSAGUNSHIP", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_DONTTOUCHSAND, "HL2_BEAT_DONTTOUCHSAND", 20 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_TURRETSTANDOFF2, "HL2_BEAT_TURRETSTANDOFF2", 10 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_FOLLOW_FREEMAN, "HL2_FOLLOWFREEMAN", 10 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_TOXICTUNNEL, "HL2_BEAT_TOXICTUNNEL", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_PLAZASTANDOFF, "HL2_BEAT_PLAZASTANDOFF", 10 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_KILL_ALLC1709SNIPERS, "HL2_KILL_ALLC1709SNIPERS", 5 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_SUPRESSIONDEVICE, "HL2_BEAT_SUPRESSIONDEVICE", 10 );
-DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_C1713STRIDERSTANDOFF, "HL2_BEAT_C1713STRIDERSTANDOFF", 10 );
-DECLARE_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_HL2_BEAT_GAME, "HL2_BEAT_GAME", 25 );
-
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+
+#include "cbase.h"
+
+#if GAME_DLL
+
+#include "achievementmgr.h"
+#include "baseachievement.h"
+
+CAchievementMgr g_AchievementMgrHL2; // global achievement mgr for HL2
+
+class CAchievementHL2KillBarnaclesWithOneBarrel : public CBaseAchievement
+{
+protected:
+ virtual void Init()
+ {
+ SetFlags( ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME );
+ SetInflictorFilter( "prop_physics" );
+ SetVictimFilter( "npc_barnacle" );
+ SetGoal( 1 );
+ m_pLastInflictor = NULL;
+ m_iBarnacleCount = 0;
+ }
+
+ virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event )
+ {
+ int iDamageBits = event->GetInt( "damagebits" );
+ // only interested blast damage. (Barrels or other explosive phys objects are all OK)
+ if ( !( iDamageBits & DMG_BLAST ) )
+ return;
+
+ if ( m_pLastInflictor != NULL && pInflictor != m_pLastInflictor )
+ {
+ m_iBarnacleCount = 1;
+ }
+ else
+ {
+ m_iBarnacleCount++;
+ if ( 5 == m_iBarnacleCount )
+ {
+ IncrementCount();
+ }
+ }
+ m_pLastInflictor = pInflictor;
+ }
+
+ CBaseEntity *m_pLastInflictor;
+ int m_iBarnacleCount;
+};
+DECLARE_ACHIEVEMENT( CAchievementHL2KillBarnaclesWithOneBarrel, ACHIEVEMENT_HL2_KILL_BARNACLESWITHBARREL, "HL2_KILL_BARNACLESWITHBARREL", 5 );
+
+extern int CalcPlayerAttacks( bool bBulletOnly );
+
+class CAchievementHL2BeatRavenholmNoWeapons : public CFailableAchievement
+{
+ DECLARE_CLASS( CAchievementHL2BeatRavenholmNoWeapons, CFailableAchievement );
+
+ void Init()
+ {
+ SetFlags( ACH_LISTEN_MAP_EVENTS | ACH_SAVE_WITH_GAME );
+ SetGoal( 1 );
+ m_iInitialAttackCount = 0;
+ }
+
+ // map event where achievement is activated
+ virtual const char *GetActivationEventName() { return "HL2_BEAT_RAVENHOLM_NOWEAPONS_START"; }
+ // map event where achievement is evaluated for success
+ virtual const char *GetEvaluationEventName() { return "HL2_BEAT_RAVENHOLM_NOWEAPONS_END"; }
+
+ virtual void PreRestoreSavedGame()
+ {
+ m_iInitialAttackCount = 0;
+ BaseClass::PreRestoreSavedGame();
+ }
+
+ virtual void OnActivationEvent()
+ {
+ // get current # of attacks by player w/all weapons (except grav gun) and store that
+ m_iInitialAttackCount = CalcPlayerAttacks( false );
+ BaseClass::OnActivationEvent();
+ }
+
+ virtual void OnEvaluationEvent()
+ {
+ // get current # of attacks by player w/all weapons (except grav gun)
+ int iCurAttackCount = CalcPlayerAttacks( false );
+ // compare to # of attacks when we started
+ if ( iCurAttackCount > m_iInitialAttackCount )
+ {
+ // if there have been any more weapon attacks, achievement fails
+ SetFailed();
+ }
+ BaseClass::OnEvaluationEvent();
+ }
+
+ // additional status for debugging
+ virtual void PrintAdditionalStatus()
+ {
+ if ( m_bActivated )
+ {
+ Msg( "Starting wpn attacks: %d Current wpn attacks: %d\n", m_iInitialAttackCount, CalcPlayerAttacks( false ) );
+ }
+ }
+
+ int m_iInitialAttackCount;
+public:
+ DECLARE_DATADESC()
+};
+DECLARE_ACHIEVEMENT( CAchievementHL2BeatRavenholmNoWeapons, ACHIEVEMENT_HL2_BEAT_RAVENHOLM_NOWEAPONS, "HL2_BEAT_RAVENHOLM_NOWEAPONS", 25 );
+
+BEGIN_DATADESC( CAchievementHL2BeatRavenholmNoWeapons )
+DEFINE_FIELD( m_iInitialAttackCount, FIELD_INTEGER ),
+END_DATADESC()
+
+
+class CAchievementHL2KillGunships : public CBaseAchievement
+{
+ void Init()
+ {
+ SetFlags( ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME );
+ SetVictimFilter( "npc_combinegunship" );
+ SetGoal( 6 ); // note: goal is really six, although #define is "THREEGUNSHIPS"
+ }
+};
+DECLARE_ACHIEVEMENT( CAchievementHL2KillGunships, ACHIEVEMENT_HL2_KILL_THREEGUNSHIPS, "HL2_KILL_THREEGUNSHIPS", 5 );
+
+class CAchievementHL2KillEnemiesWithAntlions : public CBaseAchievement
+{
+ void Init()
+ {
+ SetFlags( ACH_LISTEN_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME );
+ SetInflictorFilter( "npc_antlion" );
+ SetGoal( 50 );
+ }
+
+ virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event )
+ {
+ CBasePlayer *pPlayer = UTIL_GetLocalPlayer();
+ if ( pPlayer )
+ {
+ // Only count antlion kills once player owns bugbait.
+ if ( pPlayer->Weapon_OwnsThisType( "weapon_bugbait" ) )
+ {
+ IncrementCount();
+ }
+ }
+ }
+};
+DECLARE_ACHIEVEMENT( CAchievementHL2KillEnemiesWithAntlions, ACHIEVEMENT_HL2_KILL_ENEMIES_WITHANTLIONS, "HL2_KILL_ENEMIES_WITHANTLIONS", 10 );
+
+class CAchievementHL2KillEnemyWithToilet : public CBaseAchievement
+{
+ void Init()
+ {
+ SetFlags( ACH_LISTEN_PLAYER_KILL_ENEMY_EVENTS | ACH_SAVE_WITH_GAME );
+ SetInflictorFilter( "prop_physics" );
+ SetGoal( 1 );
+ }
+
+ virtual void Event_EntityKilled( CBaseEntity *pVictim, CBaseEntity *pAttacker, CBaseEntity *pInflictor, IGameEvent *event )
+ {
+ const char *pszName = GetModelName( pInflictor );
+
+ // skip past any directories and get just the file name
+ pszName = V_UnqualifiedFileName( pszName );
+ // if model name matches one of the toilets, this counts
+ if ( ( 0 == Q_stricmp( pszName, "FurnitureToilet001a.mdl" ) ) || ( 0 == Q_stricmp( pszName, "prison_toilet01.mdl" ) ) )
+ {
+ IncrementCount();
+ }
+ }
+};
+DECLARE_ACHIEVEMENT( CAchievementHL2KillEnemyWithToilet, ACHIEVEMENT_HL2_KILL_ENEMY_WITHTOILET, "HL2_KILL_ENEMY_WITHTOILET", 5 );
+
+class CAchievementHL2DisintegrateSoldiersInField : public CBaseAchievement
+{
+ void Init()
+ {
+ SetFlags( ACH_SAVE_WITH_GAME );
+ SetGoal( 15 );
+ }
+
+ virtual void ListenForEvents()
+ {
+ ListenForGameEvent( "ragdoll_dissolved" );
+ }
+
+ void FireGameEvent_Internal( IGameEvent *event )
+ {
+ if ( 0 == Q_strcmp( event->GetName(), "ragdoll_dissolved" ) )
+ {
+ CBaseEntity *pRagdoll = UTIL_EntityByIndex( event->GetInt( "entindex", 0 ) );
+ if ( pRagdoll )
+ {
+ const char *pszName = GetModelName( pRagdoll );
+
+ // skip past any directories and get just the file name
+ pszName = V_UnqualifiedFileName( pszName );
+
+ if ( ( 0 == Q_stricmp( pszName, "combine_soldier.mdl" ) ) ||
+ ( 0 == Q_stricmp( pszName, "combine_super_soldier.mdl" ) ) )
+ {
+ IncrementCount();
+ }
+ }
+ }
+ }
+};
+DECLARE_ACHIEVEMENT( CAchievementHL2DisintegrateSoldiersInField, ACHIEVEMENT_HL2_DISINTEGRATE_SOLDIERSINFIELD, "HL2_DISINTEGRATE_SOLDIERSINFIELD", 10 );
+
+class CAchievementHL2FindAllLambdas : public CBaseAchievement
+{
+ virtual void Init()
+ {
+ static const char *szComponents[] =
+ {
+ "HL2_LAMDACACHE_KLEINERSLAB", "HL2_LAMDACACHE_CANALSSTATION", "HL2_LAMDACACHE_VENTCRAWL", "HL2_LAMDACACHE_CANALSTUNNEL",
+ "HL2_LAMDACACHE_SEWERGRATE", "HL2_LAMDACACHE_STEAMPIPE", "HL2_LAMDACACHE_CURVEDROOM", "HL2_LAMDACACHE_SHANTYTOWN",
+ "HL2_LAMDACACHE_TUNNELLADDER", "HL2_LAMDACACHE_REDBARN", "HL2_LAMDACACHE_ZOMBIEAMBUSH", "HL2_LAMDACACHE_BELOWAPCS",
+ "HL2_LAMDACACHE_COUNTERWEIGHT", "HL2_LAMDACACHE_RAILWAYBRIDGE", "HL2_LAMDACACHE_TUNNELPLATFORMS", "HL2_LAMDACACHE_BANKEDCANAL",
+ "HL2_LAMDACACHE_CANALWALL", "HL2_LAMDACACHE_CHANNELSPLIT", "HL2_LAMDACACHE_BMEDOCK", "HL2_LAMDACACHE_GENERATORS",
+ "HL2_LAMDACACHE_CARCRUSHERARENA", "HL2_LAMDACACHE_RAVENHOLMATTIC", "HL2_LAMDACACHE_MINETUNNELEXIT",
+ "HL2_LAMDACACHE_COASTSHACK", "HL2_LAMDACACHE_POISONSHACK", "HL2_LAMDACACHE_GUNSHIPVAN", "HL2_LAMDACACHE_SUICIDECITIZEN",
+ "HL2_LAMDACACHE_RAILROADSHACK", "HL2_LAMDACACHE_COASTABOVEBATTERY", "HL2_LAMDACACHE_SANDSHACK", "HL2_LAMDACACHE_GMANCACHE",
+ "HL2_LAMDACACHE_CELLCACHE", "HL2_LAMDACACHE_POISONLAUNDRY", "HL2_LAMDACACHE_SODAMACHINE",
+ "HL2_LAMDACACHE_STREETWARDOGWALL", "HL2_LAMDACACHE_STREETWARSHACK", "HL2_LAMDACACHE_STREETWARFENCE", "HL2_LAMDACACHE_FREEWAYTUNNEL", "HL2_LAMDACACHE_DRAWBRIDGE",
+ "HL2_LAMDACACHE_PLAZAFENCE", "HL2_LAMDACACHE_SEWERSCATWALKS", "HL2_LAMDACACHE_POISONZOMBIEALCOVE", "HL2_LAMDACACHE_PIPEHOPTUNNEL",
+ "HL2_LAMDACACHE_ENDOFC1712B", "HL2_LAMDACACHE_EXITCATWALK"
+ };
+ SetFlags( ACH_HAS_COMPONENTS | ACH_LISTEN_COMPONENT_EVENTS | ACH_SAVE_GLOBAL );
+ m_pszComponentNames = szComponents;
+ m_iNumComponents = ARRAYSIZE( szComponents );
+ SetComponentPrefix( "HL2_LAMDACACHE" );
+ SetGoal( m_iNumComponents );
+ }
+};
+DECLARE_ACHIEVEMENT( CAchievementHL2FindAllLambdas, ACHIEVEMENT_HL2_FIND_ALLLAMBDAS, "HL2_FIND_ALLLAMBDAS", 15 );
+
+// achievements which are won by a map event firing once
+DECLARE_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_HL2_HIT_CANCOP_WITHCAN, "HL2_HIT_CANCOP_WITHCAN", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_HL2_PUT_CANINTRASH, "HL2_PUT_CANINTRASH", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_ESCAPE_APARTMENTRAID, "HL2_ESCAPE_APARTMENTRAID", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BREAK_MINITELEPORTER, "HL2_BREAK_MINITELEPORTER", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_GET_CROWBAR, "HL2_GET_CROWBAR", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_GET_AIRBOAT, "HL2_GET_AIRBOAT", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_GET_AIRBOATGUN, "HL2_GET_AIRBOATGUN", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_FIND_VORTIGAUNTCAVE, "HL2_FIND_VORTIGAUNTCAVE", 13 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_KILL_CHOPPER, "HL2_KILL_CHOPPER", 10 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_FIND_HEVFACEPLATE, "HL2_FIND_HEVFACEPLATE", 10 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_GET_GRAVITYGUN, "HL2_GET_GRAVITYGUN", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_MAKEABASKET, "HL2_MAKEABASKET", 2 );
+DECLARE_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_HL2_BEAT_CEMETERY, "HL2_BEAT_CEMETERY", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_KILL_ENEMIES_WITHCRANE, "HL2_KILL_ENEMIES_WITHCRANE", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_PIN_SOLDIER_TOBILLBOARD, "HL2_PIN_SOLDIER_TOBILLBOARD", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_HL2_KILL_ODESSAGUNSHIP, "HL2_KILL_ODESSAGUNSHIP", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_DONTTOUCHSAND, "HL2_BEAT_DONTTOUCHSAND", 20 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_TURRETSTANDOFF2, "HL2_BEAT_TURRETSTANDOFF2", 10 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_FOLLOW_FREEMAN, "HL2_FOLLOWFREEMAN", 10 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_TOXICTUNNEL, "HL2_BEAT_TOXICTUNNEL", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_PLAZASTANDOFF, "HL2_BEAT_PLAZASTANDOFF", 10 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_KILL_ALLC1709SNIPERS, "HL2_KILL_ALLC1709SNIPERS", 5 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_SUPRESSIONDEVICE, "HL2_BEAT_SUPRESSIONDEVICE", 10 );
+DECLARE_MAP_EVENT_ACHIEVEMENT( ACHIEVEMENT_HL2_BEAT_C1713STRIDERSTANDOFF, "HL2_BEAT_C1713STRIDERSTANDOFF", 10 );
+DECLARE_MAP_EVENT_ACHIEVEMENT_HIDDEN( ACHIEVEMENT_HL2_BEAT_GAME, "HL2_BEAT_GAME", 25 );
+
#endif // GAME_DLL \ No newline at end of file
diff --git a/sp/src/game/shared/hl2/basehlcombatweapon_shared.cpp b/sp/src/game/shared/hl2/basehlcombatweapon_shared.cpp
index 55dc0a05..8d64f4a5 100644
--- a/sp/src/game/shared/hl2/basehlcombatweapon_shared.cpp
+++ b/sp/src/game/shared/hl2/basehlcombatweapon_shared.cpp
@@ -1,431 +1,431 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//=============================================================================//
-
-#include "cbase.h"
-#include "basehlcombatweapon_shared.h"
-
-#include "hl2_player_shared.h"
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include "tier0/memdbgon.h"
-
-LINK_ENTITY_TO_CLASS( basehlcombatweapon, CBaseHLCombatWeapon );
-
-IMPLEMENT_NETWORKCLASS_ALIASED( BaseHLCombatWeapon , DT_BaseHLCombatWeapon )
-
-BEGIN_NETWORK_TABLE( CBaseHLCombatWeapon , DT_BaseHLCombatWeapon )
-#if !defined( CLIENT_DLL )
-// SendPropInt( SENDINFO( m_bReflectViewModelAnimations ), 1, SPROP_UNSIGNED ),
-#else
-// RecvPropInt( RECVINFO( m_bReflectViewModelAnimations ) ),
-#endif
-END_NETWORK_TABLE()
-
-
-#if !defined( CLIENT_DLL )
-
-#include "globalstate.h"
-
-//---------------------------------------------------------
-// Save/Restore
-//---------------------------------------------------------
-BEGIN_DATADESC( CBaseHLCombatWeapon )
-
- DEFINE_FIELD( m_bLowered, FIELD_BOOLEAN ),
- DEFINE_FIELD( m_flRaiseTime, FIELD_TIME ),
- DEFINE_FIELD( m_flHolsterTime, FIELD_TIME ),
- DEFINE_FIELD( m_iPrimaryAttacks, FIELD_INTEGER ),
- DEFINE_FIELD( m_iSecondaryAttacks, FIELD_INTEGER ),
-
-END_DATADESC()
-
-#endif
-
-BEGIN_PREDICTION_DATA( CBaseHLCombatWeapon )
-END_PREDICTION_DATA()
-
-ConVar sk_auto_reload_time( "sk_auto_reload_time", "3", FCVAR_REPLICATED );
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-void CBaseHLCombatWeapon::ItemHolsterFrame( void )
-{
- BaseClass::ItemHolsterFrame();
-
- // Must be player held
- if ( GetOwner() && GetOwner()->IsPlayer() == false )
- return;
-
- // We can't be active
- if ( GetOwner()->GetActiveWeapon() == this )
- return;
-
- // If it's been longer than three seconds, reload
- if ( ( gpGlobals->curtime - m_flHolsterTime ) > sk_auto_reload_time.GetFloat() )
- {
- // Just load the clip with no animations
- FinishReload();
- m_flHolsterTime = gpGlobals->curtime;
- }
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-bool CBaseHLCombatWeapon::CanLower()
-{
- if ( SelectWeightedSequence( ACT_VM_IDLE_LOWERED ) == ACTIVITY_NOT_AVAILABLE )
- return false;
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Drops the weapon into a lowered pose
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-bool CBaseHLCombatWeapon::Lower( void )
-{
- //Don't bother if we don't have the animation
- if ( SelectWeightedSequence( ACT_VM_IDLE_LOWERED ) == ACTIVITY_NOT_AVAILABLE )
- return false;
-
- m_bLowered = true;
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Brings the weapon up to the ready position
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-bool CBaseHLCombatWeapon::Ready( void )
-{
- //Don't bother if we don't have the animation
- if ( SelectWeightedSequence( ACT_VM_LOWERED_TO_IDLE ) == ACTIVITY_NOT_AVAILABLE )
- return false;
-
- m_bLowered = false;
- m_flRaiseTime = gpGlobals->curtime + 0.5f;
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-bool CBaseHLCombatWeapon::Deploy( void )
-{
- // If we should be lowered, deploy in the lowered position
- // We have to ask the player if the last time it checked, the weapon was lowered
- if ( GetOwner() && GetOwner()->IsPlayer() )
- {
- CHL2_Player *pPlayer = assert_cast<CHL2_Player*>( GetOwner() );
- if ( pPlayer->IsWeaponLowered() )
- {
- if ( SelectWeightedSequence( ACT_VM_IDLE_LOWERED ) != ACTIVITY_NOT_AVAILABLE )
- {
- if ( DefaultDeploy( (char*)GetViewModel(), (char*)GetWorldModel(), ACT_VM_IDLE_LOWERED, (char*)GetAnimPrefix() ) )
- {
- m_bLowered = true;
-
- // Stomp the next attack time to fix the fact that the lower idles are long
- pPlayer->SetNextAttack( gpGlobals->curtime + 1.0 );
- m_flNextPrimaryAttack = gpGlobals->curtime + 1.0;
- m_flNextSecondaryAttack = gpGlobals->curtime + 1.0;
- return true;
- }
- }
- }
- }
-
- m_bLowered = false;
- return BaseClass::Deploy();
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-bool CBaseHLCombatWeapon::Holster( CBaseCombatWeapon *pSwitchingTo )
-{
- if ( BaseClass::Holster( pSwitchingTo ) )
- {
- m_flHolsterTime = gpGlobals->curtime;
- return true;
- }
-
- return false;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-bool CBaseHLCombatWeapon::WeaponShouldBeLowered( void )
-{
- // Can't be in the middle of another animation
- if ( GetIdealActivity() != ACT_VM_IDLE_LOWERED && GetIdealActivity() != ACT_VM_IDLE &&
- GetIdealActivity() != ACT_VM_IDLE_TO_LOWERED && GetIdealActivity() != ACT_VM_LOWERED_TO_IDLE )
- return false;
-
- if ( m_bLowered )
- return true;
-
-#if !defined( CLIENT_DLL )
-
- if ( GlobalEntity_GetState( "friendly_encounter" ) == GLOBAL_ON )
- return true;
-
-#endif
-
- return false;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Allows the weapon to choose proper weapon idle animation
-//-----------------------------------------------------------------------------
-void CBaseHLCombatWeapon::WeaponIdle( void )
-{
- //See if we should idle high or low
- if ( WeaponShouldBeLowered() )
- {
-#if !defined( CLIENT_DLL )
- CHL2_Player *pPlayer = dynamic_cast<CHL2_Player*>(GetOwner());
-
- if( pPlayer )
- {
- pPlayer->Weapon_Lower();
- }
-#endif
-
- // Move to lowered position if we're not there yet
- if ( GetActivity() != ACT_VM_IDLE_LOWERED && GetActivity() != ACT_VM_IDLE_TO_LOWERED
- && GetActivity() != ACT_TRANSITION )
- {
- SendWeaponAnim( ACT_VM_IDLE_LOWERED );
- }
- else if ( HasWeaponIdleTimeElapsed() )
- {
- // Keep idling low
- SendWeaponAnim( ACT_VM_IDLE_LOWERED );
- }
- }
- else
- {
- // See if we need to raise immediately
- if ( m_flRaiseTime < gpGlobals->curtime && GetActivity() == ACT_VM_IDLE_LOWERED )
- {
- SendWeaponAnim( ACT_VM_IDLE );
- }
- else if ( HasWeaponIdleTimeElapsed() )
- {
- SendWeaponAnim( ACT_VM_IDLE );
- }
- }
-}
-
-float g_lateralBob;
-float g_verticalBob;
-
-#if defined( CLIENT_DLL ) && ( !defined( HL2MP ) && !defined( PORTAL ) )
-
-#define HL2_BOB_CYCLE_MIN 1.0f
-#define HL2_BOB_CYCLE_MAX 0.45f
-#define HL2_BOB 0.002f
-#define HL2_BOB_UP 0.5f
-
-
-static ConVar cl_bobcycle( "cl_bobcycle","0.8" );
-static ConVar cl_bob( "cl_bob","0.002" );
-static ConVar cl_bobup( "cl_bobup","0.5" );
-
-// Register these cvars if needed for easy tweaking
-static ConVar v_iyaw_cycle( "v_iyaw_cycle", "2"/*, FCVAR_UNREGISTERED*/ );
-static ConVar v_iroll_cycle( "v_iroll_cycle", "0.5"/*, FCVAR_UNREGISTERED*/ );
-static ConVar v_ipitch_cycle( "v_ipitch_cycle", "1"/*, FCVAR_UNREGISTERED*/ );
-static ConVar v_iyaw_level( "v_iyaw_level", "0.3"/*, FCVAR_UNREGISTERED*/ );
-static ConVar v_iroll_level( "v_iroll_level", "0.1"/*, FCVAR_UNREGISTERED*/ );
-static ConVar v_ipitch_level( "v_ipitch_level", "0.3"/*, FCVAR_UNREGISTERED*/ );
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : float
-//-----------------------------------------------------------------------------
-float CBaseHLCombatWeapon::CalcViewmodelBob( void )
-{
- static float bobtime;
- static float lastbobtime;
- float cycle;
-
- CBasePlayer *player = ToBasePlayer( GetOwner() );
- //Assert( player );
-
- //NOTENOTE: For now, let this cycle continue when in the air, because it snaps badly without it
-
- if ( ( !gpGlobals->frametime ) || ( player == NULL ) )
- {
- //NOTENOTE: We don't use this return value in our case (need to restructure the calculation function setup!)
- return 0.0f;// just use old value
- }
-
- //Find the speed of the player
- float speed = player->GetLocalVelocity().Length2D();
-
- //FIXME: This maximum speed value must come from the server.
- // MaxSpeed() is not sufficient for dealing with sprinting - jdw
-
- speed = clamp( speed, -320, 320 );
-
- float bob_offset = RemapVal( speed, 0, 320, 0.0f, 1.0f );
-
- bobtime += ( gpGlobals->curtime - lastbobtime ) * bob_offset;
- lastbobtime = gpGlobals->curtime;
-
- //Calculate the vertical bob
- cycle = bobtime - (int)(bobtime/HL2_BOB_CYCLE_MAX)*HL2_BOB_CYCLE_MAX;
- cycle /= HL2_BOB_CYCLE_MAX;
-
- if ( cycle < HL2_BOB_UP )
- {
- cycle = M_PI * cycle / HL2_BOB_UP;
- }
- else
- {
- cycle = M_PI + M_PI*(cycle-HL2_BOB_UP)/(1.0 - HL2_BOB_UP);
- }
-
- g_verticalBob = speed*0.005f;
- g_verticalBob = g_verticalBob*0.3 + g_verticalBob*0.7*sin(cycle);
-
- g_verticalBob = clamp( g_verticalBob, -7.0f, 4.0f );
-
- //Calculate the lateral bob
- cycle = bobtime - (int)(bobtime/HL2_BOB_CYCLE_MAX*2)*HL2_BOB_CYCLE_MAX*2;
- cycle /= HL2_BOB_CYCLE_MAX*2;
-
- if ( cycle < HL2_BOB_UP )
- {
- cycle = M_PI * cycle / HL2_BOB_UP;
- }
- else
- {
- cycle = M_PI + M_PI*(cycle-HL2_BOB_UP)/(1.0 - HL2_BOB_UP);
- }
-
- g_lateralBob = speed*0.005f;
- g_lateralBob = g_lateralBob*0.3 + g_lateralBob*0.7*sin(cycle);
- g_lateralBob = clamp( g_lateralBob, -7.0f, 4.0f );
-
- //NOTENOTE: We don't use this return value in our case (need to restructure the calculation function setup!)
- return 0.0f;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : &origin -
-// &angles -
-// viewmodelindex -
-//-----------------------------------------------------------------------------
-void CBaseHLCombatWeapon::AddViewmodelBob( CBaseViewModel *viewmodel, Vector &origin, QAngle &angles )
-{
- Vector forward, right;
- AngleVectors( angles, &forward, &right, NULL );
-
- CalcViewmodelBob();
-
- // Apply bob, but scaled down to 40%
- VectorMA( origin, g_verticalBob * 0.1f, forward, origin );
-
- // Z bob a bit more
- origin[2] += g_verticalBob * 0.1f;
-
- // bob the angles
- angles[ ROLL ] += g_verticalBob * 0.5f;
- angles[ PITCH ] -= g_verticalBob * 0.4f;
-
- angles[ YAW ] -= g_lateralBob * 0.3f;
-
- VectorMA( origin, g_lateralBob * 0.8f, right, origin );
-}
-
-//-----------------------------------------------------------------------------
-Vector CBaseHLCombatWeapon::GetBulletSpread( WeaponProficiency_t proficiency )
-{
- return BaseClass::GetBulletSpread( proficiency );
-}
-
-//-----------------------------------------------------------------------------
-float CBaseHLCombatWeapon::GetSpreadBias( WeaponProficiency_t proficiency )
-{
- return BaseClass::GetSpreadBias( proficiency );
-}
-//-----------------------------------------------------------------------------
-
-const WeaponProficiencyInfo_t *CBaseHLCombatWeapon::GetProficiencyValues()
-{
- return NULL;
-}
-
-#else
-
-// Server stubs
-float CBaseHLCombatWeapon::CalcViewmodelBob( void )
-{
- return 0.0f;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : &origin -
-// &angles -
-// viewmodelindex -
-//-----------------------------------------------------------------------------
-void CBaseHLCombatWeapon::AddViewmodelBob( CBaseViewModel *viewmodel, Vector &origin, QAngle &angles )
-{
-}
-
-
-//-----------------------------------------------------------------------------
-Vector CBaseHLCombatWeapon::GetBulletSpread( WeaponProficiency_t proficiency )
-{
- Vector baseSpread = BaseClass::GetBulletSpread( proficiency );
-
- const WeaponProficiencyInfo_t *pProficiencyValues = GetProficiencyValues();
- float flModifier = (pProficiencyValues)[ proficiency ].spreadscale;
- return ( baseSpread * flModifier );
-}
-
-//-----------------------------------------------------------------------------
-float CBaseHLCombatWeapon::GetSpreadBias( WeaponProficiency_t proficiency )
-{
- const WeaponProficiencyInfo_t *pProficiencyValues = GetProficiencyValues();
- return (pProficiencyValues)[ proficiency ].bias;
-}
-
-//-----------------------------------------------------------------------------
-const WeaponProficiencyInfo_t *CBaseHLCombatWeapon::GetProficiencyValues()
-{
- return GetDefaultProficiencyValues();
-}
-
-//-----------------------------------------------------------------------------
-const WeaponProficiencyInfo_t *CBaseHLCombatWeapon::GetDefaultProficiencyValues()
-{
- // Weapon proficiency table. Keep this in sync with WeaponProficiency_t enum in the header!!
- static WeaponProficiencyInfo_t g_BaseWeaponProficiencyTable[] =
- {
- { 2.50, 1.0 },
- { 2.00, 1.0 },
- { 1.50, 1.0 },
- { 1.25, 1.0 },
- { 1.00, 1.0 },
- };
-
- COMPILE_TIME_ASSERT( ARRAYSIZE(g_BaseWeaponProficiencyTable) == WEAPON_PROFICIENCY_PERFECT + 1);
-
- return g_BaseWeaponProficiencyTable;
-}
-
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "basehlcombatweapon_shared.h"
+
+#include "hl2_player_shared.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+LINK_ENTITY_TO_CLASS( basehlcombatweapon, CBaseHLCombatWeapon );
+
+IMPLEMENT_NETWORKCLASS_ALIASED( BaseHLCombatWeapon , DT_BaseHLCombatWeapon )
+
+BEGIN_NETWORK_TABLE( CBaseHLCombatWeapon , DT_BaseHLCombatWeapon )
+#if !defined( CLIENT_DLL )
+// SendPropInt( SENDINFO( m_bReflectViewModelAnimations ), 1, SPROP_UNSIGNED ),
+#else
+// RecvPropInt( RECVINFO( m_bReflectViewModelAnimations ) ),
+#endif
+END_NETWORK_TABLE()
+
+
+#if !defined( CLIENT_DLL )
+
+#include "globalstate.h"
+
+//---------------------------------------------------------
+// Save/Restore
+//---------------------------------------------------------
+BEGIN_DATADESC( CBaseHLCombatWeapon )
+
+ DEFINE_FIELD( m_bLowered, FIELD_BOOLEAN ),
+ DEFINE_FIELD( m_flRaiseTime, FIELD_TIME ),
+ DEFINE_FIELD( m_flHolsterTime, FIELD_TIME ),
+ DEFINE_FIELD( m_iPrimaryAttacks, FIELD_INTEGER ),
+ DEFINE_FIELD( m_iSecondaryAttacks, FIELD_INTEGER ),
+
+END_DATADESC()
+
+#endif
+
+BEGIN_PREDICTION_DATA( CBaseHLCombatWeapon )
+END_PREDICTION_DATA()
+
+ConVar sk_auto_reload_time( "sk_auto_reload_time", "3", FCVAR_REPLICATED );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBaseHLCombatWeapon::ItemHolsterFrame( void )
+{
+ BaseClass::ItemHolsterFrame();
+
+ // Must be player held
+ if ( GetOwner() && GetOwner()->IsPlayer() == false )
+ return;
+
+ // We can't be active
+ if ( GetOwner()->GetActiveWeapon() == this )
+ return;
+
+ // If it's been longer than three seconds, reload
+ if ( ( gpGlobals->curtime - m_flHolsterTime ) > sk_auto_reload_time.GetFloat() )
+ {
+ // Just load the clip with no animations
+ FinishReload();
+ m_flHolsterTime = gpGlobals->curtime;
+ }
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+bool CBaseHLCombatWeapon::CanLower()
+{
+ if ( SelectWeightedSequence( ACT_VM_IDLE_LOWERED ) == ACTIVITY_NOT_AVAILABLE )
+ return false;
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Drops the weapon into a lowered pose
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseHLCombatWeapon::Lower( void )
+{
+ //Don't bother if we don't have the animation
+ if ( SelectWeightedSequence( ACT_VM_IDLE_LOWERED ) == ACTIVITY_NOT_AVAILABLE )
+ return false;
+
+ m_bLowered = true;
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Brings the weapon up to the ready position
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseHLCombatWeapon::Ready( void )
+{
+ //Don't bother if we don't have the animation
+ if ( SelectWeightedSequence( ACT_VM_LOWERED_TO_IDLE ) == ACTIVITY_NOT_AVAILABLE )
+ return false;
+
+ m_bLowered = false;
+ m_flRaiseTime = gpGlobals->curtime + 0.5f;
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseHLCombatWeapon::Deploy( void )
+{
+ // If we should be lowered, deploy in the lowered position
+ // We have to ask the player if the last time it checked, the weapon was lowered
+ if ( GetOwner() && GetOwner()->IsPlayer() )
+ {
+ CHL2_Player *pPlayer = assert_cast<CHL2_Player*>( GetOwner() );
+ if ( pPlayer->IsWeaponLowered() )
+ {
+ if ( SelectWeightedSequence( ACT_VM_IDLE_LOWERED ) != ACTIVITY_NOT_AVAILABLE )
+ {
+ if ( DefaultDeploy( (char*)GetViewModel(), (char*)GetWorldModel(), ACT_VM_IDLE_LOWERED, (char*)GetAnimPrefix() ) )
+ {
+ m_bLowered = true;
+
+ // Stomp the next attack time to fix the fact that the lower idles are long
+ pPlayer->SetNextAttack( gpGlobals->curtime + 1.0 );
+ m_flNextPrimaryAttack = gpGlobals->curtime + 1.0;
+ m_flNextSecondaryAttack = gpGlobals->curtime + 1.0;
+ return true;
+ }
+ }
+ }
+ }
+
+ m_bLowered = false;
+ return BaseClass::Deploy();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseHLCombatWeapon::Holster( CBaseCombatWeapon *pSwitchingTo )
+{
+ if ( BaseClass::Holster( pSwitchingTo ) )
+ {
+ m_flHolsterTime = gpGlobals->curtime;
+ return true;
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CBaseHLCombatWeapon::WeaponShouldBeLowered( void )
+{
+ // Can't be in the middle of another animation
+ if ( GetIdealActivity() != ACT_VM_IDLE_LOWERED && GetIdealActivity() != ACT_VM_IDLE &&
+ GetIdealActivity() != ACT_VM_IDLE_TO_LOWERED && GetIdealActivity() != ACT_VM_LOWERED_TO_IDLE )
+ return false;
+
+ if ( m_bLowered )
+ return true;
+
+#if !defined( CLIENT_DLL )
+
+ if ( GlobalEntity_GetState( "friendly_encounter" ) == GLOBAL_ON )
+ return true;
+
+#endif
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Allows the weapon to choose proper weapon idle animation
+//-----------------------------------------------------------------------------
+void CBaseHLCombatWeapon::WeaponIdle( void )
+{
+ //See if we should idle high or low
+ if ( WeaponShouldBeLowered() )
+ {
+#if !defined( CLIENT_DLL )
+ CHL2_Player *pPlayer = dynamic_cast<CHL2_Player*>(GetOwner());
+
+ if( pPlayer )
+ {
+ pPlayer->Weapon_Lower();
+ }
+#endif
+
+ // Move to lowered position if we're not there yet
+ if ( GetActivity() != ACT_VM_IDLE_LOWERED && GetActivity() != ACT_VM_IDLE_TO_LOWERED
+ && GetActivity() != ACT_TRANSITION )
+ {
+ SendWeaponAnim( ACT_VM_IDLE_LOWERED );
+ }
+ else if ( HasWeaponIdleTimeElapsed() )
+ {
+ // Keep idling low
+ SendWeaponAnim( ACT_VM_IDLE_LOWERED );
+ }
+ }
+ else
+ {
+ // See if we need to raise immediately
+ if ( m_flRaiseTime < gpGlobals->curtime && GetActivity() == ACT_VM_IDLE_LOWERED )
+ {
+ SendWeaponAnim( ACT_VM_IDLE );
+ }
+ else if ( HasWeaponIdleTimeElapsed() )
+ {
+ SendWeaponAnim( ACT_VM_IDLE );
+ }
+ }
+}
+
+float g_lateralBob;
+float g_verticalBob;
+
+#if defined( CLIENT_DLL ) && ( !defined( HL2MP ) && !defined( PORTAL ) )
+
+#define HL2_BOB_CYCLE_MIN 1.0f
+#define HL2_BOB_CYCLE_MAX 0.45f
+#define HL2_BOB 0.002f
+#define HL2_BOB_UP 0.5f
+
+
+static ConVar cl_bobcycle( "cl_bobcycle","0.8" );
+static ConVar cl_bob( "cl_bob","0.002" );
+static ConVar cl_bobup( "cl_bobup","0.5" );
+
+// Register these cvars if needed for easy tweaking
+static ConVar v_iyaw_cycle( "v_iyaw_cycle", "2"/*, FCVAR_UNREGISTERED*/ );
+static ConVar v_iroll_cycle( "v_iroll_cycle", "0.5"/*, FCVAR_UNREGISTERED*/ );
+static ConVar v_ipitch_cycle( "v_ipitch_cycle", "1"/*, FCVAR_UNREGISTERED*/ );
+static ConVar v_iyaw_level( "v_iyaw_level", "0.3"/*, FCVAR_UNREGISTERED*/ );
+static ConVar v_iroll_level( "v_iroll_level", "0.1"/*, FCVAR_UNREGISTERED*/ );
+static ConVar v_ipitch_level( "v_ipitch_level", "0.3"/*, FCVAR_UNREGISTERED*/ );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : float
+//-----------------------------------------------------------------------------
+float CBaseHLCombatWeapon::CalcViewmodelBob( void )
+{
+ static float bobtime;
+ static float lastbobtime;
+ float cycle;
+
+ CBasePlayer *player = ToBasePlayer( GetOwner() );
+ //Assert( player );
+
+ //NOTENOTE: For now, let this cycle continue when in the air, because it snaps badly without it
+
+ if ( ( !gpGlobals->frametime ) || ( player == NULL ) )
+ {
+ //NOTENOTE: We don't use this return value in our case (need to restructure the calculation function setup!)
+ return 0.0f;// just use old value
+ }
+
+ //Find the speed of the player
+ float speed = player->GetLocalVelocity().Length2D();
+
+ //FIXME: This maximum speed value must come from the server.
+ // MaxSpeed() is not sufficient for dealing with sprinting - jdw
+
+ speed = clamp( speed, -320, 320 );
+
+ float bob_offset = RemapVal( speed, 0, 320, 0.0f, 1.0f );
+
+ bobtime += ( gpGlobals->curtime - lastbobtime ) * bob_offset;
+ lastbobtime = gpGlobals->curtime;
+
+ //Calculate the vertical bob
+ cycle = bobtime - (int)(bobtime/HL2_BOB_CYCLE_MAX)*HL2_BOB_CYCLE_MAX;
+ cycle /= HL2_BOB_CYCLE_MAX;
+
+ if ( cycle < HL2_BOB_UP )
+ {
+ cycle = M_PI * cycle / HL2_BOB_UP;
+ }
+ else
+ {
+ cycle = M_PI + M_PI*(cycle-HL2_BOB_UP)/(1.0 - HL2_BOB_UP);
+ }
+
+ g_verticalBob = speed*0.005f;
+ g_verticalBob = g_verticalBob*0.3 + g_verticalBob*0.7*sin(cycle);
+
+ g_verticalBob = clamp( g_verticalBob, -7.0f, 4.0f );
+
+ //Calculate the lateral bob
+ cycle = bobtime - (int)(bobtime/HL2_BOB_CYCLE_MAX*2)*HL2_BOB_CYCLE_MAX*2;
+ cycle /= HL2_BOB_CYCLE_MAX*2;
+
+ if ( cycle < HL2_BOB_UP )
+ {
+ cycle = M_PI * cycle / HL2_BOB_UP;
+ }
+ else
+ {
+ cycle = M_PI + M_PI*(cycle-HL2_BOB_UP)/(1.0 - HL2_BOB_UP);
+ }
+
+ g_lateralBob = speed*0.005f;
+ g_lateralBob = g_lateralBob*0.3 + g_lateralBob*0.7*sin(cycle);
+ g_lateralBob = clamp( g_lateralBob, -7.0f, 4.0f );
+
+ //NOTENOTE: We don't use this return value in our case (need to restructure the calculation function setup!)
+ return 0.0f;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : &origin -
+// &angles -
+// viewmodelindex -
+//-----------------------------------------------------------------------------
+void CBaseHLCombatWeapon::AddViewmodelBob( CBaseViewModel *viewmodel, Vector &origin, QAngle &angles )
+{
+ Vector forward, right;
+ AngleVectors( angles, &forward, &right, NULL );
+
+ CalcViewmodelBob();
+
+ // Apply bob, but scaled down to 40%
+ VectorMA( origin, g_verticalBob * 0.1f, forward, origin );
+
+ // Z bob a bit more
+ origin[2] += g_verticalBob * 0.1f;
+
+ // bob the angles
+ angles[ ROLL ] += g_verticalBob * 0.5f;
+ angles[ PITCH ] -= g_verticalBob * 0.4f;
+
+ angles[ YAW ] -= g_lateralBob * 0.3f;
+
+ VectorMA( origin, g_lateralBob * 0.8f, right, origin );
+}
+
+//-----------------------------------------------------------------------------
+Vector CBaseHLCombatWeapon::GetBulletSpread( WeaponProficiency_t proficiency )
+{
+ return BaseClass::GetBulletSpread( proficiency );
+}
+
+//-----------------------------------------------------------------------------
+float CBaseHLCombatWeapon::GetSpreadBias( WeaponProficiency_t proficiency )
+{
+ return BaseClass::GetSpreadBias( proficiency );
+}
+//-----------------------------------------------------------------------------
+
+const WeaponProficiencyInfo_t *CBaseHLCombatWeapon::GetProficiencyValues()
+{
+ return NULL;
+}
+
+#else
+
+// Server stubs
+float CBaseHLCombatWeapon::CalcViewmodelBob( void )
+{
+ return 0.0f;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : &origin -
+// &angles -
+// viewmodelindex -
+//-----------------------------------------------------------------------------
+void CBaseHLCombatWeapon::AddViewmodelBob( CBaseViewModel *viewmodel, Vector &origin, QAngle &angles )
+{
+}
+
+
+//-----------------------------------------------------------------------------
+Vector CBaseHLCombatWeapon::GetBulletSpread( WeaponProficiency_t proficiency )
+{
+ Vector baseSpread = BaseClass::GetBulletSpread( proficiency );
+
+ const WeaponProficiencyInfo_t *pProficiencyValues = GetProficiencyValues();
+ float flModifier = (pProficiencyValues)[ proficiency ].spreadscale;
+ return ( baseSpread * flModifier );
+}
+
+//-----------------------------------------------------------------------------
+float CBaseHLCombatWeapon::GetSpreadBias( WeaponProficiency_t proficiency )
+{
+ const WeaponProficiencyInfo_t *pProficiencyValues = GetProficiencyValues();
+ return (pProficiencyValues)[ proficiency ].bias;
+}
+
+//-----------------------------------------------------------------------------
+const WeaponProficiencyInfo_t *CBaseHLCombatWeapon::GetProficiencyValues()
+{
+ return GetDefaultProficiencyValues();
+}
+
+//-----------------------------------------------------------------------------
+const WeaponProficiencyInfo_t *CBaseHLCombatWeapon::GetDefaultProficiencyValues()
+{
+ // Weapon proficiency table. Keep this in sync with WeaponProficiency_t enum in the header!!
+ static WeaponProficiencyInfo_t g_BaseWeaponProficiencyTable[] =
+ {
+ { 2.50, 1.0 },
+ { 2.00, 1.0 },
+ { 1.50, 1.0 },
+ { 1.25, 1.0 },
+ { 1.00, 1.0 },
+ };
+
+ COMPILE_TIME_ASSERT( ARRAYSIZE(g_BaseWeaponProficiencyTable) == WEAPON_PROFICIENCY_PERFECT + 1);
+
+ return g_BaseWeaponProficiencyTable;
+}
+
#endif \ No newline at end of file
diff --git a/sp/src/game/shared/hl2/basehlcombatweapon_shared.h b/sp/src/game/shared/hl2/basehlcombatweapon_shared.h
index e7c65a01..eb11fa80 100644
--- a/sp/src/game/shared/hl2/basehlcombatweapon_shared.h
+++ b/sp/src/game/shared/hl2/basehlcombatweapon_shared.h
@@ -1,66 +1,66 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//=============================================================================//
-
-#include "basecombatweapon_shared.h"
-
-#ifndef BASEHLCOMBATWEAPON_SHARED_H
-#define BASEHLCOMBATWEAPON_SHARED_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-#if defined( CLIENT_DLL )
-#define CBaseHLCombatWeapon C_BaseHLCombatWeapon
-#endif
-
-class CBaseHLCombatWeapon : public CBaseCombatWeapon
-{
-#if !defined( CLIENT_DLL )
-#ifndef _XBOX
- DECLARE_DATADESC();
-#else
-protected:
- DECLARE_DATADESC();
-private:
-#endif
-#endif
-
- DECLARE_CLASS( CBaseHLCombatWeapon, CBaseCombatWeapon );
-public:
- DECLARE_NETWORKCLASS();
- DECLARE_PREDICTABLE();
-
- virtual bool WeaponShouldBeLowered( void );
-
- bool CanLower();
- virtual bool Ready( void );
- virtual bool Lower( void );
- virtual bool Deploy( void );
- virtual bool Holster( CBaseCombatWeapon *pSwitchingTo );
- virtual void WeaponIdle( void );
-
- virtual void AddViewmodelBob( CBaseViewModel *viewmodel, Vector &origin, QAngle &angles );
- virtual float CalcViewmodelBob( void );
-
- virtual Vector GetBulletSpread( WeaponProficiency_t proficiency );
- virtual float GetSpreadBias( WeaponProficiency_t proficiency );
-
- virtual const WeaponProficiencyInfo_t *GetProficiencyValues();
- static const WeaponProficiencyInfo_t *GetDefaultProficiencyValues();
-
- virtual void ItemHolsterFrame( void );
-
- int m_iPrimaryAttacks; // # of primary attacks performed with this weapon
- int m_iSecondaryAttacks; // # of secondary attacks performed with this weapon
-
-protected:
-
- bool m_bLowered; // Whether the viewmodel is raised or lowered
- float m_flRaiseTime; // If lowered, the time we should raise the viewmodel
- float m_flHolsterTime; // When the weapon was holstered
-};
-
-#endif // BASEHLCOMBATWEAPON_SHARED_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "basecombatweapon_shared.h"
+
+#ifndef BASEHLCOMBATWEAPON_SHARED_H
+#define BASEHLCOMBATWEAPON_SHARED_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#if defined( CLIENT_DLL )
+#define CBaseHLCombatWeapon C_BaseHLCombatWeapon
+#endif
+
+class CBaseHLCombatWeapon : public CBaseCombatWeapon
+{
+#if !defined( CLIENT_DLL )
+#ifndef _XBOX
+ DECLARE_DATADESC();
+#else
+protected:
+ DECLARE_DATADESC();
+private:
+#endif
+#endif
+
+ DECLARE_CLASS( CBaseHLCombatWeapon, CBaseCombatWeapon );
+public:
+ DECLARE_NETWORKCLASS();
+ DECLARE_PREDICTABLE();
+
+ virtual bool WeaponShouldBeLowered( void );
+
+ bool CanLower();
+ virtual bool Ready( void );
+ virtual bool Lower( void );
+ virtual bool Deploy( void );
+ virtual bool Holster( CBaseCombatWeapon *pSwitchingTo );
+ virtual void WeaponIdle( void );
+
+ virtual void AddViewmodelBob( CBaseViewModel *viewmodel, Vector &origin, QAngle &angles );
+ virtual float CalcViewmodelBob( void );
+
+ virtual Vector GetBulletSpread( WeaponProficiency_t proficiency );
+ virtual float GetSpreadBias( WeaponProficiency_t proficiency );
+
+ virtual const WeaponProficiencyInfo_t *GetProficiencyValues();
+ static const WeaponProficiencyInfo_t *GetDefaultProficiencyValues();
+
+ virtual void ItemHolsterFrame( void );
+
+ int m_iPrimaryAttacks; // # of primary attacks performed with this weapon
+ int m_iSecondaryAttacks; // # of secondary attacks performed with this weapon
+
+protected:
+
+ bool m_bLowered; // Whether the viewmodel is raised or lowered
+ float m_flRaiseTime; // If lowered, the time we should raise the viewmodel
+ float m_flHolsterTime; // When the weapon was holstered
+};
+
+#endif // BASEHLCOMBATWEAPON_SHARED_H
diff --git a/sp/src/game/shared/hl2/citadel_effects_shared.h b/sp/src/game/shared/hl2/citadel_effects_shared.h
index 8fc42282..18304d3a 100644
--- a/sp/src/game/shared/hl2/citadel_effects_shared.h
+++ b/sp/src/game/shared/hl2/citadel_effects_shared.h
@@ -1,62 +1,62 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//=============================================================================//
-
-#ifndef CITADEL_EFFECTS_SHARED_H
-#define CITADEL_EFFECTS_SHARED_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-#define SF_ENERGYCORE_NO_PARTICLES (1<<0)
-#define SF_ENERGYCORE_START_ON (1<<1)
-
-enum
-{
- ENERGYCORE_STATE_OFF,
- ENERGYCORE_STATE_CHARGING,
- ENERGYCORE_STATE_DISCHARGING,
-};
-
-#ifndef CLIENT_DLL
-
-// ============================================================================
-//
-// Energy core - charges up and then releases energy from its position
-//
-// ============================================================================
-
-class CCitadelEnergyCore : public CBaseEntity
-{
- DECLARE_CLASS( CCitadelEnergyCore, CBaseEntity );
- DECLARE_SERVERCLASS();
- DECLARE_DATADESC();
-
-public:
- void InputStartCharge( inputdata_t &inputdata );
- void InputStartDischarge( inputdata_t &inputdata );
- void InputStop( inputdata_t &inputdata );
- void SetScale( float flScale ) { m_flScale = flScale; }
-
- void StartCharge( float flWarmUpTime );
- void StartDischarge();
- void StopDischarge( float flCoolDownTime );
-
- virtual int ShouldTransmit( const CCheckTransmitInfo *pInfo );
- virtual int UpdateTransmitState( void );
-
- virtual void Precache();
- void Spawn( void );
-
-private:
- CNetworkVar( float, m_flScale );
- CNetworkVar( int, m_nState );
- CNetworkVar( float, m_flDuration );
- CNetworkVar( float, m_flStartTime );
-};
-
-#endif
-
-#endif // CITADEL_EFFECTS_SHARED_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#ifndef CITADEL_EFFECTS_SHARED_H
+#define CITADEL_EFFECTS_SHARED_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#define SF_ENERGYCORE_NO_PARTICLES (1<<0)
+#define SF_ENERGYCORE_START_ON (1<<1)
+
+enum
+{
+ ENERGYCORE_STATE_OFF,
+ ENERGYCORE_STATE_CHARGING,
+ ENERGYCORE_STATE_DISCHARGING,
+};
+
+#ifndef CLIENT_DLL
+
+// ============================================================================
+//
+// Energy core - charges up and then releases energy from its position
+//
+// ============================================================================
+
+class CCitadelEnergyCore : public CBaseEntity
+{
+ DECLARE_CLASS( CCitadelEnergyCore, CBaseEntity );
+ DECLARE_SERVERCLASS();
+ DECLARE_DATADESC();
+
+public:
+ void InputStartCharge( inputdata_t &inputdata );
+ void InputStartDischarge( inputdata_t &inputdata );
+ void InputStop( inputdata_t &inputdata );
+ void SetScale( float flScale ) { m_flScale = flScale; }
+
+ void StartCharge( float flWarmUpTime );
+ void StartDischarge();
+ void StopDischarge( float flCoolDownTime );
+
+ virtual int ShouldTransmit( const CCheckTransmitInfo *pInfo );
+ virtual int UpdateTransmitState( void );
+
+ virtual void Precache();
+ void Spawn( void );
+
+private:
+ CNetworkVar( float, m_flScale );
+ CNetworkVar( int, m_nState );
+ CNetworkVar( float, m_flDuration );
+ CNetworkVar( float, m_flStartTime );
+};
+
+#endif
+
+#endif // CITADEL_EFFECTS_SHARED_H
diff --git a/sp/src/game/shared/hl2/env_alyxemp_shared.h b/sp/src/game/shared/hl2/env_alyxemp_shared.h
index d0095294..b6de643b 100644
--- a/sp/src/game/shared/hl2/env_alyxemp_shared.h
+++ b/sp/src/game/shared/hl2/env_alyxemp_shared.h
@@ -1,63 +1,63 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//=============================================================================//
-
-#ifndef ENV_ALYXEMP_SHARED_H
-#define ENV_ALYXEMP_SHARED_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-#include "beam_shared.h"
-
-enum
-{
- ALYXEMP_STATE_OFF,
- ALYXEMP_STATE_CHARGING,
- ALYXEMP_STATE_DISCHARGING,
-};
-
-class CAlyxEmpEffect : public CBaseEntity
-{
- DECLARE_CLASS( CAlyxEmpEffect, CBaseEntity );
- DECLARE_SERVERCLASS();
- DECLARE_DATADESC();
-
-public:
-
- void InputStartCharge( inputdata_t &inputdata );
- void InputStartDischarge( inputdata_t &inputdata );
- void InputStop( inputdata_t &inputdata );
- void InputSetTargetEnt( inputdata_t &inputdata );
-
- void StartCharge( float flDuration );
- void StartDischarge();
- void Stop( float flDuration );
- void SetTargetEntity( CBaseEntity *pTarget );
-
- void ActivateAutomatic( CBaseEntity *pAlyx, CBaseEntity *pTarget );
- void AutomaticThink();
-
- void Spawn( void );
- void Precache( void );
- void Activate( void );
-
-private:
-
- void SetTargetEntity( const char *szEntityName );
- CHandle<CBeam> m_hBeam;
- CHandle<CBaseEntity> m_hTargetEnt;
- string_t m_strTargetName;
- int m_nType; // What type of effect this is (small, large)
- int m_iState;
- bool m_bAutomated;
-
- CNetworkVar( int, m_nState );
- CNetworkVar( float, m_flDuration );
- CNetworkVar( float, m_flStartTime );
-};
-
-
-#endif // ENV_ALYXEMP_SHARED_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#ifndef ENV_ALYXEMP_SHARED_H
+#define ENV_ALYXEMP_SHARED_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "beam_shared.h"
+
+enum
+{
+ ALYXEMP_STATE_OFF,
+ ALYXEMP_STATE_CHARGING,
+ ALYXEMP_STATE_DISCHARGING,
+};
+
+class CAlyxEmpEffect : public CBaseEntity
+{
+ DECLARE_CLASS( CAlyxEmpEffect, CBaseEntity );
+ DECLARE_SERVERCLASS();
+ DECLARE_DATADESC();
+
+public:
+
+ void InputStartCharge( inputdata_t &inputdata );
+ void InputStartDischarge( inputdata_t &inputdata );
+ void InputStop( inputdata_t &inputdata );
+ void InputSetTargetEnt( inputdata_t &inputdata );
+
+ void StartCharge( float flDuration );
+ void StartDischarge();
+ void Stop( float flDuration );
+ void SetTargetEntity( CBaseEntity *pTarget );
+
+ void ActivateAutomatic( CBaseEntity *pAlyx, CBaseEntity *pTarget );
+ void AutomaticThink();
+
+ void Spawn( void );
+ void Precache( void );
+ void Activate( void );
+
+private:
+
+ void SetTargetEntity( const char *szEntityName );
+ CHandle<CBeam> m_hBeam;
+ CHandle<CBaseEntity> m_hTargetEnt;
+ string_t m_strTargetName;
+ int m_nType; // What type of effect this is (small, large)
+ int m_iState;
+ bool m_bAutomated;
+
+ CNetworkVar( int, m_nState );
+ CNetworkVar( float, m_flDuration );
+ CNetworkVar( float, m_flStartTime );
+};
+
+
+#endif // ENV_ALYXEMP_SHARED_H
diff --git a/sp/src/game/shared/hl2/env_headcrabcanister_shared.cpp b/sp/src/game/shared/hl2/env_headcrabcanister_shared.cpp
index 0286c011..036e39c2 100644
--- a/sp/src/game/shared/hl2/env_headcrabcanister_shared.cpp
+++ b/sp/src/game/shared/hl2/env_headcrabcanister_shared.cpp
@@ -1,393 +1,393 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//=============================================================================//
-#include "cbase.h"
-#include "env_headcrabcanister_shared.h"
-#include "mapdata_shared.h"
-#include "sharedInterface.h"
-#include "mathlib/vmatrix.h"
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include "tier0/memdbgon.h"
-
-#define ROTATION_SPEED 90.0f
-
-
-BEGIN_SIMPLE_DATADESC( CEnvHeadcrabCanisterShared )
- DEFINE_FIELD( m_vecStartPosition, FIELD_POSITION_VECTOR ),
- DEFINE_FIELD( m_vecEnterWorldPosition, FIELD_POSITION_VECTOR ),
- DEFINE_FIELD( m_vecDirection, FIELD_VECTOR ),
- DEFINE_FIELD( m_vecStartAngles, FIELD_VECTOR ),
- DEFINE_KEYFIELD( m_flLaunchHeight, FIELD_FLOAT, "StartingHeight" ),
- DEFINE_KEYFIELD( m_flFlightSpeed, FIELD_FLOAT, "FlightSpeed" ),
- DEFINE_KEYFIELD( m_flFlightTime, FIELD_FLOAT, "FlightTime" ),
- DEFINE_FIELD( m_flLaunchTime, FIELD_TIME ),
- DEFINE_FIELD( m_flWorldEnterTime, FIELD_FLOAT ),
- DEFINE_FIELD( m_flInitialZSpeed, FIELD_FLOAT ),
- DEFINE_FIELD( m_flZAcceleration, FIELD_FLOAT ),
- DEFINE_FIELD( m_flHorizSpeed, FIELD_FLOAT ),
- DEFINE_FIELD( m_bLaunchedFromWithinWorld, FIELD_BOOLEAN ),
- DEFINE_FIELD( m_vecSkyboxOrigin, FIELD_VECTOR ),
- DEFINE_FIELD( m_vecParabolaDirection, FIELD_VECTOR ),
- DEFINE_FIELD( m_flSkyboxScale, FIELD_FLOAT ),
- DEFINE_FIELD( m_bInSkybox, FIELD_BOOLEAN ),
-END_DATADESC()
-
-
-BEGIN_NETWORK_TABLE_NOBASE( CEnvHeadcrabCanisterShared, DT_EnvHeadcrabCanisterShared )
-
-#if !defined( CLIENT_DLL )
- SendPropFloat ( SENDINFO( m_flFlightSpeed ), 0, SPROP_NOSCALE ),
- SendPropTime ( SENDINFO( m_flLaunchTime ) ),
- SendPropVector ( SENDINFO( m_vecParabolaDirection ), 0, SPROP_NOSCALE ),
-
- SendPropFloat ( SENDINFO( m_flFlightTime ), 0, SPROP_NOSCALE ),
- SendPropFloat ( SENDINFO( m_flWorldEnterTime ), 0, SPROP_NOSCALE ),
-
- SendPropFloat ( SENDINFO( m_flInitialZSpeed ), 0, SPROP_NOSCALE ),
- SendPropFloat ( SENDINFO( m_flZAcceleration ), 0, SPROP_NOSCALE ),
- SendPropFloat ( SENDINFO( m_flHorizSpeed ), 0, SPROP_NOSCALE ),
- SendPropBool ( SENDINFO( m_bLaunchedFromWithinWorld ) ),
-
- SendPropVector ( SENDINFO( m_vecStartPosition ), 0, SPROP_NOSCALE ),
- SendPropVector ( SENDINFO( m_vecEnterWorldPosition ), 0, SPROP_NOSCALE ),
- SendPropVector ( SENDINFO( m_vecDirection ), 0, SPROP_NOSCALE ),
- SendPropVector ( SENDINFO( m_vecStartAngles ), 0, SPROP_NOSCALE ),
-
- SendPropVector ( SENDINFO( m_vecSkyboxOrigin ), 0, SPROP_NOSCALE ),
- SendPropFloat ( SENDINFO( m_flSkyboxScale ), 0, SPROP_NOSCALE ),
- SendPropBool ( SENDINFO( m_bInSkybox ) ),
-#else
- RecvPropFloat ( RECVINFO( m_flFlightSpeed ) ),
- RecvPropTime ( RECVINFO( m_flLaunchTime ) ),
- RecvPropVector ( RECVINFO( m_vecParabolaDirection ) ),
-
- RecvPropFloat ( RECVINFO( m_flFlightTime ) ),
- RecvPropFloat ( RECVINFO( m_flWorldEnterTime ) ),
-
- RecvPropFloat ( RECVINFO( m_flInitialZSpeed ) ),
- RecvPropFloat ( RECVINFO( m_flZAcceleration ) ),
- RecvPropFloat ( RECVINFO( m_flHorizSpeed ) ),
- RecvPropBool ( RECVINFO( m_bLaunchedFromWithinWorld ) ),
-
- RecvPropVector ( RECVINFO( m_vecStartPosition ) ),
- RecvPropVector ( RECVINFO( m_vecEnterWorldPosition ) ),
- RecvPropVector ( RECVINFO( m_vecDirection ) ),
- RecvPropVector ( RECVINFO( m_vecStartAngles ) ),
-
- RecvPropVector ( RECVINFO( m_vecSkyboxOrigin ) ),
- RecvPropFloat ( RECVINFO( m_flSkyboxScale ) ),
- RecvPropBool ( RECVINFO( m_bInSkybox ) ),
-#endif
-
-END_NETWORK_TABLE()
-
-
-
-//=============================================================================
-//
-// HeadcrabCanister Functions.
-//
-
-//-----------------------------------------------------------------------------
-// Constructor
-//-----------------------------------------------------------------------------
-CEnvHeadcrabCanisterShared::CEnvHeadcrabCanisterShared()
-{
- m_vecStartPosition.Init();
- m_vecDirection.Init();
- m_flFlightSpeed = 0.0f;
-
- // This tells the client DLL to not draw trails, etc.
- m_flLaunchTime = -1.0f;
-
- m_flWorldEnterTime = 0.0f;
- m_flFlightTime = 0.0f;
- m_bInSkybox = false;
-}
-
-
-//-----------------------------------------------------------------------------
-// Creates a headcrab canister in the world
-//-----------------------------------------------------------------------------
-void CEnvHeadcrabCanisterShared::InitInWorld( float flLaunchTime,
- const Vector &vecStartPosition, const QAngle &vecStartAngles,
- const Vector &vecDirection, const Vector &vecImpactPosition, bool bLaunchedFromWithinWorld )
-{
- Vector vecActualStartPosition = vecStartPosition;
- if ( !bLaunchedFromWithinWorld )
- {
- // Move the start position inward if it's too close
- Vector vecDelta;
- VectorSubtract( vecStartPosition, vecImpactPosition, vecDelta );
- VectorNormalize( vecDelta );
-
- VectorMA( vecImpactPosition, m_flFlightTime * m_flFlightSpeed, vecDelta, vecActualStartPosition );
- }
-
- // Setup initial parametric state.
- m_flLaunchTime = flLaunchTime;
- m_vecStartPosition = vecActualStartPosition;
- m_vecEnterWorldPosition = vecActualStartPosition;
- m_vecDirection = vecDirection;
- m_vecStartAngles = vecStartAngles;
- m_flWorldEnterTime = 0.0f;
- m_bInSkybox = false;
- m_bLaunchedFromWithinWorld = bLaunchedFromWithinWorld;
-
- if ( m_bLaunchedFromWithinWorld )
- {
- m_flSkyboxScale = 1;
- m_vecSkyboxOrigin = vec3_origin;
-
- float flLength = m_vecDirection.Get().AsVector2D().Length();
- VectorSubtract(vecImpactPosition, vecStartPosition, m_vecParabolaDirection.GetForModify());
- m_vecParabolaDirection.GetForModify().z = 0;
- float flTotalDistance = VectorNormalize( m_vecParabolaDirection.GetForModify() );
- m_vecDirection.GetForModify().x = flLength * m_vecParabolaDirection.Get().x;
- m_vecDirection.GetForModify().y = flLength * m_vecParabolaDirection.Get().y;
-
- m_flHorizSpeed = flTotalDistance / m_flFlightTime;
- m_flWorldEnterTime = 0;
-
- float flFinalZSpeed = m_vecDirection.Get().z * m_flHorizSpeed;
- m_flFlightSpeed = sqrt( m_flHorizSpeed * m_flHorizSpeed + flFinalZSpeed * flFinalZSpeed );
- m_flInitialZSpeed = (2.0f * ( vecImpactPosition.z - vecStartPosition.z ) - flFinalZSpeed * m_flFlightTime) / m_flFlightTime;
- m_flZAcceleration = (flFinalZSpeed - m_flInitialZSpeed) / m_flFlightTime;
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// Creates a headcrab canister in the skybox
-//-----------------------------------------------------------------------------
-void CEnvHeadcrabCanisterShared::InitInSkybox( float flLaunchTime,
- const Vector &vecStartPosition, const QAngle &vecStartAngles, const Vector &vecDirection,
- const Vector &vecImpactPosition, const Vector &vecSkyboxOrigin, float flSkyboxScale )
-{
- // Compute a horizontal speed (constant)
- m_vecParabolaDirection.Init( vecDirection.x, vecDirection.y, 0.0f );
- float flLength = VectorNormalize( m_vecParabolaDirection.GetForModify() );
- m_flHorizSpeed = flLength * m_flFlightSpeed;
-
- // compute total distance to travel
- float flTotalDistance = m_flFlightTime * m_flHorizSpeed;
- flTotalDistance -= vecStartPosition.AsVector2D().DistTo( vecImpactPosition.AsVector2D() );
- if ( flTotalDistance <= 0.0f )
- {
- InitInWorld( flLaunchTime, vecStartPosition, vecStartAngles, vecDirection, vecImpactPosition );
- return;
- }
-
- // Setup initial parametric state.
- m_flLaunchTime = flLaunchTime;
- m_flWorldEnterTime = flTotalDistance / m_flHorizSpeed;
- m_vecSkyboxOrigin = vecSkyboxOrigin;
- m_flSkyboxScale = flSkyboxScale;
-
- m_vecEnterWorldPosition = vecStartPosition;
- m_vecDirection = vecDirection;
- m_vecStartAngles = vecStartAngles;
- m_bInSkybox = true;
- m_bLaunchedFromWithinWorld = false;
-
- // Compute parabolic course
- // Assume the x velocity remains constant.
- // Z moves ballistically, as if under gravity
- // zf + lh = zo
- // vf = vo + a*t
- // zf = zo + vo*t + 0.5 * a * t*t
- // a*t = vf - vo
- // zf = zo + vo*t + 0.5f * (vf - vo) * t
- // zf - zo = 0.5f *vo*t + 0.5f * vf * t
- // -lh - 0.5f * vf * t = 0.5f * vo * t
- // vo = -2.0f * lh / t - vf
- // a = (vf - vo) / t
- m_flHorizSpeed /= flSkyboxScale;
-
- VectorMA( vecSkyboxOrigin, 1.0f / m_flSkyboxScale, vecStartPosition, m_vecStartPosition.GetForModify() );
- VectorMA( m_vecStartPosition.Get(), -m_flHorizSpeed * m_flWorldEnterTime, m_vecParabolaDirection, m_vecStartPosition.GetForModify() );
-
- float flLaunchHeight = m_flLaunchHeight / flSkyboxScale;
- float flFinalZSpeed = m_vecDirection.Get().z * m_flFlightSpeed / flSkyboxScale;
- m_vecStartPosition.GetForModify().z += flLaunchHeight;
- m_flZAcceleration = 2.0f * ( flLaunchHeight + flFinalZSpeed * m_flWorldEnterTime ) / ( m_flWorldEnterTime * m_flWorldEnterTime );
- m_flInitialZSpeed = flFinalZSpeed - m_flZAcceleration * m_flWorldEnterTime;
-}
-
-
-//-----------------------------------------------------------------------------
-// Convert from skybox to world
-//-----------------------------------------------------------------------------
-void CEnvHeadcrabCanisterShared::ConvertFromSkyboxToWorld()
-{
- Assert( m_bInSkybox );
- m_bInSkybox = false;
-}
-
-
-//-----------------------------------------------------------------------------
-// Returns the time at which it enters the world
-//-----------------------------------------------------------------------------
-float CEnvHeadcrabCanisterShared::GetEnterWorldTime() const
-{
- return m_flWorldEnterTime;
-}
-
-
-//-----------------------------------------------------------------------------
-// Did we impact?
-//-----------------------------------------------------------------------------
-bool CEnvHeadcrabCanisterShared::DidImpact( float flTime ) const
-{
- return (flTime - m_flLaunchTime) >= m_flFlightTime;
-}
-
-
-//-----------------------------------------------------------------------------
-// Computes the position of the canister
-//-----------------------------------------------------------------------------
-void CEnvHeadcrabCanisterShared::GetPositionAtTime( float flTime, Vector &vecPosition, QAngle &vecAngles )
-{
- float flDeltaTime = flTime - m_flLaunchTime;
- if ( flDeltaTime > m_flFlightTime )
- {
- flDeltaTime = m_flFlightTime;
- }
-
- VMatrix initToWorld;
- if ( m_bLaunchedFromWithinWorld || m_bInSkybox )
- {
- VectorMA( m_vecStartPosition, flDeltaTime * m_flHorizSpeed, m_vecParabolaDirection, vecPosition );
- vecPosition.z += m_flInitialZSpeed * flDeltaTime + 0.5f * m_flZAcceleration * flDeltaTime * flDeltaTime;
-
- Vector vecLeft;
- CrossProduct( m_vecParabolaDirection, Vector( 0, 0, 1 ), vecLeft );
-
- Vector vecForward;
- VectorMultiply( m_vecParabolaDirection, -1.0f, vecForward );
- vecForward.z = -(m_flInitialZSpeed + m_flZAcceleration * flDeltaTime) / m_flHorizSpeed; // This is -dz/dx.
- VectorNormalize( vecForward );
-
- Vector vecUp;
- CrossProduct( vecForward, vecLeft, vecUp );
-
- initToWorld.SetBasisVectors( vecForward, vecLeft, vecUp );
- }
- else
- {
- flDeltaTime -= m_flWorldEnterTime;
- Vector vecVelocity;
- VectorMultiply( m_vecDirection, m_flFlightSpeed, vecVelocity );
- VectorMA( m_vecEnterWorldPosition, flDeltaTime, vecVelocity, vecPosition );
-
- MatrixFromAngles( m_vecStartAngles.Get(), initToWorld );
- }
-
- VMatrix rotation;
- MatrixBuildRotationAboutAxis( rotation, Vector( 1, 0, 0 ), flDeltaTime * ROTATION_SPEED );
-
- VMatrix newAngles;
- MatrixMultiply( initToWorld, rotation, newAngles );
- MatrixToAngles( newAngles, vecAngles );
-}
-
-
-//-----------------------------------------------------------------------------
-// Are we in the skybox?
-//-----------------------------------------------------------------------------
-bool CEnvHeadcrabCanisterShared::IsInSkybox( )
-{
- // Check to see if we are always in the world!
- return m_bInSkybox;
-}
-
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-void CEnvHeadcrabCanisterShared::CalcEnterTime( const Vector &vecTriggerMins,
- const Vector &vecTriggerMaxs )
-{
- /*
-#define HEADCRABCANISTER_TRIGGER_EPSILON 0.001f
-
- // Initialize the enter/exit fractions.
- float flEnterFrac = 0.0f;
- float flExitFrac = 1.0f;
-
- // Create an arbitrarily large end position.
- Vector vecEndPosition;
- VectorMA( m_vecStartPosition, 32000.0f, m_vecDirection, vecEndPosition );
-
- float flFrac, flDistStart, flDistEnd;
- for( int iAxis = 0; iAxis < 3; iAxis++ )
- {
- // Negative Axis
- flDistStart = -m_vecStartPosition[iAxis] + vecTriggerMins[iAxis];
- flDistEnd = -vecEndPosition[iAxis] + vecTriggerMins[iAxis];
-
- if ( ( flDistStart > 0.0f ) && ( flDistEnd < 0.0f ) )
- {
- flFrac = ( flDistStart - HEADCRABCANISTER_TRIGGER_EPSILON ) / ( flDistStart - flDistEnd );
- if ( flFrac > flEnterFrac ) { flEnterFrac = flFrac; }
- }
-
- if ( ( flDistStart < 0.0f ) && ( flDistEnd > 0.0f ) )
- {
- flFrac = ( flDistStart + HEADCRABCANISTER_TRIGGER_EPSILON ) / ( flDistStart - flDistEnd );
- if( flFrac < flExitFrac ) { flExitFrac = flFrac; }
- }
-
- if ( ( flDistStart > 0.0f ) && ( flDistEnd > 0.0f ) )
- return;
-
- // Positive Axis
- flDistStart = m_vecStartPosition[iAxis] - vecTriggerMaxs[iAxis];
- flDistEnd = vecEndPosition[iAxis] - vecTriggerMaxs[iAxis];
-
- if ( ( flDistStart > 0.0f ) && ( flDistEnd < 0.0f ) )
- {
- flFrac = ( flDistStart - HEADCRABCANISTER_TRIGGER_EPSILON ) / ( flDistStart - flDistEnd );
- if ( flFrac > flEnterFrac ) { flEnterFrac = flFrac; }
- }
-
- if ( ( flDistStart < 0.0f ) && ( flDistEnd > 0.0f ) )
- {
- flFrac = ( flDistStart + HEADCRABCANISTER_TRIGGER_EPSILON ) / ( flDistStart - flDistEnd );
- if( flFrac < flExitFrac ) { flExitFrac = flFrac; }
- }
-
- if ( ( flDistStart > 0.0f ) && ( flDistEnd > 0.0f ) )
- return;
- }
-
- // Check for intersection.
- if ( flExitFrac >= flEnterFrac )
- {
- // Check to see if we start in the world or the skybox!
- if ( flEnterFrac == 0.0f )
- {
- m_nLocation = HEADCRABCANISTER_LOCATION_WORLD;
- }
- else
- {
- m_nLocation = HEADCRABCANISTER_LOCATION_SKYBOX;
- }
-
- // Calculate the enter/exit times.
- Vector vecEnterPoint, vecExitPoint, vecDeltaPosition;
- VectorSubtract( vecEndPosition, m_vecStartPosition, vecDeltaPosition );
- VectorScale( vecDeltaPosition, flEnterFrac, vecEnterPoint );
- VectorScale( vecDeltaPosition, flExitFrac, vecExitPoint );
-
- m_flWorldEnterTime = vecEnterPoint.Length() / m_flFlightSpeed;
- m_flWorldEnterTime += m_flLaunchTime;
- }
- */
-
-#undef HEADCRABCANISTER_TRIGGER_EPSILON
-}
-
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "env_headcrabcanister_shared.h"
+#include "mapdata_shared.h"
+#include "sharedInterface.h"
+#include "mathlib/vmatrix.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#define ROTATION_SPEED 90.0f
+
+
+BEGIN_SIMPLE_DATADESC( CEnvHeadcrabCanisterShared )
+ DEFINE_FIELD( m_vecStartPosition, FIELD_POSITION_VECTOR ),
+ DEFINE_FIELD( m_vecEnterWorldPosition, FIELD_POSITION_VECTOR ),
+ DEFINE_FIELD( m_vecDirection, FIELD_VECTOR ),
+ DEFINE_FIELD( m_vecStartAngles, FIELD_VECTOR ),
+ DEFINE_KEYFIELD( m_flLaunchHeight, FIELD_FLOAT, "StartingHeight" ),
+ DEFINE_KEYFIELD( m_flFlightSpeed, FIELD_FLOAT, "FlightSpeed" ),
+ DEFINE_KEYFIELD( m_flFlightTime, FIELD_FLOAT, "FlightTime" ),
+ DEFINE_FIELD( m_flLaunchTime, FIELD_TIME ),
+ DEFINE_FIELD( m_flWorldEnterTime, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flInitialZSpeed, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flZAcceleration, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flHorizSpeed, FIELD_FLOAT ),
+ DEFINE_FIELD( m_bLaunchedFromWithinWorld, FIELD_BOOLEAN ),
+ DEFINE_FIELD( m_vecSkyboxOrigin, FIELD_VECTOR ),
+ DEFINE_FIELD( m_vecParabolaDirection, FIELD_VECTOR ),
+ DEFINE_FIELD( m_flSkyboxScale, FIELD_FLOAT ),
+ DEFINE_FIELD( m_bInSkybox, FIELD_BOOLEAN ),
+END_DATADESC()
+
+
+BEGIN_NETWORK_TABLE_NOBASE( CEnvHeadcrabCanisterShared, DT_EnvHeadcrabCanisterShared )
+
+#if !defined( CLIENT_DLL )
+ SendPropFloat ( SENDINFO( m_flFlightSpeed ), 0, SPROP_NOSCALE ),
+ SendPropTime ( SENDINFO( m_flLaunchTime ) ),
+ SendPropVector ( SENDINFO( m_vecParabolaDirection ), 0, SPROP_NOSCALE ),
+
+ SendPropFloat ( SENDINFO( m_flFlightTime ), 0, SPROP_NOSCALE ),
+ SendPropFloat ( SENDINFO( m_flWorldEnterTime ), 0, SPROP_NOSCALE ),
+
+ SendPropFloat ( SENDINFO( m_flInitialZSpeed ), 0, SPROP_NOSCALE ),
+ SendPropFloat ( SENDINFO( m_flZAcceleration ), 0, SPROP_NOSCALE ),
+ SendPropFloat ( SENDINFO( m_flHorizSpeed ), 0, SPROP_NOSCALE ),
+ SendPropBool ( SENDINFO( m_bLaunchedFromWithinWorld ) ),
+
+ SendPropVector ( SENDINFO( m_vecStartPosition ), 0, SPROP_NOSCALE ),
+ SendPropVector ( SENDINFO( m_vecEnterWorldPosition ), 0, SPROP_NOSCALE ),
+ SendPropVector ( SENDINFO( m_vecDirection ), 0, SPROP_NOSCALE ),
+ SendPropVector ( SENDINFO( m_vecStartAngles ), 0, SPROP_NOSCALE ),
+
+ SendPropVector ( SENDINFO( m_vecSkyboxOrigin ), 0, SPROP_NOSCALE ),
+ SendPropFloat ( SENDINFO( m_flSkyboxScale ), 0, SPROP_NOSCALE ),
+ SendPropBool ( SENDINFO( m_bInSkybox ) ),
+#else
+ RecvPropFloat ( RECVINFO( m_flFlightSpeed ) ),
+ RecvPropTime ( RECVINFO( m_flLaunchTime ) ),
+ RecvPropVector ( RECVINFO( m_vecParabolaDirection ) ),
+
+ RecvPropFloat ( RECVINFO( m_flFlightTime ) ),
+ RecvPropFloat ( RECVINFO( m_flWorldEnterTime ) ),
+
+ RecvPropFloat ( RECVINFO( m_flInitialZSpeed ) ),
+ RecvPropFloat ( RECVINFO( m_flZAcceleration ) ),
+ RecvPropFloat ( RECVINFO( m_flHorizSpeed ) ),
+ RecvPropBool ( RECVINFO( m_bLaunchedFromWithinWorld ) ),
+
+ RecvPropVector ( RECVINFO( m_vecStartPosition ) ),
+ RecvPropVector ( RECVINFO( m_vecEnterWorldPosition ) ),
+ RecvPropVector ( RECVINFO( m_vecDirection ) ),
+ RecvPropVector ( RECVINFO( m_vecStartAngles ) ),
+
+ RecvPropVector ( RECVINFO( m_vecSkyboxOrigin ) ),
+ RecvPropFloat ( RECVINFO( m_flSkyboxScale ) ),
+ RecvPropBool ( RECVINFO( m_bInSkybox ) ),
+#endif
+
+END_NETWORK_TABLE()
+
+
+
+//=============================================================================
+//
+// HeadcrabCanister Functions.
+//
+
+//-----------------------------------------------------------------------------
+// Constructor
+//-----------------------------------------------------------------------------
+CEnvHeadcrabCanisterShared::CEnvHeadcrabCanisterShared()
+{
+ m_vecStartPosition.Init();
+ m_vecDirection.Init();
+ m_flFlightSpeed = 0.0f;
+
+ // This tells the client DLL to not draw trails, etc.
+ m_flLaunchTime = -1.0f;
+
+ m_flWorldEnterTime = 0.0f;
+ m_flFlightTime = 0.0f;
+ m_bInSkybox = false;
+}
+
+
+//-----------------------------------------------------------------------------
+// Creates a headcrab canister in the world
+//-----------------------------------------------------------------------------
+void CEnvHeadcrabCanisterShared::InitInWorld( float flLaunchTime,
+ const Vector &vecStartPosition, const QAngle &vecStartAngles,
+ const Vector &vecDirection, const Vector &vecImpactPosition, bool bLaunchedFromWithinWorld )
+{
+ Vector vecActualStartPosition = vecStartPosition;
+ if ( !bLaunchedFromWithinWorld )
+ {
+ // Move the start position inward if it's too close
+ Vector vecDelta;
+ VectorSubtract( vecStartPosition, vecImpactPosition, vecDelta );
+ VectorNormalize( vecDelta );
+
+ VectorMA( vecImpactPosition, m_flFlightTime * m_flFlightSpeed, vecDelta, vecActualStartPosition );
+ }
+
+ // Setup initial parametric state.
+ m_flLaunchTime = flLaunchTime;
+ m_vecStartPosition = vecActualStartPosition;
+ m_vecEnterWorldPosition = vecActualStartPosition;
+ m_vecDirection = vecDirection;
+ m_vecStartAngles = vecStartAngles;
+ m_flWorldEnterTime = 0.0f;
+ m_bInSkybox = false;
+ m_bLaunchedFromWithinWorld = bLaunchedFromWithinWorld;
+
+ if ( m_bLaunchedFromWithinWorld )
+ {
+ m_flSkyboxScale = 1;
+ m_vecSkyboxOrigin = vec3_origin;
+
+ float flLength = m_vecDirection.Get().AsVector2D().Length();
+ VectorSubtract(vecImpactPosition, vecStartPosition, m_vecParabolaDirection.GetForModify());
+ m_vecParabolaDirection.GetForModify().z = 0;
+ float flTotalDistance = VectorNormalize( m_vecParabolaDirection.GetForModify() );
+ m_vecDirection.GetForModify().x = flLength * m_vecParabolaDirection.Get().x;
+ m_vecDirection.GetForModify().y = flLength * m_vecParabolaDirection.Get().y;
+
+ m_flHorizSpeed = flTotalDistance / m_flFlightTime;
+ m_flWorldEnterTime = 0;
+
+ float flFinalZSpeed = m_vecDirection.Get().z * m_flHorizSpeed;
+ m_flFlightSpeed = sqrt( m_flHorizSpeed * m_flHorizSpeed + flFinalZSpeed * flFinalZSpeed );
+ m_flInitialZSpeed = (2.0f * ( vecImpactPosition.z - vecStartPosition.z ) - flFinalZSpeed * m_flFlightTime) / m_flFlightTime;
+ m_flZAcceleration = (flFinalZSpeed - m_flInitialZSpeed) / m_flFlightTime;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Creates a headcrab canister in the skybox
+//-----------------------------------------------------------------------------
+void CEnvHeadcrabCanisterShared::InitInSkybox( float flLaunchTime,
+ const Vector &vecStartPosition, const QAngle &vecStartAngles, const Vector &vecDirection,
+ const Vector &vecImpactPosition, const Vector &vecSkyboxOrigin, float flSkyboxScale )
+{
+ // Compute a horizontal speed (constant)
+ m_vecParabolaDirection.Init( vecDirection.x, vecDirection.y, 0.0f );
+ float flLength = VectorNormalize( m_vecParabolaDirection.GetForModify() );
+ m_flHorizSpeed = flLength * m_flFlightSpeed;
+
+ // compute total distance to travel
+ float flTotalDistance = m_flFlightTime * m_flHorizSpeed;
+ flTotalDistance -= vecStartPosition.AsVector2D().DistTo( vecImpactPosition.AsVector2D() );
+ if ( flTotalDistance <= 0.0f )
+ {
+ InitInWorld( flLaunchTime, vecStartPosition, vecStartAngles, vecDirection, vecImpactPosition );
+ return;
+ }
+
+ // Setup initial parametric state.
+ m_flLaunchTime = flLaunchTime;
+ m_flWorldEnterTime = flTotalDistance / m_flHorizSpeed;
+ m_vecSkyboxOrigin = vecSkyboxOrigin;
+ m_flSkyboxScale = flSkyboxScale;
+
+ m_vecEnterWorldPosition = vecStartPosition;
+ m_vecDirection = vecDirection;
+ m_vecStartAngles = vecStartAngles;
+ m_bInSkybox = true;
+ m_bLaunchedFromWithinWorld = false;
+
+ // Compute parabolic course
+ // Assume the x velocity remains constant.
+ // Z moves ballistically, as if under gravity
+ // zf + lh = zo
+ // vf = vo + a*t
+ // zf = zo + vo*t + 0.5 * a * t*t
+ // a*t = vf - vo
+ // zf = zo + vo*t + 0.5f * (vf - vo) * t
+ // zf - zo = 0.5f *vo*t + 0.5f * vf * t
+ // -lh - 0.5f * vf * t = 0.5f * vo * t
+ // vo = -2.0f * lh / t - vf
+ // a = (vf - vo) / t
+ m_flHorizSpeed /= flSkyboxScale;
+
+ VectorMA( vecSkyboxOrigin, 1.0f / m_flSkyboxScale, vecStartPosition, m_vecStartPosition.GetForModify() );
+ VectorMA( m_vecStartPosition.Get(), -m_flHorizSpeed * m_flWorldEnterTime, m_vecParabolaDirection, m_vecStartPosition.GetForModify() );
+
+ float flLaunchHeight = m_flLaunchHeight / flSkyboxScale;
+ float flFinalZSpeed = m_vecDirection.Get().z * m_flFlightSpeed / flSkyboxScale;
+ m_vecStartPosition.GetForModify().z += flLaunchHeight;
+ m_flZAcceleration = 2.0f * ( flLaunchHeight + flFinalZSpeed * m_flWorldEnterTime ) / ( m_flWorldEnterTime * m_flWorldEnterTime );
+ m_flInitialZSpeed = flFinalZSpeed - m_flZAcceleration * m_flWorldEnterTime;
+}
+
+
+//-----------------------------------------------------------------------------
+// Convert from skybox to world
+//-----------------------------------------------------------------------------
+void CEnvHeadcrabCanisterShared::ConvertFromSkyboxToWorld()
+{
+ Assert( m_bInSkybox );
+ m_bInSkybox = false;
+}
+
+
+//-----------------------------------------------------------------------------
+// Returns the time at which it enters the world
+//-----------------------------------------------------------------------------
+float CEnvHeadcrabCanisterShared::GetEnterWorldTime() const
+{
+ return m_flWorldEnterTime;
+}
+
+
+//-----------------------------------------------------------------------------
+// Did we impact?
+//-----------------------------------------------------------------------------
+bool CEnvHeadcrabCanisterShared::DidImpact( float flTime ) const
+{
+ return (flTime - m_flLaunchTime) >= m_flFlightTime;
+}
+
+
+//-----------------------------------------------------------------------------
+// Computes the position of the canister
+//-----------------------------------------------------------------------------
+void CEnvHeadcrabCanisterShared::GetPositionAtTime( float flTime, Vector &vecPosition, QAngle &vecAngles )
+{
+ float flDeltaTime = flTime - m_flLaunchTime;
+ if ( flDeltaTime > m_flFlightTime )
+ {
+ flDeltaTime = m_flFlightTime;
+ }
+
+ VMatrix initToWorld;
+ if ( m_bLaunchedFromWithinWorld || m_bInSkybox )
+ {
+ VectorMA( m_vecStartPosition, flDeltaTime * m_flHorizSpeed, m_vecParabolaDirection, vecPosition );
+ vecPosition.z += m_flInitialZSpeed * flDeltaTime + 0.5f * m_flZAcceleration * flDeltaTime * flDeltaTime;
+
+ Vector vecLeft;
+ CrossProduct( m_vecParabolaDirection, Vector( 0, 0, 1 ), vecLeft );
+
+ Vector vecForward;
+ VectorMultiply( m_vecParabolaDirection, -1.0f, vecForward );
+ vecForward.z = -(m_flInitialZSpeed + m_flZAcceleration * flDeltaTime) / m_flHorizSpeed; // This is -dz/dx.
+ VectorNormalize( vecForward );
+
+ Vector vecUp;
+ CrossProduct( vecForward, vecLeft, vecUp );
+
+ initToWorld.SetBasisVectors( vecForward, vecLeft, vecUp );
+ }
+ else
+ {
+ flDeltaTime -= m_flWorldEnterTime;
+ Vector vecVelocity;
+ VectorMultiply( m_vecDirection, m_flFlightSpeed, vecVelocity );
+ VectorMA( m_vecEnterWorldPosition, flDeltaTime, vecVelocity, vecPosition );
+
+ MatrixFromAngles( m_vecStartAngles.Get(), initToWorld );
+ }
+
+ VMatrix rotation;
+ MatrixBuildRotationAboutAxis( rotation, Vector( 1, 0, 0 ), flDeltaTime * ROTATION_SPEED );
+
+ VMatrix newAngles;
+ MatrixMultiply( initToWorld, rotation, newAngles );
+ MatrixToAngles( newAngles, vecAngles );
+}
+
+
+//-----------------------------------------------------------------------------
+// Are we in the skybox?
+//-----------------------------------------------------------------------------
+bool CEnvHeadcrabCanisterShared::IsInSkybox( )
+{
+ // Check to see if we are always in the world!
+ return m_bInSkybox;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+void CEnvHeadcrabCanisterShared::CalcEnterTime( const Vector &vecTriggerMins,
+ const Vector &vecTriggerMaxs )
+{
+ /*
+#define HEADCRABCANISTER_TRIGGER_EPSILON 0.001f
+
+ // Initialize the enter/exit fractions.
+ float flEnterFrac = 0.0f;
+ float flExitFrac = 1.0f;
+
+ // Create an arbitrarily large end position.
+ Vector vecEndPosition;
+ VectorMA( m_vecStartPosition, 32000.0f, m_vecDirection, vecEndPosition );
+
+ float flFrac, flDistStart, flDistEnd;
+ for( int iAxis = 0; iAxis < 3; iAxis++ )
+ {
+ // Negative Axis
+ flDistStart = -m_vecStartPosition[iAxis] + vecTriggerMins[iAxis];
+ flDistEnd = -vecEndPosition[iAxis] + vecTriggerMins[iAxis];
+
+ if ( ( flDistStart > 0.0f ) && ( flDistEnd < 0.0f ) )
+ {
+ flFrac = ( flDistStart - HEADCRABCANISTER_TRIGGER_EPSILON ) / ( flDistStart - flDistEnd );
+ if ( flFrac > flEnterFrac ) { flEnterFrac = flFrac; }
+ }
+
+ if ( ( flDistStart < 0.0f ) && ( flDistEnd > 0.0f ) )
+ {
+ flFrac = ( flDistStart + HEADCRABCANISTER_TRIGGER_EPSILON ) / ( flDistStart - flDistEnd );
+ if( flFrac < flExitFrac ) { flExitFrac = flFrac; }
+ }
+
+ if ( ( flDistStart > 0.0f ) && ( flDistEnd > 0.0f ) )
+ return;
+
+ // Positive Axis
+ flDistStart = m_vecStartPosition[iAxis] - vecTriggerMaxs[iAxis];
+ flDistEnd = vecEndPosition[iAxis] - vecTriggerMaxs[iAxis];
+
+ if ( ( flDistStart > 0.0f ) && ( flDistEnd < 0.0f ) )
+ {
+ flFrac = ( flDistStart - HEADCRABCANISTER_TRIGGER_EPSILON ) / ( flDistStart - flDistEnd );
+ if ( flFrac > flEnterFrac ) { flEnterFrac = flFrac; }
+ }
+
+ if ( ( flDistStart < 0.0f ) && ( flDistEnd > 0.0f ) )
+ {
+ flFrac = ( flDistStart + HEADCRABCANISTER_TRIGGER_EPSILON ) / ( flDistStart - flDistEnd );
+ if( flFrac < flExitFrac ) { flExitFrac = flFrac; }
+ }
+
+ if ( ( flDistStart > 0.0f ) && ( flDistEnd > 0.0f ) )
+ return;
+ }
+
+ // Check for intersection.
+ if ( flExitFrac >= flEnterFrac )
+ {
+ // Check to see if we start in the world or the skybox!
+ if ( flEnterFrac == 0.0f )
+ {
+ m_nLocation = HEADCRABCANISTER_LOCATION_WORLD;
+ }
+ else
+ {
+ m_nLocation = HEADCRABCANISTER_LOCATION_SKYBOX;
+ }
+
+ // Calculate the enter/exit times.
+ Vector vecEnterPoint, vecExitPoint, vecDeltaPosition;
+ VectorSubtract( vecEndPosition, m_vecStartPosition, vecDeltaPosition );
+ VectorScale( vecDeltaPosition, flEnterFrac, vecEnterPoint );
+ VectorScale( vecDeltaPosition, flExitFrac, vecExitPoint );
+
+ m_flWorldEnterTime = vecEnterPoint.Length() / m_flFlightSpeed;
+ m_flWorldEnterTime += m_flLaunchTime;
+ }
+ */
+
+#undef HEADCRABCANISTER_TRIGGER_EPSILON
+}
+
diff --git a/sp/src/game/shared/hl2/env_headcrabcanister_shared.h b/sp/src/game/shared/hl2/env_headcrabcanister_shared.h
index 252934e3..d5f2f7c5 100644
--- a/sp/src/game/shared/hl2/env_headcrabcanister_shared.h
+++ b/sp/src/game/shared/hl2/env_headcrabcanister_shared.h
@@ -1,180 +1,180 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//=============================================================================//
-
-#ifndef ENV_HEADCRABCANISTER_SHARED_H
-#define ENV_HEADCRABCANISTER_SHARED_H
-
-#ifdef _WIN32
-#pragma once
-#endif
-
-#include "vstdlib/random.h"
-#include "mathlib/vector.h"
-#include "utlvector.h"
-#include "networkvar.h"
-
-//=============================================================================
-//
-// Shared HeadcrabCanister Class
-//
-class CEnvHeadcrabCanisterShared
-{
- DECLARE_CLASS_NOBASE( CEnvHeadcrabCanisterShared );
- DECLARE_EMBEDDED_NETWORKVAR();
- DECLARE_SIMPLE_DATADESC();
-
-public:
- CEnvHeadcrabCanisterShared();
-
- // Initialization.
- void InitInWorld( float flLaunchTime, const Vector &vecStartPosition, const QAngle &vecStartAngles, const Vector &vecDirection, const Vector &vecImpactPosition, bool bLaunchedFromWithinWorld = false );
- void InitInSkybox( float flLaunchTime, const Vector &vecStartPosition, const QAngle &vecStartAngles, const Vector &vecDirection, const Vector &vecImpactPosition, const Vector &vecSkyboxOrigin, float flSkyboxScale );
-
- // Returns the position of the object at a given time.
- void GetPositionAtTime( float flTime, Vector &vecPosition, QAngle &vecAngles );
-
- // Returns whether or not the object is the the skybox
- bool IsInSkybox( );
-
- // Returns the time at which it enters the world
- float GetEnterWorldTime() const;
-
- // Convert from skybox to world
- void ConvertFromSkyboxToWorld();
-
- // Did we impact?
- bool DidImpact( float flTime ) const;
-
-public:
- // The objects initial parametric conditions.
- CNetworkVector( m_vecStartPosition );
- CNetworkVector( m_vecEnterWorldPosition );
- CNetworkVector( m_vecDirection );
- CNetworkQAngle( m_vecStartAngles );
-
- CNetworkVar( float, m_flFlightTime );
- CNetworkVar( float, m_flFlightSpeed );
- CNetworkVar( float, m_flLaunchTime );
-
- CNetworkVar( float, m_flInitialZSpeed );
- CNetworkVar( float, m_flZAcceleration );
- CNetworkVar( float, m_flHorizSpeed );
-
- CNetworkVar( bool, m_bLaunchedFromWithinWorld );
-
- CNetworkVector( m_vecParabolaDirection );
-
- // The time at which the canister enters the skybox
- CNetworkVar( float, m_flWorldEnterTime );
-
- // Skybox data
- CNetworkVector( m_vecSkyboxOrigin );
- CNetworkVar( float, m_flSkyboxScale );
- CNetworkVar( bool, m_bInSkybox );
-
-private:
- float m_flLaunchHeight;
-
- // Calculate the enter time. (called from Init)
- void CalcEnterTime( const Vector &vecTriggerMins, const Vector &vecTriggerMaxs );
-
- friend class CEnvHeadcrabCanister;
- friend class C_EnvHeadcrabCanister;
-};
-
-/*
-//=============================================================================
-//
-// HeadcrabCanister Factory Interface
-//
-abstract_class IHeadcrabCanisterFactory
-{
-public:
-
- virtual void CreateHeadcrabCanister( int nID, int iType,
- const Vector &vecPosition, const Vector &vecDirection,
- float flSpeed, float flStartTime, float flDamageRadius,
- const Vector &vecTriggerMins, const Vector &vecTriggerMaxs ) = 0;
-};
-
-//=============================================================================
-//
-// Shared HeadcrabCanister Spawner Class
-//
-class CEnvHeadcrabCanisterSpawnerShared
-{
-public:
- DECLARE_CLASS_NOBASE( CEnvHeadcrabCanisterSpawnerShared );
- DECLARE_EMBEDDED_NETWORKVAR();
-
- //-------------------------------------------------------------------------
- // Initialization.
- //-------------------------------------------------------------------------
- CEnvHeadcrabCanisterSpawnerShared();
- void Init( IHeadcrabCanisterFactory *pFactory, int nRandomSeed, float flTime,
- const Vector &vecMinBounds, const Vector &vecMaxBounds,
- const Vector &vecTriggerMins, const Vector &vecTriggerMaxs );
-
- //-------------------------------------------------------------------------
- // Method to generate HeadcrabCanisters.
- // Time passed in here is global time, not delta time.
- // The function returns the time at which it must be called again.
- //-------------------------------------------------------------------------
- float HeadcrabCanisterThink( float flTime );
-
- //-------------------------------------------------------------------------
- // Add HeadcrabCanister target data, used to determine HeadcrabCanister travel direction.
- //-------------------------------------------------------------------------
- void AddToTargetList( const Vector &vecPosition, float flRadius );
-
- // Debugging!
- int GetRandomInt( int nMin, int nMax );
- float GetRandomFloat( float flMin, float flMax );
-
-public:
-
- // Factory.
- IHeadcrabCanisterFactory *m_pFactory; // HeadcrabCanister creation factory.
-
- int m_nHeadcrabCanisterCount; // Number of HeadcrabCanisters created - used as IDs
-
- // Initial spawner data.
- CNetworkVar( float, m_flStartTime ); // Start time.
- CNetworkVar( int, m_nRandomSeed ); // The random number stream seed.
-
- CNetworkVar( int, m_iHeadcrabCanisterType ); // Type of HeadcrabCanister.
- float m_flHeadcrabCanisterDamageRadius; // HeadcrabCanister damage radius.
- CNetworkVar( bool, m_bSkybox ); // Is the spawner in the skybox?
-
- CNetworkVar( float, m_flMinSpawnTime ); // Spawn time - Min
- CNetworkVar( float, m_flMaxSpawnTime ); // Max
- CNetworkVar( int, m_nMinSpawnCount ); // Number of HeadcrabCanisters to spawn - Min
- CNetworkVar( int, m_nMaxSpawnCount ); // Max
- CNetworkVector( m_vecMinBounds ); // Spawner volume (space) - Min
- CNetworkVector( m_vecMaxBounds ); // Max
- CNetworkVar( float, m_flMinSpeed ); // HeadcrabCanister speed - Min
- CNetworkVar( float, m_flMaxSpeed ); // Max
- CNetworkVector( m_vecTriggerMins ); // World Bounds (Trigger) in 3D Skybox - Min
- CNetworkVector( m_vecTriggerMaxs ); // Max
- Vector m_vecTriggerCenter;
-
- // Generated data.
- int m_nRandomCallCount; // Debug! Keep track of number steam calls.
- float m_flNextSpawnTime; // Next HeadcrabCanister spawn time (random).
- CUniformRandomStream m_NumberStream; // Used to generate random numbers.
-
- // Use "Targets" to determine HeadcrabCanister direction(s).
- struct HeadcrabCanistertarget_t
- {
- Vector m_vecPosition;
- float m_flRadius;
- };
- CUtlVector<HeadcrabCanistertarget_t> m_aTargets;
-};
-*/
-
-#endif // ENV_HEADCRAB_CANISTER_SHARED_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef ENV_HEADCRABCANISTER_SHARED_H
+#define ENV_HEADCRABCANISTER_SHARED_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "vstdlib/random.h"
+#include "mathlib/vector.h"
+#include "utlvector.h"
+#include "networkvar.h"
+
+//=============================================================================
+//
+// Shared HeadcrabCanister Class
+//
+class CEnvHeadcrabCanisterShared
+{
+ DECLARE_CLASS_NOBASE( CEnvHeadcrabCanisterShared );
+ DECLARE_EMBEDDED_NETWORKVAR();
+ DECLARE_SIMPLE_DATADESC();
+
+public:
+ CEnvHeadcrabCanisterShared();
+
+ // Initialization.
+ void InitInWorld( float flLaunchTime, const Vector &vecStartPosition, const QAngle &vecStartAngles, const Vector &vecDirection, const Vector &vecImpactPosition, bool bLaunchedFromWithinWorld = false );
+ void InitInSkybox( float flLaunchTime, const Vector &vecStartPosition, const QAngle &vecStartAngles, const Vector &vecDirection, const Vector &vecImpactPosition, const Vector &vecSkyboxOrigin, float flSkyboxScale );
+
+ // Returns the position of the object at a given time.
+ void GetPositionAtTime( float flTime, Vector &vecPosition, QAngle &vecAngles );
+
+ // Returns whether or not the object is the the skybox
+ bool IsInSkybox( );
+
+ // Returns the time at which it enters the world
+ float GetEnterWorldTime() const;
+
+ // Convert from skybox to world
+ void ConvertFromSkyboxToWorld();
+
+ // Did we impact?
+ bool DidImpact( float flTime ) const;
+
+public:
+ // The objects initial parametric conditions.
+ CNetworkVector( m_vecStartPosition );
+ CNetworkVector( m_vecEnterWorldPosition );
+ CNetworkVector( m_vecDirection );
+ CNetworkQAngle( m_vecStartAngles );
+
+ CNetworkVar( float, m_flFlightTime );
+ CNetworkVar( float, m_flFlightSpeed );
+ CNetworkVar( float, m_flLaunchTime );
+
+ CNetworkVar( float, m_flInitialZSpeed );
+ CNetworkVar( float, m_flZAcceleration );
+ CNetworkVar( float, m_flHorizSpeed );
+
+ CNetworkVar( bool, m_bLaunchedFromWithinWorld );
+
+ CNetworkVector( m_vecParabolaDirection );
+
+ // The time at which the canister enters the skybox
+ CNetworkVar( float, m_flWorldEnterTime );
+
+ // Skybox data
+ CNetworkVector( m_vecSkyboxOrigin );
+ CNetworkVar( float, m_flSkyboxScale );
+ CNetworkVar( bool, m_bInSkybox );
+
+private:
+ float m_flLaunchHeight;
+
+ // Calculate the enter time. (called from Init)
+ void CalcEnterTime( const Vector &vecTriggerMins, const Vector &vecTriggerMaxs );
+
+ friend class CEnvHeadcrabCanister;
+ friend class C_EnvHeadcrabCanister;
+};
+
+/*
+//=============================================================================
+//
+// HeadcrabCanister Factory Interface
+//
+abstract_class IHeadcrabCanisterFactory
+{
+public:
+
+ virtual void CreateHeadcrabCanister( int nID, int iType,
+ const Vector &vecPosition, const Vector &vecDirection,
+ float flSpeed, float flStartTime, float flDamageRadius,
+ const Vector &vecTriggerMins, const Vector &vecTriggerMaxs ) = 0;
+};
+
+//=============================================================================
+//
+// Shared HeadcrabCanister Spawner Class
+//
+class CEnvHeadcrabCanisterSpawnerShared
+{
+public:
+ DECLARE_CLASS_NOBASE( CEnvHeadcrabCanisterSpawnerShared );
+ DECLARE_EMBEDDED_NETWORKVAR();
+
+ //-------------------------------------------------------------------------
+ // Initialization.
+ //-------------------------------------------------------------------------
+ CEnvHeadcrabCanisterSpawnerShared();
+ void Init( IHeadcrabCanisterFactory *pFactory, int nRandomSeed, float flTime,
+ const Vector &vecMinBounds, const Vector &vecMaxBounds,
+ const Vector &vecTriggerMins, const Vector &vecTriggerMaxs );
+
+ //-------------------------------------------------------------------------
+ // Method to generate HeadcrabCanisters.
+ // Time passed in here is global time, not delta time.
+ // The function returns the time at which it must be called again.
+ //-------------------------------------------------------------------------
+ float HeadcrabCanisterThink( float flTime );
+
+ //-------------------------------------------------------------------------
+ // Add HeadcrabCanister target data, used to determine HeadcrabCanister travel direction.
+ //-------------------------------------------------------------------------
+ void AddToTargetList( const Vector &vecPosition, float flRadius );
+
+ // Debugging!
+ int GetRandomInt( int nMin, int nMax );
+ float GetRandomFloat( float flMin, float flMax );
+
+public:
+
+ // Factory.
+ IHeadcrabCanisterFactory *m_pFactory; // HeadcrabCanister creation factory.
+
+ int m_nHeadcrabCanisterCount; // Number of HeadcrabCanisters created - used as IDs
+
+ // Initial spawner data.
+ CNetworkVar( float, m_flStartTime ); // Start time.
+ CNetworkVar( int, m_nRandomSeed ); // The random number stream seed.
+
+ CNetworkVar( int, m_iHeadcrabCanisterType ); // Type of HeadcrabCanister.
+ float m_flHeadcrabCanisterDamageRadius; // HeadcrabCanister damage radius.
+ CNetworkVar( bool, m_bSkybox ); // Is the spawner in the skybox?
+
+ CNetworkVar( float, m_flMinSpawnTime ); // Spawn time - Min
+ CNetworkVar( float, m_flMaxSpawnTime ); // Max
+ CNetworkVar( int, m_nMinSpawnCount ); // Number of HeadcrabCanisters to spawn - Min
+ CNetworkVar( int, m_nMaxSpawnCount ); // Max
+ CNetworkVector( m_vecMinBounds ); // Spawner volume (space) - Min
+ CNetworkVector( m_vecMaxBounds ); // Max
+ CNetworkVar( float, m_flMinSpeed ); // HeadcrabCanister speed - Min
+ CNetworkVar( float, m_flMaxSpeed ); // Max
+ CNetworkVector( m_vecTriggerMins ); // World Bounds (Trigger) in 3D Skybox - Min
+ CNetworkVector( m_vecTriggerMaxs ); // Max
+ Vector m_vecTriggerCenter;
+
+ // Generated data.
+ int m_nRandomCallCount; // Debug! Keep track of number steam calls.
+ float m_flNextSpawnTime; // Next HeadcrabCanister spawn time (random).
+ CUniformRandomStream m_NumberStream; // Used to generate random numbers.
+
+ // Use "Targets" to determine HeadcrabCanister direction(s).
+ struct HeadcrabCanistertarget_t
+ {
+ Vector m_vecPosition;
+ float m_flRadius;
+ };
+ CUtlVector<HeadcrabCanistertarget_t> m_aTargets;
+};
+*/
+
+#endif // ENV_HEADCRAB_CANISTER_SHARED_H
diff --git a/sp/src/game/shared/hl2/hl2_gamerules.cpp b/sp/src/game/shared/hl2/hl2_gamerules.cpp
index 2038f4d9..bdd5abec 100644
--- a/sp/src/game/shared/hl2/hl2_gamerules.cpp
+++ b/sp/src/game/shared/hl2/hl2_gamerules.cpp
@@ -1,1880 +1,1880 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose: The Half-Life 2 game rules, such as the relationship tables and ammo
-// damage cvars.
-//
-//=============================================================================
-
-#include "cbase.h"
-#include "hl2_gamerules.h"
-#include "ammodef.h"
-#include "hl2_shareddefs.h"
-
-#ifdef CLIENT_DLL
-
-#else
- #include "player.h"
- #include "game.h"
- #include "gamerules.h"
- #include "teamplay_gamerules.h"
- #include "hl2_player.h"
- #include "voice_gamemgr.h"
- #include "globalstate.h"
- #include "ai_basenpc.h"
- #include "weapon_physcannon.h"
-#endif
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include "tier0/memdbgon.h"
-
-
-REGISTER_GAMERULES_CLASS( CHalfLife2 );
-
-BEGIN_NETWORK_TABLE_NOBASE( CHalfLife2, DT_HL2GameRules )
- #ifdef CLIENT_DLL
- RecvPropBool( RECVINFO( m_bMegaPhysgun ) ),
- #else
- SendPropBool( SENDINFO( m_bMegaPhysgun ) ),
- #endif
-END_NETWORK_TABLE()
-
-
-LINK_ENTITY_TO_CLASS( hl2_gamerules, CHalfLife2Proxy );
-IMPLEMENT_NETWORKCLASS_ALIASED( HalfLife2Proxy, DT_HalfLife2Proxy )
-
-
-#ifdef CLIENT_DLL
- void RecvProxy_HL2GameRules( const RecvProp *pProp, void **pOut, void *pData, int objectID )
- {
- CHalfLife2 *pRules = HL2GameRules();
- Assert( pRules );
- *pOut = pRules;
- }
-
- BEGIN_RECV_TABLE( CHalfLife2Proxy, DT_HalfLife2Proxy )
- RecvPropDataTable( "hl2_gamerules_data", 0, 0, &REFERENCE_RECV_TABLE( DT_HL2GameRules ), RecvProxy_HL2GameRules )
- END_RECV_TABLE()
-#else
- void* SendProxy_HL2GameRules( const SendProp *pProp, const void *pStructBase, const void *pData, CSendProxyRecipients *pRecipients, int objectID )
- {
- CHalfLife2 *pRules = HL2GameRules();
- Assert( pRules );
- pRecipients->SetAllRecipients();
- return pRules;
- }
-
- BEGIN_SEND_TABLE( CHalfLife2Proxy, DT_HalfLife2Proxy )
- SendPropDataTable( "hl2_gamerules_data", 0, &REFERENCE_SEND_TABLE( DT_HL2GameRules ), SendProxy_HL2GameRules )
- END_SEND_TABLE()
-#endif
-
-ConVar physcannon_mega_enabled( "physcannon_mega_enabled", "0", FCVAR_CHEAT | FCVAR_REPLICATED );
-
-// Controls the application of the robus radius damage model.
-ConVar sv_robust_explosions( "sv_robust_explosions","1", FCVAR_REPLICATED );
-
-// Damage scale for damage inflicted by the player on each skill level.
-ConVar sk_dmg_inflict_scale1( "sk_dmg_inflict_scale1", "1.50", FCVAR_REPLICATED );
-ConVar sk_dmg_inflict_scale2( "sk_dmg_inflict_scale2", "1.00", FCVAR_REPLICATED );
-ConVar sk_dmg_inflict_scale3( "sk_dmg_inflict_scale3", "0.75", FCVAR_REPLICATED );
-
-// Damage scale for damage taken by the player on each skill level.
-ConVar sk_dmg_take_scale1( "sk_dmg_take_scale1", "0.50", FCVAR_REPLICATED );
-ConVar sk_dmg_take_scale2( "sk_dmg_take_scale2", "1.00", FCVAR_REPLICATED );
-#ifdef HL2_EPISODIC
- ConVar sk_dmg_take_scale3( "sk_dmg_take_scale3", "2.0", FCVAR_REPLICATED );
-#else
- ConVar sk_dmg_take_scale3( "sk_dmg_take_scale3", "1.50", FCVAR_REPLICATED );
-#endif//HL2_EPISODIC
-
-ConVar sk_allow_autoaim( "sk_allow_autoaim", "1", FCVAR_REPLICATED | FCVAR_ARCHIVE_XBOX );
-
-// Autoaim scale
-ConVar sk_autoaim_scale1( "sk_autoaim_scale1", "1.0", FCVAR_REPLICATED );
-ConVar sk_autoaim_scale2( "sk_autoaim_scale2", "1.0", FCVAR_REPLICATED );
-//ConVar sk_autoaim_scale3( "sk_autoaim_scale3", "0.0", FCVAR_REPLICATED ); NOT CURRENTLY OFFERED ON SKILL 3
-
-// Quantity scale for ammo received by the player.
-ConVar sk_ammo_qty_scale1 ( "sk_ammo_qty_scale1", "1.20", FCVAR_REPLICATED );
-ConVar sk_ammo_qty_scale2 ( "sk_ammo_qty_scale2", "1.00", FCVAR_REPLICATED );
-ConVar sk_ammo_qty_scale3 ( "sk_ammo_qty_scale3", "0.60", FCVAR_REPLICATED );
-
-ConVar sk_plr_health_drop_time ( "sk_plr_health_drop_time", "30", FCVAR_REPLICATED );
-ConVar sk_plr_grenade_drop_time ( "sk_plr_grenade_drop_time", "30", FCVAR_REPLICATED );
-
-ConVar sk_plr_dmg_ar2 ( "sk_plr_dmg_ar2","0", FCVAR_REPLICATED );
-ConVar sk_npc_dmg_ar2 ( "sk_npc_dmg_ar2","0", FCVAR_REPLICATED);
-ConVar sk_max_ar2 ( "sk_max_ar2","0", FCVAR_REPLICATED);
-ConVar sk_max_ar2_altfire ( "sk_max_ar2_altfire","0", FCVAR_REPLICATED);
-
-ConVar sk_plr_dmg_alyxgun ( "sk_plr_dmg_alyxgun","0", FCVAR_REPLICATED );
-ConVar sk_npc_dmg_alyxgun ( "sk_npc_dmg_alyxgun","0", FCVAR_REPLICATED);
-ConVar sk_max_alyxgun ( "sk_max_alyxgun","0", FCVAR_REPLICATED);
-
-ConVar sk_plr_dmg_pistol ( "sk_plr_dmg_pistol","0", FCVAR_REPLICATED );
-ConVar sk_npc_dmg_pistol ( "sk_npc_dmg_pistol","0", FCVAR_REPLICATED);
-ConVar sk_max_pistol ( "sk_max_pistol","0", FCVAR_REPLICATED);
-
-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_buckshot ( "sk_plr_dmg_buckshot","0", FCVAR_REPLICATED);
-ConVar sk_npc_dmg_buckshot ( "sk_npc_dmg_buckshot","0", FCVAR_REPLICATED);
-ConVar sk_max_buckshot ( "sk_max_buckshot","0", FCVAR_REPLICATED);
-ConVar sk_plr_num_shotgun_pellets( "sk_plr_num_shotgun_pellets","7", FCVAR_REPLICATED);
-
-ConVar sk_plr_dmg_rpg_round ( "sk_plr_dmg_rpg_round","0", FCVAR_REPLICATED);
-ConVar sk_npc_dmg_rpg_round ( "sk_npc_dmg_rpg_round","0", FCVAR_REPLICATED);
-ConVar sk_max_rpg_round ( "sk_max_rpg_round","0", FCVAR_REPLICATED);
-
-ConVar sk_plr_dmg_sniper_round ( "sk_plr_dmg_sniper_round","0", FCVAR_REPLICATED);
-ConVar sk_npc_dmg_sniper_round ( "sk_npc_dmg_sniper_round","0", FCVAR_REPLICATED);
-ConVar sk_max_sniper_round ( "sk_max_sniper_round","0", FCVAR_REPLICATED);
-
-//ConVar sk_max_slam ( "sk_max_slam","0", FCVAR_REPLICATED);
-//ConVar sk_max_tripwire ( "sk_max_tripwire","0", FCVAR_REPLICATED);
-
-//ConVar sk_plr_dmg_molotov ( "sk_plr_dmg_molotov","0", FCVAR_REPLICATED);
-//ConVar sk_npc_dmg_molotov ( "sk_npc_dmg_molotov","0", FCVAR_REPLICATED);
-//ConVar sk_max_molotov ( "sk_max_molotov","0", FCVAR_REPLICATED);
-
-ConVar sk_plr_dmg_grenade ( "sk_plr_dmg_grenade","0", FCVAR_REPLICATED);
-ConVar sk_npc_dmg_grenade ( "sk_npc_dmg_grenade","0", FCVAR_REPLICATED);
-ConVar sk_max_grenade ( "sk_max_grenade","0", FCVAR_REPLICATED);
-
-#ifdef HL2_EPISODIC
-ConVar sk_max_hopwire ( "sk_max_hopwire", "3", FCVAR_REPLICATED);
-ConVar sk_max_striderbuster ( "sk_max_striderbuster", "3", FCVAR_REPLICATED);
-#endif
-
-//ConVar sk_plr_dmg_brickbat ( "sk_plr_dmg_brickbat","0", FCVAR_REPLICATED);
-//ConVar sk_npc_dmg_brickbat ( "sk_npc_dmg_brickbat","0", FCVAR_REPLICATED);
-//ConVar sk_max_brickbat ( "sk_max_brickbat","0", FCVAR_REPLICATED);
-
-ConVar sk_plr_dmg_smg1_grenade ( "sk_plr_dmg_smg1_grenade","0", FCVAR_REPLICATED);
-ConVar sk_npc_dmg_smg1_grenade ( "sk_npc_dmg_smg1_grenade","0", FCVAR_REPLICATED);
-ConVar sk_max_smg1_grenade ( "sk_max_smg1_grenade","0", FCVAR_REPLICATED );
-
-ConVar sk_plr_dmg_357 ( "sk_plr_dmg_357", "0", FCVAR_REPLICATED );
-ConVar sk_npc_dmg_357 ( "sk_npc_dmg_357", "0", FCVAR_REPLICATED );
-ConVar sk_max_357 ( "sk_max_357", "0", FCVAR_REPLICATED );
-
-ConVar sk_plr_dmg_crossbow ( "sk_plr_dmg_crossbow", "0", FCVAR_REPLICATED );
-ConVar sk_npc_dmg_crossbow ( "sk_npc_dmg_crossbow", "0", FCVAR_REPLICATED );
-ConVar sk_max_crossbow ( "sk_max_crossbow", "0", FCVAR_REPLICATED );
-
-ConVar sk_dmg_sniper_penetrate_plr( "sk_dmg_sniper_penetrate_plr","0", FCVAR_REPLICATED);
-ConVar sk_dmg_sniper_penetrate_npc( "sk_dmg_sniper_penetrate_npc","0", FCVAR_REPLICATED);
-
-ConVar sk_plr_dmg_airboat ( "sk_plr_dmg_airboat", "0", FCVAR_REPLICATED );
-ConVar sk_npc_dmg_airboat ( "sk_npc_dmg_airboat", "0", FCVAR_REPLICATED );
-
-ConVar sk_max_gauss_round ( "sk_max_gauss_round", "0", FCVAR_REPLICATED );
-
-// Gunship & Dropship cannons
-ConVar sk_npc_dmg_gunship ( "sk_npc_dmg_gunship", "0", FCVAR_REPLICATED );
-ConVar sk_npc_dmg_gunship_to_plr ( "sk_npc_dmg_gunship_to_plr", "0", FCVAR_REPLICATED );
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : iDmgType -
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-int CHalfLife2::Damage_GetTimeBased( void )
-{
-#ifdef HL2_EPISODIC
- int iDamage = ( DMG_PARALYZE | DMG_NERVEGAS | DMG_POISON | DMG_RADIATION | DMG_DROWNRECOVER | DMG_ACID | DMG_SLOWBURN );
- return iDamage;
-#else
- return BaseClass::Damage_GetTimeBased();
-#endif
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : iDmgType -
-// Output : bool
-//-----------------------------------------------------------------------------
-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 );
-#else
- return BaseClass::Damage_IsTimeBased( iDmgType );
-#endif
-}
-
-#ifdef CLIENT_DLL
-#else
-
-#ifdef HL2_EPISODIC
-ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REPLICATED );
-#endif // HL2_EPISODIC
-
-#endif // CLIENT_DLL
-
-
-#ifdef CLIENT_DLL //{
-
-
-#else //}{
-
- extern bool g_fGameOver;
-
-#if !(defined( HL2MP ) || defined( PORTAL_MP ))
- class CVoiceGameMgrHelper : public IVoiceGameMgrHelper
- {
- public:
- virtual bool CanPlayerHearPlayer( CBasePlayer *pListener, CBasePlayer *pTalker, bool &bProximity )
- {
- return true;
- }
- };
- CVoiceGameMgrHelper g_VoiceGameMgrHelper;
- IVoiceGameMgrHelper *g_pVoiceGameMgrHelper = &g_VoiceGameMgrHelper;
-#endif
-
- //-----------------------------------------------------------------------------
- // Purpose:
- // Input :
- // Output :
- //-----------------------------------------------------------------------------
- CHalfLife2::CHalfLife2()
- {
- m_bMegaPhysgun = false;
-
- m_flLastHealthDropTime = 0.0f;
- m_flLastGrenadeDropTime = 0.0f;
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: called each time a player uses a "cmd" command
- // Input : *pEdict - the player who issued the command
- // Use engine.Cmd_Argv, engine.Cmd_Argv, and engine.Cmd_Argc to get
- // pointers the character string command.
- //-----------------------------------------------------------------------------
- bool CHalfLife2::ClientCommand( CBaseEntity *pEdict, const CCommand &args )
- {
- if( BaseClass::ClientCommand( pEdict, args ) )
- return true;
-
- CHL2_Player *pPlayer = (CHL2_Player *) pEdict;
-
- if ( pPlayer->ClientCommand( args ) )
- return true;
-
- return false;
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: Player has just spawned. Equip them.
- //-----------------------------------------------------------------------------
- void CHalfLife2::PlayerSpawn( CBasePlayer *pPlayer )
- {
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: MULTIPLAYER BODY QUE HANDLING
- //-----------------------------------------------------------------------------
- class CCorpse : public CBaseAnimating
- {
- public:
- DECLARE_CLASS( CCorpse, CBaseAnimating );
- DECLARE_SERVERCLASS();
-
- virtual int ObjectCaps( void ) { return FCAP_DONT_SAVE; }
-
- public:
- CNetworkVar( int, m_nReferencePlayer );
- };
-
- IMPLEMENT_SERVERCLASS_ST(CCorpse, DT_Corpse)
- SendPropInt( SENDINFO(m_nReferencePlayer), 10, SPROP_UNSIGNED )
- END_SEND_TABLE()
-
- LINK_ENTITY_TO_CLASS( bodyque, CCorpse );
-
-
- CCorpse *g_pBodyQueueHead;
-
- void InitBodyQue(void)
- {
- CCorpse *pEntity = ( CCorpse * )CreateEntityByName( "bodyque" );
- pEntity->AddEFlags( EFL_KEEP_ON_RECREATE_ENTITIES );
- g_pBodyQueueHead = pEntity;
- CCorpse *p = g_pBodyQueueHead;
-
- // Reserve 3 more slots for dead bodies
- for ( int i = 0; i < 3; i++ )
- {
- CCorpse *next = ( CCorpse * )CreateEntityByName( "bodyque" );
- next->AddEFlags( EFL_KEEP_ON_RECREATE_ENTITIES );
- p->SetOwnerEntity( next );
- p = next;
- }
-
- p->SetOwnerEntity( g_pBodyQueueHead );
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: make a body que entry for the given ent so the ent can be respawned elsewhere
- // GLOBALS ASSUMED SET: g_eoBodyQueueHead
- //-----------------------------------------------------------------------------
- void CopyToBodyQue( CBaseAnimating *pCorpse )
- {
- if ( pCorpse->IsEffectActive( EF_NODRAW ) )
- return;
-
- CCorpse *pHead = g_pBodyQueueHead;
-
- pHead->CopyAnimationDataFrom( pCorpse );
-
- pHead->SetMoveType( MOVETYPE_FLYGRAVITY );
- pHead->SetAbsVelocity( pCorpse->GetAbsVelocity() );
- pHead->ClearFlags();
- pHead->m_nReferencePlayer = ENTINDEX( pCorpse );
-
- pHead->SetLocalAngles( pCorpse->GetAbsAngles() );
- UTIL_SetOrigin(pHead, pCorpse->GetAbsOrigin());
-
- UTIL_SetSize(pHead, pCorpse->WorldAlignMins(), pCorpse->WorldAlignMaxs());
- g_pBodyQueueHead = (CCorpse *)pHead->GetOwnerEntity();
- }
-
- //------------------------------------------------------------------------------
- // Purpose : Initialize all default class relationships
- // Input :
- // Output :
- //------------------------------------------------------------------------------
- void CHalfLife2::InitDefaultAIRelationships( void )
- {
- int i, j;
-
- // Allocate memory for default relationships
- CBaseCombatCharacter::AllocateDefaultRelationships();
-
- // --------------------------------------------------------------
- // First initialize table so we can report missing relationships
- // --------------------------------------------------------------
- for (i=0;i<NUM_AI_CLASSES;i++)
- {
- for (j=0;j<NUM_AI_CLASSES;j++)
- {
- // By default all relationships are neutral of priority zero
- CBaseCombatCharacter::SetDefaultRelationship( (Class_T)i, (Class_T)j, D_NU, 0 );
- }
- }
-
- // ------------------------------------------------------------
- // > CLASS_ANTLION
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_NONE, D_NU, 0);
- 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_CITIZEN_PASSIVE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_COMBINE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_COMBINE_HUNTER, D_HT, 0);
- 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_MANHACK, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_SCANNER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_PROTOSNIPER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_ANTLION, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_BARNACLE
- //
- // In this case, the relationship D_HT indicates which characters
- // the barnacle will try to eat.
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_COMBINE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_EARTH_FAUNA, D_HT, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_BULLSEYE
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_PLAYER, D_NU, 0);
- 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_CITIZEN_PASSIVE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_CITIZEN_REBEL, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_COMBINE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_VORTIGAUNT, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_ZOMBIE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_EARTH_FAUNA, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_PLAYER_ALLY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_HACKED_ROLLERMINE,D_NU, 0);
-
- // ------------------------------------------------------------
- // > 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);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_BARNACLE, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_BULLSEYE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_BULLSQUID, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_CITIZEN_PASSIVE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_COMBINE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_COMBINE_HUNTER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_CONSCRIPT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_FLARE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_HEADCRAB, D_HT, 1);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_HOUNDEYE, D_HT, 1);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_MANHACK, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
- */
- // ------------------------------------------------------------
- // > CLASS_CITIZEN_PASSIVE
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_PLAYER, D_NU, 0);
- 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_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);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_COMBINE_HUNTER, D_FR, 0);
- 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_MANHACK, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_MISSILE, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_VORTIGAUNT, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_ZOMBIE, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_CITIZEN_REBEL
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_PLAYER, D_NU, 0);
- 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_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);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_COMBINE_HUNTER, D_HT, 0);
- 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_MANHACK, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_MISSILE, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_SCANNER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_VORTIGAUNT, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_COMBINE
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_COMBINE, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_COMBINE_GUNSHIP, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_COMBINE_HUNTER, D_LI, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_COMBINE_GUNSHIP
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_PLAYER, D_HT, 0);
- 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_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);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_COMBINE_GUNSHIP, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_COMBINE_HUNTER, D_LI, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_MISSILE, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_COMBINE_HUNTER
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_PLAYER, D_HT, 0);
- 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_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);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_COMBINE_GUNSHIP, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_COMBINE_HUNTER, D_LI, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_CONSCRIPT
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_PLAYER, D_NU, 0);
- 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_CITIZEN_PASSIVE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_CITIZEN_REBEL, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_COMBINE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_COMBINE_HUNTER, D_HT, 0);
- 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_MANHACK, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_SCANNER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_VORTIGAUNT, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_FLARE
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_PLAYER, D_NU, 0);
- 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_CITIZEN_PASSIVE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_CITIZEN_REBEL, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_COMBINE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_FLARE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_VORTIGAUNT, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_ZOMBIE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_EARTH_FAUNA, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_PLAYER_ALLY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_HACKED_ROLLERMINE,D_NU, 0);
-
- // ------------------------------------------------------------
- // > CLASS_HEADCRAB
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_COMBINE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_ZOMBIE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > 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_CITIZEN_PASSIVE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_COMBINE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_COMBINE_HUNTER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_CONSCRIPT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_FLARE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_HEADCRAB, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_HOUNDEYE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_ZOMBIE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
- */
-
- // ------------------------------------------------------------
- // > CLASS_MANHACK
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_COMBINE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_METROPOLICE
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_COMBINE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_MILITARY
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_COMBINE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_MISSILE
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_COMBINE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_NONE
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_PLAYER, D_NU, 0);
- 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_CITIZEN_PASSIVE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_CITIZEN_REBEL, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_COMBINE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_VORTIGAUNT, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_ZOMBIE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_EARTH_FAUNA, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_PLAYER_ALLY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_HACKED_ROLLERMINE,D_NU, 0);
-
- // ------------------------------------------------------------
- // > CLASS_PLAYER
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_PLAYER, D_NU, 0);
- 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_CITIZEN_PASSIVE, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_CITIZEN_REBEL, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_COMBINE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_COMBINE_GUNSHIP, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_COMBINE_HUNTER, D_HT, 0);
- 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_MANHACK, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_SCANNER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_VORTIGAUNT, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_PROTOSNIPER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_PLAYER_ALLY
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_PLAYER, D_LI, 0);
- 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_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);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_COMBINE_HUNTER, D_HT, 0);
- 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_MANHACK, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_SCANNER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_VORTIGAUNT, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_ZOMBIE, D_FR, 1);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_PROTOSNIPER, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_PLAYER_ALLY_VITAL
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_PLAYER, D_LI, 0);
- 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_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);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_COMBINE_HUNTER, D_FR, 0);
- 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_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);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_SCANNER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_VORTIGAUNT, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_PROTOSNIPER, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_SCANNER
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_COMBINE, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_COMBINE_GUNSHIP, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_COMBINE_HUNTER, D_LI, 0);
- 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_MANHACK, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_METROPOLICE, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_MILITARY, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_SCANNER, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_STALKER, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_ZOMBIE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_PROTOSNIPER, D_LI, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_STALKER
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_COMBINE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_ZOMBIE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_VORTIGAUNT
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_PLAYER, D_LI, 0);
- 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_CITIZEN_PASSIVE, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_CITIZEN_REBEL, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_COMBINE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_COMBINE_HUNTER, D_HT, 0);
- 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_MANHACK, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_SCANNER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_VORTIGAUNT, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_ZOMBIE
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_COMBINE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_COMBINE_HUNTER, D_HT, 0);
- 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_MANHACK, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_MILITARY, D_FR, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_ZOMBIE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_PROTOSNIPER
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_PLAYER, D_HT, 0);
- 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_CITIZEN_PASSIVE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_CITIZEN_REBEL, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_COMBINE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_METROPOLICE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_MILITARY, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_MISSILE, D_NU, 5);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_STALKER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_EARTH_FAUNA
- //
- // Hates pretty much everything equally except other earth fauna.
- // This will make the critter choose the nearest thing as its enemy.
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_NONE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_PLAYER, D_HT, 0);
- 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_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);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_COMBINE_GUNSHIP, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_COMBINE_HUNTER, D_HT, 0);
- 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_MANHACK, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_MISSILE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_SCANNER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_VORTIGAUNT, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_ZOMBIE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_PROTOSNIPER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_EARTH_FAUNA, D_NU, 0);
- 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);
-
- // ------------------------------------------------------------
- // > CLASS_HACKED_ROLLERMINE
- // ------------------------------------------------------------
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_NONE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_PLAYER, D_LI, 0);
- 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_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);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_COMBINE_HUNTER, D_NU, 0);
- 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_MANHACK, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_METROPOLICE, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_MILITARY, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_MISSILE, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_SCANNER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_STALKER, D_HT, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_VORTIGAUNT, D_LI, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_ZOMBIE, D_HT, 1);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_PROTOSNIPER, D_NU, 0);
- CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_EARTH_FAUNA, D_HT, 0);
- 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);
- }
-
-
- //------------------------------------------------------------------------------
- // Purpose : Return classify text for classify type
- // Input :
- // Output :
- //------------------------------------------------------------------------------
- const char* CHalfLife2::AIClassText(int classType)
- {
- switch (classType)
- {
- case CLASS_NONE: return "CLASS_NONE";
- case CLASS_PLAYER: return "CLASS_PLAYER";
- case CLASS_ANTLION: return "CLASS_ANTLION";
- case CLASS_BARNACLE: return "CLASS_BARNACLE";
- case CLASS_BULLSEYE: return "CLASS_BULLSEYE";
- //case CLASS_BULLSQUID: return "CLASS_BULLSQUID";
- case CLASS_CITIZEN_PASSIVE: return "CLASS_CITIZEN_PASSIVE";
- case CLASS_CITIZEN_REBEL: return "CLASS_CITIZEN_REBEL";
- case CLASS_COMBINE: return "CLASS_COMBINE";
- case CLASS_COMBINE_GUNSHIP: return "CLASS_COMBINE_GUNSHIP";
- case CLASS_COMBINE_HUNTER: return "CLASS_COMBINE_HUNTER";
- case CLASS_CONSCRIPT: return "CLASS_CONSCRIPT";
- case CLASS_HEADCRAB: return "CLASS_HEADCRAB";
- //case CLASS_HOUNDEYE: return "CLASS_HOUNDEYE";
- case CLASS_MANHACK: return "CLASS_MANHACK";
- case CLASS_METROPOLICE: return "CLASS_METROPOLICE";
- case CLASS_MILITARY: return "CLASS_MILITARY";
- case CLASS_SCANNER: return "CLASS_SCANNER";
- case CLASS_STALKER: return "CLASS_STALKER";
- case CLASS_VORTIGAUNT: return "CLASS_VORTIGAUNT";
- case CLASS_ZOMBIE: return "CLASS_ZOMBIE";
- case CLASS_PROTOSNIPER: return "CLASS_PROTOSNIPER";
- case CLASS_MISSILE: return "CLASS_MISSILE";
- case CLASS_FLARE: return "CLASS_FLARE";
- case CLASS_EARTH_FAUNA: return "CLASS_EARTH_FAUNA";
-
- default: return "MISSING CLASS in ClassifyText()";
- }
- }
-
- void CHalfLife2::PlayerThink( CBasePlayer *pPlayer )
- {
- }
-
- void CHalfLife2::Think( void )
- {
- BaseClass::Think();
-
- if( physcannon_mega_enabled.GetBool() == true )
- {
- m_bMegaPhysgun = true;
- }
- else
- {
- // FIXME: Is there a better place for this?
- m_bMegaPhysgun = ( GlobalEntity_GetState("super_phys_gun") == GLOBAL_ON );
- }
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: Returns how much damage the given ammo type should do to the victim
- // when fired by the attacker.
- // Input : pAttacker - Dude what shot the gun.
- // pVictim - Dude what done got shot.
- // nAmmoType - What been shot out.
- // Output : How much hurt to put on dude what done got shot (pVictim).
- //-----------------------------------------------------------------------------
- float CHalfLife2::GetAmmoDamage( CBaseEntity *pAttacker, CBaseEntity *pVictim, int nAmmoType )
- {
- float flDamage = 0.0f;
- CAmmoDef *pAmmoDef = GetAmmoDef();
-
- if ( pAmmoDef->DamageType( nAmmoType ) & DMG_SNIPER )
- {
- // If this damage is from a SNIPER, we do damage based on what the bullet
- // HITS, not who fired it. All other bullets have their damage values
- // arranged according to the owner of the bullet, not the recipient.
- if ( pVictim->IsPlayer() )
- {
- // Player
- flDamage = pAmmoDef->PlrDamage( nAmmoType );
- }
- else
- {
- // NPC or breakable
- flDamage = pAmmoDef->NPCDamage( nAmmoType );
- }
- }
- else
- {
- flDamage = BaseClass::GetAmmoDamage( pAttacker, pVictim, nAmmoType );
- }
-
- if( pAttacker->IsPlayer() && pVictim->IsNPC() )
- {
- if( pVictim->MyCombatCharacterPointer() )
- {
- // Player is shooting an NPC. Adjust the damage! This protects breakables
- // and other 'non-living' entities from being easier/harder to break
- // in different skill levels.
- flDamage = pAmmoDef->PlrDamage( nAmmoType );
- flDamage = AdjustPlayerDamageInflicted( flDamage );
- }
- }
-
- return flDamage;
- }
-
- //-----------------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- bool CHalfLife2::AllowDamage( CBaseEntity *pVictim, const CTakeDamageInfo &info )
- {
-#ifndef CLIENT_DLL
- if( (info.GetDamageType() & DMG_CRUSH) && info.GetInflictor() && pVictim->MyNPCPointer() )
- {
- if( pVictim->MyNPCPointer()->IsPlayerAlly() )
- {
- // A physics object has struck a player ally. Don't allow damage if it
- // came from the player's physcannon.
- CBasePlayer *pPlayer = UTIL_PlayerByIndex(1);
-
- if( pPlayer )
- {
- CBaseEntity *pWeapon = pPlayer->HasNamedPlayerItem("weapon_physcannon");
-
- if( pWeapon )
- {
- CBaseCombatWeapon *pCannon = assert_cast <CBaseCombatWeapon*>(pWeapon);
-
- if( pCannon )
- {
- if( PhysCannonAccountableForObject(pCannon, info.GetInflictor() ) )
- {
- // Antlions can always be squashed!
- if ( pVictim->Classify() == CLASS_ANTLION )
- return true;
-
- return false;
- }
- }
- }
- }
- }
- }
-#endif
- return true;
- }
- //-----------------------------------------------------------------------------
- // Purpose: Whether or not the NPC should drop a health vial
- // Output : Returns true on success, false on failure.
- //-----------------------------------------------------------------------------
- bool CHalfLife2::NPC_ShouldDropHealth( CBasePlayer *pRecipient )
- {
- // Can only do this every so often
- if ( m_flLastHealthDropTime > gpGlobals->curtime )
- return false;
-
- //Try to throw dynamic health
- float healthPerc = ( (float) pRecipient->m_iHealth / (float) pRecipient->m_iMaxHealth );
-
- if ( random->RandomFloat( 0.0f, 1.0f ) > healthPerc*1.5f )
- return true;
-
- return false;
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: Whether or not the NPC should drop a health vial
- // Output : Returns true on success, false on failure.
- //-----------------------------------------------------------------------------
- bool CHalfLife2::NPC_ShouldDropGrenade( CBasePlayer *pRecipient )
- {
- // Can only do this every so often
- if ( m_flLastGrenadeDropTime > gpGlobals->curtime )
- return false;
-
- int grenadeIndex = GetAmmoDef()->Index( "grenade" );
- int numGrenades = pRecipient->GetAmmoCount( grenadeIndex );
-
- // If we're not maxed out on grenades and we've randomly okay'd it
- if ( ( numGrenades < GetAmmoDef()->MaxCarry( grenadeIndex ) ) && ( random->RandomInt( 0, 2 ) == 0 ) )
- return true;
-
- return false;
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: Update the drop counter for health
- //-----------------------------------------------------------------------------
- void CHalfLife2::NPC_DroppedHealth( void )
- {
- m_flLastHealthDropTime = gpGlobals->curtime + sk_plr_health_drop_time.GetFloat();
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: Update the drop counter for grenades
- //-----------------------------------------------------------------------------
- void CHalfLife2::NPC_DroppedGrenade( void )
- {
- m_flLastGrenadeDropTime = gpGlobals->curtime + sk_plr_grenade_drop_time.GetFloat();
- }
-
-#endif //} !CLIENT_DLL
-
-
-// ------------------------------------------------------------------------------------ //
-// Shared CHalfLife2 implementation.
-// ------------------------------------------------------------------------------------ //
-bool CHalfLife2::ShouldCollide( int collisionGroup0, int collisionGroup1 )
-{
- // The smaller number is always first
- if ( collisionGroup0 > collisionGroup1 )
- {
- // swap so that lowest is always first
- int tmp = collisionGroup0;
- collisionGroup0 = collisionGroup1;
- collisionGroup1 = tmp;
- }
-
- // Prevent the player movement from colliding with spit globs (caused the player to jump on top of globs while in water)
- if ( collisionGroup0 == COLLISION_GROUP_PLAYER_MOVEMENT && collisionGroup1 == HL2COLLISION_GROUP_SPIT )
- return false;
-
- // HL2 treats movement and tracing against players the same, so just remap here
- if ( collisionGroup0 == COLLISION_GROUP_PLAYER_MOVEMENT )
- {
- collisionGroup0 = COLLISION_GROUP_PLAYER;
- }
-
- if( collisionGroup1 == COLLISION_GROUP_PLAYER_MOVEMENT )
- {
- collisionGroup1 = COLLISION_GROUP_PLAYER;
- }
-
- //If collisionGroup0 is not a player then NPC_ACTOR behaves just like an NPC.
- if ( collisionGroup1 == COLLISION_GROUP_NPC_ACTOR && collisionGroup0 != COLLISION_GROUP_PLAYER )
- {
- collisionGroup1 = COLLISION_GROUP_NPC;
- }
-
- // This is only for the super physcannon
- if ( m_bMegaPhysgun )
- {
- if ( collisionGroup0 == COLLISION_GROUP_INTERACTIVE_DEBRIS && collisionGroup1 == COLLISION_GROUP_PLAYER )
- return false;
- }
-
- if ( collisionGroup0 == HL2COLLISION_GROUP_COMBINE_BALL )
- {
- if ( collisionGroup1 == HL2COLLISION_GROUP_COMBINE_BALL )
- return false;
- }
-
- if ( collisionGroup0 == HL2COLLISION_GROUP_COMBINE_BALL && collisionGroup1 == HL2COLLISION_GROUP_COMBINE_BALL_NPC )
- return false;
-
- if ( ( collisionGroup0 == COLLISION_GROUP_WEAPON ) ||
- ( collisionGroup0 == COLLISION_GROUP_PLAYER ) ||
- ( collisionGroup0 == COLLISION_GROUP_PROJECTILE ) )
- {
- if ( collisionGroup1 == HL2COLLISION_GROUP_COMBINE_BALL )
- return false;
- }
-
- if ( collisionGroup0 == COLLISION_GROUP_DEBRIS )
- {
- if ( collisionGroup1 == HL2COLLISION_GROUP_COMBINE_BALL )
- return true;
- }
-
- if (collisionGroup0 == HL2COLLISION_GROUP_HOUNDEYE && collisionGroup1 == HL2COLLISION_GROUP_HOUNDEYE )
- return false;
-
- if (collisionGroup0 == HL2COLLISION_GROUP_HOMING_MISSILE && collisionGroup1 == HL2COLLISION_GROUP_HOMING_MISSILE )
- return false;
-
- if ( collisionGroup1 == HL2COLLISION_GROUP_CROW )
- {
- if ( collisionGroup0 == COLLISION_GROUP_PLAYER || collisionGroup0 == COLLISION_GROUP_NPC ||
- collisionGroup0 == HL2COLLISION_GROUP_CROW )
- return false;
- }
-
- if ( ( collisionGroup0 == HL2COLLISION_GROUP_HEADCRAB ) && ( collisionGroup1 == HL2COLLISION_GROUP_HEADCRAB ) )
- return false;
-
- // striders don't collide with other striders
- if ( collisionGroup0 == HL2COLLISION_GROUP_STRIDER && collisionGroup1 == HL2COLLISION_GROUP_STRIDER )
- return false;
-
- // gunships don't collide with other gunships
- if ( collisionGroup0 == HL2COLLISION_GROUP_GUNSHIP && collisionGroup1 == HL2COLLISION_GROUP_GUNSHIP )
- return false;
-
- // weapons and NPCs don't collide
- if ( collisionGroup0 == COLLISION_GROUP_WEAPON && (collisionGroup1 >= HL2COLLISION_GROUP_FIRST_NPC && collisionGroup1 <= HL2COLLISION_GROUP_LAST_NPC ) )
- return false;
-
- //players don't collide against NPC Actors.
- //I could've done this up where I check if collisionGroup0 is NOT a player but I decided to just
- //do what the other checks are doing in this function for consistency sake.
- if ( collisionGroup1 == COLLISION_GROUP_NPC_ACTOR && collisionGroup0 == COLLISION_GROUP_PLAYER )
- return false;
-
- // In cases where NPCs are playing a script which causes them to interpenetrate while riding on another entity,
- // such as a train or elevator, you need to disable collisions between the actors so the mover can move them.
- if ( collisionGroup0 == COLLISION_GROUP_NPC_SCRIPTED && collisionGroup1 == COLLISION_GROUP_NPC_SCRIPTED )
- return false;
-
- // Spit doesn't touch other spit
- if ( collisionGroup0 == HL2COLLISION_GROUP_SPIT && collisionGroup1 == HL2COLLISION_GROUP_SPIT )
- return false;
-
- return BaseClass::ShouldCollide( collisionGroup0, collisionGroup1 );
-}
-
-#ifndef CLIENT_DLL
-//---------------------------------------------------------
-//---------------------------------------------------------
-void CHalfLife2::AdjustPlayerDamageTaken( CTakeDamageInfo *pInfo )
-{
- if( pInfo->GetDamageType() & (DMG_DROWN|DMG_CRUSH|DMG_FALL|DMG_POISON|DMG_SNIPER) )
- {
- // Skill level doesn't affect these types of damage.
- return;
- }
-
- switch( GetSkillLevel() )
- {
- case SKILL_EASY:
- pInfo->ScaleDamage( sk_dmg_take_scale1.GetFloat() );
- break;
-
- case SKILL_MEDIUM:
- pInfo->ScaleDamage( sk_dmg_take_scale2.GetFloat() );
- break;
-
- case SKILL_HARD:
- pInfo->ScaleDamage( sk_dmg_take_scale3.GetFloat() );
- break;
- }
-}
-
-//---------------------------------------------------------
-//---------------------------------------------------------
-float CHalfLife2::AdjustPlayerDamageInflicted( float damage )
-{
- switch( GetSkillLevel() )
- {
- case SKILL_EASY:
- return damage * sk_dmg_inflict_scale1.GetFloat();
- break;
-
- case SKILL_MEDIUM:
- return damage * sk_dmg_inflict_scale2.GetFloat();
- break;
-
- case SKILL_HARD:
- return damage * sk_dmg_inflict_scale3.GetFloat();
- break;
-
- default:
- return damage;
- break;
- }
-}
-#endif//CLIENT_DLL
-
-//---------------------------------------------------------
-//---------------------------------------------------------
-bool CHalfLife2::ShouldUseRobustRadiusDamage(CBaseEntity *pEntity)
-{
-#ifdef CLIENT_DLL
- return false;
-#endif
-
- if( !sv_robust_explosions.GetBool() )
- return false;
-
- if( !pEntity->IsNPC() )
- {
- // Only NPC's
- return false;
- }
-
-#ifndef CLIENT_DLL
- CAI_BaseNPC *pNPC = pEntity->MyNPCPointer();
- if( pNPC->CapabilitiesGet() & bits_CAP_SIMPLE_RADIUS_DAMAGE )
- {
- // This NPC only eligible for simple radius damage.
- return false;
- }
-#endif//CLIENT_DLL
-
- return true;
-}
-
-#ifndef CLIENT_DLL
-//---------------------------------------------------------
-//---------------------------------------------------------
-bool CHalfLife2::ShouldAutoAim( CBasePlayer *pPlayer, edict_t *target )
-{
- return sk_allow_autoaim.GetBool() != 0;
-}
-
-//---------------------------------------------------------
-//---------------------------------------------------------
-float CHalfLife2::GetAutoAimScale( CBasePlayer *pPlayer )
-{
-#ifdef _X360
- return 1.0f;
-#else
- switch( GetSkillLevel() )
- {
- case SKILL_EASY:
- return sk_autoaim_scale1.GetFloat();
-
- case SKILL_MEDIUM:
- return sk_autoaim_scale2.GetFloat();
-
- default:
- return 0.0f;
- }
-#endif
-}
-
-//---------------------------------------------------------
-//---------------------------------------------------------
-float CHalfLife2::GetAmmoQuantityScale( int iAmmoIndex )
-{
- switch( GetSkillLevel() )
- {
- case SKILL_EASY:
- return sk_ammo_qty_scale1.GetFloat();
-
- case SKILL_MEDIUM:
- return sk_ammo_qty_scale2.GetFloat();
-
- case SKILL_HARD:
- return sk_ammo_qty_scale3.GetFloat();
-
- default:
- return 0.0f;
- }
-}
-
-void CHalfLife2::LevelInitPreEntity()
-{
- // Remove this if you fix the bug in ep1 where the striders need to touch
- // triggers using their absbox instead of their bbox
-#ifdef HL2_EPISODIC
- if ( !Q_strnicmp( gpGlobals->mapname.ToCStr(), "ep1_", 4 ) )
- {
- // episode 1 maps use the surrounding box trigger behavior
- CBaseEntity::sm_bAccurateTriggerBboxChecks = false;
- }
-#endif
- BaseClass::LevelInitPreEntity();
-}
-
-//-----------------------------------------------------------------------------
-// Returns whether or not Alyx cares about light levels in order to see.
-//-----------------------------------------------------------------------------
-bool CHalfLife2::IsAlyxInDarknessMode()
-{
-#ifdef HL2_EPISODIC
- if ( alyx_darkness_force.GetBool() )
- return true;
-
- return ( GlobalEntity_GetState( "ep_alyx_darknessmode" ) == GLOBAL_ON );
-#else
- return false;
-#endif // HL2_EPISODIC
-}
-
-
-//-----------------------------------------------------------------------------
-// This takes the long way around to see if a prop should emit a DLIGHT when it
-// ignites, to avoid having Alyx-related code in props.cpp.
-//-----------------------------------------------------------------------------
-bool CHalfLife2::ShouldBurningPropsEmitLight()
-{
-#ifdef HL2_EPISODIC
- return IsAlyxInDarknessMode();
-#else
- return false;
-#endif // HL2_EPISODIC
-}
-
-
-#endif//CLIENT_DLL
-
-// ------------------------------------------------------------------------------------ //
-// Global functions.
-// ------------------------------------------------------------------------------------ //
-
-#ifndef HL2MP
-#ifndef PORTAL
-
-// shared ammo definition
-// JAY: Trying to make a more physical bullet response
-#define BULLET_MASS_GRAINS_TO_LB(grains) (0.002285*(grains)/16.0f)
-#define BULLET_MASS_GRAINS_TO_KG(grains) lbs2kg(BULLET_MASS_GRAINS_TO_LB(grains))
-
-// exaggerate all of the forces, but use real numbers to keep them consistent
-#define BULLET_IMPULSE_EXAGGERATION 3.5
-// convert a velocity in ft/sec and a mass in grains to an impulse in kg in/s
-#define BULLET_IMPULSE(grains, ftpersec) ((ftpersec)*12*BULLET_MASS_GRAINS_TO_KG(grains)*BULLET_IMPULSE_EXAGGERATION)
-
-
-CAmmoDef *GetAmmoDef()
-{
- static CAmmoDef def;
- static bool bInitted = false;
-
- if ( !bInitted )
- {
- bInitted = true;
-
- def.AddAmmoType("AR2", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_ar2", "sk_npc_dmg_ar2", "sk_max_ar2", BULLET_IMPULSE(200, 1225), 0 );
- def.AddAmmoType("AlyxGun", DMG_BULLET, TRACER_LINE, "sk_plr_dmg_alyxgun", "sk_npc_dmg_alyxgun", "sk_max_alyxgun", BULLET_IMPULSE(200, 1225), 0 );
- def.AddAmmoType("Pistol", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_pistol", "sk_npc_dmg_pistol", "sk_max_pistol", BULLET_IMPULSE(200, 1225), 0 );
- def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_smg1", "sk_npc_dmg_smg1", "sk_max_smg1", BULLET_IMPULSE(200, 1225), 0 );
- def.AddAmmoType("357", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_357", "sk_npc_dmg_357", "sk_max_357", BULLET_IMPULSE(800, 5000), 0 );
- def.AddAmmoType("XBowBolt", DMG_BULLET, TRACER_LINE, "sk_plr_dmg_crossbow", "sk_npc_dmg_crossbow", "sk_max_crossbow", BULLET_IMPULSE(800, 8000), 0 );
-
- def.AddAmmoType("Buckshot", DMG_BULLET | DMG_BUCKSHOT, TRACER_LINE, "sk_plr_dmg_buckshot", "sk_npc_dmg_buckshot", "sk_max_buckshot", BULLET_IMPULSE(400, 1200), 0 );
- def.AddAmmoType("RPG_Round", DMG_BURN, TRACER_NONE, "sk_plr_dmg_rpg_round", "sk_npc_dmg_rpg_round", "sk_max_rpg_round", 0, 0 );
- def.AddAmmoType("SMG1_Grenade", DMG_BURN, TRACER_NONE, "sk_plr_dmg_smg1_grenade", "sk_npc_dmg_smg1_grenade", "sk_max_smg1_grenade", 0, 0 );
- def.AddAmmoType("SniperRound", DMG_BULLET | DMG_SNIPER, TRACER_NONE, "sk_plr_dmg_sniper_round", "sk_npc_dmg_sniper_round", "sk_max_sniper_round", BULLET_IMPULSE(650, 6000), 0 );
- def.AddAmmoType("SniperPenetratedRound", DMG_BULLET | DMG_SNIPER, TRACER_NONE, "sk_dmg_sniper_penetrate_plr", "sk_dmg_sniper_penetrate_npc", "sk_max_sniper_round", BULLET_IMPULSE(150, 6000), 0 );
- def.AddAmmoType("Grenade", DMG_BURN, TRACER_NONE, "sk_plr_dmg_grenade", "sk_npc_dmg_grenade", "sk_max_grenade", 0, 0);
- def.AddAmmoType("Thumper", DMG_SONIC, TRACER_NONE, 10, 10, 2, 0, 0 );
- def.AddAmmoType("Gravity", DMG_CLUB, TRACER_NONE, 0, 0, 8, 0, 0 );
-// def.AddAmmoType("Extinguisher", DMG_BURN, TRACER_NONE, 0, 0, 100, 0, 0 );
- def.AddAmmoType("Battery", DMG_CLUB, TRACER_NONE, NULL, NULL, NULL, 0, 0 );
- def.AddAmmoType("GaussEnergy", DMG_SHOCK, TRACER_NONE, "sk_jeep_gauss_damage", "sk_jeep_gauss_damage", "sk_max_gauss_round", BULLET_IMPULSE(650, 8000), 0 ); // hit like a 10kg weight at 400 in/s
- 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 );
-
- //=====================================================================
- // STRIDER MINIGUN DAMAGE - Pull up a chair and I'll tell you a tale.
- //
- // When we shipped Half-Life 2 in 2004, we were unaware of a bug in
- // CAmmoDef::NPCDamage() which was returning the MaxCarry field of
- // an ammotype as the amount of damage that should be done to a NPC
- // by that type of ammo. Thankfully, the bug only affected Ammo Types
- // that DO NOT use ConVars to specify their parameters. As you can see,
- // all of the important ammotypes use ConVars, so the effect of the bug
- // was limited. The Strider Minigun was affected, though.
- //
- // According to my perforce Archeology, we intended to ship the Strider
- // Minigun ammo type to do 15 points of damage per shot, and we did.
- // To achieve this we, unaware of the bug, set the Strider Minigun ammo
- // type to have a maxcarry of 15, since our observation was that the
- // number that was there before (8) was indeed the amount of damage being
- // done to NPC's at the time. So we changed the field that was incorrectly
- // being used as the NPC Damage field.
- //
- // The bug was fixed during Episode 1's development. The result of the
- // bug fix was that the Strider was reduced to doing 5 points of damage
- // to NPC's, since 5 is the value that was being assigned as NPC damage
- // even though the code was returning 15 up to that point.
- //
- // Now as we go to ship Orange Box, we discover that the Striders in
- // Half-Life 2 are hugely ineffective against citizens, causing big
- // problems in maps 12 and 13.
- //
- // In order to restore balance to HL2 without upsetting the delicate
- // balance of ep2_outland_12, I have chosen to build Episodic binaries
- // with 5 as the Strider->NPC damage, since that's the value that has
- // been in place for all of Episode 2's development. Half-Life 2 will
- // build with 15 as the Strider->NPC damage, which is how HL2 shipped
- // originally, only this time the 15 is located in the correct field
- // now that the AmmoDef code is behaving correctly.
- //
- //=====================================================================
-#ifdef HL2_EPISODIC
- def.AddAmmoType("StriderMinigun", DMG_BULLET, TRACER_LINE, 5, 5, 15, 1.0 * 750 * 12, AMMO_FORCE_DROP_IF_CARRIED ); // hit like a 1.0kg weight at 750 ft/s
-#else
- def.AddAmmoType("StriderMinigun", DMG_BULLET, TRACER_LINE, 5, 15,15, 1.0 * 750 * 12, AMMO_FORCE_DROP_IF_CARRIED ); // hit like a 1.0kg weight at 750 ft/s
-#endif//HL2_EPISODIC
-
- def.AddAmmoType("StriderMinigunDirect", DMG_BULLET, TRACER_LINE, 2, 2, 15, 1.0 * 750 * 12, AMMO_FORCE_DROP_IF_CARRIED ); // hit like a 1.0kg weight at 750 ft/s
- def.AddAmmoType("HelicopterGun", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_npc_dmg_helicopter_to_plr", "sk_npc_dmg_helicopter", "sk_max_smg1", BULLET_IMPULSE(400, 1225), AMMO_FORCE_DROP_IF_CARRIED | AMMO_INTERPRET_PLRDAMAGE_AS_DAMAGE_TO_PLAYER );
- def.AddAmmoType("AR2AltFire", DMG_DISSOLVE, TRACER_NONE, 0, 0, "sk_max_ar2_altfire", 0, 0 );
- def.AddAmmoType("Grenade", DMG_BURN, TRACER_NONE, "sk_plr_dmg_grenade", "sk_npc_dmg_grenade", "sk_max_grenade", 0, 0);
-#ifdef HL2_EPISODIC
- def.AddAmmoType("Hopwire", DMG_BLAST, TRACER_NONE, "sk_plr_dmg_grenade", "sk_npc_dmg_grenade", "sk_max_hopwire", 0, 0);
- def.AddAmmoType("CombineHeavyCannon", DMG_BULLET, TRACER_LINE, 40, 40, NULL, 10 * 750 * 12, AMMO_FORCE_DROP_IF_CARRIED ); // hit like a 10 kg weight at 750 ft/s
- def.AddAmmoType("ammo_proto1", DMG_BULLET, TRACER_LINE, 0, 0, 10, 0, 0 );
-#endif // HL2_EPISODIC
- }
-
- return &def;
-}
-
-#endif
-#endif
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: The Half-Life 2 game rules, such as the relationship tables and ammo
+// damage cvars.
+//
+//=============================================================================
+
+#include "cbase.h"
+#include "hl2_gamerules.h"
+#include "ammodef.h"
+#include "hl2_shareddefs.h"
+
+#ifdef CLIENT_DLL
+
+#else
+ #include "player.h"
+ #include "game.h"
+ #include "gamerules.h"
+ #include "teamplay_gamerules.h"
+ #include "hl2_player.h"
+ #include "voice_gamemgr.h"
+ #include "globalstate.h"
+ #include "ai_basenpc.h"
+ #include "weapon_physcannon.h"
+#endif
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+
+REGISTER_GAMERULES_CLASS( CHalfLife2 );
+
+BEGIN_NETWORK_TABLE_NOBASE( CHalfLife2, DT_HL2GameRules )
+ #ifdef CLIENT_DLL
+ RecvPropBool( RECVINFO( m_bMegaPhysgun ) ),
+ #else
+ SendPropBool( SENDINFO( m_bMegaPhysgun ) ),
+ #endif
+END_NETWORK_TABLE()
+
+
+LINK_ENTITY_TO_CLASS( hl2_gamerules, CHalfLife2Proxy );
+IMPLEMENT_NETWORKCLASS_ALIASED( HalfLife2Proxy, DT_HalfLife2Proxy )
+
+
+#ifdef CLIENT_DLL
+ void RecvProxy_HL2GameRules( const RecvProp *pProp, void **pOut, void *pData, int objectID )
+ {
+ CHalfLife2 *pRules = HL2GameRules();
+ Assert( pRules );
+ *pOut = pRules;
+ }
+
+ BEGIN_RECV_TABLE( CHalfLife2Proxy, DT_HalfLife2Proxy )
+ RecvPropDataTable( "hl2_gamerules_data", 0, 0, &REFERENCE_RECV_TABLE( DT_HL2GameRules ), RecvProxy_HL2GameRules )
+ END_RECV_TABLE()
+#else
+ void* SendProxy_HL2GameRules( const SendProp *pProp, const void *pStructBase, const void *pData, CSendProxyRecipients *pRecipients, int objectID )
+ {
+ CHalfLife2 *pRules = HL2GameRules();
+ Assert( pRules );
+ pRecipients->SetAllRecipients();
+ return pRules;
+ }
+
+ BEGIN_SEND_TABLE( CHalfLife2Proxy, DT_HalfLife2Proxy )
+ SendPropDataTable( "hl2_gamerules_data", 0, &REFERENCE_SEND_TABLE( DT_HL2GameRules ), SendProxy_HL2GameRules )
+ END_SEND_TABLE()
+#endif
+
+ConVar physcannon_mega_enabled( "physcannon_mega_enabled", "0", FCVAR_CHEAT | FCVAR_REPLICATED );
+
+// Controls the application of the robus radius damage model.
+ConVar sv_robust_explosions( "sv_robust_explosions","1", FCVAR_REPLICATED );
+
+// Damage scale for damage inflicted by the player on each skill level.
+ConVar sk_dmg_inflict_scale1( "sk_dmg_inflict_scale1", "1.50", FCVAR_REPLICATED );
+ConVar sk_dmg_inflict_scale2( "sk_dmg_inflict_scale2", "1.00", FCVAR_REPLICATED );
+ConVar sk_dmg_inflict_scale3( "sk_dmg_inflict_scale3", "0.75", FCVAR_REPLICATED );
+
+// Damage scale for damage taken by the player on each skill level.
+ConVar sk_dmg_take_scale1( "sk_dmg_take_scale1", "0.50", FCVAR_REPLICATED );
+ConVar sk_dmg_take_scale2( "sk_dmg_take_scale2", "1.00", FCVAR_REPLICATED );
+#ifdef HL2_EPISODIC
+ ConVar sk_dmg_take_scale3( "sk_dmg_take_scale3", "2.0", FCVAR_REPLICATED );
+#else
+ ConVar sk_dmg_take_scale3( "sk_dmg_take_scale3", "1.50", FCVAR_REPLICATED );
+#endif//HL2_EPISODIC
+
+ConVar sk_allow_autoaim( "sk_allow_autoaim", "1", FCVAR_REPLICATED | FCVAR_ARCHIVE_XBOX );
+
+// Autoaim scale
+ConVar sk_autoaim_scale1( "sk_autoaim_scale1", "1.0", FCVAR_REPLICATED );
+ConVar sk_autoaim_scale2( "sk_autoaim_scale2", "1.0", FCVAR_REPLICATED );
+//ConVar sk_autoaim_scale3( "sk_autoaim_scale3", "0.0", FCVAR_REPLICATED ); NOT CURRENTLY OFFERED ON SKILL 3
+
+// Quantity scale for ammo received by the player.
+ConVar sk_ammo_qty_scale1 ( "sk_ammo_qty_scale1", "1.20", FCVAR_REPLICATED );
+ConVar sk_ammo_qty_scale2 ( "sk_ammo_qty_scale2", "1.00", FCVAR_REPLICATED );
+ConVar sk_ammo_qty_scale3 ( "sk_ammo_qty_scale3", "0.60", FCVAR_REPLICATED );
+
+ConVar sk_plr_health_drop_time ( "sk_plr_health_drop_time", "30", FCVAR_REPLICATED );
+ConVar sk_plr_grenade_drop_time ( "sk_plr_grenade_drop_time", "30", FCVAR_REPLICATED );
+
+ConVar sk_plr_dmg_ar2 ( "sk_plr_dmg_ar2","0", FCVAR_REPLICATED );
+ConVar sk_npc_dmg_ar2 ( "sk_npc_dmg_ar2","0", FCVAR_REPLICATED);
+ConVar sk_max_ar2 ( "sk_max_ar2","0", FCVAR_REPLICATED);
+ConVar sk_max_ar2_altfire ( "sk_max_ar2_altfire","0", FCVAR_REPLICATED);
+
+ConVar sk_plr_dmg_alyxgun ( "sk_plr_dmg_alyxgun","0", FCVAR_REPLICATED );
+ConVar sk_npc_dmg_alyxgun ( "sk_npc_dmg_alyxgun","0", FCVAR_REPLICATED);
+ConVar sk_max_alyxgun ( "sk_max_alyxgun","0", FCVAR_REPLICATED);
+
+ConVar sk_plr_dmg_pistol ( "sk_plr_dmg_pistol","0", FCVAR_REPLICATED );
+ConVar sk_npc_dmg_pistol ( "sk_npc_dmg_pistol","0", FCVAR_REPLICATED);
+ConVar sk_max_pistol ( "sk_max_pistol","0", FCVAR_REPLICATED);
+
+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_buckshot ( "sk_plr_dmg_buckshot","0", FCVAR_REPLICATED);
+ConVar sk_npc_dmg_buckshot ( "sk_npc_dmg_buckshot","0", FCVAR_REPLICATED);
+ConVar sk_max_buckshot ( "sk_max_buckshot","0", FCVAR_REPLICATED);
+ConVar sk_plr_num_shotgun_pellets( "sk_plr_num_shotgun_pellets","7", FCVAR_REPLICATED);
+
+ConVar sk_plr_dmg_rpg_round ( "sk_plr_dmg_rpg_round","0", FCVAR_REPLICATED);
+ConVar sk_npc_dmg_rpg_round ( "sk_npc_dmg_rpg_round","0", FCVAR_REPLICATED);
+ConVar sk_max_rpg_round ( "sk_max_rpg_round","0", FCVAR_REPLICATED);
+
+ConVar sk_plr_dmg_sniper_round ( "sk_plr_dmg_sniper_round","0", FCVAR_REPLICATED);
+ConVar sk_npc_dmg_sniper_round ( "sk_npc_dmg_sniper_round","0", FCVAR_REPLICATED);
+ConVar sk_max_sniper_round ( "sk_max_sniper_round","0", FCVAR_REPLICATED);
+
+//ConVar sk_max_slam ( "sk_max_slam","0", FCVAR_REPLICATED);
+//ConVar sk_max_tripwire ( "sk_max_tripwire","0", FCVAR_REPLICATED);
+
+//ConVar sk_plr_dmg_molotov ( "sk_plr_dmg_molotov","0", FCVAR_REPLICATED);
+//ConVar sk_npc_dmg_molotov ( "sk_npc_dmg_molotov","0", FCVAR_REPLICATED);
+//ConVar sk_max_molotov ( "sk_max_molotov","0", FCVAR_REPLICATED);
+
+ConVar sk_plr_dmg_grenade ( "sk_plr_dmg_grenade","0", FCVAR_REPLICATED);
+ConVar sk_npc_dmg_grenade ( "sk_npc_dmg_grenade","0", FCVAR_REPLICATED);
+ConVar sk_max_grenade ( "sk_max_grenade","0", FCVAR_REPLICATED);
+
+#ifdef HL2_EPISODIC
+ConVar sk_max_hopwire ( "sk_max_hopwire", "3", FCVAR_REPLICATED);
+ConVar sk_max_striderbuster ( "sk_max_striderbuster", "3", FCVAR_REPLICATED);
+#endif
+
+//ConVar sk_plr_dmg_brickbat ( "sk_plr_dmg_brickbat","0", FCVAR_REPLICATED);
+//ConVar sk_npc_dmg_brickbat ( "sk_npc_dmg_brickbat","0", FCVAR_REPLICATED);
+//ConVar sk_max_brickbat ( "sk_max_brickbat","0", FCVAR_REPLICATED);
+
+ConVar sk_plr_dmg_smg1_grenade ( "sk_plr_dmg_smg1_grenade","0", FCVAR_REPLICATED);
+ConVar sk_npc_dmg_smg1_grenade ( "sk_npc_dmg_smg1_grenade","0", FCVAR_REPLICATED);
+ConVar sk_max_smg1_grenade ( "sk_max_smg1_grenade","0", FCVAR_REPLICATED );
+
+ConVar sk_plr_dmg_357 ( "sk_plr_dmg_357", "0", FCVAR_REPLICATED );
+ConVar sk_npc_dmg_357 ( "sk_npc_dmg_357", "0", FCVAR_REPLICATED );
+ConVar sk_max_357 ( "sk_max_357", "0", FCVAR_REPLICATED );
+
+ConVar sk_plr_dmg_crossbow ( "sk_plr_dmg_crossbow", "0", FCVAR_REPLICATED );
+ConVar sk_npc_dmg_crossbow ( "sk_npc_dmg_crossbow", "0", FCVAR_REPLICATED );
+ConVar sk_max_crossbow ( "sk_max_crossbow", "0", FCVAR_REPLICATED );
+
+ConVar sk_dmg_sniper_penetrate_plr( "sk_dmg_sniper_penetrate_plr","0", FCVAR_REPLICATED);
+ConVar sk_dmg_sniper_penetrate_npc( "sk_dmg_sniper_penetrate_npc","0", FCVAR_REPLICATED);
+
+ConVar sk_plr_dmg_airboat ( "sk_plr_dmg_airboat", "0", FCVAR_REPLICATED );
+ConVar sk_npc_dmg_airboat ( "sk_npc_dmg_airboat", "0", FCVAR_REPLICATED );
+
+ConVar sk_max_gauss_round ( "sk_max_gauss_round", "0", FCVAR_REPLICATED );
+
+// Gunship & Dropship cannons
+ConVar sk_npc_dmg_gunship ( "sk_npc_dmg_gunship", "0", FCVAR_REPLICATED );
+ConVar sk_npc_dmg_gunship_to_plr ( "sk_npc_dmg_gunship_to_plr", "0", FCVAR_REPLICATED );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : iDmgType -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+int CHalfLife2::Damage_GetTimeBased( void )
+{
+#ifdef HL2_EPISODIC
+ int iDamage = ( DMG_PARALYZE | DMG_NERVEGAS | DMG_POISON | DMG_RADIATION | DMG_DROWNRECOVER | DMG_ACID | DMG_SLOWBURN );
+ return iDamage;
+#else
+ return BaseClass::Damage_GetTimeBased();
+#endif
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : iDmgType -
+// Output : bool
+//-----------------------------------------------------------------------------
+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 );
+#else
+ return BaseClass::Damage_IsTimeBased( iDmgType );
+#endif
+}
+
+#ifdef CLIENT_DLL
+#else
+
+#ifdef HL2_EPISODIC
+ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REPLICATED );
+#endif // HL2_EPISODIC
+
+#endif // CLIENT_DLL
+
+
+#ifdef CLIENT_DLL //{
+
+
+#else //}{
+
+ extern bool g_fGameOver;
+
+#if !(defined( HL2MP ) || defined( PORTAL_MP ))
+ class CVoiceGameMgrHelper : public IVoiceGameMgrHelper
+ {
+ public:
+ virtual bool CanPlayerHearPlayer( CBasePlayer *pListener, CBasePlayer *pTalker, bool &bProximity )
+ {
+ return true;
+ }
+ };
+ CVoiceGameMgrHelper g_VoiceGameMgrHelper;
+ IVoiceGameMgrHelper *g_pVoiceGameMgrHelper = &g_VoiceGameMgrHelper;
+#endif
+
+ //-----------------------------------------------------------------------------
+ // Purpose:
+ // Input :
+ // Output :
+ //-----------------------------------------------------------------------------
+ CHalfLife2::CHalfLife2()
+ {
+ m_bMegaPhysgun = false;
+
+ m_flLastHealthDropTime = 0.0f;
+ m_flLastGrenadeDropTime = 0.0f;
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: called each time a player uses a "cmd" command
+ // Input : *pEdict - the player who issued the command
+ // Use engine.Cmd_Argv, engine.Cmd_Argv, and engine.Cmd_Argc to get
+ // pointers the character string command.
+ //-----------------------------------------------------------------------------
+ bool CHalfLife2::ClientCommand( CBaseEntity *pEdict, const CCommand &args )
+ {
+ if( BaseClass::ClientCommand( pEdict, args ) )
+ return true;
+
+ CHL2_Player *pPlayer = (CHL2_Player *) pEdict;
+
+ if ( pPlayer->ClientCommand( args ) )
+ return true;
+
+ return false;
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: Player has just spawned. Equip them.
+ //-----------------------------------------------------------------------------
+ void CHalfLife2::PlayerSpawn( CBasePlayer *pPlayer )
+ {
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: MULTIPLAYER BODY QUE HANDLING
+ //-----------------------------------------------------------------------------
+ class CCorpse : public CBaseAnimating
+ {
+ public:
+ DECLARE_CLASS( CCorpse, CBaseAnimating );
+ DECLARE_SERVERCLASS();
+
+ virtual int ObjectCaps( void ) { return FCAP_DONT_SAVE; }
+
+ public:
+ CNetworkVar( int, m_nReferencePlayer );
+ };
+
+ IMPLEMENT_SERVERCLASS_ST(CCorpse, DT_Corpse)
+ SendPropInt( SENDINFO(m_nReferencePlayer), 10, SPROP_UNSIGNED )
+ END_SEND_TABLE()
+
+ LINK_ENTITY_TO_CLASS( bodyque, CCorpse );
+
+
+ CCorpse *g_pBodyQueueHead;
+
+ void InitBodyQue(void)
+ {
+ CCorpse *pEntity = ( CCorpse * )CreateEntityByName( "bodyque" );
+ pEntity->AddEFlags( EFL_KEEP_ON_RECREATE_ENTITIES );
+ g_pBodyQueueHead = pEntity;
+ CCorpse *p = g_pBodyQueueHead;
+
+ // Reserve 3 more slots for dead bodies
+ for ( int i = 0; i < 3; i++ )
+ {
+ CCorpse *next = ( CCorpse * )CreateEntityByName( "bodyque" );
+ next->AddEFlags( EFL_KEEP_ON_RECREATE_ENTITIES );
+ p->SetOwnerEntity( next );
+ p = next;
+ }
+
+ p->SetOwnerEntity( g_pBodyQueueHead );
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: make a body que entry for the given ent so the ent can be respawned elsewhere
+ // GLOBALS ASSUMED SET: g_eoBodyQueueHead
+ //-----------------------------------------------------------------------------
+ void CopyToBodyQue( CBaseAnimating *pCorpse )
+ {
+ if ( pCorpse->IsEffectActive( EF_NODRAW ) )
+ return;
+
+ CCorpse *pHead = g_pBodyQueueHead;
+
+ pHead->CopyAnimationDataFrom( pCorpse );
+
+ pHead->SetMoveType( MOVETYPE_FLYGRAVITY );
+ pHead->SetAbsVelocity( pCorpse->GetAbsVelocity() );
+ pHead->ClearFlags();
+ pHead->m_nReferencePlayer = ENTINDEX( pCorpse );
+
+ pHead->SetLocalAngles( pCorpse->GetAbsAngles() );
+ UTIL_SetOrigin(pHead, pCorpse->GetAbsOrigin());
+
+ UTIL_SetSize(pHead, pCorpse->WorldAlignMins(), pCorpse->WorldAlignMaxs());
+ g_pBodyQueueHead = (CCorpse *)pHead->GetOwnerEntity();
+ }
+
+ //------------------------------------------------------------------------------
+ // Purpose : Initialize all default class relationships
+ // Input :
+ // Output :
+ //------------------------------------------------------------------------------
+ void CHalfLife2::InitDefaultAIRelationships( void )
+ {
+ int i, j;
+
+ // Allocate memory for default relationships
+ CBaseCombatCharacter::AllocateDefaultRelationships();
+
+ // --------------------------------------------------------------
+ // First initialize table so we can report missing relationships
+ // --------------------------------------------------------------
+ for (i=0;i<NUM_AI_CLASSES;i++)
+ {
+ for (j=0;j<NUM_AI_CLASSES;j++)
+ {
+ // By default all relationships are neutral of priority zero
+ CBaseCombatCharacter::SetDefaultRelationship( (Class_T)i, (Class_T)j, D_NU, 0 );
+ }
+ }
+
+ // ------------------------------------------------------------
+ // > CLASS_ANTLION
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_NONE, D_NU, 0);
+ 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_CITIZEN_PASSIVE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_COMBINE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_COMBINE_HUNTER, D_HT, 0);
+ 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_MANHACK, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_SCANNER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_PROTOSNIPER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_ANTLION, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_BARNACLE
+ //
+ // In this case, the relationship D_HT indicates which characters
+ // the barnacle will try to eat.
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_COMBINE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_EARTH_FAUNA, D_HT, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_BULLSEYE
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_PLAYER, D_NU, 0);
+ 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_CITIZEN_PASSIVE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_CITIZEN_REBEL, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_COMBINE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_VORTIGAUNT, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_ZOMBIE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_EARTH_FAUNA, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_PLAYER_ALLY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_HACKED_ROLLERMINE,D_NU, 0);
+
+ // ------------------------------------------------------------
+ // > 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);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_BARNACLE, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_BULLSEYE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_BULLSQUID, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_CITIZEN_PASSIVE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_COMBINE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_COMBINE_HUNTER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_CONSCRIPT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_FLARE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_HEADCRAB, D_HT, 1);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_HOUNDEYE, D_HT, 1);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_MANHACK, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+ */
+ // ------------------------------------------------------------
+ // > CLASS_CITIZEN_PASSIVE
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_PLAYER, D_NU, 0);
+ 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_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);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_COMBINE_HUNTER, D_FR, 0);
+ 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_MANHACK, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_MISSILE, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_VORTIGAUNT, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_ZOMBIE, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_CITIZEN_REBEL
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_PLAYER, D_NU, 0);
+ 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_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);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_COMBINE_HUNTER, D_HT, 0);
+ 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_MANHACK, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_MISSILE, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_SCANNER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_VORTIGAUNT, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_COMBINE
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_COMBINE, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_COMBINE_GUNSHIP, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_COMBINE_HUNTER, D_LI, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_COMBINE_GUNSHIP
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_PLAYER, D_HT, 0);
+ 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_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);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_COMBINE_GUNSHIP, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_COMBINE_HUNTER, D_LI, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_MISSILE, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_COMBINE_HUNTER
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_PLAYER, D_HT, 0);
+ 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_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);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_COMBINE_GUNSHIP, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_COMBINE_HUNTER, D_LI, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_CONSCRIPT
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_PLAYER, D_NU, 0);
+ 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_CITIZEN_PASSIVE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_CITIZEN_REBEL, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_COMBINE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_COMBINE_HUNTER, D_HT, 0);
+ 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_MANHACK, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_SCANNER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_VORTIGAUNT, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_FLARE
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_PLAYER, D_NU, 0);
+ 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_CITIZEN_PASSIVE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_CITIZEN_REBEL, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_COMBINE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_FLARE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_VORTIGAUNT, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_ZOMBIE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_EARTH_FAUNA, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_PLAYER_ALLY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_HACKED_ROLLERMINE,D_NU, 0);
+
+ // ------------------------------------------------------------
+ // > CLASS_HEADCRAB
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_COMBINE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_ZOMBIE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > 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_CITIZEN_PASSIVE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_COMBINE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_COMBINE_HUNTER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_CONSCRIPT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_FLARE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_HEADCRAB, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_HOUNDEYE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_ZOMBIE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+ */
+
+ // ------------------------------------------------------------
+ // > CLASS_MANHACK
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_COMBINE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_METROPOLICE
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_COMBINE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_MILITARY
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_COMBINE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_MISSILE
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_COMBINE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_NONE
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_PLAYER, D_NU, 0);
+ 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_CITIZEN_PASSIVE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_CITIZEN_REBEL, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_COMBINE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_VORTIGAUNT, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_ZOMBIE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_EARTH_FAUNA, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_PLAYER_ALLY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_HACKED_ROLLERMINE,D_NU, 0);
+
+ // ------------------------------------------------------------
+ // > CLASS_PLAYER
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_PLAYER, D_NU, 0);
+ 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_CITIZEN_PASSIVE, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_CITIZEN_REBEL, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_COMBINE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_COMBINE_GUNSHIP, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_COMBINE_HUNTER, D_HT, 0);
+ 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_MANHACK, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_SCANNER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_VORTIGAUNT, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_PROTOSNIPER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_PLAYER_ALLY
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_PLAYER, D_LI, 0);
+ 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_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);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_COMBINE_HUNTER, D_HT, 0);
+ 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_MANHACK, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_SCANNER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_VORTIGAUNT, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_ZOMBIE, D_FR, 1);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_PROTOSNIPER, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_PLAYER_ALLY_VITAL
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_PLAYER, D_LI, 0);
+ 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_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);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_COMBINE_HUNTER, D_FR, 0);
+ 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_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);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_SCANNER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_VORTIGAUNT, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_PROTOSNIPER, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_SCANNER
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_COMBINE, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_COMBINE_GUNSHIP, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_COMBINE_HUNTER, D_LI, 0);
+ 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_MANHACK, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_METROPOLICE, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_MILITARY, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_SCANNER, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_STALKER, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_ZOMBIE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_PROTOSNIPER, D_LI, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_STALKER
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_COMBINE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_ZOMBIE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_VORTIGAUNT
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_PLAYER, D_LI, 0);
+ 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_CITIZEN_PASSIVE, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_CITIZEN_REBEL, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_COMBINE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_COMBINE_HUNTER, D_HT, 0);
+ 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_MANHACK, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_SCANNER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_VORTIGAUNT, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_ZOMBIE
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_COMBINE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_COMBINE_HUNTER, D_HT, 0);
+ 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_MANHACK, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_MILITARY, D_FR, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_ZOMBIE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_PROTOSNIPER
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_PLAYER, D_HT, 0);
+ 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_CITIZEN_PASSIVE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_CITIZEN_REBEL, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_COMBINE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_METROPOLICE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_MILITARY, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_MISSILE, D_NU, 5);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_STALKER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_EARTH_FAUNA
+ //
+ // Hates pretty much everything equally except other earth fauna.
+ // This will make the critter choose the nearest thing as its enemy.
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_NONE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_PLAYER, D_HT, 0);
+ 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_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);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_COMBINE_GUNSHIP, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_COMBINE_HUNTER, D_HT, 0);
+ 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_MANHACK, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_MISSILE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_SCANNER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_VORTIGAUNT, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_ZOMBIE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_PROTOSNIPER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_EARTH_FAUNA, D_NU, 0);
+ 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);
+
+ // ------------------------------------------------------------
+ // > CLASS_HACKED_ROLLERMINE
+ // ------------------------------------------------------------
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_NONE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_PLAYER, D_LI, 0);
+ 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_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);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_COMBINE_GUNSHIP, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_COMBINE_HUNTER, D_NU, 0);
+ 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_MANHACK, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_METROPOLICE, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_MILITARY, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_MISSILE, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_SCANNER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_STALKER, D_HT, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_VORTIGAUNT, D_LI, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_ZOMBIE, D_HT, 1);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_PROTOSNIPER, D_NU, 0);
+ CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_EARTH_FAUNA, D_HT, 0);
+ 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);
+ }
+
+
+ //------------------------------------------------------------------------------
+ // Purpose : Return classify text for classify type
+ // Input :
+ // Output :
+ //------------------------------------------------------------------------------
+ const char* CHalfLife2::AIClassText(int classType)
+ {
+ switch (classType)
+ {
+ case CLASS_NONE: return "CLASS_NONE";
+ case CLASS_PLAYER: return "CLASS_PLAYER";
+ case CLASS_ANTLION: return "CLASS_ANTLION";
+ case CLASS_BARNACLE: return "CLASS_BARNACLE";
+ case CLASS_BULLSEYE: return "CLASS_BULLSEYE";
+ //case CLASS_BULLSQUID: return "CLASS_BULLSQUID";
+ case CLASS_CITIZEN_PASSIVE: return "CLASS_CITIZEN_PASSIVE";
+ case CLASS_CITIZEN_REBEL: return "CLASS_CITIZEN_REBEL";
+ case CLASS_COMBINE: return "CLASS_COMBINE";
+ case CLASS_COMBINE_GUNSHIP: return "CLASS_COMBINE_GUNSHIP";
+ case CLASS_COMBINE_HUNTER: return "CLASS_COMBINE_HUNTER";
+ case CLASS_CONSCRIPT: return "CLASS_CONSCRIPT";
+ case CLASS_HEADCRAB: return "CLASS_HEADCRAB";
+ //case CLASS_HOUNDEYE: return "CLASS_HOUNDEYE";
+ case CLASS_MANHACK: return "CLASS_MANHACK";
+ case CLASS_METROPOLICE: return "CLASS_METROPOLICE";
+ case CLASS_MILITARY: return "CLASS_MILITARY";
+ case CLASS_SCANNER: return "CLASS_SCANNER";
+ case CLASS_STALKER: return "CLASS_STALKER";
+ case CLASS_VORTIGAUNT: return "CLASS_VORTIGAUNT";
+ case CLASS_ZOMBIE: return "CLASS_ZOMBIE";
+ case CLASS_PROTOSNIPER: return "CLASS_PROTOSNIPER";
+ case CLASS_MISSILE: return "CLASS_MISSILE";
+ case CLASS_FLARE: return "CLASS_FLARE";
+ case CLASS_EARTH_FAUNA: return "CLASS_EARTH_FAUNA";
+
+ default: return "MISSING CLASS in ClassifyText()";
+ }
+ }
+
+ void CHalfLife2::PlayerThink( CBasePlayer *pPlayer )
+ {
+ }
+
+ void CHalfLife2::Think( void )
+ {
+ BaseClass::Think();
+
+ if( physcannon_mega_enabled.GetBool() == true )
+ {
+ m_bMegaPhysgun = true;
+ }
+ else
+ {
+ // FIXME: Is there a better place for this?
+ m_bMegaPhysgun = ( GlobalEntity_GetState("super_phys_gun") == GLOBAL_ON );
+ }
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: Returns how much damage the given ammo type should do to the victim
+ // when fired by the attacker.
+ // Input : pAttacker - Dude what shot the gun.
+ // pVictim - Dude what done got shot.
+ // nAmmoType - What been shot out.
+ // Output : How much hurt to put on dude what done got shot (pVictim).
+ //-----------------------------------------------------------------------------
+ float CHalfLife2::GetAmmoDamage( CBaseEntity *pAttacker, CBaseEntity *pVictim, int nAmmoType )
+ {
+ float flDamage = 0.0f;
+ CAmmoDef *pAmmoDef = GetAmmoDef();
+
+ if ( pAmmoDef->DamageType( nAmmoType ) & DMG_SNIPER )
+ {
+ // If this damage is from a SNIPER, we do damage based on what the bullet
+ // HITS, not who fired it. All other bullets have their damage values
+ // arranged according to the owner of the bullet, not the recipient.
+ if ( pVictim->IsPlayer() )
+ {
+ // Player
+ flDamage = pAmmoDef->PlrDamage( nAmmoType );
+ }
+ else
+ {
+ // NPC or breakable
+ flDamage = pAmmoDef->NPCDamage( nAmmoType );
+ }
+ }
+ else
+ {
+ flDamage = BaseClass::GetAmmoDamage( pAttacker, pVictim, nAmmoType );
+ }
+
+ if( pAttacker->IsPlayer() && pVictim->IsNPC() )
+ {
+ if( pVictim->MyCombatCharacterPointer() )
+ {
+ // Player is shooting an NPC. Adjust the damage! This protects breakables
+ // and other 'non-living' entities from being easier/harder to break
+ // in different skill levels.
+ flDamage = pAmmoDef->PlrDamage( nAmmoType );
+ flDamage = AdjustPlayerDamageInflicted( flDamage );
+ }
+ }
+
+ return flDamage;
+ }
+
+ //-----------------------------------------------------------------------------
+ //-----------------------------------------------------------------------------
+ bool CHalfLife2::AllowDamage( CBaseEntity *pVictim, const CTakeDamageInfo &info )
+ {
+#ifndef CLIENT_DLL
+ if( (info.GetDamageType() & DMG_CRUSH) && info.GetInflictor() && pVictim->MyNPCPointer() )
+ {
+ if( pVictim->MyNPCPointer()->IsPlayerAlly() )
+ {
+ // A physics object has struck a player ally. Don't allow damage if it
+ // came from the player's physcannon.
+ CBasePlayer *pPlayer = UTIL_PlayerByIndex(1);
+
+ if( pPlayer )
+ {
+ CBaseEntity *pWeapon = pPlayer->HasNamedPlayerItem("weapon_physcannon");
+
+ if( pWeapon )
+ {
+ CBaseCombatWeapon *pCannon = assert_cast <CBaseCombatWeapon*>(pWeapon);
+
+ if( pCannon )
+ {
+ if( PhysCannonAccountableForObject(pCannon, info.GetInflictor() ) )
+ {
+ // Antlions can always be squashed!
+ if ( pVictim->Classify() == CLASS_ANTLION )
+ return true;
+
+ return false;
+ }
+ }
+ }
+ }
+ }
+ }
+#endif
+ return true;
+ }
+ //-----------------------------------------------------------------------------
+ // Purpose: Whether or not the NPC should drop a health vial
+ // Output : Returns true on success, false on failure.
+ //-----------------------------------------------------------------------------
+ bool CHalfLife2::NPC_ShouldDropHealth( CBasePlayer *pRecipient )
+ {
+ // Can only do this every so often
+ if ( m_flLastHealthDropTime > gpGlobals->curtime )
+ return false;
+
+ //Try to throw dynamic health
+ float healthPerc = ( (float) pRecipient->m_iHealth / (float) pRecipient->m_iMaxHealth );
+
+ if ( random->RandomFloat( 0.0f, 1.0f ) > healthPerc*1.5f )
+ return true;
+
+ return false;
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: Whether or not the NPC should drop a health vial
+ // Output : Returns true on success, false on failure.
+ //-----------------------------------------------------------------------------
+ bool CHalfLife2::NPC_ShouldDropGrenade( CBasePlayer *pRecipient )
+ {
+ // Can only do this every so often
+ if ( m_flLastGrenadeDropTime > gpGlobals->curtime )
+ return false;
+
+ int grenadeIndex = GetAmmoDef()->Index( "grenade" );
+ int numGrenades = pRecipient->GetAmmoCount( grenadeIndex );
+
+ // If we're not maxed out on grenades and we've randomly okay'd it
+ if ( ( numGrenades < GetAmmoDef()->MaxCarry( grenadeIndex ) ) && ( random->RandomInt( 0, 2 ) == 0 ) )
+ return true;
+
+ return false;
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: Update the drop counter for health
+ //-----------------------------------------------------------------------------
+ void CHalfLife2::NPC_DroppedHealth( void )
+ {
+ m_flLastHealthDropTime = gpGlobals->curtime + sk_plr_health_drop_time.GetFloat();
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: Update the drop counter for grenades
+ //-----------------------------------------------------------------------------
+ void CHalfLife2::NPC_DroppedGrenade( void )
+ {
+ m_flLastGrenadeDropTime = gpGlobals->curtime + sk_plr_grenade_drop_time.GetFloat();
+ }
+
+#endif //} !CLIENT_DLL
+
+
+// ------------------------------------------------------------------------------------ //
+// Shared CHalfLife2 implementation.
+// ------------------------------------------------------------------------------------ //
+bool CHalfLife2::ShouldCollide( int collisionGroup0, int collisionGroup1 )
+{
+ // The smaller number is always first
+ if ( collisionGroup0 > collisionGroup1 )
+ {
+ // swap so that lowest is always first
+ int tmp = collisionGroup0;
+ collisionGroup0 = collisionGroup1;
+ collisionGroup1 = tmp;
+ }
+
+ // Prevent the player movement from colliding with spit globs (caused the player to jump on top of globs while in water)
+ if ( collisionGroup0 == COLLISION_GROUP_PLAYER_MOVEMENT && collisionGroup1 == HL2COLLISION_GROUP_SPIT )
+ return false;
+
+ // HL2 treats movement and tracing against players the same, so just remap here
+ if ( collisionGroup0 == COLLISION_GROUP_PLAYER_MOVEMENT )
+ {
+ collisionGroup0 = COLLISION_GROUP_PLAYER;
+ }
+
+ if( collisionGroup1 == COLLISION_GROUP_PLAYER_MOVEMENT )
+ {
+ collisionGroup1 = COLLISION_GROUP_PLAYER;
+ }
+
+ //If collisionGroup0 is not a player then NPC_ACTOR behaves just like an NPC.
+ if ( collisionGroup1 == COLLISION_GROUP_NPC_ACTOR && collisionGroup0 != COLLISION_GROUP_PLAYER )
+ {
+ collisionGroup1 = COLLISION_GROUP_NPC;
+ }
+
+ // This is only for the super physcannon
+ if ( m_bMegaPhysgun )
+ {
+ if ( collisionGroup0 == COLLISION_GROUP_INTERACTIVE_DEBRIS && collisionGroup1 == COLLISION_GROUP_PLAYER )
+ return false;
+ }
+
+ if ( collisionGroup0 == HL2COLLISION_GROUP_COMBINE_BALL )
+ {
+ if ( collisionGroup1 == HL2COLLISION_GROUP_COMBINE_BALL )
+ return false;
+ }
+
+ if ( collisionGroup0 == HL2COLLISION_GROUP_COMBINE_BALL && collisionGroup1 == HL2COLLISION_GROUP_COMBINE_BALL_NPC )
+ return false;
+
+ if ( ( collisionGroup0 == COLLISION_GROUP_WEAPON ) ||
+ ( collisionGroup0 == COLLISION_GROUP_PLAYER ) ||
+ ( collisionGroup0 == COLLISION_GROUP_PROJECTILE ) )
+ {
+ if ( collisionGroup1 == HL2COLLISION_GROUP_COMBINE_BALL )
+ return false;
+ }
+
+ if ( collisionGroup0 == COLLISION_GROUP_DEBRIS )
+ {
+ if ( collisionGroup1 == HL2COLLISION_GROUP_COMBINE_BALL )
+ return true;
+ }
+
+ if (collisionGroup0 == HL2COLLISION_GROUP_HOUNDEYE && collisionGroup1 == HL2COLLISION_GROUP_HOUNDEYE )
+ return false;
+
+ if (collisionGroup0 == HL2COLLISION_GROUP_HOMING_MISSILE && collisionGroup1 == HL2COLLISION_GROUP_HOMING_MISSILE )
+ return false;
+
+ if ( collisionGroup1 == HL2COLLISION_GROUP_CROW )
+ {
+ if ( collisionGroup0 == COLLISION_GROUP_PLAYER || collisionGroup0 == COLLISION_GROUP_NPC ||
+ collisionGroup0 == HL2COLLISION_GROUP_CROW )
+ return false;
+ }
+
+ if ( ( collisionGroup0 == HL2COLLISION_GROUP_HEADCRAB ) && ( collisionGroup1 == HL2COLLISION_GROUP_HEADCRAB ) )
+ return false;
+
+ // striders don't collide with other striders
+ if ( collisionGroup0 == HL2COLLISION_GROUP_STRIDER && collisionGroup1 == HL2COLLISION_GROUP_STRIDER )
+ return false;
+
+ // gunships don't collide with other gunships
+ if ( collisionGroup0 == HL2COLLISION_GROUP_GUNSHIP && collisionGroup1 == HL2COLLISION_GROUP_GUNSHIP )
+ return false;
+
+ // weapons and NPCs don't collide
+ if ( collisionGroup0 == COLLISION_GROUP_WEAPON && (collisionGroup1 >= HL2COLLISION_GROUP_FIRST_NPC && collisionGroup1 <= HL2COLLISION_GROUP_LAST_NPC ) )
+ return false;
+
+ //players don't collide against NPC Actors.
+ //I could've done this up where I check if collisionGroup0 is NOT a player but I decided to just
+ //do what the other checks are doing in this function for consistency sake.
+ if ( collisionGroup1 == COLLISION_GROUP_NPC_ACTOR && collisionGroup0 == COLLISION_GROUP_PLAYER )
+ return false;
+
+ // In cases where NPCs are playing a script which causes them to interpenetrate while riding on another entity,
+ // such as a train or elevator, you need to disable collisions between the actors so the mover can move them.
+ if ( collisionGroup0 == COLLISION_GROUP_NPC_SCRIPTED && collisionGroup1 == COLLISION_GROUP_NPC_SCRIPTED )
+ return false;
+
+ // Spit doesn't touch other spit
+ if ( collisionGroup0 == HL2COLLISION_GROUP_SPIT && collisionGroup1 == HL2COLLISION_GROUP_SPIT )
+ return false;
+
+ return BaseClass::ShouldCollide( collisionGroup0, collisionGroup1 );
+}
+
+#ifndef CLIENT_DLL
+//---------------------------------------------------------
+//---------------------------------------------------------
+void CHalfLife2::AdjustPlayerDamageTaken( CTakeDamageInfo *pInfo )
+{
+ if( pInfo->GetDamageType() & (DMG_DROWN|DMG_CRUSH|DMG_FALL|DMG_POISON|DMG_SNIPER) )
+ {
+ // Skill level doesn't affect these types of damage.
+ return;
+ }
+
+ switch( GetSkillLevel() )
+ {
+ case SKILL_EASY:
+ pInfo->ScaleDamage( sk_dmg_take_scale1.GetFloat() );
+ break;
+
+ case SKILL_MEDIUM:
+ pInfo->ScaleDamage( sk_dmg_take_scale2.GetFloat() );
+ break;
+
+ case SKILL_HARD:
+ pInfo->ScaleDamage( sk_dmg_take_scale3.GetFloat() );
+ break;
+ }
+}
+
+//---------------------------------------------------------
+//---------------------------------------------------------
+float CHalfLife2::AdjustPlayerDamageInflicted( float damage )
+{
+ switch( GetSkillLevel() )
+ {
+ case SKILL_EASY:
+ return damage * sk_dmg_inflict_scale1.GetFloat();
+ break;
+
+ case SKILL_MEDIUM:
+ return damage * sk_dmg_inflict_scale2.GetFloat();
+ break;
+
+ case SKILL_HARD:
+ return damage * sk_dmg_inflict_scale3.GetFloat();
+ break;
+
+ default:
+ return damage;
+ break;
+ }
+}
+#endif//CLIENT_DLL
+
+//---------------------------------------------------------
+//---------------------------------------------------------
+bool CHalfLife2::ShouldUseRobustRadiusDamage(CBaseEntity *pEntity)
+{
+#ifdef CLIENT_DLL
+ return false;
+#endif
+
+ if( !sv_robust_explosions.GetBool() )
+ return false;
+
+ if( !pEntity->IsNPC() )
+ {
+ // Only NPC's
+ return false;
+ }
+
+#ifndef CLIENT_DLL
+ CAI_BaseNPC *pNPC = pEntity->MyNPCPointer();
+ if( pNPC->CapabilitiesGet() & bits_CAP_SIMPLE_RADIUS_DAMAGE )
+ {
+ // This NPC only eligible for simple radius damage.
+ return false;
+ }
+#endif//CLIENT_DLL
+
+ return true;
+}
+
+#ifndef CLIENT_DLL
+//---------------------------------------------------------
+//---------------------------------------------------------
+bool CHalfLife2::ShouldAutoAim( CBasePlayer *pPlayer, edict_t *target )
+{
+ return sk_allow_autoaim.GetBool() != 0;
+}
+
+//---------------------------------------------------------
+//---------------------------------------------------------
+float CHalfLife2::GetAutoAimScale( CBasePlayer *pPlayer )
+{
+#ifdef _X360
+ return 1.0f;
+#else
+ switch( GetSkillLevel() )
+ {
+ case SKILL_EASY:
+ return sk_autoaim_scale1.GetFloat();
+
+ case SKILL_MEDIUM:
+ return sk_autoaim_scale2.GetFloat();
+
+ default:
+ return 0.0f;
+ }
+#endif
+}
+
+//---------------------------------------------------------
+//---------------------------------------------------------
+float CHalfLife2::GetAmmoQuantityScale( int iAmmoIndex )
+{
+ switch( GetSkillLevel() )
+ {
+ case SKILL_EASY:
+ return sk_ammo_qty_scale1.GetFloat();
+
+ case SKILL_MEDIUM:
+ return sk_ammo_qty_scale2.GetFloat();
+
+ case SKILL_HARD:
+ return sk_ammo_qty_scale3.GetFloat();
+
+ default:
+ return 0.0f;
+ }
+}
+
+void CHalfLife2::LevelInitPreEntity()
+{
+ // Remove this if you fix the bug in ep1 where the striders need to touch
+ // triggers using their absbox instead of their bbox
+#ifdef HL2_EPISODIC
+ if ( !Q_strnicmp( gpGlobals->mapname.ToCStr(), "ep1_", 4 ) )
+ {
+ // episode 1 maps use the surrounding box trigger behavior
+ CBaseEntity::sm_bAccurateTriggerBboxChecks = false;
+ }
+#endif
+ BaseClass::LevelInitPreEntity();
+}
+
+//-----------------------------------------------------------------------------
+// Returns whether or not Alyx cares about light levels in order to see.
+//-----------------------------------------------------------------------------
+bool CHalfLife2::IsAlyxInDarknessMode()
+{
+#ifdef HL2_EPISODIC
+ if ( alyx_darkness_force.GetBool() )
+ return true;
+
+ return ( GlobalEntity_GetState( "ep_alyx_darknessmode" ) == GLOBAL_ON );
+#else
+ return false;
+#endif // HL2_EPISODIC
+}
+
+
+//-----------------------------------------------------------------------------
+// This takes the long way around to see if a prop should emit a DLIGHT when it
+// ignites, to avoid having Alyx-related code in props.cpp.
+//-----------------------------------------------------------------------------
+bool CHalfLife2::ShouldBurningPropsEmitLight()
+{
+#ifdef HL2_EPISODIC
+ return IsAlyxInDarknessMode();
+#else
+ return false;
+#endif // HL2_EPISODIC
+}
+
+
+#endif//CLIENT_DLL
+
+// ------------------------------------------------------------------------------------ //
+// Global functions.
+// ------------------------------------------------------------------------------------ //
+
+#ifndef HL2MP
+#ifndef PORTAL
+
+// shared ammo definition
+// JAY: Trying to make a more physical bullet response
+#define BULLET_MASS_GRAINS_TO_LB(grains) (0.002285*(grains)/16.0f)
+#define BULLET_MASS_GRAINS_TO_KG(grains) lbs2kg(BULLET_MASS_GRAINS_TO_LB(grains))
+
+// exaggerate all of the forces, but use real numbers to keep them consistent
+#define BULLET_IMPULSE_EXAGGERATION 3.5
+// convert a velocity in ft/sec and a mass in grains to an impulse in kg in/s
+#define BULLET_IMPULSE(grains, ftpersec) ((ftpersec)*12*BULLET_MASS_GRAINS_TO_KG(grains)*BULLET_IMPULSE_EXAGGERATION)
+
+
+CAmmoDef *GetAmmoDef()
+{
+ static CAmmoDef def;
+ static bool bInitted = false;
+
+ if ( !bInitted )
+ {
+ bInitted = true;
+
+ def.AddAmmoType("AR2", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_ar2", "sk_npc_dmg_ar2", "sk_max_ar2", BULLET_IMPULSE(200, 1225), 0 );
+ def.AddAmmoType("AlyxGun", DMG_BULLET, TRACER_LINE, "sk_plr_dmg_alyxgun", "sk_npc_dmg_alyxgun", "sk_max_alyxgun", BULLET_IMPULSE(200, 1225), 0 );
+ def.AddAmmoType("Pistol", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_pistol", "sk_npc_dmg_pistol", "sk_max_pistol", BULLET_IMPULSE(200, 1225), 0 );
+ def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_smg1", "sk_npc_dmg_smg1", "sk_max_smg1", BULLET_IMPULSE(200, 1225), 0 );
+ def.AddAmmoType("357", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_357", "sk_npc_dmg_357", "sk_max_357", BULLET_IMPULSE(800, 5000), 0 );
+ def.AddAmmoType("XBowBolt", DMG_BULLET, TRACER_LINE, "sk_plr_dmg_crossbow", "sk_npc_dmg_crossbow", "sk_max_crossbow", BULLET_IMPULSE(800, 8000), 0 );
+
+ def.AddAmmoType("Buckshot", DMG_BULLET | DMG_BUCKSHOT, TRACER_LINE, "sk_plr_dmg_buckshot", "sk_npc_dmg_buckshot", "sk_max_buckshot", BULLET_IMPULSE(400, 1200), 0 );
+ def.AddAmmoType("RPG_Round", DMG_BURN, TRACER_NONE, "sk_plr_dmg_rpg_round", "sk_npc_dmg_rpg_round", "sk_max_rpg_round", 0, 0 );
+ def.AddAmmoType("SMG1_Grenade", DMG_BURN, TRACER_NONE, "sk_plr_dmg_smg1_grenade", "sk_npc_dmg_smg1_grenade", "sk_max_smg1_grenade", 0, 0 );
+ def.AddAmmoType("SniperRound", DMG_BULLET | DMG_SNIPER, TRACER_NONE, "sk_plr_dmg_sniper_round", "sk_npc_dmg_sniper_round", "sk_max_sniper_round", BULLET_IMPULSE(650, 6000), 0 );
+ def.AddAmmoType("SniperPenetratedRound", DMG_BULLET | DMG_SNIPER, TRACER_NONE, "sk_dmg_sniper_penetrate_plr", "sk_dmg_sniper_penetrate_npc", "sk_max_sniper_round", BULLET_IMPULSE(150, 6000), 0 );
+ def.AddAmmoType("Grenade", DMG_BURN, TRACER_NONE, "sk_plr_dmg_grenade", "sk_npc_dmg_grenade", "sk_max_grenade", 0, 0);
+ def.AddAmmoType("Thumper", DMG_SONIC, TRACER_NONE, 10, 10, 2, 0, 0 );
+ def.AddAmmoType("Gravity", DMG_CLUB, TRACER_NONE, 0, 0, 8, 0, 0 );
+// def.AddAmmoType("Extinguisher", DMG_BURN, TRACER_NONE, 0, 0, 100, 0, 0 );
+ def.AddAmmoType("Battery", DMG_CLUB, TRACER_NONE, NULL, NULL, NULL, 0, 0 );
+ def.AddAmmoType("GaussEnergy", DMG_SHOCK, TRACER_NONE, "sk_jeep_gauss_damage", "sk_jeep_gauss_damage", "sk_max_gauss_round", BULLET_IMPULSE(650, 8000), 0 ); // hit like a 10kg weight at 400 in/s
+ 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 );
+
+ //=====================================================================
+ // STRIDER MINIGUN DAMAGE - Pull up a chair and I'll tell you a tale.
+ //
+ // When we shipped Half-Life 2 in 2004, we were unaware of a bug in
+ // CAmmoDef::NPCDamage() which was returning the MaxCarry field of
+ // an ammotype as the amount of damage that should be done to a NPC
+ // by that type of ammo. Thankfully, the bug only affected Ammo Types
+ // that DO NOT use ConVars to specify their parameters. As you can see,
+ // all of the important ammotypes use ConVars, so the effect of the bug
+ // was limited. The Strider Minigun was affected, though.
+ //
+ // According to my perforce Archeology, we intended to ship the Strider
+ // Minigun ammo type to do 15 points of damage per shot, and we did.
+ // To achieve this we, unaware of the bug, set the Strider Minigun ammo
+ // type to have a maxcarry of 15, since our observation was that the
+ // number that was there before (8) was indeed the amount of damage being
+ // done to NPC's at the time. So we changed the field that was incorrectly
+ // being used as the NPC Damage field.
+ //
+ // The bug was fixed during Episode 1's development. The result of the
+ // bug fix was that the Strider was reduced to doing 5 points of damage
+ // to NPC's, since 5 is the value that was being assigned as NPC damage
+ // even though the code was returning 15 up to that point.
+ //
+ // Now as we go to ship Orange Box, we discover that the Striders in
+ // Half-Life 2 are hugely ineffective against citizens, causing big
+ // problems in maps 12 and 13.
+ //
+ // In order to restore balance to HL2 without upsetting the delicate
+ // balance of ep2_outland_12, I have chosen to build Episodic binaries
+ // with 5 as the Strider->NPC damage, since that's the value that has
+ // been in place for all of Episode 2's development. Half-Life 2 will
+ // build with 15 as the Strider->NPC damage, which is how HL2 shipped
+ // originally, only this time the 15 is located in the correct field
+ // now that the AmmoDef code is behaving correctly.
+ //
+ //=====================================================================
+#ifdef HL2_EPISODIC
+ def.AddAmmoType("StriderMinigun", DMG_BULLET, TRACER_LINE, 5, 5, 15, 1.0 * 750 * 12, AMMO_FORCE_DROP_IF_CARRIED ); // hit like a 1.0kg weight at 750 ft/s
+#else
+ def.AddAmmoType("StriderMinigun", DMG_BULLET, TRACER_LINE, 5, 15,15, 1.0 * 750 * 12, AMMO_FORCE_DROP_IF_CARRIED ); // hit like a 1.0kg weight at 750 ft/s
+#endif//HL2_EPISODIC
+
+ def.AddAmmoType("StriderMinigunDirect", DMG_BULLET, TRACER_LINE, 2, 2, 15, 1.0 * 750 * 12, AMMO_FORCE_DROP_IF_CARRIED ); // hit like a 1.0kg weight at 750 ft/s
+ def.AddAmmoType("HelicopterGun", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_npc_dmg_helicopter_to_plr", "sk_npc_dmg_helicopter", "sk_max_smg1", BULLET_IMPULSE(400, 1225), AMMO_FORCE_DROP_IF_CARRIED | AMMO_INTERPRET_PLRDAMAGE_AS_DAMAGE_TO_PLAYER );
+ def.AddAmmoType("AR2AltFire", DMG_DISSOLVE, TRACER_NONE, 0, 0, "sk_max_ar2_altfire", 0, 0 );
+ def.AddAmmoType("Grenade", DMG_BURN, TRACER_NONE, "sk_plr_dmg_grenade", "sk_npc_dmg_grenade", "sk_max_grenade", 0, 0);
+#ifdef HL2_EPISODIC
+ def.AddAmmoType("Hopwire", DMG_BLAST, TRACER_NONE, "sk_plr_dmg_grenade", "sk_npc_dmg_grenade", "sk_max_hopwire", 0, 0);
+ def.AddAmmoType("CombineHeavyCannon", DMG_BULLET, TRACER_LINE, 40, 40, NULL, 10 * 750 * 12, AMMO_FORCE_DROP_IF_CARRIED ); // hit like a 10 kg weight at 750 ft/s
+ def.AddAmmoType("ammo_proto1", DMG_BULLET, TRACER_LINE, 0, 0, 10, 0, 0 );
+#endif // HL2_EPISODIC
+ }
+
+ return &def;
+}
+
+#endif
+#endif
diff --git a/sp/src/game/shared/hl2/hl2_gamerules.h b/sp/src/game/shared/hl2/hl2_gamerules.h
index 68804b6d..4f64793f 100644
--- a/sp/src/game/shared/hl2/hl2_gamerules.h
+++ b/sp/src/game/shared/hl2/hl2_gamerules.h
@@ -1,118 +1,118 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose: Game rules for Half-Life 2.
-//
-//=============================================================================//
-
-#ifndef HL2_GAMERULES_H
-#define HL2_GAMERULES_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-#include "gamerules.h"
-#include "singleplay_gamerules.h"
-#include "hl2_shareddefs.h"
-
-#ifdef CLIENT_DLL
- #define CHalfLife2 C_HalfLife2
- #define CHalfLife2Proxy C_HalfLife2Proxy
-#endif
-
-
-class CHalfLife2Proxy : public CGameRulesProxy
-{
-public:
- DECLARE_CLASS( CHalfLife2Proxy, CGameRulesProxy );
- DECLARE_NETWORKCLASS();
-};
-
-
-class CHalfLife2 : public CSingleplayRules
-{
-public:
- DECLARE_CLASS( CHalfLife2, CSingleplayRules );
-
- // Damage Query Overrides.
- virtual bool Damage_IsTimeBased( int iDmgType );
- // TEMP:
- virtual int Damage_GetTimeBased( void );
-
- virtual bool ShouldCollide( int collisionGroup0, int collisionGroup1 );
- virtual bool ShouldUseRobustRadiusDamage(CBaseEntity *pEntity);
-#ifndef CLIENT_DLL
- virtual bool ShouldAutoAim( CBasePlayer *pPlayer, edict_t *target );
- virtual float GetAutoAimScale( CBasePlayer *pPlayer );
- virtual float GetAmmoQuantityScale( int iAmmoIndex );
- virtual void LevelInitPreEntity();
-#endif
-
-private:
- // Rules change for the mega physgun
- CNetworkVar( bool, m_bMegaPhysgun );
-
-#ifdef CLIENT_DLL
-
- DECLARE_CLIENTCLASS_NOBASE(); // This makes datatables able to access our private vars.
-
-#else
-
- DECLARE_SERVERCLASS_NOBASE(); // This makes datatables able to access our private vars.
-
- CHalfLife2();
- virtual ~CHalfLife2() {}
-
- virtual void Think( void );
-
- virtual bool ClientCommand( CBaseEntity *pEdict, const CCommand &args );
- virtual void PlayerSpawn( CBasePlayer *pPlayer );
-
- virtual void InitDefaultAIRelationships( void );
- virtual const char* AIClassText(int classType);
- virtual const char *GetGameDescription( void ) { return "Half-Life 2"; }
-
- // Ammo
- virtual void PlayerThink( CBasePlayer *pPlayer );
- virtual float GetAmmoDamage( CBaseEntity *pAttacker, CBaseEntity *pVictim, int nAmmoType );
-
- virtual bool ShouldBurningPropsEmitLight();
-public:
-
- bool AllowDamage( CBaseEntity *pVictim, const CTakeDamageInfo &info );
-
- bool NPC_ShouldDropGrenade( CBasePlayer *pRecipient );
- bool NPC_ShouldDropHealth( CBasePlayer *pRecipient );
- void NPC_DroppedHealth( void );
- void NPC_DroppedGrenade( void );
- bool MegaPhyscannonActive( void ) { return m_bMegaPhysgun; }
-
- virtual bool IsAlyxInDarknessMode();
-
-private:
-
- float m_flLastHealthDropTime;
- float m_flLastGrenadeDropTime;
-
- void AdjustPlayerDamageTaken( CTakeDamageInfo *pInfo );
- float AdjustPlayerDamageInflicted( float damage );
-
- int DefaultFOV( void ) { return 75; }
-#endif
-};
-
-
-//-----------------------------------------------------------------------------
-// Gets us at the Half-Life 2 game rules
-//-----------------------------------------------------------------------------
-inline CHalfLife2* HL2GameRules()
-{
-#if ( !defined( HL2_DLL ) && !defined( HL2_CLIENT_DLL ) ) || defined( HL2MP )
- Assert( 0 ); // g_pGameRules is NOT an instance of CHalfLife2 and bad things happen
-#endif
-
- return static_cast<CHalfLife2*>(g_pGameRules);
-}
-
-
-
-#endif // HL2_GAMERULES_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Game rules for Half-Life 2.
+//
+//=============================================================================//
+
+#ifndef HL2_GAMERULES_H
+#define HL2_GAMERULES_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "gamerules.h"
+#include "singleplay_gamerules.h"
+#include "hl2_shareddefs.h"
+
+#ifdef CLIENT_DLL
+ #define CHalfLife2 C_HalfLife2
+ #define CHalfLife2Proxy C_HalfLife2Proxy
+#endif
+
+
+class CHalfLife2Proxy : public CGameRulesProxy
+{
+public:
+ DECLARE_CLASS( CHalfLife2Proxy, CGameRulesProxy );
+ DECLARE_NETWORKCLASS();
+};
+
+
+class CHalfLife2 : public CSingleplayRules
+{
+public:
+ DECLARE_CLASS( CHalfLife2, CSingleplayRules );
+
+ // Damage Query Overrides.
+ virtual bool Damage_IsTimeBased( int iDmgType );
+ // TEMP:
+ virtual int Damage_GetTimeBased( void );
+
+ virtual bool ShouldCollide( int collisionGroup0, int collisionGroup1 );
+ virtual bool ShouldUseRobustRadiusDamage(CBaseEntity *pEntity);
+#ifndef CLIENT_DLL
+ virtual bool ShouldAutoAim( CBasePlayer *pPlayer, edict_t *target );
+ virtual float GetAutoAimScale( CBasePlayer *pPlayer );
+ virtual float GetAmmoQuantityScale( int iAmmoIndex );
+ virtual void LevelInitPreEntity();
+#endif
+
+private:
+ // Rules change for the mega physgun
+ CNetworkVar( bool, m_bMegaPhysgun );
+
+#ifdef CLIENT_DLL
+
+ DECLARE_CLIENTCLASS_NOBASE(); // This makes datatables able to access our private vars.
+
+#else
+
+ DECLARE_SERVERCLASS_NOBASE(); // This makes datatables able to access our private vars.
+
+ CHalfLife2();
+ virtual ~CHalfLife2() {}
+
+ virtual void Think( void );
+
+ virtual bool ClientCommand( CBaseEntity *pEdict, const CCommand &args );
+ virtual void PlayerSpawn( CBasePlayer *pPlayer );
+
+ virtual void InitDefaultAIRelationships( void );
+ virtual const char* AIClassText(int classType);
+ virtual const char *GetGameDescription( void ) { return "Half-Life 2"; }
+
+ // Ammo
+ virtual void PlayerThink( CBasePlayer *pPlayer );
+ virtual float GetAmmoDamage( CBaseEntity *pAttacker, CBaseEntity *pVictim, int nAmmoType );
+
+ virtual bool ShouldBurningPropsEmitLight();
+public:
+
+ bool AllowDamage( CBaseEntity *pVictim, const CTakeDamageInfo &info );
+
+ bool NPC_ShouldDropGrenade( CBasePlayer *pRecipient );
+ bool NPC_ShouldDropHealth( CBasePlayer *pRecipient );
+ void NPC_DroppedHealth( void );
+ void NPC_DroppedGrenade( void );
+ bool MegaPhyscannonActive( void ) { return m_bMegaPhysgun; }
+
+ virtual bool IsAlyxInDarknessMode();
+
+private:
+
+ float m_flLastHealthDropTime;
+ float m_flLastGrenadeDropTime;
+
+ void AdjustPlayerDamageTaken( CTakeDamageInfo *pInfo );
+ float AdjustPlayerDamageInflicted( float damage );
+
+ int DefaultFOV( void ) { return 75; }
+#endif
+};
+
+
+//-----------------------------------------------------------------------------
+// Gets us at the Half-Life 2 game rules
+//-----------------------------------------------------------------------------
+inline CHalfLife2* HL2GameRules()
+{
+#if ( !defined( HL2_DLL ) && !defined( HL2_CLIENT_DLL ) ) || defined( HL2MP )
+ Assert( 0 ); // g_pGameRules is NOT an instance of CHalfLife2 and bad things happen
+#endif
+
+ return static_cast<CHalfLife2*>(g_pGameRules);
+}
+
+
+
+#endif // HL2_GAMERULES_H
diff --git a/sp/src/game/shared/hl2/hl2_player_shared.h b/sp/src/game/shared/hl2/hl2_player_shared.h
index e26674e6..bae88dac 100644
--- a/sp/src/game/shared/hl2/hl2_player_shared.h
+++ b/sp/src/game/shared/hl2/hl2_player_shared.h
@@ -1,21 +1,21 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//=============================================================================//
-
-#ifndef HL2_PLAYER_SHARED_H
-#define HL2_PLAYER_SHARED_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-// Shared header file for players
-#if defined( CLIENT_DLL )
-#define CHL2_Player C_BaseHLPlayer //FIXME: Lovely naming job between server and client here...
-#include "c_basehlplayer.h"
-#else
-#include "hl2_player.h"
-#endif
-
-#endif // HL2_PLAYER_SHARED_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#ifndef HL2_PLAYER_SHARED_H
+#define HL2_PLAYER_SHARED_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+// Shared header file for players
+#if defined( CLIENT_DLL )
+#define CHL2_Player C_BaseHLPlayer //FIXME: Lovely naming job between server and client here...
+#include "c_basehlplayer.h"
+#else
+#include "hl2_player.h"
+#endif
+
+#endif // HL2_PLAYER_SHARED_H
diff --git a/sp/src/game/shared/hl2/hl2_shareddefs.h b/sp/src/game/shared/hl2/hl2_shareddefs.h
index 3fa3f3b9..e84d90c5 100644
--- a/sp/src/game/shared/hl2/hl2_shareddefs.h
+++ b/sp/src/game/shared/hl2/hl2_shareddefs.h
@@ -1,49 +1,49 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//=============================================================================//
-
-#ifndef HL2_SHAREDDEFS_H
-#define HL2_SHAREDDEFS_H
-
-#ifdef _WIN32
-#pragma once
-#endif
-
-#include "const.h"
-
-
-//--------------------------------------------------------------------------
-// Collision groups
-//--------------------------------------------------------------------------
-
-enum
-{
- HL2COLLISION_GROUP_PLASMANODE = LAST_SHARED_COLLISION_GROUP,
- HL2COLLISION_GROUP_SPIT,
- HL2COLLISION_GROUP_HOMING_MISSILE,
- HL2COLLISION_GROUP_COMBINE_BALL,
-
- HL2COLLISION_GROUP_FIRST_NPC,
- HL2COLLISION_GROUP_HOUNDEYE,
- HL2COLLISION_GROUP_CROW,
- HL2COLLISION_GROUP_HEADCRAB,
- HL2COLLISION_GROUP_STRIDER,
- HL2COLLISION_GROUP_GUNSHIP,
- HL2COLLISION_GROUP_ANTLION,
- HL2COLLISION_GROUP_LAST_NPC,
- HL2COLLISION_GROUP_COMBINE_BALL_NPC,
-};
-
-
-//--------------
-// HL2 SPECIFIC
-//--------------
-#define DMG_SNIPER (DMG_LASTGENERICFLAG<<1) // This is sniper damage
-#define DMG_MISSILEDEFENSE (DMG_LASTGENERICFLAG<<2) // The only kind of damage missiles take. (special missile defense)
-
-
-
-#endif // HL2_SHAREDDEFS_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef HL2_SHAREDDEFS_H
+#define HL2_SHAREDDEFS_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "const.h"
+
+
+//--------------------------------------------------------------------------
+// Collision groups
+//--------------------------------------------------------------------------
+
+enum
+{
+ HL2COLLISION_GROUP_PLASMANODE = LAST_SHARED_COLLISION_GROUP,
+ HL2COLLISION_GROUP_SPIT,
+ HL2COLLISION_GROUP_HOMING_MISSILE,
+ HL2COLLISION_GROUP_COMBINE_BALL,
+
+ HL2COLLISION_GROUP_FIRST_NPC,
+ HL2COLLISION_GROUP_HOUNDEYE,
+ HL2COLLISION_GROUP_CROW,
+ HL2COLLISION_GROUP_HEADCRAB,
+ HL2COLLISION_GROUP_STRIDER,
+ HL2COLLISION_GROUP_GUNSHIP,
+ HL2COLLISION_GROUP_ANTLION,
+ HL2COLLISION_GROUP_LAST_NPC,
+ HL2COLLISION_GROUP_COMBINE_BALL_NPC,
+};
+
+
+//--------------
+// HL2 SPECIFIC
+//--------------
+#define DMG_SNIPER (DMG_LASTGENERICFLAG<<1) // This is sniper damage
+#define DMG_MISSILEDEFENSE (DMG_LASTGENERICFLAG<<2) // The only kind of damage missiles take. (special missile defense)
+
+
+
+#endif // HL2_SHAREDDEFS_H
diff --git a/sp/src/game/shared/hl2/hl2_usermessages.cpp b/sp/src/game/shared/hl2/hl2_usermessages.cpp
index 86d83404..a5c81329 100644
--- a/sp/src/game/shared/hl2/hl2_usermessages.cpp
+++ b/sp/src/game/shared/hl2/hl2_usermessages.cpp
@@ -1,53 +1,53 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//=============================================================================//
-
-#include "cbase.h"
-#include "usermessages.h"
-#include "shake.h"
-#include "voice_gamemgr.h"
-
-// NVNT include to register in haptic user messages
-#include "haptics/haptic_msgs.h"
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include "tier0/memdbgon.h"
-
-void RegisterUserMessages( void )
-{
- usermessages->Register( "Geiger", 1 );
- usermessages->Register( "Train", 1 );
- usermessages->Register( "HudText", -1 );
- usermessages->Register( "SayText", -1 );
- usermessages->Register( "SayText2", -1 );
- usermessages->Register( "TextMsg", -1 );
- usermessages->Register( "HudMsg", -1 );
- usermessages->Register( "ResetHUD", 1); // called every respawn
- usermessages->Register( "GameTitle", 0 );
- usermessages->Register( "ItemPickup", -1 );
- usermessages->Register( "ShowMenu", -1 );
- usermessages->Register( "Shake", 13 );
- usermessages->Register( "Fade", 10 );
- usermessages->Register( "VGUIMenu", -1 ); // Show VGUI menu
- usermessages->Register( "Rumble", 3 ); // Send a rumble to a controller
- usermessages->Register( "Battery", 2 );
- usermessages->Register( "Damage", 18 ); // BUG: floats are sent for coords, no variable bitfields in hud & fixed size Msg
- usermessages->Register( "VoiceMask", VOICE_MAX_PLAYERS_DW*4 * 2 + 1 );
- usermessages->Register( "RequestState", 0 );
- usermessages->Register( "CloseCaption", -1 ); // Show a caption (by string id number)(duration in 10th of a second)
- usermessages->Register( "HintText", -1 ); // Displays hint text display
- usermessages->Register( "KeyHintText", -1 ); // Displays hint text display
- usermessages->Register( "SquadMemberDied", 0 );
- usermessages->Register( "AmmoDenied", 2 );
- usermessages->Register( "CreditsMsg", 1 );
- usermessages->Register( "LogoTimeMsg", 4 );
- usermessages->Register( "AchievementEvent", -1 );
- usermessages->Register( "UpdateJalopyRadar", -1 );
-
-#ifndef _X360
- // NVNT register haptic user messages
- RegisterHapticMessages();
-#endif
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "usermessages.h"
+#include "shake.h"
+#include "voice_gamemgr.h"
+
+// NVNT include to register in haptic user messages
+#include "haptics/haptic_msgs.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+void RegisterUserMessages( void )
+{
+ usermessages->Register( "Geiger", 1 );
+ usermessages->Register( "Train", 1 );
+ usermessages->Register( "HudText", -1 );
+ usermessages->Register( "SayText", -1 );
+ usermessages->Register( "SayText2", -1 );
+ usermessages->Register( "TextMsg", -1 );
+ usermessages->Register( "HudMsg", -1 );
+ usermessages->Register( "ResetHUD", 1); // called every respawn
+ usermessages->Register( "GameTitle", 0 );
+ usermessages->Register( "ItemPickup", -1 );
+ usermessages->Register( "ShowMenu", -1 );
+ usermessages->Register( "Shake", 13 );
+ usermessages->Register( "Fade", 10 );
+ usermessages->Register( "VGUIMenu", -1 ); // Show VGUI menu
+ usermessages->Register( "Rumble", 3 ); // Send a rumble to a controller
+ usermessages->Register( "Battery", 2 );
+ usermessages->Register( "Damage", 18 ); // BUG: floats are sent for coords, no variable bitfields in hud & fixed size Msg
+ usermessages->Register( "VoiceMask", VOICE_MAX_PLAYERS_DW*4 * 2 + 1 );
+ usermessages->Register( "RequestState", 0 );
+ usermessages->Register( "CloseCaption", -1 ); // Show a caption (by string id number)(duration in 10th of a second)
+ usermessages->Register( "HintText", -1 ); // Displays hint text display
+ usermessages->Register( "KeyHintText", -1 ); // Displays hint text display
+ usermessages->Register( "SquadMemberDied", 0 );
+ usermessages->Register( "AmmoDenied", 2 );
+ usermessages->Register( "CreditsMsg", 1 );
+ usermessages->Register( "LogoTimeMsg", 4 );
+ usermessages->Register( "AchievementEvent", -1 );
+ usermessages->Register( "UpdateJalopyRadar", -1 );
+
+#ifndef _X360
+ // NVNT register haptic user messages
+ RegisterHapticMessages();
+#endif
} \ No newline at end of file
diff --git a/sp/src/game/shared/hl2/hl2_vehicle_radar.h b/sp/src/game/shared/hl2/hl2_vehicle_radar.h
index d350ce41..102cc832 100644
--- a/sp/src/game/shared/hl2/hl2_vehicle_radar.h
+++ b/sp/src/game/shared/hl2/hl2_vehicle_radar.h
@@ -1,27 +1,27 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//
-//=============================================================================//
-#ifndef HL2_VEHICLE_RADAR_H
-#define HL2_VEHICLE_RADAR_H
-
-#define RADAR_MAX_CONTACTS 24
-#define RADAR_CONTACT_TYPE_BITS 3 // Max 8 types of contacts (for networking)
-#define RADAR_UPDATE_FREQUENCY 1.5f
-#define RADAR_UPDATE_FREQUENCY_FAST 0.5f
-
-enum // If we have more than 16 types of contacts, RADAR_CONTACT_TYPE_BITS
-{
- RADAR_CONTACT_NONE = -1,
- RADAR_CONTACT_GENERIC = 0,
- RADAR_CONTACT_MAGNUSSEN_RDU,
- RADAR_CONTACT_DOG,
- RADAR_CONTACT_ALLY_INSTALLATION,
- RADAR_CONTACT_ENEMY, // 'regular' sized enemy (Hunter)
- RADAR_CONTACT_LARGE_ENEMY, // Large enemy (Strider)
-};
-
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+#ifndef HL2_VEHICLE_RADAR_H
+#define HL2_VEHICLE_RADAR_H
+
+#define RADAR_MAX_CONTACTS 24
+#define RADAR_CONTACT_TYPE_BITS 3 // Max 8 types of contacts (for networking)
+#define RADAR_UPDATE_FREQUENCY 1.5f
+#define RADAR_UPDATE_FREQUENCY_FAST 0.5f
+
+enum // If we have more than 16 types of contacts, RADAR_CONTACT_TYPE_BITS
+{
+ RADAR_CONTACT_NONE = -1,
+ RADAR_CONTACT_GENERIC = 0,
+ RADAR_CONTACT_MAGNUSSEN_RDU,
+ RADAR_CONTACT_DOG,
+ RADAR_CONTACT_ALLY_INSTALLATION,
+ RADAR_CONTACT_ENEMY, // 'regular' sized enemy (Hunter)
+ RADAR_CONTACT_LARGE_ENEMY, // Large enemy (Strider)
+};
+
#endif \ No newline at end of file
diff --git a/sp/src/game/shared/hl2/hl_gamemovement.cpp b/sp/src/game/shared/hl2/hl_gamemovement.cpp
index 3218c991..e7e573ec 100644
--- a/sp/src/game/shared/hl2/hl_gamemovement.cpp
+++ b/sp/src/game/shared/hl2/hl_gamemovement.cpp
@@ -1,1152 +1,1152 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose: Special handling for hl2 usable ladders
-//
-//=============================================================================//
-#include "cbase.h"
-#include "hl_gamemovement.h"
-#include "in_buttons.h"
-#include "utlrbtree.h"
-#include "hl2_shareddefs.h"
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include "tier0/memdbgon.h"
-
-static ConVar sv_autoladderdismount( "sv_autoladderdismount", "1", FCVAR_REPLICATED, "Automatically dismount from ladders when you reach the end (don't have to +USE)." );
-static ConVar sv_ladderautomountdot( "sv_ladderautomountdot", "0.4", FCVAR_REPLICATED, "When auto-mounting a ladder by looking up its axis, this is the tolerance for looking now directly along the ladder axis." );
-
-static ConVar sv_ladder_useonly( "sv_ladder_useonly", "0", FCVAR_REPLICATED, "If set, ladders can only be mounted by pressing +USE" );
-
-#define USE_DISMOUNT_SPEED 100
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-CHL2GameMovement::CHL2GameMovement()
-{
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : type -
-// Output : int
-//-----------------------------------------------------------------------------
-int CHL2GameMovement::GetCheckInterval( IntervalType_t type )
-{
- // HL2 ladders need to check every frame!!!
- if ( type == LADDER )
- return 1;
-
- return BaseClass::GetCheckInterval( type );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-bool CHL2GameMovement::IsForceMoveActive()
-{
- LadderMove_t *lm = GetLadderMove();
- return lm->m_bForceLadderMove;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Debounce the USE button
-//-----------------------------------------------------------------------------
-void CHL2GameMovement::SwallowUseKey()
-{
- mv->m_nOldButtons |= IN_USE;
- player->m_afButtonPressed &= ~IN_USE;
-
- GetHL2Player()->m_bPlayUseDenySound = false;
-}
-
-#if !defined( CLIENT_DLL )
-// This is a simple helper class to reserver a player sized hull at a spot, owned by the current player so that nothing
-// can move into this spot and cause us to get stuck when we get there
-class CReservePlayerSpot : public CBaseEntity
-{
- DECLARE_CLASS( CReservePlayerSpot, CBaseEntity )
-public:
- static CReservePlayerSpot *ReserveSpot( CBasePlayer *owner, const Vector& org, const Vector& mins, const Vector& maxs, bool& validspot );
-
- virtual void Spawn();
-};
-
-CReservePlayerSpot *CReservePlayerSpot::ReserveSpot(
- CBasePlayer *owner, const Vector& org, const Vector& mins, const Vector& maxs, bool& validspot )
-{
- CReservePlayerSpot *spot = ( CReservePlayerSpot * )CreateEntityByName( "reserved_spot" );
- Assert( spot );
-
- spot->SetAbsOrigin( org );
- UTIL_SetSize( spot, mins, maxs );
- spot->SetOwnerEntity( owner );
- spot->Spawn();
-
- // See if spot is valid
- trace_t tr;
- UTIL_TraceHull(
- org,
- org,
- mins,
- maxs,
- MASK_PLAYERSOLID,
- owner,
- COLLISION_GROUP_PLAYER_MOVEMENT,
- &tr );
-
- validspot = !tr.startsolid;
-
- if ( !validspot )
- {
- Vector org2 = org + Vector( 0, 0, 1 );
-
- // See if spot is valid
- trace_t tr;
- UTIL_TraceHull(
- org2,
- org2,
- mins,
- maxs,
- MASK_PLAYERSOLID,
- owner,
- COLLISION_GROUP_PLAYER_MOVEMENT,
- &tr );
- validspot = !tr.startsolid;
- }
-
- return spot;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-void CReservePlayerSpot::Spawn()
-{
- BaseClass::Spawn();
-
- SetSolid( SOLID_BBOX );
- SetMoveType( MOVETYPE_NONE );
- // Make entity invisible
- AddEffects( EF_NODRAW );
-}
-
-LINK_ENTITY_TO_CLASS( reserved_spot, CReservePlayerSpot );
-
-#endif
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : mounting -
-// transit_speed -
-// goalpos -
-// *ladder -
-//-----------------------------------------------------------------------------
-void CHL2GameMovement::StartForcedMove( bool mounting, float transit_speed, const Vector& goalpos, CFuncLadder *ladder )
-{
- LadderMove_t* lm = GetLadderMove();
- Assert( lm );
- // Already active, just ignore
- if ( lm->m_bForceLadderMove )
- {
- return;
- }
-
-#if !defined( CLIENT_DLL )
- if ( ladder )
- {
- ladder->PlayerGotOn( GetHL2Player() );
-
- // If the Ladder only wants to be there for automount checking, abort now
- if ( ladder->DontGetOnLadder() )
- return;
- }
-
- // Reserve goal slot here
- bool valid = false;
- lm->m_hReservedSpot = CReservePlayerSpot::ReserveSpot(
- player,
- goalpos,
- GetPlayerMins( ( player->GetFlags() & FL_DUCKING ) ? true : false ),
- GetPlayerMaxs( ( player->GetFlags() & FL_DUCKING ) ? true : false ),
- valid );
- if ( !valid )
- {
- // FIXME: Play a deny sound?
- if ( lm->m_hReservedSpot )
- {
- UTIL_Remove( lm->m_hReservedSpot );
- lm->m_hReservedSpot = NULL;
- }
- return;
- }
-#endif
-
- // Use current player origin as start and new origin as dest
- lm->m_vecGoalPosition = goalpos;
- lm->m_vecStartPosition = mv->GetAbsOrigin();
-
- // Figure out how long it will take to make the gap based on transit_speed
- Vector delta = lm->m_vecGoalPosition - lm->m_vecStartPosition;
-
- float distance = delta.Length();
-
- Assert( transit_speed > 0.001f );
-
- // Compute time required to move that distance
- float transit_time = distance / transit_speed;
- if ( transit_time < 0.001f )
- {
- transit_time = 0.001f;
- }
-
- lm->m_bForceLadderMove = true;
- lm->m_bForceMount = mounting;
-
- lm->m_flStartTime = gpGlobals->curtime;
- lm->m_flArrivalTime = lm->m_flStartTime + transit_time;
-
- lm->m_hForceLadder = ladder;
-
- // Don't get stuck during this traversal since we'll just be slamming the player origin
- player->SetMoveType( MOVETYPE_NONE );
- player->SetMoveCollide( MOVECOLLIDE_DEFAULT );
- player->SetSolid( SOLID_NONE );
- SetLadder( ladder );
-
- // Debounce the use key
- SwallowUseKey();
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Returns false when finished
-//-----------------------------------------------------------------------------
-bool CHL2GameMovement::ContinueForcedMove()
-{
- LadderMove_t* lm = GetLadderMove();
- Assert( lm );
- Assert( lm->m_bForceLadderMove );
-
- // Suppress regular motion
- mv->m_flForwardMove = 0.0f;
- mv->m_flSideMove = 0.0f;
- mv->m_flUpMove = 0.0f;
-
- // How far along are we
- float frac = ( gpGlobals->curtime - lm->m_flStartTime ) / ( lm->m_flArrivalTime - lm->m_flStartTime );
- if ( frac > 1.0f )
- {
- lm->m_bForceLadderMove = false;
-#if !defined( CLIENT_DLL )
- // Remove "reservation entity"
- if ( lm->m_hReservedSpot )
- {
- UTIL_Remove( lm->m_hReservedSpot );
- lm->m_hReservedSpot = NULL;
- }
-#endif
- }
-
- frac = clamp( frac, 0.0f, 1.0f );
-
- // Move origin part of the way
- Vector delta = lm->m_vecGoalPosition - lm->m_vecStartPosition;
-
- // Compute interpolated position
- Vector org;
- VectorMA( lm->m_vecStartPosition, frac, delta, org );
- mv->SetAbsOrigin( org );
-
- // If finished moving, reset player to correct movetype (or put them on the ladder)
- if ( !lm->m_bForceLadderMove )
- {
- player->SetSolid( SOLID_BBOX );
- player->SetMoveType( MOVETYPE_WALK );
-
- if ( lm->m_bForceMount && lm->m_hForceLadder != NULL )
- {
- player->SetMoveType( MOVETYPE_LADDER );
- SetLadder( lm->m_hForceLadder );
- }
-
- // Zero out any velocity
- mv->m_vecVelocity.Init();
- }
-
- // Stil active
- return lm->m_bForceLadderMove;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Returns true if the player is on a ladder
-// Input : &trace - ignored
-//-----------------------------------------------------------------------------
-bool CHL2GameMovement::OnLadder( trace_t &trace )
-{
- return ( GetLadder() != NULL ) ? true : false;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : ladders -
-// maxdist -
-// **ppLadder -
-// ladderOrigin -
-//-----------------------------------------------------------------------------
-void CHL2GameMovement::Findladder( float maxdist, CFuncLadder **ppLadder, Vector& ladderOrigin, const CFuncLadder *skipLadder )
-{
- CFuncLadder *bestLadder = NULL;
- float bestDist = MAX_COORD_INTEGER;
- Vector bestOrigin;
-
- bestOrigin.Init();
-
- float maxdistSqr = maxdist * maxdist;
-
-
- int c = CFuncLadder::GetLadderCount();
- for ( int i = 0 ; i < c; i++ )
- {
- CFuncLadder *ladder = CFuncLadder::GetLadder( i );
-
- if ( !ladder->IsEnabled() )
- continue;
-
- if ( skipLadder && ladder == skipLadder )
- continue;
-
- Vector topPosition;
- Vector bottomPosition;
-
- ladder->GetTopPosition( topPosition );
- ladder->GetBottomPosition( bottomPosition );
-
- Vector closest;
- CalcClosestPointOnLineSegment( mv->GetAbsOrigin(), bottomPosition, topPosition, closest, NULL );
-
- float distSqr = ( closest - mv->GetAbsOrigin() ).LengthSqr();
-
- // Too far away
- if ( distSqr > maxdistSqr )
- {
- continue;
- }
-
- // Need to trace to see if it's clear
- trace_t tr;
-
- UTIL_TraceLine( mv->GetAbsOrigin(), closest,
- MASK_PLAYERSOLID,
- player,
- COLLISION_GROUP_NONE,
- &tr );
-
- if ( tr.fraction != 1.0f &&
- tr.m_pEnt &&
- tr.m_pEnt != ladder )
- {
- // Try a trace stepped up from the ground a bit, in case there's something at ground level blocking us.
- float sizez = GetPlayerMaxs().z - GetPlayerMins().z;
-
- UTIL_TraceLine( mv->GetAbsOrigin() + Vector( 0, 0, sizez * 0.5f ), closest,
- MASK_PLAYERSOLID,
- player,
- COLLISION_GROUP_NONE,
- &tr );
-
- if ( tr.fraction != 1.0f &&
- tr.m_pEnt &&
- tr.m_pEnt != ladder &&
- !tr.m_pEnt->IsSolidFlagSet( FSOLID_TRIGGER ) )
- {
- continue;
- }
- }
-
- // See if this is the best one so far
- if ( distSqr < bestDist )
- {
- bestDist = distSqr;
- bestLadder = ladder;
- bestOrigin = closest;
- }
- }
-
- // Return best ladder spot
- *ppLadder = bestLadder;
- ladderOrigin = bestOrigin;
-
-}
-
-static bool NearbyDismountLessFunc( const NearbyDismount_t& lhs, const NearbyDismount_t& rhs )
-{
- return lhs.distSqr < rhs.distSqr;
-}
-
-void CHL2GameMovement::GetSortedDismountNodeList( const Vector &org, float radius, CFuncLadder *ladder, CUtlRBTree< NearbyDismount_t, int >& list )
-{
- float radiusSqr = radius * radius;
-
- int i;
- int c = ladder->GetDismountCount();
- for ( i = 0; i < c; i++ )
- {
- CInfoLadderDismount *spot = ladder->GetDismount( i );
- if ( !spot )
- continue;
-
- float distSqr = ( spot->GetAbsOrigin() - org ).LengthSqr();
- if ( distSqr > radiusSqr )
- continue;
-
- NearbyDismount_t nd;
- nd.dismount = spot;
- nd.distSqr = distSqr;
-
- list.Insert( nd );
- }
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// *ladder -
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-bool CHL2GameMovement::ExitLadderViaDismountNode( CFuncLadder *ladder, bool strict, bool useAlternate )
-{
- // Find the best ladder exit node
- float bestDot = -99999.0f;
- float bestDistance = 99999.0f;
- Vector bestDest;
- bool found = false;
-
- // For 'alternate' dismount
- bool foundAlternate = false;
- Vector alternateDest;
- float alternateDist = 99999.0f;
-
- CUtlRBTree< NearbyDismount_t, int > nearbyDismounts( 0, 0, NearbyDismountLessFunc );
-
- GetSortedDismountNodeList( mv->GetAbsOrigin(), 100.0f, ladder, nearbyDismounts );
-
- int i;
-
- for ( i = nearbyDismounts.FirstInorder(); i != nearbyDismounts.InvalidIndex() ; i = nearbyDismounts.NextInorder( i ) )
- {
- CInfoLadderDismount *spot = nearbyDismounts[ i ].dismount;
- if ( !spot )
- {
- Assert( !"What happened to the spot!!!" );
- continue;
- }
-
- // See if it's valid to put the player there...
- Vector org = spot->GetAbsOrigin() + Vector( 0, 0, 1 );
-
- trace_t tr;
- UTIL_TraceHull(
- org,
- org,
- GetPlayerMins( ( player->GetFlags() & FL_DUCKING ) ? true : false ),
- GetPlayerMaxs( ( player->GetFlags() & FL_DUCKING ) ? true : false ),
- MASK_PLAYERSOLID,
- player,
- COLLISION_GROUP_PLAYER_MOVEMENT,
- &tr );
-
- // Nope...
- if ( tr.startsolid )
- {
- continue;
- }
-
- // Find the best dot product
- Vector vecToSpot = org - ( mv->GetAbsOrigin() + player->GetViewOffset() );
- vecToSpot.z = 0.0f;
- float d = VectorNormalize( vecToSpot );
-
- float dot = vecToSpot.Dot( m_vecForward );
-
- // We're not facing at it...ignore
- if ( dot < 0.5f )
- {
- if( useAlternate && d < alternateDist )
- {
- alternateDest = org;
- alternateDist = d;
- foundAlternate = true;
- }
-
- continue;
- }
-
- if ( dot > bestDot )
- {
- bestDest = org;
- bestDistance = d;
- bestDot = dot;
- found = true;
- }
- }
-
- if ( found )
- {
- // Require a more specific
- if ( strict &&
- ( ( bestDot < 0.7f ) || ( bestDistance > 40.0f ) ) )
- {
- return false;
- }
-
- StartForcedMove( false, player->MaxSpeed(), bestDest, NULL );
- return true;
- }
-
- if( useAlternate )
- {
- // Desperate. Don't refuse to let a person off of a ladder if it can be helped. Use the
- // alternate dismount if there is one.
- if( foundAlternate && alternateDist <= 60.0f )
- {
- StartForcedMove( false, player->MaxSpeed(), alternateDest, NULL );
- return true;
- }
- }
-
- return false;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : bOnLadder -
-//-----------------------------------------------------------------------------
-void CHL2GameMovement::FullLadderMove()
-{
-#if !defined( CLIENT_DLL )
- CFuncLadder *ladder = GetLadder();
- Assert( ladder );
- if ( !ladder )
- {
- return;
- }
-
- CheckWater();
-
- // Was jump button pressed? If so, don't do anything here
- if ( mv->m_nButtons & IN_JUMP )
- {
- CheckJumpButton();
- return;
- }
- else
- {
- mv->m_nOldButtons &= ~IN_JUMP;
- }
-
- player->SetGroundEntity( NULL );
-
- // Remember old positions in case we cancel this movement
- Vector oldVelocity = mv->m_vecVelocity;
- Vector oldOrigin = mv->GetAbsOrigin();
-
- Vector topPosition;
- Vector bottomPosition;
-
- ladder->GetTopPosition( topPosition );
- ladder->GetBottomPosition( bottomPosition );
-
- // Compute parametric distance along ladder vector...
- float oldt;
- CalcDistanceSqrToLine( mv->GetAbsOrigin(), topPosition, bottomPosition, &oldt );
-
- // Perform the move accounting for any base velocity.
- VectorAdd (mv->m_vecVelocity, player->GetBaseVelocity(), mv->m_vecVelocity);
- TryPlayerMove();
- VectorSubtract (mv->m_vecVelocity, player->GetBaseVelocity(), mv->m_vecVelocity);
-
- // Pressed buttons are "changed(xor)" and'ed with the mask of currently held buttons
- int buttonsChanged = ( mv->m_nOldButtons ^ mv->m_nButtons ); // These buttons have changed this frame
- int buttonsPressed = buttonsChanged & mv->m_nButtons;
- bool pressed_use = ( buttonsPressed & IN_USE ) ? true : false;
- bool pressing_forward_or_side = mv->m_flForwardMove != 0.0f || mv->m_flSideMove != 0.0f;
-
- Vector ladderVec = topPosition - bottomPosition;
- float LadderLength = VectorNormalize( ladderVec );
- // This test is not perfect by any means, but should help a bit
- bool moving_along_ladder = false;
- if ( pressing_forward_or_side )
- {
- float fwdDot = m_vecForward.Dot( ladderVec );
- if ( fabs( fwdDot ) > 0.9f )
- {
- moving_along_ladder = true;
- }
- }
-
- // Compute parametric distance along ladder vector...
- float newt;
- CalcDistanceSqrToLine( mv->GetAbsOrigin(), topPosition, bottomPosition, &newt );
-
- // Fudge of 2 units
- float tolerance = 1.0f / LadderLength;
-
- bool wouldleaveladder = false;
- // Moving pPast top or bottom?
- if ( newt < -tolerance )
- {
- wouldleaveladder = newt < oldt;
- }
- else if ( newt > ( 1.0f + tolerance ) )
- {
- wouldleaveladder = newt > oldt;
- }
-
- // See if we are near the top or bottom but not moving
- float dist1sqr, dist2sqr;
-
- dist1sqr = ( topPosition - mv->GetAbsOrigin() ).LengthSqr();
- dist2sqr = ( bottomPosition - mv->GetAbsOrigin() ).LengthSqr();
-
- float dist = MIN( dist1sqr, dist2sqr );
- bool neardismountnode = ( dist < 16.0f * 16.0f ) ? true : false;
- float ladderUnitsPerTick = ( MAX_CLIMB_SPEED * gpGlobals->interval_per_tick );
- bool neardismountnode2 = ( dist < ladderUnitsPerTick * ladderUnitsPerTick ) ? true : false;
-
- // Really close to node, cvar is set, and pressing a key, then simulate a +USE
- bool auto_dismount_use = ( neardismountnode2 &&
- sv_autoladderdismount.GetBool() &&
- pressing_forward_or_side &&
- !moving_along_ladder );
-
- bool fully_underwater = ( player->GetWaterLevel() == WL_Eyes ) ? true : false;
-
- // If the user manually pressed use or we're simulating it, then use_dismount will occur
- bool use_dismount = pressed_use || auto_dismount_use;
-
- if ( fully_underwater && !use_dismount )
- {
- // If fully underwater, we require looking directly at a dismount node
- /// to "float off" a ladder mid way...
- if ( ExitLadderViaDismountNode( ladder, true ) )
- {
- // See if they +used a dismount point mid-span..
- return;
- }
- }
-
- // If the movement would leave the ladder and they're not automated or pressing use, disallow the movement
- if ( !use_dismount )
- {
- if ( wouldleaveladder )
- {
- // Don't let them leave the ladder if they were on it
- mv->m_vecVelocity = oldVelocity;
- mv->SetAbsOrigin( oldOrigin );
- }
- return;
- }
-
- // If the move would not leave the ladder and we're near close to the end, then just accept the move
- if ( !wouldleaveladder && !neardismountnode )
- {
- // Otherwise, if the move would leave the ladder, disallow it.
- if ( pressed_use )
- {
- if ( ExitLadderViaDismountNode( ladder, false, IsX360() ) )
- {
- // See if they +used a dismount point mid-span..
- return;
- }
-
- player->SetMoveType( MOVETYPE_WALK );
- player->SetMoveCollide( MOVECOLLIDE_DEFAULT );
- SetLadder( NULL );
- GetHL2Player()->m_bPlayUseDenySound = false;
-
- // Dismount with a bit of velocity in facing direction
- VectorScale( m_vecForward, USE_DISMOUNT_SPEED, mv->m_vecVelocity );
- mv->m_vecVelocity.z = 50;
- }
- return;
- }
-
- // Debounce the use key
- if ( pressed_use )
- {
- SwallowUseKey();
- }
-
- // Try auto exit, if possible
- if ( ExitLadderViaDismountNode( ladder, false, pressed_use ) )
- {
- return;
- }
-
- if ( wouldleaveladder )
- {
- // Otherwise, if the move would leave the ladder, disallow it.
- if ( pressed_use )
- {
- player->SetMoveType( MOVETYPE_WALK );
- player->SetMoveCollide( MOVECOLLIDE_DEFAULT );
- SetLadder( NULL );
-
- // Dismount with a bit of velocity in facing direction
- VectorScale( m_vecForward, USE_DISMOUNT_SPEED, mv->m_vecVelocity );
- mv->m_vecVelocity.z = 50;
- }
- else
- {
- mv->m_vecVelocity = oldVelocity;
- mv->SetAbsOrigin( oldOrigin );
- }
- }
-#endif
-}
-
-bool CHL2GameMovement::CheckLadderAutoMountEndPoint( CFuncLadder *ladder, const Vector& bestOrigin )
-{
- // See if we're really near an endpoint
- if ( !ladder )
- return false;
-
- Vector top, bottom;
- ladder->GetTopPosition( top );
- ladder->GetBottomPosition( bottom );
-
- float d1, d2;
-
- d1 = ( top - mv->GetAbsOrigin() ).LengthSqr();
- d2 = ( bottom - mv->GetAbsOrigin() ).LengthSqr();
-
- if ( d1 > 16 * 16 && d2 > 16 * 16 )
- return false;
-
- Vector ladderAxis;
-
- if ( d1 < 16 * 16 )
- {
- // Close to top
- ladderAxis = bottom - top;
- }
- else
- {
- ladderAxis = top - bottom;
- }
-
- VectorNormalize( ladderAxis );
-
- if ( ladderAxis.Dot( m_vecForward ) > sv_ladderautomountdot.GetFloat() )
- {
- StartForcedMove( true, player->MaxSpeed(), bestOrigin, ladder );
- return true;
- }
-
- return false;
-}
-
-bool CHL2GameMovement::CheckLadderAutoMountCone( CFuncLadder *ladder, const Vector& bestOrigin, float maxAngleDelta, float maxDistToLadder )
-{
- // Never 'back' onto ladders or stafe onto ladders
- if ( ladder != NULL &&
- ( mv->m_flForwardMove > 0.0f ) )
- {
- Vector top, bottom;
- ladder->GetTopPosition( top );
- ladder->GetBottomPosition( bottom );
-
- Vector ladderAxis = top - bottom;
- VectorNormalize( ladderAxis );
-
- Vector probe = mv->GetAbsOrigin();
-
- Vector closest;
- CalcClosestPointOnLineSegment( probe, bottom, top, closest, NULL );
-
- Vector vecToLadder = closest - probe;
-
- float dist = VectorNormalize( vecToLadder );
-
- Vector flatLadder = vecToLadder;
- flatLadder.z = 0.0f;
- Vector flatForward = m_vecForward;
- flatForward.z = 0.0f;
-
- VectorNormalize( flatLadder );
- VectorNormalize( flatForward );
-
- float facingDot = flatForward.Dot( flatLadder );
- float angle = acos( facingDot ) * 180 / M_PI;
-
- bool closetoladder = ( dist != 0.0f && dist < maxDistToLadder ) ? true : false;
- bool reallyclosetoladder = ( dist != 0.0f && dist < 4.0f ) ? true : false;
-
- bool facingladderaxis = ( angle < maxAngleDelta ) ? true : false;
- bool facingalongaxis = ( (float)fabs( ladderAxis.Dot( m_vecForward ) ) > sv_ladderautomountdot.GetFloat() ) ? true : false;
-#if 0
- Msg( "close %i length %.3f maxdist %.3f facing %.3f dot %.3f ang %.3f\n",
- closetoladder ? 1 : 0,
- dist,
- maxDistToLadder,
- (float)fabs( ladderAxis.Dot( m_vecForward ) ),
- facingDot,
- angle);
-#endif
-
- // Tracker 21776: Don't mount ladders this way if strafing
- bool strafing = ( fabs( mv->m_flSideMove ) < 1.0f ) ? false : true;
-
- if ( ( ( facingDot > 0.0f && !strafing ) || facingalongaxis ) &&
- ( facingladderaxis || reallyclosetoladder ) &&
- closetoladder )
- {
- StartForcedMove( true, player->MaxSpeed(), bestOrigin, ladder );
- return true;
- }
- }
-
- return false;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Must be facing toward ladder
-// Input : *ladder -
-// Output : Returns true on success, false on failure.
-//-----------------------------------------------------------------------------
-bool CHL2GameMovement::LookingAtLadder( CFuncLadder *ladder )
-{
- if ( !ladder )
- {
- return false;
- }
-
- // Get ladder end points
- Vector top, bottom;
- ladder->GetTopPosition( top );
- ladder->GetBottomPosition( bottom );
-
- // Find closest point on ladder to player (could be an endpoint)
- Vector closest;
- CalcClosestPointOnLineSegment( mv->GetAbsOrigin(), bottom, top, closest, NULL );
-
- // Flatten our view direction to 2D
- Vector flatForward = m_vecForward;
- flatForward.z = 0.0f;
-
- // Because the ladder itself is not a solid, the player's origin may actually be
- // permitted to pass it, and that will screw up our dot product.
- // So back up the player's origin a bit to do the facing calculation.
- Vector vecAdjustedOrigin = mv->GetAbsOrigin() - 8.0f * flatForward;
-
- // Figure out vector from player to closest point on ladder
- Vector vecToLadder = closest - vecAdjustedOrigin;
-
- // Flatten it to 2D
- Vector flatLadder = vecToLadder;
- flatLadder.z = 0.0f;
-
- // Normalize the vectors (unnecessary)
- VectorNormalize( flatLadder );
- VectorNormalize( flatForward );
-
- // Compute dot product to see if forward is in same direction as vec to ladder
- float facingDot = flatForward.Dot( flatLadder );
-
- float requiredDot = ( sv_ladder_useonly.GetBool() ) ? -0.99 : 0.0;
-
- // Facing same direction if dot > = requiredDot...
- bool facingladder = ( facingDot >= requiredDot );
-
- return facingladder;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : &trace -
-//-----------------------------------------------------------------------------
-bool CHL2GameMovement::CheckLadderAutoMount( CFuncLadder *ladder, const Vector& bestOrigin )
-{
-#if !defined( CLIENT_DLL )
-
- if ( ladder != NULL )
- {
- StartForcedMove( true, player->MaxSpeed(), bestOrigin, ladder );
- return true;
- }
-
-#endif
- return false;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-bool CHL2GameMovement::LadderMove( void )
-{
-
- if ( player->GetMoveType() == MOVETYPE_NOCLIP )
- {
- SetLadder( NULL );
- return false;
- }
-
- // If being forced to mount/dismount continue to act like we are on the ladder
- if ( IsForceMoveActive() && ContinueForcedMove() )
- {
- return true;
- }
-
- CFuncLadder *bestLadder = NULL;
- Vector bestOrigin( 0, 0, 0 );
-
- CFuncLadder *ladder = GetLadder();
-
- // Something 1) deactivated the ladder... or 2) something external applied
- // a force to us. In either case make the player fall, etc.
- if ( ladder &&
- ( !ladder->IsEnabled() ||
- ( player->GetBaseVelocity().LengthSqr() > 1.0f ) ) )
- {
- GetHL2Player()->ExitLadder();
- ladder = NULL;
- }
-
- if ( !ladder )
- {
- Findladder( 64.0f, &bestLadder, bestOrigin, NULL );
- }
-
-#if !defined (CLIENT_DLL)
- if( !ladder && bestLadder && sv_ladder_useonly.GetBool() )
- {
- GetHL2Player()->DisplayLadderHudHint();
- }
-#endif
-
- int buttonsChanged = ( mv->m_nOldButtons ^ mv->m_nButtons ); // These buttons have changed this frame
- int buttonsPressed = buttonsChanged & mv->m_nButtons;
- bool pressed_use = ( buttonsPressed & IN_USE ) ? true : false;
-
- // If I'm already moving on a ladder, use the previous ladder direction
- if ( !ladder && !pressed_use )
- {
- // If flying through air, allow mounting ladders if we are facing < 15 degress from the ladder and we are close
- if ( !ladder && !sv_ladder_useonly.GetBool() )
- {
- // Tracker 6625: Don't need to be leaping to auto mount using this method...
- // But if we are on the ground, then we must not be backing into the ladder (Tracker 12961)
- bool onground = player->GetGroundEntity() ? true : false;
- if ( !onground || ( mv->m_flForwardMove > 0.0f ) )
- {
- if ( CheckLadderAutoMountCone( bestLadder, bestOrigin, 15.0f, 32.0f ) )
- {
- return true;
- }
- }
-
- // Pressing forward while looking at ladder and standing (or floating) near a mounting point
- if ( mv->m_flForwardMove > 0.0f )
- {
- if ( CheckLadderAutoMountEndPoint( bestLadder, bestOrigin ) )
- {
- return true;
- }
- }
- }
-
- return false;
- }
-
- if ( !ladder &&
- LookingAtLadder( bestLadder ) &&
- CheckLadderAutoMount( bestLadder, bestOrigin ) )
- {
- return true;
- }
-
- // Reassign the ladder
- ladder = GetLadder();
- if ( !ladder )
- {
- return false;
- }
-
- // Don't play the deny sound
- if ( pressed_use )
- {
- GetHL2Player()->m_bPlayUseDenySound = false;
- }
-
- // Make sure we are on the ladder
- player->SetMoveType( MOVETYPE_LADDER );
- player->SetMoveCollide( MOVECOLLIDE_DEFAULT );
-
- player->SetGravity( 0.0f );
-
- float forwardSpeed = 0.0f;
- float rightSpeed = 0.0f;
-
- float speed = player->MaxSpeed();
-
-
- if ( mv->m_nButtons & IN_BACK )
- {
- forwardSpeed -= speed;
- }
-
- if ( mv->m_nButtons & IN_FORWARD )
- {
- forwardSpeed += speed;
- }
-
- if ( mv->m_nButtons & IN_MOVELEFT )
- {
- rightSpeed -= speed;
- }
-
- if ( mv->m_nButtons & IN_MOVERIGHT )
- {
- rightSpeed += speed;
- }
-
- if ( mv->m_nButtons & IN_JUMP )
- {
- player->SetMoveType( MOVETYPE_WALK );
- // Remove from ladder
- SetLadder( NULL );
-
- // Jump in view direction
- Vector jumpDir = m_vecForward;
-
- // unless pressing backward or something like that
- if ( mv->m_flForwardMove < 0.0f )
- {
- jumpDir = -jumpDir;
- }
-
- VectorNormalize( jumpDir );
-
- VectorScale( jumpDir, MAX_CLIMB_SPEED, mv->m_vecVelocity );
- // Tracker 13558: Don't add any extra z velocity if facing downward at all
- if ( m_vecForward.z >= 0.0f )
- {
- mv->m_vecVelocity.z = mv->m_vecVelocity.z + 50;
- }
- return false;
- }
-
- if ( forwardSpeed != 0 || rightSpeed != 0 )
- {
- // See if the player is looking toward the top or the bottom
- Vector velocity;
-
- VectorScale( m_vecForward, forwardSpeed, velocity );
- VectorMA( velocity, rightSpeed, m_vecRight, velocity );
-
- VectorNormalize( velocity );
-
- Vector ladderUp;
- ladder->ComputeLadderDir( ladderUp );
- VectorNormalize( ladderUp );
-
- Vector topPosition;
- Vector bottomPosition;
-
- ladder->GetTopPosition( topPosition );
- ladder->GetBottomPosition( bottomPosition );
-
- // Check to see if we've mounted the ladder in a bogus spot and, if so, just fall off the ladder...
- float dummyt = 0.0f;
- float distFromLadderSqr = CalcDistanceSqrToLine( mv->GetAbsOrigin(), topPosition, bottomPosition, &dummyt );
- if ( distFromLadderSqr > 36.0f )
- {
- // Uh oh, we fell off zee ladder...
- player->SetMoveType( MOVETYPE_WALK );
- // Remove from ladder
- SetLadder( NULL );
- return false;
- }
-
- bool ishorizontal = fabs( topPosition.z - bottomPosition.z ) < 64.0f ? true : false;
-
- float changeover = ishorizontal ? 0.0f : 0.3f;
-
- float factor = 1.0f;
- if ( velocity.z >= 0 )
- {
- float dotTop = ladderUp.Dot( velocity );
- if ( dotTop < -changeover )
- {
- // Aimed at bottom
- factor = -1.0f;
- }
- }
- else
- {
- float dotBottom = -ladderUp.Dot( velocity );
- if ( dotBottom > changeover )
- {
- factor = -1.0f;
- }
- }
-
-#ifdef _XBOX
- if( sv_ladders_useonly.GetBool() )
- {
- // Stick up climbs up, stick down climbs down. No matter which way you're looking.
- if ( mv->m_nButtons & IN_FORWARD )
- {
- factor = 1.0f;
- }
- else if( mv->m_nButtons & IN_BACK )
- {
- factor = -1.0f;
- }
- }
-#endif//_XBOX
-
- mv->m_vecVelocity = MAX_CLIMB_SPEED * factor * ladderUp;
- }
- else
- {
- mv->m_vecVelocity.Init();
- }
-
- return true;
-}
-
-void CHL2GameMovement::SetGroundEntity( trace_t *pm )
-{
- CBaseEntity *newGround = pm ? pm->m_pEnt : NULL;
-
- //Adrian: Special case for combine balls.
- if ( newGround && newGround->GetCollisionGroup() == HL2COLLISION_GROUP_COMBINE_BALL_NPC )
- {
- return;
- }
-
- BaseClass::SetGroundEntity( pm );
-}
-
-bool CHL2GameMovement::CanAccelerate()
-{
-#ifdef HL2MP
- if ( player->IsObserver() )
- {
- return true;
- }
-#endif
-
- BaseClass::CanAccelerate();
-
- return true;
-}
-
-
-#ifndef PORTAL // Portal inherits from this but needs to declare it's own global interface
- // Expose our interface.
- static CHL2GameMovement g_GameMovement;
- IGameMovement *g_pGameMovement = ( IGameMovement * )&g_GameMovement;
-
- EXPOSE_SINGLE_INTERFACE_GLOBALVAR(CGameMovement, IGameMovement,INTERFACENAME_GAMEMOVEMENT, g_GameMovement );
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Special handling for hl2 usable ladders
+//
+//=============================================================================//
+#include "cbase.h"
+#include "hl_gamemovement.h"
+#include "in_buttons.h"
+#include "utlrbtree.h"
+#include "hl2_shareddefs.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+static ConVar sv_autoladderdismount( "sv_autoladderdismount", "1", FCVAR_REPLICATED, "Automatically dismount from ladders when you reach the end (don't have to +USE)." );
+static ConVar sv_ladderautomountdot( "sv_ladderautomountdot", "0.4", FCVAR_REPLICATED, "When auto-mounting a ladder by looking up its axis, this is the tolerance for looking now directly along the ladder axis." );
+
+static ConVar sv_ladder_useonly( "sv_ladder_useonly", "0", FCVAR_REPLICATED, "If set, ladders can only be mounted by pressing +USE" );
+
+#define USE_DISMOUNT_SPEED 100
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CHL2GameMovement::CHL2GameMovement()
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : type -
+// Output : int
+//-----------------------------------------------------------------------------
+int CHL2GameMovement::GetCheckInterval( IntervalType_t type )
+{
+ // HL2 ladders need to check every frame!!!
+ if ( type == LADDER )
+ return 1;
+
+ return BaseClass::GetCheckInterval( type );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CHL2GameMovement::IsForceMoveActive()
+{
+ LadderMove_t *lm = GetLadderMove();
+ return lm->m_bForceLadderMove;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Debounce the USE button
+//-----------------------------------------------------------------------------
+void CHL2GameMovement::SwallowUseKey()
+{
+ mv->m_nOldButtons |= IN_USE;
+ player->m_afButtonPressed &= ~IN_USE;
+
+ GetHL2Player()->m_bPlayUseDenySound = false;
+}
+
+#if !defined( CLIENT_DLL )
+// This is a simple helper class to reserver a player sized hull at a spot, owned by the current player so that nothing
+// can move into this spot and cause us to get stuck when we get there
+class CReservePlayerSpot : public CBaseEntity
+{
+ DECLARE_CLASS( CReservePlayerSpot, CBaseEntity )
+public:
+ static CReservePlayerSpot *ReserveSpot( CBasePlayer *owner, const Vector& org, const Vector& mins, const Vector& maxs, bool& validspot );
+
+ virtual void Spawn();
+};
+
+CReservePlayerSpot *CReservePlayerSpot::ReserveSpot(
+ CBasePlayer *owner, const Vector& org, const Vector& mins, const Vector& maxs, bool& validspot )
+{
+ CReservePlayerSpot *spot = ( CReservePlayerSpot * )CreateEntityByName( "reserved_spot" );
+ Assert( spot );
+
+ spot->SetAbsOrigin( org );
+ UTIL_SetSize( spot, mins, maxs );
+ spot->SetOwnerEntity( owner );
+ spot->Spawn();
+
+ // See if spot is valid
+ trace_t tr;
+ UTIL_TraceHull(
+ org,
+ org,
+ mins,
+ maxs,
+ MASK_PLAYERSOLID,
+ owner,
+ COLLISION_GROUP_PLAYER_MOVEMENT,
+ &tr );
+
+ validspot = !tr.startsolid;
+
+ if ( !validspot )
+ {
+ Vector org2 = org + Vector( 0, 0, 1 );
+
+ // See if spot is valid
+ trace_t tr;
+ UTIL_TraceHull(
+ org2,
+ org2,
+ mins,
+ maxs,
+ MASK_PLAYERSOLID,
+ owner,
+ COLLISION_GROUP_PLAYER_MOVEMENT,
+ &tr );
+ validspot = !tr.startsolid;
+ }
+
+ return spot;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CReservePlayerSpot::Spawn()
+{
+ BaseClass::Spawn();
+
+ SetSolid( SOLID_BBOX );
+ SetMoveType( MOVETYPE_NONE );
+ // Make entity invisible
+ AddEffects( EF_NODRAW );
+}
+
+LINK_ENTITY_TO_CLASS( reserved_spot, CReservePlayerSpot );
+
+#endif
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : mounting -
+// transit_speed -
+// goalpos -
+// *ladder -
+//-----------------------------------------------------------------------------
+void CHL2GameMovement::StartForcedMove( bool mounting, float transit_speed, const Vector& goalpos, CFuncLadder *ladder )
+{
+ LadderMove_t* lm = GetLadderMove();
+ Assert( lm );
+ // Already active, just ignore
+ if ( lm->m_bForceLadderMove )
+ {
+ return;
+ }
+
+#if !defined( CLIENT_DLL )
+ if ( ladder )
+ {
+ ladder->PlayerGotOn( GetHL2Player() );
+
+ // If the Ladder only wants to be there for automount checking, abort now
+ if ( ladder->DontGetOnLadder() )
+ return;
+ }
+
+ // Reserve goal slot here
+ bool valid = false;
+ lm->m_hReservedSpot = CReservePlayerSpot::ReserveSpot(
+ player,
+ goalpos,
+ GetPlayerMins( ( player->GetFlags() & FL_DUCKING ) ? true : false ),
+ GetPlayerMaxs( ( player->GetFlags() & FL_DUCKING ) ? true : false ),
+ valid );
+ if ( !valid )
+ {
+ // FIXME: Play a deny sound?
+ if ( lm->m_hReservedSpot )
+ {
+ UTIL_Remove( lm->m_hReservedSpot );
+ lm->m_hReservedSpot = NULL;
+ }
+ return;
+ }
+#endif
+
+ // Use current player origin as start and new origin as dest
+ lm->m_vecGoalPosition = goalpos;
+ lm->m_vecStartPosition = mv->GetAbsOrigin();
+
+ // Figure out how long it will take to make the gap based on transit_speed
+ Vector delta = lm->m_vecGoalPosition - lm->m_vecStartPosition;
+
+ float distance = delta.Length();
+
+ Assert( transit_speed > 0.001f );
+
+ // Compute time required to move that distance
+ float transit_time = distance / transit_speed;
+ if ( transit_time < 0.001f )
+ {
+ transit_time = 0.001f;
+ }
+
+ lm->m_bForceLadderMove = true;
+ lm->m_bForceMount = mounting;
+
+ lm->m_flStartTime = gpGlobals->curtime;
+ lm->m_flArrivalTime = lm->m_flStartTime + transit_time;
+
+ lm->m_hForceLadder = ladder;
+
+ // Don't get stuck during this traversal since we'll just be slamming the player origin
+ player->SetMoveType( MOVETYPE_NONE );
+ player->SetMoveCollide( MOVECOLLIDE_DEFAULT );
+ player->SetSolid( SOLID_NONE );
+ SetLadder( ladder );
+
+ // Debounce the use key
+ SwallowUseKey();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns false when finished
+//-----------------------------------------------------------------------------
+bool CHL2GameMovement::ContinueForcedMove()
+{
+ LadderMove_t* lm = GetLadderMove();
+ Assert( lm );
+ Assert( lm->m_bForceLadderMove );
+
+ // Suppress regular motion
+ mv->m_flForwardMove = 0.0f;
+ mv->m_flSideMove = 0.0f;
+ mv->m_flUpMove = 0.0f;
+
+ // How far along are we
+ float frac = ( gpGlobals->curtime - lm->m_flStartTime ) / ( lm->m_flArrivalTime - lm->m_flStartTime );
+ if ( frac > 1.0f )
+ {
+ lm->m_bForceLadderMove = false;
+#if !defined( CLIENT_DLL )
+ // Remove "reservation entity"
+ if ( lm->m_hReservedSpot )
+ {
+ UTIL_Remove( lm->m_hReservedSpot );
+ lm->m_hReservedSpot = NULL;
+ }
+#endif
+ }
+
+ frac = clamp( frac, 0.0f, 1.0f );
+
+ // Move origin part of the way
+ Vector delta = lm->m_vecGoalPosition - lm->m_vecStartPosition;
+
+ // Compute interpolated position
+ Vector org;
+ VectorMA( lm->m_vecStartPosition, frac, delta, org );
+ mv->SetAbsOrigin( org );
+
+ // If finished moving, reset player to correct movetype (or put them on the ladder)
+ if ( !lm->m_bForceLadderMove )
+ {
+ player->SetSolid( SOLID_BBOX );
+ player->SetMoveType( MOVETYPE_WALK );
+
+ if ( lm->m_bForceMount && lm->m_hForceLadder != NULL )
+ {
+ player->SetMoveType( MOVETYPE_LADDER );
+ SetLadder( lm->m_hForceLadder );
+ }
+
+ // Zero out any velocity
+ mv->m_vecVelocity.Init();
+ }
+
+ // Stil active
+ return lm->m_bForceLadderMove;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns true if the player is on a ladder
+// Input : &trace - ignored
+//-----------------------------------------------------------------------------
+bool CHL2GameMovement::OnLadder( trace_t &trace )
+{
+ return ( GetLadder() != NULL ) ? true : false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : ladders -
+// maxdist -
+// **ppLadder -
+// ladderOrigin -
+//-----------------------------------------------------------------------------
+void CHL2GameMovement::Findladder( float maxdist, CFuncLadder **ppLadder, Vector& ladderOrigin, const CFuncLadder *skipLadder )
+{
+ CFuncLadder *bestLadder = NULL;
+ float bestDist = MAX_COORD_INTEGER;
+ Vector bestOrigin;
+
+ bestOrigin.Init();
+
+ float maxdistSqr = maxdist * maxdist;
+
+
+ int c = CFuncLadder::GetLadderCount();
+ for ( int i = 0 ; i < c; i++ )
+ {
+ CFuncLadder *ladder = CFuncLadder::GetLadder( i );
+
+ if ( !ladder->IsEnabled() )
+ continue;
+
+ if ( skipLadder && ladder == skipLadder )
+ continue;
+
+ Vector topPosition;
+ Vector bottomPosition;
+
+ ladder->GetTopPosition( topPosition );
+ ladder->GetBottomPosition( bottomPosition );
+
+ Vector closest;
+ CalcClosestPointOnLineSegment( mv->GetAbsOrigin(), bottomPosition, topPosition, closest, NULL );
+
+ float distSqr = ( closest - mv->GetAbsOrigin() ).LengthSqr();
+
+ // Too far away
+ if ( distSqr > maxdistSqr )
+ {
+ continue;
+ }
+
+ // Need to trace to see if it's clear
+ trace_t tr;
+
+ UTIL_TraceLine( mv->GetAbsOrigin(), closest,
+ MASK_PLAYERSOLID,
+ player,
+ COLLISION_GROUP_NONE,
+ &tr );
+
+ if ( tr.fraction != 1.0f &&
+ tr.m_pEnt &&
+ tr.m_pEnt != ladder )
+ {
+ // Try a trace stepped up from the ground a bit, in case there's something at ground level blocking us.
+ float sizez = GetPlayerMaxs().z - GetPlayerMins().z;
+
+ UTIL_TraceLine( mv->GetAbsOrigin() + Vector( 0, 0, sizez * 0.5f ), closest,
+ MASK_PLAYERSOLID,
+ player,
+ COLLISION_GROUP_NONE,
+ &tr );
+
+ if ( tr.fraction != 1.0f &&
+ tr.m_pEnt &&
+ tr.m_pEnt != ladder &&
+ !tr.m_pEnt->IsSolidFlagSet( FSOLID_TRIGGER ) )
+ {
+ continue;
+ }
+ }
+
+ // See if this is the best one so far
+ if ( distSqr < bestDist )
+ {
+ bestDist = distSqr;
+ bestLadder = ladder;
+ bestOrigin = closest;
+ }
+ }
+
+ // Return best ladder spot
+ *ppLadder = bestLadder;
+ ladderOrigin = bestOrigin;
+
+}
+
+static bool NearbyDismountLessFunc( const NearbyDismount_t& lhs, const NearbyDismount_t& rhs )
+{
+ return lhs.distSqr < rhs.distSqr;
+}
+
+void CHL2GameMovement::GetSortedDismountNodeList( const Vector &org, float radius, CFuncLadder *ladder, CUtlRBTree< NearbyDismount_t, int >& list )
+{
+ float radiusSqr = radius * radius;
+
+ int i;
+ int c = ladder->GetDismountCount();
+ for ( i = 0; i < c; i++ )
+ {
+ CInfoLadderDismount *spot = ladder->GetDismount( i );
+ if ( !spot )
+ continue;
+
+ float distSqr = ( spot->GetAbsOrigin() - org ).LengthSqr();
+ if ( distSqr > radiusSqr )
+ continue;
+
+ NearbyDismount_t nd;
+ nd.dismount = spot;
+ nd.distSqr = distSqr;
+
+ list.Insert( nd );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// *ladder -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CHL2GameMovement::ExitLadderViaDismountNode( CFuncLadder *ladder, bool strict, bool useAlternate )
+{
+ // Find the best ladder exit node
+ float bestDot = -99999.0f;
+ float bestDistance = 99999.0f;
+ Vector bestDest;
+ bool found = false;
+
+ // For 'alternate' dismount
+ bool foundAlternate = false;
+ Vector alternateDest;
+ float alternateDist = 99999.0f;
+
+ CUtlRBTree< NearbyDismount_t, int > nearbyDismounts( 0, 0, NearbyDismountLessFunc );
+
+ GetSortedDismountNodeList( mv->GetAbsOrigin(), 100.0f, ladder, nearbyDismounts );
+
+ int i;
+
+ for ( i = nearbyDismounts.FirstInorder(); i != nearbyDismounts.InvalidIndex() ; i = nearbyDismounts.NextInorder( i ) )
+ {
+ CInfoLadderDismount *spot = nearbyDismounts[ i ].dismount;
+ if ( !spot )
+ {
+ Assert( !"What happened to the spot!!!" );
+ continue;
+ }
+
+ // See if it's valid to put the player there...
+ Vector org = spot->GetAbsOrigin() + Vector( 0, 0, 1 );
+
+ trace_t tr;
+ UTIL_TraceHull(
+ org,
+ org,
+ GetPlayerMins( ( player->GetFlags() & FL_DUCKING ) ? true : false ),
+ GetPlayerMaxs( ( player->GetFlags() & FL_DUCKING ) ? true : false ),
+ MASK_PLAYERSOLID,
+ player,
+ COLLISION_GROUP_PLAYER_MOVEMENT,
+ &tr );
+
+ // Nope...
+ if ( tr.startsolid )
+ {
+ continue;
+ }
+
+ // Find the best dot product
+ Vector vecToSpot = org - ( mv->GetAbsOrigin() + player->GetViewOffset() );
+ vecToSpot.z = 0.0f;
+ float d = VectorNormalize( vecToSpot );
+
+ float dot = vecToSpot.Dot( m_vecForward );
+
+ // We're not facing at it...ignore
+ if ( dot < 0.5f )
+ {
+ if( useAlternate && d < alternateDist )
+ {
+ alternateDest = org;
+ alternateDist = d;
+ foundAlternate = true;
+ }
+
+ continue;
+ }
+
+ if ( dot > bestDot )
+ {
+ bestDest = org;
+ bestDistance = d;
+ bestDot = dot;
+ found = true;
+ }
+ }
+
+ if ( found )
+ {
+ // Require a more specific
+ if ( strict &&
+ ( ( bestDot < 0.7f ) || ( bestDistance > 40.0f ) ) )
+ {
+ return false;
+ }
+
+ StartForcedMove( false, player->MaxSpeed(), bestDest, NULL );
+ return true;
+ }
+
+ if( useAlternate )
+ {
+ // Desperate. Don't refuse to let a person off of a ladder if it can be helped. Use the
+ // alternate dismount if there is one.
+ if( foundAlternate && alternateDist <= 60.0f )
+ {
+ StartForcedMove( false, player->MaxSpeed(), alternateDest, NULL );
+ return true;
+ }
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : bOnLadder -
+//-----------------------------------------------------------------------------
+void CHL2GameMovement::FullLadderMove()
+{
+#if !defined( CLIENT_DLL )
+ CFuncLadder *ladder = GetLadder();
+ Assert( ladder );
+ if ( !ladder )
+ {
+ return;
+ }
+
+ CheckWater();
+
+ // Was jump button pressed? If so, don't do anything here
+ if ( mv->m_nButtons & IN_JUMP )
+ {
+ CheckJumpButton();
+ return;
+ }
+ else
+ {
+ mv->m_nOldButtons &= ~IN_JUMP;
+ }
+
+ player->SetGroundEntity( NULL );
+
+ // Remember old positions in case we cancel this movement
+ Vector oldVelocity = mv->m_vecVelocity;
+ Vector oldOrigin = mv->GetAbsOrigin();
+
+ Vector topPosition;
+ Vector bottomPosition;
+
+ ladder->GetTopPosition( topPosition );
+ ladder->GetBottomPosition( bottomPosition );
+
+ // Compute parametric distance along ladder vector...
+ float oldt;
+ CalcDistanceSqrToLine( mv->GetAbsOrigin(), topPosition, bottomPosition, &oldt );
+
+ // Perform the move accounting for any base velocity.
+ VectorAdd (mv->m_vecVelocity, player->GetBaseVelocity(), mv->m_vecVelocity);
+ TryPlayerMove();
+ VectorSubtract (mv->m_vecVelocity, player->GetBaseVelocity(), mv->m_vecVelocity);
+
+ // Pressed buttons are "changed(xor)" and'ed with the mask of currently held buttons
+ int buttonsChanged = ( mv->m_nOldButtons ^ mv->m_nButtons ); // These buttons have changed this frame
+ int buttonsPressed = buttonsChanged & mv->m_nButtons;
+ bool pressed_use = ( buttonsPressed & IN_USE ) ? true : false;
+ bool pressing_forward_or_side = mv->m_flForwardMove != 0.0f || mv->m_flSideMove != 0.0f;
+
+ Vector ladderVec = topPosition - bottomPosition;
+ float LadderLength = VectorNormalize( ladderVec );
+ // This test is not perfect by any means, but should help a bit
+ bool moving_along_ladder = false;
+ if ( pressing_forward_or_side )
+ {
+ float fwdDot = m_vecForward.Dot( ladderVec );
+ if ( fabs( fwdDot ) > 0.9f )
+ {
+ moving_along_ladder = true;
+ }
+ }
+
+ // Compute parametric distance along ladder vector...
+ float newt;
+ CalcDistanceSqrToLine( mv->GetAbsOrigin(), topPosition, bottomPosition, &newt );
+
+ // Fudge of 2 units
+ float tolerance = 1.0f / LadderLength;
+
+ bool wouldleaveladder = false;
+ // Moving pPast top or bottom?
+ if ( newt < -tolerance )
+ {
+ wouldleaveladder = newt < oldt;
+ }
+ else if ( newt > ( 1.0f + tolerance ) )
+ {
+ wouldleaveladder = newt > oldt;
+ }
+
+ // See if we are near the top or bottom but not moving
+ float dist1sqr, dist2sqr;
+
+ dist1sqr = ( topPosition - mv->GetAbsOrigin() ).LengthSqr();
+ dist2sqr = ( bottomPosition - mv->GetAbsOrigin() ).LengthSqr();
+
+ float dist = MIN( dist1sqr, dist2sqr );
+ bool neardismountnode = ( dist < 16.0f * 16.0f ) ? true : false;
+ float ladderUnitsPerTick = ( MAX_CLIMB_SPEED * gpGlobals->interval_per_tick );
+ bool neardismountnode2 = ( dist < ladderUnitsPerTick * ladderUnitsPerTick ) ? true : false;
+
+ // Really close to node, cvar is set, and pressing a key, then simulate a +USE
+ bool auto_dismount_use = ( neardismountnode2 &&
+ sv_autoladderdismount.GetBool() &&
+ pressing_forward_or_side &&
+ !moving_along_ladder );
+
+ bool fully_underwater = ( player->GetWaterLevel() == WL_Eyes ) ? true : false;
+
+ // If the user manually pressed use or we're simulating it, then use_dismount will occur
+ bool use_dismount = pressed_use || auto_dismount_use;
+
+ if ( fully_underwater && !use_dismount )
+ {
+ // If fully underwater, we require looking directly at a dismount node
+ /// to "float off" a ladder mid way...
+ if ( ExitLadderViaDismountNode( ladder, true ) )
+ {
+ // See if they +used a dismount point mid-span..
+ return;
+ }
+ }
+
+ // If the movement would leave the ladder and they're not automated or pressing use, disallow the movement
+ if ( !use_dismount )
+ {
+ if ( wouldleaveladder )
+ {
+ // Don't let them leave the ladder if they were on it
+ mv->m_vecVelocity = oldVelocity;
+ mv->SetAbsOrigin( oldOrigin );
+ }
+ return;
+ }
+
+ // If the move would not leave the ladder and we're near close to the end, then just accept the move
+ if ( !wouldleaveladder && !neardismountnode )
+ {
+ // Otherwise, if the move would leave the ladder, disallow it.
+ if ( pressed_use )
+ {
+ if ( ExitLadderViaDismountNode( ladder, false, IsX360() ) )
+ {
+ // See if they +used a dismount point mid-span..
+ return;
+ }
+
+ player->SetMoveType( MOVETYPE_WALK );
+ player->SetMoveCollide( MOVECOLLIDE_DEFAULT );
+ SetLadder( NULL );
+ GetHL2Player()->m_bPlayUseDenySound = false;
+
+ // Dismount with a bit of velocity in facing direction
+ VectorScale( m_vecForward, USE_DISMOUNT_SPEED, mv->m_vecVelocity );
+ mv->m_vecVelocity.z = 50;
+ }
+ return;
+ }
+
+ // Debounce the use key
+ if ( pressed_use )
+ {
+ SwallowUseKey();
+ }
+
+ // Try auto exit, if possible
+ if ( ExitLadderViaDismountNode( ladder, false, pressed_use ) )
+ {
+ return;
+ }
+
+ if ( wouldleaveladder )
+ {
+ // Otherwise, if the move would leave the ladder, disallow it.
+ if ( pressed_use )
+ {
+ player->SetMoveType( MOVETYPE_WALK );
+ player->SetMoveCollide( MOVECOLLIDE_DEFAULT );
+ SetLadder( NULL );
+
+ // Dismount with a bit of velocity in facing direction
+ VectorScale( m_vecForward, USE_DISMOUNT_SPEED, mv->m_vecVelocity );
+ mv->m_vecVelocity.z = 50;
+ }
+ else
+ {
+ mv->m_vecVelocity = oldVelocity;
+ mv->SetAbsOrigin( oldOrigin );
+ }
+ }
+#endif
+}
+
+bool CHL2GameMovement::CheckLadderAutoMountEndPoint( CFuncLadder *ladder, const Vector& bestOrigin )
+{
+ // See if we're really near an endpoint
+ if ( !ladder )
+ return false;
+
+ Vector top, bottom;
+ ladder->GetTopPosition( top );
+ ladder->GetBottomPosition( bottom );
+
+ float d1, d2;
+
+ d1 = ( top - mv->GetAbsOrigin() ).LengthSqr();
+ d2 = ( bottom - mv->GetAbsOrigin() ).LengthSqr();
+
+ if ( d1 > 16 * 16 && d2 > 16 * 16 )
+ return false;
+
+ Vector ladderAxis;
+
+ if ( d1 < 16 * 16 )
+ {
+ // Close to top
+ ladderAxis = bottom - top;
+ }
+ else
+ {
+ ladderAxis = top - bottom;
+ }
+
+ VectorNormalize( ladderAxis );
+
+ if ( ladderAxis.Dot( m_vecForward ) > sv_ladderautomountdot.GetFloat() )
+ {
+ StartForcedMove( true, player->MaxSpeed(), bestOrigin, ladder );
+ return true;
+ }
+
+ return false;
+}
+
+bool CHL2GameMovement::CheckLadderAutoMountCone( CFuncLadder *ladder, const Vector& bestOrigin, float maxAngleDelta, float maxDistToLadder )
+{
+ // Never 'back' onto ladders or stafe onto ladders
+ if ( ladder != NULL &&
+ ( mv->m_flForwardMove > 0.0f ) )
+ {
+ Vector top, bottom;
+ ladder->GetTopPosition( top );
+ ladder->GetBottomPosition( bottom );
+
+ Vector ladderAxis = top - bottom;
+ VectorNormalize( ladderAxis );
+
+ Vector probe = mv->GetAbsOrigin();
+
+ Vector closest;
+ CalcClosestPointOnLineSegment( probe, bottom, top, closest, NULL );
+
+ Vector vecToLadder = closest - probe;
+
+ float dist = VectorNormalize( vecToLadder );
+
+ Vector flatLadder = vecToLadder;
+ flatLadder.z = 0.0f;
+ Vector flatForward = m_vecForward;
+ flatForward.z = 0.0f;
+
+ VectorNormalize( flatLadder );
+ VectorNormalize( flatForward );
+
+ float facingDot = flatForward.Dot( flatLadder );
+ float angle = acos( facingDot ) * 180 / M_PI;
+
+ bool closetoladder = ( dist != 0.0f && dist < maxDistToLadder ) ? true : false;
+ bool reallyclosetoladder = ( dist != 0.0f && dist < 4.0f ) ? true : false;
+
+ bool facingladderaxis = ( angle < maxAngleDelta ) ? true : false;
+ bool facingalongaxis = ( (float)fabs( ladderAxis.Dot( m_vecForward ) ) > sv_ladderautomountdot.GetFloat() ) ? true : false;
+#if 0
+ Msg( "close %i length %.3f maxdist %.3f facing %.3f dot %.3f ang %.3f\n",
+ closetoladder ? 1 : 0,
+ dist,
+ maxDistToLadder,
+ (float)fabs( ladderAxis.Dot( m_vecForward ) ),
+ facingDot,
+ angle);
+#endif
+
+ // Tracker 21776: Don't mount ladders this way if strafing
+ bool strafing = ( fabs( mv->m_flSideMove ) < 1.0f ) ? false : true;
+
+ if ( ( ( facingDot > 0.0f && !strafing ) || facingalongaxis ) &&
+ ( facingladderaxis || reallyclosetoladder ) &&
+ closetoladder )
+ {
+ StartForcedMove( true, player->MaxSpeed(), bestOrigin, ladder );
+ return true;
+ }
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Must be facing toward ladder
+// Input : *ladder -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CHL2GameMovement::LookingAtLadder( CFuncLadder *ladder )
+{
+ if ( !ladder )
+ {
+ return false;
+ }
+
+ // Get ladder end points
+ Vector top, bottom;
+ ladder->GetTopPosition( top );
+ ladder->GetBottomPosition( bottom );
+
+ // Find closest point on ladder to player (could be an endpoint)
+ Vector closest;
+ CalcClosestPointOnLineSegment( mv->GetAbsOrigin(), bottom, top, closest, NULL );
+
+ // Flatten our view direction to 2D
+ Vector flatForward = m_vecForward;
+ flatForward.z = 0.0f;
+
+ // Because the ladder itself is not a solid, the player's origin may actually be
+ // permitted to pass it, and that will screw up our dot product.
+ // So back up the player's origin a bit to do the facing calculation.
+ Vector vecAdjustedOrigin = mv->GetAbsOrigin() - 8.0f * flatForward;
+
+ // Figure out vector from player to closest point on ladder
+ Vector vecToLadder = closest - vecAdjustedOrigin;
+
+ // Flatten it to 2D
+ Vector flatLadder = vecToLadder;
+ flatLadder.z = 0.0f;
+
+ // Normalize the vectors (unnecessary)
+ VectorNormalize( flatLadder );
+ VectorNormalize( flatForward );
+
+ // Compute dot product to see if forward is in same direction as vec to ladder
+ float facingDot = flatForward.Dot( flatLadder );
+
+ float requiredDot = ( sv_ladder_useonly.GetBool() ) ? -0.99 : 0.0;
+
+ // Facing same direction if dot > = requiredDot...
+ bool facingladder = ( facingDot >= requiredDot );
+
+ return facingladder;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : &trace -
+//-----------------------------------------------------------------------------
+bool CHL2GameMovement::CheckLadderAutoMount( CFuncLadder *ladder, const Vector& bestOrigin )
+{
+#if !defined( CLIENT_DLL )
+
+ if ( ladder != NULL )
+ {
+ StartForcedMove( true, player->MaxSpeed(), bestOrigin, ladder );
+ return true;
+ }
+
+#endif
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool CHL2GameMovement::LadderMove( void )
+{
+
+ if ( player->GetMoveType() == MOVETYPE_NOCLIP )
+ {
+ SetLadder( NULL );
+ return false;
+ }
+
+ // If being forced to mount/dismount continue to act like we are on the ladder
+ if ( IsForceMoveActive() && ContinueForcedMove() )
+ {
+ return true;
+ }
+
+ CFuncLadder *bestLadder = NULL;
+ Vector bestOrigin( 0, 0, 0 );
+
+ CFuncLadder *ladder = GetLadder();
+
+ // Something 1) deactivated the ladder... or 2) something external applied
+ // a force to us. In either case make the player fall, etc.
+ if ( ladder &&
+ ( !ladder->IsEnabled() ||
+ ( player->GetBaseVelocity().LengthSqr() > 1.0f ) ) )
+ {
+ GetHL2Player()->ExitLadder();
+ ladder = NULL;
+ }
+
+ if ( !ladder )
+ {
+ Findladder( 64.0f, &bestLadder, bestOrigin, NULL );
+ }
+
+#if !defined (CLIENT_DLL)
+ if( !ladder && bestLadder && sv_ladder_useonly.GetBool() )
+ {
+ GetHL2Player()->DisplayLadderHudHint();
+ }
+#endif
+
+ int buttonsChanged = ( mv->m_nOldButtons ^ mv->m_nButtons ); // These buttons have changed this frame
+ int buttonsPressed = buttonsChanged & mv->m_nButtons;
+ bool pressed_use = ( buttonsPressed & IN_USE ) ? true : false;
+
+ // If I'm already moving on a ladder, use the previous ladder direction
+ if ( !ladder && !pressed_use )
+ {
+ // If flying through air, allow mounting ladders if we are facing < 15 degress from the ladder and we are close
+ if ( !ladder && !sv_ladder_useonly.GetBool() )
+ {
+ // Tracker 6625: Don't need to be leaping to auto mount using this method...
+ // But if we are on the ground, then we must not be backing into the ladder (Tracker 12961)
+ bool onground = player->GetGroundEntity() ? true : false;
+ if ( !onground || ( mv->m_flForwardMove > 0.0f ) )
+ {
+ if ( CheckLadderAutoMountCone( bestLadder, bestOrigin, 15.0f, 32.0f ) )
+ {
+ return true;
+ }
+ }
+
+ // Pressing forward while looking at ladder and standing (or floating) near a mounting point
+ if ( mv->m_flForwardMove > 0.0f )
+ {
+ if ( CheckLadderAutoMountEndPoint( bestLadder, bestOrigin ) )
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ if ( !ladder &&
+ LookingAtLadder( bestLadder ) &&
+ CheckLadderAutoMount( bestLadder, bestOrigin ) )
+ {
+ return true;
+ }
+
+ // Reassign the ladder
+ ladder = GetLadder();
+ if ( !ladder )
+ {
+ return false;
+ }
+
+ // Don't play the deny sound
+ if ( pressed_use )
+ {
+ GetHL2Player()->m_bPlayUseDenySound = false;
+ }
+
+ // Make sure we are on the ladder
+ player->SetMoveType( MOVETYPE_LADDER );
+ player->SetMoveCollide( MOVECOLLIDE_DEFAULT );
+
+ player->SetGravity( 0.0f );
+
+ float forwardSpeed = 0.0f;
+ float rightSpeed = 0.0f;
+
+ float speed = player->MaxSpeed();
+
+
+ if ( mv->m_nButtons & IN_BACK )
+ {
+ forwardSpeed -= speed;
+ }
+
+ if ( mv->m_nButtons & IN_FORWARD )
+ {
+ forwardSpeed += speed;
+ }
+
+ if ( mv->m_nButtons & IN_MOVELEFT )
+ {
+ rightSpeed -= speed;
+ }
+
+ if ( mv->m_nButtons & IN_MOVERIGHT )
+ {
+ rightSpeed += speed;
+ }
+
+ if ( mv->m_nButtons & IN_JUMP )
+ {
+ player->SetMoveType( MOVETYPE_WALK );
+ // Remove from ladder
+ SetLadder( NULL );
+
+ // Jump in view direction
+ Vector jumpDir = m_vecForward;
+
+ // unless pressing backward or something like that
+ if ( mv->m_flForwardMove < 0.0f )
+ {
+ jumpDir = -jumpDir;
+ }
+
+ VectorNormalize( jumpDir );
+
+ VectorScale( jumpDir, MAX_CLIMB_SPEED, mv->m_vecVelocity );
+ // Tracker 13558: Don't add any extra z velocity if facing downward at all
+ if ( m_vecForward.z >= 0.0f )
+ {
+ mv->m_vecVelocity.z = mv->m_vecVelocity.z + 50;
+ }
+ return false;
+ }
+
+ if ( forwardSpeed != 0 || rightSpeed != 0 )
+ {
+ // See if the player is looking toward the top or the bottom
+ Vector velocity;
+
+ VectorScale( m_vecForward, forwardSpeed, velocity );
+ VectorMA( velocity, rightSpeed, m_vecRight, velocity );
+
+ VectorNormalize( velocity );
+
+ Vector ladderUp;
+ ladder->ComputeLadderDir( ladderUp );
+ VectorNormalize( ladderUp );
+
+ Vector topPosition;
+ Vector bottomPosition;
+
+ ladder->GetTopPosition( topPosition );
+ ladder->GetBottomPosition( bottomPosition );
+
+ // Check to see if we've mounted the ladder in a bogus spot and, if so, just fall off the ladder...
+ float dummyt = 0.0f;
+ float distFromLadderSqr = CalcDistanceSqrToLine( mv->GetAbsOrigin(), topPosition, bottomPosition, &dummyt );
+ if ( distFromLadderSqr > 36.0f )
+ {
+ // Uh oh, we fell off zee ladder...
+ player->SetMoveType( MOVETYPE_WALK );
+ // Remove from ladder
+ SetLadder( NULL );
+ return false;
+ }
+
+ bool ishorizontal = fabs( topPosition.z - bottomPosition.z ) < 64.0f ? true : false;
+
+ float changeover = ishorizontal ? 0.0f : 0.3f;
+
+ float factor = 1.0f;
+ if ( velocity.z >= 0 )
+ {
+ float dotTop = ladderUp.Dot( velocity );
+ if ( dotTop < -changeover )
+ {
+ // Aimed at bottom
+ factor = -1.0f;
+ }
+ }
+ else
+ {
+ float dotBottom = -ladderUp.Dot( velocity );
+ if ( dotBottom > changeover )
+ {
+ factor = -1.0f;
+ }
+ }
+
+#ifdef _XBOX
+ if( sv_ladders_useonly.GetBool() )
+ {
+ // Stick up climbs up, stick down climbs down. No matter which way you're looking.
+ if ( mv->m_nButtons & IN_FORWARD )
+ {
+ factor = 1.0f;
+ }
+ else if( mv->m_nButtons & IN_BACK )
+ {
+ factor = -1.0f;
+ }
+ }
+#endif//_XBOX
+
+ mv->m_vecVelocity = MAX_CLIMB_SPEED * factor * ladderUp;
+ }
+ else
+ {
+ mv->m_vecVelocity.Init();
+ }
+
+ return true;
+}
+
+void CHL2GameMovement::SetGroundEntity( trace_t *pm )
+{
+ CBaseEntity *newGround = pm ? pm->m_pEnt : NULL;
+
+ //Adrian: Special case for combine balls.
+ if ( newGround && newGround->GetCollisionGroup() == HL2COLLISION_GROUP_COMBINE_BALL_NPC )
+ {
+ return;
+ }
+
+ BaseClass::SetGroundEntity( pm );
+}
+
+bool CHL2GameMovement::CanAccelerate()
+{
+#ifdef HL2MP
+ if ( player->IsObserver() )
+ {
+ return true;
+ }
+#endif
+
+ BaseClass::CanAccelerate();
+
+ return true;
+}
+
+
+#ifndef PORTAL // Portal inherits from this but needs to declare it's own global interface
+ // Expose our interface.
+ static CHL2GameMovement g_GameMovement;
+ IGameMovement *g_pGameMovement = ( IGameMovement * )&g_GameMovement;
+
+ EXPOSE_SINGLE_INTERFACE_GLOBALVAR(CGameMovement, IGameMovement,INTERFACENAME_GAMEMOVEMENT, g_GameMovement );
#endif \ No newline at end of file
diff --git a/sp/src/game/shared/hl2/hl_gamemovement.h b/sp/src/game/shared/hl2/hl_gamemovement.h
index 2141d8b7..1e9abefe 100644
--- a/sp/src/game/shared/hl2/hl_gamemovement.h
+++ b/sp/src/game/shared/hl2/hl_gamemovement.h
@@ -1,129 +1,129 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose: Special handling for hl2 usable ladders
-//
-//=============================================================================//
-
-#include "gamemovement.h"
-#include "func_ladder.h"
-
-#if defined( CLIENT_DLL )
-
-#include "c_basehlplayer.h"
-#define CHL2_Player C_BaseHLPlayer
-#else
-
-#include "hl2_player.h"
-
-#endif
-
-struct LadderMove_t;
-class CInfoLadderDismount;
-
-struct NearbyDismount_t
-{
- CInfoLadderDismount *dismount;
- float distSqr;
-};
-
-//-----------------------------------------------------------------------------
-// Purpose: HL2 specific movement code
-//-----------------------------------------------------------------------------
-class CHL2GameMovement : public CGameMovement
-{
- typedef CGameMovement BaseClass;
-public:
-
- CHL2GameMovement();
-
-// Overrides
- virtual void FullLadderMove();
- virtual bool LadderMove( void );
- virtual bool OnLadder( trace_t &trace );
- virtual int GetCheckInterval( IntervalType_t type );
- virtual void SetGroundEntity( trace_t *pm );
- virtual bool CanAccelerate( void );
-
-private:
-
- // See if we are pressing use near a ladder "mount" point and if so, latch us onto the ladder
- bool CheckLadderAutoMount( CFuncLadder *ladder, const Vector& bestOrigin );
-
- bool CheckLadderAutoMountCone( CFuncLadder *ladder, const Vector& bestOrigin, float maxAngleDelta, float maxDistToLadder );
- bool CheckLadderAutoMountEndPoint(CFuncLadder *ladder, const Vector& bestOrigin );
-
-
- bool LookingAtLadder( CFuncLadder *ladder );
-
- // Are we forcing the user's position to a new spot
- bool IsForceMoveActive();
- // Start forcing player position
- void StartForcedMove( bool mounting, float transit_speed, const Vector& goalpos, CFuncLadder *ladder );
- // Returns false when finished
- bool ContinueForcedMove();
-
- // Given a list of nearby ladders, find the best ladder and the "mount" origin
- void Findladder( float maxdist, CFuncLadder **ppLadder, Vector& ladderOrigin, const CFuncLadder *skipLadder );
-
- // Debounce the +USE key
- void SwallowUseKey();
-
- // Returns true if the player will auto-exit the ladder via a dismount node
- bool ExitLadderViaDismountNode( CFuncLadder *ladder, bool strict, bool useAlternate = false );
- void GetSortedDismountNodeList( const Vector &org, float radius, CFuncLadder *ladder, CUtlRBTree< NearbyDismount_t, int >& list );
-
- LadderMove_t *GetLadderMove();
- CHL2_Player *GetHL2Player();
-
- void SetLadder( CFuncLadder *ladder );
- CFuncLadder *GetLadder();
-};
-
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-inline CHL2_Player *CHL2GameMovement::GetHL2Player()
-{
- return static_cast< CHL2_Player * >( player );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : inline LadderMove*
-//-----------------------------------------------------------------------------
-inline LadderMove_t *CHL2GameMovement::GetLadderMove()
-{
- CHL2_Player *p = GetHL2Player();
- if ( !p )
- {
- return NULL;
- }
- return p->GetLadderMove();
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Input : *ladder -
-//-----------------------------------------------------------------------------
-inline void CHL2GameMovement::SetLadder( CFuncLadder *ladder )
-{
- CFuncLadder* oldLadder = GetLadder();
-
- if ( !ladder && oldLadder )
- {
- oldLadder->PlayerGotOff( GetHL2Player() );
- }
-
-
- GetHL2Player()->m_HL2Local.m_hLadder.Set( ladder );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : CFuncLadder
-//-----------------------------------------------------------------------------
-inline CFuncLadder *CHL2GameMovement::GetLadder()
-{
- return static_cast<CFuncLadder*>( static_cast<CBaseEntity *>( GetHL2Player()->m_HL2Local.m_hLadder.Get() ) );
-}
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Special handling for hl2 usable ladders
+//
+//=============================================================================//
+
+#include "gamemovement.h"
+#include "func_ladder.h"
+
+#if defined( CLIENT_DLL )
+
+#include "c_basehlplayer.h"
+#define CHL2_Player C_BaseHLPlayer
+#else
+
+#include "hl2_player.h"
+
+#endif
+
+struct LadderMove_t;
+class CInfoLadderDismount;
+
+struct NearbyDismount_t
+{
+ CInfoLadderDismount *dismount;
+ float distSqr;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: HL2 specific movement code
+//-----------------------------------------------------------------------------
+class CHL2GameMovement : public CGameMovement
+{
+ typedef CGameMovement BaseClass;
+public:
+
+ CHL2GameMovement();
+
+// Overrides
+ virtual void FullLadderMove();
+ virtual bool LadderMove( void );
+ virtual bool OnLadder( trace_t &trace );
+ virtual int GetCheckInterval( IntervalType_t type );
+ virtual void SetGroundEntity( trace_t *pm );
+ virtual bool CanAccelerate( void );
+
+private:
+
+ // See if we are pressing use near a ladder "mount" point and if so, latch us onto the ladder
+ bool CheckLadderAutoMount( CFuncLadder *ladder, const Vector& bestOrigin );
+
+ bool CheckLadderAutoMountCone( CFuncLadder *ladder, const Vector& bestOrigin, float maxAngleDelta, float maxDistToLadder );
+ bool CheckLadderAutoMountEndPoint(CFuncLadder *ladder, const Vector& bestOrigin );
+
+
+ bool LookingAtLadder( CFuncLadder *ladder );
+
+ // Are we forcing the user's position to a new spot
+ bool IsForceMoveActive();
+ // Start forcing player position
+ void StartForcedMove( bool mounting, float transit_speed, const Vector& goalpos, CFuncLadder *ladder );
+ // Returns false when finished
+ bool ContinueForcedMove();
+
+ // Given a list of nearby ladders, find the best ladder and the "mount" origin
+ void Findladder( float maxdist, CFuncLadder **ppLadder, Vector& ladderOrigin, const CFuncLadder *skipLadder );
+
+ // Debounce the +USE key
+ void SwallowUseKey();
+
+ // Returns true if the player will auto-exit the ladder via a dismount node
+ bool ExitLadderViaDismountNode( CFuncLadder *ladder, bool strict, bool useAlternate = false );
+ void GetSortedDismountNodeList( const Vector &org, float radius, CFuncLadder *ladder, CUtlRBTree< NearbyDismount_t, int >& list );
+
+ LadderMove_t *GetLadderMove();
+ CHL2_Player *GetHL2Player();
+
+ void SetLadder( CFuncLadder *ladder );
+ CFuncLadder *GetLadder();
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+inline CHL2_Player *CHL2GameMovement::GetHL2Player()
+{
+ return static_cast< CHL2_Player * >( player );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : inline LadderMove*
+//-----------------------------------------------------------------------------
+inline LadderMove_t *CHL2GameMovement::GetLadderMove()
+{
+ CHL2_Player *p = GetHL2Player();
+ if ( !p )
+ {
+ return NULL;
+ }
+ return p->GetLadderMove();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *ladder -
+//-----------------------------------------------------------------------------
+inline void CHL2GameMovement::SetLadder( CFuncLadder *ladder )
+{
+ CFuncLadder* oldLadder = GetLadder();
+
+ if ( !ladder && oldLadder )
+ {
+ oldLadder->PlayerGotOff( GetHL2Player() );
+ }
+
+
+ GetHL2Player()->m_HL2Local.m_hLadder.Set( ladder );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : CFuncLadder
+//-----------------------------------------------------------------------------
+inline CFuncLadder *CHL2GameMovement::GetLadder()
+{
+ return static_cast<CFuncLadder*>( static_cast<CBaseEntity *>( GetHL2Player()->m_HL2Local.m_hLadder.Get() ) );
+}
diff --git a/sp/src/game/shared/hl2/hl_movedata.h b/sp/src/game/shared/hl2/hl_movedata.h
index 36598344..5b7d4f8c 100644
--- a/sp/src/game/shared/hl2/hl_movedata.h
+++ b/sp/src/game/shared/hl2/hl_movedata.h
@@ -1,51 +1,51 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//=============================================================================//
-
-#ifndef HL_MOVEDATA_H
-#define HL_MOVEDATA_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-
-#include "igamemovement.h"
-
-
-// This class contains HL2-specific prediction data.
-class CHLMoveData : public CMoveData
-{
-public:
- bool m_bIsSprinting;
-};
-
-class CFuncLadder;
-class CReservePlayerSpot;
-
-//-----------------------------------------------------------------------------
-// Purpose: Data related to automatic mounting/dismounting from ladders
-//-----------------------------------------------------------------------------
-struct LadderMove_t
-{
- DECLARE_SIMPLE_DATADESC();
-
- // Are we forcing player movement during mount/dismount
- bool m_bForceLadderMove;
- // Is the forced move getting on or off the ladder
- bool m_bForceMount;
-
- // Simulation info for forcing the player move
- float m_flStartTime;
- float m_flArrivalTime;
- Vector m_vecGoalPosition;
- Vector m_vecStartPosition;
-
- // The ladder entity owning the forced move (for marking us "on" the ladder after automounting it)
- CHandle< CFuncLadder > m_hForceLadder;
- CHandle< CReservePlayerSpot > m_hReservedSpot;
-};
-
-#endif // HL_MOVEDATA_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef HL_MOVEDATA_H
+#define HL_MOVEDATA_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+
+#include "igamemovement.h"
+
+
+// This class contains HL2-specific prediction data.
+class CHLMoveData : public CMoveData
+{
+public:
+ bool m_bIsSprinting;
+};
+
+class CFuncLadder;
+class CReservePlayerSpot;
+
+//-----------------------------------------------------------------------------
+// Purpose: Data related to automatic mounting/dismounting from ladders
+//-----------------------------------------------------------------------------
+struct LadderMove_t
+{
+ DECLARE_SIMPLE_DATADESC();
+
+ // Are we forcing player movement during mount/dismount
+ bool m_bForceLadderMove;
+ // Is the forced move getting on or off the ladder
+ bool m_bForceMount;
+
+ // Simulation info for forcing the player move
+ float m_flStartTime;
+ float m_flArrivalTime;
+ Vector m_vecGoalPosition;
+ Vector m_vecStartPosition;
+
+ // The ladder entity owning the forced move (for marking us "on" the ladder after automounting it)
+ CHandle< CFuncLadder > m_hForceLadder;
+ CHandle< CReservePlayerSpot > m_hReservedSpot;
+};
+
+#endif // HL_MOVEDATA_H
diff --git a/sp/src/game/shared/hl2/survival_gamerules.cpp b/sp/src/game/shared/hl2/survival_gamerules.cpp
index d78e6502..723eeeac 100644
--- a/sp/src/game/shared/hl2/survival_gamerules.cpp
+++ b/sp/src/game/shared/hl2/survival_gamerules.cpp
@@ -1,273 +1,273 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-#include "cbase.h"
-
-#ifdef HL2_EPISODIC
-
-#include "hl2_gamerules.h"
-#include "ammodef.h"
-#include "hl2_shareddefs.h"
-#include "filesystem.h"
-#include <KeyValues.h>
-
-#ifdef CLIENT_DLL
-
-#else
-#include "player.h"
-#include "game.h"
-#include "gamerules.h"
-#include "teamplay_gamerules.h"
-#include "hl2_player.h"
-#include "voice_gamemgr.h"
-#include "globalstate.h"
-#include "ai_basenpc.h"
-#include "weapon_physcannon.h"
-#include "ammodef.h"
-#endif
-
-#ifdef CLIENT_DLL
-#define CHalfLife2Survival C_HalfLife2Survival
-#define CHalfLife2SurvivalProxy C_HalfLife2SurvivalProxy
-#endif
-
-ConVar gamerules_survival( "gamerules_survival", "0", FCVAR_REPLICATED );
-
-class CHalfLife2SurvivalProxy : public CGameRulesProxy
-{
-public:
- DECLARE_CLASS( CHalfLife2SurvivalProxy, CGameRulesProxy );
- DECLARE_NETWORKCLASS();
-};
-
-class CSurvivalAmmo
-{
-public:
-
- char m_szAmmoName[256];
- int m_iAmount;
-};
-
-class CSurvivalSettings
-{
-public:
-
- CSurvivalSettings();
-
- CUtlVector<char*, CUtlMemory<char*> > m_Loadout;
- int m_iSpawnHealth;
- string_t m_szPickups;
- CUtlVector<CSurvivalAmmo> m_Ammo;
-};
-
-CSurvivalSettings::CSurvivalSettings()
-{
- m_iSpawnHealth = 100;
-}
-
-class CHalfLife2Survival : public CHalfLife2
-{
-public:
- DECLARE_CLASS( CHalfLife2Survival, CHalfLife2 );
-
-#ifdef CLIENT_DLL
-
- DECLARE_CLIENTCLASS_NOBASE(); // This makes datatables able to access our private vars.
-
-#else
-
- DECLARE_SERVERCLASS_NOBASE(); // This makes datatables able to access our private vars.
-
- CHalfLife2Survival();
- virtual ~CHalfLife2Survival() {}
-
- virtual void Think( void );
- virtual void PlayerSpawn( CBasePlayer *pPlayer );
- virtual bool IsAllowedToSpawn( CBaseEntity *pEntity );
- virtual void CreateStandardEntities();
-
- void ReadSurvivalScriptFile( void );
- void ParseSurvivalSettings( KeyValues *pSubKey );
- void ParseSurvivalAmmo( KeyValues *pSubKey );
-
-private:
- bool m_bActive;
- CSurvivalSettings m_SurvivalSettings;
-#endif
-
-};
-
-//-----------------------------------------------------------------------------
-// Gets us at the Half-Life 2 game rules
-//-----------------------------------------------------------------------------
-inline CHalfLife2Survival* HL2SurvivalGameRules()
-{
- return static_cast<CHalfLife2Survival*>(g_pGameRules);
-}
-
-REGISTER_GAMERULES_CLASS( CHalfLife2Survival );
-
-BEGIN_NETWORK_TABLE_NOBASE( CHalfLife2Survival, DT_HL2SurvivalGameRules )
-END_NETWORK_TABLE()
-
-
-LINK_ENTITY_TO_CLASS( hl2_survival_gamerules, CHalfLife2SurvivalProxy );
-IMPLEMENT_NETWORKCLASS_ALIASED( HalfLife2SurvivalProxy, DT_HalfLife2SurvivalProxy )
-
-#ifdef CLIENT_DLL
- void RecvProxy_HL2SurvivalGameRules( const RecvProp *pProp, void **pOut, void *pData, int objectID )
- {
- CHalfLife2Survival *pRules = HL2SurvivalGameRules();
- Assert( pRules );
- *pOut = pRules;
- }
-
- BEGIN_RECV_TABLE( CHalfLife2SurvivalProxy, DT_HalfLife2SurvivalProxy )
- RecvPropDataTable( "hl2_survival_gamerules_data", 0, 0, &REFERENCE_RECV_TABLE( DT_HL2SurvivalGameRules ), RecvProxy_HL2SurvivalGameRules )
- END_RECV_TABLE()
- #else
- void* SendProxy_HL2SurvivalGameRules( const SendProp *pProp, const void *pStructBase, const void *pData, CSendProxyRecipients *pRecipients, int objectID )
- {
- CHalfLife2Survival *pRules = HL2SurvivalGameRules();
- Assert( pRules );
- pRecipients->SetAllRecipients();
- return pRules;
- }
-
- BEGIN_SEND_TABLE( CHalfLife2SurvivalProxy, DT_HalfLife2SurvivalProxy )
- SendPropDataTable( "hl2_survival_gamerules_data", 0, &REFERENCE_SEND_TABLE( DT_HL2SurvivalGameRules ), SendProxy_HL2SurvivalGameRules )
- END_SEND_TABLE()
-#endif
-
-#ifndef CLIENT_DLL
-
-CHalfLife2Survival::CHalfLife2Survival()
-{
- m_bActive = false;
-}
-
-void CHalfLife2Survival::Think( void )
-{
-
-}
-
-bool CHalfLife2Survival::IsAllowedToSpawn( CBaseEntity *pEntity )
-{
- if ( !m_bActive )
- return BaseClass::IsAllowedToSpawn( pEntity );
-
- const char *pPickups = STRING( m_SurvivalSettings.m_szPickups );
- if ( !pPickups )
- return false;
-
- if ( Q_stristr( pPickups, "everything" ) )
- return true;
-
- if ( Q_stristr( pPickups, pEntity->GetClassname() ) || Q_stristr( pPickups, STRING( pEntity->GetEntityName() ) ) )
- return true;
-
- return false;
-}
-
-void CHalfLife2Survival::PlayerSpawn( CBasePlayer *pPlayer )
-{
- BaseClass::PlayerSpawn( pPlayer );
-
- if ( !m_bActive )
- return;
-
- pPlayer->EquipSuit();
- pPlayer->SetHealth( m_SurvivalSettings.m_iSpawnHealth );
-
- for ( int i = 0; i < m_SurvivalSettings.m_Loadout.Count(); ++i )
- {
- pPlayer->GiveNamedItem( m_SurvivalSettings.m_Loadout[i] );
- }
-
- for ( int i = 0; i < m_SurvivalSettings.m_Ammo.Count(); ++i )
- {
- pPlayer->CBasePlayer::GiveAmmo( m_SurvivalSettings.m_Ammo[i].m_iAmount , m_SurvivalSettings.m_Ammo[i].m_szAmmoName );
- }
-}
-
-void CHalfLife2Survival::ParseSurvivalSettings( KeyValues *pSubKey )
-{
- if ( pSubKey == NULL )
- return;
-
- m_SurvivalSettings.m_szPickups = NULL_STRING;
- m_SurvivalSettings.m_iSpawnHealth = 100;
-
- KeyValues *pTestKey = pSubKey->GetFirstSubKey();
-
- while ( pTestKey )
- {
- if ( !stricmp( pTestKey->GetName(), "weapons" ) )
- {
- const char *pLoadout = pTestKey->GetString();
- Q_SplitString( pLoadout, ";", m_SurvivalSettings.m_Loadout );
- }
- else if ( !stricmp( pTestKey->GetName(), "spawnhealth" ) )
- {
- m_SurvivalSettings.m_iSpawnHealth = pTestKey->GetInt( NULL, 100 );
- }
- else if ( !stricmp( pTestKey->GetName(), "allowedpickups" ) )
- {
- m_SurvivalSettings.m_szPickups = MAKE_STRING( pTestKey->GetString() );
- }
-
- pTestKey = pTestKey->GetNextKey();
- }
-}
-
-void CHalfLife2Survival::ParseSurvivalAmmo( KeyValues *pSubKey )
-{
- if ( pSubKey )
- {
- KeyValues *pAmmoKey = pSubKey->GetFirstSubKey();
-
- while ( pAmmoKey )
- {
- CSurvivalAmmo ammo;
-
- Q_strcpy( ammo.m_szAmmoName, pAmmoKey->GetName() );
- ammo.m_iAmount = pAmmoKey->GetInt();
-
- m_SurvivalSettings.m_Ammo.AddToTail( ammo );
-
- pAmmoKey = pAmmoKey->GetNextKey();
- }
- }
-}
-
-void CHalfLife2Survival::ReadSurvivalScriptFile( void )
-{
- char szFullName[512];
- Q_snprintf( szFullName, sizeof( szFullName ), "maps/%s_survival.txt", STRING(gpGlobals->mapname) );
-
- KeyValues *pkvFile = new KeyValues( "Survival" );
- if ( pkvFile->LoadFromFile( filesystem, szFullName, "MOD" ) )
- {
- ParseSurvivalSettings( pkvFile->FindKey( "settings" ) );
- ParseSurvivalAmmo( pkvFile->FindKey( "ammo" ) );
-
- CUtlVector <CBaseEntity*> entities;
- UTIL_LoadAndSpawnEntitiesFromScript( entities, szFullName, "Survival", true );
-
- // It's important to turn on survival mode after we create all the entities
- // in the script, so that we don't remove them if they violate survival rules.
- // i.e. we want the player to start with a shotgun, but prevent all future shotguns from spawning.
- m_bActive = true;
- }
- else
- {
- m_bActive = false;
- }
-}
-
-void CHalfLife2Survival::CreateStandardEntities( void )
-{
- ReadSurvivalScriptFile();
-}
-
-#endif
-
+//========= Copyright Valve Corporation, All rights reserved. ============//
+#include "cbase.h"
+
+#ifdef HL2_EPISODIC
+
+#include "hl2_gamerules.h"
+#include "ammodef.h"
+#include "hl2_shareddefs.h"
+#include "filesystem.h"
+#include <KeyValues.h>
+
+#ifdef CLIENT_DLL
+
+#else
+#include "player.h"
+#include "game.h"
+#include "gamerules.h"
+#include "teamplay_gamerules.h"
+#include "hl2_player.h"
+#include "voice_gamemgr.h"
+#include "globalstate.h"
+#include "ai_basenpc.h"
+#include "weapon_physcannon.h"
+#include "ammodef.h"
+#endif
+
+#ifdef CLIENT_DLL
+#define CHalfLife2Survival C_HalfLife2Survival
+#define CHalfLife2SurvivalProxy C_HalfLife2SurvivalProxy
+#endif
+
+ConVar gamerules_survival( "gamerules_survival", "0", FCVAR_REPLICATED );
+
+class CHalfLife2SurvivalProxy : public CGameRulesProxy
+{
+public:
+ DECLARE_CLASS( CHalfLife2SurvivalProxy, CGameRulesProxy );
+ DECLARE_NETWORKCLASS();
+};
+
+class CSurvivalAmmo
+{
+public:
+
+ char m_szAmmoName[256];
+ int m_iAmount;
+};
+
+class CSurvivalSettings
+{
+public:
+
+ CSurvivalSettings();
+
+ CUtlVector<char*, CUtlMemory<char*> > m_Loadout;
+ int m_iSpawnHealth;
+ string_t m_szPickups;
+ CUtlVector<CSurvivalAmmo> m_Ammo;
+};
+
+CSurvivalSettings::CSurvivalSettings()
+{
+ m_iSpawnHealth = 100;
+}
+
+class CHalfLife2Survival : public CHalfLife2
+{
+public:
+ DECLARE_CLASS( CHalfLife2Survival, CHalfLife2 );
+
+#ifdef CLIENT_DLL
+
+ DECLARE_CLIENTCLASS_NOBASE(); // This makes datatables able to access our private vars.
+
+#else
+
+ DECLARE_SERVERCLASS_NOBASE(); // This makes datatables able to access our private vars.
+
+ CHalfLife2Survival();
+ virtual ~CHalfLife2Survival() {}
+
+ virtual void Think( void );
+ virtual void PlayerSpawn( CBasePlayer *pPlayer );
+ virtual bool IsAllowedToSpawn( CBaseEntity *pEntity );
+ virtual void CreateStandardEntities();
+
+ void ReadSurvivalScriptFile( void );
+ void ParseSurvivalSettings( KeyValues *pSubKey );
+ void ParseSurvivalAmmo( KeyValues *pSubKey );
+
+private:
+ bool m_bActive;
+ CSurvivalSettings m_SurvivalSettings;
+#endif
+
+};
+
+//-----------------------------------------------------------------------------
+// Gets us at the Half-Life 2 game rules
+//-----------------------------------------------------------------------------
+inline CHalfLife2Survival* HL2SurvivalGameRules()
+{
+ return static_cast<CHalfLife2Survival*>(g_pGameRules);
+}
+
+REGISTER_GAMERULES_CLASS( CHalfLife2Survival );
+
+BEGIN_NETWORK_TABLE_NOBASE( CHalfLife2Survival, DT_HL2SurvivalGameRules )
+END_NETWORK_TABLE()
+
+
+LINK_ENTITY_TO_CLASS( hl2_survival_gamerules, CHalfLife2SurvivalProxy );
+IMPLEMENT_NETWORKCLASS_ALIASED( HalfLife2SurvivalProxy, DT_HalfLife2SurvivalProxy )
+
+#ifdef CLIENT_DLL
+ void RecvProxy_HL2SurvivalGameRules( const RecvProp *pProp, void **pOut, void *pData, int objectID )
+ {
+ CHalfLife2Survival *pRules = HL2SurvivalGameRules();
+ Assert( pRules );
+ *pOut = pRules;
+ }
+
+ BEGIN_RECV_TABLE( CHalfLife2SurvivalProxy, DT_HalfLife2SurvivalProxy )
+ RecvPropDataTable( "hl2_survival_gamerules_data", 0, 0, &REFERENCE_RECV_TABLE( DT_HL2SurvivalGameRules ), RecvProxy_HL2SurvivalGameRules )
+ END_RECV_TABLE()
+ #else
+ void* SendProxy_HL2SurvivalGameRules( const SendProp *pProp, const void *pStructBase, const void *pData, CSendProxyRecipients *pRecipients, int objectID )
+ {
+ CHalfLife2Survival *pRules = HL2SurvivalGameRules();
+ Assert( pRules );
+ pRecipients->SetAllRecipients();
+ return pRules;
+ }
+
+ BEGIN_SEND_TABLE( CHalfLife2SurvivalProxy, DT_HalfLife2SurvivalProxy )
+ SendPropDataTable( "hl2_survival_gamerules_data", 0, &REFERENCE_SEND_TABLE( DT_HL2SurvivalGameRules ), SendProxy_HL2SurvivalGameRules )
+ END_SEND_TABLE()
+#endif
+
+#ifndef CLIENT_DLL
+
+CHalfLife2Survival::CHalfLife2Survival()
+{
+ m_bActive = false;
+}
+
+void CHalfLife2Survival::Think( void )
+{
+
+}
+
+bool CHalfLife2Survival::IsAllowedToSpawn( CBaseEntity *pEntity )
+{
+ if ( !m_bActive )
+ return BaseClass::IsAllowedToSpawn( pEntity );
+
+ const char *pPickups = STRING( m_SurvivalSettings.m_szPickups );
+ if ( !pPickups )
+ return false;
+
+ if ( Q_stristr( pPickups, "everything" ) )
+ return true;
+
+ if ( Q_stristr( pPickups, pEntity->GetClassname() ) || Q_stristr( pPickups, STRING( pEntity->GetEntityName() ) ) )
+ return true;
+
+ return false;
+}
+
+void CHalfLife2Survival::PlayerSpawn( CBasePlayer *pPlayer )
+{
+ BaseClass::PlayerSpawn( pPlayer );
+
+ if ( !m_bActive )
+ return;
+
+ pPlayer->EquipSuit();
+ pPlayer->SetHealth( m_SurvivalSettings.m_iSpawnHealth );
+
+ for ( int i = 0; i < m_SurvivalSettings.m_Loadout.Count(); ++i )
+ {
+ pPlayer->GiveNamedItem( m_SurvivalSettings.m_Loadout[i] );
+ }
+
+ for ( int i = 0; i < m_SurvivalSettings.m_Ammo.Count(); ++i )
+ {
+ pPlayer->CBasePlayer::GiveAmmo( m_SurvivalSettings.m_Ammo[i].m_iAmount , m_SurvivalSettings.m_Ammo[i].m_szAmmoName );
+ }
+}
+
+void CHalfLife2Survival::ParseSurvivalSettings( KeyValues *pSubKey )
+{
+ if ( pSubKey == NULL )
+ return;
+
+ m_SurvivalSettings.m_szPickups = NULL_STRING;
+ m_SurvivalSettings.m_iSpawnHealth = 100;
+
+ KeyValues *pTestKey = pSubKey->GetFirstSubKey();
+
+ while ( pTestKey )
+ {
+ if ( !stricmp( pTestKey->GetName(), "weapons" ) )
+ {
+ const char *pLoadout = pTestKey->GetString();
+ Q_SplitString( pLoadout, ";", m_SurvivalSettings.m_Loadout );
+ }
+ else if ( !stricmp( pTestKey->GetName(), "spawnhealth" ) )
+ {
+ m_SurvivalSettings.m_iSpawnHealth = pTestKey->GetInt( NULL, 100 );
+ }
+ else if ( !stricmp( pTestKey->GetName(), "allowedpickups" ) )
+ {
+ m_SurvivalSettings.m_szPickups = MAKE_STRING( pTestKey->GetString() );
+ }
+
+ pTestKey = pTestKey->GetNextKey();
+ }
+}
+
+void CHalfLife2Survival::ParseSurvivalAmmo( KeyValues *pSubKey )
+{
+ if ( pSubKey )
+ {
+ KeyValues *pAmmoKey = pSubKey->GetFirstSubKey();
+
+ while ( pAmmoKey )
+ {
+ CSurvivalAmmo ammo;
+
+ Q_strcpy( ammo.m_szAmmoName, pAmmoKey->GetName() );
+ ammo.m_iAmount = pAmmoKey->GetInt();
+
+ m_SurvivalSettings.m_Ammo.AddToTail( ammo );
+
+ pAmmoKey = pAmmoKey->GetNextKey();
+ }
+ }
+}
+
+void CHalfLife2Survival::ReadSurvivalScriptFile( void )
+{
+ char szFullName[512];
+ Q_snprintf( szFullName, sizeof( szFullName ), "maps/%s_survival.txt", STRING(gpGlobals->mapname) );
+
+ KeyValues *pkvFile = new KeyValues( "Survival" );
+ if ( pkvFile->LoadFromFile( filesystem, szFullName, "MOD" ) )
+ {
+ ParseSurvivalSettings( pkvFile->FindKey( "settings" ) );
+ ParseSurvivalAmmo( pkvFile->FindKey( "ammo" ) );
+
+ CUtlVector <CBaseEntity*> entities;
+ UTIL_LoadAndSpawnEntitiesFromScript( entities, szFullName, "Survival", true );
+
+ // It's important to turn on survival mode after we create all the entities
+ // in the script, so that we don't remove them if they violate survival rules.
+ // i.e. we want the player to start with a shotgun, but prevent all future shotguns from spawning.
+ m_bActive = true;
+ }
+ else
+ {
+ m_bActive = false;
+ }
+}
+
+void CHalfLife2Survival::CreateStandardEntities( void )
+{
+ ReadSurvivalScriptFile();
+}
+
+#endif
+
#endif \ No newline at end of file