@@ -516,10 +516,11 @@ void AttackState::OnUpdate(CCSBot *me)
516516 if (gpGlobals->time > m_reacquireTimestamp)
517517 me->FireWeaponAtEnemy ();
518518
519-
519+ bool bEnemyIsZombie = (enemy->IsPlayer () && static_cast <CBasePlayer *>(enemy)->m_bIsZombie );
520+ // attacking zombie, must moveback
520521 // do dodge behavior
521522 // If sniping or crouching, stand still.
522- if (m_dodge && !me-> IsUsingSniperRifle () && !m_crouchAndHold )
523+ if (m_dodge || bEnemyIsZombie )
523524 {
524525 Vector toEnemy = enemy->pev ->origin - me->pev ->origin ;
525526 float range = toEnemy.Length2D ();
@@ -530,67 +531,76 @@ void AttackState::OnUpdate(CCSBot *me)
530531 float maxRange = me->GetCombatRange () + hysterisRange;
531532
532533 // move towards (or away from) enemy if we are using a knife, behind a corner, or we aren't very skilled
533- if (me->GetProfile ()->GetSkill () < 0 .66f || !me->IsEnemyVisible ())
534+ if (me->GetProfile ()->GetSkill () < 0 .66f || !me->IsEnemyVisible () || bEnemyIsZombie )
534535 {
535536 if (range > maxRange)
537+ {
536538 me->MoveForward ();
539+ SetCrouchAndHold (false );
540+ }
537541 else if (range < minRange)
542+ {
538543 me->MoveBackward ();
544+ SetCrouchAndHold (false );
545+ }
539546 }
540547
541- // don't dodge if enemy is facing away
542- const float dodgeRange = 2000 .0f ;
543- if (range > dodgeRange || !me->IsPlayerFacingMe (enemy))
544- {
545- m_dodgeState = STEADY_ON;
546- m_nextDodgeStateTimestamp = 0 .0f ;
547- }
548- else if (gpGlobals->time >= m_nextDodgeStateTimestamp)
548+ if (!me->IsUsingSniperRifle () && !m_crouchAndHold)
549549 {
550- int next;
551-
552- // select next dodge state that is different that our current one
553- do
550+ // don't dodge if enemy is facing away
551+ const float dodgeRange = 2000 .0f ;
552+ if (range > dodgeRange || !me->IsPlayerFacingMe (enemy))
554553 {
555- // high-skill bots may jump when first engaging the enemy (if they are moving)
556- const float jumpChance = 33 .3f ;
557- if (m_firstDodge && me->GetProfile ()->GetSkill () > 0 .5f && RANDOM_FLOAT (0 , 100 ) < jumpChance && !me->IsNotMoving ())
558- next = RANDOM_LONG (0 , NUM_ATTACK_STATES - 1 );
559- else
560- next = RANDOM_LONG (0 , NUM_ATTACK_STATES - 2 );
554+ m_dodgeState = STEADY_ON;
555+ m_nextDodgeStateTimestamp = 0 .0f ;
561556 }
562- while (!m_firstDodge && next == m_dodgeState);
557+ else if (gpGlobals->time >= m_nextDodgeStateTimestamp)
558+ {
559+ int next;
563560
564- m_dodgeState = (DodgeStateType)next;
565- m_nextDodgeStateTimestamp = gpGlobals->time + RANDOM_FLOAT (0 .3f , 1 .0f );
566- m_firstDodge = false ;
567- }
561+ // select next dodge state that is different that our current one
562+ do
563+ {
564+ // high-skill bots may jump when first engaging the enemy (if they are moving)
565+ const float jumpChance = 33 .3f ;
566+ if (m_firstDodge && me->GetProfile ()->GetSkill () > 0 .5f && RANDOM_FLOAT (0 , 100 ) < jumpChance && !me->IsNotMoving ())
567+ next = RANDOM_LONG (0 , NUM_ATTACK_STATES - 1 );
568+ else
569+ next = RANDOM_LONG (0 , NUM_ATTACK_STATES - 2 );
570+ } while (!m_firstDodge && next == m_dodgeState);
571+
572+ m_dodgeState = (DodgeStateType)next;
573+ m_nextDodgeStateTimestamp = gpGlobals->time + RANDOM_FLOAT (0 .3f , 1 .0f );
574+ m_firstDodge = false ;
575+ }
568576
569- switch (m_dodgeState)
570- {
571- case STEADY_ON:
572- {
573- break ;
574- }
575- case SLIDE_LEFT:
576- {
577- me->StrafeLeft ();
578- break ;
579- }
580- case SLIDE_RIGHT:
581- {
582- me->StrafeRight ();
583- break ;
584- }
585- case JUMP:
586- {
587- if (me->m_isEnemyVisible )
577+ switch (m_dodgeState)
578+ {
579+ case STEADY_ON:
588580 {
589- me->Jump ();
581+ break ;
582+ }
583+ case SLIDE_LEFT:
584+ {
585+ me->StrafeLeft ();
586+ break ;
587+ }
588+ case SLIDE_RIGHT:
589+ {
590+ me->StrafeRight ();
591+ break ;
592+ }
593+ case JUMP:
594+ {
595+ if (me->m_isEnemyVisible )
596+ {
597+ me->Jump ();
598+ }
599+ break ;
600+ }
590601 }
591- break ;
592- }
593602 }
603+
594604 }
595605}
596606
0 commit comments