diff --git a/inc/support.h b/inc/support.h index 52b1ab9..3826fc5 100644 --- a/inc/support.h +++ b/inc/support.h @@ -82,6 +82,9 @@ public: // send modified pings to all the clients void emitPings (edict_t *to); + // reset ping to zero values + void resetPings (edict_t *to); + // checks if same model omitting the models directory bool isModel (const edict_t *ent, StringRef model); diff --git a/src/linkage.cpp b/src/linkage.cpp index 5cf9be1..be044df 100644 --- a/src/linkage.cpp +++ b/src/linkage.cpp @@ -389,22 +389,24 @@ CR_EXPORT int GetEntityAPI (gamefuncs_t *table, int interfaceVersion) { bots.frame (); }; - table->pfnCmdStart = [] (const edict_t *player, usercmd_t *cmd, unsigned int random_seed) { - auto ent = const_cast (player); + if (game.is (GameFlags::HasFakePings)) { + table->pfnCmdStart = [] (const edict_t *player, usercmd_t *cmd, unsigned int random_seed) { + auto ent = const_cast (player); - // if we're handle pings for bots and clients, clear IN_SCORE button so SV_ShouldUpdatePing engine function return false, and SV_EmitPings will not overwrite our results - if (game.is (GameFlags::HasFakePings) && cv_show_latency.int_ () == 2) { - if (!util.isFakeClient (ent) && (ent->v.oldbuttons | ent->v.button | cmd->buttons) & IN_SCORE) { - cmd->buttons &= ~IN_SCORE; - util.emitPings (ent); + // if we're handle pings for bots and clients, clear IN_SCORE button so SV_ShouldUpdatePing engine function return false, and SV_EmitPings will not overwrite our results + if (cv_show_latency.int_ () == 2) { + if (!util.isFakeClient (ent) && (ent->v.oldbuttons | ent->v.button | cmd->buttons) & IN_SCORE) { + cmd->buttons &= ~IN_SCORE; + util.emitPings (ent); + } } - } - if (game.is (GameFlags::Metamod)) { - RETURN_META (MRES_IGNORED); - } - dllapi.pfnCmdStart (ent, cmd, random_seed); - }; + if (game.is (GameFlags::Metamod)) { + RETURN_META (MRES_IGNORED); + } + dllapi.pfnCmdStart (ent, cmd, random_seed); + }; + } table->pfnPM_Move = [] (playermove_t *pm, int server) { // this is the player movement code clients run to predict things when the server can't update diff --git a/src/manager.cpp b/src/manager.cpp index 0d1bc20..7279a98 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -1691,6 +1691,9 @@ void Bot::markStale () { // switch chatter icon off showChatterIcon (false, true); + // reset bots ping to default + util.resetPings (ent ()); + // mark bot as leaving m_isStale = true; diff --git a/src/support.cpp b/src/support.cpp index 107d1ef..9866532 100644 --- a/src/support.cpp +++ b/src/support.cpp @@ -498,7 +498,7 @@ void BotSupport::syncCalculatePings () { } void BotSupport::emitPings (edict_t *to) { - MessageWriter msg; + static MessageWriter msg; auto isThirdpartyBot = [] (edict_t *ent) { return !bots[ent] && (ent->v.flags & FL_FAKECLIENT); @@ -509,6 +509,11 @@ void BotSupport::emitPings (edict_t *to) { continue; } + // do not send to dormants + if (client.ent->v.flags & FL_DORMANT) { + continue; + } + // no ping, no fun if (!client.ping) { client.ping = getPingBitmask (client.ent, rg.get (5, 10), rg.get (15, 40)); @@ -518,7 +523,25 @@ void BotSupport::emitPings (edict_t *to) { .writeLong (client.ping) .end (); } - return; +} + +void BotSupport::resetPings (edict_t *to) { + static MessageWriter msg; + + // no reset if game isn't support them + if (!game.is (GameFlags::HasFakePings)) { + return; + } + + for (auto &client : m_clients) { + if (!(client.flags & ClientFlags::Used) || isFakeClient (client.ent)) { + continue; + } + + msg.start (MSG_ONE_UNRELIABLE, SVC_PINGS, nullptr, client.ent) + .writeLong (getPingBitmask (to, 0, 0)) + .end (); + } } bool BotSupport::isModel (const edict_t *ent, StringRef model) {