int CAI_Senses::LookForObjects( int iDistance ) { const int BOX_QUERY_MASK = FL_OBJECT; int nSeen = 0; if ( gpGlobals->curtime - m_TimeLastLookMisc > AI_MISC_SEARCH_TIME ) { m_TimeLastLookMisc = gpGlobals->curtime; BeginGather(); float distSq = ( iDistance * iDistance ); const Vector &origin = GetAbsOrigin(); int iter; CEntity *pEnt = CEntity::Instance(g_AI_SensedObjectsManager->GetFirst( &iter )); while ( pEnt ) { if ( pEnt->GetFlags() & BOX_QUERY_MASK ) { if ( origin.DistToSqr(pEnt->GetAbsOrigin()) < distSq && Look( pEnt->BaseEntity()) ) { nSeen++; } } pEnt = CEntity::Instance(g_AI_SensedObjectsManager->GetNext( &iter )); } EndGather( nSeen, &m_SeenMisc ); } else { for ( int i = m_SeenMisc.Count() - 1; i >= 0; --i ) { if ( m_SeenMisc[i].Get() == NULL ) m_SeenMisc.FastRemove( i ); } nSeen = m_SeenMisc.Count(); } return nSeen; }
void our_trie_iterator(KTrie<IEntityFactory_CE *> *pTrie, const char *name, IEntityFactory_CE *& obj, void *data) { SourceHook::List<CEntity *> *cent_list = (SourceHook::List<CEntity *> *)data; int count = 0; SourceHook::List<CEntity *>::iterator _iter; CEntity *pInfo; for(_iter=cent_list->begin(); _iter!=cent_list->end(); _iter++) { pInfo = (*_iter); if(strcmp(name, pInfo->GetClassname()) == 0) { count++; continue; } IType *pType = GetType(pInfo->BaseEntity()); IBaseType *pBase = pType->GetBaseType(); do { const char *classname = GetTypeName(pBase->GetTypeInfo()); if(strcmp(classname, name) == 0) { count++; } } while (pBase->GetNumBaseClasses() && (pBase = pBase->GetBaseClass(0))); pType->Destroy(); } if(strlen(name) < 7) META_CONPRINTF("%s:\t\t\t\t%d\n",name,count); else if(strlen(name) < 15) META_CONPRINTF("%s:\t\t\t%d\n",name,count); else if(strlen(name) < 23) META_CONPRINTF("%s:\t\t%d\n",name,count); else META_CONPRINTF("%s:\t%d\n",name,count); }
bool CAI_Pathfinder::IsLinkUsable(CAI_Link *pLink, int startID) { // -------------------------------------------------------------------------- // Skip if link turned off // -------------------------------------------------------------------------- if (pLink->m_LinkInfo & bits_LINK_OFF) { CDynamicLink *pDynamicLink = dynamic_cast<CDynamicLink *>(CEntity::Instance(pLink->m_pDynamicLink)); if ( !pDynamicLink || *(pDynamicLink->m_strAllowUse.ptr) == NULL_STRING ) return false; const char *pszAllowUse = STRING( *(pDynamicLink->m_strAllowUse) ); if ( *(pDynamicLink->m_bInvertAllow) ) { // Exlude only the specified entity name or classname if ( GetOuter()->NameMatches(pszAllowUse) || GetOuter()->ClassMatches( pszAllowUse ) ) return false; } else { // Exclude everything but the allowed entity name or classname if ( !GetOuter()->NameMatches( pszAllowUse) && !GetOuter()->ClassMatches( pszAllowUse ) ) return false; } } // -------------------------------------------------------------------------- // Get the destination nodeID // -------------------------------------------------------------------------- int endID = pLink->DestNodeID(startID); // -------------------------------------------------------------------------- // Make sure I have the ability to do the type of movement specified by the link // -------------------------------------------------------------------------- int linkMoveTypes = pLink->m_iAcceptedMoveTypes[GetHullType()]; int moveType = ( linkMoveTypes & CapabilitiesGet() ); CAI_Node *pStartNode,*pEndNode; pStartNode = GetNetwork()->GetNode(startID); pEndNode = GetNetwork()->GetNode(endID); if ( (linkMoveTypes & bits_CAP_MOVE_JUMP) && !moveType ) { CE_AI_Hint *pStartHint = dynamic_cast<CE_AI_Hint *>(pStartNode->GetHint()); CE_AI_Hint *pEndHint = dynamic_cast<CE_AI_Hint *>(pEndNode->GetHint()); if ( pStartHint && pEndHint ) { if ( pStartHint->HintType() == HINT_JUMP_OVERRIDE && pEndHint->HintType() == HINT_JUMP_OVERRIDE && ( ( ( pStartHint->GetSpawnFlags() | pEndHint->GetSpawnFlags() ) & SF_ALLOW_JUMP_UP ) || pStartHint->GetAbsOrigin().z > pEndHint->GetAbsOrigin().z ) ) { if ( !pStartNode->IsLocked() ) { if ( pStartHint->GetTargetNode() == -1 || pStartHint->GetTargetNode() == endID ) moveType = bits_CAP_MOVE_JUMP; } } } } if (!moveType) { return false; } // -------------------------------------------------------------------------- // Check if NPC has a reason not to use the desintion node // -------------------------------------------------------------------------- CEntity *cent = pEndNode->GetHint(); if (GetOuter()->IsUnusableNode(endID, ((cent) ? cent->BaseEntity() : NULL))) { return false; } // -------------------------------------------------------------------------- // If a jump make sure the jump is within NPC's legal parameters for jumping // -------------------------------------------------------------------------- if (moveType == bits_CAP_MOVE_JUMP) { if (!GetOuter()->IsJumpLegal(pStartNode->GetPosition(GetHullType()), pEndNode->GetPosition(GetHullType()), pEndNode->GetPosition(GetHullType()))) { return false; } } // -------------------------------------------------------------------------- // If an NPC suggested that this link is stale and I haven't checked it yet // I should make sure the link is still valid before proceeding // -------------------------------------------------------------------------- if (pLink->m_LinkInfo & bits_LINK_STALE_SUGGESTED) { if (IsLinkStillStale(moveType, pLink)) { return false; } } return true; }