void CFuncPortalDetector::OnActivate( void ) { Vector vMin, vMax; CollisionProp()->WorldSpaceAABB( &vMin, &vMax ); Vector vBoxCenter = ( vMin + vMax ) * 0.5f; Vector vBoxExtents = ( vMax - vMin ) * 0.5f; bool bTouchedPortal1 = false; bool bTouchedPortal2 = false; int iPortalCount = CProp_Portal_Shared::AllPortals.Count(); if( iPortalCount != 0 ) { CProp_Portal **pPortals = CProp_Portal_Shared::AllPortals.Base(); for( int i = 0; i != iPortalCount; ++i ) { CProp_Portal *pTempPortal = pPortals[i]; //require that it's active and/or linked? if( pTempPortal->GetLinkageGroup() == m_iLinkageGroupID && UTIL_IsBoxIntersectingPortal( vBoxCenter, vBoxExtents, pTempPortal ) ) { if( pTempPortal->IsPortal2() ) { m_OnStartTouchPortal2.FireOutput( pTempPortal, this ); if ( pTempPortal->IsActivedAndLinked() ) { bTouchedPortal2 = true; m_OnStartTouchLinkedPortal.FireOutput( pTempPortal, this ); } } else { m_OnStartTouchPortal1.FireOutput( pTempPortal, this ); if ( pTempPortal->IsActivedAndLinked() ) { bTouchedPortal1 = true; m_OnStartTouchLinkedPortal.FireOutput( pTempPortal, this ); } } } } } if ( bTouchedPortal1 && bTouchedPortal2 ) { m_OnStartTouchBothLinkedPortals.FireOutput( this, this ); } }
//------------------------------------------------------------------------------ // Purpose : Reset the OnGround flags for any entities that may have been // resting on me // Input : // Output : //------------------------------------------------------------------------------ void CBreakable::ResetOnGroundFlags(void) { // !!! HACK This should work! // Build a box above the entity that looks like an 9 inch high sheet Vector mins, maxs; CollisionProp()->WorldSpaceAABB( &mins, &maxs ); mins.z -= 1; maxs.z += 8; // BUGBUG -- can only find 256 entities on a breakable -- should be enough CBaseEntity *pList[256]; int count = UTIL_EntitiesInBox( pList, 256, mins, maxs, FL_ONGROUND ); if ( count ) { for ( int i = 0; i < count; i++ ) { pList[i]->SetGroundEntity( (CBaseEntity *)NULL ); } } #ifdef PORTAL // !!! HACK This should work! // Tell touching portals to fizzle int iPortalCount = CProp_Portal_Shared::AllPortals.Count(); if( iPortalCount != 0 ) { Vector vMin, vMax; CollisionProp()->WorldSpaceAABB( &vMin, &vMax ); Vector vBoxCenter = ( vMin + vMax ) * 0.5f; Vector vBoxExtents = ( vMax - vMin ) * 0.5f; CProp_Portal **pPortals = CProp_Portal_Shared::AllPortals.Base(); for( int i = 0; i != iPortalCount; ++i ) { CProp_Portal *pTempPortal = pPortals[i]; if( UTIL_IsBoxIntersectingPortal( vBoxCenter, vBoxExtents, pTempPortal ) ) { pTempPortal->DoFizzleEffect( PORTAL_FIZZLE_KILLED, false ); pTempPortal->Fizzle(); } } } #endif }