//----------------------------------------------------------------------------- // Purpose: Checks the validity of the given route's goaltype // Input : // Output : //----------------------------------------------------------------------------- bool CAI_BaseNPC::ValidateNavGoal() { if (GetNavigator()->GetGoalType() == GOALTYPE_COVER) { // Check if this location will block my enemy's line of sight to me if (GetEnemy()) { Activity nCoverActivity = GetCoverActivity( GetHintNode() ); Vector vCoverLocation = GetNavigator()->GetGoalPos(); // For now we have to drop the node to the floor so we can // get an accurate postion of the NPC. Should change once Ken checks in float floorZ = GetFloorZ(vCoverLocation); vCoverLocation.z = floorZ; Vector vEyePos = vCoverLocation + EyeOffset(nCoverActivity); if (!IsCoverPosition( GetEnemy()->EyePosition(), vEyePos ) ) { //Msg("BADUGI\n"); TaskFail(FAIL_BAD_PATH_GOAL); return false; } } } //Msg("BADUGI\n"); return true; }
//----------------------------------------------------------------------------- // Purpose: Returns distance of floor from the origin (up to 384 inches) // Input : // Output : //----------------------------------------------------------------------------- float GetFloorDistance(const Vector &origin) { return (origin.z - GetFloorZ(origin)); }
//----------------------------------------------------------------------------- // Purpose: Returns z value of floor below given point (up to 384 inches below) // Input : // Output : //----------------------------------------------------------------------------- float GetFloorZ(const Vector &origin) { return GetFloorZ(origin, 384); }
//========================================================= // start task //========================================================= void CNPC_Houndeye::StartTask( const Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_HOUND_GET_PATH_TO_CIRCLE: { if (GetEnemy() == NULL) { TaskFail(FAIL_NO_ENEMY); } else { Vector vTargetPos = GetEnemyLKP(); vTargetPos.z = GetFloorZ(vTargetPos); if (GetNavigator()->SetRadialGoal(vTargetPos, random->RandomInt(50,500), 90, 175, m_bLoopClockwise)) { TaskComplete(); return; } TaskFail(FAIL_NO_ROUTE); } break; } case TASK_HOUND_REVERSE_STRAFE_DIR: { // Try the other direction m_bLoopClockwise = (m_bLoopClockwise) ? false : true; TaskComplete(); break; } // Override to set appropriate distances case TASK_GET_PATH_TO_ENEMY_LOS: { float flMaxRange = HOUNDEYE_MAX_ATTACK_RADIUS * 0.9; float flMinRange = HOUNDEYE_MIN_ATTACK_RADIUS; Vector posLos; bool foundLos = false; if (GetEnemy() != NULL) { foundLos = GetTacticalServices()->FindLos(GetEnemyLKP(),GetEnemy()->EyePosition(), flMinRange, flMaxRange, 0.0, &posLos); } else { TaskFail(FAIL_NO_TARGET); return; } if (foundLos) { GetNavigator()->SetGoal( AI_NavGoal_t( posLos, ACT_RUN, AIN_HULL_TOLERANCE ) ); } else { TaskFail(FAIL_NO_SHOOT); } break; } case TASK_HOUND_FALL_ASLEEP: { m_fAsleep = true; // signal that hound is lying down (must stand again before doing anything else!) TaskComplete( true ); break; } case TASK_HOUND_WAKE_UP: { m_fAsleep = false; // signal that hound is standing again TaskComplete( true ); break; } case TASK_HOUND_OPEN_EYE: { m_fDontBlink = false; // turn blinking back on and that code will automatically open the eye TaskComplete( true ); break; } case TASK_HOUND_CLOSE_EYE: { //<<TEMP>> pev->skin = 0; m_fDontBlink = true; // tell blink code to leave the eye alone. break; } case TASK_HOUND_THREAT_DISPLAY: { SetIdealActivity( ACT_IDLE_ANGRY ); break; } case TASK_HOUND_HOP_BACK: { SetIdealActivity( ACT_LEAP ); break; } case TASK_RANGE_ATTACK1: { SetIdealActivity( ACT_RANGE_ATTACK1 ); break; } default: { BaseClass::StartTask(pTask); break; } } }