diff options
Diffstat (limited to 'src/content/mods.h')
-rw-r--r-- | src/content/mods.h | 119 |
1 files changed, 41 insertions, 78 deletions
diff --git a/src/content/mods.h b/src/content/mods.h index dd3b6e0e6..5ed5b8171 100644 --- a/src/content/mods.h +++ b/src/content/mods.h @@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/basic_macros.h" #include "config.h" #include "metadata.h" +#include "subgames.h" class ModMetadataDatabase; @@ -51,101 +52,63 @@ struct ModSpec bool part_of_modpack = false; bool is_modpack = false; + /** + * A constructed canonical path to represent this mod's location. + * This intended to be used as an identifier for a modpath that tolerates file movement, + * and cannot be used to read the mod files. + * + * Note that `mymod` is the directory name, not the mod name specified in mod.conf. + * + * Ex: + * + * - mods/mymod + * - mods/mymod (1) + * (^ this would have name=mymod in mod.conf) + * - mods/modpack1/mymod + * - games/mygame/mods/mymod + * - worldmods/mymod + */ + std::string virtual_path; + // For logging purposes std::vector<const char *> deprecation_msgs; // if modpack: std::map<std::string, ModSpec> modpack_content; - ModSpec(const std::string &name = "", const std::string &path = "") : - name(name), path(path) + + ModSpec() { } - ModSpec(const std::string &name, const std::string &path, bool part_of_modpack) : - name(name), path(path), part_of_modpack(part_of_modpack) + + ModSpec(const std::string &name, const std::string &path, bool part_of_modpack, const std::string &virtual_path) : + name(name), path(path), part_of_modpack(part_of_modpack), virtual_path(virtual_path) { } void checkAndLog() const; }; -// Retrieves depends, optdepends, is_modpack and modpack_content -void parseModContents(ModSpec &mod); - -std::map<std::string, ModSpec> getModsInPath( - const std::string &path, bool part_of_modpack = false); +/** + * Retrieves depends, optdepends, is_modpack and modpack_content + * + * @returns false if not a mod + */ +bool parseModContents(ModSpec &mod); + +/** + * Gets a list of all mods and modpacks in path + * + * @param Path to search, should be absolute + * @param part_of_modpack Is this searching within a modpack? + * @param virtual_path Virtual path for this directory, see comment in ModSpec + * @returns map of mods + */ +std::map<std::string, ModSpec> getModsInPath(const std::string &path, + const std::string &virtual_path, bool part_of_modpack = false); // replaces modpack Modspecs with their content std::vector<ModSpec> flattenMods(const std::map<std::string, ModSpec> &mods); -// a ModConfiguration is a subset of installed mods, expected to have -// all dependencies fullfilled, so it can be used as a list of mods to -// load when the game starts. -class ModConfiguration -{ -public: - // checks if all dependencies are fullfilled. - bool isConsistent() const { return m_unsatisfied_mods.empty(); } - - const std::vector<ModSpec> &getMods() const { return m_sorted_mods; } - - const std::vector<ModSpec> &getUnsatisfiedMods() const - { - return m_unsatisfied_mods; - } - - void printUnsatisfiedModsError() const; - -protected: - ModConfiguration(const std::string &worldpath); - // adds all mods in the given path. used for games, modpacks - // and world-specific mods (worldmods-folders) - void addModsInPath(const std::string &path); - - // adds all mods in the set. - void addMods(const std::vector<ModSpec> &new_mods); - - void addModsFromConfig(const std::string &settings_path, - const std::set<std::string> &mods); - - void checkConflictsAndDeps(); - -protected: - // list of mods sorted such that they can be loaded in the - // given order with all dependencies being fullfilled. I.e., - // every mod in this list has only dependencies on mods which - // appear earlier in the vector. - std::vector<ModSpec> m_sorted_mods; - -private: - // move mods from m_unsatisfied_mods to m_sorted_mods - // in an order that satisfies dependencies - void resolveDependencies(); - - // mods with unmet dependencies. Before dependencies are resolved, - // this is where all mods are stored. Afterwards this contains - // only the ones with really unsatisfied dependencies. - std::vector<ModSpec> m_unsatisfied_mods; - - // set of mod names for which an unresolved name conflict - // exists. A name conflict happens when two or more mods - // at the same level have the same name but different paths. - // Levels (mods in higher levels override mods in lower levels): - // 1. game mod in modpack; 2. game mod; - // 3. world mod in modpack; 4. world mod; - // 5. addon mod in modpack; 6. addon mod. - std::unordered_set<std::string> m_name_conflicts; - - // Deleted default constructor - ModConfiguration() = default; -}; - -#ifndef SERVER -class ClientModConfiguration : public ModConfiguration -{ -public: - ClientModConfiguration(const std::string &path); -}; -#endif class ModMetadata : public Metadata { |