fix: RX silence 15s warning fired ~30 times per window

The 10s silence warning used a one-shot bool guard, but the 15s warning
used a 500ms time window — firing every frame (~30 times at 60fps).
Added rxSilence15sLogged_ guard consistent with the 10s pattern.
This commit is contained in:
Kelsi 2026-03-29 18:46:25 -07:00
parent 3712e6c5c1
commit 2ae14d5d38
2 changed files with 6 additions and 10 deletions

View file

@ -3047,6 +3047,7 @@ private:
// ---- RX silence detection ---- // ---- RX silence detection ----
std::chrono::steady_clock::time_point lastRxTime_{}; std::chrono::steady_clock::time_point lastRxTime_{};
bool rxSilenceLogged_ = false; bool rxSilenceLogged_ = false;
bool rxSilence15sLogged_ = false;
// ---- XP tracking ---- // ---- XP tracking ----
uint32_t playerXp_ = 0; uint32_t playerXp_ = 0;

View file

@ -887,7 +887,8 @@ void GameHandler::updateNetworking(float deltaTime) {
rxSilenceLogged_ = true; rxSilenceLogged_ = true;
LOG_WARNING("RX SILENCE: No packets from server for ", silenceMs, "ms — possible soft disconnect"); LOG_WARNING("RX SILENCE: No packets from server for ", silenceMs, "ms — possible soft disconnect");
} }
if (silenceMs > 15000 && silenceMs < 15500) { if (silenceMs > 15000 && !rxSilence15sLogged_) {
rxSilence15sLogged_ = true;
LOG_WARNING("RX SILENCE: 15s — server appears to have stopped sending"); LOG_WARNING("RX SILENCE: 15s — server appears to have stopped sending");
} }
} }
@ -4126,6 +4127,7 @@ void GameHandler::enqueueIncomingPacket(const network::Packet& packet) {
pendingIncomingPackets_.push_back(packet); pendingIncomingPackets_.push_back(packet);
lastRxTime_ = std::chrono::steady_clock::now(); lastRxTime_ = std::chrono::steady_clock::now();
rxSilenceLogged_ = false; rxSilenceLogged_ = false;
rxSilence15sLogged_ = false;
} }
void GameHandler::enqueueIncomingPacketFront(network::Packet&& packet) { void GameHandler::enqueueIncomingPacketFront(network::Packet&& packet) {
@ -4568,17 +4570,10 @@ void GameHandler::selectCharacter(uint64_t characterGuid) {
playerRangedCritPct_ = -1.0f; playerRangedCritPct_ = -1.0f;
std::fill(std::begin(playerSpellCritPct_), std::end(playerSpellCritPct_), -1.0f); std::fill(std::begin(playerSpellCritPct_), std::end(playerSpellCritPct_), -1.0f);
std::fill(std::begin(playerCombatRatings_), std::end(playerCombatRatings_), -1); std::fill(std::begin(playerCombatRatings_), std::end(playerCombatRatings_), -1);
if (spellHandler_) spellHandler_->knownSpells_.clear(); if (spellHandler_) spellHandler_->resetAllState();
if (spellHandler_) spellHandler_->spellCooldowns_.clear();
spellFlatMods_.clear(); spellFlatMods_.clear();
spellPctMods_.clear(); spellPctMods_.clear();
actionBar = {}; actionBar = {};
if (spellHandler_) {
spellHandler_->playerAuras_.clear();
spellHandler_->targetAuras_.clear();
spellHandler_->unitAurasCache_.clear();
}
if (spellHandler_) spellHandler_->unitCastStates_.clear();
petGuid_ = 0; petGuid_ = 0;
stableWindowOpen_ = false; stableWindowOpen_ = false;
stableMasterGuid_ = 0; stableMasterGuid_ = 0;
@ -4598,7 +4593,7 @@ void GameHandler::selectCharacter(uint64_t characterGuid) {
pendingQuestAcceptNpcGuids_.clear(); pendingQuestAcceptNpcGuids_.clear();
npcQuestStatus_.clear(); npcQuestStatus_.clear();
if (combatHandler_) combatHandler_->resetAllCombatState(); if (combatHandler_) combatHandler_->resetAllCombatState();
if (spellHandler_) spellHandler_->resetCastState(); // resetCastState() already called inside resetAllState() above
pendingGameObjectInteractGuid_ = 0; pendingGameObjectInteractGuid_ = 0;
lastInteractedGoGuid_ = 0; lastInteractedGoGuid_ = 0;
playerDead_ = false; playerDead_ = false;