//========================================================= //========================================================= Activity CNPC_Controller::NPC_TranslateActivity( Activity eNewActivity ) { switch ( eNewActivity) { case ACT_IDLE: return (Activity)LookupFloat(); break; default: return BaseClass::NPC_TranslateActivity( eNewActivity ); } }
//========================================================= // RunTask //========================================================= void CController :: RunTask ( Task_t *pTask ) { if (m_flShootEnd > gpGlobals->time) { Vector vecHand, vecAngle; GetAttachment( 2, vecHand, vecAngle ); while (m_flShootTime < m_flShootEnd && m_flShootTime < gpGlobals->time) { Vector vecSrc = vecHand + pev->velocity * (m_flShootTime - gpGlobals->time); Vector vecDir; if (m_pCine != NULL || m_hEnemy != NULL) { if (m_pCine != NULL) // LRC- is this a script that's telling it to fire? { if (m_hTargetEnt != NULL && m_pCine->PreciseAttack()) { vecDir = (m_hTargetEnt->pev->origin - pev->origin).Normalize() * gSkillData.controllerSpeedBall; } else { UTIL_MakeVectors(pev->angles); vecDir = gpGlobals->v_forward * gSkillData.controllerSpeedBall; } } else if (m_hEnemy != NULL) { if (HasConditions( bits_COND_SEE_ENEMY )) { m_vecEstVelocity = m_vecEstVelocity * 0.5 + m_hEnemy->pev->velocity * 0.5; } else { m_vecEstVelocity = m_vecEstVelocity * 0.8; } vecDir = Intersect( vecSrc, m_hEnemy->BodyTarget( pev->origin ), m_vecEstVelocity, gSkillData.controllerSpeedBall ); } float delta = 0.03490; // +-2 degree vecDir = vecDir + Vector( RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ) ) * gSkillData.controllerSpeedBall; vecSrc = vecSrc + vecDir * (gpGlobals->time - m_flShootTime); CBaseMonster *pBall = (CBaseMonster*)Create( "controller_energy_ball", vecSrc, pev->angles, edict() ); pBall->pev->velocity = vecDir; } m_flShootTime += 0.2; } if (m_flShootTime > m_flShootEnd) { m_iBall[0] = 64; m_iBallTime[0] = m_flShootEnd; m_iBall[1] = 64; m_iBallTime[1] = m_flShootEnd; m_fInCombat = FALSE; } } switch ( pTask->iTask ) { case TASK_WAIT_FOR_MOVEMENT: case TASK_WAIT: case TASK_WAIT_FACE_ENEMY: case TASK_WAIT_PVS: MakeIdealYaw( m_vecEnemyLKP ); ChangeYaw( pev->yaw_speed ); if (m_fSequenceFinished) { m_fInCombat = FALSE; } CSquadMonster :: RunTask ( pTask ); if (!m_fInCombat) { if (HasConditions ( bits_COND_CAN_RANGE_ATTACK1 )) { pev->sequence = LookupActivity( ACT_RANGE_ATTACK1 ); pev->frame = 0; ResetSequenceInfo( ); m_fInCombat = TRUE; } else if (HasConditions ( bits_COND_CAN_RANGE_ATTACK2 )) { pev->sequence = LookupActivity( ACT_RANGE_ATTACK2 ); pev->frame = 0; ResetSequenceInfo( ); m_fInCombat = TRUE; } else { int iFloat = LookupFloat( ); if (m_fSequenceFinished || iFloat != pev->sequence) { pev->sequence = iFloat; pev->frame = 0; ResetSequenceInfo( ); } } } break; default: CSquadMonster :: RunTask ( pTask ); break; } }
//========================================================= // RunTask //========================================================= void CNPC_Controller::RunTask ( const Task_t *pTask ) { if (m_flShootEnd > gpGlobals->curtime) { Vector vecHand; QAngle vecAngle; GetAttachment( 2, vecHand, vecAngle ); while (m_flShootTime < m_flShootEnd && m_flShootTime < gpGlobals->curtime) { Vector vecSrc = vecHand + GetAbsVelocity() * (m_flShootTime - gpGlobals->curtime); Vector vecDir; if (GetEnemy() != NULL) { if (HasCondition( COND_SEE_ENEMY )) { m_vecEstVelocity = m_vecEstVelocity * 0.5 + GetEnemy()->GetAbsVelocity() * 0.5; } else { m_vecEstVelocity = m_vecEstVelocity * 0.8; } vecDir = Intersect( vecSrc, GetEnemy()->BodyTarget( GetAbsOrigin() ), m_vecEstVelocity, sk_controller_speedball.GetFloat() ); float delta = 0.03490; // +-2 degree vecDir = vecDir + Vector( random->RandomFloat( -delta, delta ), random->RandomFloat( -delta, delta ), random->RandomFloat( -delta, delta ) ) * sk_controller_speedball.GetFloat(); vecSrc = vecSrc + vecDir * (gpGlobals->curtime - m_flShootTime); CAI_BaseNPC *pBall = (CAI_BaseNPC*)Create( "controller_energy_ball", vecSrc, GetAbsAngles(), this ); pBall->SetAbsVelocity( vecDir ); // DevMsg( 2, "controller shooting energy ball\n" ); } m_flShootTime += 0.2; } if (m_flShootTime > m_flShootEnd) { m_iBall[0] = 64; m_iBallTime[0] = m_flShootEnd; m_iBall[1] = 64; m_iBallTime[1] = m_flShootEnd; m_fInCombat = FALSE; } } switch ( pTask->iTask ) { case TASK_WAIT_FOR_MOVEMENT: case TASK_WAIT: case TASK_WAIT_FACE_ENEMY: case TASK_WAIT_PVS: { if( GetEnemy() ) { float idealYaw = UTIL_VecToYaw( GetEnemy()->GetAbsOrigin() - GetAbsOrigin() ); GetMotor()->SetIdealYawAndUpdate( idealYaw ); } if ( IsSequenceFinished() || GetActivity() == ACT_IDLE) { m_fInCombat = false; } BaseClass::RunTask ( pTask ); if (!m_fInCombat) { if( HasCondition( COND_CAN_RANGE_ATTACK1 )) { SetActivity( ACT_RANGE_ATTACK1 ); SetCycle( 0 ); ResetSequenceInfo( ); m_fInCombat = true; } else if( HasCondition( COND_CAN_RANGE_ATTACK2 ) ) { SetActivity( ACT_RANGE_ATTACK2 ); SetCycle( 0 ); ResetSequenceInfo( ); m_fInCombat = true; } else { int iFloatActivity = LookupFloat(); if( IsSequenceFinished() || iFloatActivity != GetActivity() ) { SetActivity( (Activity)iFloatActivity ); } } } } break; default: BaseClass::RunTask ( pTask ); break; } }
void CController :: RunTask ( const Task_t& task ) { if (m_flShootEnd > gpGlobals->time) { Vector vecHand, vecAngle; GetAttachment( 2, vecHand, vecAngle ); while (m_flShootTime < m_flShootEnd && m_flShootTime < gpGlobals->time) { Vector vecSrc = vecHand + GetAbsVelocity() * (m_flShootTime - gpGlobals->time); Vector vecDir; if (m_hEnemy != NULL) { if (HasConditions( bits_COND_SEE_ENEMY )) { m_vecEstVelocity = m_vecEstVelocity * 0.5 + m_hEnemy->GetAbsVelocity() * 0.5; } else { m_vecEstVelocity = m_vecEstVelocity * 0.8; } vecDir = Intersect( vecSrc, m_hEnemy->BodyTarget( GetAbsOrigin() ), m_vecEstVelocity, gSkillData.GetControllerSpeedBall() ); float delta = 0.03490; // +-2 degree vecDir = vecDir + Vector( RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ) ) * gSkillData.GetControllerSpeedBall(); vecSrc = vecSrc + vecDir * (gpGlobals->time - m_flShootTime); CBaseMonster *pBall = (CBaseMonster*)Create( "controller_energy_ball", vecSrc, GetAbsAngles(), edict() ); pBall->SetAbsVelocity( vecDir ); } m_flShootTime += 0.2; } if (m_flShootTime > m_flShootEnd) { m_iBall[0] = 64; m_iBallTime[0] = m_flShootEnd; m_iBall[1] = 64; m_iBallTime[1] = m_flShootEnd; m_fInCombat = false; } } switch ( task.iTask ) { case TASK_WAIT_FOR_MOVEMENT: case TASK_WAIT: case TASK_WAIT_FACE_ENEMY: case TASK_WAIT_PVS: MakeIdealYaw( m_vecEnemyLKP ); ChangeYaw( GetYawSpeed() ); if (m_fSequenceFinished) { m_fInCombat = false; } CSquadMonster :: RunTask ( task ); if (!m_fInCombat) { if (HasConditions ( bits_COND_CAN_RANGE_ATTACK1 )) { SetSequence( LookupActivity( ACT_RANGE_ATTACK1 ) ); SetFrame( 0 ); ResetSequenceInfo( ); m_fInCombat = true; } else if (HasConditions ( bits_COND_CAN_RANGE_ATTACK2 )) { SetSequence( LookupActivity( ACT_RANGE_ATTACK2 ) ); SetFrame( 0 ); ResetSequenceInfo( ); m_fInCombat = true; } else { int iFloat = LookupFloat( ); if (m_fSequenceFinished || iFloat != GetSequence() ) { SetSequence( iFloat ); SetFrame( 0 ); ResetSequenceInfo( ); } } } break; default: CSquadMonster :: RunTask ( task ); break; } }