fix: prevent bots from staying forever trying to destroy breakable (fixes #288)
This commit is contained in:
parent
5104508665
commit
ce01e28be3
3 changed files with 40 additions and 1 deletions
|
|
@ -682,6 +682,7 @@ private:
|
||||||
float m_joinServerTime; // time when bot joined the game
|
float m_joinServerTime; // time when bot joined the game
|
||||||
float m_playServerTime; // time bot spent in the game
|
float m_playServerTime; // time bot spent in the game
|
||||||
float m_changeViewTime {}; // timestamp to change look at while at freezetime
|
float m_changeViewTime {}; // timestamp to change look at while at freezetime
|
||||||
|
float m_breakableTime {}; // breakeble acquired time
|
||||||
|
|
||||||
bool m_moveToGoal {}; // bot currently moving to goal??
|
bool m_moveToGoal {}; // bot currently moving to goal??
|
||||||
bool m_isStuck {}; // bot is stuck
|
bool m_isStuck {}; // bot is stuck
|
||||||
|
|
@ -714,6 +715,7 @@ private:
|
||||||
edict_t *m_itemIgnore {}; // pointer to entity to ignore for pickup
|
edict_t *m_itemIgnore {}; // pointer to entity to ignore for pickup
|
||||||
edict_t *m_liftEntity {}; // pointer to lift entity
|
edict_t *m_liftEntity {}; // pointer to lift entity
|
||||||
edict_t *m_breakableEntity {}; // pointer to breakable entity
|
edict_t *m_breakableEntity {}; // pointer to breakable entity
|
||||||
|
edict_t *m_lastBreakable {}; // last acquired breakable
|
||||||
edict_t *m_targetEntity {}; // the entity that the bot is trying to reach
|
edict_t *m_targetEntity {}; // the entity that the bot is trying to reach
|
||||||
edict_t *m_avoidGrenade {}; // pointer to grenade entity to avoid
|
edict_t *m_avoidGrenade {}; // pointer to grenade entity to avoid
|
||||||
|
|
||||||
|
|
@ -734,6 +736,7 @@ private:
|
||||||
Vector m_desiredVelocity; // desired velocity for jump nodes
|
Vector m_desiredVelocity; // desired velocity for jump nodes
|
||||||
Vector m_breakableOrigin; // origin of breakable
|
Vector m_breakableOrigin; // origin of breakable
|
||||||
|
|
||||||
|
Array <edict_t *> m_ignoredBreakable; // list of ignored breakables
|
||||||
Array <edict_t *> m_hostages; // pointer to used hostage entities
|
Array <edict_t *> m_hostages; // pointer to used hostage entities
|
||||||
Array <Route> m_routes; // pointer
|
Array <Route> m_routes; // pointer
|
||||||
Array <int32> m_goalHistory; // history of selected goals
|
Array <int32> m_goalHistory; // history of selected goals
|
||||||
|
|
|
||||||
|
|
@ -399,15 +399,31 @@ void Bot::checkBreakable (edict_t *touch) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bot::checkBreakablesAround () {
|
void Bot::checkBreakablesAround () {
|
||||||
if (!cv_destroy_breakables_around.bool_ () || usesKnife () || rg.chance (25) || !game.hasBreakables () || m_seeEnemyTime + 4.0f > game.time () || !game.isNullEntity (m_enemy) || !hasPrimaryWeapon ()) {
|
if (!m_buyingFinished || !cv_destroy_breakables_around.bool_ () || usesKnife () || rg.chance (25) || !game.hasBreakables () || m_seeEnemyTime + 4.0f > game.time () || !game.isNullEntity (m_enemy) || !hasPrimaryWeapon ()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if we're have some breakbles in 400 units range
|
// check if we're have some breakbles in 400 units range
|
||||||
for (const auto &breakable : game.getBreakables ()) {
|
for (const auto &breakable : game.getBreakables ()) {
|
||||||
|
bool ignoreBreakable = false;
|
||||||
|
|
||||||
|
// check if it's blacklisted
|
||||||
|
for (const auto &ignored : m_ignoredBreakable) {
|
||||||
|
if (ignored == breakable) {
|
||||||
|
ignoreBreakable = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep searching
|
||||||
|
if (ignoreBreakable) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!game.isShootableBreakable (breakable)) {
|
if (!game.isShootableBreakable (breakable)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto &origin = game.getEntityOrigin (breakable);
|
const auto &origin = game.getEntityOrigin (breakable);
|
||||||
const auto lengthToObstacle = origin.distanceSq (pev->origin);
|
const auto lengthToObstacle = origin.distanceSq (pev->origin);
|
||||||
|
|
||||||
|
|
@ -421,7 +437,23 @@ void Bot::checkBreakablesAround () {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// maybe time to give up?
|
||||||
|
if (m_lastBreakable == breakable && m_breakableTime + 1.0f < game.time ()) {
|
||||||
|
m_ignoredBreakable.emplace (breakable);
|
||||||
|
|
||||||
|
m_breakableOrigin = nullptr;
|
||||||
|
m_lastBreakable = nullptr;
|
||||||
|
m_breakableEntity = nullptr;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (isInFOV (origin - getEyesPos ()) < pev->fov && seesEntity (origin)) {
|
if (isInFOV (origin - getEyesPos ()) < pev->fov && seesEntity (origin)) {
|
||||||
|
if (m_breakableEntity != breakable) {
|
||||||
|
m_breakableTime = game.time ();
|
||||||
|
m_lastBreakable = breakable;
|
||||||
|
}
|
||||||
|
|
||||||
m_breakableOrigin = origin;
|
m_breakableOrigin = origin;
|
||||||
m_breakableEntity = breakable;
|
m_breakableEntity = breakable;
|
||||||
m_campButtons = pev->button & IN_DUCK;
|
m_campButtons = pev->button & IN_DUCK;
|
||||||
|
|
|
||||||
|
|
@ -1263,6 +1263,8 @@ void Bot::newRound () {
|
||||||
|
|
||||||
m_breakableEntity = nullptr;
|
m_breakableEntity = nullptr;
|
||||||
m_breakableOrigin = nullptr;
|
m_breakableOrigin = nullptr;
|
||||||
|
m_lastBreakable = nullptr;
|
||||||
|
|
||||||
m_timeDoorOpen = 0.0f;
|
m_timeDoorOpen = 0.0f;
|
||||||
|
|
||||||
resetCollision ();
|
resetCollision ();
|
||||||
|
|
@ -1283,6 +1285,7 @@ void Bot::newRound () {
|
||||||
m_shootAtDeadTime = 0.0f;
|
m_shootAtDeadTime = 0.0f;
|
||||||
m_oldCombatDesire = 0.0f;
|
m_oldCombatDesire = 0.0f;
|
||||||
m_liftUsageTime = 0.0f;
|
m_liftUsageTime = 0.0f;
|
||||||
|
m_breakableTime = 0.0f;
|
||||||
|
|
||||||
m_avoidGrenade = nullptr;
|
m_avoidGrenade = nullptr;
|
||||||
m_needAvoidGrenade = 0;
|
m_needAvoidGrenade = 0;
|
||||||
|
|
@ -1392,6 +1395,7 @@ void Bot::newRound () {
|
||||||
}
|
}
|
||||||
m_msgQueue.clear ();
|
m_msgQueue.clear ();
|
||||||
m_goalHistory.clear ();
|
m_goalHistory.clear ();
|
||||||
|
m_ignoredBreakable.clear ();
|
||||||
|
|
||||||
// clear last trace
|
// clear last trace
|
||||||
for (auto i = 0; i < TraceChannel::Num; ++i) {
|
for (auto i = 0; i < TraceChannel::Num; ++i) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue