Skip to content

Commit 654d1bf

Browse files
committed
server: fixed barnacle disappearing bug due to PVS culling
1 parent 26f8b32 commit 654d1bf

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

server/monsters/barnacle.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ LINK_ENTITY_TO_CLASS( monster_barnacle, CBarnacle );
2222

2323
BEGIN_DATADESC( CBarnacle )
2424
DEFINE_FIELD( m_flAltitude, FIELD_FLOAT ),
25+
DEFINE_FIELD( m_flCachedLength, FIELD_FLOAT ),
2526
DEFINE_FIELD( m_flKillVictimTime, FIELD_TIME ),
2627
DEFINE_FIELD( m_cGibs, FIELD_INTEGER ),// barnacle loads up on gibs each time it kills something.
2728
DEFINE_FIELD( m_fTongueExtended, FIELD_BOOLEAN ),
@@ -86,6 +87,7 @@ void CBarnacle :: Spawn()
8687
m_cGibs = 0;
8788
m_fLiftingPrey = FALSE;
8889
m_flTongueAdj = -100;
90+
m_flCachedLength = 32.0f;
8991

9092
InitBoneControllers();
9193

@@ -117,6 +119,13 @@ void CBarnacle :: BarnacleThink ( void )
117119

118120
pev->nextthink = gpGlobals->time + 0.1;
119121

122+
if( m_flCachedLength != ( m_flAltitude + m_flTongueAdj ) || ( pev->absmin.z != pev->origin.z + -m_flCachedLength ) )
123+
{
124+
// recalc collision box here to avoid barnacle disappears bug
125+
m_flCachedLength = m_flAltitude + m_flTongueAdj;
126+
UTIL_SetOrigin( this, pev->origin );
127+
}
128+
120129
if ( m_hEnemy != NULL )
121130
{
122131
// barnacle has prey.
@@ -402,3 +411,12 @@ CBaseEntity *CBarnacle :: TongueTouchEnt ( float *pflLength )
402411
return NULL;
403412
}
404413

414+
void CBarnacle::SetObjectCollisionBox()
415+
{
416+
// FIXME: need a custom barnacle model with non-generic hitgroup
417+
// otherwise we can apply to damage to tongue instead of body
418+
// and another option is to check how far shot was from body, and
419+
// rejecting it if it does not meets our expectations
420+
pev->absmin = pev->origin + Vector( -16.0f, -16.0f, -m_flCachedLength );
421+
pev->absmax = pev->origin + Vector( 16.0f, 16.0f, 0.0f );
422+
}

server/monsters/barnacle.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,15 @@ class CBarnacle : public CBaseMonster
4747
void WaitTillDead ( void );
4848
void Killed( entvars_t *pevAttacker, int iGib );
4949
int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
50+
void SetObjectCollisionBox();
5051

5152
float m_flAltitude;
53+
float m_flCachedLength;
5254
float m_flKillVictimTime;
5355
int m_cGibs; // barnacle loads up on gibs each time it kills something.
5456
BOOL m_fTongueExtended;
5557
BOOL m_fLiftingPrey;
5658
float m_flTongueAdj;
5759

5860
DECLARE_DATADESC();
59-
};
61+
};

0 commit comments

Comments
 (0)