diff options
| -rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 50 | ||||
| -rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 23 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/PlayerTaxi.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/PlayerTaxi.h | 2 | ||||
| -rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Handlers/TaxiHandler.cpp | 3 |
6 files changed, 47 insertions, 39 deletions
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index c270088fc76..0d8cf894826 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -1520,40 +1520,27 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul // Initialize global taxinodes mask // include existed nodes that have at least single not spell base (scripted) path + for (TaxiNodesEntry const* node : sTaxiNodesStore) { - if (sTaxiNodesStore.GetNumRows()) - { - ASSERT(TaxiMaskSize >= ((sTaxiNodesStore.GetNumRows() - 1) / 8) + 1, - "TaxiMaskSize is not large enough to contain all taxi nodes! (current value %d, required %d)", - TaxiMaskSize, (((sTaxiNodesStore.GetNumRows() - 1) / 8) + 1)); - } - - sTaxiNodesMask.fill(0); - sOldContinentsNodesMask.fill(0); - sHordeTaxiNodesMask.fill(0); - sAllianceTaxiNodesMask.fill(0); - for (TaxiNodesEntry const* node : sTaxiNodesStore) - { - if (!(node->Flags & (TAXI_NODE_FLAG_ALLIANCE | TAXI_NODE_FLAG_HORDE))) - continue; + if (!(node->Flags & (TAXI_NODE_FLAG_ALLIANCE | TAXI_NODE_FLAG_HORDE))) + continue; - // valid taxi network node - uint32 field = uint32((node->ID - 1) / 8); - uint32 submask = 1 << ((node->ID - 1) % 8); + // valid taxi network node + uint32 field = uint32((node->ID - 1) / (sizeof(TaxiMask::value_type) * 8)); + TaxiMask::value_type submask = TaxiMask::value_type(1 << ((node->ID - 1) % (sizeof(TaxiMask::value_type) * 8))); - sTaxiNodesMask[field] |= submask; - if (node->Flags & TAXI_NODE_FLAG_HORDE) - sHordeTaxiNodesMask[field] |= submask; - if (node->Flags & TAXI_NODE_FLAG_ALLIANCE) - sAllianceTaxiNodesMask[field] |= submask; + sTaxiNodesMask[field] |= submask; + if (node->Flags & TAXI_NODE_FLAG_HORDE) + sHordeTaxiNodesMask[field] |= submask; + if (node->Flags & TAXI_NODE_FLAG_ALLIANCE) + sAllianceTaxiNodesMask[field] |= submask; - int32 uiMapId = -1; - if (!GetUiMapPosition(node->Pos.X, node->Pos.Y, node->Pos.Z, node->ContinentID, 0, 0, 0, UI_MAP_SYSTEM_ADVENTURE, false, &uiMapId)) - GetUiMapPosition(node->Pos.X, node->Pos.Y, node->Pos.Z, node->ContinentID, 0, 0, 0, UI_MAP_SYSTEM_TAXI, false, &uiMapId); + int32 uiMapId = -1; + if (!GetUiMapPosition(node->Pos.X, node->Pos.Y, node->Pos.Z, node->ContinentID, 0, 0, 0, UI_MAP_SYSTEM_ADVENTURE, false, &uiMapId)) + GetUiMapPosition(node->Pos.X, node->Pos.Y, node->Pos.Z, node->ContinentID, 0, 0, 0, UI_MAP_SYSTEM_TAXI, false, &uiMapId); - if (uiMapId == 985 || uiMapId == 986) - sOldContinentsNodesMask[field] |= submask; - } + if (uiMapId == 985 || uiMapId == 986) + sOldContinentsNodesMask[field] |= submask; } TC_LOG_INFO("server.loading", ">> Initialized " SZFMTD " DB2 data stores in %u ms", _stores.size(), GetMSTimeDiffToNow(oldMSTime)); @@ -3400,6 +3387,11 @@ bool ItemLevelSelectorQualityEntryComparator::Compare(ItemLevelSelectorQualityEn return left->Quality < right->Quality; } +TaxiMask::TaxiMask() +{ + _data.resize(((sTaxiNodesStore.GetNumRows() - 1) / (sizeof(value_type) * 8)) + 1, 0); +} + bool DB2Manager::FriendshipRepReactionEntryComparator::Compare(FriendshipRepReactionEntry const* left, FriendshipRepReactionEntry const* right) { return left->ReactionThreshold < right->ReactionThreshold; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index bd6b9d4cb15..e67268837f8 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -20,7 +20,7 @@ #include "Define.h" #include "EnumFlag.h" -#include <array> +#include <vector> #pragma pack(push, 1) @@ -1579,8 +1579,25 @@ enum class SpellVisualEffectNameType : uint32 UnitItemRangedIgnoreDisarmed = 10 }; -#define TaxiMaskSize 345 -typedef std::array<uint8, TaxiMaskSize> TaxiMask; +class TaxiMask +{ +public: + using value_type = uint8; + + 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 { diff --git a/src/server/game/Entities/Player/PlayerTaxi.cpp b/src/server/game/Entities/Player/PlayerTaxi.cpp index 37a4b8fe22c..e269fd3f7df 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.cpp +++ b/src/server/game/Entities/Player/PlayerTaxi.cpp @@ -31,7 +31,7 @@ void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level { case CLASS_DEATH_KNIGHT: { - for (std::size_t i = 0; i < TaxiMaskSize; ++i) + for (std::size_t i = 0; i < m_taximask.size(); ++i) m_taximask[i] |= sOldContinentsNodesMask[i] & factionMask[i]; break; } @@ -99,7 +99,7 @@ bool PlayerTaxi::LoadTaxiMask(std::string const& data) { bool warn = false; std::vector<std::string_view> tokens = Trinity::Tokenize(data, ' ', false); - for (size_t 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])) { @@ -209,7 +209,7 @@ uint32 PlayerTaxi::GetCurrentTaxiPath() const std::ostringstream& operator<<(std::ostringstream& ss, PlayerTaxi const& taxi) { - for (std::size_t i = 0; i < TaxiMaskSize; ++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 16a238a02da..c8c48b0958f 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.h +++ b/src/server/game/Entities/Player/PlayerTaxi.h @@ -36,7 +36,7 @@ namespace WorldPackets 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/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index d893b118470..609a1e2ff9f 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -2288,7 +2288,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa // this doesn't seem to be 100% blizzlike... but it can't really be helped. std::ostringstream taximaskstream; TaxiMask const& factionMask = newTeamId == TEAM_HORDE ? sHordeTaxiNodesMask : sAllianceTaxiNodesMask; - for (std::size_t i = 0; i < TaxiMaskSize; ++i) + for (std::size_t i = 0; i < factionMask.size(); ++i) { // i = (315 - 1) / 8 = 39 // m = 1 << ((315 - 1) % 8) = 4 diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp index 127fd5754c1..58d513a6921 100644 --- a/src/server/game/Handlers/TaxiHandler.cpp +++ b/src/server/game/Handlers/TaxiHandler.cpp @@ -110,10 +110,9 @@ void WorldSession::SendTaxiMenu(Creature* unit) GetPlayer()->m_taxi.AppendTaximaskTo(data, lastTaxiCheaterState); TaxiMask reachableNodes; - std::fill(reachableNodes.begin(), reachableNodes.end(), 0); TaxiPathGraph::GetReachableNodesMask(sTaxiNodesStore.LookupEntry(curloc), &reachableNodes); - for (std::size_t i = 0; i < TaxiMaskSize; ++i) + for (std::size_t i = 0; i < reachableNodes.size(); ++i) { data.CanLandNodes[i] &= reachableNodes[i]; data.CanUseNodes[i] &= reachableNodes[i]; |
