aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-05-10 23:29:36 +0200
committerShauren <shauren.trinity@gmail.com>2024-07-19 20:29:13 +0200
commit4e38582c4fca1bdaba487b55c5b581f3acf6cca1 (patch)
treec82265f89f62999b5969a16545d01f5077a9e867 /src
parentf57647287af1f47a1c4a503cde654d6ff8f4261c (diff)
Core/DataStores: Removed hardcoded cap for taxi nodes mask
(cherry picked from commit 376dc7402a41a03b4c5bc718863c1e0eb410ebec)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/DBCStores.cpp20
-rw-r--r--src/server/game/Entities/Player/PlayerTaxi.cpp18
-rw-r--r--src/server/game/Entities/Player/PlayerTaxi.h2
-rw-r--r--src/server/shared/DataStores/DBCEnums.h23
4 files changed, 42 insertions, 21 deletions
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index 075e6139860..7852f71725e 100644
--- a/src/server/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
@@ -589,11 +589,12 @@ void LoadDBCStores(const std::string& dataPath)
if (sInfo->Effect[j] == SPELL_EFFECT_SEND_TAXI)
spellPaths.insert(sInfo->EffectMiscValue[j]);
- sTaxiNodesMask.fill(0);
- sOldContinentsNodesMask.fill(0);
- sHordeTaxiNodesMask.fill(0);
- sAllianceTaxiNodesMask.fill(0);
- sDeathKnightTaxiNodesMask.fill(0);
+ // reinitialize internal storage for globals after loading TaxiNodes.db2
+ sTaxiNodesMask = {};
+ sOldContinentsNodesMask = {};
+ sHordeTaxiNodesMask = {};
+ sAllianceTaxiNodesMask = {};
+ sDeathKnightTaxiNodesMask = {};
for (TaxiNodesEntry const* node : sTaxiNodesStore)
{
TaxiPathSetBySource::const_iterator src_i = sTaxiPathSetBySource.find(node->ID);
@@ -985,3 +986,12 @@ EmotesTextSoundEntry const* FindTextSoundEmoteFor(uint32 emote, uint32 race, uin
auto itr = sEmotesTextSoundMap.find(EmotesTextSoundKey(emote, race, gender));
return itr != sEmotesTextSoundMap.end() ? itr->second : nullptr;
}
+
+TaxiMask::TaxiMask()
+{
+ if (sTaxiNodesStore.GetNumRows())
+ {
+ _data.resize((sTaxiNodesStore.GetNumRows() + (8 * sizeof(uint64) - 1)) / (8 * sizeof(uint64)) * (sizeof(uint64) / sizeof(value_type)), 0);
+ ASSERT((_data.size() % (8 / sizeof(value_type))) == 0, "TaxiMask byte size must be aligned to a multiple of uint64");
+ }
+}
diff --git a/src/server/game/Entities/Player/PlayerTaxi.cpp b/src/server/game/Entities/Player/PlayerTaxi.cpp
index 6c7d262baca..303ffdeff84 100644
--- a/src/server/game/Entities/Player/PlayerTaxi.cpp
+++ b/src/server/game/Entities/Player/PlayerTaxi.cpp
@@ -29,7 +29,7 @@ void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level
{
case CLASS_DEATH_KNIGHT:
{
- for (uint8 i = 0; i < TaxiMaskSize; ++i)
+ for (std::size_t i = 0; i < m_taximask.size(); ++i)
m_taximask[i] |= sOldContinentsNodesMask[i];
break;
}
@@ -66,7 +66,7 @@ bool PlayerTaxi::LoadTaxiMask(std::string const& data)
{
bool warn = false;
std::vector<std::string_view> tokens = Trinity::Tokenize(data, ' ', false);
- for (uint8 index = 0; (index < TaxiMaskSize) && (index < tokens.size()); ++index)
+ for (size_t index = 0; (index < m_taximask.size()) && (index < tokens.size()); ++index)
{
if (Optional<uint32> mask = Trinity::StringTo<uint32>(tokens[index]))
{
@@ -87,15 +87,9 @@ bool PlayerTaxi::LoadTaxiMask(std::string const& data)
void PlayerTaxi::AppendTaximaskTo(ByteBuffer& data, bool all)
{
if (all)
- {
- for (uint8 i = 0; i < TaxiMaskSize; ++i)
- data << uint32(sTaxiNodesMask[i]); // all existing nodes
- }
+ data.append(sTaxiNodesMask.data(), sTaxiNodesMask.size()); // all existing nodes
else
- {
- for (uint8 i = 0; i < TaxiMaskSize; ++i)
- data << uint32(m_taximask[i]); // known nodes
- }
+ data.append(m_taximask.data(), m_taximask.size()); // known nodes
}
bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, uint32 team)
@@ -176,8 +170,8 @@ uint32 PlayerTaxi::GetCurrentTaxiPath() const
std::ostringstream& operator<<(std::ostringstream& ss, PlayerTaxi const& taxi)
{
- for (uint8 i = 0; i < TaxiMaskSize; ++i)
- ss << taxi.m_taximask[i] << ' ';
+ for (std::size_t i = 0; i < taxi.m_taximask.size(); ++i)
+ ss << uint32(taxi.m_taximask[i]) << ' ';
return ss;
}
diff --git a/src/server/game/Entities/Player/PlayerTaxi.h b/src/server/game/Entities/Player/PlayerTaxi.h
index 305d84b2e18..8fe480b9d07 100644
--- a/src/server/game/Entities/Player/PlayerTaxi.h
+++ b/src/server/game/Entities/Player/PlayerTaxi.h
@@ -30,7 +30,7 @@ struct FactionTemplateEntry;
class TC_GAME_API PlayerTaxi
{
public:
- PlayerTaxi() : m_flightMasterFactionId(0) { m_taximask.fill(0); }
+ PlayerTaxi() : m_flightMasterFactionId(0) { }
~PlayerTaxi() { }
// Nodes
void InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level);
diff --git a/src/server/shared/DataStores/DBCEnums.h b/src/server/shared/DataStores/DBCEnums.h
index b87252b6e1d..f928465dfc3 100644
--- a/src/server/shared/DataStores/DBCEnums.h
+++ b/src/server/shared/DataStores/DBCEnums.h
@@ -19,7 +19,7 @@
#define DBCENUMS_H
#include "Define.h"
-#include <array>
+#include <vector>
#pragma pack(push, 1)
@@ -433,8 +433,25 @@ enum SummonPropFlags
#define MAX_PET_TALENT_RANK 3 // use in calculations, expected <= MAX_TALENT_RANK
#define MAX_TALENT_TABS 3
-static constexpr size_t TaxiMaskSize = 14;
-typedef std::array<uint32, TaxiMaskSize> TaxiMask;
+class TaxiMask
+{
+public:
+ using value_type = uint32;
+
+ TaxiMask();
+
+ value_type& operator[](size_t i) { return _data[i]; }
+ value_type const& operator[](size_t i) const { return _data[i]; }
+
+ size_t size() const { return _data.size(); }
+ value_type const* data() const { return _data.data(); }
+
+ decltype(auto) begin() { return _data.begin(); }
+ decltype(auto) end() { return _data.end(); }
+
+private:
+ std::vector<value_type> _data;
+};
enum TotemCategoryType
{