Implemented flashligr and nightvision goggles usage.

Credits for this mostly goes to Immortal_BLG and KWo.
This commit is contained in:
Dmitry 2019-05-10 21:12:12 +03:00 committed by jeefo
commit 61b2566373
7 changed files with 149 additions and 29 deletions

View file

@ -31,8 +31,10 @@ ConVar yb_best_weapon_picker_type ("yb_best_weapon_picker_type", "1");
// game console variables
ConVar mp_c4timer ("mp_c4timer", nullptr, VT_NOREGISTER);
ConVar mp_flashlight ("mp_flashlight", nullptr, VT_NOREGISTER);
ConVar mp_buytime ("mp_buytime", nullptr, VT_NOREGISTER, true, "1");
ConVar mp_footsteps ("mp_footsteps", nullptr, VT_NOREGISTER);
ConVar sv_gravity ("sv_gravity", nullptr, VT_NOREGISTER);
int Bot::getMsgQueue (void) {
@ -1710,6 +1712,24 @@ void Bot::buyStuff (void) {
}
break;
case BUYSTATE_NIGHTVISION:
if (m_moneyAmount > 2500 && !m_hasNVG && rng.getInt (1, 100) < 30) {
float skyColor = illum.getSkyColor ();
float lightLevel = waypoints.getLightLevel (m_currentWaypointIndex);
// if it's somewhat darkm do buy nightvision goggles
if ((skyColor >= 50.0f && lightLevel <= 15.0f) || (skyColor < 50.0f && lightLevel < 40.0f)) {
if (isOldGame) {
engine.execBotCmd (ent (), "buyequip;menuselect 7");
}
else {
engine.execBotCmd (ent (), "nvgs"); // use alias in steamcs
}
engine.print ("%s bought googles", STRING (pev->netname));
}
}
break;
case BUYSTATE_AMMO: // buy enough primary & secondary ammo (do not check for money here)
for (int i = 0; i <= 5; i++) {
engine.execBotCmd (ent (), "buyammo%d", rng.getInt (1, 2)); // simulate human
@ -2828,6 +2848,46 @@ void Bot::updateAimDir (void) {
}
}
void Bot::checkDarkness (void) {
// do not check for darkness at the start of the round
if (m_spawnTime + 5.0f > engine.timebase () || !waypoints.exists (m_currentWaypointIndex)) {
return;
}
// do not check every frame
if (m_checkDarkTime + 2.5f > engine.timebase ()) {
return;
}
float lightLevel = waypoints.getLightLevel (m_currentWaypointIndex);
float skyColor = illum.getSkyColor ();
if (mp_flashlight.boolean () && !m_hasNVG) {
auto task = TaskID ();
if (!(pev->effects & EF_DIMLIGHT) && task != TASK_CAMP && task != TASK_ATTACK && m_heardSoundTime + 3.0f < engine.timebase () && m_flashLevel > 30.0f && ((skyColor > 50.0f && lightLevel < 10.0f) || (skyColor <= 50.0f && lightLevel < 40.0f))) {
pev->impulse = 100;
}
else if ((pev->effects & EF_DIMLIGHT) && (((lightLevel > 15.0f && skyColor > 50.0f) || (lightLevel > 45.0f && skyColor <= 50.0f)) || task == TASK_CAMP || task == TASK_ATTACK || m_flashLevel <= 0 || m_heardSoundTime + 3.0f >= engine.timebase ()))
{
pev->impulse = 100;
}
}
else if (m_hasNVG) {
if (pev->effects & EF_DIMLIGHT) {
pev->impulse = 100;
}
else if (!m_usesNVG && ((skyColor > 50.0f && lightLevel < 15.0f) || (skyColor <= 50.0f && lightLevel < 40.0f))) {
engine.execBotCmd (ent (), "nightvision");
}
else if (m_usesNVG && ((lightLevel > 20.0f && skyColor > 50.0f) || (lightLevel > 45.0f && skyColor <= 50.0f))) {
engine.execBotCmd (ent (), "nightvision");
}
}
m_checkDarkTime = engine.timebase ();
}
void Bot::framePeriodic (void) {
if (m_thinkFps <= engine.timebase ()) {
// execute delayed think
@ -4860,6 +4920,9 @@ void Bot::ai (void) {
checkTerrain (movedDistance, dirNormal);
}
// check the darkness
checkDarkness ();
// must avoid a grenade?
if (m_needAvoidGrenade != 0) {
// don't duck to get away faster