aboutsummaryrefslogtreecommitdiff
path: root/src/content/mods.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/content/mods.h')
-rw-r--r--src/content/mods.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/content/mods.h b/src/content/mods.h
new file mode 100644
index 000000000..5ed5b8171
--- /dev/null
+++ b/src/content/mods.h
@@ -0,0 +1,129 @@
+/*
+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/json.h>
+#include <unordered_set>
+#include "util/basic_macros.h"
+#include "config.h"
+#include "metadata.h"
+#include "subgames.h"
+
+class ModMetadataDatabase;
+
+#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 ModMetadata : public Metadata
+{
+public:
+ ModMetadata() = delete;
+ ModMetadata(const std::string &mod_name, ModMetadataDatabase *database);
+ ~ModMetadata() = default;
+
+ virtual void clear();
+
+ 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;
+ ModMetadataDatabase *m_database;
+};