From 25bb0751756891139ceabe86c4d29261d51ed63b Mon Sep 17 00:00:00 2001 From: FrancescoBorzi Date: Tue, 2 Jun 2026 18:16:54 +0200 Subject: [PATCH] fix: skip AFK players --- conf/mod-bg-auto-queue.conf.dist | 11 +++++++++++ src/BgAutoQueue.cpp | 12 ++++++++++-- src/BgAutoQueue.h | 2 ++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/conf/mod-bg-auto-queue.conf.dist b/conf/mod-bg-auto-queue.conf.dist index a0b1ab0..149aade 100644 --- a/conf/mod-bg-auto-queue.conf.dist +++ b/conf/mod-bg-auto-queue.conf.dist @@ -130,6 +130,17 @@ BgAutoQueue.CrossFaction = 1 BgAutoQueue.SkipGameMasters = 1 +# +# BgAutoQueue.SkipAFK +# Description: Skip players flagged as AFK in both the warning and the +# queueing, so idle characters are not teleported into a +# battleground. +# Default: 1 - Skip AFK players +# 0 - Include AFK players +# + +BgAutoQueue.SkipAFK = 1 + # # BgAutoQueue.SkipAuras # Description: Comma-separated list of aura (spell) IDs. A player who has diff --git a/src/BgAutoQueue.cpp b/src/BgAutoQueue.cpp index 411c6b9..b44617b 100644 --- a/src/BgAutoQueue.cpp +++ b/src/BgAutoQueue.cpp @@ -110,6 +110,7 @@ void BgAutoQueue::LoadConfig() _crossFaction = sConfigMgr->GetOption("BgAutoQueue.CrossFaction", true); _skipGameMasters = sConfigMgr->GetOption("BgAutoQueue.SkipGameMasters", true); + _skipAfk = sConfigMgr->GetOption("BgAutoQueue.SkipAFK", true); _broadcastMessage = sConfigMgr->GetOption("BgAutoQueue.BroadcastMessage", BG_AUTO_QUEUE_DEFAULT_BROADCAST); _skipAuras.clear(); @@ -131,8 +132,8 @@ void BgAutoQueue::LoadConfig() _warningSent = false; _firstPass = true; - LOG_INFO("module", "mod-bg-auto-queue: enabled={}, levels=[{}-{}], pool size={}, interval={} min, initialDelay={} s, warningLead={} s, crossFaction={}, skipGM={}, skipAuras={}.", - _enabled, _levelMin, _levelMax, _poolRaw.size(), intervalMin, initialDelaySec, warningLeadSec, _crossFaction, _skipGameMasters, _skipAuras.size()); + LOG_INFO("module", "mod-bg-auto-queue: enabled={}, levels=[{}-{}], pool size={}, interval={} min, initialDelay={} s, warningLead={} s, crossFaction={}, skipGM={}, skipAFK={}, skipAuras={}.", + _enabled, _levelMin, _levelMax, _poolRaw.size(), intervalMin, initialDelaySec, warningLeadSec, _crossFaction, _skipGameMasters, _skipAfk, _skipAuras.size()); // Opt-out is stored via the core PlayerSettings system, which only persists // across logins when EnablePlayerSettings is on. Without it, .bgevents @@ -200,6 +201,7 @@ char const* BgAutoQueue::GetSkipReasonLabel(SkipReason reason) case SkipReason::DeathKnightEbonHold: return "Death Knight locked to Ebon Hold"; case SkipReason::GameMaster: return "game master"; case SkipReason::Aura: return "has a configured skip aura"; + case SkipReason::Afk: return "flagged AFK"; case SkipReason::NoBracket: return "no PvP bracket for level"; default: return "unknown"; } @@ -284,6 +286,12 @@ bool BgAutoQueue::IsEligible(Player* player, SkipReason* reason) const return fail(SkipReason::GameMaster); } + if (_skipAfk && player->isAFK()) + { + LOG_DEBUG("module", "mod-bg-auto-queue: skip {}: flagged AFK.", name); + return fail(SkipReason::Afk); + } + for (uint32 auraId : _skipAuras) { if (player->HasAura(auraId)) diff --git a/src/BgAutoQueue.h b/src/BgAutoQueue.h index cbcf8db..2157049 100644 --- a/src/BgAutoQueue.h +++ b/src/BgAutoQueue.h @@ -55,6 +55,7 @@ class BgAutoQueue DeathKnightEbonHold, GameMaster, Aura, // carries one of the configured skip auras + Afk, // flagged AFK NoBracket, // no PvP bracket for the level on the reference map Count }; @@ -154,6 +155,7 @@ class BgAutoQueue uint32 _warningLeadMs = 60u * 1000u; bool _crossFaction = true; bool _skipGameMasters = true; + bool _skipAfk = true; std::vector _skipAuras; // aura ids that exclude a player from a pass std::string _broadcastMessage;