aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp50
-rw-r--r--src/server/game/DataStores/DBCEnums.h23
-rw-r--r--src/server/game/Entities/Player/PlayerTaxi.cpp6
-rw-r--r--src/server/game/Entities/Player/PlayerTaxi.h2
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp2
-rw-r--r--src/server/game/Handlers/TaxiHandler.cpp3
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];