@@ -22,6 +22,7 @@ LINK_ENTITY_TO_CLASS( monster_barnacle, CBarnacle );
2222
2323BEGIN_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+ }
0 commit comments