feat(Core/Conf): Add config for Realm First! race limit (#26053)

Co-authored-by: sogladev <sogladev@gmail.com>
This commit is contained in:
Robin Gustafsson
2026-06-03 10:39:57 +02:00
committed by GitHub
parent a4dee23e17
commit 36d6cce4bc
4 changed files with 22 additions and 8 deletions

View File

@@ -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
#
###################################################################################################

View File

@@ -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<uint32, 9> 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<uint32, 9> 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)

View File

@@ -693,4 +693,5 @@ void WorldConfig::BuildConfigCache()
// Achievement
SetConfigValue<uint32>(CONFIG_ACHIEVEMENT_REALM_FIRST_KILL_WINDOW, "Achievement.RealmFirstKillWindow", 60);
SetConfigValue<bool>(CONFIG_ACHIEVEMENT_REALM_FIRST_RACE_LIMIT_ONE_PER_CHARACTER, "Achievement.RealmFirstRaceLimitOnePerCharacter", true);
}

View File

@@ -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