diff --git a/src/area_data.cpp b/src/area_data.cpp index f17761f..8721c80 100644 --- a/src/area_data.cpp +++ b/src/area_data.cpp @@ -23,6 +23,7 @@ #include "music_manager.h" #include "packet/packet_factory.h" + AreaData::AreaData(QString p_name, int p_index, MusicManager *p_music_manager = nullptr) : m_index(p_index), m_music_manager(p_music_manager), @@ -279,6 +280,51 @@ void AreaData::replaceEvidence(int f_eviId, const AreaData::Evidence &f_newEvi_r m_evidence.replace(f_eviId, f_newEvi_r); } +void AreaData::loadInventory(QSettings& settings) +{ + // Retrieve all keys from the QSettings object + QStringList keys = settings.allKeys(); + + // Map to store evidence data temporarily + QMap evidenceMap; + + // Iterate over the keys and log the associated values + for (const QString &key : keys) { + QStringList keyParts = key.split("/"); + + // We expect keys in the format "id/field" (e.g., "0/description") + if (keyParts.size() == 2) { + int id = keyParts[0].toInt(); // This should be the evidence ID, e.g., "0" + QString field = keyParts[1]; // This should be the field name, e.g., "description" + + // Retrieve the value for this key + QString value = settings.value(key).toString(); + + // Check if the evidence ID exists in the map + if (!evidenceMap.contains(id)) { + // Create a new evidence entry if it doesn't exist + Evidence newEvidence; + evidenceMap.insert(id, newEvidence); + } + + // Now assign the values to the respective fields + Evidence& evidence = evidenceMap[id]; + if (field == "description") { + evidence.description = value; + } else if (field == "image") { + evidence.image = value; + } else if (field == "name") { + evidence.name = value; + } + } + } + + // After all fields for an evidence item are collected, append it to the evidence list + for (const Evidence& evidence : evidenceMap.values()) { + appendEvidence(evidence); + } +} + AreaData::Status AreaData::status() const { return m_status; diff --git a/src/area_data.h b/src/area_data.h index 83e1bd9..aa07d39 100644 --- a/src/area_data.h +++ b/src/area_data.h @@ -712,6 +712,9 @@ class AreaData : public QObject * * @see #m_eviMod */ + + void loadInventory(QSettings& settings); + EvidenceMod eviMod() const; /** diff --git a/src/server.cpp b/src/server.cpp index 0720cbd..42e56aa 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -109,6 +109,8 @@ void Server::start() connect(l_area, &AreaData::sendAreaPacketClient, this, &Server::unicast); connect(l_area, &AreaData::userJoinedArea, music_manager, &MusicManager::userJoinedArea); music_manager->registerArea(i); + // Search for and load inventory based on the area name + loadInventoryForArea(l_area, m_area_names[i]); } // Loads the command help information. This is not stored inside the server. @@ -129,6 +131,32 @@ void Server::start() } } +void Server::loadInventoryForArea(AreaData* area, const QString& areaName) +{ + // Set up the directory where inventory files are stored. + QString inventoryDirectory = "storage/inventory"; // Adjust this path as necessary + + QDir dir(inventoryDirectory); + if (!dir.exists()) { + qWarning() << "Inventory directory does not exist!"; + return; + } + + // Search for an inventory file corresponding to the area name (e.g., "area_1.ini"). + QString inventoryFileName = areaName + ".ini"; // Assuming file is named as area name + QString filePath = dir.absoluteFilePath(inventoryFileName); + + if (QFile::exists(filePath)) { + qDebug() << "Loading inventory for area:" << areaName; + + // Load the inventory from the .ini file + QSettings settings(filePath, QSettings::IniFormat); + area->loadInventory(settings); // Assuming the AreaData class has a `loadInventory()` method + } else { + qWarning() << "Inventory file not found for area:" << areaName; + } +} + QVector Server::getClients() { return m_clients; diff --git a/src/server.h b/src/server.h index a0febe4..a17723d 100644 --- a/src/server.h +++ b/src/server.h @@ -330,6 +330,8 @@ class Server : public QObject */ QHostAddress parseToIPv4(QHostAddress f_remote_ip); + void loadInventoryForArea(AreaData* area, const QString& areaName); + public slots: /** * @brief Convenience class to call a reload of available configuraiton elements.