From 82d44f885bb254cb6bcaa24a041df5534006b5bc Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Wed, 15 Jul 2026 02:27:40 +0200 Subject: [PATCH] feat(Core/Account): Implement ACCOUNT_FLAG_DEATH_KNIGHT_OK (#26344) --- src/common/Common.h | 2 +- src/server/game/Handlers/CharacterHandler.cpp | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index a14647b1f..b77fe3760 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -93,7 +93,7 @@ enum AccountFlag ACCOUNT_FLAG_EXPANSION2_COLLECTOR = 0x4000000, // NYI WotLK Collector's Edition ACCOUNT_FLAG_OVERMIND_LINKED = 0x8000000, // NYI Linked with Battle.net account ACCOUNT_FLAG_DEMOS = 0x10000000, // NYI UNK - ACCOUNT_FLAG_DEATH_KNIGHT_OK = 0x20000000, // NYI Has level 55 on account? + ACCOUNT_FLAG_DEATH_KNIGHT_OK = 0x20000000, // Allowed to create Death Knight (account met heroic level requirement on WotLK+) // Below might be StarCraft II related ACCOUNT_FLAG_S2_REQUIRE_IGR = 0x40000000, // NYI UNK ACCOUNT_FLAG_S2_TRIAL = 0x80000000, // NYI UNK diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index d00e00aba..48ed07edc 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -378,7 +378,8 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) // speedup check for heroic class disabled case uint32 req_level_for_heroic = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_HEROIC_CHARACTER); - if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEATH_KNIGHT) && createInfo->Class == CLASS_DEATH_KNIGHT && req_level_for_heroic > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) + if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEATH_KNIGHT) && createInfo->Class == CLASS_DEATH_KNIGHT + && req_level_for_heroic > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) && !HasAccountFlag(ACCOUNT_FLAG_DEATH_KNIGHT_OK)) { SendCharCreate(CHAR_CREATE_LEVEL_REQUIREMENT); return; @@ -445,7 +446,8 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) } bool haveSameRace = false; uint32 heroicReqLevel = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_HEROIC_CHARACTER); - bool hasHeroicReqLevel = (heroicReqLevel == 0); + bool const deathKnightFlagAlreadySet = HasAccountFlag(ACCOUNT_FLAG_DEATH_KNIGHT_OK); // Account flag is superior to level requirement. + bool hasHeroicReqLevel = (heroicReqLevel == 0) || deathKnightFlagAlreadySet; bool allowTwoSideAccounts = !sWorld->IsPvPRealm() || sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ACCOUNTS) || HasPermission(rbac::RBAC_PERM_TWO_SIDE_CHARACTER_CREATION); uint32 skipCinematics = sWorld->getIntConfig(CONFIG_SKIP_CINEMATICS); bool checkDeathKnightReqs = !HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEATH_KNIGHT) && createInfo->Class == CLASS_DEATH_KNIGHT; @@ -534,10 +536,16 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) } } - if (checkDeathKnightReqs && !hasHeroicReqLevel) + if (checkDeathKnightReqs) { - SendCharCreate(CHAR_CREATE_LEVEL_REQUIREMENT); - return; + if (!deathKnightFlagAlreadySet && hasHeroicReqLevel) + UpdateAccountFlag(ACCOUNT_FLAG_DEATH_KNIGHT_OK); + + if (!hasHeroicReqLevel) + { + SendCharCreate(CHAR_CREATE_LEVEL_REQUIREMENT); + return; + } } // Check name uniqueness in the same step as saving to database