From 0dad79352d9229f0f625fc51341a74d9067ac649 Mon Sep 17 00:00:00 2001 From: Sevi Date: Sun, 15 Feb 2026 10:06:53 +0100 Subject: [PATCH 1/2] Core/Player: Fix MAX_TITLE_INDEX calculation for title mask --- src/server/game/Entities/Player/Player.cpp | 4 +++- src/server/game/Entities/Player/Player.h | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0736b3bc01..a117efd088 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24916,7 +24916,9 @@ bool Player::isTotalImmune() const bool Player::HasTitle(uint32 bitIndex) const { - if (bitIndex > MAX_TITLE_INDEX) + // bitIndex is zero-based inside PLAYER__FIELD_KNOWN_TITLES. + // MAX_TITLE_INDEX is the total number of available bits (valid range: [0, MAX_TITLE_INDEX)). + if (bitIndex >= MAX_TITLE_INDEX) return false; uint32 fieldIndexOffset = bitIndex / 32; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 029336b855..97686148cf 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -479,8 +479,11 @@ static_assert((PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID & 1) == 0, "PLAYER constexpr uint8 PLAYER_BYTES_2_OVERRIDE_SPELLS_UINT16_OFFSET = PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID / 2; -constexpr uint8 KNOWN_TITLES_SIZE = 4; -constexpr uint32 MAX_TITLE_INDEX = KNOWN_TITLES_SIZE * sizeof(uint64); // 4 uint64 fields +// PLAYER__FIELD_KNOWN_TITLES consists of 4 uint64 blocks (64 bits each). +// Total available title bits = KNOWN_TITLES_SIZE * 64. +constexpr uint32 KNOWN_TITLES_SIZE = 4; +constexpr uint32 BITS_PER_TITLE_BLOCK = sizeof(uint64) * 8; +constexpr uint32 MAX_TITLE_INDEX = KNOWN_TITLES_SIZE * BITS_PER_TITLE_BLOCK; // used in PLAYER_FIELD_BYTES values enum PlayerFieldByteFlags From eef11e1061d6ff0c5b505b075f5f4f039dc77e9b Mon Sep 17 00:00:00 2001 From: Sevi Date: Wed, 18 Feb 2026 21:30:11 +0100 Subject: [PATCH 2/2] Core/Player: Replace sizeof-based bit calculation with explicit 64 --- src/server/game/Entities/Player/Player.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 97686148cf..3ae5783617 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -479,11 +479,9 @@ static_assert((PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID & 1) == 0, "PLAYER constexpr uint8 PLAYER_BYTES_2_OVERRIDE_SPELLS_UINT16_OFFSET = PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID / 2; -// PLAYER__FIELD_KNOWN_TITLES consists of 4 uint64 blocks (64 bits each). -// Total available title bits = KNOWN_TITLES_SIZE * 64. -constexpr uint32 KNOWN_TITLES_SIZE = 4; -constexpr uint32 BITS_PER_TITLE_BLOCK = sizeof(uint64) * 8; -constexpr uint32 MAX_TITLE_INDEX = KNOWN_TITLES_SIZE * BITS_PER_TITLE_BLOCK; +// KNOWN_TITLES is stored in 4 uint64 values, so we can represent 256 title bits (4 * 64). +constexpr uint8 KNOWN_TITLES_SIZE = 4; +constexpr uint32 MAX_TITLE_INDEX = KNOWN_TITLES_SIZE * 64; // used in PLAYER_FIELD_BYTES values enum PlayerFieldByteFlags