aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-07-17 20:23:37 +0200
committerShauren <shauren.trinity@gmail.com>2022-07-17 20:23:37 +0200
commitcb99b08b86f8773563276bf16ccc2210003b056b (patch)
tree9284c0abae36e5f779b97b968463de4a9d86db8f
parentb8e52fd90bdab6e720d13e44c64483945e139fa2 (diff)
Core/Players: Fixed ExploredZones size and PLAYER_EXPLORED_ZONES_SIZE desync
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp8
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp2
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateField.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp9
-rw-r--r--src/server/game/Entities/Player/Player.h6
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp4
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp8
7 files changed, 21 insertions, 18 deletions
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index 92390429997..02be080a4a7 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -1526,11 +1526,11 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis
if (area->AreaBit < 0)
continue;
- uint16 playerIndexOffset = uint16(uint32(area->AreaBit) / 64);
+ size_t playerIndexOffset = size_t(area->AreaBit) / PLAYER_EXPLORED_ZONES_BITS;
if (playerIndexOffset >= PLAYER_EXPLORED_ZONES_SIZE)
continue;
- uint64 mask = uint64(1) << (area->AreaBit % 64);
+ uint64 mask = uint64(1) << (area->AreaBit % PLAYER_EXPLORED_ZONES_BITS);
if (referencePlayer->m_activePlayerData->ExploredZones[playerIndexOffset] & mask)
{
matchFound = true;
@@ -2271,10 +2271,10 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6
return false;
if (areaTable->AreaBit <= 0)
break; // success
- uint32 playerIndexOffset = uint32(areaTable->AreaBit) / 64;
+ size_t playerIndexOffset = size_t(areaTable->AreaBit) / PLAYER_EXPLORED_ZONES_BITS;
if (playerIndexOffset >= PLAYER_EXPLORED_ZONES_SIZE)
break;
- if (!(referencePlayer->m_activePlayerData->ExploredZones[playerIndexOffset] & (UI64LIT(1) << (areaTable->AreaBit % 64))))
+ if (!(referencePlayer->m_activePlayerData->ExploredZones[playerIndexOffset] & (UI64LIT(1) << (areaTable->AreaBit % PLAYER_EXPLORED_ZONES_BITS))))
return false;
break;
}
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index bdb20ae9ba8..c0be07a60d9 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -3179,7 +3179,7 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio
{
for (std::size_t i = 0; i < condition->Explored.size(); ++i)
if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(condition->Explored[i]))
- if (area->AreaBit != -1 && !(player->m_activePlayerData->ExploredZones[area->AreaBit / 64] & (UI64LIT(1) << (uint32(area->AreaBit) % 64))))
+ if (area->AreaBit != -1 && !(player->m_activePlayerData->ExploredZones[area->AreaBit / PLAYER_EXPLORED_ZONES_BITS] & (UI64LIT(1) << (uint32(area->AreaBit) % PLAYER_EXPLORED_ZONES_BITS))))
return false;
}
diff --git a/src/server/game/Entities/Object/Updates/UpdateField.h b/src/server/game/Entities/Object/Updates/UpdateField.h
index 877c2b72ec8..9ad32f62d78 100644
--- a/src/server/game/Entities/Object/Updates/UpdateField.h
+++ b/src/server/game/Entities/Object/Updates/UpdateField.h
@@ -751,7 +751,7 @@ namespace UF
return std::end(_values);
}
- std::size_t size() const
+ constexpr std::size_t size() const
{
return Size;
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 1a5bcf8156e..96f375f3590 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6216,7 +6216,7 @@ void Player::CheckAreaExploreAndOutdoor()
return;
}
- uint32 offset = areaEntry->AreaBit / 64;
+ uint32 offset = areaEntry->AreaBit / PLAYER_EXPLORED_ZONES_BITS;
if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
{
@@ -6225,7 +6225,7 @@ void Player::CheckAreaExploreAndOutdoor()
return;
}
- uint64 val = UI64LIT(1) << (areaEntry->AreaBit % 64);
+ uint64 val = UI64LIT(1) << (areaEntry->AreaBit % PLAYER_EXPLORED_ZONES_BITS);
uint64 currFields = m_activePlayerData->ExploredZones[offset];
if (!(currFields & val))
@@ -17419,9 +17419,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol
SetXP(fields.xp);
std::vector<std::string_view> exploredZones = Trinity::Tokenize(fields.exploredZones, ' ', false);
- if (exploredZones.size() == PLAYER_EXPLORED_ZONES_SIZE * 2)
- for (std::size_t i = 0; i < exploredZones.size(); ++i)
- SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ExploredZones, i / 2),
+ for (std::size_t i = 0; i < exploredZones.size() && i / 2 < PLAYER_EXPLORED_ZONES_SIZE; ++i)
+ SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ExploredZones, i / 2),
Trinity::StringTo<uint64>(exploredZones[i]).value_or(UI64LIT(0)) << (32 * (i % 2)));
std::vector<std::string_view> knownTitles = Trinity::Tokenize(fields.knownTitles, ' ', false);
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index d12f15ce881..228af299a99 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -141,7 +141,11 @@ enum SkillFieldOffset : uint16
SKILL_PERM_BONUS_OFFSET = SKILL_TEMP_BONUS_OFFSET + CalculateSkillFieldArraySize<uint16>()
};
-#define PLAYER_EXPLORED_ZONES_SIZE 192
+enum PlayerExplorationConstants
+{
+ PLAYER_EXPLORED_ZONES_SIZE = decltype(UF::ActivePlayerData::ExploredZones){}.size(),
+ PLAYER_EXPLORED_ZONES_BITS = sizeof(decltype(UF::ActivePlayerData::ExploredZones)::value_type) * 8
+};
enum SpellModType : uint8
{
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 214e6aefcaa..57ccbefaf6a 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -1301,8 +1301,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder const& holder)
// start with every map explored
if (sWorld->getBoolConfig(CONFIG_START_ALL_EXPLORED))
{
- for (uint16 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
- pCurrChar->SetUpdateFieldValue(pCurrChar->m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ExploredZones, i), UI64LIT(0xFFFFFFFFFFFFFFFF));
+ for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
+ pCurrChar->AddExploredZones(i, UI64LIT(0xFFFFFFFFFFFFFFFF));
}
// Max relevant reputations if "StartAllReputation" is enabled
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index cf9d34bfa1c..ceec104b317 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1127,7 +1127,7 @@ public:
return false;
}
- uint32 offset = area->AreaBit / 64;
+ uint32 offset = area->AreaBit / PLAYER_EXPLORED_ZONES_BITS;
if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
{
handler->SendSysMessage(LANG_BAD_VALUE);
@@ -1135,7 +1135,7 @@ public:
return false;
}
- uint64 val = UI64LIT(1) << (area->AreaBit % 64);
+ uint64 val = UI64LIT(1) << (area->AreaBit % PLAYER_EXPLORED_ZONES_BITS);
playerTarget->AddExploredZones(offset, val);
handler->SendSysMessage(LANG_EXPLORE_AREA);
@@ -1167,7 +1167,7 @@ public:
return false;
}
- uint32 offset = area->AreaBit / 64;
+ uint32 offset = area->AreaBit / PLAYER_EXPLORED_ZONES_BITS;
if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
{
handler->SendSysMessage(LANG_BAD_VALUE);
@@ -1175,7 +1175,7 @@ public:
return false;
}
- uint64 val = UI64LIT(1) << (area->AreaBit % 64);
+ uint64 val = UI64LIT(1) << (area->AreaBit % PLAYER_EXPLORED_ZONES_BITS);
playerTarget->RemoveExploredZones(offset, val);
handler->SendSysMessage(LANG_UNEXPLORE_AREA);