Skip to content
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions reactivedrop/fgd/reactivedrop.fgd
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@
input SetExcluded( string ) : "Change the NPC class excluded from collisions"
input SetInvert( integer ) : "Set the state of inversion for NPC class exclusion (0 or 1)"
input AllowFade( integer ) : "Enable or disable fading (0 or 1)"
input SetCollideWithGrenades(integer) : "Change CollideWithGrenades at runtime (0, 1 or 2)"
input SetCollideWithMarines(integer) : "Enable or disable marine collisions (0 or 1)"
]

@PointClass base(prop_dynamic_base, EnableDisable) sphere(fademindist) sphere(fademaxdist) studioprop() = prop_asw_fade :
Expand Down
1 change: 1 addition & 0 deletions src/game/client/swarm/c_func_asw_fade.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

IMPLEMENT_CLIENTCLASS_DT( C_Func_ASW_Fade, DT_Func_ASW_Fade, CFunc_ASW_Fade )
RecvPropInt( RECVINFO( m_nFadeOpacity ) ),
RecvPropInt( RECVINFO( m_iCollideWithGrenades ) ),
Comment thread
Kitsune44 marked this conversation as resolved.
Outdated
RecvPropBool( RECVINFO( m_bAllowFade ) ),
RecvPropBool( RECVINFO( m_bHasProxies ) ),
RecvPropBool( RECVINFO( m_bCollideWithMarines ) ),
Expand Down
1 change: 1 addition & 0 deletions src/game/client/swarm/c_func_asw_fade.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class C_Func_ASW_Fade : public C_FuncBrush, public IASW_Fade_List

IMPLEMENT_ASW_FADE_LIST( GetAbsOrigin() );
CNetworkVar( bool, m_bCollideWithMarines );
CNetworkVar( byte, m_iCollideWithGrenades );
Comment thread
Kitsune44 marked this conversation as resolved.
Outdated
};

#endif // _INCLUDED_C_FUNC_ASW_FADE_H
2 changes: 1 addition & 1 deletion src/game/server/hl2/grenade_spit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ void CGrenadeSpit::Spawn( void )
SetFriction( 0.8f );

SetCollisionGroup( ASW_COLLISION_GROUP_NPC_GRENADES );
CFunc_ASW_Fade::DisableCollisionsWithGrenade( this );
CFunc_ASW_Fade::ApplyGrenadeCollisionRules( this );

AddEFlags( EFL_FORCE_CHECK_TRANSMIT );

Expand Down
2 changes: 1 addition & 1 deletion src/game/server/hl2/npc_zombine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ void CNPC_Zombine::DropGrenade( Vector vDir )
m_hGrenade->SetMoveType( MOVETYPE_VPHYSICS );
m_hGrenade->SetSolid( SOLID_VPHYSICS );
m_hGrenade->SetCollisionGroup( ASW_COLLISION_GROUP_GRENADES );
CFunc_ASW_Fade::DisableCollisionsWithGrenade( m_hGrenade );
CFunc_ASW_Fade::ApplyGrenadeCollisionRules( m_hGrenade );

m_hGrenade->CreateVPhysics();
}
Expand Down
2 changes: 1 addition & 1 deletion src/game/server/swarm/asw_flare_projectile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ void CASW_Flare_Projectile::Spawn( void )
AddFlag( FL_OBJECT );

SetCollisionGroup( ASW_COLLISION_GROUP_GRENADES );
CFunc_ASW_Fade::DisableCollisionsWithGrenade( this );
CFunc_ASW_Fade::ApplyGrenadeCollisionRules( this );

// Tumble in air
QAngle vecAngVelocity( 0, random->RandomFloat ( -100, -500 ), 0 );
Expand Down
3 changes: 3 additions & 0 deletions src/game/server/swarm/asw_gas_grenade_projectile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "particle_parse.h"
#include "asw_generic_emitter_entity.h"
#include "asw_radiation_volume.h"
#include "func_asw_fade.h"

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
Expand Down Expand Up @@ -103,6 +104,8 @@ void CASW_Gas_Grenade_Projectile::Spawn( void )

SetCollisionGroup( ASW_COLLISION_GROUP_IGNORE_NPCS );

