diff --git a/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp b/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp index 26c0cb5d..4b0b0ea6 100644 --- a/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp +++ b/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp @@ -206,28 +206,28 @@ void ContentLoaderT6::Load(Zone* zone, IZoneInputStream* stream) m_stream->PushBlock(XFILE_BLOCK_VIRTUAL); - auto* assetList = m_stream->Alloc(alignof(XAssetList)); - m_stream->Load(assetList); + XAssetList assetList{}; + m_stream->LoadDataRaw(&assetList, sizeof assetList); - varScriptStringList = &assetList->stringList; + varScriptStringList = &assetList.stringList; LoadScriptStringList(false); - if(assetList->depends != nullptr) + if(assetList.depends != nullptr) { - assert(assetList->depends == PTR_FOLLOWING); + assert(assetList.depends == PTR_FOLLOWING); - assetList->depends = m_stream->Alloc(alignof(const char)); - varXString = assetList->depends; - LoadXStringArray(true, assetList->dependCount); + assetList.depends = m_stream->Alloc(alignof(const char)); + varXString = assetList.depends; + LoadXStringArray(true, assetList.dependCount); } - if(assetList->assets != nullptr) + if(assetList.assets != nullptr) { - assert(assetList->assets == PTR_FOLLOWING); + assert(assetList.assets == PTR_FOLLOWING); - assetList->assets = m_stream->Alloc(alignof(XAsset)); - varXAsset = assetList->assets; - LoadXAssetArray(true, assetList->assetCount); + assetList.assets = m_stream->Alloc(alignof(XAsset)); + varXAsset = assetList.assets; + LoadXAssetArray(true, assetList.assetCount); } m_stream->PopBlock(); diff --git a/src/ZoneLoading/Zone/Stream/IZoneInputStream.h b/src/ZoneLoading/Zone/Stream/IZoneInputStream.h index 4605befb..6584bda3 100644 --- a/src/ZoneLoading/Zone/Stream/IZoneInputStream.h +++ b/src/ZoneLoading/Zone/Stream/IZoneInputStream.h @@ -14,19 +14,21 @@ public: return static_cast(Alloc(align)); } - virtual void LoadData(void* dst, size_t size) = 0; + virtual void LoadDataRaw(void* dst, size_t size) = 0; + virtual void LoadDataInBlock(void* dst, size_t size) = 0; + virtual void IncBlockPos(size_t size) = 0; virtual void LoadNullTerminated(void* dst) = 0; template void Load(T* dst) { - LoadData(dst, sizeof(T)); + LoadDataInBlock(const_cast(reinterpret_cast(dst)), sizeof(T)); } template void Load(T* dst, const uint32_t count) { - LoadData(const_cast(reinterpret_cast(dst)), count * sizeof(T)); + LoadDataInBlock(const_cast(reinterpret_cast(dst)), count * sizeof(T)); } virtual void** InsertPointer() = 0; diff --git a/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.cpp b/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.cpp index 5b0004b9..0f9af77d 100644 --- a/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.cpp +++ b/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.cpp @@ -94,7 +94,12 @@ void* XBlockInputStream::Alloc(const int align) return &block->m_buffer[m_block_offsets[block->m_index]]; } -void XBlockInputStream::LoadData(void* dst, const size_t size) +void XBlockInputStream::LoadDataRaw(void* dst, const size_t size) +{ + m_stream->Load(dst, size); +} + +void XBlockInputStream::LoadDataInBlock(void* dst, const size_t size) { assert(!m_block_stack.empty()); @@ -118,6 +123,17 @@ void XBlockInputStream::LoadData(void* dst, const size_t size) m_stream->Load(dst, size); + IncBlockPos(size); +} + +void XBlockInputStream::IncBlockPos(const size_t size) +{ + assert(!m_block_stack.empty()); + + if (m_block_stack.empty()) + return; + + XBlock* block = m_block_stack.top(); m_block_offsets[block->m_index] += size; } diff --git a/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.h b/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.h index 4d706032..303750de 100644 --- a/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.h +++ b/src/ZoneLoading/Zone/Stream/Impl/XBlockInputStream.h @@ -30,7 +30,9 @@ public: void* Alloc(int align) override; - void LoadData(void* dst, size_t size) override; + void LoadDataRaw(void* dst, size_t size) override; + void LoadDataInBlock(void* dst, size_t size) override; + void IncBlockPos(size_t size) override; void LoadNullTerminated(void* dst) override; void** InsertPointer() override;