mirror of
https://github.com/mapbase-source/source-sdk-2013.git
synced 2025-04-22 14:33:41 +03:00
Compare commits
77 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
672ce05271 | ||
|
7111779e17 | ||
|
3bd2fc2e7f | ||
|
27b700b0cc | ||
|
1a6d5530ec | ||
|
a5ca814985 | ||
|
8330254613 | ||
|
5c2c7c399c | ||
|
40f8ec6487 | ||
|
4ed86ccdc2 | ||
|
bddb12fbc1 | ||
|
881d8112d7 | ||
|
e3f2964ae2 | ||
|
91556205fb | ||
|
64841073d9 | ||
|
bdc1f6897d | ||
|
f7030b9bce | ||
|
8b668f64a5 | ||
|
658c3613d9 | ||
|
7ffe672afc | ||
|
83dfddfb13 | ||
|
472032b924 | ||
|
d9b256fe8f | ||
|
58d5d2e717 | ||
|
7d8aa4211d | ||
|
7440745597 | ||
|
4ff24d3814 | ||
|
ec29683e10 | ||
|
762f6531b6 | ||
|
d603770f99 | ||
|
2c540d4d69 | ||
|
e1060cc397 | ||
|
b994fa7a44 | ||
|
59ea20a953 | ||
|
c0a7b51f8c | ||
|
5416871138 | ||
|
6284c20d20 | ||
|
00eb374e0e | ||
|
c1c4f09a7b | ||
|
35f875da9b | ||
|
4368e27adf | ||
|
edab14b992 | ||
|
f39b752adc | ||
|
9f999c4c87 | ||
|
289a9b4f6e | ||
|
bcb9e416a1 | ||
|
ef5a5ef39f | ||
|
029944b409 | ||
|
fdffc94a13 | ||
|
a66998cc9c | ||
|
b8fb4ba435 | ||
|
e7cf130d08 | ||
|
1007a6434a | ||
|
3ef753b341 | ||
|
628bc79728 | ||
|
f625b145d5 | ||
|
f85c30d547 | ||
|
759328b805 | ||
|
88a8cf9ea7 | ||
|
3c9871111b | ||
|
9602325bbb | ||
|
77a3f1d837 | ||
|
f681520ef2 | ||
|
617fd48546 | ||
|
4ac6828023 | ||
|
b7873d0529 | ||
|
f7ad644200 | ||
|
d0f4fccefa | ||
|
d3d4bc5ccc | ||
|
6b0c4554c0 | ||
|
ca02f50e58 | ||
|
544e360640 | ||
|
4e56c1205b | ||
|
86bb8f7c7e | ||
|
0b42a245d1 | ||
|
bcaa781ad9 | ||
|
06a40e6dc0 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -54,3 +54,7 @@ config.cfg
|
||||
# shader files
|
||||
*.tmp
|
||||
|
||||
*.lib
|
||||
*.filters
|
||||
*.vpc_crc
|
||||
*.sentinel
|
||||
|
@ -1471,25 +1471,6 @@ void CDetailObjectSystem::LevelInitPreEntity()
|
||||
}
|
||||
}
|
||||
|
||||
if ( m_DetailObjects.Count() || m_DetailSpriteDict.Count() )
|
||||
{
|
||||
// There are detail objects in the level, so precache the material
|
||||
PrecacheMaterial( DETAIL_SPRITE_MATERIAL );
|
||||
IMaterial *pMat = m_DetailSpriteMaterial;
|
||||
// adjust for non-square textures (cropped)
|
||||
float flRatio = (float)( pMat->GetMappingWidth() ) / pMat->GetMappingHeight();
|
||||
if ( flRatio > 1.0 )
|
||||
{
|
||||
for( int i = 0; i<m_DetailSpriteDict.Count(); i++ )
|
||||
{
|
||||
m_DetailSpriteDict[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDict[i].m_TexLR.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexLR.y *= flRatio;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int detailPropLightingLump;
|
||||
if( g_pMaterialSystemHardwareConfig->GetHDRType() != HDR_TYPE_NONE )
|
||||
{
|
||||
@ -1512,13 +1493,30 @@ void CDetailObjectSystem::LevelInitPreEntity()
|
||||
|
||||
void CDetailObjectSystem::LevelInitPostEntity()
|
||||
{
|
||||
if ( m_DetailObjects.Count() || m_DetailSpriteDict.Count() )
|
||||
{
|
||||
const char *pDetailSpriteMaterial = DETAIL_SPRITE_MATERIAL;
|
||||
C_World *pWorld = GetClientWorldEntity();
|
||||
if ( pWorld && pWorld->GetDetailSpriteMaterial() && *(pWorld->GetDetailSpriteMaterial()) )
|
||||
{
|
||||
pDetailSpriteMaterial = pWorld->GetDetailSpriteMaterial();
|
||||
}
|
||||
|
||||
m_DetailSpriteMaterial.Init( pDetailSpriteMaterial, TEXTURE_GROUP_OTHER );
|
||||
PrecacheMaterial( pDetailSpriteMaterial );
|
||||
IMaterial *pMat = m_DetailSpriteMaterial;
|
||||
|
||||
// adjust for non-square textures (cropped)
|
||||
float flRatio = pMat->GetMappingWidth() / pMat->GetMappingHeight();
|
||||
if ( flRatio > 1.0 )
|
||||
{
|
||||
for( int i = 0; i<m_DetailSpriteDict.Count(); i++ )
|
||||
{
|
||||
m_DetailSpriteDict[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDict[i].m_TexLR.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexLR.y *= flRatio;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( GetDetailController() )
|
||||
{
|
||||
|
@ -2565,7 +2565,7 @@ void CNPC_Combine::SpeakSentence( int sentenceType )
|
||||
//=========================================================
|
||||
// PainSound
|
||||
//=========================================================
|
||||
void CNPC_Combine::PainSound ( void )
|
||||
void CNPC_Combine::PainSound ( const CTakeDamageInfo &info )
|
||||
{
|
||||
// NOTE: The response system deals with this at the moment
|
||||
if ( GetFlags() & FL_DISSOLVING )
|
||||
|
@ -126,7 +126,7 @@ public:
|
||||
// Sounds
|
||||
// -------------
|
||||
void DeathSound( void );
|
||||
void PainSound( void );
|
||||
void PainSound( const CTakeDamageInfo &info );
|
||||
void IdleSound( void );
|
||||
void AlertSound( void );
|
||||
void LostEnemySound( void );
|
||||
|
@ -206,7 +206,7 @@ bool CHalfLife2::Damage_IsTimeBased( int iDmgType )
|
||||
// Damage types that are time-based.
|
||||
#ifdef HL2_EPISODIC
|
||||
// This makes me think EP2 should have its own rules, but they are #ifdef all over in here.
|
||||
return ( ( iDmgType & ( DMG_PARALYZE | DMG_NERVEGAS | DMG_POISON | DMG_RADIATION | DMG_DROWNRECOVER | DMG_SLOWBURN ) ) != 0 );
|
||||
return ( ( iDmgType & ( DMG_PARALYZE | DMG_NERVEGAS | DMG_POISON | DMG_ACID | DMG_RADIATION | DMG_DROWNRECOVER | DMG_SLOWBURN ) ) != 0 );
|
||||
#else
|
||||
return BaseClass::Damage_IsTimeBased( iDmgType );
|
||||
#endif
|
||||
|
18
sp/game/mod_episodic/bullsquid.fgd
Normal file
18
sp/game/mod_episodic/bullsquid.fgd
Normal file
@ -0,0 +1,18 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Purpose: Half-Life 2 mod game definition file (.fgd)
|
||||
// Defines new entities for bullsquid
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
@include "base.fgd"
|
||||
@include "halflife2.fgd"
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// NPCs
|
||||
//
|
||||
//-------------------------------------------------------------------------
|
||||
@NPCClass base(BaseNPC) studio(" "models/bullsquid.mdl" ) = npc_bullsquid : "Bullsquid"
|
||||
[
|
||||
]
|
256
sp/game/mod_episodic/cfg/skill.cfg
Normal file
256
sp/game/mod_episodic/cfg/skill.cfg
Normal file
@ -0,0 +1,256 @@
|
||||
// ===========
|
||||
// NPCs
|
||||
// ============
|
||||
// Barnacle
|
||||
sk_barnacle_health "35"
|
||||
|
||||
// Barney
|
||||
sk_barney_health "35"
|
||||
|
||||
// Bullseye
|
||||
sk_bullseye_health "35"
|
||||
|
||||
// Bullsquid
|
||||
//sk_bullsquid_health "120"
|
||||
//sk_bullsquid_dmg_bite "15"
|
||||
//sk_bullsquid_dmg_whip "25"
|
||||
|
||||
// Citizen
|
||||
sk_citizen_health "40"
|
||||
|
||||
// Combine Soldier
|
||||
sk_combine_s_health "50"
|
||||
sk_combine_s_kick "10"
|
||||
|
||||
// Combine Guard
|
||||
sk_combine_guard_health "70"
|
||||
sk_combine_guard_kick "15"
|
||||
|
||||
// strider
|
||||
sk_strider_health "350"
|
||||
sk_strider_num_missiles1 "5"
|
||||
sk_strider_num_missiles2 "7"
|
||||
sk_strider_num_missiles3 "7"
|
||||
|
||||
// Headcrab
|
||||
sk_headcrab_health "10"
|
||||
sk_headcrab_melee_dmg "5"
|
||||
|
||||
// Fast Headcrab
|
||||
sk_headcrab_fast_health "10"
|
||||
|
||||
// Poison Headcrab
|
||||
sk_headcrab_poison_health "35"
|
||||
|
||||
// Houndeye
|
||||
//sk_houndeye_health "80"
|
||||
//sk_houndeye_dmg_blast "25"
|
||||
|
||||
// Manhack
|
||||
sk_manhack_health "25"
|
||||
sk_manhack_melee_dmg "20"
|
||||
|
||||
// Metropolice
|
||||
sk_metropolice_health "40"
|
||||
sk_metropolice_stitch_reaction "1.0"
|
||||
sk_metropolice_stitch_tight_hitcount "2"
|
||||
sk_metropolice_stitch_at_hitcount "1"
|
||||
sk_metropolice_stitch_behind_hitcount "3"
|
||||
sk_metropolice_stitch_along_hitcount "2"
|
||||
|
||||
// Rollermine
|
||||
sk_rollermine_shock "10"
|
||||
sk_rollermine_stun_delay "3"
|
||||
sk_rollermine_vehicle_intercept "1"
|
||||
|
||||
// Scanner (City)
|
||||
sk_scanner_health "30"
|
||||
sk_scanner_dmg_dive "25"
|
||||
|
||||
// Stalker
|
||||
sk_stalker_health "50"
|
||||
sk_stalker_melee_dmg "5"
|
||||
|
||||
// Vortigaunt
|
||||
sk_vortigaunt_health "100"
|
||||
sk_vortigaunt_dmg_claw "10"
|
||||
sk_vortigaunt_dmg_rake "25"
|
||||
sk_vortigaunt_dmg_zap "50"
|
||||
sk_vortigaunt_armor_charge "30"
|
||||
|
||||
// Zombie
|
||||
sk_zombie_health "50"
|
||||
sk_zombie_dmg_one_slash "10"
|
||||
sk_zombie_dmg_both_slash "25"
|
||||
|
||||
// Poison Zombie
|
||||
sk_zombie_poison_health "175"
|
||||
sk_zombie_poison_dmg_spit "20"
|
||||
|
||||
//Antlion
|
||||
sk_antlion_health "30"
|
||||
sk_antlion_swipe_damage "5"
|
||||
sk_antlion_jump_damage "5"
|
||||
|
||||
//Antlion Guard
|
||||
sk_antlionguard_health "500"
|
||||
sk_antlionguard_dmg_charge "20"
|
||||
sk_antlionguard_dmg_shove "10"
|
||||
|
||||
//Antlion Grub
|
||||
//sk_antliongrub_health "5"
|
||||
|
||||
//Ichthyosaur
|
||||
sk_ichthyosaur_health "200"
|
||||
sk_ichthyosaur_melee_dmg "8"
|
||||
|
||||
// Combine Gunship
|
||||
sk_gunship_burst_size "15"
|
||||
sk_gunship_health_increments "5"
|
||||
sk_npc_dmg_gunship "40"
|
||||
sk_npc_dmg_gunship_to_plr "3"
|
||||
|
||||
// Combine Helicopter
|
||||
sk_npc_dmg_helicopter "6"
|
||||
sk_npc_dmg_helicopter_to_plr "3"
|
||||
sk_helicopter_grenadedamage "30"
|
||||
sk_helicopter_grenaderadius "275"
|
||||
sk_helicopter_grenadeforce "55000"
|
||||
|
||||
// Combine Dropship
|
||||
sk_npc_dmg_dropship "2"
|
||||
|
||||
// Combine APC
|
||||
sk_apc_health "750"
|
||||
|
||||
|
||||
// =================
|
||||
// WEAPONS
|
||||
// =================
|
||||
|
||||
sk_plr_dmg_ar2 "8"
|
||||
sk_npc_dmg_ar2 "3"
|
||||
sk_max_ar2 "60"
|
||||
sk_max_ar2_altfire "3"
|
||||
|
||||
sk_plr_dmg_alyxgun "5"
|
||||
sk_npc_dmg_alyxgun "3"
|
||||
sk_max_alyxgun "150"
|
||||
|
||||
sk_plr_dmg_pistol "5"
|
||||
sk_npc_dmg_pistol "3"
|
||||
sk_max_pistol "150"
|
||||
|
||||
sk_plr_dmg_smg1 "4"
|
||||
sk_npc_dmg_smg1 "3"
|
||||
sk_max_smg1 "225"
|
||||
|
||||
sk_plr_dmg_buckshot "8"
|
||||
sk_npc_dmg_buckshot "3"
|
||||
sk_max_buckshot "30"
|
||||
|
||||
sk_plr_dmg_rpg_round "100"
|
||||
sk_npc_dmg_rpg_round "50"
|
||||
sk_max_rpg_round "3"
|
||||
|
||||
sk_plr_dmg_smg1_grenade "100"
|
||||
sk_npc_dmg_smg1_grenade "50"
|
||||
sk_max_smg1_grenade "3"
|
||||
sk_smg1_grenade_radius "250"
|
||||
|
||||
//sk_plr_dmg_gauss "25"
|
||||
//sk_plr_max_dmg_gauss "30"
|
||||
|
||||
sk_plr_dmg_sniper_round "20"
|
||||
sk_npc_dmg_sniper_round "100"
|
||||
sk_max_sniper_round "30"
|
||||
|
||||
sk_plr_dmg_357 "40"
|
||||
sk_npc_dmg_357 "30"
|
||||
sk_max_357 "12"
|
||||
|
||||
sk_plr_dmg_crossbow "100"
|
||||
sk_npc_dmg_crossbow "10"
|
||||
sk_max_crossbow "10"
|
||||
|
||||
sk_plr_dmg_airboat "3"
|
||||
sk_npc_dmg_airboat "3"
|
||||
|
||||
//sk_dmg_sniper_penetrate_plr "10"
|
||||
//sk_dmg_sniper_penetrate_npc "100"
|
||||
|
||||
sk_plr_dmg_grenade "150"
|
||||
sk_npc_dmg_grenade "75"
|
||||
sk_max_grenade "5"
|
||||
|
||||
sk_plr_dmg_crowbar "10"
|
||||
sk_npc_dmg_crowbar "5"
|
||||
|
||||
sk_plr_dmg_stunstick "10"
|
||||
sk_npc_dmg_stunstick "40" // Kill a citizen in one hit
|
||||
|
||||
//sk_plr_dmg_satchel "150"
|
||||
//sk_npc_dmg_satchel "75"
|
||||
//sk_satchel_radius "150"
|
||||
|
||||
// Mortar Synth projectile
|
||||
//sk_dmg_energy_grenade "2"
|
||||
//sk_energy_grenade_radius "100"
|
||||
|
||||
sk_dmg_homer_grenade "20"
|
||||
sk_homer_grenade_radius "100"
|
||||
|
||||
// Bullsquid spit
|
||||
//sk_dmg_spit_grenade "5"
|
||||
//sk_spit_grenade_radius "50"
|
||||
|
||||
//sk_plr_dmg_tripmine "150"
|
||||
//sk_npc_dmg_tripmine "125"
|
||||
//sk_tripmine_radius "200"
|
||||
|
||||
sk_plr_dmg_fraggrenade "125"
|
||||
sk_npc_dmg_fraggrenade "75"
|
||||
sk_fraggrenade_radius "250"
|
||||
|
||||
// HEALTH/SUIT CHARGE DISTRIBUTION
|
||||
sk_suitcharger "75"
|
||||
sk_suitcharger_citadel "500"
|
||||
sk_suitcharger_citadel_maxarmor "200"
|
||||
sk_battery "15"
|
||||
sk_healthcharger "50"
|
||||
sk_healthkit "25"
|
||||
sk_healthvial "10"
|
||||
|
||||
// Combine balls
|
||||
sk_combineball_seek_angle "15"
|
||||
sk_combineball_guidefactor "1.0"
|
||||
|
||||
// NPC damage adjusters
|
||||
sk_npc_head "3"
|
||||
sk_npc_chest "1"
|
||||
sk_npc_stomach "1"
|
||||
sk_npc_arm "1"
|
||||
sk_npc_leg "1"
|
||||
|
||||
// player damage adjusters
|
||||
sk_player_head "3"
|
||||
sk_player_chest "1"
|
||||
sk_player_stomach "1"
|
||||
sk_player_arm "1"
|
||||
sk_player_leg "1"
|
||||
|
||||
// Allies
|
||||
sk_ally_regen_time "0.2"
|
||||
|
||||
// Jeep
|
||||
sk_max_gauss_round "30"
|
||||
|
||||
// =================
|
||||
// RTSL
|
||||
// =================
|
||||
//Max health
|
||||
sk_mechacrab_health "40"
|
||||
//Damage inflicted by the mechacrab
|
||||
sk_mechacrab_melee_dmg "10"
|
||||
//Damage taken by crowbar hits
|
||||
sk_mechacrab_crowbar_dmg "20"
|
@ -7,3 +7,5 @@ sk_apc_missile_damage "50"
|
||||
// Antlion air attack
|
||||
sk_antlion_air_attack_dmg "10"
|
||||
|
||||
sk_lostsoul_health "25"
|
||||
sk_lostsoul_melee_dmg "5"
|
11
sp/game/mod_episodic/flaregun.fgd
Normal file
11
sp/game/mod_episodic/flaregun.fgd
Normal file
@ -0,0 +1,11 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Purpose: Half-Life 2 mod game definition file (.fgd)
|
||||
// Defines new entities for the flaregun weapon
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
@include "halflife2.fgd"
|
||||
|
||||
@PointClass base(Item) studio("models/items/boxflares.mdl")= item_box_flare_rounds : "Box of Flare Rounds" []
|
||||
@PointClass base(Weapon) studio("models/weapons/w_pistol.mdl") = weapon_flaregun : "Flaregun" []
|
4672
sp/game/mod_episodic/halflife2.fgd
Normal file
4672
sp/game/mod_episodic/halflife2.fgd
Normal file
File diff suppressed because it is too large
Load Diff
69
sp/game/mod_episodic/halloween.fgd
Normal file
69
sp/game/mod_episodic/halloween.fgd
Normal file
@ -0,0 +1,69 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Purpose: Half-Life 2 mod game definition file (.fgd)
|
||||
// Defines new entities for Halloween themed mods
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
@include "base.fgd"
|
||||
@include "halflife2.fgd"
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// NPCs
|
||||
//
|
||||
//-------------------------------------------------------------------------
|
||||
@NPCClass base(BaseNPC) studioprop() = npc_shadow_walker : "Shadow Walker"
|
||||
[
|
||||
additionalequipment(choices) : "Weapons" : "0" : "It is recommended that the Shadow Walker be equipped with a melee weapon such as the crowbar or stunstick. The shotgun and Annabelle also work surprisingly well, but firing patterns have not been set up for automatic weapons." =
|
||||
[
|
||||
"0" : "Custom Melee Weapon"
|
||||
"weapon_crowbar" : "Crow Bar"
|
||||
"weapon_stunstick" : "Stun Stick"
|
||||
"weapon_shotgun" : "Shotgun"
|
||||
"weapon_annabelle" : "Annabelle"
|
||||
"weapon_pistol" : "Pistol"
|
||||
"weapon_ar2" : "AR2"
|
||||
"weapon_smg1" : "SMG1"
|
||||
"weapon_alyxgun" : "Alyx Gun"
|
||||
]
|
||||
|
||||
model(studio) : "World Model" : "models/monster/subject.mdl" : "You may specify any model for this NPC. However, the NPC was written with standard human animations in mind. Missing animations may cause errors. Be aware the animations of the model you choose will affect the NPC's behavior."
|
||||
WeaponModel(studio) : "Weapon Model Override" : "models/props_canal/mattpipe.mdl" : "If the Shadow Walker is set to use 'Custom Melee Weapon', you may supply a world model to use. I would recommend using the pipe model, the crowbar model, or the stunstick model."
|
||||
|
||||
Health(integer) : "Health" : 75 : "Starting health of the NPC."
|
||||
|
||||
FearSound(sound) : "Fear Sound" : "NPC_ShadowWalker.Fear" : "The NPC will play this sound when retreating."
|
||||
DeathSound(sound) : "Death Sound" : "NPC_ShadowWalker.Death" : "The NPC will play this sound on death."
|
||||
IdleSound(sound) : "Idle Sound" : "NPC_ShadowWalker.Idle" : "The NPC will play this sound while wandering idly."
|
||||
PainSound(sound) : "Pain Sound" : "NPC_ShadowWalker.Pain" : "The NPC will play this sound when damaged."
|
||||
AlertSound(sound) : "Alert Sound" : "NPC_ShadowWalker.Alert" : "The NPC will play this sound while in an alert state."
|
||||
LostEnemySound(sound) : "Lost Enemy Sound" : "NPC_ShadowWalker.LostEnemy" : "The NPC will play this sound if it loses sight of its enemy."
|
||||
FoundEnemySound(sound) : "Found Enemy Sound" : "NPC_ShadowWalker.FoundEnemy" : "The NPC will play this sound if it finds an enemy again after previously losing it."
|
||||
UseBothSquadSlots(choices) : "Use Both Squad Slots" : 0 : "When in a squad, how many shadow walkers should be able to chase the player at one time? Additional squadmates will run away from the player in the hopes of setting up an ambush." =
|
||||
[
|
||||
0 : "Use One Squad Slot"
|
||||
1 : "Use Both Squad Slots"
|
||||
]
|
||||
CannotOpenDoors(choices) : "Can Open Doors?" : 0 : "Is this NPC able to open doors? You can change this after spawning with EnableOpenDoors and DisableOpenDoors, but it doesn't always seem to work well with pathfinding." =
|
||||
[
|
||||
0 : "Can Open Doors"
|
||||
1 : "Cannot Open Doors"
|
||||
]
|
||||
// // Weapon pickup feature not working yet
|
||||
// CanPickupWeapons(choices) : "Can Pick Up Guns?" : 0 : "Is this NPC able to pick up guns? You can change this after spawning with EnablePickupWeapons and DisablePickupWeapons." =
|
||||
// [
|
||||
// 0 : "Cannot Pick Up Guns"
|
||||
// 1 : "Can Pick Up Guns"
|
||||
// ]
|
||||
input SetSpeedModifier(float) : "Set a float value to multiple distance traveled by."
|
||||
input EnableOpenDoors(void) : "Allow this NPC to open doors. (Warning: Doesn't always seem to update pathfinding / AI)"
|
||||
input DisableOpenDoors(void) : "Prevent this NPC from opening doors."
|
||||
// input EnablePickupWeapons(void) : "Allow this NPC to pick up any weapon off of the ground."
|
||||
// input DisablePickupWeapons(void) : "Prevent this NPC from picking up weapons."
|
||||
|
||||
]
|
||||
|
||||
@NPCClass base(npc_manhack) studio("models/skeleton/skeleton_torso3.mdl") = npc_lost_soul : "Lost Soul"
|
||||
[
|
||||
]
|
Binary file not shown.
129
sp/game/mod_episodic/scripts/game_sounds_manifest.txt
Normal file
129
sp/game/mod_episodic/scripts/game_sounds_manifest.txt
Normal file
@ -0,0 +1,129 @@
|
||||
game_sounds_manifest
|
||||
{
|
||||
|
||||
"precache_file" "scripts/game_sounds.txt"
|
||||
"precache_file" "scripts/game_sounds_ui.txt"
|
||||
"precache_file" "scripts/game_sounds_player.txt"
|
||||
|
||||
// Weapon sounds
|
||||
"precache_file" "scripts/game_sounds_weapons.txt"
|
||||
"precache_file" "scripts/game_sounds_weapons_ep2.txt"
|
||||
|
||||
// HL2 World, Ambient Generic, Items, Physics, Vehicles
|
||||
"precache_file" "scripts/game_sounds_world.txt"
|
||||
"precache_file" "scripts/game_sounds_ambient_generic.txt"
|
||||
"precache_file" "scripts/game_sounds_items.txt"
|
||||
"precache_file" "scripts/game_sounds_physics.txt"
|
||||
"precache_file" "scripts/game_sounds_vehicles.txt"
|
||||
|
||||
// E3 level sounds
|
||||
"precache_file" "scripts/level_sounds_e3_c17.txt"
|
||||
"precache_file" "scripts/level_sounds_e3_town.txt"
|
||||
"precache_file" "scripts/level_sounds_e3_bugbait.txt"
|
||||
|
||||
// Episodic content sounds
|
||||
"precache_file" "scripts/npc_sounds_alyx_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_strider_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_strider_episodic2.txt"
|
||||
"precache_file" "scripts/npc_sounds_turret_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_soldier_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_ministrider_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_roller_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_combine_ball_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_citizen_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_citizen_episodic2.txt"
|
||||
"precache_file" "scripts/npc_sounds_citizen_ep1.txt"
|
||||
"precache_file" "scripts/npc_sounds_zombine.txt"
|
||||
"precache_file" "scripts/npc_sounds_dog_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_antlion_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_antlionguard_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_antlionguard_episodic2.txt"
|
||||
"precache_file" "scripts/npc_sounds_advisor.txt"
|
||||
"precache_file" "scripts/npc_sounds_advisor_episodic2.txt"
|
||||
"precache_file" "scripts/npc_sounds_hunter.txt"
|
||||
"precache_file" "scripts/npc_sounds_antlion_grub_episodic.txt"
|
||||
"precache_file" "scripts/npc_sounds_attackheli_episodic2.txt"
|
||||
"precache_file" "scripts/npc_sounds_fastzombie_episodic2.txt"
|
||||
"precache_file" "scripts/game_sounds_addendum_ep2.txt"
|
||||
|
||||
|
||||
"precache_file" "scripts/level_sounds_music_episodic.txt"
|
||||
"precache_file" "scripts/level_sounds_music_episodic2.txt"
|
||||
"precache_file" "scripts/game_sounds_weapons_episodic.txt"
|
||||
"precache_file" "scripts/level_voices_episode_01.txt"
|
||||
"precache_file" "scripts/level_sounds_aftermath_episodic.txt"
|
||||
"precache_file" "scripts/level_sounds_outland_episodic.txt"
|
||||
"precache_file" "scripts/level_sounds_c17_02a.txt"
|
||||
|
||||
"precache_file" "scripts/level_voices_episode_02.txt"
|
||||
"precache_file" "scripts/game_sounds_vehicles_ep2.txt"
|
||||
|
||||
// EP2 content sounds
|
||||
"precache_file" "scripts/game_sounds_physics_ep2.txt"
|
||||
|
||||
// Game level sounds
|
||||
"precache_file" "scripts/level_sounds_eli_lab.txt"
|
||||
"precache_file" "scripts/level_sounds_trainyard.txt"
|
||||
"precache_file" "scripts/level_sounds_k_lab.txt"
|
||||
"precache_file" "scripts/level_sounds_k_lab2.txt"
|
||||
"precache_file" "scripts/level_sounds_coast.txt"
|
||||
"precache_file" "scripts/level_sounds_novaprospekt.txt"
|
||||
"precache_file" "scripts/level_sounds_streetwar.txt"
|
||||
"precache_file" "scripts/level_sounds_streetwar2.txt"
|
||||
"precache_file" "scripts/level_sounds_breencast.txt"
|
||||
"precache_file" "scripts/level_sounds_citadel.txt"
|
||||
"precache_file" "scripts/level_sounds_canals.txt"
|
||||
"precache_file" "scripts/level_sounds_ravenholm.txt"
|
||||
"precache_file" "scripts/level_sounds_ravenholm2.txt"
|
||||
"precache_file" "scripts/level_sounds_canals2.txt"
|
||||
|
||||
//Music Tracks
|
||||
"precache_file" "scripts/level_sounds_music.txt"
|
||||
|
||||
// NPC Sounds
|
||||
"precache_file" "scripts/npc_sounds_eli.txt"
|
||||
"precache_file" "scripts/npc_sounds_alyx.txt"
|
||||
"precache_file" "scripts/npc_sounds_dog.txt"
|
||||
"precache_file" "scripts/npc_sounds_citizen.txt"
|
||||
"precache_file" "scripts/npc_sounds_barney.txt"
|
||||
"precache_file" "scripts/npc_sounds_soldier.txt"
|
||||
"precache_file" "scripts/npc_sounds_strider.txt"
|
||||
"precache_file" "scripts/npc_sounds_zombie.txt"
|
||||
"precache_file" "scripts/npc_sounds_vortigaunt.txt"
|
||||
"precache_file" "scripts/npc_sounds_turret.txt"
|
||||
"precache_file" "scripts/npc_sounds_scanner.txt"
|
||||
"precache_file" "scripts/npc_sounds_rollermine.txt"
|
||||
"precache_file" "scripts/npc_sounds_poisonzombie.txt"
|
||||
"precache_file" "scripts/npc_sounds_metropolice.txt"
|
||||
"precache_file" "scripts/npc_sounds_combinecamera.txt"
|
||||
"precache_file" "scripts/npc_sounds_manhack.txt"
|
||||
"precache_file" "scripts/npc_sounds_ichthyosaur.txt"
|
||||
"precache_file" "scripts/npc_sounds_blackheadcrab.txt"
|
||||
"precache_file" "scripts/npc_sounds_fastheadcrab.txt"
|
||||
"precache_file" "scripts/npc_sounds_headcrab.txt"
|
||||
"precache_file" "scripts/npc_sounds_fastzombie.txt"
|
||||
"precache_file" "scripts/npc_sounds_birds.txt"
|
||||
"precache_file" "scripts/npc_sounds_gunship.txt"
|
||||
"precache_file" "scripts/npc_sounds_dropship.txt"
|
||||
"precache_file" "scripts/npc_sounds_barnacle.txt"
|
||||
"precache_file" "scripts/npc_sounds_attackheli.txt"
|
||||
"precache_file" "scripts/npc_sounds_antlionguard.txt"
|
||||
"precache_file" "scripts/npc_sounds_antlion.txt"
|
||||
"precache_file" "scripts/npc_sounds_env_headcrabcanister.txt"
|
||||
"precache_file" "scripts/npc_sounds_combine_ball.txt"
|
||||
"precache_file" "scripts/npc_sounds_combine_mine.txt"
|
||||
"precache_file" "scripts/npc_sounds_sniper.txt"
|
||||
"precache_file" "scripts/npc_sounds_stalker.txt"
|
||||
"precache_file" "scripts/npc_sounds_gman.txt"
|
||||
"precache_file" "scripts/npc_sounds_combine_cannon.txt"
|
||||
"precache_file" "scripts/npc_sounds_alyx_episodic2.txt"
|
||||
"precache_file" "scripts/npc_sounds_turret_episodic2.txt"
|
||||
|
||||
// 1upD's Custom NPCs
|
||||
"precache_file" "scripts/npc_sounds_shadow_walker.txt"
|
||||
"precache_file" "scripts/npc_sounds_lost_soul.txt"
|
||||
"precache_file" "scripts/npc_sounds_bullsquid.txt"
|
||||
|
||||
|
||||
|
||||
}
|
1523
sp/game/mod_episodic/scripts/game_sounds_weapons.txt
Normal file
1523
sp/game/mod_episodic/scripts/game_sounds_weapons.txt
Normal file
File diff suppressed because it is too large
Load Diff
98
sp/game/mod_episodic/scripts/npc_sounds_bullsquid.txt
Normal file
98
sp/game/mod_episodic/scripts/npc_sounds_bullsquid.txt
Normal file
@ -0,0 +1,98 @@
|
||||
// Bullsquid
|
||||
"NPC_Bullsquid.Idle"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_75dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_idle1.wav"
|
||||
"wave" "bullchicken/bc_idle2.wav"
|
||||
"wave" "bullchicken/bc_idle3.wav"
|
||||
"wave" "bullchicken/bc_idle4.wav"
|
||||
"wave" "bullchicken/bc_idle5.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_Bullsquid.Pain"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_85dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_pain1.wav"
|
||||
"wave" "bullchicken/bc_pain2.wav"
|
||||
"wave" "bullchicken/bc_pain3.wav"
|
||||
"wave" "bullchicken/bc_pain4.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"npc_bullsquid.Alert"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_85dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_idle1.wav"
|
||||
"wave" "bullchicken/bc_idle2.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_Bullsquid.Die"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_85dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_die1.wav"
|
||||
"wave" "bullchicken/bc_die2.wav"
|
||||
"wave" "bullchicken/bc_die3.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_Bullsquid.Attack1"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_100dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_attack2.wav"
|
||||
"wave" "bullchicken/bc_attack3.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_Bullsquid.Bite"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_85dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_bite2.wav"
|
||||
"wave" "bullchicken/bc_bite3.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_Bullsquid.Growl"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "1.0"
|
||||
"soundlevel" "SNDLVL_80dB"
|
||||
"pitch" "PITCH_NORM"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "bullchicken/bc_attackgrowl.wav"
|
||||
"wave" "bullchicken/bc_attackgrowl2.wav"
|
||||
"wave" "bullchicken/bc_attackgrowl3.wav"
|
||||
}
|
||||
}
|
100
sp/game/mod_episodic/scripts/npc_sounds_lost_soul.txt
Normal file
100
sp/game/mod_episodic/scripts/npc_sounds_lost_soul.txt
Normal file
@ -0,0 +1,100 @@
|
||||
// Default sound scripts for npc_lost_soul
|
||||
// Author: 1upD
|
||||
|
||||
"NPC_LostSoul.Die"
|
||||
{
|
||||
"channel" "CHAN_BODY"
|
||||
"volume" "VOL_NORM"
|
||||
"pitch" "PITCH_NORM"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"wave" "physics/flesh/flesh_bloody_break.wav"
|
||||
}
|
||||
|
||||
|
||||
"NPC_LostSoul.Burn"
|
||||
{
|
||||
"channel" "CHAN_ITEM"
|
||||
"volume" "VOL_NORM"
|
||||
"pitch" "PITCH_NORM"
|
||||
|
||||
"soundlevel" "SNDLVL_70dB"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "player/pl_burnpain1.wav"
|
||||
"wave" "player/pl_burnpain2.wav"
|
||||
"wave" "player/pl_burnpain3.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_LostSoul.Bat"
|
||||
{
|
||||
"channel" "CHAN_ITEM"
|
||||
"volume" "VOL_NORM"
|
||||
"pitch" "150, 175"
|
||||
|
||||
"soundlevel" "SNDLVL_70dB"
|
||||
|
||||
"wave" "npc\stalker\stalker_alert3b.wav"
|
||||
}
|
||||
|
||||
|
||||
"NPC_LostSoul.Float"
|
||||
{
|
||||
"channel" "CHAN_ITEM"
|
||||
"volume" "VOL_NORM"
|
||||
"pitch" "PITCH_NORM"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "ambient\levels\citadel\datatransfmalevx01.wav"
|
||||
"wave" "ambient\levels\citadel\datatransmalevx01.wav"
|
||||
"wave" "ambient\levels\citadel\datatransmalevx02.wav"
|
||||
"wave" "ambient\levels\citadel\datatransmalevx02.wav"
|
||||
"wave" "ambient\levels\citadel\datatransrandom03.wav"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
"NPC_LostSoul.ChargeAnnounce"
|
||||
{
|
||||
"channel" "CHAN_WEAPON"
|
||||
"volume" "VOL_NORM"
|
||||
"pitch" "150, 175"
|
||||
//"pitch" "120, 125"
|
||||
"soundlevel" "SNDLVL_70dB"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "npc/zombie_poison/pz_alert1.wav"
|
||||
"wave" "npc/zombie_poison/pz_alert1.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_LostSoul.ChargeEnd"
|
||||
{
|
||||
"channel" "CHAN_WEAPON"
|
||||
"volume" "VOL_NORM"
|
||||
"pitch" "150, 175"
|
||||
//"pitch" "120, 125"
|
||||
"soundlevel" "SNDLVL_70dB"
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "npc/zombie_poison/pz_warn1.wav"
|
||||
"wave" "npc/zombie_poison/pz_warn1.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_LostSoul.Stunned"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.80"
|
||||
"pitch" "145,150"
|
||||
"soundlevel" "SNDLVL_70dB"
|
||||
"wave" "NPC_Antlion.PoisonBurstScream"
|
||||
|
||||
}
|
||||
|
200
sp/game/mod_episodic/scripts/npc_sounds_shadow_walker.txt
Normal file
200
sp/game/mod_episodic/scripts/npc_sounds_shadow_walker.txt
Normal file
@ -0,0 +1,200 @@
|
||||
// Default sound scripts for npc_shadow_walker
|
||||
// Author: 1upD
|
||||
|
||||
"NPC_ShadowWalker.Pain"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "65, 70"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "npc\stalker\stalker_pain1.wav"
|
||||
"wave" "npc\stalker\stalker_pain2.wav"
|
||||
"wave" "npc\stalker\stalker_pain3.wav"
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_ShadowWalker.Idle"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "80, 90"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "npc\stalker\stalker_scream1.wav"
|
||||
"wave" "npc\stalker\stalker_scream2.wav"
|
||||
"wave" "npc\stalker\stalker_scream3.wav"
|
||||
"wave" "npc\stalker\stalker_scream4.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_ShadowWalker.Vocal.Idle"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "62, 62"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "vo\episode_1\citadel\al_stalk_pleasestopscreaming01.wav"
|
||||
"wave" "vo\episode_1\citadel\al_stalk_pleasestopscreaming02.wav"
|
||||
"wave" "vo\episode_1\citadel\al_stalk_pleasestopscreaming03.wav"
|
||||
"wave" "vo\episode_1\citadel\al_stalk_pleasestopscreaming04.wav"
|
||||
"wave" "vo\episode_1\citadel\al_stalk_pleasestopscreaming05.wav"
|
||||
"wave" "vo\k_lab2\al_optimism.wav"
|
||||
"wave" "vo\episode_1\c17\al_elev_whereselev.wav"
|
||||
"wave" "vo\episode_1\intro\al_wheredoeshethink.wav"
|
||||
"wave" "vo\outland_02\griggs_everywhere.wav"
|
||||
"wave" "vo\outland_11a\silo\kl_silo_wheredata01.wav"
|
||||
"wave" "vo\episode_1\intro\al_cantbelieveit.wav"
|
||||
"wave" "vo\episode_1\npc\alyx\al_deaf_canthearanything.wav"
|
||||
"wave" "vo\episode_1\npc\alyx\al_deaf_canthearyou.wav"
|
||||
"wave" "vo\k_lab\ba_cantlook.wav"
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_ShadowWalker.Fear"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "62, 62"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
// Replace these
|
||||
"wave" "npc\stalker\stalker_die2.wav"
|
||||
"wave" "npc\stalker\stalker_pain1.wav"
|
||||
"wave" "npc\stalker\stalker_pain2.wav"
|
||||
"wave" "npc\stalker\stalker_pain3.wav"
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_ShadowWalker.Alert"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "80, 90"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "npc\stalker\stalker_alert1b.wav"
|
||||
"wave" "npc\stalker\stalker_alert2b.wav"
|
||||
"wave" "npc\stalker\stalker_alert3b.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_ShadowWalker.Vocal.Alert"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "62, 62"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "vo\citadel\al_bitofit.wav"
|
||||
"wave" "vo\outland_01\intro\al_rbed_notalone.wav"
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_ShadowWalker.LostEnemy"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "80, 90"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "npc\zombie_poison\pz_alert2.wav"
|
||||
"wave" "npc\stalker\stalker_die2.wav"
|
||||
"wave" "npc\stalker\stalker_scream4.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_ShadowWalker.Vocal.LostEnemy"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "62, 62"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "vo\citadel\al_notagain02.wav"
|
||||
"wave" "vo\episode_1\npc\alyx\al_light_lost05.wav"
|
||||
"wave" "vo\episode_1\npc\alyx\al_light_lost11.wav"
|
||||
"wave" "vo\citadel\al_wonderwhere.wav"
|
||||
"wave" "vo\outland_12a\launch\al_launch_damnit.wav"
|
||||
"wave" "vo\streetwar\alyx_gate\al_no.wav"
|
||||
"wave" "vo\k_lab\kl_thenwhere.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_ShadowWalker.FoundEnemy"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "75, 85"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "npc\stalker\go_alert2.wav"
|
||||
"wave" "npc\stalker\go_alert2a.wav"
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_ShadowWalker.Vocal.FoundEnemy"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "62, 62"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "npc\stalker\stalker_scream1.wav"
|
||||
"wave" "vo\citadel\al_thatshim.wav"
|
||||
"wave" "vo\citadel\al_thereheis.wav"
|
||||
"wave" "vo\episode_1\npc\alyx\al_rejoin02.wav"
|
||||
"wave" "vo\episode_1\npc\alyx\al_seemanyfoe03.wav"
|
||||
"wave" "vo\episode_1\npc\alyx\al_zombie_liveone02.wav"
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
"NPC_ShadowWalker.Death"
|
||||
{
|
||||
"channel" "CHAN_VOICE"
|
||||
"volume" "0.95"
|
||||
"pitch" "60, 65"
|
||||
|
||||
"soundlevel" "SNDLVL_NORM"
|
||||
|
||||
"rndwave"
|
||||
{
|
||||
"wave" "ambient\creatures\town_child_scream1.wav"
|
||||
}
|
||||
}
|
22
sp/game/mod_episodic/scripts/weapon_custommelee.txt
Normal file
22
sp/game/mod_episodic/scripts/weapon_custommelee.txt
Normal file
@ -0,0 +1,22 @@
|
||||
// Custom melee weapon - used by npc_shadow_walker for weapon model overrides
|
||||
WeaponData
|
||||
{
|
||||
// This will be replaced in code
|
||||
"playermodel" "models/weapons/w_crowbar.mdl"
|
||||
|
||||
"anim_prefix" "crowbar"
|
||||
|
||||
"clip_size" "-1"
|
||||
"primary_ammo" "None"
|
||||
"secondary_ammo" "None"
|
||||
|
||||
"weight" "0"
|
||||
"item_flags" "0"
|
||||
|
||||
// Sounds for the weapon. There is a max of 16 sounds per category (i.e. max 16 "single_shot" sounds)
|
||||
SoundData
|
||||
{
|
||||
"melee_hit_world" "Weapon_Crowbar.Melee_HitWorld"
|
||||
}
|
||||
|
||||
}
|
74
sp/game/mod_episodic/scripts/weapon_flaregun.txt
Normal file
74
sp/game/mod_episodic/scripts/weapon_flaregun.txt
Normal file
@ -0,0 +1,74 @@
|
||||
// Pistol
|
||||
|
||||
WeaponData
|
||||
{
|
||||
// Weapon data is loaded by both the Game and Client DLLs.
|
||||
"printname" "#HL2_Flaregun"
|
||||
"viewmodel" "models/weapons/v_flaregun.mdl"
|
||||
"playermodel" "models/weapons/w_flaregun.mdl"
|
||||
"anim_prefix" "pistol"
|
||||
"bucket" "1"
|
||||
"bucket_position" "2"
|
||||
"bucket_360" "0"
|
||||
"bucket_position_360" "0"
|
||||
|
||||
"clip_size" "1"
|
||||
"primary_ammo" "FlareRound"
|
||||
"secondary_ammo" "None"
|
||||
|
||||
"weight" "2"
|
||||
"rumble" "1"
|
||||
"item_flags" "0"
|
||||
|
||||
// Sounds for the weapon. There is a max of 16 sounds per category (i.e. max 16 "single_shot" sounds)
|
||||
SoundData
|
||||
{
|
||||
|
||||
"reload" "Weapon_FlareGun.Reload"
|
||||
"reload_npc" "Weapon_FlareGun.Reload"
|
||||
"empty" "Weapon_Pistol.Empty"
|
||||
"single_shot" "Weapon_FlareGun.Single"
|
||||
"single_shot_npc" "Weapon_FlareGun.Single"
|
||||
"special1" "Weapon_Pistol.Special1"
|
||||
"special2" "Weapon_Pistol.Special2"
|
||||
"burst" "Weapon_Pistol.Burst"
|
||||
}
|
||||
|
||||
// Weapon Sprite data is loaded by the Client DLL.
|
||||
TextureData
|
||||
{
|
||||
"weapon"
|
||||
{
|
||||
"font" "WeaponIcons"
|
||||
"character" "d"
|
||||
}
|
||||
"weapon_s"
|
||||
{
|
||||
"font" "WeaponIconsSelected"
|
||||
"character" "d"
|
||||
}
|
||||
"weapon_small"
|
||||
{
|
||||
"font" "WeaponIconsSmall"
|
||||
"character" "d"
|
||||
}
|
||||
"ammo"
|
||||
{
|
||||
"font" "WeaponIconsSmall"
|
||||
"character" "p"
|
||||
}
|
||||
"crosshair"
|
||||
{
|
||||
"font" "Crosshairs"
|
||||
"character" "Q"
|
||||
}
|
||||
"autoaim"
|
||||
{
|
||||
"file" "sprites/crosshairs"
|
||||
"x" "0"
|
||||
"y" "48"
|
||||
"width" "24"
|
||||
"height" "24"
|
||||
}
|
||||
}
|
||||
}
|
25
sp/game/mod_episodic/scripts/weapon_manifest.txt
Normal file
25
sp/game/mod_episodic/scripts/weapon_manifest.txt
Normal file
@ -0,0 +1,25 @@
|
||||
weapon_manifest
|
||||
{
|
||||
"file" "scripts/weapon_357.txt"
|
||||
"file" "scripts/weapon_alyxgun.txt"
|
||||
"file" "scripts/weapon_annabelle.txt"
|
||||
"file" "scripts/weapon_ar2.txt"
|
||||
"file" "scripts/weapon_bugbait.txt"
|
||||
"file" "scripts/weapon_citizenpackage.txt"
|
||||
"file" "scripts/weapon_citizensuitcase.txt"
|
||||
"file" "scripts/weapon_crossbow.txt"
|
||||
"file" "scripts/weapon_crowbar.txt"
|
||||
"file" "scripts/weapon_cubemap.txt"
|
||||
"file" "scripts/weapon_frag.txt"
|
||||
"file" "scripts/weapon_physcannon.txt"
|
||||
"file" "scripts/weapon_physgun.txt"
|
||||
"file" "scripts/weapon_pistol.txt"
|
||||
"file" "scripts/weapon_rpg.txt"
|
||||
"file" "scripts/weapon_shotgun.txt"
|
||||
"file" "scripts/weapon_smg1.txt"
|
||||
"file" "scripts/weapon_stunstick.txt"
|
||||
|
||||
// Custom
|
||||
"file" "scripts/weapon_custommelee.txt"
|
||||
"file" "scripts/weapon_flaregun.txt"
|
||||
}
|
@ -1149,7 +1149,7 @@ void C_BaseFlex::SetupWeights( const matrix3x4_t *pBoneToWorld, int nFlexWeightC
|
||||
{
|
||||
// hack in an initialization
|
||||
LinkToGlobalFlexControllers( GetModelPtr() );
|
||||
m_iBlink = AddGlobalFlexController( "UH" );
|
||||
m_iBlink = AddGlobalFlexController( "blink" );
|
||||
|
||||
if ( SetupGlobalWeights( pBoneToWorld, nFlexWeightCount, pFlexWeights, pFlexDelayedWeights ) )
|
||||
{
|
||||
|
@ -221,15 +221,24 @@ void C_EnvProjectedTexture::UpdateLight( bool bForceUpdate )
|
||||
|
||||
g_pClientShadowMgr->SetFlashlightLightWorld( m_LightHandle, m_bLightWorld );
|
||||
|
||||
if ( bForceUpdate == false )
|
||||
{
|
||||
|
||||
// The conditional to check if bForceUpdate == false is commented out based on a guide on VDC
|
||||
// https://developer.valvesoftware.com/wiki/Env_projectedtexture/fixes
|
||||
// This was done so that projected textures may be parented.
|
||||
// Change made by Derek Dik on 9/4/2016
|
||||
|
||||
//if ( bForceUpdate == false )
|
||||
//{
|
||||
g_pClientShadowMgr->UpdateProjectedTexture( m_LightHandle, true );
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
void C_EnvProjectedTexture::Simulate( void )
|
||||
{
|
||||
UpdateLight( false );
|
||||
// According to VDC, we want to update the light based on when there is a movement parent
|
||||
//https://developer.valvesoftware.com/wiki/Env_projectedtexture/fixes
|
||||
// Change made by Derek Dik on 9/4/2016
|
||||
UpdateLight( GetMoveParent() != NULL );
|
||||
|
||||
BaseClass::Simulate();
|
||||
}
|
||||
|
@ -1290,8 +1290,12 @@ bool CClientShadowMgr::Init()
|
||||
|
||||
SetShadowBlobbyCutoffArea( 0.005 );
|
||||
|
||||
bool bTools = CommandLine()->CheckParm( "-tools" ) != NULL;
|
||||
m_nMaxDepthTextureShadows = bTools ? 4 : 1; // Just one shadow depth texture in games, more in tools
|
||||
// Raise the max projected texture limit to 8
|
||||
// https://developer.valvesoftware.com/wiki/Env_projectedtexture/fixes
|
||||
//bool bTools = CommandLine()->CheckParm( "-tools" ) != NULL;
|
||||
//m_nMaxDepthTextureShadows = bTools ? 4 : 1; // Just one shadow depth texture in games, more in tools
|
||||
m_nMaxDepthTextureShadows = 8; //with your number
|
||||
|
||||
|
||||
bool bLowEnd = ( g_pMaterialSystemHardwareConfig->GetDXSupportLevel() < 80 );
|
||||
|
||||
|
@ -1471,24 +1471,6 @@ void CDetailObjectSystem::LevelInitPreEntity()
|
||||
}
|
||||
}
|
||||
|
||||
if ( m_DetailObjects.Count() || m_DetailSpriteDict.Count() )
|
||||
{
|
||||
// There are detail objects in the level, so precache the material
|
||||
PrecacheMaterial( DETAIL_SPRITE_MATERIAL );
|
||||
IMaterial *pMat = m_DetailSpriteMaterial;
|
||||
// adjust for non-square textures (cropped)
|
||||
float flRatio = (float)( pMat->GetMappingWidth() ) / pMat->GetMappingHeight();
|
||||
if ( flRatio > 1.0 )
|
||||
{
|
||||
for( int i = 0; i<m_DetailSpriteDict.Count(); i++ )
|
||||
{
|
||||
m_DetailSpriteDict[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDict[i].m_TexLR.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexLR.y *= flRatio;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int detailPropLightingLump;
|
||||
if( g_pMaterialSystemHardwareConfig->GetHDRType() != HDR_TYPE_NONE )
|
||||
@ -1512,13 +1494,29 @@ void CDetailObjectSystem::LevelInitPreEntity()
|
||||
|
||||
void CDetailObjectSystem::LevelInitPostEntity()
|
||||
{
|
||||
if ( m_DetailObjects.Count() || m_DetailSpriteDict.Count() )
|
||||
{
|
||||
const char *pDetailSpriteMaterial = DETAIL_SPRITE_MATERIAL;
|
||||
C_World *pWorld = GetClientWorldEntity();
|
||||
if ( pWorld && pWorld->GetDetailSpriteMaterial() && *(pWorld->GetDetailSpriteMaterial()) )
|
||||
{
|
||||
pDetailSpriteMaterial = pWorld->GetDetailSpriteMaterial();
|
||||
}
|
||||
|
||||
m_DetailSpriteMaterial.Init( pDetailSpriteMaterial, TEXTURE_GROUP_OTHER );
|
||||
PrecacheMaterial( pDetailSpriteMaterial );
|
||||
IMaterial *pMat = m_DetailSpriteMaterial;
|
||||
// adjust for non-square textures (cropped)
|
||||
float flRatio = pMat->GetMappingWidth() / pMat->GetMappingHeight();
|
||||
if ( flRatio > 1.0 )
|
||||
{
|
||||
for( int i = 0; i<m_DetailSpriteDict.Count(); i++ )
|
||||
{
|
||||
m_DetailSpriteDict[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDict[i].m_TexLR.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexUL.y *= flRatio;
|
||||
m_DetailSpriteDictFlipped[i].m_TexLR.y *= flRatio;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( GetDetailController() )
|
||||
{
|
||||
|
@ -99,14 +99,14 @@ enum Class_T
|
||||
CLASS_ANTLION,
|
||||
CLASS_BARNACLE,
|
||||
CLASS_BULLSEYE,
|
||||
//CLASS_BULLSQUID,
|
||||
CLASS_BULLSQUID,
|
||||
CLASS_CITIZEN_PASSIVE,
|
||||
CLASS_CITIZEN_REBEL,
|
||||
CLASS_COMBINE,
|
||||
CLASS_COMBINE_GUNSHIP,
|
||||
CLASS_CONSCRIPT,
|
||||
CLASS_HEADCRAB,
|
||||
//CLASS_HOUNDEYE,
|
||||
CLASS_HOUNDEYE,
|
||||
CLASS_MANHACK,
|
||||
CLASS_METROPOLICE,
|
||||
CLASS_MILITARY,
|
||||
@ -120,6 +120,7 @@ enum Class_T
|
||||
CLASS_EARTH_FAUNA,
|
||||
CLASS_HACKED_ROLLERMINE,
|
||||
CLASS_COMBINE_HUNTER,
|
||||
CLASS_TEST,
|
||||
|
||||
NUM_AI_CLASSES
|
||||
};
|
||||
|
@ -128,6 +128,10 @@ void CGrenadeSpit::Event_Killed( const CTakeDamageInfo &info )
|
||||
//-----------------------------------------------------------------------------
|
||||
void CGrenadeSpit::GrenadeSpitTouch( CBaseEntity *pOther )
|
||||
{
|
||||
|
||||
if ( pOther->Classify() == CLASS_BULLSQUID)
|
||||
return; // Don't hit bullsquids!
|
||||
|
||||
if ( pOther->IsSolidFlagSet(FSOLID_VOLUME_CONTENTS | FSOLID_TRIGGER) )
|
||||
{
|
||||
// Some NPCs are triggers that can take damage (like antlion grubs). We should hit them.
|
||||
|
@ -606,6 +606,7 @@ enum
|
||||
AMMOCRATE_CROSSBOW,
|
||||
AMMOCRATE_AR2_ALTFIRE,
|
||||
AMMOCRATE_SMG_ALTFIRE,
|
||||
AMMOCRATE_FLAREROUND,
|
||||
NUM_AMMO_CRATE_TYPES,
|
||||
};
|
||||
|
||||
@ -693,6 +694,7 @@ const char *CItem_AmmoCrate::m_lpzModelNames[NUM_AMMO_CRATE_TYPES] =
|
||||
//FIXME: This model is incorrect!
|
||||
"models/items/ammocrate_ar2.mdl", // Combine Ball
|
||||
"models/items/ammocrate_smg2.mdl", // smg grenade
|
||||
"models/items/ammocrate_pistol.mdl", // Flareround
|
||||
};
|
||||
|
||||
// Ammo type names
|
||||
@ -708,6 +710,7 @@ const char *CItem_AmmoCrate::m_lpzAmmoNames[NUM_AMMO_CRATE_TYPES] =
|
||||
"XBowBolt",
|
||||
"AR2AltFire",
|
||||
"SMG1_Grenade",
|
||||
"FlareRound",
|
||||
};
|
||||
|
||||
// Ammo amount given per +use
|
||||
@ -723,6 +726,7 @@ int CItem_AmmoCrate::m_nAmmoAmounts[NUM_AMMO_CRATE_TYPES] =
|
||||
50, // Crossbow
|
||||
3, // AR2 alt-fire
|
||||
5,
|
||||
3
|
||||
};
|
||||
|
||||
const char *CItem_AmmoCrate::m_pGiveWeapon[NUM_AMMO_CRATE_TYPES] =
|
||||
@ -737,6 +741,7 @@ const char *CItem_AmmoCrate::m_pGiveWeapon[NUM_AMMO_CRATE_TYPES] =
|
||||
NULL, // Crossbow
|
||||
NULL, // AR2 alt-fire
|
||||
NULL, // SMG alt-fire
|
||||
NULL
|
||||
};
|
||||
|
||||
#define AMMO_CRATE_CLOSE_DELAY 1.5f
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include "vstdlib/random.h"
|
||||
#include "engine/IEngineSound.h"
|
||||
#include "movevars_shared.h"
|
||||
#include "particle_parse.h" // DispatchParticleEffect
|
||||
|
||||
#include "AI_Hint.h"
|
||||
#include "AI_Senses.h"
|
||||
@ -38,10 +39,12 @@
|
||||
|
||||
#define SQUID_SPRINT_DIST 256 // how close the squid has to get before starting to sprint and refusing to swerve
|
||||
|
||||
ConVar sk_bullsquid_health( "sk_bullsquid_health", "0" );
|
||||
ConVar sk_bullsquid_dmg_bite( "sk_bullsquid_dmg_bite", "0" );
|
||||
ConVar sk_bullsquid_dmg_whip( "sk_bullsquid_dmg_whip", "0" );
|
||||
|
||||
ConVar sk_bullsquid_health( "sk_bullsquid_health", "100" );
|
||||
ConVar sk_bullsquid_dmg_bite( "sk_bullsquid_dmg_bite", "15" );
|
||||
ConVar sk_bullsquid_dmg_whip( "sk_bullsquid_dmg_whip", "25" );
|
||||
ConVar sk_bullsquid_spit_speed( "sk_bullsquid_spit_speed", "10");
|
||||
ConVar sk_bullsquid_spit_min_wait( "sk_bullsquid_spit_min_wait", "2");
|
||||
ConVar sk_bullsquid_spit_max_wait( "sk_bullsquid_spit_max_wait", "5");
|
||||
//=========================================================
|
||||
// monster-specific schedule types
|
||||
//=========================================================
|
||||
@ -87,6 +90,7 @@ int g_interactionBullsquidThrow = 0;
|
||||
#define BSQUID_AE_HOP ( 5 )
|
||||
#define BSQUID_AE_THROW ( 6 )
|
||||
#define BSQUID_AE_WHIP_SND ( 7 )
|
||||
//#define BSQUID_AE_TAILWHIP ( 8 )
|
||||
|
||||
LINK_ENTITY_TO_CLASS( npc_bullsquid, CNPC_Bullsquid );
|
||||
|
||||
@ -107,6 +111,8 @@ BEGIN_DATADESC( CNPC_Bullsquid )
|
||||
// DEFINE_FIELD( m_nSquidSpitSprite, FIELD_INTEGER ),
|
||||
DEFINE_FIELD( m_flHungryTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( m_nextSquidSoundTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( m_vecSaveSpitVelocity, FIELD_VECTOR),
|
||||
|
||||
|
||||
END_DATADESC()
|
||||
|
||||
@ -154,6 +160,8 @@ void CNPC_Bullsquid::Precache()
|
||||
|
||||
UTIL_PrecacheOther( "grenade_spit" );
|
||||
|
||||
PrecacheParticleSystem( "blood_impact_yellow_01" );
|
||||
|
||||
PrecacheScriptSound( "NPC_Bullsquid.Idle" );
|
||||
PrecacheScriptSound( "NPC_Bullsquid.Pain" );
|
||||
PrecacheScriptSound( "NPC_Bullsquid.Alert" );
|
||||
@ -161,6 +169,8 @@ void CNPC_Bullsquid::Precache()
|
||||
PrecacheScriptSound( "NPC_Bullsquid.Attack1" );
|
||||
PrecacheScriptSound( "NPC_Bullsquid.Growl" );
|
||||
PrecacheScriptSound( "NPC_Bullsquid.TailWhip");
|
||||
PrecacheScriptSound( "NPC_Antlion.PoisonShoot" );
|
||||
PrecacheScriptSound( "NPC_Antlion.PoisonBall" );
|
||||
|
||||
BaseClass::Precache();
|
||||
}
|
||||
@ -262,6 +272,8 @@ void CNPC_Bullsquid::HandleAnimEvent( animevent_t *pEvent )
|
||||
{
|
||||
if ( GetEnemy() )
|
||||
{
|
||||
// Replace original bullsquid spit code with antlion worker code
|
||||
/*
|
||||
Vector vSpitPos;
|
||||
|
||||
GetAttachment( "Mouth", vSpitPos );
|
||||
@ -272,7 +284,8 @@ void CNPC_Bullsquid::HandleAnimEvent( animevent_t *pEvent )
|
||||
float flGravity = SPIT_GRAVITY;
|
||||
ThrowLimit(vSpitPos, vTarget, flGravity, 3, Vector(0,0,0), Vector(0,0,0), GetEnemy(), &vToss, &pBlocker);
|
||||
|
||||
CGrenadeSpit *pGrenade = (CGrenadeSpit*)CreateNoSpawn( "grenade_spit", vSpitPos, vec3_angle, this );
|
||||
//CGrenadeSpit *pGrenade = (CGrenadeSpit*)CreateNoSpawn( "grenade_spit", vSpitPos, vec3_angle, this );
|
||||
CGrenadeSpit *pGrenade = (CGrenadeSpit*) CreateEntityByName( "grenade_spit" );
|
||||
//pGrenade->KeyValue( "velocity", vToss );
|
||||
pGrenade->Spawn( );
|
||||
pGrenade->SetThrower( this );
|
||||
@ -292,12 +305,98 @@ void CNPC_Bullsquid::HandleAnimEvent( animevent_t *pEvent )
|
||||
AttackSound();
|
||||
|
||||
CPVSFilter filter( vSpitPos );
|
||||
te->SpriteSpray( filter, 0.0,
|
||||
&vSpitPos, &vToss, m_nSquidSpitSprite, 5, 10, 15 );
|
||||
|
||||
//don't emit sprites
|
||||
|
||||
//te->SpriteSpray( filter, 0.0,
|
||||
// &vSpitPos, &vToss, m_nSquidSpitSprite, 5, 10, 15 );
|
||||
}
|
||||
*/
|
||||
Vector vSpitPos;
|
||||
//GetAttachment( "Mouth", vSpitPos );
|
||||
|
||||
vSpitPos = GetAbsOrigin() + Vector(0, 0, 64); // The Bullsquid model does not have an origin!
|
||||
|
||||
Vector vTarget;
|
||||
|
||||
// If our enemy is looking at us and far enough away, lead him
|
||||
if ( HasCondition( COND_ENEMY_FACING_ME ) && UTIL_DistApprox( GetAbsOrigin(), GetEnemy()->GetAbsOrigin() ) > (40*12) )
|
||||
{
|
||||
UTIL_PredictedPosition( GetEnemy(), 0.5f, &vTarget );
|
||||
vTarget.z = GetEnemy()->GetAbsOrigin().z;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Otherwise he can't see us and he won't be able to dodge
|
||||
vTarget = GetEnemy()->BodyTarget( vSpitPos, true );
|
||||
}
|
||||
|
||||
vTarget[2] += random->RandomFloat( 0.0f, 32.0f );
|
||||
|
||||
// Try and spit at our target
|
||||
Vector vecToss;
|
||||
if ( GetSpitVector( vSpitPos, vTarget, &vecToss ) == false )
|
||||
{
|
||||
// Now try where they were
|
||||
if ( GetSpitVector( vSpitPos, m_vSavePosition, &vecToss ) == false )
|
||||
{
|
||||
// Failing that, just shoot with the old velocity we calculated initially!
|
||||
vecToss = m_vecSaveSpitVelocity;
|
||||
}
|
||||
}
|
||||
|
||||
// Find what our vertical theta is to estimate the time we'll impact the ground
|
||||
Vector vecToTarget = ( vTarget - vSpitPos );
|
||||
VectorNormalize( vecToTarget );
|
||||
float flVelocity = VectorNormalize( vecToss );
|
||||
float flCosTheta = DotProduct( vecToTarget, vecToss );
|
||||
float flTime = (vSpitPos-vTarget).Length2D() / ( flVelocity * flCosTheta );
|
||||
|
||||
// Emit a sound where this is going to hit so that targets get a chance to act correctly
|
||||
CSoundEnt::InsertSound( SOUND_DANGER, vTarget, (15*12), flTime, this );
|
||||
|
||||
// Don't fire again until this volley would have hit the ground (with some lag behind it)
|
||||
SetNextAttack( gpGlobals->curtime + flTime + random->RandomFloat( 0.5f, 2.0f ) );
|
||||
|
||||
for ( int i = 0; i < 6; i++ )
|
||||
{
|
||||
CGrenadeSpit *pGrenade = (CGrenadeSpit*) CreateEntityByName( "grenade_spit" );
|
||||
pGrenade->SetAbsOrigin( vSpitPos );
|
||||
pGrenade->SetAbsAngles( vec3_angle );
|
||||
DispatchSpawn( pGrenade );
|
||||
pGrenade->SetThrower( this );
|
||||
pGrenade->SetOwnerEntity( this );
|
||||
|
||||
if ( i == 0 )
|
||||
{
|
||||
pGrenade->SetSpitSize( SPIT_LARGE );
|
||||
pGrenade->SetAbsVelocity( vecToss * flVelocity );
|
||||
}
|
||||
else
|
||||
{
|
||||
pGrenade->SetAbsVelocity( ( vecToss + RandomVector( -0.035f, 0.035f ) ) * flVelocity );
|
||||
pGrenade->SetSpitSize( random->RandomInt( SPIT_SMALL, SPIT_MEDIUM ) );
|
||||
}
|
||||
|
||||
// Tumble through the air
|
||||
pGrenade->SetLocalAngularVelocity(
|
||||
QAngle( random->RandomFloat( -250, -500 ),
|
||||
random->RandomFloat( -250, -500 ),
|
||||
random->RandomFloat( -250, -500 ) ) );
|
||||
}
|
||||
|
||||
for ( int i = 0; i < 8; i++ )
|
||||
{
|
||||
DispatchParticleEffect( "blood_impact_yellow_01", vSpitPos + RandomVector( -12.0f, 12.0f ), RandomAngle( 0, 360 ) );
|
||||
}
|
||||
AttackSound();
|
||||
EmitSound( "NPC_Antlion.PoisonShoot" );
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case BSQUID_AE_BITE:
|
||||
{
|
||||
// SOUND HERE!
|
||||
@ -319,7 +418,7 @@ void CNPC_Bullsquid::HandleAnimEvent( animevent_t *pEvent )
|
||||
}
|
||||
|
||||
/*
|
||||
case BSQUID_AE_TAILWHIP:
|
||||
case BSQUID_AE_TAILWHIP: // this function was commented out
|
||||
{
|
||||
CBaseEntity *pHurt = CheckTraceHullAttack( 70, Vector(-16,-16,-16), Vector(16,16,16), sk_bullsquid_dmg_whip.GetFloat(), DMG_SLASH | DMG_ALWAYSGIB );
|
||||
if ( pHurt )
|
||||
@ -405,6 +504,8 @@ void CNPC_Bullsquid::HandleAnimEvent( animevent_t *pEvent )
|
||||
|
||||
int CNPC_Bullsquid::RangeAttack1Conditions( float flDot, float flDist )
|
||||
{
|
||||
// Code to determine whether or not this NPC can attack ranged commented out until I can sort out the issue with the projectile
|
||||
|
||||
if ( IsMoving() && flDist >= 512 )
|
||||
{
|
||||
// squid will far too far behind if he stops running to spit at this distance from the enemy.
|
||||
@ -425,12 +526,12 @@ int CNPC_Bullsquid::RangeAttack1Conditions( float flDot, float flDist )
|
||||
if ( IsMoving() )
|
||||
{
|
||||
// don't spit again for a long time, resume chasing enemy.
|
||||
m_flNextSpitTime = gpGlobals->curtime + 5;
|
||||
m_flNextSpitTime = gpGlobals->curtime + sk_bullsquid_spit_max_wait.GetFloat();
|
||||
}
|
||||
else
|
||||
{
|
||||
// not moving, so spit again pretty soon.
|
||||
m_flNextSpitTime = gpGlobals->curtime + 0.5;
|
||||
m_flNextSpitTime = gpGlobals->curtime + sk_bullsquid_spit_min_wait.GetFloat(); // was 0.5, increased to 2 to prevent spamming behavior
|
||||
}
|
||||
|
||||
return( COND_CAN_RANGE_ATTACK1 );
|
||||
@ -439,16 +540,125 @@ int CNPC_Bullsquid::RangeAttack1Conditions( float flDot, float flDist )
|
||||
return( COND_NONE );
|
||||
}
|
||||
|
||||
//
|
||||
// FIXME: Create this in a better fashion!
|
||||
//
|
||||
|
||||
Vector VecCheckThrowToleranceSquid( CBaseEntity *pEdict, const Vector &vecSpot1, Vector vecSpot2, float flSpeed, float flTolerance )
|
||||
{
|
||||
flSpeed = MAX( 1.0f, flSpeed );
|
||||
|
||||
float flGravity = GetCurrentGravity();
|
||||
|
||||
Vector vecGrenadeVel = (vecSpot2 - vecSpot1);
|
||||
|
||||
// throw at a constant time
|
||||
float time = vecGrenadeVel.Length( ) / flSpeed;
|
||||
vecGrenadeVel = vecGrenadeVel * (1.0 / time);
|
||||
|
||||
// adjust upward toss to compensate for gravity loss
|
||||
vecGrenadeVel.z += flGravity * time * 0.5;
|
||||
|
||||
Vector vecApex = vecSpot1 + (vecSpot2 - vecSpot1) * 0.5;
|
||||
vecApex.z += 0.5 * flGravity * (time * 0.5) * (time * 0.5);
|
||||
|
||||
|
||||
trace_t tr;
|
||||
UTIL_TraceLine( vecSpot1, vecApex, MASK_SOLID, pEdict, COLLISION_GROUP_NONE, &tr );
|
||||
if (tr.fraction != 1.0)
|
||||
{
|
||||
// fail!
|
||||
//if ( g_debug_antlion_worker.GetBool() )
|
||||
//{
|
||||
// NDebugOverlay::Line( vecSpot1, vecApex, 255, 0, 0, true, 5.0 );
|
||||
//}
|
||||
|
||||
return vec3_origin;
|
||||
}
|
||||
|
||||
//if ( g_debug_antlion_worker.GetBool() )
|
||||
//{
|
||||
//NDebugOverlay::Line( vecSpot1, vecApex, 0, 255, 0, true, 5.0 );
|
||||
//}
|
||||
|
||||
UTIL_TraceLine( vecApex, vecSpot2, MASK_SOLID_BRUSHONLY, pEdict, COLLISION_GROUP_NONE, &tr );
|
||||
if ( tr.fraction != 1.0 )
|
||||
{
|
||||
bool bFail = true;
|
||||
|
||||
// Didn't make it all the way there, but check if we're within our tolerance range
|
||||
if ( flTolerance > 0.0f )
|
||||
{
|
||||
float flNearness = ( tr.endpos - vecSpot2 ).LengthSqr();
|
||||
if ( flNearness < Square( flTolerance ) )
|
||||
{
|
||||
//if ( g_debug_antlion_worker.GetBool() )
|
||||
//{
|
||||
// NDebugOverlay::Sphere( tr.endpos, vec3_angle, flTolerance, 0, 255, 0, 0, true, 5.0 );
|
||||
//}
|
||||
|
||||
bFail = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( bFail )
|
||||
{
|
||||
//NDebugOverlay::Line( vecApex, vecSpot2, 255, 0, 0, true, 5.0 );
|
||||
//NDebugOverlay::Sphere( tr.endpos, vec3_angle, flTolerance, 255, 0, 0, 0, true, 5.0 );
|
||||
|
||||
return vec3_origin;
|
||||
}
|
||||
}
|
||||
|
||||
return vecGrenadeVel;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Get a toss direction that will properly lob spit to hit a target
|
||||
// Input : &vecStartPos - Where the spit will start from
|
||||
// &vecTarget - Where the spit is meant to land
|
||||
// *vecOut - The resulting vector to lob the spit
|
||||
// Output : Returns true on success, false on failure.
|
||||
//-----------------------------------------------------------------------------
|
||||
bool CNPC_Bullsquid::GetSpitVector( const Vector &vecStartPos, const Vector &vecTarget, Vector *vecOut )
|
||||
{
|
||||
// Try the most direct route
|
||||
Vector vecToss = VecCheckThrowToleranceSquid( this, vecStartPos, vecTarget, 1024.0f, (10.0f*12.0f) );
|
||||
|
||||
// If this failed then try a little faster (flattens the arc)
|
||||
if ( vecToss == vec3_origin )
|
||||
{
|
||||
vecToss = VecCheckThrowToleranceSquid( this, vecStartPos, vecTarget, 1024.0f * 1.5f, (10.0f*12.0f) );
|
||||
if ( vecToss == vec3_origin )
|
||||
return false;
|
||||
}
|
||||
|
||||
// Save out the result
|
||||
if ( vecOut )
|
||||
{
|
||||
*vecOut = vecToss;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//=========================================================
|
||||
// MeleeAttack2Conditions - bullsquid is a big guy, so has a longer
|
||||
// melee range than most monsters. This is the tailwhip attack
|
||||
//=========================================================
|
||||
int CNPC_Bullsquid::MeleeAttack1Conditions( float flDot, float flDist )
|
||||
{
|
||||
if ( GetEnemy()->m_iHealth <= sk_bullsquid_dmg_whip.GetFloat() && flDist <= 85 && flDot >= 0.7 )
|
||||
{
|
||||
return ( COND_CAN_MELEE_ATTACK1 );
|
||||
}
|
||||
// Animation is broken - DO NOT tail whip!
|
||||
//if ( GetEnemy()->m_iHealth <= sk_bullsquid_dmg_whip.GetFloat() && flDist <= 85 && flDot >= 0.7 )
|
||||
//{
|
||||
// return ( COND_CAN_MELEE_ATTACK1 );
|
||||
//}
|
||||
|
||||
return( COND_NONE );
|
||||
}
|
||||
@ -461,7 +671,9 @@ int CNPC_Bullsquid::MeleeAttack1Conditions( float flDot, float flDist )
|
||||
//=========================================================
|
||||
int CNPC_Bullsquid::MeleeAttack2Conditions( float flDot, float flDist )
|
||||
{
|
||||
if ( flDist <= 85 && flDot >= 0.7 && !HasCondition( COND_CAN_MELEE_ATTACK1 ) ) // The player & bullsquid can be as much as their bboxes
|
||||
if ( flDist <= 85 && flDot >= 0.7
|
||||
//&& !HasCondition( COND_CAN_MELEE_ATTACK1 )
|
||||
) // The player & bullsquid can be as much as their bboxes
|
||||
return ( COND_CAN_MELEE_ATTACK2 );
|
||||
|
||||
return( COND_NONE );
|
||||
@ -491,14 +703,14 @@ void CNPC_Bullsquid::RemoveIgnoredConditions( void )
|
||||
if ( GetEnemy() != NULL )
|
||||
{
|
||||
// ( Unless after a tasty headcrab, yumm ^_^ )
|
||||
if ( FClassnameIs( GetEnemy(), "monster_headcrab" ) )
|
||||
if ( FClassnameIs( GetEnemy(), "npc_headcrab" ) )
|
||||
ClearCondition( COND_SMELL );
|
||||
}
|
||||
}
|
||||
|
||||
Disposition_t CNPC_Bullsquid::IRelationType( CBaseEntity *pTarget )
|
||||
{
|
||||
if ( gpGlobals->curtime - m_flLastHurtTime < 5 && FClassnameIs( pTarget, "monster_headcrab" ) )
|
||||
if ( gpGlobals->curtime - m_flLastHurtTime < 5 && FClassnameIs( pTarget, "npc_headcrab" ) )
|
||||
{
|
||||
// if squid has been hurt in the last 5 seconds, and is getting relationship for a headcrab,
|
||||
// tell squid to disregard crab.
|
||||
@ -543,7 +755,7 @@ int CNPC_Bullsquid::OnTakeDamage_Alive( const CTakeDamageInfo &inputInfo )
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( !FClassnameIs( inputInfo.GetAttacker(), "monster_headcrab" ) )
|
||||
if ( !FClassnameIs( inputInfo.GetAttacker(), "npc_headcrab" ) )
|
||||
{
|
||||
// don't forget about headcrabs if it was a headcrab that hurt the squid.
|
||||
m_flLastHurtTime = gpGlobals->curtime;
|
||||
@ -694,7 +906,7 @@ int CNPC_Bullsquid::SelectSchedule( void )
|
||||
|
||||
if ( HasCondition( COND_NEW_ENEMY ) )
|
||||
{
|
||||
if ( m_fCanThreatDisplay && IRelationType( GetEnemy() ) == D_HT && FClassnameIs( GetEnemy(), "monster_headcrab" ) )
|
||||
if ( m_fCanThreatDisplay && IRelationType( GetEnemy() ) == D_HT && FClassnameIs( GetEnemy(), "npc_headcrab" ) )
|
||||
{
|
||||
// this means squid sees a headcrab!
|
||||
m_fCanThreatDisplay = FALSE;// only do the headcrab dance once per lifetime.
|
||||
@ -727,10 +939,11 @@ int CNPC_Bullsquid::SelectSchedule( void )
|
||||
return SCHED_RANGE_ATTACK1;
|
||||
}
|
||||
|
||||
if ( HasCondition( COND_CAN_MELEE_ATTACK1 ) )
|
||||
{
|
||||
return SCHED_MELEE_ATTACK1;
|
||||
}
|
||||
// DO NOT tail whip!
|
||||
//if ( HasCondition( COND_CAN_MELEE_ATTACK1 ) )
|
||||
//{
|
||||
// return SCHED_MELEE_ATTACK1;
|
||||
//}
|
||||
|
||||
if ( HasCondition( COND_CAN_MELEE_ATTACK2 ) )
|
||||
{
|
||||
|
@ -57,6 +57,9 @@ public:
|
||||
void StartTask ( const Task_t *pTask );
|
||||
void RunTask ( const Task_t *pTask );
|
||||
|
||||
// Copied from antlion
|
||||
virtual bool GetSpitVector( const Vector &vecStartPos, const Vector &vecTarget, Vector *vecOut );
|
||||
|
||||
NPC_STATE SelectIdealState ( void );
|
||||
|
||||
DEFINE_CUSTOM_AI;
|
||||
@ -70,5 +73,7 @@ private:
|
||||
float m_flHungryTime;// set this is a future time to stop the monster from eating for a while.
|
||||
|
||||
float m_nextSquidSoundTime;
|
||||
|
||||
Vector m_vecSaveSpitVelocity;
|
||||
};
|
||||
#endif // NPC_BULLSQUID_H
|
@ -2565,7 +2565,7 @@ void CNPC_Combine::SpeakSentence( int sentenceType )
|
||||
//=========================================================
|
||||
// PainSound
|
||||
//=========================================================
|
||||
void CNPC_Combine::PainSound ( void )
|
||||
void CNPC_Combine::PainSound ( const CTakeDamageInfo &info )
|
||||
{
|
||||
// NOTE: The response system deals with this at the moment
|
||||
if ( GetFlags() & FL_DISSOLVING )
|
||||
|
@ -126,7 +126,7 @@ public:
|
||||
// Sounds
|
||||
// -------------
|
||||
void DeathSound( void );
|
||||
void PainSound( void );
|
||||
void PainSound( const CTakeDamageInfo &info );
|
||||
void IdleSound( void );
|
||||
void AlertSound( void );
|
||||
void LostEnemySound( void );
|
||||
|
@ -764,7 +764,7 @@ int CNPC_Manhack::OnTakeDamage_Alive( const CTakeDamageInfo &info )
|
||||
m_vForceVelocity = vecBestDir * info.GetDamage() * 0.5f;
|
||||
m_flBladeSpeed = 10.0;
|
||||
|
||||
EmitSound( "NPC_Manhack.Bat" );
|
||||
PlayDamagedSound();
|
||||
|
||||
// tdInfo.SetDamage( 1.0 );
|
||||
|
||||
@ -3135,16 +3135,36 @@ void CNPC_Manhack::ShowHostile( bool hostile /*= true*/)
|
||||
//TODO: Open the manhack panels or close them, depending on the state
|
||||
m_bShowingHostile = hostile;
|
||||
|
||||
if ( hostile )
|
||||
PlayAttackSound(hostile);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Play a sound before charging at the player
|
||||
// Input : hostile -
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_Manhack::PlayAttackSound(bool hostile /*= true*/)
|
||||
{
|
||||
if (hostile)
|
||||
{
|
||||
EmitSound( "NPC_Manhack.ChargeAnnounce" );
|
||||
EmitSound("NPC_Manhack.ChargeAnnounce");
|
||||
}
|
||||
else
|
||||
{
|
||||
EmitSound( "NPC_Manhack.ChargeEnd" );
|
||||
EmitSound("NPC_Manhack.ChargeEnd");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Play a sound before charging at the player
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_Manhack::PlayDamagedSound(void)
|
||||
{
|
||||
EmitSound("NPC_Manhack.Bat");
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -102,9 +102,11 @@ public:
|
||||
|
||||
virtual float GetHeadTurnRate( void ) { return 45.0f; } // Degrees per second
|
||||
|
||||
void CheckCollisions(float flInterval);
|
||||
virtual void CheckCollisions(float flInterval);
|
||||
virtual void GatherEnemyConditions( CBaseEntity *pEnemy );
|
||||
void PlayFlySound(void);
|
||||
virtual void PlayFlySound(void);
|
||||
virtual void PlayAttackSound(bool bHostile);
|
||||
virtual void PlayDamagedSound(void);
|
||||
virtual void StopLoopingSounds(void);
|
||||
|
||||
void Precache(void);
|
||||
@ -113,9 +115,9 @@ public:
|
||||
void Activate();
|
||||
void StartTask( const Task_t *pTask );
|
||||
|
||||
void BladesInit();
|
||||
void SoundInit( void );
|
||||
void StartEye( void );
|
||||
virtual void BladesInit();
|
||||
virtual void SoundInit( void );
|
||||
virtual void StartEye( void );
|
||||
|
||||
bool HandleInteraction(int interactionType, void* data, CBaseCombatCharacter* sourceEnt);
|
||||
|
||||
@ -126,7 +128,7 @@ public:
|
||||
|
||||
void SpinBlades(float flInterval);
|
||||
|
||||
void Slice( CBaseEntity *pHitEntity, float flInterval, trace_t &tr );
|
||||
virtual void Slice( CBaseEntity *pHitEntity, float flInterval, trace_t &tr );
|
||||
void Bump( CBaseEntity *pHitEntity, float flInterval, trace_t &tr );
|
||||
void Splash( const Vector &vecSplashPos );
|
||||
|
||||
@ -170,6 +172,7 @@ public:
|
||||
m_iHealth = 0;
|
||||
}
|
||||
|
||||
virtual void SetEyeState(int state);
|
||||
|
||||
DEFINE_CUSTOM_AI;
|
||||
|
||||
@ -184,9 +187,8 @@ private:
|
||||
void StopBurst( bool bInterruptSchedule = false );
|
||||
|
||||
void UpdatePanels( void );
|
||||
void SetEyeState( int state );
|
||||
|
||||
void ShowHostile( bool hostile = true );
|
||||
|
||||
|
||||
bool IsFlyingActivity( Activity baseAct );
|
||||
|
||||
@ -205,6 +207,7 @@ private:
|
||||
// Are we being held by the physcannon?
|
||||
bool IsHeldByPhyscannon( );
|
||||
|
||||
void ShowHostile(bool hostile = true);
|
||||
void StartLoitering( const Vector &vecLoiterPosition );
|
||||
void StopLoitering() { m_vecLoiterPosition = vec3_invalid; m_fTimeNextLoiterPulse = gpGlobals->curtime; }
|
||||
bool IsLoitering() { return m_vecLoiterPosition != vec3_invalid; }
|
||||
|
@ -167,7 +167,7 @@ private:
|
||||
float m_flSuperFastAttackTime;
|
||||
float m_flGrenadePullTime;
|
||||
|
||||
int m_iGrenadeCount;
|
||||
int m_iGrenadeCount = ZOMBINE_MAX_GRENADES;
|
||||
|
||||
EHANDLE m_hGrenade;
|
||||
|
||||
@ -184,7 +184,7 @@ BEGIN_DATADESC( CNPC_Zombine )
|
||||
DEFINE_FIELD( m_flSuperFastAttackTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( m_hGrenade, FIELD_EHANDLE ),
|
||||
DEFINE_FIELD( m_flGrenadePullTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( m_iGrenadeCount, FIELD_INTEGER ),
|
||||
DEFINE_KEYFIELD( m_iGrenadeCount, FIELD_INTEGER, "NumGrenades" ),
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "StartSprint", InputStartSprint ),
|
||||
DEFINE_INPUTFUNC( FIELD_VOID, "PullGrenade", InputPullGrenade ),
|
||||
END_DATADESC()
|
||||
@ -225,8 +225,6 @@ void CNPC_Zombine::Spawn( void )
|
||||
|
||||
g_flZombineGrenadeTimes = gpGlobals->curtime;
|
||||
m_flGrenadePullTime = gpGlobals->curtime;
|
||||
|
||||
m_iGrenadeCount = ZOMBINE_MAX_GRENADES;
|
||||
}
|
||||
|
||||
void CNPC_Zombine::Precache( void )
|
||||
|
632
sp/src/game/server/mod/npc_base_custom.cpp
Normal file
632
sp/src/game/server/mod/npc_base_custom.cpp
Normal file
@ -0,0 +1,632 @@
|
||||
//=//=============================================================================//
|
||||
//
|
||||
// Purpose: A base class from which to extend new custom NPCs.
|
||||
// This class may seem redundant with CAI_BaseNPC and a lot of Valve's NPC classes.
|
||||
// However, the redundancy is necessary for compatibility with a variety of mods;
|
||||
// I want all new NPC content to be isolated from existing classes.
|
||||
//
|
||||
// Author: 1upD
|
||||
//
|
||||
//=============================================================================//
|
||||
#include "cbase.h"
|
||||
#include "npc_base_custom.h"
|
||||
#include "ai_hull.h"
|
||||
#include "soundent.h"
|
||||
#include "game.h"
|
||||
#include "npcevent.h"
|
||||
#include "engine/IEngineSound.h"
|
||||
#include "basehlcombatweapon_shared.h"
|
||||
#include "ai_squadslot.h"
|
||||
#include "ai_squad.h"
|
||||
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Constants
|
||||
//---------------------------------------------------------
|
||||
// TODO: Replace these with fields so that other NPCs can override them
|
||||
const float MIN_TIME_NEXT_SOUND = 0.5f;
|
||||
const float MAX_TIME_NEXT_SOUND = 1.0f;
|
||||
const float MIN_TIME_NEXT_FOUNDENEMY_SOUND = 2.0f;
|
||||
const float MAX_TIME_NEXT_FOUNDENEMY_SOUND = 5.0f;
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Save/Restore
|
||||
//---------------------------------------------------------
|
||||
BEGIN_DATADESC(CNPC_BaseCustomNPC)
|
||||
DEFINE_KEYFIELD(m_iszWeaponModelName, FIELD_STRING, "WeaponModel"),
|
||||
DEFINE_KEYFIELD(m_iHealth, FIELD_INTEGER, "Health"),
|
||||
DEFINE_KEYFIELD(m_iszFearSound, FIELD_SOUNDNAME, "FearSound"),
|
||||
DEFINE_KEYFIELD(m_iszDeathSound, FIELD_SOUNDNAME, "DeathSound"),
|
||||
DEFINE_KEYFIELD(m_iszIdleSound, FIELD_SOUNDNAME, "IdleSound"),
|
||||
DEFINE_KEYFIELD(m_iszPainSound, FIELD_SOUNDNAME, "PainSound"),
|
||||
DEFINE_KEYFIELD(m_iszAlertSound, FIELD_SOUNDNAME, "AlertSound"),
|
||||
DEFINE_KEYFIELD(m_iszLostEnemySound, FIELD_SOUNDNAME, "LostEnemySound"),
|
||||
DEFINE_KEYFIELD(m_iszFoundEnemySound, FIELD_SOUNDNAME, "FoundEnemySound"),
|
||||
DEFINE_KEYFIELD(m_bUseBothSquadSlots, FIELD_BOOLEAN, "UseBothSquadSlots"),
|
||||
DEFINE_KEYFIELD(m_bCannotOpenDoors, FIELD_BOOLEAN, "CannotOpenDoors"),
|
||||
DEFINE_KEYFIELD(m_bCanPickupWeapons, FIELD_BOOLEAN, "CanPickupWeapons"),
|
||||
|
||||
DEFINE_FIELD(m_iNumSquadmates, FIELD_INTEGER),
|
||||
DEFINE_FIELD(m_bWanderToggle, FIELD_BOOLEAN),
|
||||
DEFINE_FIELD(m_flNextSoundTime, FIELD_TIME),
|
||||
DEFINE_FIELD(m_flNextFoundEnemySoundTime, FIELD_TIME),
|
||||
DEFINE_FIELD(m_flSpeedModifier, FIELD_TIME),
|
||||
|
||||
DEFINE_INPUTFUNC(FIELD_FLOAT, "SetSpeedModifier", InputSetSpeedModifier),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "EnableOpenDoors", InputEnableOpenDoors),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "DisableOpenDoors", InputDisableOpenDoors),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "EnablePickupWeapons", InputEnablePickupWeapons),
|
||||
DEFINE_INPUTFUNC(FIELD_VOID, "DisablePickupWeapons", InputDisablePickupWeapons)
|
||||
END_DATADESC()
|
||||
|
||||
AI_BEGIN_CUSTOM_NPC(npc_base_custom, CNPC_BaseCustomNPC)
|
||||
//=========================================================
|
||||
// > Melee_Attack_NoInterrupt
|
||||
//=========================================================
|
||||
DEFINE_SCHEDULE
|
||||
(
|
||||
SCHED_MELEE_ATTACK_NOINTERRUPT,
|
||||
|
||||
" Tasks"
|
||||
" TASK_STOP_MOVING 0"
|
||||
" TASK_FACE_ENEMY 0"
|
||||
" TASK_ANNOUNCE_ATTACK 1" // 1 = primary attack
|
||||
" TASK_MELEE_ATTACK1 0"
|
||||
""
|
||||
" Interrupts"
|
||||
" COND_ENEMY_DEAD"
|
||||
" COND_ENEMY_OCCLUDED"
|
||||
);
|
||||
|
||||
//=========================================================
|
||||
// SCHED_HIDE
|
||||
//=========================================================
|
||||
DEFINE_SCHEDULE
|
||||
(
|
||||
SCHED_HIDE,
|
||||
|
||||
" Tasks"
|
||||
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_COMBAT_FACE"
|
||||
" TASK_STOP_MOVING 0"
|
||||
" TASK_FIND_COVER_FROM_ENEMY 0"
|
||||
" TASK_RUN_PATH 0"
|
||||
" TASK_WAIT_FOR_MOVEMENT 0"
|
||||
" TASK_REMEMBER MEMORY:INCOVER"
|
||||
" TASK_FACE_ENEMY 0"
|
||||
""
|
||||
" Interrupts"
|
||||
" COND_HEAR_DANGER"
|
||||
" COND_NEW_ENEMY"
|
||||
" COND_ENEMY_DEAD"
|
||||
);
|
||||
AI_END_CUSTOM_NPC()
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::Precache( void )
|
||||
{
|
||||
// If no model name is supplied, use the default citizen model
|
||||
if (!GetModelName())
|
||||
{
|
||||
SetModelName(MAKE_STRING("models/monster/subject.mdl")); // TODO replace this with citizen
|
||||
}
|
||||
|
||||
if (&m_iszWeaponModelName && m_iszWeaponModelName != MAKE_STRING("")) {
|
||||
PrecacheModel(STRING(m_iszWeaponModelName));
|
||||
}
|
||||
else {
|
||||
PrecacheModel("models/props_canal/mattpipe.mdl"); // Default weapon model
|
||||
}
|
||||
|
||||
PrecacheModel(STRING(GetModelName()));
|
||||
PrecacheNPCSoundScript(&m_iszFearSound, MAKE_STRING("NPC_BaseCustomr.Fear"));
|
||||
PrecacheNPCSoundScript(&m_iszIdleSound, MAKE_STRING("NPC_BaseCustom.Idle"));
|
||||
PrecacheNPCSoundScript(&m_iszAlertSound, MAKE_STRING("NPC_BaseCustom.Alert"));
|
||||
PrecacheNPCSoundScript(&m_iszPainSound, MAKE_STRING("NPC_BaseCustom.Pain"));
|
||||
PrecacheNPCSoundScript(&m_iszLostEnemySound, MAKE_STRING("NPC_BaseCustom.LostEnemy"));
|
||||
PrecacheNPCSoundScript(&m_iszFoundEnemySound, MAKE_STRING("NPC_BaseCustom.FoundEnemy"));
|
||||
PrecacheNPCSoundScript(&m_iszDeathSound, MAKE_STRING("NPC_BaseCustom.Death"));
|
||||
|
||||
m_bWanderToggle = false;
|
||||
|
||||
BaseClass::Precache();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::Spawn( void )
|
||||
{
|
||||
Precache();
|
||||
|
||||
SetModel(STRING(GetModelName()));
|
||||
SetHullType(HULL_HUMAN);
|
||||
SetHullSizeNormal();
|
||||
|
||||
SetSolid( SOLID_BBOX );
|
||||
AddSolidFlags( FSOLID_NOT_STANDABLE );
|
||||
SetMoveType( MOVETYPE_STEP );
|
||||
SetBloodColor( BLOOD_COLOR_RED );
|
||||
|
||||
// If the health has not been set through Hammer, use a default health value of 75
|
||||
if (m_iHealth < 1)
|
||||
{
|
||||
m_iHealth = 75;
|
||||
}
|
||||
|
||||
m_flFieldOfView = 0.5;
|
||||
m_flNextSoundTime = gpGlobals->curtime;
|
||||
m_flNextFoundEnemySoundTime = gpGlobals->curtime;
|
||||
m_NPCState = NPC_STATE_NONE;
|
||||
m_flSpeedModifier = 1.0f;
|
||||
|
||||
CapabilitiesClear();
|
||||
|
||||
if (!HasSpawnFlags(SF_NPC_START_EFFICIENT))
|
||||
{
|
||||
CapabilitiesAdd(bits_CAP_ANIMATEDFACE | bits_CAP_TURN_HEAD); // The default model has no face animations, but a custom model might
|
||||
CapabilitiesAdd(bits_CAP_SQUAD);
|
||||
CapabilitiesAdd(bits_CAP_USE_WEAPONS | bits_CAP_AIM_GUN | bits_CAP_MOVE_SHOOT);
|
||||
CapabilitiesAdd(bits_CAP_WEAPON_MELEE_ATTACK1 || bits_CAP_WEAPON_MELEE_ATTACK2);
|
||||
CapabilitiesAdd(bits_CAP_DUCK);
|
||||
CapabilitiesAdd(bits_CAP_USE_SHOT_REGULATOR);
|
||||
|
||||
if (!m_bCannotOpenDoors) {
|
||||
CapabilitiesAdd(bits_CAP_DOORS_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
CapabilitiesAdd(bits_CAP_MOVE_GROUND);
|
||||
SetMoveType(MOVETYPE_STEP);
|
||||
|
||||
NPCInit();
|
||||
}
|
||||
|
||||
void CNPC_BaseCustomNPC::Activate()
|
||||
{
|
||||
BaseClass::Activate();
|
||||
FixupWeapon();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: If this NPC has some kind of custom weapon behavior,
|
||||
// set up the weapon after spawn.
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::FixupWeapon()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Choose a schedule after schedule failed
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectFailSchedule(int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode)
|
||||
{
|
||||
switch (failedSchedule)
|
||||
{
|
||||
case SCHED_NEW_WEAPON:
|
||||
// If failed trying to pick up a weapon, try again in one second. This is because other AI code
|
||||
// has put this off for 10 seconds under the assumption that the citizen would be able to
|
||||
// pick up the weapon that they found.
|
||||
m_flNextWeaponSearchTime = gpGlobals->curtime + 1.0f;
|
||||
break;
|
||||
}
|
||||
|
||||
return BaseClass::SelectFailSchedule(failedSchedule, failedTask, taskFailCode);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select a schedule to retrieve better weapons if they are available.
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectScheduleRetrieveItem()
|
||||
{
|
||||
if (m_bCanPickupWeapons && HasCondition(COND_BETTER_WEAPON_AVAILABLE))
|
||||
{
|
||||
CBaseHLCombatWeapon *pWeapon = dynamic_cast<CBaseHLCombatWeapon *>(Weapon_FindUsable(WEAPON_SEARCH_DELTA));
|
||||
if (pWeapon)
|
||||
{
|
||||
m_flNextWeaponSearchTime = gpGlobals->curtime + 10.0;
|
||||
// Now lock the weapon for several seconds while we go to pick it up.
|
||||
pWeapon->Lock(10.0, this);
|
||||
SetTarget(pWeapon);
|
||||
return SCHED_NEW_WEAPON;
|
||||
}
|
||||
}
|
||||
|
||||
return SCHED_NONE;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select ideal state.
|
||||
// Conditions for custom states are defined here.
|
||||
//-----------------------------------------------------------------------------
|
||||
NPC_STATE CNPC_BaseCustomNPC::SelectIdealState(void)
|
||||
{
|
||||
switch ((int)this->m_NPCState) {
|
||||
case NPC_STATE_AMBUSH:
|
||||
return SelectAmbushIdealState();
|
||||
case NPC_STATE_SURRENDER:
|
||||
return SelectSurrenderIdealState();
|
||||
default:
|
||||
return BaseClass::SelectIdealState();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
NPC_STATE CNPC_BaseCustomNPC::SelectAmbushIdealState()
|
||||
{
|
||||
// AMBUSH goes to ALERT upon death of enemy
|
||||
if (GetEnemy() == NULL)
|
||||
{
|
||||
return NPC_STATE_ALERT;
|
||||
}
|
||||
|
||||
// If I am not in a squad, there is no reason to ambush
|
||||
if (!m_pSquad) {
|
||||
return NPC_STATE_COMBAT;
|
||||
}
|
||||
|
||||
// If I am the last in a squad, attack!
|
||||
if (m_pSquad->NumMembers() == 1) {
|
||||
return NPC_STATE_COMBAT;
|
||||
}
|
||||
|
||||
if (OccupyStrategySlotRange(SQUAD_SLOT_CHASE_1, SQUAD_SLOT_CHASE_2)) {
|
||||
return NPC_STATE_COMBAT;
|
||||
}
|
||||
|
||||
// The best ideal state is the current ideal state.
|
||||
return (NPC_STATE)NPC_STATE_AMBUSH;
|
||||
}
|
||||
|
||||
NPC_STATE CNPC_BaseCustomNPC::SelectSurrenderIdealState()
|
||||
{
|
||||
return NPC_STATE_ALERT;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select a schedule to retrieve better weapons if they are available.
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectScheduleWander()
|
||||
{
|
||||
m_bWanderToggle = !m_bWanderToggle;
|
||||
if (m_bWanderToggle) {
|
||||
return SCHED_IDLE_WANDER;
|
||||
}
|
||||
else {
|
||||
return SCHED_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Select a schedule to execute based on conditions.
|
||||
// This is the most critical AI method.
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectSchedule()
|
||||
{
|
||||
switch ((int)m_NPCState)
|
||||
{
|
||||
case NPC_STATE_IDLE:
|
||||
AssertMsgOnce(GetEnemy() == NULL, "NPC has enemy but is not in combat state?");
|
||||
return SelectIdleSchedule();
|
||||
|
||||
case NPC_STATE_ALERT:
|
||||
AssertMsgOnce(GetEnemy() == NULL, "NPC has enemy but is not in combat state?");
|
||||
return SelectAlertSchedule();
|
||||
|
||||
case NPC_STATE_COMBAT:
|
||||
return SelectCombatSchedule();
|
||||
case NPC_STATE_AMBUSH:
|
||||
return SelectAmbushSchedule();
|
||||
case NPC_STATE_SURRENDER:
|
||||
return SelectSurrenderSchedule();
|
||||
default:
|
||||
return BaseClass::SelectSchedule();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Idle schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectIdleSchedule()
|
||||
{
|
||||
int nSched = SelectFlinchSchedule();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
if (HasCondition(COND_HEAR_DANGER) ||
|
||||
HasCondition(COND_HEAR_COMBAT) ||
|
||||
HasCondition(COND_HEAR_WORLD) ||
|
||||
HasCondition(COND_HEAR_BULLET_IMPACT) ||
|
||||
HasCondition(COND_HEAR_PLAYER))
|
||||
{
|
||||
// Investigate sound source
|
||||
return SCHED_ALERT_FACE_BESTSOUND;
|
||||
}
|
||||
|
||||
nSched = SelectScheduleRetrieveItem();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
// no valid route! Wander instead
|
||||
if (GetNavigator()->GetGoalType() == GOALTYPE_NONE) {
|
||||
return SCHED_IDLE_STAND;
|
||||
}
|
||||
|
||||
// valid route. Get moving
|
||||
return SCHED_IDLE_WALK;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Alert schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectAlertSchedule()
|
||||
{
|
||||
// Per default base NPC, check flinch schedule first
|
||||
int nSched = SelectFlinchSchedule();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
// Scan around for new enemies
|
||||
if (HasCondition(COND_ENEMY_DEAD) && SelectWeightedSequence(ACT_VICTORY_DANCE) != ACTIVITY_NOT_AVAILABLE)
|
||||
return SCHED_ALERT_SCAN;
|
||||
|
||||
if (HasCondition(COND_HEAR_DANGER) ||
|
||||
HasCondition(COND_HEAR_PLAYER) ||
|
||||
HasCondition(COND_HEAR_WORLD) ||
|
||||
HasCondition(COND_HEAR_BULLET_IMPACT) ||
|
||||
HasCondition(COND_HEAR_COMBAT))
|
||||
{
|
||||
// Investigate sound source
|
||||
AlertSound();
|
||||
return SCHED_ALERT_FACE_BESTSOUND;
|
||||
}
|
||||
|
||||
nSched = SelectScheduleRetrieveItem();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
// no valid route! Wander instead
|
||||
if (GetNavigator()->GetGoalType() == GOALTYPE_NONE) {
|
||||
return SCHED_ALERT_STAND;
|
||||
}
|
||||
|
||||
// valid route. Get moving
|
||||
return SCHED_ALERT_WALK;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Combat schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectCombatSchedule()
|
||||
{
|
||||
return BaseClass::SelectSchedule(); // Let Base NPC handle it
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Combat schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::SelectAmbushSchedule()
|
||||
{
|
||||
// Check enemy death
|
||||
if (HasCondition(COND_ENEMY_DEAD))
|
||||
{
|
||||
// clear the current (dead) enemy and try to find another.
|
||||
SetEnemy(NULL);
|
||||
|
||||
if (ChooseEnemy())
|
||||
{
|
||||
SetState(NPC_STATE_COMBAT);
|
||||
FoundEnemySound();
|
||||
ClearCondition(COND_ENEMY_DEAD);
|
||||
return SelectSchedule();
|
||||
}
|
||||
|
||||
SetState(NPC_STATE_ALERT);
|
||||
return SelectSchedule();
|
||||
}
|
||||
|
||||
|
||||
CBaseEntity* pEnemy = GetEnemy();
|
||||
if (pEnemy && EnemyDistance(pEnemy) < 128)
|
||||
{
|
||||
SetState(NPC_STATE_COMBAT);
|
||||
return SelectSchedule();
|
||||
}
|
||||
|
||||
if (pEnemy == NULL || HasCondition(COND_LOST_ENEMY)) {
|
||||
SetState(NPC_STATE_ALERT);
|
||||
return SelectSchedule();
|
||||
}
|
||||
|
||||
// If I am the last in a squad, attack!
|
||||
if (m_iNumSquadmates > m_pSquad->NumMembers())
|
||||
SetState(SelectAmbushIdealState());
|
||||
|
||||
if (HasCondition(COND_LIGHT_DAMAGE)) {
|
||||
SetState(NPC_STATE_COMBAT);
|
||||
}
|
||||
|
||||
if (HasCondition(COND_SEE_ENEMY) && HasCondition(COND_ENEMY_FACING_ME) && HasCondition(COND_HAVE_ENEMY_LOS)) {
|
||||
if(GetState() != NPC_STATE_COMBAT)
|
||||
SetState(SelectAmbushIdealState());
|
||||
return SCHED_HIDE;
|
||||
}
|
||||
|
||||
m_iNumSquadmates = m_pSquad->NumMembers();
|
||||
|
||||
return SCHED_COMBAT_FACE;
|
||||
}
|
||||
|
||||
int CNPC_BaseCustomNPC::SelectSurrenderSchedule()
|
||||
{
|
||||
return BaseClass::SelectSchedule();
|
||||
}
|
||||
|
||||
bool CNPC_BaseCustomNPC::HasRangedWeapon()
|
||||
{
|
||||
CBaseCombatWeapon *pWeapon = GetActiveWeapon();
|
||||
|
||||
if (pWeapon)
|
||||
return !(FClassnameIs(pWeapon, "weapon_crowbar") || FClassnameIs(pWeapon, "weapon_stunstick") || FClassnameIs(pWeapon, "weapon_custommelee"));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Override base class activiites
|
||||
//-----------------------------------------------------------------------------
|
||||
Activity CNPC_BaseCustomNPC::NPC_TranslateActivity(Activity activity)
|
||||
{
|
||||
switch (activity) {
|
||||
case ACT_RUN_AIM_SHOTGUN:
|
||||
return ACT_RUN_AIM_RIFLE;
|
||||
case ACT_WALK_AIM_SHOTGUN:
|
||||
return ACT_WALK_AIM_RIFLE;
|
||||
case ACT_IDLE_ANGRY_SHOTGUN:
|
||||
return ACT_IDLE_ANGRY_SMG1;
|
||||
case ACT_RANGE_ATTACK_SHOTGUN_LOW:
|
||||
return ACT_RANGE_ATTACK_SMG1_LOW;
|
||||
case ACT_IDLE_MELEE:
|
||||
case ACT_IDLE_ANGRY_MELEE: // If the NPC has a melee weapon but is in an idle state, don't raise the weapon
|
||||
if (m_NPCState == NPC_STATE_IDLE)
|
||||
return ACT_IDLE_SUITCASE;
|
||||
default:
|
||||
return BaseClass::NPC_TranslateActivity(activity);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Override base class schedules
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_BaseCustomNPC::TranslateSchedule(int scheduleType)
|
||||
{
|
||||
return BaseClass::TranslateSchedule(scheduleType);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Play sound when an enemy is spotted. This sound has a separate
|
||||
// timer from other sounds to prevent looping if the NPC gets caught
|
||||
// in a 'found enemy' condition.
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::FoundEnemySound(void)
|
||||
{
|
||||
if (gpGlobals->curtime > m_flNextFoundEnemySoundTime)
|
||||
{
|
||||
m_flNextFoundEnemySoundTime = gpGlobals->curtime + random->RandomFloat(MIN_TIME_NEXT_FOUNDENEMY_SOUND, MAX_TIME_NEXT_FOUNDENEMY_SOUND);
|
||||
PlaySound(m_iszFoundEnemySound, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Play NPC soundscript
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::PlaySound(string_t soundname, bool required /*= false */)
|
||||
{
|
||||
// TODO: Check if silent
|
||||
if (required || gpGlobals->curtime > m_flNextSoundTime)
|
||||
{
|
||||
m_flNextSoundTime = gpGlobals->curtime + random->RandomFloat(MIN_TIME_NEXT_SOUND, MAX_TIME_NEXT_SOUND);
|
||||
//CPASAttenuationFilter filter2(this, STRING(soundname));
|
||||
EmitSound(STRING(soundname));
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Assign a default soundscript if none is provided, then precache
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::PrecacheNPCSoundScript(string_t * SoundName, string_t defaultSoundName)
|
||||
{
|
||||
if (!SoundName) {
|
||||
*SoundName = defaultSoundName;
|
||||
}
|
||||
PrecacheScriptSound(STRING(*SoundName));
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Get movement speed, multipled by modifier
|
||||
//-----------------------------------------------------------------------------
|
||||
float CNPC_BaseCustomNPC::GetSequenceGroundSpeed(CStudioHdr *pStudioHdr, int iSequence)
|
||||
{
|
||||
float t = SequenceDuration(pStudioHdr, iSequence);
|
||||
|
||||
if (t > 0)
|
||||
{
|
||||
return (GetSequenceMoveDist(pStudioHdr, iSequence) * m_flSpeedModifier / t);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to change the speed of the NPC
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::InputSetSpeedModifier(inputdata_t &inputdata)
|
||||
{
|
||||
this->m_flSpeedModifier = inputdata.value.Float();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable opening doors
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::InputEnableOpenDoors(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCannotOpenDoors = false;
|
||||
if (!HasSpawnFlags(SF_NPC_START_EFFICIENT))
|
||||
{
|
||||
CapabilitiesAdd(bits_CAP_DOORS_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable opening doors
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::InputDisableOpenDoors(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCannotOpenDoors = true;
|
||||
if (!HasSpawnFlags(SF_NPC_START_EFFICIENT))
|
||||
{
|
||||
CapabilitiesRemove(bits_CAP_DOORS_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable weapon pickup behavior
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::InputEnablePickupWeapons(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCanPickupWeapons = true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Hammer input to enable weapon pickup behavior
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_BaseCustomNPC::InputDisablePickupWeapons(inputdata_t &inputdata)
|
||||
{
|
||||
m_bCanPickupWeapons = false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
// Output :
|
||||
//-----------------------------------------------------------------------------
|
||||
Class_T CNPC_BaseCustomNPC::Classify( void )
|
||||
{
|
||||
return CLASS_NONE;
|
||||
}
|
133
sp/src/game/server/mod/npc_base_custom.h
Normal file
133
sp/src/game/server/mod/npc_base_custom.h
Normal file
@ -0,0 +1,133 @@
|
||||
//=//=============================================================================//
|
||||
//
|
||||
// Purpose: A base class from which to extend new custom NPCs.
|
||||
// This class may seem redundant with CAI_BaseNPC and a lot of Valve's NPC classes.
|
||||
// However, the redundancy is necessary for compatibility with a variety of mods;
|
||||
// I want all new NPC content to be isolated from existing classes.
|
||||
//
|
||||
// Author: 1upD
|
||||
//
|
||||
//=============================================================================//
|
||||
#include "cbase.h"
|
||||
#include "ai_default.h"
|
||||
#include "ai_task.h"
|
||||
#include "ai_schedule.h"
|
||||
#include "entitylist.h"
|
||||
#include "activitylist.h"
|
||||
#include "ai_basenpc.h"
|
||||
#include "ai_blended_movement.h"
|
||||
#include "ai_behavior_actbusy.h"
|
||||
|
||||
//=========================================================
|
||||
// schedules
|
||||
//=========================================================
|
||||
enum
|
||||
{
|
||||
SCHED_MELEE_ATTACK_NOINTERRUPT = LAST_SHARED_SCHEDULE,
|
||||
SCHED_HIDE,
|
||||
|
||||
LAST_BASE_CUSTOM_SCHED
|
||||
};
|
||||
|
||||
//=========================================================
|
||||
// states
|
||||
//=========================================================
|
||||
enum
|
||||
{
|
||||
NPC_STATE_FIRST = NPC_STATE_DEAD,
|
||||
NPC_STATE_AMBUSH,
|
||||
NPC_STATE_SURRENDER,
|
||||
NPC_STATE_LAST_CUSTOM
|
||||
};
|
||||
|
||||
// -----------------------------------------------
|
||||
// Squad slots
|
||||
// -----------------------------------------------
|
||||
enum
|
||||
{
|
||||
LAST_SQUADSLOT = 100, // Custom NPCs might share a squad with any NPC, so let's just be safe and skip to a high number
|
||||
SQUAD_SLOT_CHASE_1,
|
||||
SQUAD_SLOT_CHASE_2,
|
||||
LAST_CUSTOM_SQUADSLOT
|
||||
};
|
||||
|
||||
//=========================================================
|
||||
//=========================================================
|
||||
typedef CAI_BlendingHost< CAI_BehaviorHost<CAI_BaseNPC> > CAI_CustomNPCBase;
|
||||
|
||||
class CNPC_BaseCustomNPC : public CAI_CustomNPCBase
|
||||
{
|
||||
DECLARE_CLASS(CNPC_BaseCustomNPC, CAI_CustomNPCBase);
|
||||
|
||||
public:
|
||||
void Precache(void);
|
||||
void Spawn(void);
|
||||
Class_T Classify(void);
|
||||
virtual int SelectFailSchedule(int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode);
|
||||
virtual int SelectScheduleRetrieveItem();
|
||||
virtual int SelectScheduleWander();
|
||||
virtual int SelectSchedule();
|
||||
virtual int SelectIdleSchedule();
|
||||
virtual int SelectAlertSchedule();
|
||||
virtual int SelectCombatSchedule();
|
||||
virtual int SelectAmbushSchedule();
|
||||
virtual int SelectSurrenderSchedule();
|
||||
virtual float GetSequenceGroundSpeed(CStudioHdr *pStudioHdr, int iSequence);
|
||||
virtual Activity NPC_TranslateActivity(Activity eNewActivity);
|
||||
virtual int TranslateSchedule(int scheduleType);
|
||||
|
||||
// Custom states
|
||||
virtual NPC_STATE SelectIdealState(void);
|
||||
NPC_STATE SelectAmbushIdealState();
|
||||
NPC_STATE SelectSurrenderIdealState();
|
||||
|
||||
// Sounds
|
||||
virtual void PlaySound(string_t soundname, bool optional);
|
||||
virtual void DeathSound(const CTakeDamageInfo &info) { PlaySound(m_iszDeathSound, true); }
|
||||
virtual void AlertSound(void) { PlaySound(m_iszAlertSound, false); };
|
||||
virtual void IdleSound(void) { PlaySound(m_iszIdleSound, false); };
|
||||
virtual void PainSound(const CTakeDamageInfo &info) { PlaySound(m_iszPainSound, true); };
|
||||
virtual void FearSound(void) { PlaySound(m_iszFearSound, false); };
|
||||
virtual void LostEnemySound(void) { PlaySound(m_iszLostEnemySound, false); };
|
||||
virtual void FoundEnemySound(void);
|
||||
|
||||
void Activate();
|
||||
virtual void FixupWeapon();
|
||||
|
||||
// Inputs
|
||||
virtual void InputSetSpeedModifier(inputdata_t &inputdata);
|
||||
virtual void InputEnableOpenDoors(inputdata_t &inputdata);
|
||||
virtual void InputDisableOpenDoors(inputdata_t &inputdata);
|
||||
virtual void InputEnablePickupWeapons(inputdata_t &inputdata);
|
||||
virtual void InputDisablePickupWeapons(inputdata_t &inputdata);
|
||||
|
||||
DECLARE_DATADESC();
|
||||
|
||||
string_t m_iszWeaponModelName; // Path/filename of model to override weapon model.
|
||||
|
||||
string_t m_iszFearSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszDeathSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszIdleSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszPainSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszAlertSound; // Path/filename of WAV file to play.
|
||||
string_t m_iszLostEnemySound; // Path/filename of WAV file to play.
|
||||
string_t m_iszFoundEnemySound; // Path/filename of WAV file to play.
|
||||
|
||||
DEFINE_CUSTOM_AI;
|
||||
|
||||
protected:
|
||||
bool HasRangedWeapon();
|
||||
void PrecacheNPCSoundScript(string_t* SoundName, string_t defaultSoundName);
|
||||
|
||||
int m_iNumSquadmates;
|
||||
bool m_bUseBothSquadSlots; // If true use two squad slots, if false use one squad slot
|
||||
bool m_bCannotOpenDoors; // If true, this NPC cannot open doors. The condition is reversed because originally it could.
|
||||
bool m_bCanPickupWeapons; // If true, this NPC is able to pick up weapons off of the ground just like npc_citizen.
|
||||
bool m_bWanderToggle; // Boolean to toggle wandering / standing every think cycle
|
||||
float m_flNextSoundTime; // Next time at which this NPC is allowed to play an NPC sound
|
||||
float m_flNextFoundEnemySoundTime; // Next time at which this NPC is allowed to play an NPC sound
|
||||
float m_flSpeedModifier; // Modifier to apply to move distance
|
||||
};
|
||||
|
||||
|
||||
LINK_ENTITY_TO_CLASS(npc_base_custom, CNPC_BaseCustomNPC);
|
537
sp/src/game/server/mod/npc_lost_soul.cpp
Normal file
537
sp/src/game/server/mod/npc_lost_soul.cpp
Normal file
@ -0,0 +1,537 @@
|
||||
//=//=============================================================================//
|
||||
//
|
||||
// Purpose: A frightening flying creature with the appearance of a burning skull.
|
||||
// May be familiar to first person shooter fans.
|
||||
//
|
||||
// npc_lost_soul is a modified version of a manhack inspired by Mallikas'
|
||||
// HalloweenVilleFour entry, Satanophobia, as well as Doom.
|
||||
//
|
||||
// Author: 1upD
|
||||
//
|
||||
//=============================================================================//
|
||||
#include "cbase.h"
|
||||
#include "soundenvelope.h"
|
||||
#include "npc_manhack.h"
|
||||
#include "ai_default.h"
|
||||
#include "ai_node.h"
|
||||
#include "ai_navigator.h"
|
||||
#include "ai_pathfinder.h"
|
||||
#include "ai_moveprobe.h"
|
||||
#include "ai_memory.h"
|
||||
#include "ai_squad.h"
|
||||
#include "ai_route.h"
|
||||
#include "explode.h"
|
||||
#include "basegrenade_shared.h"
|
||||
#include "ndebugoverlay.h"
|
||||
#include "decals.h"
|
||||
#include "gib.h"
|
||||
#include "game.h"
|
||||
#include "ai_interactions.h"
|
||||
#include "IEffects.h"
|
||||
#include "vstdlib/random.h"
|
||||
#include "engine/IEngineSound.h"
|
||||
#include "movevars_shared.h"
|
||||
#include "npcevent.h"
|
||||
#include "props.h"
|
||||
#include "te_effect_dispatch.h"
|
||||
#include "ai_squadslot.h"
|
||||
#include "world.h"
|
||||
#include "smoke_trail.h"
|
||||
#include "func_break.h"
|
||||
#include "physics_impact_damage.h"
|
||||
#include "weapon_physcannon.h"
|
||||
#include "physics_prop_ragdoll.h"
|
||||
#include "soundent.h"
|
||||
#include "ammodef.h"
|
||||
#include "EntityFlame.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
ConVar sk_lostsoul_health("sk_lostsoul_health", "0");
|
||||
ConVar sk_lostsoul_melee_dmg("sk_lostsoul_melee_dmg", "0");
|
||||
|
||||
#define MANHACK_NOISEMOD_HIDE 5000
|
||||
//=========================================================
|
||||
//=========================================================
|
||||
class CNPC_LostSoul : public CNPC_Manhack
|
||||
{
|
||||
DECLARE_CLASS( CNPC_LostSoul, CNPC_Manhack);
|
||||
|
||||
public:
|
||||
void Precache( void );
|
||||
void Spawn( void );
|
||||
Class_T Classify( void );
|
||||
|
||||
virtual void DeathSound(const CTakeDamageInfo &info);
|
||||
virtual bool ShouldGib(const CTakeDamageInfo &info);
|
||||
|
||||
void BladesInit();
|
||||
void SoundInit(void);
|
||||
void PlayFlySound(void);
|
||||
void StartEye(void);
|
||||
|
||||
|
||||
void CheckCollisions(float flInterval);
|
||||
|
||||
void Slice(CBaseEntity *pHitEntity, float flInterval, trace_t &tr);
|
||||
|
||||
virtual int OnTakeDamage_Alive(const CTakeDamageInfo &info);
|
||||
|
||||
void Ignite(float flFlameLifetime, bool bNPCOnly, float flSize, bool bCalledByLevelDesigner) { return; }
|
||||
|
||||
// INPCInteractive Functions
|
||||
virtual bool CanInteractWith(CAI_BaseNPC *pUser) { return false; } // Disabled for now (sjb)
|
||||
virtual bool HasBeenInteractedWith() { return false; }
|
||||
virtual void NotifyInteraction(CAI_BaseNPC *pUser){}
|
||||
|
||||
virtual void InputPowerdown(inputdata_t &inputdata)
|
||||
{
|
||||
m_iHealth = 0;
|
||||
}
|
||||
|
||||
void MoveToTarget(float flInterval, const Vector &MoveTarget);
|
||||
|
||||
void PlayAttackSound(bool hostile = true);
|
||||
void PlayDamagedSound(void);
|
||||
void SetEyeState(int state);
|
||||
|
||||
DECLARE_DATADESC();
|
||||
|
||||
|
||||
DEFINE_CUSTOM_AI;
|
||||
private:
|
||||
float m_flNextEngineSoundTime;
|
||||
};
|
||||
|
||||
|
||||
LINK_ENTITY_TO_CLASS( npc_lost_soul, CNPC_LostSoul );
|
||||
IMPLEMENT_CUSTOM_AI( npc_manhack,CNPC_LostSoul );
|
||||
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Save/Restore
|
||||
//---------------------------------------------------------
|
||||
BEGIN_DATADESC( CNPC_LostSoul )
|
||||
DEFINE_KEYFIELD(m_iHealth, FIELD_INTEGER, "Health"),
|
||||
|
||||
DEFINE_FIELD(m_flNextEngineSoundTime, FIELD_TIME)
|
||||
END_DATADESC()
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Initialize the custom schedules
|
||||
// Input :
|
||||
// Output :
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::InitCustomSchedules(void)
|
||||
{
|
||||
INIT_CUSTOM_AI(CNPC_LostSoul);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::Precache( void )
|
||||
{
|
||||
PrecacheModel( "models/skeleton/skeleton_torso3.mdl" ); // Replace this with setting from Hammer
|
||||
|
||||
PrecacheScriptSound("NPC_LostSoul.Die");
|
||||
PrecacheScriptSound("NPC_LostSoul.Burn");
|
||||
PrecacheScriptSound("NPC_LostSoul.Float");
|
||||
PrecacheScriptSound("NPC_LostSoul.ChargeAnnounce");
|
||||
PrecacheScriptSound("NPC_LostSoul.ChargeEnd");
|
||||
PrecacheScriptSound("NPC_LostSoul.Stunned");
|
||||
PrecacheScriptSound("NPC_LostSoul.Bat");
|
||||
|
||||
BaseClass::Precache();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::Spawn( void )
|
||||
{
|
||||
BaseClass::Spawn();
|
||||
|
||||
Precache();
|
||||
|
||||
SetModel("models/skeleton/skeleton_torso3.mdl");
|
||||
SetHullType(HULL_TINY_CENTERED); // There was an error being thrown about collision model being smaller than nav hull - need to look into
|
||||
SetHullSizeNormal();
|
||||
|
||||
SetSolid(SOLID_BBOX);
|
||||
AddSolidFlags(FSOLID_NOT_STANDABLE);
|
||||
|
||||
if (HasSpawnFlags(SF_MANHACK_CARRIED))
|
||||
{
|
||||
AddSolidFlags(FSOLID_NOT_SOLID);
|
||||
SetMoveType(MOVETYPE_NONE);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetMoveType(MOVETYPE_VPHYSICS);
|
||||
}
|
||||
|
||||
// Use the convar if health is less than 1
|
||||
if (m_iHealth < 1)
|
||||
{
|
||||
m_iHealth = sk_lostsoul_health.GetFloat();
|
||||
}
|
||||
|
||||
SetViewOffset(Vector(0, 0, 10)); // Position of the eyes relative to NPC's origin.
|
||||
m_flFieldOfView = VIEW_FIELD_FULL;
|
||||
m_NPCState = NPC_STATE_NONE;
|
||||
|
||||
if (m_spawnflags & SF_MANHACK_USE_AIR_NODES)
|
||||
{
|
||||
SetNavType(NAV_FLY);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetNavType(NAV_GROUND);
|
||||
}
|
||||
|
||||
AddEFlags(EFL_NO_DISSOLVE | EFL_NO_MEGAPHYSCANNON_RAGDOLL);
|
||||
AddEffects(EF_NOSHADOW);
|
||||
|
||||
SetBloodColor(BLOOD_COLOR_RED);
|
||||
SetCurrentVelocity(vec3_origin);
|
||||
|
||||
CapabilitiesAdd(bits_CAP_INNATE_MELEE_ATTACK1 | bits_CAP_MOVE_FLY | bits_CAP_SQUAD);
|
||||
|
||||
// Set the noise mod to huge numbers right now, in case this manhack starts out waiting for a script
|
||||
// for instance, we don't want him to bob whilst he's waiting for a script. This allows designers
|
||||
// to 'hide' manhacks in small places. (sjb)
|
||||
SetNoiseMod(MANHACK_NOISEMOD_HIDE, MANHACK_NOISEMOD_HIDE, MANHACK_NOISEMOD_HIDE);
|
||||
|
||||
m_fHeadYaw = 0;
|
||||
|
||||
NPCInit();
|
||||
|
||||
// Manhacks are designed to slam into things, so don't take much damage from it!
|
||||
SetImpactEnergyScale(0.001);
|
||||
|
||||
// Manhacks get 30 seconds worth of free knowledge.
|
||||
GetEnemies()->SetFreeKnowledgeDuration(30.0);
|
||||
|
||||
// don't be an NPC, we want to collide with debris stuff
|
||||
SetCollisionGroup(COLLISION_GROUP_NONE);
|
||||
|
||||
CEntityFlame *pFlame = CEntityFlame::Create(this);
|
||||
if (pFlame)
|
||||
{
|
||||
pFlame->SetLifetime(HUGE_VAL);
|
||||
SetEffectEntity(pFlame);
|
||||
pFlame->SetSize(8);
|
||||
pFlame->SetDamage(0.0f);
|
||||
}
|
||||
|
||||
m_flNextEngineSoundTime = gpGlobals->curtime;
|
||||
}
|
||||
|
||||
int CNPC_LostSoul::OnTakeDamage_Alive(const CTakeDamageInfo &info)
|
||||
{
|
||||
// Don't take burning damage!
|
||||
if (info.GetDamageType() & 8) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return BaseClass::OnTakeDamage_Alive(info);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::DeathSound(const CTakeDamageInfo &info)
|
||||
{
|
||||
CPASAttenuationFilter filter2(this, "NPC_LostSoul.Die");
|
||||
EmitSound(filter2, entindex(), "NPC_LostSoul.Die");
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
// Output : Returns true on success, false on failure.
|
||||
//-----------------------------------------------------------------------------
|
||||
bool CNPC_LostSoul::ShouldGib(const CTakeDamageInfo &info)
|
||||
{
|
||||
// TODO: Add gibs to lost soul
|
||||
return false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Overloads Manhack method. Lost Souls have no blades
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::BladesInit()
|
||||
{
|
||||
SetActivity(ACT_FLY);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Overloads manhack engine sound.
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::SoundInit(void)
|
||||
{
|
||||
// Just don't even worry about it.
|
||||
}
|
||||
|
||||
void CNPC_LostSoul::PlayFlySound(void)
|
||||
{
|
||||
float flEnemyDist;
|
||||
|
||||
if (GetEnemy())
|
||||
{
|
||||
flEnemyDist = (GetAbsOrigin() - GetEnemy()->GetAbsOrigin()).Length();
|
||||
}
|
||||
else
|
||||
{
|
||||
flEnemyDist = FLT_MAX;
|
||||
}
|
||||
|
||||
// Play special engine every once in a while
|
||||
if (gpGlobals->curtime > m_flNextEngineSoundTime && flEnemyDist < 48)
|
||||
{
|
||||
m_flNextEngineSoundTime = gpGlobals->curtime + random->RandomFloat(0.5, 2.0);
|
||||
|
||||
EmitSound("NPC_LostSoul.Float");
|
||||
}
|
||||
}
|
||||
|
||||
void CNPC_LostSoul::StartEye(void)
|
||||
{
|
||||
// No eyes
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: We've touched something that we can hurt. Slice it!
|
||||
// Input :
|
||||
// Output :
|
||||
//-----------------------------------------------------------------------------
|
||||
#define MANHACK_SMASH_TIME 0.35 // How long after being thrown from a physcannon that a manhack is eligible to die from impact
|
||||
void CNPC_LostSoul::Slice(CBaseEntity *pHitEntity, float flInterval, trace_t &tr)
|
||||
{
|
||||
// Don't hurt the player if I'm in water
|
||||
if (GetWaterLevel() > 0 && pHitEntity->IsPlayer())
|
||||
return;
|
||||
|
||||
if (pHitEntity->m_takedamage == DAMAGE_NO)
|
||||
return;
|
||||
|
||||
// Damage must be scaled by flInterval so framerate independent
|
||||
float flDamage = sk_lostsoul_melee_dmg.GetFloat() * flInterval;
|
||||
|
||||
if (pHitEntity->IsPlayer())
|
||||
{
|
||||
flDamage *= 1.0f;
|
||||
}
|
||||
|
||||
if (dynamic_cast<CBreakableProp*>(pHitEntity)) {
|
||||
dynamic_cast<CBreakableProp*>(pHitEntity)->Ignite(10.0f, false);
|
||||
}
|
||||
|
||||
else if (pHitEntity->IsNPC())
|
||||
{
|
||||
dynamic_cast<CAI_BaseNPC*>(pHitEntity)->Ignite(2.0f);
|
||||
}
|
||||
|
||||
if (flDamage < 1.0f)
|
||||
{
|
||||
flDamage = 1.0f;
|
||||
}
|
||||
|
||||
CTakeDamageInfo info(this, this, flDamage, DMG_SLASH);
|
||||
|
||||
// check for actual "ownership" of damage
|
||||
CBasePlayer *pPlayer = HasPhysicsAttacker(MANHACK_SMASH_TIME);
|
||||
if (pPlayer)
|
||||
{
|
||||
info.SetAttacker(pPlayer);
|
||||
}
|
||||
|
||||
Vector dir = (tr.endpos - tr.startpos);
|
||||
if (dir == vec3_origin)
|
||||
{
|
||||
dir = tr.m_pEnt->GetAbsOrigin() - GetAbsOrigin();
|
||||
}
|
||||
CalculateMeleeDamageForce(&info, dir, tr.endpos);
|
||||
pHitEntity->TakeDamage(info);
|
||||
|
||||
// Play burning sound
|
||||
EmitSound("NPC_LostSoul.Burn");
|
||||
|
||||
// Pop back a little bit after hitting the player
|
||||
// ComputeSliceBounceVelocity(pHitEntity, tr);
|
||||
|
||||
// Save off when we last hit something
|
||||
m_flLastDamageTime = gpGlobals->curtime;
|
||||
|
||||
// Reset our state and give the player time to react
|
||||
// StopBurst(true);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
// Input :
|
||||
// Output :
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::MoveToTarget(float flInterval, const Vector &vMoveTarget)
|
||||
{
|
||||
if (flInterval <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// -----------------------------------------
|
||||
// Don't steer if engine's have stalled
|
||||
// -----------------------------------------
|
||||
if (m_iHealth <= 0)
|
||||
return;
|
||||
|
||||
if (GetEnemy() != NULL)
|
||||
{
|
||||
TurnHeadToTarget(flInterval, GetEnemy()->EyePosition());
|
||||
}
|
||||
else
|
||||
{
|
||||
TurnHeadToTarget(flInterval, vMoveTarget);
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Move towards our target
|
||||
// -------------------------------------
|
||||
float myAccel;
|
||||
float myZAccel = 300.0f;
|
||||
float myDecay = 0.3f;
|
||||
|
||||
Vector targetDir;
|
||||
float flDist;
|
||||
|
||||
|
||||
Vector vecCurrentDir = GetCurrentVelocity();
|
||||
VectorNormalize(vecCurrentDir);
|
||||
|
||||
targetDir = vMoveTarget - GetAbsOrigin();
|
||||
flDist = VectorNormalize(targetDir);
|
||||
|
||||
float flDot = DotProduct(targetDir, vecCurrentDir);
|
||||
|
||||
// Otherwise we should steer towards our goal
|
||||
if (flDot > 0.25)
|
||||
{
|
||||
// If my target is in front of me, my flight model is a bit more accurate.
|
||||
myAccel = 300;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Have a harder time correcting my course if I'm currently flying away from my target.
|
||||
myAccel = 200;
|
||||
}
|
||||
|
||||
// Clamp lateral acceleration
|
||||
if (myAccel > (flDist / flInterval))
|
||||
{
|
||||
myAccel = flDist / flInterval;
|
||||
}
|
||||
|
||||
// Clamp vertical movement
|
||||
if (myZAccel > flDist / flInterval)
|
||||
{
|
||||
myZAccel = flDist / flInterval;
|
||||
}
|
||||
|
||||
MoveInDirection(flInterval, targetDir, myAccel, myZAccel, myDecay);
|
||||
|
||||
// calc relative banking targets
|
||||
Vector forward, right;
|
||||
GetVectors(&forward, &right, NULL);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
// Input :
|
||||
// Output :
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::CheckCollisions(float flInterval)
|
||||
{
|
||||
// Trace forward to see if I hit anything. But trace forward along the
|
||||
// owner's view direction if you're being carried.
|
||||
Vector vecTraceDir, vecCheckPos;
|
||||
VPhysicsGetObject()->GetVelocity(&vecTraceDir, NULL);
|
||||
vecTraceDir *= flInterval;
|
||||
|
||||
VectorAdd(GetAbsOrigin(), vecTraceDir, vecCheckPos);
|
||||
|
||||
trace_t tr;
|
||||
CBaseEntity* pHitEntity = NULL;
|
||||
|
||||
AI_TraceHull(GetAbsOrigin(),
|
||||
vecCheckPos,
|
||||
GetHullMins(),
|
||||
GetHullMaxs(),
|
||||
MoveCollisionMask(),
|
||||
this,
|
||||
COLLISION_GROUP_NONE,
|
||||
&tr);
|
||||
|
||||
if ((tr.fraction != 1.0 || tr.startsolid) && tr.m_pEnt)
|
||||
{
|
||||
PhysicsMarkEntitiesAsTouching(tr.m_pEnt, tr);
|
||||
pHitEntity = tr.m_pEnt;
|
||||
|
||||
if (pHitEntity != NULL &&
|
||||
pHitEntity->m_takedamage == DAMAGE_YES &&
|
||||
pHitEntity->Classify() != CLASS_MANHACK)
|
||||
{
|
||||
// Slice this thing
|
||||
Slice(pHitEntity, flInterval, tr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
// Input : hostile -
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::PlayAttackSound(bool hostile /*= true*/)
|
||||
{
|
||||
if (hostile)
|
||||
{
|
||||
EmitSound("NPC_LostSoul.ChargeAnnounce");
|
||||
}
|
||||
else
|
||||
{
|
||||
EmitSound("NPC_LostSoul.ChargeEnd");
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::PlayDamagedSound(void)
|
||||
{
|
||||
EmitSound("NPC_LostSoul.Bat");
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
// Input : state -
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_LostSoul::SetEyeState(int state)
|
||||
{
|
||||
// Do nothing for now
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
// Output :
|
||||
//-----------------------------------------------------------------------------
|
||||
Class_T CNPC_LostSoul::Classify( void )
|
||||
{
|
||||
return CLASS_HEADCRAB;
|
||||
}
|
430
sp/src/game/server/mod/npc_shadow_walker.cpp
Normal file
430
sp/src/game/server/mod/npc_shadow_walker.cpp
Normal file
@ -0,0 +1,430 @@
|
||||
//=//=============================================================================//
|
||||
//
|
||||
// Purpose: A malevolent being from a parallel universe which at one point
|
||||
// may have been human.
|
||||
//
|
||||
// npc_shadow_walker is designed to be reusable as a generic horror
|
||||
// game style npc. Its model and sound files may be configured through
|
||||
// the hammer editor using keyfields.
|
||||
//
|
||||
// Author: 1upD
|
||||
//
|
||||
//=============================================================================//
|
||||
#include "cbase.h"
|
||||
#include "npc_shadow_walker.h"
|
||||
#include "ai_hull.h"
|
||||
#include "game.h"
|
||||
#include "npcevent.h"
|
||||
#include "basehlcombatweapon_shared.h"
|
||||
#include "ai_squadslot.h"
|
||||
#include "weapon_custom_melee.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Save/Restore
|
||||
//---------------------------------------------------------
|
||||
BEGIN_DATADESC(CNPC_ShadowWalker)
|
||||
/// Custom fields go here
|
||||
END_DATADESC()
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Custom AI
|
||||
//---------------------------------------------------------
|
||||
AI_BEGIN_CUSTOM_NPC(npc_shadow_walker, CNPC_ShadowWalker)
|
||||
// Custom schedules go here
|
||||
AI_END_CUSTOM_NPC()
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::Precache( void )
|
||||
{
|
||||
// If no model name is supplied, use the default Shadow Walker model
|
||||
if (!GetModelName())
|
||||
{
|
||||
SetModelName(MAKE_STRING("models/monster/subject.mdl"));
|
||||
}
|
||||
|
||||
if (&m_iszWeaponModelName && m_iszWeaponModelName != MAKE_STRING("")) {
|
||||
PrecacheModel(STRING(m_iszWeaponModelName));
|
||||
}
|
||||
else {
|
||||
PrecacheModel("models/props_canal/mattpipe.mdl");
|
||||
}
|
||||
|
||||
PrecacheModel(STRING(GetModelName()));
|
||||
PrecacheNPCSoundScript(&m_iszFearSound, MAKE_STRING("NPC_ShadowWalker.Fear"));
|
||||
PrecacheNPCSoundScript(&m_iszIdleSound, MAKE_STRING("NPC_ShadowWalker.Idle"));
|
||||
PrecacheNPCSoundScript(&m_iszAlertSound, MAKE_STRING("NPC_ShadowWalker.Alert"));
|
||||
PrecacheNPCSoundScript(&m_iszPainSound, MAKE_STRING("NPC_ShadowWalker.Pain"));
|
||||
PrecacheNPCSoundScript(&m_iszLostEnemySound, MAKE_STRING("NPC_ShadowWalker.LostEnemy"));
|
||||
PrecacheNPCSoundScript(&m_iszFoundEnemySound, MAKE_STRING("NPC_ShadowWalker.FoundEnemy"));
|
||||
PrecacheNPCSoundScript(&m_iszDeathSound, MAKE_STRING("NPC_ShadowWalker.Death"));
|
||||
|
||||
m_bWanderToggle = false;
|
||||
|
||||
BaseClass::Precache();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::Spawn( void )
|
||||
{
|
||||
Precache();
|
||||
|
||||
SetModel(STRING(GetModelName()));
|
||||
SetHullType(HULL_HUMAN);
|
||||
SetHullSizeNormal();
|
||||
|
||||
SetSolid( SOLID_BBOX );
|
||||
AddSolidFlags( FSOLID_NOT_STANDABLE );
|
||||
SetMoveType( MOVETYPE_STEP );
|
||||
SetBloodColor( BLOOD_COLOR_RED );
|
||||
|
||||
// If the health has not been set through Hammer, use a default health value of 75
|
||||
if (m_iHealth < 1)
|
||||
{
|
||||
m_iHealth = 75;
|
||||
}
|
||||
|
||||
m_flFieldOfView = 0.5;
|
||||
m_flNextSoundTime = gpGlobals->curtime;
|
||||
m_flNextFoundEnemySoundTime = gpGlobals->curtime;
|
||||
m_NPCState = NPC_STATE_NONE;
|
||||
m_flSpeedModifier = 1.0f;
|
||||
|
||||
CapabilitiesClear();
|
||||
|
||||
if (!HasSpawnFlags(SF_NPC_START_EFFICIENT))
|
||||
{
|
||||
CapabilitiesAdd(bits_CAP_ANIMATEDFACE | bits_CAP_TURN_HEAD); // The default model has no face animations, but a custom model might
|
||||
CapabilitiesAdd(bits_CAP_SQUAD);
|
||||
CapabilitiesAdd(bits_CAP_USE_WEAPONS | bits_CAP_AIM_GUN | bits_CAP_MOVE_SHOOT);
|
||||
CapabilitiesAdd(bits_CAP_WEAPON_MELEE_ATTACK1 || bits_CAP_WEAPON_MELEE_ATTACK2);
|
||||
CapabilitiesAdd(bits_CAP_DUCK);
|
||||
CapabilitiesAdd(bits_CAP_USE_SHOT_REGULATOR);
|
||||
|
||||
if (!m_bCannotOpenDoors) {
|
||||
CapabilitiesAdd(bits_CAP_DOORS_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
CapabilitiesAdd(bits_CAP_MOVE_GROUND);
|
||||
SetMoveType(MOVETYPE_STEP);
|
||||
|
||||
NPCInit();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
void CNPC_ShadowWalker::FixupWeapon()
|
||||
{
|
||||
// If no weapons supplied, give a crowbar
|
||||
CBaseCombatWeapon *pWeapon = GetActiveWeapon();
|
||||
if (pWeapon == NULL) {
|
||||
CWeaponCustomMelee *pMeleeWeapon = (CWeaponCustomMelee*)CreateEntityByName("weapon_custommelee");
|
||||
|
||||
// Apply weapon model override
|
||||
if (&m_iszWeaponModelName && m_iszWeaponModelName != MAKE_STRING("")) {
|
||||
pMeleeWeapon->m_iszWeaponModelName = this->m_iszWeaponModelName;
|
||||
}
|
||||
// Default custom weapon model
|
||||
else {
|
||||
pMeleeWeapon->m_iszWeaponModelName = MAKE_STRING("models/props_canal/mattpipe.mdl");
|
||||
}
|
||||
|
||||
pWeapon = (CBaseCombatWeapon *)pMeleeWeapon;
|
||||
|
||||
DispatchSpawn(pWeapon);
|
||||
Weapon_Equip(pWeapon);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CNPC_ShadowWalker::Activate()
|
||||
{
|
||||
BaseClass::Activate();
|
||||
FixupWeapon();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Choose a schedule after schedule failed
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_ShadowWalker::SelectFailSchedule(int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode)
|
||||
{
|
||||
switch (failedSchedule)
|
||||
{
|
||||
case SCHED_NEW_WEAPON:
|
||||
// If failed trying to pick up a weapon, try again in one second. This is because other AI code
|
||||
// has put this off for 10 seconds under the assumption that the citizen would be able to
|
||||
// pick up the weapon that they found.
|
||||
m_flNextWeaponSearchTime = gpGlobals->curtime + 1.0f;
|
||||
break;
|
||||
case SCHED_TAKE_COVER_FROM_ENEMY:
|
||||
// I can't take cover, so I need to run away!
|
||||
return SCHED_RUN_FROM_ENEMY;
|
||||
case SCHED_CHASE_ENEMY:
|
||||
// I can't run towards the enemy, so I will just run randomly!
|
||||
return SCHED_CHASE_ENEMY_FAILED;
|
||||
case SCHED_RUN_FROM_ENEMY:
|
||||
// I can't run away, so I will just run randomly!
|
||||
return SCHED_RUN_RANDOM;
|
||||
case SCHED_INVESTIGATE_SOUND:
|
||||
// I can't investigate a sound I heard.
|
||||
return SCHED_IDLE_WANDER;
|
||||
}
|
||||
|
||||
return BaseClass::SelectFailSchedule(failedSchedule, failedTask, taskFailCode);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Idle schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_ShadowWalker::SelectIdleSchedule()
|
||||
{
|
||||
int nSched = SelectFlinchSchedule();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
if (HasCondition(COND_HEAR_DANGER) ||
|
||||
HasCondition(COND_HEAR_COMBAT) ||
|
||||
HasCondition(COND_HEAR_WORLD) ||
|
||||
HasCondition(COND_HEAR_BULLET_IMPACT) ||
|
||||
HasCondition(COND_HEAR_PLAYER))
|
||||
{
|
||||
// Investigate sound source
|
||||
return SCHED_INVESTIGATE_SOUND;
|
||||
}
|
||||
|
||||
nSched = SelectScheduleRetrieveItem();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
// no valid route! Wander instead
|
||||
if (GetNavigator()->GetGoalType() == GOALTYPE_NONE) {
|
||||
nSched = SelectScheduleWander();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
return SCHED_IDLE_STAND;
|
||||
}
|
||||
|
||||
// valid route. Get moving
|
||||
return SCHED_IDLE_WALK;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Alert schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_ShadowWalker::SelectAlertSchedule()
|
||||
{
|
||||
// Per default base NPC, check flinch schedule first
|
||||
int nSched = SelectFlinchSchedule();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
// Scan around for new enemies
|
||||
if (HasCondition(COND_ENEMY_DEAD) && SelectWeightedSequence(ACT_VICTORY_DANCE) != ACTIVITY_NOT_AVAILABLE)
|
||||
return SCHED_ALERT_SCAN;
|
||||
|
||||
if (HasCondition(COND_HEAR_DANGER) ||
|
||||
HasCondition(COND_HEAR_PLAYER) ||
|
||||
HasCondition(COND_HEAR_WORLD) ||
|
||||
HasCondition(COND_HEAR_BULLET_IMPACT) ||
|
||||
HasCondition(COND_HEAR_COMBAT))
|
||||
{
|
||||
// Investigate sound source
|
||||
AlertSound();
|
||||
return SCHED_INVESTIGATE_SOUND;
|
||||
}
|
||||
|
||||
nSched = SelectScheduleRetrieveItem();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
// no valid route! Wander instead
|
||||
if (GetNavigator()->GetGoalType() == GOALTYPE_NONE) {
|
||||
nSched = SelectScheduleWander();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
return SCHED_IDLE_STAND;
|
||||
}
|
||||
|
||||
// valid route. Get moving
|
||||
return SCHED_ALERT_WALK;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Combat schedule selection
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_ShadowWalker::SelectCombatSchedule()
|
||||
{
|
||||
// Check flinch first
|
||||
int nSched = SelectFlinchSchedule();
|
||||
if (nSched != SCHED_NONE)
|
||||
return nSched;
|
||||
|
||||
// Check enemy death
|
||||
if (HasCondition(COND_ENEMY_DEAD))
|
||||
{
|
||||
// clear the current (dead) enemy and try to find another.
|
||||
SetEnemy(NULL);
|
||||
|
||||
if (ChooseEnemy())
|
||||
{
|
||||
FoundEnemySound();
|
||||
ClearCondition(COND_ENEMY_DEAD);
|
||||
return SelectSchedule();
|
||||
}
|
||||
|
||||
SetState(NPC_STATE_ALERT);
|
||||
return SelectSchedule();
|
||||
}
|
||||
|
||||
// Can any enemies see me?
|
||||
bool bEnemyCanSeeMe = HasCondition(COND_SEE_ENEMY) && HasCondition(COND_ENEMY_FACING_ME) && HasCondition(COND_HAVE_ENEMY_LOS);
|
||||
|
||||
|
||||
// If I'm scared of this enemy and he's looking at me, run away
|
||||
if ((IRelationType(GetEnemy()) == D_FR) && bEnemyCanSeeMe)
|
||||
{
|
||||
FearSound();
|
||||
return SCHED_RUN_FROM_ENEMY;
|
||||
}
|
||||
|
||||
// If in a squad, only one or two shadow walkers can chase the player. This is configurable through Hammer.
|
||||
bool bCanChase = true;
|
||||
if (m_bUseBothSquadSlots) {
|
||||
bCanChase = OccupyStrategySlotRange(SQUAD_SLOT_CHASE_1, SQUAD_SLOT_CHASE_2);
|
||||
}
|
||||
else {
|
||||
bCanChase = OccupyStrategySlot(SQUAD_SLOT_CHASE_1);
|
||||
}
|
||||
|
||||
bCanChase = bCanChase || EnemyDistance(GetEnemy()) < 128 || (bEnemyCanSeeMe && (HasCondition(COND_LIGHT_DAMAGE) || HasCondition(COND_HEAVY_DAMAGE)));
|
||||
|
||||
// If I'm not allowed to chase this enemy of this enemy and he's looking at me, set up an ambush
|
||||
if (!bCanChase)
|
||||
{
|
||||
FearSound();
|
||||
SetState((NPC_STATE)NPC_STATE_AMBUSH);
|
||||
return SCHED_HIDE;
|
||||
|
||||
}
|
||||
|
||||
// Reloading conditions are necessary just in case for some reason somebody gives the Shadow Walker a gun
|
||||
if (HasRangedWeapon() && (HasCondition(COND_LOW_PRIMARY_AMMO) || HasCondition(COND_NO_PRIMARY_AMMO)))
|
||||
{
|
||||
return SCHED_HIDE_AND_RELOAD;
|
||||
}
|
||||
|
||||
// Can we see the enemy?
|
||||
if (!HasCondition(COND_SEE_ENEMY))
|
||||
{
|
||||
// Chase!
|
||||
return SCHED_CHASE_ENEMY;
|
||||
}
|
||||
|
||||
if (HasCondition(COND_TOO_CLOSE_TO_ATTACK))
|
||||
return SCHED_BACK_AWAY_FROM_ENEMY;
|
||||
|
||||
|
||||
// we can see the enemy
|
||||
if (HasCondition(COND_CAN_MELEE_ATTACK1)) {
|
||||
return SCHED_MELEE_ATTACK1;
|
||||
}
|
||||
|
||||
if (HasCondition(COND_CAN_MELEE_ATTACK2)) {
|
||||
return SCHED_MELEE_ATTACK2;
|
||||
}
|
||||
|
||||
if (HasRangedWeapon() && GetShotRegulator()->IsInRestInterval())
|
||||
{
|
||||
if (HasCondition(COND_CAN_RANGE_ATTACK1))
|
||||
return SCHED_COMBAT_FACE;
|
||||
}
|
||||
|
||||
if (HasRangedWeapon() && HasCondition(COND_CAN_RANGE_ATTACK1))
|
||||
{
|
||||
if (OccupyStrategySlotRange(SQUAD_SLOT_ATTACK1, SQUAD_SLOT_ATTACK2))
|
||||
return SCHED_RANGE_ATTACK1;
|
||||
return SCHED_RUN_FROM_ENEMY;
|
||||
}
|
||||
|
||||
if (HasRangedWeapon() && HasCondition(COND_CAN_RANGE_ATTACK2))
|
||||
return SCHED_RANGE_ATTACK2;
|
||||
|
||||
|
||||
if (HasCondition(COND_NOT_FACING_ATTACK))
|
||||
return SCHED_COMBAT_FACE;
|
||||
|
||||
if (!HasCondition(COND_CAN_RANGE_ATTACK1) && !HasCondition(COND_CAN_MELEE_ATTACK1))
|
||||
{
|
||||
// if we can see enemy but can't use either attack type, we must need to get closer to enemy
|
||||
if (HasRangedWeapon())
|
||||
return SCHED_MOVE_TO_WEAPON_RANGE;
|
||||
|
||||
return SCHED_CHASE_ENEMY;
|
||||
}
|
||||
|
||||
DevWarning(2, "No suitable combat schedule!\n");
|
||||
return SCHED_FAIL;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Override base class schedules
|
||||
//-----------------------------------------------------------------------------
|
||||
int CNPC_ShadowWalker::TranslateSchedule(int scheduleType)
|
||||
{
|
||||
switch (scheduleType)
|
||||
{
|
||||
case SCHED_MELEE_ATTACK1:
|
||||
return SCHED_MELEE_ATTACK_NOINTERRUPT;
|
||||
case SCHED_IDLE_WANDER: // We want idle wandering to be interruptible - patrol walk is a better schedule
|
||||
return SCHED_PATROL_WALK;
|
||||
}
|
||||
|
||||
return BaseClass::TranslateSchedule(scheduleType);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Override base class activiites
|
||||
//-----------------------------------------------------------------------------
|
||||
Activity CNPC_ShadowWalker::NPC_TranslateActivity(Activity activity)
|
||||
{
|
||||
switch (activity) {
|
||||
case ACT_RUN_AIM_SHOTGUN:
|
||||
return ACT_RUN_AIM_RIFLE;
|
||||
case ACT_WALK_AIM_SHOTGUN:
|
||||
return ACT_WALK_AIM_RIFLE;
|
||||
case ACT_IDLE_ANGRY_SHOTGUN:
|
||||
return ACT_IDLE_ANGRY_SMG1;
|
||||
case ACT_RANGE_ATTACK_SHOTGUN_LOW:
|
||||
return ACT_RANGE_ATTACK_SMG1_LOW;
|
||||
case ACT_IDLE_MELEE:
|
||||
case ACT_IDLE_ANGRY_MELEE: // If the walker has a melee weapon but is in an idle state, don't raise the weapon
|
||||
if (m_NPCState == NPC_STATE_IDLE)
|
||||
return ACT_IDLE_SUITCASE;
|
||||
default:
|
||||
return BaseClass::NPC_TranslateActivity(activity);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//
|
||||
//
|
||||
// Output :
|
||||
//-----------------------------------------------------------------------------
|
||||
Class_T CNPC_ShadowWalker::Classify( void )
|
||||
{
|
||||
return CLASS_ZOMBIE;
|
||||
}
|
42
sp/src/game/server/mod/npc_shadow_walker.h
Normal file
42
sp/src/game/server/mod/npc_shadow_walker.h
Normal file
@ -0,0 +1,42 @@
|
||||
//=//=============================================================================//
|
||||
//
|
||||
// Purpose: A malevolent being from a parallel universe which at one point
|
||||
// may have been human.
|
||||
//
|
||||
// npc_shadow_walker is designed to be reusable as a generic horror
|
||||
// game style npc. Its model and sound files may be configured through
|
||||
// the hammer editor using keyfields.
|
||||
//
|
||||
// Author: 1upD
|
||||
//
|
||||
//=============================================================================//
|
||||
#include "cbase.h"
|
||||
#include "ai_default.h"
|
||||
#include "npc_base_custom.h"
|
||||
|
||||
|
||||
//=========================================================
|
||||
//=========================================================
|
||||
class CNPC_ShadowWalker : public CAI_BlendingHost<CNPC_BaseCustomNPC>
|
||||
{
|
||||
DECLARE_DATADESC();
|
||||
DECLARE_CLASS(CNPC_ShadowWalker, CAI_BlendingHost<CNPC_BaseCustomNPC>);
|
||||
|
||||
public:
|
||||
void Precache(void);
|
||||
void Spawn(void);
|
||||
Class_T Classify(void);
|
||||
virtual int SelectFailSchedule(int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode);
|
||||
virtual int SelectIdleSchedule();
|
||||
virtual int SelectAlertSchedule();
|
||||
virtual int SelectCombatSchedule();
|
||||
virtual Activity NPC_TranslateActivity(Activity eNewActivity);
|
||||
virtual int TranslateSchedule(int scheduleType);
|
||||
|
||||
void Activate();
|
||||
void FixupWeapon();
|
||||
|
||||
DEFINE_CUSTOM_AI;
|
||||
};
|
||||
|
||||
LINK_ENTITY_TO_CLASS(npc_shadow_walker, CNPC_ShadowWalker);
|
350
sp/src/game/server/mod/weapon_custom_flaregun.cpp
Normal file
350
sp/src/game/server/mod/weapon_custom_flaregun.cpp
Normal file
@ -0,0 +1,350 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
// Purpose: Flare gun (fffsssssssssss!!)
|
||||
//
|
||||
// This is a custom extension of Valve's CFlaregun class.
|
||||
// Some commented-out code has been duplicated from
|
||||
// weapon_flaregun.cpp in order to keep the mod code isolated
|
||||
// from the base game.
|
||||
//
|
||||
// Author: 1upD
|
||||
//
|
||||
//=============================================================================//
|
||||
|
||||
#include "cbase.h"
|
||||
#include "player.h"
|
||||
#include "gamerules.h"
|
||||
#include "basehlcombatweapon.h"
|
||||
#include "decals.h"
|
||||
#include "soundenvelope.h"
|
||||
#include "IEffects.h"
|
||||
#include "engine/IEngineSound.h"
|
||||
#include "weapon_flaregun.h"
|
||||
#include "props.h"
|
||||
#include "ai_basenpc.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
// Custom convars for flaregun
|
||||
ConVar flaregun_primary_velocity("sv_flaregun_primary_velocity", "1500");
|
||||
ConVar flaregun_secondary_velocity("sv_flaregun_secondary_velocity", "500");
|
||||
ConVar flaregun_duration_seconds("sv_flaregun_lifetime_seconds", "30");
|
||||
ConVar flaregun_stop_velocity("sv_flaregun_stop_velocity", "128");
|
||||
ConVar flaregun_projectile_sticky("sv_flaregun_projectile_sticky", "0");
|
||||
ConVar flaregun_dynamic_lights("sv_flaregun_dynamic_lights", "1");
|
||||
|
||||
// Custom derived class for flare gun projectiles
|
||||
class CFlareGunProjectile : public CFlare
|
||||
{
|
||||
public:
|
||||
DECLARE_CLASS(CFlareGunProjectile, CFlare);
|
||||
static CFlareGunProjectile *Create(Vector vecOrigin, QAngle vecAngles, CBaseEntity *pOwner, float lifetime);
|
||||
void IgniteOtherIfAllowed(CBaseEntity *pOther);
|
||||
void FlareGunProjectileTouch(CBaseEntity *pOther);
|
||||
void FlareGunProjectileBurnTouch(CBaseEntity *pOther);
|
||||
};
|
||||
|
||||
class CFlaregunCustom : public CFlaregun
|
||||
{
|
||||
public:
|
||||
DECLARE_CLASS(CFlaregunCustom, CFlaregun);
|
||||
virtual bool Reload(void);
|
||||
};
|
||||
|
||||
IMPLEMENT_SERVERCLASS_ST(CFlaregun, DT_Flaregun)
|
||||
END_SEND_TABLE()
|
||||
|
||||
LINK_ENTITY_TO_CLASS( weapon_flaregun, CFlaregunCustom);
|
||||
PRECACHE_WEAPON_REGISTER( weapon_flaregun );
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Precache
|
||||
//-----------------------------------------------------------------------------
|
||||
void CFlaregun::Precache( void )
|
||||
{
|
||||
BaseClass::Precache();
|
||||
|
||||
PrecacheScriptSound( "Flare.Touch" );
|
||||
|
||||
PrecacheScriptSound( "Weapon_FlareGun.Burn" );
|
||||
|
||||
UTIL_PrecacheOther( "env_flare" );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Fires a flare from a given flaregun with a given velocity
|
||||
// Acts like an extension method for CFlaregun
|
||||
//-----------------------------------------------------------------------------
|
||||
static void AttackWithVelocity(CFlaregun * flaregun, float projectileVelocity)
|
||||
{
|
||||
CBasePlayer *pOwner = ToBasePlayer(flaregun->GetOwner());
|
||||
|
||||
if (pOwner == NULL)
|
||||
return;
|
||||
|
||||
if (flaregun->m_iClip1 <= 0)
|
||||
{
|
||||
flaregun->SendWeaponAnim(ACT_VM_DRYFIRE);
|
||||
pOwner->m_flNextAttack = gpGlobals->curtime + flaregun->SequenceDuration();
|
||||
return;
|
||||
}
|
||||
|
||||
flaregun->m_iClip1 = flaregun->m_iClip1 - 1;
|
||||
|
||||
flaregun->SendWeaponAnim(ACT_VM_PRIMARYATTACK);
|
||||
pOwner->m_flNextAttack = gpGlobals->curtime + 1;
|
||||
|
||||
CFlare *pFlare = CFlareGunProjectile::Create(pOwner->Weapon_ShootPosition(), pOwner->EyeAngles(), pOwner, FLARE_DURATION);
|
||||
|
||||
if (pFlare == NULL)
|
||||
return;
|
||||
|
||||
Vector forward;
|
||||
pOwner->EyeVectors(&forward);
|
||||
forward *= projectileVelocity;
|
||||
forward += pOwner->GetAbsVelocity(); // Add the player's velocity to the forward vector so that the flare follows the player's motion
|
||||
forward.Normalized();
|
||||
|
||||
pFlare->SetAbsVelocity(forward);
|
||||
pFlare->SetGravity(1.0f);
|
||||
pFlare->SetFriction(0.85f);
|
||||
pFlare->SetMoveType(MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE);
|
||||
|
||||
flaregun->WeaponSound(SINGLE);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Main attack
|
||||
//-----------------------------------------------------------------------------
|
||||
void CFlaregun::PrimaryAttack( void )
|
||||
{
|
||||
AttackWithVelocity(this, flaregun_primary_velocity.GetFloat());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Secondary attack - launches flares closer to the player
|
||||
//-----------------------------------------------------------------------------
|
||||
void CFlaregun::SecondaryAttack( void )
|
||||
{
|
||||
AttackWithVelocity(this, flaregun_secondary_velocity.GetFloat());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
bool CFlaregunCustom::Reload(void)
|
||||
{
|
||||
bool fRet = DefaultReload(GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD);
|
||||
if (fRet)
|
||||
{
|
||||
WeaponSound(RELOAD);
|
||||
}
|
||||
return fRet;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Create function for Flare Gun projectile
|
||||
// Input : vecOrigin -
|
||||
// vecAngles -
|
||||
// *pOwner -
|
||||
// Output : CFlare
|
||||
//-----------------------------------------------------------------------------
|
||||
CFlareGunProjectile *CFlareGunProjectile::Create(Vector vecOrigin, QAngle vecAngles, CBaseEntity *pOwner, float lifetime)
|
||||
{
|
||||
CFlareGunProjectile *pFlare = (CFlareGunProjectile *)CreateEntityByName("env_flare");
|
||||
|
||||
if (pFlare == NULL)
|
||||
return NULL;
|
||||
|
||||
UTIL_SetOrigin(pFlare, vecOrigin);
|
||||
|
||||
pFlare->SetLocalAngles(vecAngles);
|
||||
pFlare->Spawn();
|
||||
pFlare->SetTouch(&CFlareGunProjectile::FlareGunProjectileTouch);
|
||||
pFlare->SetThink(&CFlare::FlareThink);
|
||||
pFlare->m_bLight = flaregun_dynamic_lights.GetBool();
|
||||
|
||||
//Start up the flare
|
||||
pFlare->Start(lifetime);
|
||||
|
||||
//Don't start sparking immediately
|
||||
pFlare->SetNextThink(gpGlobals->curtime + 0.5f);
|
||||
|
||||
//Burn out time
|
||||
pFlare->m_flTimeBurnOut = gpGlobals->curtime + lifetime;
|
||||
|
||||
// Time to next burn damage
|
||||
pFlare->m_flNextDamage = gpGlobals->curtime;
|
||||
|
||||
|
||||
pFlare->RemoveSolidFlags(FSOLID_NOT_SOLID);
|
||||
pFlare->AddSolidFlags(FSOLID_NOT_STANDABLE);
|
||||
|
||||
pFlare->SetMoveType(MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE);
|
||||
|
||||
pFlare->SetOwnerEntity(pOwner);
|
||||
pFlare->m_pOwner = pOwner;
|
||||
|
||||
return pFlare;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Touch function for flaregun projectiles
|
||||
// Input : *pOther - The entity that the flare has collided with
|
||||
//-----------------------------------------------------------------------------
|
||||
void CFlareGunProjectile::FlareGunProjectileTouch(CBaseEntity *pOther)
|
||||
{
|
||||
Assert(pOther);
|
||||
if (!pOther->IsSolid())
|
||||
return;
|
||||
|
||||
if ((m_nBounces < 10) && (GetWaterLevel() < 1))
|
||||
{
|
||||
// Throw some real chunks here
|
||||
g_pEffects->Sparks(GetAbsOrigin());
|
||||
}
|
||||
|
||||
//If the flare hit a person or NPC, do damage here.
|
||||
if (pOther && pOther->m_takedamage)
|
||||
{
|
||||
Vector vecNewVelocity = GetAbsVelocity();
|
||||
vecNewVelocity *= 0.1f;
|
||||
SetAbsVelocity(vecNewVelocity);
|
||||
SetMoveType(MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE);
|
||||
SetGravity(1.0f);
|
||||
Die(0.5);
|
||||
IgniteOtherIfAllowed(pOther);
|
||||
m_nBounces++;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// hit the world, check the material type here, see if the flare should stick.
|
||||
trace_t tr;
|
||||
tr = CBaseEntity::GetTouchTrace();
|
||||
|
||||
//Only do this on the first bounce if the convar is set
|
||||
if (flaregun_projectile_sticky.GetBool() && m_nBounces == 0)
|
||||
{
|
||||
const surfacedata_t *pdata = physprops->GetSurfaceData(tr.surface.surfaceProps);
|
||||
|
||||
if (pdata != NULL)
|
||||
{
|
||||
//Only embed into concrete and wood (jdw: too obscure for players?)
|
||||
//if ( ( pdata->gameMaterial == 'C' ) || ( pdata->gameMaterial == 'W' ) )
|
||||
{
|
||||
Vector impactDir = (tr.endpos - tr.startpos);
|
||||
VectorNormalize(impactDir);
|
||||
|
||||
float surfDot = tr.plane.normal.Dot(impactDir);
|
||||
|
||||
//Do not stick to ceilings or on shallow impacts
|
||||
if ((tr.plane.normal.z > -0.5f) && (surfDot < -0.9f))
|
||||
{
|
||||
RemoveSolidFlags(FSOLID_NOT_SOLID);
|
||||
AddSolidFlags(FSOLID_TRIGGER);
|
||||
UTIL_SetOrigin(this, tr.endpos + (tr.plane.normal * 2.0f));
|
||||
SetAbsVelocity(vec3_origin);
|
||||
SetMoveType(MOVETYPE_NONE);
|
||||
|
||||
SetTouch(&CFlareGunProjectile::FlareGunProjectileBurnTouch);
|
||||
|
||||
int index = decalsystem->GetDecalIndexForName("SmallScorch");
|
||||
if (index >= 0)
|
||||
{
|
||||
CBroadcastRecipientFilter filter;
|
||||
te->Decal(filter, 0.0, &tr.endpos, &tr.startpos, ENTINDEX(tr.m_pEnt), tr.hitbox, index);
|
||||
}
|
||||
|
||||
CPASAttenuationFilter filter2(this, "Flare.Touch");
|
||||
EmitSound(filter2, entindex(), "Flare.Touch");
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Scorch decal
|
||||
if (GetAbsVelocity().LengthSqr() > (250 * 250))
|
||||
{
|
||||
int index = decalsystem->GetDecalIndexForName("FadingScorch");
|
||||
if (index >= 0)
|
||||
{
|
||||
CBroadcastRecipientFilter filter;
|
||||
te->Decal(filter, 0.0, &tr.endpos, &tr.startpos, ENTINDEX(tr.m_pEnt), tr.hitbox, index);
|
||||
}
|
||||
}
|
||||
|
||||
// Change our flight characteristics
|
||||
SetMoveType(MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE);
|
||||
SetGravity(UTIL_ScaleForGravity(640));
|
||||
|
||||
m_nBounces++;
|
||||
|
||||
//After the first bounce, smacking into whoever fired the flare is fair game
|
||||
SetOwnerEntity(this);
|
||||
|
||||
// Slow down
|
||||
Vector vecNewVelocity = GetAbsVelocity();
|
||||
vecNewVelocity.x *= 0.8f;
|
||||
vecNewVelocity.y *= 0.8f;
|
||||
SetAbsVelocity(vecNewVelocity);
|
||||
|
||||
//Stopped?
|
||||
if (GetAbsVelocity().Length() < flaregun_stop_velocity.GetFloat())
|
||||
{
|
||||
RemoveSolidFlags(FSOLID_NOT_SOLID);
|
||||
AddSolidFlags(FSOLID_TRIGGER);
|
||||
SetAbsVelocity(vec3_origin);
|
||||
SetMoveType(MOVETYPE_NONE);
|
||||
SetTouch(&CFlareGunProjectile::FlareGunProjectileBurnTouch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
// Input : *pOther -
|
||||
//-----------------------------------------------------------------------------
|
||||
void CFlareGunProjectile::FlareGunProjectileBurnTouch(CBaseEntity *pOther)
|
||||
{
|
||||
if (pOther && pOther->m_takedamage && (m_flNextDamage < gpGlobals->curtime))
|
||||
{
|
||||
// Don't do damage - I want consistent behavior between initial collisions and after landing collisions
|
||||
// pOther->TakeDamage(CTakeDamageInfo(this, m_pOwner, 1, (DMG_BULLET | DMG_BURN)));
|
||||
m_flNextDamage = gpGlobals->curtime + 1.0f;
|
||||
IgniteOtherIfAllowed(pOther);
|
||||
}
|
||||
}
|
||||
|
||||
void CFlareGunProjectile::IgniteOtherIfAllowed(CBaseEntity * pOther)
|
||||
{
|
||||
// Don't burn the player
|
||||
if (pOther->IsPlayer())
|
||||
return;
|
||||
|
||||
CAI_BaseNPC *pNPC;
|
||||
pNPC = dynamic_cast<CAI_BaseNPC*>(pOther);
|
||||
if (pNPC) {
|
||||
// Don't burn friendly NPCs
|
||||
if (pNPC->IsPlayerAlly())
|
||||
return;
|
||||
|
||||
// Don't burn boss enemies
|
||||
if (FStrEq(STRING(pNPC->m_iClassname), "npc_combinegunship")
|
||||
|| FStrEq(STRING(pNPC->m_iClassname), "npc_combinedropship")
|
||||
|| FStrEq(STRING(pNPC->m_iClassname), "npc_strider")
|
||||
|| FStrEq(STRING(pNPC->m_iClassname), "npc_helicopter")
|
||||
)
|
||||
return;
|
||||
|
||||
// Burn this NPC
|
||||
pNPC->IgniteLifetime(flaregun_duration_seconds.GetFloat());
|
||||
}
|
||||
|
||||
// If this is a breakable prop, ignite it!
|
||||
CBreakableProp *pBreakable;
|
||||
pBreakable = dynamic_cast<CBreakableProp*>(pOther);
|
||||
if (pBreakable)
|
||||
pBreakable->IgniteLifetime(flaregun_duration_seconds.GetFloat());
|
||||
}
|
35
sp/src/game/server/mod/weapon_custom_melee.h
Normal file
35
sp/src/game/server/mod/weapon_custom_melee.h
Normal file
@ -0,0 +1,35 @@
|
||||
//=//=============================================================================//
|
||||
//
|
||||
// Purpose: Melee weapon for custom NPCs. Its model can be overridden.
|
||||
//
|
||||
// Author: 1upD
|
||||
//
|
||||
//=============================================================================//
|
||||
#include "cbase.h"
|
||||
#include "basehlcombatweapon_shared.h"
|
||||
#include "weapon_crowbar.h"
|
||||
|
||||
|
||||
class CWeaponCustomMelee : public CWeaponCrowbar
|
||||
{
|
||||
DECLARE_CLASS(CWeaponCustomMelee, CWeaponCrowbar);
|
||||
|
||||
const char *GetWorldModel() const { return m_iszWeaponModelName.ToCStr(); }
|
||||
virtual void Drop(const Vector &vecVelocity);
|
||||
public:
|
||||
string_t m_iszWeaponModelName;
|
||||
|
||||
DECLARE_DATADESC();
|
||||
};
|
||||
|
||||
void CWeaponCustomMelee::Drop(const Vector &vecVelocity)
|
||||
{
|
||||
BaseClass::Drop(vecVelocity);
|
||||
AddSpawnFlags(SF_WEAPON_NO_PLAYER_PICKUP);
|
||||
}
|
||||
|
||||
LINK_ENTITY_TO_CLASS(weapon_custommelee, CWeaponCustomMelee);
|
||||
|
||||
BEGIN_DATADESC(CWeaponCustomMelee)
|
||||
DEFINE_FIELD(m_iszWeaponModelName, FIELD_STRING)
|
||||
END_DATADESC()
|
@ -50,6 +50,18 @@ $Project "Server (Episodic)"
|
||||
|
||||
$Folder "HL2 DLL"
|
||||
{
|
||||
$Folder "Mod"
|
||||
{
|
||||
$File "mod\npc_base_custom.h"
|
||||
$File "mod\npc_base_custom.cpp"
|
||||
$File "mod\npc_lost_soul.cpp"
|
||||
$File "mod\npc_shadow_walker.h"
|
||||
$File "mod\npc_shadow_walker.cpp"
|
||||
$File "mod\weapon_custom_melee.h"
|
||||
$File "mod\weapon_custom_flaregun.cpp"
|
||||
$File "hl2\npc_bullsquid.h"
|
||||
$File "hl2\npc_bullsquid.cpp"
|
||||
}
|
||||
$File "$SRCDIR\game\shared\episodic\achievements_ep1.cpp"
|
||||
$File "$SRCDIR\game\shared\episodic\achievements_ep2.cpp"
|
||||
$File "$SRCDIR\game\shared\episodic\achievements_epx.cpp"
|
||||
|
@ -119,10 +119,9 @@ ConVar sk_plr_dmg_smg1 ( "sk_plr_dmg_smg1","0", FCVAR_REPLICATED );
|
||||
ConVar sk_npc_dmg_smg1 ( "sk_npc_dmg_smg1","0", FCVAR_REPLICATED);
|
||||
ConVar sk_max_smg1 ( "sk_max_smg1","0", FCVAR_REPLICATED);
|
||||
|
||||
// FIXME: remove these
|
||||
//ConVar sk_plr_dmg_flare_round ( "sk_plr_dmg_flare_round","0", FCVAR_REPLICATED);
|
||||
//ConVar sk_npc_dmg_flare_round ( "sk_npc_dmg_flare_round","0", FCVAR_REPLICATED);
|
||||
//ConVar sk_max_flare_round ( "sk_max_flare_round","0", FCVAR_REPLICATED);
|
||||
ConVar sk_plr_dmg_flare_round ( "sk_plr_dmg_flare_round","0", FCVAR_REPLICATED);
|
||||
ConVar sk_npc_dmg_flare_round ( "sk_npc_dmg_flare_round","0", FCVAR_REPLICATED);
|
||||
ConVar sk_max_flare_round ( "sk_max_flare_round","15", FCVAR_REPLICATED);
|
||||
|
||||
ConVar sk_plr_dmg_buckshot ( "sk_plr_dmg_buckshot","0", FCVAR_REPLICATED);
|
||||
ConVar sk_npc_dmg_buckshot ( "sk_npc_dmg_buckshot","0", FCVAR_REPLICATED);
|
||||
@ -206,7 +205,7 @@ bool CHalfLife2::Damage_IsTimeBased( int iDmgType )
|
||||
// Damage types that are time-based.
|
||||
#ifdef HL2_EPISODIC
|
||||
// This makes me think EP2 should have its own rules, but they are #ifdef all over in here.
|
||||
return ( ( iDmgType & ( DMG_PARALYZE | DMG_NERVEGAS | DMG_POISON | DMG_RADIATION | DMG_DROWNRECOVER | DMG_SLOWBURN ) ) != 0 );
|
||||
return ( ( iDmgType & ( DMG_PARALYZE | DMG_NERVEGAS | DMG_POISON | DMG_ACID | DMG_RADIATION | DMG_DROWNRECOVER | DMG_SLOWBURN ) ) != 0 );
|
||||
#else
|
||||
return BaseClass::Damage_IsTimeBased( iDmgType );
|
||||
#endif
|
||||
@ -380,7 +379,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_PLAYER, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_COMBINE, D_HT, 0);
|
||||
@ -389,7 +388,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_MILITARY, D_HT, 0);
|
||||
@ -404,6 +403,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ANTLION, CLASS_TEST,D_HT, 0);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_BARNACLE
|
||||
@ -416,7 +416,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_BARNACLE, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_COMBINE, D_HT, 0);
|
||||
@ -425,7 +425,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_MANHACK, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_MILITARY, D_HT, 0);
|
||||
@ -439,6 +439,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BARNACLE, CLASS_TEST,D_HT, 0);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_BULLSEYE
|
||||
@ -448,7 +449,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_ANTLION, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -457,7 +458,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSEYE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -475,7 +476,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_BULLSQUID
|
||||
// ------------------------------------------------------------
|
||||
/*
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_NONE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_PLAYER, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_ANTLION, D_HT, 0);
|
||||
@ -504,7 +505,8 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
*/
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_BULLSQUID, CLASS_TEST,D_HT, 0);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_CITIZEN_PASSIVE
|
||||
// ------------------------------------------------------------
|
||||
@ -513,7 +515,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_BARNACLE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -522,7 +524,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_HEADCRAB, D_FR, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_HOUNDEYE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_HOUNDEYE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_MANHACK, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -536,6 +538,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_PLAYER_ALLY, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_HACKED_ROLLERMINE,D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_PASSIVE, CLASS_TEST,D_FR, 0);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_CITIZEN_REBEL
|
||||
@ -545,7 +548,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_BARNACLE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_COMBINE, D_HT, 0);
|
||||
@ -554,7 +557,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_MILITARY, D_HT, 0);
|
||||
@ -568,6 +571,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_PLAYER_ALLY, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_HACKED_ROLLERMINE,D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CITIZEN_REBEL, CLASS_TEST,D_HT, 0);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_COMBINE
|
||||
@ -577,7 +581,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_BARNACLE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_COMBINE, D_LI, 0);
|
||||
@ -586,7 +590,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -600,7 +604,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_COMBINE_GUNSHIP
|
||||
// ------------------------------------------------------------
|
||||
@ -609,7 +613,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_COMBINE, D_LI, 0);
|
||||
@ -618,7 +622,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_MILITARY, D_NU, 0);
|
||||
@ -632,7 +636,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_GUNSHIP, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_COMBINE_HUNTER
|
||||
// ------------------------------------------------------------
|
||||
@ -641,7 +645,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_COMBINE, D_LI, 0);
|
||||
@ -650,7 +654,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_MILITARY, D_NU, 0);
|
||||
@ -664,7 +668,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_COMBINE_HUNTER, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_CONSCRIPT
|
||||
// ------------------------------------------------------------
|
||||
@ -673,7 +677,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_BARNACLE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_COMBINE, D_HT, 0);
|
||||
@ -682,7 +686,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_MILITARY, D_HT, 0);
|
||||
@ -696,7 +700,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_PLAYER_ALLY, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_PLAYER_ALLY_VITAL,D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_HACKED_ROLLERMINE,D_NU, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_CONSCRIPT, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_FLARE
|
||||
// ------------------------------------------------------------
|
||||
@ -705,7 +709,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_ANTLION, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -714,7 +718,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_FLARE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -738,7 +742,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_COMBINE, D_HT, 0);
|
||||
@ -747,7 +751,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_MILITARY, D_NU, 0);
|
||||
@ -761,17 +765,17 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_HACKED_ROLLERMINE,D_FR, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HEADCRAB, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_HOUNDEYE
|
||||
// ------------------------------------------------------------
|
||||
/*
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_NONE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_PLAYER, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_BULLSQUID, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_COMBINE, D_HT, 0);
|
||||
@ -794,7 +798,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
*/
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HOUNDEYE, CLASS_TEST,D_HT, 0);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_MANHACK
|
||||
@ -804,7 +808,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_COMBINE, D_NU, 0);
|
||||
@ -813,7 +817,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_HEADCRAB, D_HT,-1);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_HOUNDEYE, D_HT,-1);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_HOUNDEYE, D_HT,-1);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_MILITARY, D_NU, 0);
|
||||
@ -827,7 +831,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MANHACK, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_METROPOLICE
|
||||
// ------------------------------------------------------------
|
||||
@ -836,7 +840,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -845,7 +849,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -859,6 +863,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_METROPOLICE, CLASS_TEST,D_HT, 0);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_MILITARY
|
||||
@ -868,7 +873,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_COMBINE, D_NU, 0);
|
||||
@ -877,7 +882,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_MILITARY, D_NU, 0);
|
||||
@ -891,6 +896,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MILITARY, CLASS_TEST,D_HT, 0);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_MISSILE
|
||||
@ -900,7 +906,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -909,7 +915,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -923,6 +929,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_MISSILE, CLASS_TEST,D_HT, 0);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_NONE
|
||||
@ -932,7 +939,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_ANTLION, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_COMBINE, D_NU, 0);
|
||||
@ -941,7 +948,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_NONE, CLASS_MILITARY, D_NU, 0);
|
||||
@ -963,7 +970,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_BARNACLE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_BULLSEYE, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_CITIZEN_PASSIVE, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_CITIZEN_REBEL, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_COMBINE, D_HT, 0);
|
||||
@ -972,7 +979,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_MILITARY, D_HT, 0);
|
||||
@ -986,7 +993,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_PLAYER_ALLY, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_PLAYER_ALLY_VITAL,D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_HACKED_ROLLERMINE,D_LI, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_PLAYER_ALLY
|
||||
// ------------------------------------------------------------
|
||||
@ -995,7 +1002,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_BARNACLE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1004,7 +1011,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_HEADCRAB, D_FR, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_MILITARY, D_HT, 0);
|
||||
@ -1018,6 +1025,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_PLAYER_ALLY, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_PLAYER_ALLY_VITAL,D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_HACKED_ROLLERMINE,D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY, CLASS_TEST,D_HT, 0);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_PLAYER_ALLY_VITAL
|
||||
@ -1027,7 +1035,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_BARNACLE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1036,7 +1044,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_MILITARY, D_HT, 0);
|
||||
@ -1050,7 +1058,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_PLAYER_ALLY, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_PLAYER_ALLY_VITAL,D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_HACKED_ROLLERMINE,D_LI, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PLAYER_ALLY_VITAL, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_SCANNER
|
||||
// ------------------------------------------------------------
|
||||
@ -1059,7 +1067,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_COMBINE, D_LI, 0);
|
||||
@ -1068,7 +1076,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_MANHACK, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_METROPOLICE, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_MILITARY, D_LI, 0);
|
||||
@ -1082,7 +1090,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_SCANNER, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_STALKER
|
||||
// ------------------------------------------------------------
|
||||
@ -1091,7 +1099,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_COMBINE, D_NU, 0);
|
||||
@ -1100,7 +1108,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_MILITARY, D_NU, 0);
|
||||
@ -1114,7 +1122,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_STALKER, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_VORTIGAUNT
|
||||
// ------------------------------------------------------------
|
||||
@ -1123,7 +1131,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_BARNACLE, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_CITIZEN_PASSIVE, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_CITIZEN_REBEL, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1132,7 +1140,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_MILITARY, D_HT, 0);
|
||||
@ -1146,7 +1154,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_PLAYER_ALLY, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_PLAYER_ALLY_VITAL,D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_HACKED_ROLLERMINE,D_LI, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_VORTIGAUNT, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_ZOMBIE
|
||||
// ------------------------------------------------------------
|
||||
@ -1155,7 +1163,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1164,7 +1172,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_HEADCRAB, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_MANHACK, D_FR, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_MILITARY, D_FR, 0);
|
||||
@ -1178,7 +1186,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_ZOMBIE, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_PROTOSNIPER
|
||||
// ------------------------------------------------------------
|
||||
@ -1187,7 +1195,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_BULLSQUID, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_COMBINE, D_NU, 0);
|
||||
@ -1196,7 +1204,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_HOUNDEYE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_METROPOLICE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_MILITARY, D_NU, 0);
|
||||
@ -1210,7 +1218,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_HACKED_ROLLERMINE,D_HT, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_PROTOSNIPER, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_EARTH_FAUNA
|
||||
//
|
||||
@ -1222,7 +1230,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_CITIZEN_PASSIVE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_CITIZEN_REBEL, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1231,7 +1239,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_CONSCRIPT, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_FLARE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_MANHACK, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_MILITARY, D_HT, 0);
|
||||
@ -1245,7 +1253,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_PLAYER_ALLY, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_PLAYER_ALLY_VITAL,D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_HACKED_ROLLERMINE,D_NU, 0);
|
||||
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_EARTH_FAUNA, CLASS_TEST,D_HT, 0);
|
||||
// ------------------------------------------------------------
|
||||
// > CLASS_HACKED_ROLLERMINE
|
||||
// ------------------------------------------------------------
|
||||
@ -1254,7 +1262,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_ANTLION, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_BARNACLE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_BULLSEYE, D_NU, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_BULLSQUID, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_CITIZEN_PASSIVE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_CITIZEN_REBEL, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_COMBINE, D_HT, 0);
|
||||
@ -1263,7 +1271,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_CONSCRIPT, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_FLARE, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_HEADCRAB, D_HT, 0);
|
||||
//CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_HOUNDEYE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_MANHACK, D_NU, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_METROPOLICE, D_HT, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_MILITARY, D_HT, 0);
|
||||
@ -1277,6 +1285,7 @@ ConVar alyx_darkness_force( "alyx_darkness_force", "0", FCVAR_CHEAT | FCVAR_REP
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_PLAYER_ALLY, D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_PLAYER_ALLY_VITAL,D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_HACKED_ROLLERMINE,D_LI, 0);
|
||||
CBaseCombatCharacter::SetDefaultRelationship(CLASS_HACKED_ROLLERMINE, CLASS_TEST,D_HT, 0);
|
||||
}
|
||||
|
||||
|
||||
@ -1819,6 +1828,9 @@ CAmmoDef *GetAmmoDef()
|
||||
def.AddAmmoType("CombineCannon", DMG_BULLET, TRACER_LINE, "sk_npc_dmg_gunship_to_plr", "sk_npc_dmg_gunship", NULL, 1.5 * 750 * 12, 0 ); // hit like a 1.5kg weight at 750 ft/s
|
||||
def.AddAmmoType("AirboatGun", DMG_AIRBOAT, TRACER_LINE, "sk_plr_dmg_airboat", "sk_npc_dmg_airboat", NULL, BULLET_IMPULSE(10, 600), 0 );
|
||||
|
||||
// Custom
|
||||
def.AddAmmoType("FlareRound", DMG_BURN, TRACER_NONE, "sk_plr_dmg_flare_round", "sk_npc_dmg_flare_round", "sk_max_flare_round", 0, 0);
|
||||
|
||||
//=====================================================================
|
||||
// STRIDER MINIGUN DAMAGE - Pull up a chair and I'll tell you a tale.
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user