CBlockBase *CWeaponCombatCannon::FindTraceBlock( void ) { CSDKPlayer *pPlayer = ToSDKPlayer( GetOwner() ); CBaseEntity *pEntity = NULL; if ( m_grabController.GetAttached() ) { pEntity = m_grabController.GetAttached(); } else { Vector vecSrc, vecEnd, vecDir; vecSrc = pPlayer->Weapon_ShootPosition(); pPlayer->EyeVectors( &vecDir ); // Calculate max distance as twice the radius of the block float max_distance = pPlayer->CollisionProp()->BoundingRadius() + lf_freeze_distance_combat.GetFloat(); vecEnd = vecSrc + vecDir * max_distance; UTIL_TraceLine( vecSrc, vecEnd, MASK_SHOT, GetOwner(), COLLISION_GROUP_NONE, &m_tr ); pEntity = m_tr.m_pEnt; } if ( !pEntity || !pEntity->IsBlock() ) { ResetFreezing(); return NULL; } CBlockBase *pBlock = dynamic_cast < CBlockBase * > ( pEntity ); if( !pBlock ) { DevMsg( "Not a block\n" ); return NULL; } return pBlock; }