From 36d6cce4bc565b2631482ffadfc4863f89ecc5b0 Mon Sep 17 00:00:00 2001 From: Robin Gustafsson Date: Wed, 3 Jun 2026 10:39:57 +0200 Subject: [PATCH] feat(Core/Conf): Add config for Realm First! race limit (#26053) Co-authored-by: sogladev --- .../apps/worldserver/worldserver.conf.dist | 9 +++++++++ .../game/Achievements/AchievementMgr.cpp | 19 +++++++++++-------- src/server/game/World/WorldConfig.cpp | 1 + src/server/game/World/WorldConfig.h | 1 + 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index aa9c0eda3..35e2a64b8 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -2260,6 +2260,15 @@ SpellQueue.Window = 400 Achievement.RealmFirstKillWindow = 60 +# +# Achievement.RealmFirstRaceLimitOnePerCharacter +# Description: Limit 'Realm First!' race achievements to one per character. Prevents abuse +# of the race/faction change service to obtain multiple achievements. +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Achievement.RealmFirstRaceLimitOnePerCharacter = 1 + # ################################################################################################### diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index f0aa9da38..e27ec45f2 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1834,14 +1834,17 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve if (sAchievementMgr->IsRealmCompleted(achievement)) return false; - // A character may only have 1 race-specific 'Realm First!' achievement - // prevent clever use of the race/faction change service to obtain multiple 'Realm First!' achievements - constexpr std::array raceSpecificRealmFirstAchievements { 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413 }; - bool isRaceSpecific = std::ranges::find(raceSpecificRealmFirstAchievements, achievement->ID) != std::ranges::end(raceSpecificRealmFirstAchievements); - if (isRaceSpecific) - for (uint32 raceAchievementId : raceSpecificRealmFirstAchievements) - if (raceAchievementId != achievement->ID && HasAchieved(raceAchievementId)) - return false; + if (sWorld->getBoolConfig(CONFIG_ACHIEVEMENT_REALM_FIRST_RACE_LIMIT_ONE_PER_CHARACTER)) + { + // A character may only have 1 race-specific 'Realm First!' achievement + // prevent clever use of the race/faction change service to obtain multiple 'Realm First!' achievements + constexpr std::array raceSpecificRealmFirstAchievements { 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413 }; + bool isRaceSpecific = std::ranges::find(raceSpecificRealmFirstAchievements, achievement->ID) != std::ranges::end(raceSpecificRealmFirstAchievements); + if (isRaceSpecific) + for (uint32 raceAchievementId : raceSpecificRealmFirstAchievements) + if (raceAchievementId != achievement->ID && HasAchieved(raceAchievementId)) + return false; + } } // pussywizard: progress will be deleted after getting the achievement (optimization) diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp index f1cf5803c..fce621980 100644 --- a/src/server/game/World/WorldConfig.cpp +++ b/src/server/game/World/WorldConfig.cpp @@ -693,4 +693,5 @@ void WorldConfig::BuildConfigCache() // Achievement SetConfigValue(CONFIG_ACHIEVEMENT_REALM_FIRST_KILL_WINDOW, "Achievement.RealmFirstKillWindow", 60); + SetConfigValue(CONFIG_ACHIEVEMENT_REALM_FIRST_RACE_LIMIT_ONE_PER_CHARACTER, "Achievement.RealmFirstRaceLimitOnePerCharacter", true); } diff --git a/src/server/game/World/WorldConfig.h b/src/server/game/World/WorldConfig.h index b9e79c95f..dda89b786 100644 --- a/src/server/game/World/WorldConfig.h +++ b/src/server/game/World/WorldConfig.h @@ -499,6 +499,7 @@ enum ServerConfigs CONFIG_NEW_CHAR_STRING, CONFIG_VALIDATE_SKILL_LEARNED_BY_SPELLS, CONFIG_ACHIEVEMENT_REALM_FIRST_KILL_WINDOW, + CONFIG_ACHIEVEMENT_REALM_FIRST_RACE_LIMIT_ONE_PER_CHARACTER, CONFIG_CHATLOG_ENABLED, MAX_NUM_SERVER_CONFIGS