diff --git a/source/src/bot/ac_bot_ai.cpp b/source/src/bot/ac_bot_ai.cpp index 65eb0d99..a837f998 100644 --- a/source/src/bot/ac_bot_ai.cpp +++ b/source/src/bot/ac_bot_ai.cpp @@ -21,10 +21,10 @@ weaponinfo_s WeaponInfoTable[MAX_WEAPONS] = // ---- Type : -- minDD -- maxDD -- minFD -- maxFD -- mA { TYPE_MELEE, 0.0f, 2.0f, 0.0f, 3.5f, 1 }, // KNIFE { TYPE_NORMAL, 0.0f, 20.0f, 0.0f, 50.0f, 6 }, // PISTOL - { TYPE_SNIPER, 20.0f, 80.0f, 5.0f, 180.0f, 2 }, // RIFLE // min and max FD just guesstimates for now + { TYPE_SNIPER, 20.0f, 80.0f, 2.5f, 180.0f, 2 }, // RIFLE // min and max FD just guesstimates for now { TYPE_SHOTGUN, 0.0f, 15.0f, 0.0f, 40.0f, 3 }, // SHOTGUN { TYPE_AUTO, 0.0f, 25.0f, 0.0f, 60.0f, 10 }, // SUBGUN - { TYPE_SNIPER, 23.0f, 75.0f, 20.0f, 200.0f, 3 }, // SNIPER + { TYPE_SNIPER, 23.0f, 75.0f, 10.0f, 200.0f, 3 }, // SNIPER { TYPE_AUTO, 20.0f, 80.0f, 0.0f, 150.0f, 6 }, // ASSAULT { TYPE_AUTO, 0.0f, 0.0f, 0.0f, 0.0f, 6 }, // CPISTOL { TYPE_GRENADE, 30.0f, 25.0f, 0.0f, 50.0f, 1 }, // GRENADE @@ -59,7 +59,7 @@ bool CACBot::ChoosePreferredWeapon() if((flDist >= WeaponInfoTable[i].flMinDesiredDistance) && (flDist <= WeaponInfoTable[i].flMaxDesiredDistance)) { - if(WeaponInfoTable[i].eWeaponType == TYPE_MELEE) sWeaponScore += 5; + if(WeaponInfoTable[i].eWeaponType == TYPE_MELEE) sWeaponScore += 20; } if ((flDist > WeaponInfoTable[i].flMinFireDistance) && // inside the range, continue to evaluate diff --git a/source/src/bot/bot.cpp b/source/src/bot/bot.cpp index f97f2ba9..69f00caf 100644 --- a/source/src/bot/bot.cpp +++ b/source/src/bot/bot.cpp @@ -284,9 +284,13 @@ float CBot::GetDistance(entity *e) bool CBot::SelectGun(int Gun) { - if(m_pMyEnt->weaponsel->reloading) return false; + if(m_pMyEnt->weaponsel->reloading || m_pMyEnt->weaponchanging) return false; if (m_pMyEnt->gunselect != Gun) audiomgr.playsound(S_GUNCHANGE, m_pMyEnt); m_pMyEnt->gunselect = Gun; + if(m_pMyEnt->weaponsel->type != Gun) + { + m_pMyEnt->weaponswitch(m_pMyEnt->weapons[Gun]); + } return true; } diff --git a/source/src/bot/bot_ai.cpp b/source/src/bot/bot_ai.cpp index f00016c0..384668a6 100644 --- a/source/src/bot/bot_ai.cpp +++ b/source/src/bot/bot_ai.cpp @@ -618,19 +618,17 @@ bool CBot::HuntEnemy(void) void CBot::CheckWeaponSwitch() { + if(m_pMyEnt->nextweaponsel == NULL) m_pMyEnt->weaponchanging = 0; if(!m_pMyEnt->weaponchanging) return; + int timeprogress = lastmillis-m_pMyEnt->weaponchanging; if(timeprogress>weapon::weaponchangetime) { + m_pMyEnt->prevweaponsel = m_pMyEnt->weaponsel; + m_pMyEnt->weaponsel = m_pMyEnt->nextweaponsel; if(m_pMyEnt->weaponsel!=NULL) addmsg(SV_WEAPCHANGE, "ri", m_pMyEnt->weaponsel->type); // 2011jan17:ft: message possibly not needed in a local game!?! m_pMyEnt->weaponchanging = 0; } - else if(timeprogress>(weapon::weaponchangetime>>1) && m_pMyEnt->weaponsel != m_pMyEnt->nextweaponsel) - { - m_pMyEnt->prevweaponsel = m_pMyEnt->weaponsel; - if(m_pMyEnt->nextweaponsel==NULL) m_pMyEnt->weaponsel = m_pMyEnt->weaponsel; // just keep using this weapon - next spawn will assign a new random weapon! - else m_pMyEnt->weaponsel = m_pMyEnt->nextweaponsel; - } } void CBot::ShootEnemy() @@ -717,14 +715,23 @@ bool CBot::ChoosePreferredWeapon() { // If no ammo for this weapon, skip it if (m_pMyEnt->ammo[i] == 0) continue; - - sWeaponScore = 5; // Minimal score for a weapon + + // Minimal score for a weapon + sWeaponScore = 5; + // advantage for primary weapons + sWeaponScore += i > 1 ? 5 : 0; if ((flDist >= WeaponInfoTable[i].flMinDesiredDistance) && (flDist <= WeaponInfoTable[i].flMaxDesiredDistance)) { // In desired range for this weapon sWeaponScore += 5; // Increase score much + if(WeaponInfoTable[i].eWeaponType == TYPE_MELEE) sWeaponScore += 20; // knife is a powerful weapon + // pistol & knife are better with sniper-like weapons as primary + if((i == GUN_PISTOL || WeaponInfoTable[i].eWeaponType == TYPE_MELEE) && WeaponInfoTable[m_pMyEnt->primary].eWeaponType == TYPE_SNIPER) + { + sWeaponScore += 5; + } } else if ((flDist < WeaponInfoTable[i].flMinFireDistance) || (flDist > WeaponInfoTable[i].flMaxFireDistance)) @@ -788,6 +795,8 @@ int CBot::GetShootDelay() void CBot::CheckReload() // reload gun if no enemies are around { if(m_pMyEnt->enemy) return; + // do not try to reload if not needed + if(m_pMyEnt->mag[m_pMyEnt->primary] >= WeaponInfoTable[m_pMyEnt->primary].sMinDesiredAmmo) return; SelectGun(m_pMyEnt->primary); tryreload(m_pMyEnt); return;