3 ms·
From AIActionAttackFromNode.cpp: // ----------------------------------------------------------------------- // // // ROUTINE: CAIActionAttackFromNode::Validate
by JustForFun 10y ago
From AIActionAttackFromNode.cpp:
// ----------------------------------------------------------------------- //
//
// ROUTINE: CAIActionAttackFromNode::ValidateContextPreconditions
//
// PURPOSE: Return true if real-time preconditions are valid.
//
// ----------------------------------------------------------------------- //
bool CAIActionAttackFromNode::ValidateContextPreconditions( CAI* pAI, CAIWorldState& wsWorldStateGoal, bool bIsPlanning )
{
// Intentionally do not call super::ValidateContextPreconditions().
// Firing from a node ignores range.
// AI does not have a weapon of the correct type
if (!AIWeaponUtils::HasWeaponType(pAI, GetWeaponType(), bIsPlanning))
{
return false;
}
// AI does not have any ammo required by this weapon type.
if ( !AIWeaponUtils::HasAmmo(pAI, GetWeaponType(), bIsPlanning ) )
{
return false;
}
// AI must already be at a node.
SAIWORLDSTATE_PROP* pProp = pAI->GetAIWorldState()->GetWSProp( kWSK_AtNode, pAI->m_hObject );
if( !( pProp && pProp->hWSValue ) )
{
return false;
}
HOBJECT hNode = pProp->hWSValue;
// Node must be derived from SmartObject.
HCLASS hTest = g_pLTServer->GetClass( "AINodeSmartObject" );
HCLASS hClass = g_pLTServer->GetObjectClass( hNode );
if( !g_pLTServer->IsKindOf( hClass, hTest ) )
{
return false;
}
// Node must be correct type.
AINode* pNode = (AINode*)g_pLTServer->HandleToObject( pProp->hWSValue );
if( !( pNode && ( pNode->GetType() == m_pActionRecord->eNodeType ) ) )
{
return false;
}
// The node must be valid in terms of FOV.
if( pAI->HasTarget( kTarget_Character | kTarget_Object | kTarget_CombatOpportunity ) &&
pNode->IsNodeValid( pAI, pAI->GetPosition(), pAI->GetAIBlackBoard()->GetBBTargetObject(), kThreatPos_TargetPos, m_dwNodeStatus ) )
{
return true;
}
// Preconditions are not valid.
return false;
}
// ----------------------------------------------------------------------- //