or checking if a mod is enabled.
* `minetest.get_modnames()`: returns a list of enabled mods, sorted alphabetically.
* Does not include disabled mods, even if they are installed.
+* `minetest.get_game_info()`: returns a table containing information about the
+ current game. Note that other meta information (e.g. version/release number)
+ can be manually read from `game.conf` in the game's root directory.
+
+ {
+ id = string,
+ title = string,
+ author = string,
+ -- The root directory of the game
+ path = string,
+ }
+
* `minetest.get_worldpath()`: returns e.g. `"/home/user/.minetest/world"`
* Useful for storing custom data
* `minetest.is_singleplayer()`
end
unittests.register("test_compress", test_compress)
+local function test_game_info()
+ local info = minetest.get_game_info()
+ local game_conf = Settings(info.path .. "/game.conf")
+ assert(info.id == "devtest")
+ assert(info.title == game_conf:get("title"))
+end
+unittests.register("test_game_info", test_game_info)
class ISceneManager;
}}
+struct SubgameSpec;
struct ModSpec;
/*
An interface for fetching game-global definitions like tool and
virtual const std::vector<ModSpec> &getMods() const = 0;
virtual const ModSpec* getModSpec(const std::string &modname) const = 0;
+ virtual const SubgameSpec* getGameSpec() const { return nullptr; }
virtual std::string getWorldPath() const { return ""; }
virtual ModStorageDatabase *getModStorageDatabase() = 0;
}
lua_pop(L, 1); // Pop mod name
+ // Allow read-only access to game directory
+ if (!write_required) {
+ const SubgameSpec *game_spec = gamedef->getGameSpec();
+ if (game_spec && !game_spec->path.empty()) {
+ str = fs::AbsolutePath(game_spec->path);
+ if (!str.empty() && fs::PathStartsWith(abs_path, str)) {
+ return true;
+ }
+ }
+ }
+
// Allow read-only access to all mod directories
if (!write_required) {
const std::vector<ModSpec> &mods = gamedef->getMods();
return 1;
}
+// get_game_info()
+int ModApiServer::l_get_game_info(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ const SubgameSpec *game_spec = getGameDef(L)->getGameSpec();
+ assert(game_spec);
+ lua_newtable(L);
+ setstringfield(L, -1, "id", game_spec->id);
+ setstringfield(L, -1, "title", game_spec->title);
+ setstringfield(L, -1, "author", game_spec->author);
+ setstringfield(L, -1, "path", game_spec->path);
+ return 1;
+}
+
// get_worldpath()
int ModApiServer::l_get_worldpath(lua_State *L)
{
API_FCT(get_current_modname);
API_FCT(get_modpath);
API_FCT(get_modnames);
+ API_FCT(get_game_info);
API_FCT(print);
API_FCT(get_current_modname);
API_FCT(get_modpath);
API_FCT(get_modnames);
+ API_FCT(get_game_info);
}
// the returned list is sorted alphabetically for you
static int l_get_modnames(lua_State *L);
+ // get_game_info()
+ static int l_get_game_info(lua_State *L);
+
// print(text)
static int l_print(lua_State *L);
virtual const std::vector<ModSpec> &getMods() const;
virtual const ModSpec* getModSpec(const std::string &modname) const;
+ virtual const SubgameSpec* getGameSpec() const { return &m_gamespec; }
static std::string getBuiltinLuaPath();
virtual std::string getWorldPath() const { return m_path_world; }