diff --git a/Code/components/es_loader/ESLoader.cpp b/Code/components/es_loader/ESLoader.cpp index b0a1e9446..3fa6a8381 100644 --- a/Code/components/es_loader/ESLoader.cpp +++ b/Code/components/es_loader/ESLoader.cpp @@ -26,7 +26,11 @@ UniquePtr ESLoader::BuildRecordCollection() noexcept return UniquePtr(); } - return LoadFiles(); + auto recordCollection = LoadFiles(); + + recordCollection->BuildReferences(); + + return std::move(recordCollection); } diff --git a/Code/components/es_loader/ESLoaderTest.cpp b/Code/components/es_loader/ESLoaderTest.cpp index e2cbe7ab0..94fe494b3 100644 --- a/Code/components/es_loader/ESLoaderTest.cpp +++ b/Code/components/es_loader/ESLoaderTest.cpp @@ -118,6 +118,7 @@ TEST_F(ESLoaderTest, GetWorldTamriel) const WRLD& tamrielWorld = pCollection->GetWorldById(60); EXPECT_EQ(tamrielWorld.m_editorId, "Tamriel"); + EXPECT_EQ(tamrielWorld.m_navMeshRefs.size(), 0x3315); } } // namespace diff --git a/Code/components/es_loader/RecordCollection.cpp b/Code/components/es_loader/RecordCollection.cpp index 7f79d12e8..2d4e5a2ba 100644 --- a/Code/components/es_loader/RecordCollection.cpp +++ b/Code/components/es_loader/RecordCollection.cpp @@ -1,2 +1,13 @@ #include "RecordCollection.h" +void RecordCollection::BuildReferences() +{ + for (auto& [_, navmesh] : m_navMeshes) + { + if(navmesh.m_navMesh.m_worldSpaceId) + { + auto& world = GetWorldById(navmesh.m_navMesh.m_worldSpaceId); + world.m_navMeshRefs.push_back(&navmesh); + } + } +} diff --git a/Code/components/es_loader/RecordCollection.h b/Code/components/es_loader/RecordCollection.h index ebe0783ee..2f5b9ad73 100644 --- a/Code/components/es_loader/RecordCollection.h +++ b/Code/components/es_loader/RecordCollection.h @@ -54,6 +54,8 @@ class RecordCollection return m_navMeshes[aFormId]; } + void BuildReferences(); + private: Map m_allRecords{}; Map m_objectReferences{}; diff --git a/Code/components/es_loader/Records/WRLD.h b/Code/components/es_loader/Records/WRLD.h index 84cb05589..8ffbb8ab9 100644 --- a/Code/components/es_loader/Records/WRLD.h +++ b/Code/components/es_loader/Records/WRLD.h @@ -3,6 +3,8 @@ #include "Record.h" #include "Chunks.h" +class NAVM; + // https://en.uesp.net/wiki/Skyrim_Mod:Mod_File_Format/WRLD class WRLD : public Record { @@ -17,6 +19,8 @@ class WRLD : public Record uint32_t m_musicId; float m_lodMultiplier; + Vector m_navMeshRefs; + void ParseChunks(WRLD& aSourceRecord, Map& aParentToFormIdPrefix) noexcept; void ParseGRUP() noexcept; };