CFunc_ASW_Fade::ApplyGrenadeCollisionRules( this );

// Tumble in air
QAngle vecAngVelocity( 0, random->RandomFloat ( -100, -500 ), 0 );
SetLocalAngularVelocity( vecAngVelocity );
Expand Down
2 changes: 1 addition & 1 deletion src/game/server/swarm/asw_grenade_cluster.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ void CASW_Grenade_Cluster::Spawn( void )
SetFriction( asw_vindicator_grenade_friction.GetFloat() );
SetElasticity( asw_vindicator_grenade_elasticity.GetFloat() );
SetCollisionGroup( ASW_COLLISION_GROUP_GRENADES );
CFunc_ASW_Fade::DisableCollisionsWithGrenade( this );
CFunc_ASW_Fade::ApplyGrenadeCollisionRules( this );

SetTouch( &CASW_Grenade_Cluster::VGrenadeTouch );

Expand Down
2 changes: 1 addition & 1 deletion src/game/server/swarm/asw_grenade_vindicator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ void CASW_Grenade_Vindicator::Spawn( void )
SetFriction( asw_vindicator_grenade_friction.GetFloat() );
SetElasticity( asw_vindicator_grenade_elasticity.GetFloat() );
SetCollisionGroup( ASW_COLLISION_GROUP_GRENADES );
CFunc_ASW_Fade::DisableCollisionsWithGrenade( this );
CFunc_ASW_Fade::ApplyGrenadeCollisionRules( this );
//CreateVPhysics();

SetTouch( &CASW_Grenade_Vindicator::VGrenadeTouch );
Expand Down
2 changes: 1 addition & 1 deletion src/game/server/swarm/asw_laser_mine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ void CASW_Laser_Mine::Spawn( void )

AddEffects( EF_NOSHADOW | EF_NORECEIVESHADOW );
SetCollisionGroup( ASW_COLLISION_GROUP_GRENADES );
CFunc_ASW_Fade::DisableCollisionsWithGrenade( this );
CFunc_ASW_Fade::ApplyGrenadeCollisionRules( this );

SetThink( &CASW_Laser_Mine::LaserThink );
SetNextThink( gpGlobals->curtime + 0.1f );
Expand Down
2 changes: 1 addition & 1 deletion src/game/server/swarm/asw_marine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -890,7 +890,7 @@ void CASW_Marine::Spawn( void )

UTIL_SetSize( this, GetHullMins(), GetHullMaxs() );

CFunc_ASW_Fade::DisableCollisionsWithMarine( this );
CFunc_ASW_Fade::ApplyMarineCollisionRules( this );
}

unsigned int CASW_Marine::PhysicsSolidMaskForEntity( void ) const
Expand Down
2 changes: 1 addition & 1 deletion src/game/server/swarm/asw_mine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ void CASW_Mine::Spawn( void )
SetSolid( SOLID_BBOX );
AddSolidFlags( FSOLID_TRIGGER );
SetCollisionGroup( ASW_COLLISION_GROUP_GRENADES );
CFunc_ASW_Fade::DisableCollisionsWithGrenade( this );
CFunc_ASW_Fade::ApplyGrenadeCollisionRules( this );
SetMoveType( MOVETYPE_FLYGRAVITY );
m_takedamage = DAMAGE_NO;
m_bPrimed = false;
Expand Down
2 changes: 1 addition & 1 deletion src/game/server/swarm/asw_rocket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ void CASW_Rocket::Spawn( void )
SetTouch( &CASW_Rocket::MissileTouch );

SetCollisionGroup( ASW_COLLISION_GROUP_PLAYER_MISSILE );
CFunc_ASW_Fade::DisableCollisionsWithGrenade( this );
CFunc_ASW_Fade::ApplyGrenadeCollisionRules( this );
SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE );
SetThink( &CASW_Rocket::IgniteThink );

Expand Down
88 changes: 75 additions & 13 deletions src/game/server/swarm/func_asw_fade.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,20 @@ LINK_ENTITY_TO_CLASS( func_asw_fade, CFunc_ASW_Fade );

