/** * This method is repeatedly called by the tokenizer. * Each time, we determine the kind of token we're about to * read, and then we call the appropriate method to handle * that token type. * * @param aScanner The source of our input. * @param aFlushTokens An OUT parameter to tell the caller whether it should * process our queued tokens up to now (e.g., when we * reach a <script>). * @return Success or error */ nsresult nsHTMLTokenizer::ConsumeToken(nsScanner& aScanner, bool& aFlushTokens) { PRUnichar theChar; CToken* theToken = nullptr; nsresult result = aScanner.Peek(theChar); switch(result) { case kEOF: // Tell our caller that'we finished. return result; case NS_OK: default: if (!(mFlags & NS_IPARSER_FLAG_PLAIN_TEXT)) { if (kLessThan == theChar) { return ConsumeTag(theChar, theToken, aScanner, aFlushTokens); } else if (kAmpersand == theChar) { return ConsumeEntity(theChar, theToken, aScanner); } } if (kCR == theChar || kLF == theChar) { return ConsumeNewline(theChar, theToken, aScanner); } else { if (!nsCRT::IsAsciiSpace(theChar)) { if (theChar != '\0') { result = ConsumeText(theToken, aScanner); } else { // Skip the embedded null char. Fix bug 64098. aScanner.GetChar(theChar); } break; } result = ConsumeWhitespace(theChar, theToken, aScanner); } break; } return result; }
//----------------------------------------------------------------------------- // Purpose: Pulls physical objects towards the vortex center, killing them if they come too near //----------------------------------------------------------------------------- void CGravityVortexController::PullThink( void ) { // Pull any players close enough to us PullPlayersInRange(); Vector mins, maxs; mins = GetAbsOrigin() - Vector( m_flRadius, m_flRadius, m_flRadius ); maxs = GetAbsOrigin() + Vector( m_flRadius, m_flRadius, m_flRadius ); // Draw debug information if ( g_debug_hopwire.GetBool() ) { NDebugOverlay::Box( GetAbsOrigin(), mins - GetAbsOrigin(), maxs - GetAbsOrigin(), 0, 255, 0, 16, 4.0f ); } CBaseEntity *pEnts[128]; int numEnts = UTIL_EntitiesInBox( pEnts, 128, mins, maxs, 0 ); for ( int i = 0; i < numEnts; i++ ) { IPhysicsObject *pPhysObject = NULL; // Attempt to kill and ragdoll any victims in range if ( KillNPCInRange( pEnts[i], &pPhysObject ) == false ) { // If we didn't have a valid victim, see if we can just get the vphysics object pPhysObject = pEnts[i]->VPhysicsGetObject(); if ( pPhysObject == NULL ) continue; } float mass; CRagdollProp *pRagdoll = dynamic_cast< CRagdollProp* >( pEnts[i] ); if ( pRagdoll != NULL ) { ragdoll_t *pRagdollPhys = pRagdoll->GetRagdoll(); mass = 0.0f; // Find the aggregate mass of the whole ragdoll for ( int j = 0; j < pRagdollPhys->listCount; ++j ) { mass += pRagdollPhys->list[j].pObject->GetMass(); } } else { mass = pPhysObject->GetMass(); } Vector vecForce = GetAbsOrigin() - pEnts[i]->WorldSpaceCenter(); Vector vecForce2D = vecForce; vecForce2D[2] = 0.0f; float dist2D = VectorNormalize( vecForce2D ); float dist = VectorNormalize( vecForce ); // FIXME: Need a more deterministic method here if ( dist < 48.0f ) { ConsumeEntity( pEnts[i] ); continue; } // Must be within the radius if ( dist > m_flRadius ) continue; // Find the pull force vecForce *= ( 1.0f - ( dist2D / m_flRadius ) ) * m_flStrength * mass; if ( pEnts[i]->VPhysicsGetObject() ) { // Pull the object in pEnts[i]->VPhysicsTakeDamage( CTakeDamageInfo( this, this, vecForce, GetAbsOrigin(), m_flStrength, DMG_BLAST ) ); } } // Keep going if need-be if ( m_flEndTime > gpGlobals->curtime ) { SetThink( &CGravityVortexController::PullThink ); SetNextThink( gpGlobals->curtime + 0.1f ); } else { //Msg( "Consumed %.2f kilograms\n", m_flMass ); //CreateDenseBall(); } }