mirror of
https://github.com/minetest/minetest.git
synced 2024-11-30 11:33:44 +01:00
Add minetest.get_modnames() to Lua API
This commit is contained in:
parent
e3ddbe8c6b
commit
136eb32389
@ -4461,6 +4461,60 @@ static int l_get_modpath(lua_State *L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get_modnames()
|
||||||
|
// the returned list is sorted alphabetically for you
|
||||||
|
static int l_get_modnames(lua_State *L)
|
||||||
|
{
|
||||||
|
// Get a list of mods
|
||||||
|
core::list<std::string> mods_unsorted, mods_sorted;
|
||||||
|
get_server(L)->getModNames(mods_unsorted);
|
||||||
|
|
||||||
|
// Take unsorted items from mods_unsorted and sort them into
|
||||||
|
// mods_sorted; not great performance but the number of mods on a
|
||||||
|
// server will likely be small.
|
||||||
|
for(core::list<std::string>::Iterator i = mods_unsorted.begin();
|
||||||
|
i != mods_unsorted.end(); i++)
|
||||||
|
{
|
||||||
|
bool added = false;
|
||||||
|
for(core::list<std::string>::Iterator x = mods_sorted.begin();
|
||||||
|
x != mods_unsorted.end(); x++)
|
||||||
|
{
|
||||||
|
// I doubt anybody using Minetest will be using
|
||||||
|
// anything not ASCII based :)
|
||||||
|
if((*i).compare(*x) <= 0)
|
||||||
|
{
|
||||||
|
mods_sorted.insert_before(x, *i);
|
||||||
|
added = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!added)
|
||||||
|
mods_sorted.push_back(*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the table insertion function from Lua.
|
||||||
|
lua_getglobal(L, "table");
|
||||||
|
lua_getfield(L, -1, "insert");
|
||||||
|
int insertion_func = lua_gettop(L);
|
||||||
|
|
||||||
|
// Package them up for Lua
|
||||||
|
lua_newtable(L);
|
||||||
|
int new_table = lua_gettop(L);
|
||||||
|
core::list<std::string>::Iterator i = mods_sorted.begin();
|
||||||
|
while(i != mods_sorted.end())
|
||||||
|
{
|
||||||
|
lua_pushvalue(L, insertion_func);
|
||||||
|
lua_pushvalue(L, new_table);
|
||||||
|
lua_pushstring(L, (*i).c_str());
|
||||||
|
if(lua_pcall(L, 2, 0, 0) != 0)
|
||||||
|
{
|
||||||
|
script_error(L, "error: %s", lua_tostring(L, -1));
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// get_worldpath()
|
// get_worldpath()
|
||||||
static int l_get_worldpath(lua_State *L)
|
static int l_get_worldpath(lua_State *L)
|
||||||
{
|
{
|
||||||
@ -4630,6 +4684,7 @@ static const struct luaL_Reg minetest_f [] = {
|
|||||||
{"get_hit_params", l_get_hit_params},
|
{"get_hit_params", l_get_hit_params},
|
||||||
{"get_current_modname", l_get_current_modname},
|
{"get_current_modname", l_get_current_modname},
|
||||||
{"get_modpath", l_get_modpath},
|
{"get_modpath", l_get_modpath},
|
||||||
|
{"get_modnames", l_get_modnames},
|
||||||
{"get_worldpath", l_get_worldpath},
|
{"get_worldpath", l_get_worldpath},
|
||||||
{"sound_play", l_sound_play},
|
{"sound_play", l_sound_play},
|
||||||
{"sound_stop", l_sound_stop},
|
{"sound_stop", l_sound_stop},
|
||||||
|
@ -4531,6 +4531,13 @@ const ModSpec* Server::getModSpec(const std::string &modname)
|
|||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
void Server::getModNames(core::list<std::string> &modlist)
|
||||||
|
{
|
||||||
|
for(core::list<ModSpec>::Iterator i = m_mods.begin(); i != m_mods.end(); i++)
|
||||||
|
{
|
||||||
|
modlist.push_back((*i).name);
|
||||||
|
}
|
||||||
|
}
|
||||||
std::string Server::getBuiltinLuaPath()
|
std::string Server::getBuiltinLuaPath()
|
||||||
{
|
{
|
||||||
return porting::path_share + DIR_DELIM + "builtin";
|
return porting::path_share + DIR_DELIM + "builtin";
|
||||||
|
@ -556,6 +556,7 @@ public:
|
|||||||
IWritableCraftDefManager* getWritableCraftDefManager();
|
IWritableCraftDefManager* getWritableCraftDefManager();
|
||||||
|
|
||||||
const ModSpec* getModSpec(const std::string &modname);
|
const ModSpec* getModSpec(const std::string &modname);
|
||||||
|
void getModNames(core::list<std::string> &modlist);
|
||||||
std::string getBuiltinLuaPath();
|
std::string getBuiltinLuaPath();
|
||||||
|
|
||||||
std::string getWorldPath(){ return m_path_world; }
|
std::string getWorldPath(){ return m_path_world; }
|
||||||
|
Loading…
Reference in New Issue
Block a user