BEGIN_DATADESC( CFunc_ASW_Fade )
DEFINE_FIELD( m_bHasProxies, FIELD_BOOLEAN ),
DEFINE_KEYFIELD( m_nFadeOpacity, FIELD_CHARACTER, "fade_opacity" ),
DEFINE_KEYFIELD( m_iCollideWithGrenades, FIELD_CHARACTER, "CollideWithGrenades" ),
DEFINE_KEYFIELD( m_bCollideWithMarines, FIELD_BOOLEAN, "CollideWithMarines" ),
DEFINE_KEYFIELD( m_nFadeOpacity, FIELD_CHARACTER, "fade_opacity" ),
DEFINE_INPUT( m_bAllowFade, FIELD_BOOLEAN, "AllowFade" ),
DEFINE_INPUTFUNC( FIELD_INTEGER, "SetCollideWithGrenades", SetGrenadeCollisionRules ),
DEFINE_INPUTFUNC( FIELD_BOOLEAN, "SetCollideWithMarines", SetMarineCollisionRules ),
END_DATADESC()

IMPLEMENT_SERVERCLASS_ST( CFunc_ASW_Fade, DT_Func_ASW_Fade )
SendPropInt( SENDINFO( m_nFadeOpacity ), 8, SPROP_UNSIGNED ),
SendPropInt( SENDINFO( m_iCollideWithGrenades ), 2, SPROP_UNSIGNED ),
Comment thread
Kitsune44 marked this conversation as resolved.
Outdated
SendPropBool( SENDINFO( m_bCollideWithMarines ) ),
Comment thread
Kitsune44 marked this conversation as resolved.
Outdated
SendPropBool( SENDINFO( m_bAllowFade ) ),
SendPropBool( SENDINFO( m_bHasProxies ) ),
Comment thread
Kitsune44 marked this conversation as resolved.
SendPropBool( SENDINFO( m_bCollideWithMarines ) ),
END_SEND_TABLE()

CFunc_ASW_Fade::CFunc_ASW_Fade()
Expand All @@ -42,32 +45,91 @@ void CFunc_ASW_Fade::Spawn()
Assert( m_iCollideWithGrenades <= 2 );
}

void CFunc_ASW_Fade::DisableCollisionsWithGrenade( CBaseEntity *pGrenade )
void CFunc_ASW_Fade::ApplyGrenadeCollisionRules( CBaseEntity* pGrenade )
{
float flGrenadeZ = pGrenade->GetAbsOrigin().z;
string_t iszClassName = AllocPooledString( "func_asw_fade" );
const float flGrenadeZ = pGrenade->GetAbsOrigin().z;
const string_t iszClassName = AllocPooledString( "func_asw_fade" );

CFunc_ASW_Fade *pCeiling = NULL;
while ( ( pCeiling = assert_cast< CFunc_ASW_Fade * >( gEntList.FindEntityByClassnameFast( pCeiling, iszClassName ) ) ) != NULL )
CFunc_ASW_Fade* pCeiling = nullptr;
while ( ( pCeiling = assert_cast<CFunc_ASW_Fade*>(
gEntList.FindEntityByClassnameFast( pCeiling, iszClassName ) ) ) != nullptr )
{
if ( ( pCeiling->m_iCollideWithGrenades == 0 && pCeiling->GetAbsOrigin().z >= flGrenadeZ ) || pCeiling->m_iCollideWithGrenades == 2 )
const bool bShouldDisable =
( pCeiling->m_iCollideWithGrenades == 0 && pCeiling->GetAbsOrigin().z >= flGrenadeZ ) ||
( pCeiling->m_iCollideWithGrenades == 2 );

const bool bCurrentlyDisabled = PhysEntityCollisionsAreDisabled( pCeiling, pGrenade );

if ( bShouldDisable && !bCurrentlyDisabled )
{
PhysDisableEntityCollisions( pCeiling, pGrenade );
}
else if ( !bShouldDisable && bCurrentlyDisabled )
{
PhysEnableEntityCollisions( pCeiling, pGrenade );
}
}
}

