diff options
| author | Shauren <shauren.trinity@gmail.com> | 2025-01-09 00:12:43 +0100 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-01-09 00:12:43 +0100 | 
| commit | da1ac5aa73afdb7f2379b71761e2a6e855ce4e9a (patch) | |
| tree | 9586b7abd5d4b4cb0bb4e2fb7480fb3a12ea782d | |
| parent | debbed0159fec031b4596295448e43d0fe071a01 (diff) | |
Core/DataStores: Delay building all DB2Manager containers after loading hotfix data to ignore rows marked as deleted by hotfixes
| -rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 35 | ||||
| -rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 1 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 16 | 
3 files changed, 28 insertions, 24 deletions
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 98147460995..d46f4a417e4 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -29,6 +29,7 @@  #include "Timer.h"  #include "Util.h"  #include "World.h" +#include <algorithm>  #include <array>  #include <bitset>  #include <boost/filesystem/directory.hpp> @@ -1030,6 +1031,15 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul          return 0;      } +    TC_LOG_INFO("server.loading", ">> Initialized {} DB2 data stores in {} ms", _stores.size(), GetMSTimeDiffToNow(oldMSTime)); + +    return availableDb2Locales.to_ulong(); +} + +void DB2Manager::IndexLoadedStores() +{ +    uint32 oldMSTime = getMSTime(); +      for (AreaGroupMemberEntry const* areaGroupMember : sAreaGroupMemberStore)          _areaGroupMembers[areaGroupMember->AreaGroupID].push_back(areaGroupMember->AreaID); @@ -1060,10 +1070,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul      for (AzeriteItemMilestonePowerEntry const* azeriteItemMilestonePower : sAzeriteItemMilestonePowerStore)          _azeriteItemMilestonePowers.push_back(azeriteItemMilestonePower); -    std::sort(_azeriteItemMilestonePowers.begin(), _azeriteItemMilestonePowers.end(), [](AzeriteItemMilestonePowerEntry const* a1, AzeriteItemMilestonePowerEntry const* a2) -    { -        return a1->RequiredLevel < a2->RequiredLevel; -    }); +    std::ranges::sort(_azeriteItemMilestonePowers, {}, &AzeriteItemMilestonePowerEntry::RequiredLevel);      {          uint32 azeriteEssenceSlot = 0; @@ -1120,8 +1127,8 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul          for (ChrClassesXPowerTypesEntry const* power : sChrClassesXPowerTypesStore)              powers.insert(power); -        for (std::size_t i = 0; i < _powersByClass.size(); ++i) -            _powersByClass[i].fill(MAX_POWERS); +        for (std::array<uint32, MAX_POWERS>& powersForClass : _powersByClass) +            powersForClass.fill(MAX_POWERS);          for (ChrClassesXPowerTypesEntry const* power : powers)          { @@ -1271,10 +1278,10 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul          for (auto& [curveId, curvePoints] : unsortedPoints)          { -            std::sort(curvePoints.begin(), curvePoints.end(), [](CurvePointEntry const* point1, CurvePointEntry const* point2) { return point1->OrderIndex < point2->OrderIndex; }); +            std::ranges::sort(curvePoints, {}, &CurvePointEntry::OrderIndex);              std::vector<DBCPosition2D>& points = _curvePoints[curveId];              points.resize(curvePoints.size()); -            std::transform(curvePoints.begin(), curvePoints.end(), points.begin(), [](CurvePointEntry const* point) { return point->Pos; }); +            std::ranges::transform(curvePoints, points.begin(), &CurvePointEntry::Pos);          }      } @@ -1355,10 +1362,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul      for (MapDifficultyXConditionEntry const* mapDifficultyCondition : sMapDifficultyXConditionStore)          mapDifficultyConditions.push_back(mapDifficultyCondition); -    std::sort(mapDifficultyConditions.begin(), mapDifficultyConditions.end(), [](MapDifficultyXConditionEntry const* left, MapDifficultyXConditionEntry const* right) -    { -        return left->OrderIndex < right->OrderIndex; -    }); +    std::ranges::sort(mapDifficultyConditions, {}, &MapDifficultyXConditionEntry::OrderIndex);      for (MapDifficultyXConditionEntry const* mapDifficultyCondition : mapDifficultyConditions)          if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(mapDifficultyCondition->PlayerConditionID)) @@ -1549,8 +1553,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul      std::vector<uint32> pathLength;      pathLength.resize(pathCount);                           // 0 and some other indexes not used      for (TaxiPathNodeEntry const* entry : sTaxiPathNodeStore) -        if (pathLength[entry->PathID] < entry->NodeIndex + 1u) -            pathLength[entry->PathID] = entry->NodeIndex + 1u; +        pathLength[entry->PathID] = std::max(pathLength[entry->PathID], entry->NodeIndex + 1u);      // Set path length      sTaxiPathNodesByPath.resize(pathCount);                 // 0 and some other indexes not used @@ -1709,9 +1712,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul      for (PVPStatEntry const* pvpStat : sPVPStatStore)          _pvpStatIdsByMap[pvpStat->MapID].insert(pvpStat->ID); -    TC_LOG_INFO("server.loading", ">> Initialized {} DB2 data stores in {} ms", _stores.size(), GetMSTimeDiffToNow(oldMSTime)); - -    return availableDb2Locales.to_ulong(); +    TC_LOG_INFO("server.loading", ">> Indexed DB2 data stores in {} ms", GetMSTimeDiffToNow(oldMSTime));  }  DB2StorageBase const* DB2Manager::GetStorage(uint32 type) const diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 4d63f4fa54d..a9b1f73b614 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -421,6 +421,7 @@ public:      static DB2Manager& Instance();      uint32 LoadStores(std::string const& dataPath, LocaleConstant defaultLocale); +    void IndexLoadedStores();      DB2StorageBase const* GetStorage(uint32 type) const;      void LoadHotfixData(uint32 localeMask); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 8206ddae750..4c5462b46af 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1785,6 +1785,13 @@ bool World::SetInitialWorldSettings()      LoginDatabase.PExecute("UPDATE realmlist SET icon = {}, timezone = {} WHERE id = '{}'", server_type, realm_zone, sRealmList->GetCurrentRealmId().Realm);      // One-time query +    TC_LOG_INFO("server.loading", "Loading GameObject models..."); +    if (!LoadGameObjectModelList(m_dataPath)) +    { +        TC_LOG_FATAL("server.loading", "Unable to load gameobject models (part of vmaps), objects using WMO models will crash the client - server shutting down!"); +        return false; +    } +      TC_LOG_INFO("server.loading", "Initialize data stores...");      ///- Load DB2s      m_availableDbcLocaleMask = sDB2Manager.LoadStores(m_dataPath, m_defaultDbcLocale); @@ -1794,19 +1801,14 @@ bool World::SetInitialWorldSettings()          return false;      } -    TC_LOG_INFO("server.loading", "Loading GameObject models..."); -    if (!LoadGameObjectModelList(m_dataPath)) -    { -        TC_LOG_FATAL("server.loading", "Unable to load gameobject models (part of vmaps), objects using WMO models will crash the client - server shutting down!"); -        return false; -    } -      TC_LOG_INFO("misc", "Loading hotfix blobs...");      sDB2Manager.LoadHotfixBlob(m_availableDbcLocaleMask);      TC_LOG_INFO("misc", "Loading hotfix info...");      sDB2Manager.LoadHotfixData(m_availableDbcLocaleMask);      TC_LOG_INFO("misc", "Loading hotfix optional data...");      sDB2Manager.LoadHotfixOptionalData(m_availableDbcLocaleMask); +    TC_LOG_INFO("misc", "Indexing loaded data stores..."); +    sDB2Manager.IndexLoadedStores();      ///- Load M2 fly by cameras      LoadM2Cameras(m_dataPath);      ///- Load GameTables  | 
