void CNPC_Infected::StartTask( const Task_t *pTask ) { switch( pTask->iTask ) { case TASK_MELEE_ATTACK1: { SetLastAttackTime( gpGlobals->curtime ); m_iAttackLayer = AddGesture( ACT_TERROR_ATTACK ); break; } default: BaseClass::StartTask( pTask ); break; } }
void CNPC_AlienGrunt::StartTask ( const Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_AGRUNT_RANGE_ATTACK1_NOTURN: { SetLastAttackTime( gpGlobals->curtime ); ResetIdealActivity( ACT_RANGE_ATTACK1 ); } break; case TASK_AGRUNT_GET_PATH_TO_ENEMY_CORPSE: { Vector forward; AngleVectors( GetAbsAngles(), &forward ); Vector flEnemyLKP = GetEnemyLKP(); GetNavigator()->SetGoal( flEnemyLKP - forward * 64, AIN_CLEAR_TARGET); if ( GetNavigator()->SetGoal( flEnemyLKP - forward * 64, AIN_CLEAR_TARGET) ) { TaskComplete(); } else { Msg ( "AGruntGetPathToEnemyCorpse failed!!\n" ); TaskFail( FAIL_NO_ROUTE ); } } break; case TASK_AGRUNT_SETUP_HIDE_ATTACK: // alien grunt shoots hornets back out into the open from a concealed location. // try to find a spot to throw that gives the smart weapon a good chance of finding the enemy. // ideally, this spot is along a line that is perpendicular to a line drawn from the agrunt to the enemy. CHL1BaseNPC *pEnemyMonsterPtr; pEnemyMonsterPtr = (CHL1BaseNPC *)GetEnemy()->MyNPCPointer(); if ( pEnemyMonsterPtr ) { Vector vecCenter, vForward, vRight, vecEnemyLKP; QAngle angTmp; trace_t tr; BOOL fSkip; fSkip = FALSE; vecCenter = WorldSpaceCenter(); vecEnemyLKP = GetEnemyLKP(); VectorAngles( vecEnemyLKP - GetAbsOrigin(), angTmp ); SetAbsAngles( angTmp ); AngleVectors( GetAbsAngles(), &vForward, &vRight, NULL ); UTIL_TraceLine( WorldSpaceCenter() + vForward * 128, vecEnemyLKP, MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr); if ( tr.fraction == 1.0 ) { GetMotor()->SetIdealYawToTargetAndUpdate ( GetAbsOrigin() + vRight * 128 ); fSkip = TRUE; TaskComplete(); } if ( !fSkip ) { UTIL_TraceLine( WorldSpaceCenter() - vForward * 128, vecEnemyLKP, MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr); if ( tr.fraction == 1.0 ) { GetMotor()->SetIdealYawToTargetAndUpdate ( GetAbsOrigin() - vRight * 128 ); fSkip = TRUE; TaskComplete(); } } if ( !fSkip ) { UTIL_TraceLine( WorldSpaceCenter() + vForward * 256, vecEnemyLKP, MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr); if ( tr.fraction == 1.0 ) { GetMotor()->SetIdealYawToTargetAndUpdate ( GetAbsOrigin() + vRight * 256 ); fSkip = TRUE; TaskComplete(); } } if ( !fSkip ) { UTIL_TraceLine( WorldSpaceCenter() - vForward * 256, vecEnemyLKP, MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr); if ( tr.fraction == 1.0 ) { GetMotor()->SetIdealYawToTargetAndUpdate ( GetAbsOrigin() - vRight * 256 ); fSkip = TRUE; TaskComplete(); } } if ( !fSkip ) { TaskFail( FAIL_NO_COVER ); } } else { Msg ( "AGRunt - no enemy monster ptr!!!\n" ); TaskFail( FAIL_NO_ENEMY ); } break; default: BaseClass::StartTask ( pTask ); break; } }