X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmods.h;h=50ada328ebed6c38e45ecb19b978b417c6985a49;hb=de2c40c8fc189eeeeba010a0aaa1d28aed588c68;hp=d55dd6c92ea4b19cc3b208319cab1d82fdb07dd1;hpb=9f031a67594162a53b07acbfbc65faf8c4938e99;p=oweals%2Fminetest.git diff --git a/src/mods.h b/src/mods.h index d55dd6c92..50ada328e 100644 --- a/src/mods.h +++ b/src/mods.h @@ -1,6 +1,6 @@ /* -Minetest-c55 -Copyright (C) 2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -17,51 +17,156 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef MODS_HEADER -#define MODS_HEADER +#pragma once #include "irrlichttypes.h" -#include +#include #include +#include #include -#include +#include +#include +#include +#include "config.h" +#include "metadata.h" -class ModError : public std::exception +#define MODNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_" + +struct ModSpec +{ + std::string name; + std::string path; + //if normal mod: + std::unordered_set depends; + std::unordered_set optdepends; + std::unordered_set unsatisfied_depends; + + bool part_of_modpack = false; + bool is_modpack = false; + // if modpack: + std::map modpack_content; + ModSpec(const std::string &name_="", const std::string &path_=""): + name(name_), + path(path_) + {} +}; + +// Retrieves depends, optdepends, is_modpack and modpack_content +void parseModContents(ModSpec &mod); + +std::map getModsInPath(std::string path, bool part_of_modpack = false); + +// replaces modpack Modspecs with their content +std::vector flattenMods(std::map 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: - ModError(const std::string &s) + // checks if all dependencies are fullfilled. + bool isConsistent() const { - m_s = "ModError: "; - m_s += s; + return m_unsatisfied_mods.empty(); } - virtual ~ModError() throw() - {} - virtual const char * what() const throw() + + std::vector getMods() + { + return m_sorted_mods; + } + + const std::vector &getUnsatisfiedMods() const { - return m_s.c_str(); + return m_unsatisfied_mods; } - std::string m_s; + + 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 &new_mods); + + void addModsFromConfig(const std::string &settings_path, const std::set &mods); + + void checkConflictsAndDeps(); +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 m_unsatisfied_mods; + + // 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 m_sorted_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 m_name_conflicts; + + // Deleted default constructor + ModConfiguration() = default; + }; -struct ModSpec +class ServerModConfiguration: public ModConfiguration { - std::string name; - std::string path; - std::set depends; - std::set unsatisfied_depends; +public: + ServerModConfiguration(const std::string &worldpath); - ModSpec(const std::string &name_="", const std::string path_="", - const std::set &depends_=std::set()): - name(name_), - path(path_), - depends(depends_), - unsatisfied_depends(depends_) - {} }; -// Get a dependency-sorted list of ModSpecs -core::list getMods(core::list &modspaths) - throw(ModError); - +#ifndef SERVER +class ClientModConfiguration: public ModConfiguration +{ +public: + ClientModConfiguration(const std::string &path); +}; #endif +struct ModLicenseInfo { + int id; + std::string shortinfo; + std::string url; +}; + +struct ModAuthorInfo { + int id; + std::string username; +}; + +class ModMetadata: public Metadata +{ +public: + ModMetadata(const std::string &mod_name); + ~ModMetadata() = default; + + virtual void clear(); + + bool save(const std::string &root_path); + bool load(const std::string &root_path); + + bool isModified() const { return m_modified; } + const std::string &getModName() const { return m_mod_name; } + + virtual bool setString(const std::string &name, const std::string &var); +private: + std::string m_mod_name; + bool m_modified = false; +};