diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DataStores/DBCStores.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Entities/Player/PlayerTaxi.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Entities/Player/PlayerTaxi.h | 2 | ||||
-rw-r--r-- | src/server/shared/DataStores/DBCEnums.h | 23 |
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 { |