123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /*
- Minetest
- Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
- 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
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
- #pragma once
- #include "irrlichttypes.h"
- #include <list>
- #include <set>
- #include <vector>
- #include <string>
- #include <map>
- #include "json-forwards.h"
- #include <unordered_set>
- #include "util/basic_macros.h"
- #include "config.h"
- #include "metadata.h"
- #include "subgames.h"
- class ModStorageDatabase;
- #define MODNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_"
- struct ModSpec
- {
- std::string name;
- std::string author;
- std::string path;
- std::string desc;
- int release = 0;
- // if normal mod:
- std::unordered_set<std::string> depends;
- std::unordered_set<std::string> optdepends;
- std::unordered_set<std::string> unsatisfied_depends;
- 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()
- {
- }
- 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
- *
- * @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);
- class ModStorage : public IMetadata
- {
- public:
- ModStorage() = delete;
- ModStorage(const std::string &mod_name, ModStorageDatabase *database);
- ~ModStorage() = default;
- const std::string &getModName() const { return m_mod_name; }
- void clear() override;
- bool contains(const std::string &name) const override;
- bool setString(const std::string &name, std::string_view var) override;
- const StringMap &getStrings(StringMap *place) const override;
- const std::vector<std::string> &getKeys(std::vector<std::string> *place) const override;
- protected:
- const std::string *getStringRaw(const std::string &name,
- std::string *place) const override;
- private:
- std::string m_mod_name;
- ModStorageDatabase *m_database;
- };
|