From e8992f96b73774e30737c0b0282b1166b9dd2953 Mon Sep 17 00:00:00 2001 From: commandcobra7 <91374215+commandcobra7@users.noreply.github.com> Date: Sun, 25 Aug 2024 14:32:57 +0300 Subject: [PATCH] bot: do a real vector cleanup --- src/analyze.cpp | 1 - src/botlib.cpp | 75 +++++++++++++++++++++++++++++------------------- src/combat.cpp | 6 ++-- src/graph.cpp | 24 ++++++++-------- src/manager.cpp | 20 ++++++------- src/navigate.cpp | 8 +++--- src/tasks.cpp | 19 ++++++++---- src/vision.cpp | 2 +- 8 files changed, 89 insertions(+), 66 deletions(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index 5e98ddc..e646c3d 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -380,7 +380,6 @@ void GraphAnalyze::markGoals () { }); }; - if (game.mapIs (MapFlags::Demolition)) { updateNodeFlags (NodeFlag::Goal, "func_bomb_target"); // bombspot zone updateNodeFlags (NodeFlag::Goal, "info_bomb_target"); // bombspot zone (same as above) diff --git a/src/botlib.cpp b/src/botlib.cpp index 6e99c66..783cc81 100644 --- a/src/botlib.cpp +++ b/src/botlib.cpp @@ -224,8 +224,8 @@ void Bot::checkBreakablesAround () { // maybe time to give up? if (m_lastBreakable == breakable && m_breakableTime + 1.0f < game.time ()) { m_ignoredBreakable.emplace (breakable); + m_breakableOrigin.clear (); - m_breakableOrigin = nullptr; m_lastBreakable = nullptr; m_breakableEntity = nullptr; @@ -274,7 +274,7 @@ edict_t *Bot::lookupBreakable () { } } m_breakableEntity = nullptr; - m_breakableOrigin = nullptr; + m_breakableOrigin.clear (); return nullptr; } @@ -766,7 +766,6 @@ void Bot::ensurePickupEntitiesClear () { if (tid == Task::PickupItem) { completeTask (); } - findValidNode (); } } @@ -791,9 +790,9 @@ Vector Bot::getCampDirection (const Vector &dest) { // check if the trace hit something... if (tr.flFraction < 1.0f) { - const float lengthSq = tr.vecEndPos.distanceSq (src); + const float distanceSq = tr.vecEndPos.distanceSq (src); - if (lengthSq > cr::sqrf (1024.0f)) { + if (distanceSq > cr::sqrf (1024.0f)) { return nullptr; } @@ -1614,28 +1613,45 @@ void Bot::updateEmotions () { return; } - if (m_agressionLevel > m_baseAgressionLevel) { - m_agressionLevel -= 0.05f; - } - else { + if (m_seeEnemyTime + 1.0f > game.time ()) { m_agressionLevel += 0.05f; - } - if (m_fearLevel > m_baseFearLevel) { - m_fearLevel -= 0.05f; - } - else { - m_fearLevel += 0.05f; + if (m_agressionLevel > 1.0f) { + m_agressionLevel = 1.0f; + } } + else if (m_seeEnemyTime + 5.0f < game.time ()) { + if (m_agressionLevel > m_baseAgressionLevel) { + m_agressionLevel -= 0.05f; + } + else { + m_agressionLevel += 0.05f; + } - if (m_agressionLevel < 0.0f) { - m_agressionLevel = 0.0f; - } + if (m_fearLevel > m_baseFearLevel) { + m_fearLevel -= 0.05f; + } + else { + m_fearLevel += 0.05f; + } - if (m_fearLevel < 0.0f) { - m_fearLevel = 0.0f; + if (m_agressionLevel > 1.0f) { + m_agressionLevel = 1.0f; + } + + if (m_fearLevel > 1.0f) { + m_fearLevel = 1.0f; + } + + if (m_agressionLevel < 0.0f) { + m_agressionLevel = 0.0f; + } + + if (m_fearLevel < 0.0f) { + m_fearLevel = 0.0f; + } } - m_nextEmotionUpdate = game.time () + 1.0f; + m_nextEmotionUpdate = game.time () + 0.5f; } void Bot::overrideConditions () { @@ -1918,12 +1934,12 @@ void Bot::setConditions () { // don't listen if seeing enemy, just checked for sounds or being blinded (because its inhuman) if (m_soundUpdateTime < game.time () && m_blindTime < game.time () - && m_seeEnemyTime + 1.0f < game.time ()) { + && m_seeEnemyTime + 0.5f < game.time ()) { updateHearing (); - m_soundUpdateTime = game.time () + 0.25f; + m_soundUpdateTime = game.time () + 0.05f; } - else if (m_heardSoundTime + 10.0f < game.time ()) { + else if (m_soundUpdateTime >= game.time () && m_heardSoundTime + 10.0f < game.time ()) { m_states &= ~Sense::HearingEnemy; // clear the last enemy pointers if time has passed or enemy far away @@ -1931,7 +1947,7 @@ void Bot::setConditions () { const auto distanceSq = pev->origin.distanceSq (m_lastEnemyOrigin); if (distanceSq > cr::sqrf (2048.0f) || (game.isNullEntity (m_enemy) && m_seeEnemyTime + 10.0f < game.time ())) { - m_lastEnemyOrigin = nullptr; + m_lastEnemyOrigin.clear (); m_lastEnemy = nullptr; m_aimFlags &= ~AimFlags::LastEnemy; @@ -3327,8 +3343,9 @@ void Bot::logic () { m_strafeSpeed = pev->maxspeed * static_cast (m_needAvoidGrenade); } - // ensure we're not stuck destroying/picking something - if (m_moveToGoal && m_moveSpeed > 0.0f && rg (2.5f, 3.5f) + m_navTimeset + m_destOrigin.distanceSq2d (pev->origin) / cr::sqrf (m_moveSpeed) < game.time () + // ensure we're not stuck picking something + if (m_moveToGoal && m_moveSpeed > 0.0f + && rg (2.5f, 3.5f) + m_navTimeset + m_destOrigin.distanceSq2d (pev->origin) / cr::sqrf (m_moveSpeed) < game.time () && !(m_states & Sense::SeeingEnemy)) { ensurePickupEntitiesClear (); } @@ -3772,7 +3789,7 @@ void Bot::resetDoubleJump () { m_doubleJumpEntity = nullptr; m_duckForJump = 0.0f; - m_doubleJumpOrigin = nullptr; + m_doubleJumpOrigin.clear (); m_travelStartIndex = kInvalidNodeIndex; m_jumpReady = false; } @@ -4043,7 +4060,7 @@ void Bot::updateHearing () { // if bot had an enemy but the heard one is nearer, take it instead const float distanceSq = m_lastEnemyOrigin.distanceSq (pev->origin); - if (distanceSq > m_hearedEnemy->v.origin.distanceSq (pev->origin) && m_seeEnemyTime + 2.0f < game.time ()) { + if (distanceSq > m_hearedEnemy->v.origin.distanceSq (pev->origin) && m_seeEnemyTime + 1.0f < game.time ()) { m_lastEnemy = m_hearedEnemy; m_lastEnemyOrigin = getHeardOriginWithError (); } diff --git a/src/combat.cpp b/src/combat.cpp index cf15e9f..91e1490 100644 --- a/src/combat.cpp +++ b/src/combat.cpp @@ -133,7 +133,7 @@ bool Bot::checkBodyParts (edict_t *target) { if (isEnemyHidden (target) || isEnemyInvincible (target) || isEnemyNoTarget (target)) { m_enemyParts = Visibility::None; - m_enemyOrigin = nullptr; + m_enemyOrigin.clear (); return false; } @@ -360,7 +360,7 @@ bool Bot::lookupEnemies () { } } m_enemyParts = Visibility::None; - m_enemyOrigin = nullptr; + m_enemyOrigin.clear (); if (!game.isNullEntity (m_enemy)) { player = m_enemy; @@ -666,7 +666,7 @@ Vector Bot::getEnemyBodyOffset () { compensation.z = 0.0f; } else { - compensation = nullptr; + compensation.clear (); } // if we only suspect an enemy behind a wall take the worst skill diff --git a/src/graph.cpp b/src/graph.cpp index 89af1cc..86ce845 100644 --- a/src/graph.cpp +++ b/src/graph.cpp @@ -20,9 +20,9 @@ void BotGraph::reset () { m_editFlags = 0; m_autoSaveCount = 0; - m_learnVelocity = nullptr; - m_learnPosition = nullptr; - m_lastNode = nullptr; + m_learnVelocity.clear (); + m_learnPosition.clear (); + m_lastNode.clear (); m_pathDisplayTime = 0.0f; m_arrowDisplayTime = 0.0f; @@ -714,8 +714,8 @@ void BotGraph::add (int type, const Vector &pos) { // store the origin (location) of this node path->origin = newOrigin; - path->start = nullptr; - path->end = nullptr; + path->start.clear (); + path->end.clear (); path->display = 0.0f; path->light = kInvalidLightLevel; @@ -724,7 +724,7 @@ void BotGraph::add (int type, const Vector &pos) { link.index = kInvalidNodeIndex; link.distance = 0; link.flags = 0; - link.velocity = nullptr; + link.velocity.clear (); } // autosave nodes here and there @@ -931,7 +931,7 @@ void BotGraph::erase (int target) { link.index = kInvalidNodeIndex; link.flags = 0; link.distance = 0; - link.velocity = nullptr; + link.velocity.clear (); } } } @@ -1131,7 +1131,7 @@ void BotGraph::erasePath () { link.index = kInvalidNodeIndex; link.distance = 0; link.flags = 0; - link.velocity = nullptr; + link.velocity.clear (); }; for (auto &link : m_paths[nodeFrom].links) { @@ -1174,7 +1174,7 @@ void BotGraph::resetPath (int index) { link.index = kInvalidNodeIndex; link.distance = 0; link.flags = 0; - link.velocity = nullptr; + link.velocity.clear (); }; // clean all incoming @@ -2712,7 +2712,7 @@ void BotGraph::setBombOrigin (bool reset, const Vector &pos) { } if (reset) { - m_bombOrigin = nullptr; + m_bombOrigin.clear (); bots.setBombPlanted (false); return; @@ -2736,7 +2736,7 @@ void BotGraph::setBombOrigin (bool reset, const Vector &pos) { }); if (!wasFound) { - m_bombOrigin = nullptr; + m_bombOrigin.clear (); bots.setBombPlanted (false); } } @@ -2828,7 +2828,7 @@ void BotGraph::unassignPath (int from, int to) { link.index = kInvalidNodeIndex; link.distance = 0; link.flags = 0; - link.velocity = nullptr; + link.velocity.clear (); setEditFlag (GraphEdit::On); m_hasChanged = true; diff --git a/src/manager.cpp b/src/manager.cpp index 97dba0e..0649703 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -1438,12 +1438,12 @@ void Bot::newRound () { // delete all allocated path nodes clearSearchNodes (); - m_pathOrigin = nullptr; - m_destOrigin = nullptr; + m_pathOrigin.clear (); + m_destOrigin.clear (); m_path = nullptr; m_currentTravelFlags = 0; - m_desiredVelocity = nullptr; + m_desiredVelocity.clear (); m_currentNodeIndex = kInvalidNodeIndex; m_prevGoalIndex = kInvalidNodeIndex; m_chosenGoalIndex = kInvalidNodeIndex; @@ -1497,13 +1497,13 @@ void Bot::newRound () { m_ignoredItems.clear (); m_breakableEntity = nullptr; - m_breakableOrigin = nullptr; + m_breakableOrigin.clear (); m_lastBreakable = nullptr; m_timeDoorOpen = 0.0f; for (auto &fall : m_checkFallPoint) { - fall = nullptr; + fall.clear (); } m_checkFall = false; @@ -1513,8 +1513,8 @@ void Bot::newRound () { m_enemy = nullptr; m_lastVictim = nullptr; m_lastEnemy = nullptr; - m_lastEnemyOrigin = nullptr; - m_lastVictimOrigin = nullptr; + m_lastEnemyOrigin.clear (); + m_lastVictimOrigin.clear (); m_trackingEdict = nullptr; m_enemyBodyPartSet = nullptr; m_timeNextTracking = 0.0f; @@ -1539,9 +1539,9 @@ void Bot::newRound () { m_aimFlags = 0; m_liftState = 0; - m_aimLastError = nullptr; - m_position = nullptr; - m_liftTravelPos = nullptr; + m_aimLastError.clear (); + m_position.clear (); + m_liftTravelPos.clear (); setIdealReactionTimers (true); diff --git a/src/navigate.cpp b/src/navigate.cpp index 246e08b..e10a233 100644 --- a/src/navigate.cpp +++ b/src/navigate.cpp @@ -847,7 +847,7 @@ void Bot::checkFall () { m_checkFallPoint[1] = m_pathOrigin; } else { - m_checkFallPoint[1] = nullptr; + m_checkFallPoint[1].clear (); } } else if (!isOnLadder () && !isInWater ()) { @@ -940,7 +940,7 @@ void Bot::resetMovement () { m_moveSpeed = 0.0f; m_strafeSpeed = 0.0f; - m_moveAngles = nullptr; + m_moveAngles.clear (); } void Bot::translateInput () { @@ -1032,7 +1032,7 @@ bool Bot::updateNavigation () { m_jumpFinished = true; m_checkTerrain = false; - m_desiredVelocity = nullptr; + m_desiredVelocity.clear (); // cool down a little if next path after current will be jump if (m_jumpSequence) { @@ -2474,7 +2474,7 @@ bool Bot::advanceMovement () { // if height difference is enough, consider this link as jump link if (graph[destIndex].origin.z > m_path->origin.z && diff > cv_graph_slope_height.as ()) { m_currentTravelFlags |= PathFlag::Jump; - m_desiredVelocity = nullptr; // make bot compute jump velocity + m_desiredVelocity.clear (); // make bot compute jump velocity m_jumpFinished = false; // force-mark this path as jump break; diff --git a/src/tasks.cpp b/src/tasks.cpp index 8d74906..6661816 100644 --- a/src/tasks.cpp +++ b/src/tasks.cpp @@ -46,7 +46,15 @@ void Bot::normal_ () { } // bots rushing with knife, when have no enemy (thanks for idea to nicebot project) - if (cv_random_knife_attacks && usesKnife () && (game.isNullEntity (m_lastEnemy) || !util.isAlive (m_lastEnemy)) && game.isNullEntity (m_enemy) && m_knifeAttackTime < game.time () && !m_hasHostage && !hasShield () && numFriendsNear (pev->origin, 96.0f) == 0) { + if (cv_random_knife_attacks + && usesKnife () + && (game.isNullEntity (m_lastEnemy) || !util.isAlive (m_lastEnemy)) + && game.isNullEntity (m_enemy) + && m_knifeAttackTime < game.time () + && !m_hasHostage + && !hasShield () + && numFriendsNear (pev->origin, 96.0f) == 0) { + if (rg.chance (40)) { pev->button |= IN_ATTACK; } @@ -255,7 +263,6 @@ void Bot::normal_ () { ensureCurrentNodeIndex (); // do pathfinding if it's not the current - if (destIndex != m_currentNodeIndex) { findPath (m_currentNodeIndex, destIndex, pathSearchType); } @@ -362,7 +369,7 @@ void Bot::huntEnemy_ () { completeTask (); m_prevGoalIndex = kInvalidNodeIndex; - m_lastEnemyOrigin = nullptr; + m_lastEnemyOrigin.clear (); } // do we need to calculate a new path? @@ -775,7 +782,7 @@ void Bot::moveToPos_ () { completeTask (); // we're done m_prevGoalIndex = kInvalidNodeIndex; - m_position = nullptr; + m_position.clear (); } // didn't choose goal node yet? else if (!hasActiveGoal ()) { @@ -920,7 +927,7 @@ void Bot::defuseBomb_ () { // one of exceptions is thrown. finish task. if (defuseError) { - m_entity = nullptr; + m_entity.clear (); m_pickupItem = nullptr; m_pickupType = Pickup::None; @@ -1465,7 +1472,7 @@ void Bot::shootBreakable_ () { m_checkTerrain = true; m_moveToGoal = true; - m_breakableOrigin = nullptr; + m_breakableOrigin.clear (); m_breakableEntity = nullptr; completeTask (); diff --git a/src/vision.cpp b/src/vision.cpp index 3b47da7..afe87b5 100644 --- a/src/vision.cpp +++ b/src/vision.cpp @@ -499,7 +499,7 @@ void Bot::setAimDirection () { m_aimFlags &= ~AimFlags::PredictPath; m_trackingEdict = nullptr; - m_lookAtPredict = nullptr; + m_lookAtPredict.clear (); }; auto pathLength = m_lastPredictLength;