#pragma once #include "IZoneAssetDumperState.h" #include "Obj/Gdt/GdtStream.h" #include "SearchPath/IOutputPath.h" #include "SearchPath/ISearchPath.h" #include "Utils/ProgressCallback.h" #include "Zone/Zone.h" #include #include #include #include class AssetDumpingContext { public: AssetDumpingContext(const Zone& zone, const std::string& basePath, IOutputPath& outputPath, ISearchPath& objSearchPath, std::optional> progressCallback); [[nodiscard]] std::unique_ptr OpenAssetFile(const std::string& fileName) const; void IncrementProgress(); void SetTotalProgress(size_t value); [[nodiscard]] bool ShouldTrackProgress() const; template T* GetZoneAssetDumperState() { static_assert(std::is_base_of_v, "T must inherit IZoneAssetDumperState"); // T must also have a public default constructor const auto foundEntry = m_zone_asset_dumper_states.find(typeid(T)); if (foundEntry != m_zone_asset_dumper_states.end()) return dynamic_cast(foundEntry->second.get()); auto newState = std::make_unique(); newState->SetZone(m_zone); auto* newStatePtr = newState.get(); m_zone_asset_dumper_states.emplace(std::make_pair>(typeid(T), std::move(newState))); return newStatePtr; } const Zone& m_zone; const std::string& m_base_path; IOutputPath& m_output_path; ISearchPath& m_obj_search_path; std::unique_ptr m_gdt; private: std::unordered_map> m_zone_asset_dumper_states; std::unique_ptr m_progress_callback; size_t m_current_progress; size_t m_total_progress; };