#pragma once #include "SharedTypes.hpp" #include #include #include "ResourceDisplay/ResourceDisplay.hpp" #include #include #include #include class World; struct ResourceData { std::string name; std::shared_ptr data; template void save(Archive& a) const { a(name, *data); } template void load(Archive& a) { data = std::make_shared(); a(name, *data); } }; class ResourceManager { public: ResourceManager(World& initWorld); template void serialize(Archive& a) { a(resources); } template void save_strip_unused_resources(Archive& a, const std::unordered_set& usedResources) const { std::unordered_map strippedResources = resources; std::erase_if(strippedResources, [&](const auto& p) { return !usedResources.contains(p.first); }); a(strippedResources); } void update(); void copy_resource_set_to_map(const std::unordered_set& resourceSet, std::unordered_map& resourceMap) const; void init_client_callbacks(); ServerClientID add_resource_file(std::string_view fileName); ServerClientID add_resource(const ResourceData& resource); std::shared_ptr get_display_data(const ServerClientID& fileID); std::optional get_resource(const ServerClientID& id) const; ClientPortionID get_max_id(ServerPortionID serverID) const; const std::unordered_map& resource_list(); ServerClientID get_resource_being_retrieved(); float get_resource_retrieval_progress(); World& world; private: ServerClientID resourceBeingRetrieved = {0, 0}; std::unordered_map resources; std::unordered_map> displays; static std::array decoders; };