From fffdb31c050474d46013c882f77e657db27c2bf9 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 25 Oct 2021 05:17:12 -0300 Subject: [PATCH] =?UTF-8?q?feat(Core/LFG):=20move=20the=20LFG=20max=20kick?= =?UTF-8?q?=20count=20&=20kick=20prevention=20timers=20=E2=80=A6=20(#8683)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/DungeonFinding/LFGGroupData.cpp | 6 +++--- src/server/game/DungeonFinding/LFGGroupData.h | 6 ------ src/server/game/Entities/Player/Player.cpp | 8 ++++++-- src/server/game/Handlers/GroupHandler.cpp | 6 +++++- src/server/game/World/IWorld.h | 2 ++ src/server/game/World/World.cpp | 15 +++++++++++++++ src/server/worldserver/worldserver.conf.dist | 16 ++++++++++++++++ 7 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/server/game/DungeonFinding/LFGGroupData.cpp b/src/server/game/DungeonFinding/LFGGroupData.cpp index 59d7a4257..bfe6528ca 100644 --- a/src/server/game/DungeonFinding/LFGGroupData.cpp +++ b/src/server/game/DungeonFinding/LFGGroupData.cpp @@ -17,12 +17,12 @@ #include "LFG.h" #include "LFGGroupData.h" +#include "World.h" namespace lfg { - LfgGroupData::LfgGroupData(): m_State(LFG_STATE_NONE), m_OldState(LFG_STATE_NONE), - m_Dungeon(0), m_KicksLeft(LFG_GROUP_MAX_KICKS) + m_Dungeon(0), m_KicksLeft(sWorld->getIntConfig(CONFIG_LFG_MAX_KICK_COUNT)) { } LfgGroupData::~LfgGroupData() @@ -39,7 +39,7 @@ namespace lfg { case LFG_STATE_NONE: m_Dungeon = 0; - m_KicksLeft = LFG_GROUP_MAX_KICKS; + m_KicksLeft = sWorld->getIntConfig(CONFIG_LFG_MAX_KICK_COUNT); [[fallthrough]]; case LFG_STATE_FINISHED_DUNGEON: case LFG_STATE_DUNGEON: diff --git a/src/server/game/DungeonFinding/LFGGroupData.h b/src/server/game/DungeonFinding/LFGGroupData.h index 4f66c0b82..8c31e6441 100644 --- a/src/server/game/DungeonFinding/LFGGroupData.h +++ b/src/server/game/DungeonFinding/LFGGroupData.h @@ -22,12 +22,6 @@ namespace lfg { - - enum LfgGroupEnum - { - LFG_GROUP_MAX_KICKS = 2, - }; - /** Stores all lfg data needed about a group. */ diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9d50b5646..1835293e9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -12183,9 +12183,13 @@ PartyResult Player::CanUninviteFromGroup(ObjectGuid targetPlayerGUID) const if (Player* target = ObjectAccessor::FindConnectedPlayer(targetPlayerGUID)) { - if (target->HasAura(lfg::LFG_SPELL_DUNGEON_COOLDOWN)) + if (Aura* dungeonCooldownAura = target->GetAura(lfg::LFG_SPELL_DUNGEON_COOLDOWN)) { - return ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S; + int32 elapsedTime = dungeonCooldownAura->GetMaxDuration() - dungeonCooldownAura->GetDuration(); + if (static_cast(sWorld->getIntConfig(CONFIG_LFG_KICK_PREVENTION_TIMER)) > elapsedTime) + { + return ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S; + } } } diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 56bcaf028..0b5f1a505 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -340,7 +340,11 @@ void WorldSession::HandleGroupUninviteGuidOpcode(WorldPacket& recvData) { if (Aura* dungeonCooldownAura = kickTarget->GetAura(lfg::LFG_SPELL_DUNGEON_COOLDOWN)) { - SendPartyResult(PARTY_OP_UNINVITE, name, res, dungeonCooldownAura->GetDuration() / 1000); + int32 elapsedTime = dungeonCooldownAura->GetMaxDuration() - dungeonCooldownAura->GetDuration(); + if (static_cast(sWorld->getIntConfig(CONFIG_LFG_KICK_PREVENTION_TIMER)) > elapsedTime) + { + SendPartyResult(PARTY_OP_UNINVITE, name, res, (sWorld->getIntConfig(CONFIG_LFG_KICK_PREVENTION_TIMER) - elapsedTime) / 1000); + } } } } else diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index 45649fe67..fc080d96e 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -390,6 +390,8 @@ enum WorldIntConfigs CONFIG_NPC_REGEN_TIME_IF_NOT_REACHABLE_IN_RAID, CONFIG_FFA_PVP_TIMER, CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION, + CONFIG_LFG_MAX_KICK_COUNT, + CONFIG_LFG_KICK_PREVENTION_TIMER, INT_CONFIG_VALUE_COUNT }; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index af9bdaf15..2e9f23716 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1419,6 +1419,21 @@ void World::LoadConfigSettings(bool reload) // Specifies if IP addresses can be logged to the database m_bool_configs[CONFIG_ALLOW_LOGGING_IP_ADDRESSES_IN_DATABASE] = sConfigMgr->GetOption("AllowLoggingIPAddressesInDatabase", true, true); + // LFG group mechanics. + m_int_configs[CONFIG_LFG_MAX_KICK_COUNT] = sConfigMgr->GetOption("LFG.MaxKickCount", 2); + if (m_int_configs[CONFIG_LFG_MAX_KICK_COUNT] > 3) + { + m_int_configs[CONFIG_LFG_MAX_KICK_COUNT] = 3; + LOG_ERROR("server.loading", "LFG.MaxKickCount can't be higher than 3."); + } + + m_int_configs[CONFIG_LFG_KICK_PREVENTION_TIMER] = sConfigMgr->GetOption("LFG.KickPreventionTimer", 15 * MINUTE * IN_MILLISECONDS) * IN_MILLISECONDS; + if (m_int_configs[CONFIG_LFG_KICK_PREVENTION_TIMER] > 15 * MINUTE * IN_MILLISECONDS) + { + m_int_configs[CONFIG_LFG_KICK_PREVENTION_TIMER] = 15 * MINUTE * IN_MILLISECONDS; + LOG_ERROR("server.loading", "LFG.KickPreventionTimer can't be higher than 15 minutes."); + } + // call ScriptMgr if we're reloading the configuration sScriptMgr->OnAfterConfigLoad(reload); } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 38b551866..328e5af37 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -3570,6 +3570,22 @@ FFAPvPTimer = 30 LootNeedBeforeGreedILvlRestriction = 70 +# +# LFG.MaxKickCount +# Description: Specify the maximum number of kicks allowed in LFG groups (max 3 kicks) +# Default: 2 +# 0 - Disabled (kicks are never allowed) + +LFG.MaxKickCount = 2 + +# +# LFG.KickPreventionTimer +# Description: Specify for how long players are prevented from being kicked after just joining LFG groups +# Default: 900 secs (15 minutes) +# 0 - Disabled + +LFG.KickPreventionTimer = 900 + # ###################################################################################################