void CFunc_ASW_Fade::DisableCollisionsWithMarine( CBaseEntity *pMarine )
void CFunc_ASW_Fade::ApplyMarineCollisionRules( CBaseEntity* pMarine )
{
string_t iszClassName = AllocPooledString( "func_asw_fade" );
const string_t iszClassName = AllocPooledString( "func_asw_fade" );

CFunc_ASW_Fade *pCeiling = NULL;
while ( ( pCeiling = assert_cast< CFunc_ASW_Fade * >( gEntList.FindEntityByClassnameFast( pCeiling, iszClassName ) ) ) != NULL )
CFunc_ASW_Fade* pCeiling = nullptr;
while ( ( pCeiling = assert_cast<CFunc_ASW_Fade*>(
gEntList.FindEntityByClassnameFast( pCeiling, iszClassName ) ) ) != nullptr )
{
if ( !pCeiling->m_bCollideWithMarines )
const bool bShouldDisable = !pCeiling->m_bCollideWithMarines;
const bool bCurrentlyDisabled = PhysEntityCollisionsAreDisabled( pCeiling, pMarine );

if ( bShouldDisable && !bCurrentlyDisabled )
{
PhysDisableEntityCollisions( pCeiling, pMarine );
}
else if ( !bShouldDisable && bCurrentlyDisabled )
{
PhysEnableEntityCollisions( pCeiling, pMarine );
}
}
}


void CFunc_ASW_Fade::SetGrenadeCollisionRules( inputdata_t& inputdata )
{
m_iCollideWithGrenades = clamp( inputdata.value.Int(), 0, 2 );

static const char* pszExplosiveClasses[] = {
"asw_mine",
"npc_grenade_frag",
"asw_rocket",
"grenadespit",
"asw_missile_round",
"asw_grenade_cluster",
"asw_flare_projectile",
"asw_laser_mine",
"asw_grenade_vindicator",
"asw_gas_grenade_projectile",
nullptr
};

for ( const char** pszClass = pszExplosiveClasses; *pszClass; ++pszClass )
{
CBaseEntity* pGrenade = NULL;
while ( ( pGrenade = gEntList.FindEntityByClassname( pGrenade, *pszClass ) ) != NULL )
{
ApplyGrenadeCollisionRules( pGrenade );
}
}
}

void CFunc_ASW_Fade::SetMarineCollisionRules( inputdata_t& inputdata )
{
m_bCollideWithMarines = !!inputdata.value.Int();

CBaseEntity* pMarine = NULL;
while ( ( pMarine = gEntList.FindEntityByClassname( pMarine, "asw_marine" ) ) != NULL )
{
ApplyMarineCollisionRules( pMarine );
}
}

Expand Down
9 changes: 6 additions & 3 deletions src/game/server/swarm/func_asw_fade.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,17 @@ class CFunc_ASW_Fade : public CFuncBrush
virtual void Spawn() override;
bool ShouldFade( CASW_Inhabitable_NPC *pNPC );

static void DisableCollisionsWithGrenade( CBaseEntity *pGrenade );
static void DisableCollisionsWithMarine( CBaseEntity *pMarine );
static void ApplyGrenadeCollisionRules( CBaseEntity *pGrenade );
static void ApplyMarineCollisionRules( CBaseEntity *pMarine );

void SetGrenadeCollisionRules( inputdata_t& inputdata );
void SetMarineCollisionRules( inputdata_t& inputdata );

CNetworkVar( bool, m_bHasProxies );
// 0 = only when grenade spawns above the brush
// 1 = always
// 2 = never
byte m_iCollideWithGrenades;
CNetworkVar( byte, m_iCollideWithGrenades );
Comment thread
Kitsune44 marked this conversation as resolved.
Outdated
CNetworkVar( bool, m_bCollideWithMarines );
CNetworkVar( byte, m_nFadeOpacity );
CNetworkVar( bool, m_bAllowFade );
Expand Down
2 changes: 1 addition & 1 deletion src/game/shared/swarm/asw_missile_round_shared.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ void CASW_Missile_Round::Spawn( void )
SetSolid( SOLID_NONE );
SetGravity( m_ShotDef.m_flGravity );
SetCollisionGroup( ASW_COLLISION_GROUP_ALIEN_MISSILE );
CFunc_ASW_Fade::DisableCollisionsWithGrenade( this );
CFunc_ASW_Fade::ApplyGrenadeCollisionRules( this );

SetTouch( &CASW_Missile_Round::Touch );

Expand Down