From 04fbeec3c270bd58ec7a29ef873635c7e138ad8b Mon Sep 17 00:00:00 2001 From: Kevin Gross Date: Sun, 8 Mar 2026 09:32:56 -0300 Subject: [PATCH] feat(Core/Achievements): Add configurable realm first kill time window (#24920) --- .../apps/worldserver/worldserver.conf.dist | 17 +++++++++++++++++ src/server/game/Achievements/AchievementMgr.cpp | 12 ++++++++++-- src/server/game/World/WorldConfig.cpp | 3 +++ src/server/game/World/WorldConfig.h | 1 + 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 5f322f9ad..e59978780 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -34,6 +34,7 @@ # CHARACTER DELETE # CHARACTER CREATION # CHARACTER +# ACHIEVEMENT # SKILL # STATS # REPUTATION @@ -2225,6 +2226,22 @@ SpellQueue.Window = 400 # ################################################################################################### +################################################################################################### +# ACHIEVEMENT +# +# Achievement.RealmFirstKillWindow +# Description: Time window (in seconds) for realm first kill achievements after the first +# completion. This setting controls whether multiple groups can earn the +# realm first kill achievement within a short time window. +# Default: 60 - (Allow additional groups to complete within 60 seconds/1 minute) +# 0 - (Strict mode, only the first group/player gets the achievement) +# 1+ - (Extended window, allow N seconds for additional completions) + +Achievement.RealmFirstKillWindow = 60 + +# +################################################################################################### + ################################################################################################### # SKILL # diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index a3823112b..29628f1f8 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -28,6 +28,7 @@ #include "DBCEnums.h" #include "DatabaseEnv.h" #include "DisableMgr.h" +#include "Duration.h" #include "GameEventMgr.h" #include "GameTime.h" #include "GridNotifiersImpl.h" @@ -2592,11 +2593,18 @@ bool AchievementGlobalMgr::IsRealmCompleted(AchievementEntry const* achievement) if (itr->second == SystemTimePoint::max()) return true; - // Allow completing the realm first kill for entire minute after first person did it + // Allow completing the realm first kill for configurable time window after first person did it // it may allow more than one group to achieve it (highly unlikely) // but apparently this is how blizz handles it as well if (achievement->flags & ACHIEVEMENT_FLAG_REALM_FIRST_KILL) - return (GameTime::GetSystemTime() - itr->second) > 1min; + { + Seconds windowSeconds = Seconds(sWorld->getIntConfig(CONFIG_ACHIEVEMENT_REALM_FIRST_KILL_WINDOW)); + + if (windowSeconds == 0s) + return true; + + return (GameTime::GetSystemTime() - itr->second) > windowSeconds; + } sScriptMgr->SetRealmCompleted(achievement); diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp index adfed5cc1..b30587974 100644 --- a/src/server/game/World/WorldConfig.cpp +++ b/src/server/game/World/WorldConfig.cpp @@ -674,4 +674,7 @@ void WorldConfig::BuildConfigCache() SetConfigValue(CONFIG_SCOURGEINVASION_COUNTER_THIRD, "ScourgeInvasion.CounterThird", 150); SetConfigValue(CONFIG_NEW_CHAR_STRING, "PlayerStart.String", ""); + + // Achievement + SetConfigValue(CONFIG_ACHIEVEMENT_REALM_FIRST_KILL_WINDOW, "Achievement.RealmFirstKillWindow", 60); } diff --git a/src/server/game/World/WorldConfig.h b/src/server/game/World/WorldConfig.h index fe3b9162f..0e4480af2 100644 --- a/src/server/game/World/WorldConfig.h +++ b/src/server/game/World/WorldConfig.h @@ -489,6 +489,7 @@ enum ServerConfigs RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, CONFIG_NEW_CHAR_STRING, CONFIG_VALIDATE_SKILL_LEARNED_BY_SPELLS, + CONFIG_ACHIEVEMENT_REALM_FIRST_KILL_WINDOW, MAX_NUM_SERVER_CONFIGS };