AINode* CAINodeMgr::GetNode(HSTRING hstrName) { if ( !g_pLTServer ) return LTNULL; AINode* pNode; AINODE_MAP::iterator it; for(it = m_mapAINodes.begin(); it != m_mapAINodes.end(); ++it) { pNode = it->second; if ( g_pLTServer->CompareStringsUpper(pNode->GetName(), hstrName) ) { return pNode; } } return LTNULL; }
AINode* CAINodeMgr::GetNode(const char *szName) { if ( !g_pLTServer ) return LTNULL; AINode* pNode; AINODE_MAP::iterator it; for(it = m_mapAINodes.begin(); it != m_mapAINodes.end(); ++it) { pNode = it->second; const char* szNodeName = g_pLTServer->GetStringData(pNode->GetName()); if ( !_stricmp(szNodeName, szName) ) { return pNode; } } return LTNULL; }
LTBOOL CAIGoalGuard::HandleNameValuePair(const char *szName, const char *szValue) { AIASSERT(szName && szValue, m_pAI->m_hObject, "CAIGoalGuard::HandleNameValuePair: Name or value is NULL."); if( super::HandleNameValuePair(szName, szValue) ) { return LTTRUE; } if ( !_stricmp(szName, "NODE") ) { // If Goal was already active (walking to previous guard node) // Reset the goal. if( m_pGoalMgr->IsCurGoal( this ) ) { m_pAI->SetState( kState_HumanIdle ); } AINode* pNode = g_pAINodeMgr->GetNode(szValue); if( pNode ) { SetGuardNode( pNode ); RecalcImportance(); AITRACE( AIShowGoals, ( m_pAI->m_hObject, "CAIGoal%s: NODE=%s", s_aszGoalTypes[GetGoalType()], ::ToString( pNode->GetName() ) ) ); } else { AIError( "%s Cannot find node! CAIGoal%s: NODE=%s", m_pAI->GetName(), s_aszGoalTypes[GetGoalType()], szValue ); } return LTTRUE; } return LTFALSE; }
AINode* CAIGoalAbstractUseObject::HandleGoalAttractors() { // Do not search for attractors if goal is already active. // Do not search on first update, to allow commands a chance to disable nodes. // Do not search if AI has any damage flags set (e.g. sleeping damage). if( m_pGoalMgr->IsCurGoal(this) || m_pAI->IsFirstUpdate() || m_pAI->GetDamageFlags() ) { return LTNULL; } // If this goal reacts to stimulus, check if it has been too // long since stimulation. AIGBM_GoalTemplate* pTemplate = g_pAIGoalButeMgr->GetTemplate( GetGoalType() ); if( ( pTemplate->flagSenseTriggers != kSense_None ) && ( !m_hStimulusSource ) ) { return LTNULL; } // Lock the last UseObject node, so that we don't try to use it again. BlockAttractorNodeFromSearch( m_hLastNodeUseObject ); // Find the nearest attractor. AINode* pNode = FindNearestAttractorNode(); if(pNode != LTNULL) { AIASSERT(pNode->GetType() == kNode_UseObject, m_pAI->m_hObject, "CAIGoalAbstractUseObject::HandleGoalAttractors: AINode is not of type UseObject."); AINodeUseObject* pNodeUseObject = (AINodeUseObject*)pNode; if( pNodeUseObject->HasObject() && !pNodeUseObject->GetHObject() ) { pNode = LTNULL; m_fCurImportance = 0.f; AIASSERT( 0, pNodeUseObject->m_hObject, "CAIGoalAbstractUseObject::HandleGoalAttractors: AINodeUseObject points to invalid object" ); } else if( pNodeUseObject->IsOneWay() && ( pNodeUseObject->GetForward().Dot( m_pAI->GetForwardVector() ) < 0.0f ) ) { pNode = LTNULL; m_fCurImportance = 0.f; } else { AITRACE(AIShowGoals, ( m_pAI->m_hObject, "Setting node: %s", ::ToString( pNode->GetName() ) ) ); m_hNodeUseObject = pNode->m_hObject; SetCurToBaseImportance(); } } if( !pNode ) { ClearUseObjectNode(); m_hStimulusSource = LTNULL; } // If we locked a node prior to the search, unlock it. UnblockAttractorNodeFromSearch( m_hLastNodeUseObject ); return pNode; }