aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/mods/default/init.lua1
-rw-r--r--data/mods/experimental/init.lua2
-rw-r--r--src/mods.h5
-rw-r--r--src/scriptapi.cpp18
-rw-r--r--src/server.cpp26
-rw-r--r--src/server.h6
6 files changed, 50 insertions, 8 deletions
diff --git a/data/mods/default/init.lua b/data/mods/default/init.lua
index 782eba5a5..95d9c19ff 100644
--- a/data/mods/default/init.lua
+++ b/data/mods/default/init.lua
@@ -110,6 +110,7 @@
-- minetest.chat_send_all(text)
-- minetest.chat_send_player(name, text)
-- minetest.get_player_privs(name) -> set of privs
+-- minetest.get_modpath(modname) -> eg. "/home/user/.minetest/usermods/modname"
--
-- stackstring_take_item(stackstring) -> stackstring, item
-- stackstring_put_item(stackstring, item) -> stackstring, success
diff --git a/data/mods/experimental/init.lua b/data/mods/experimental/init.lua
index 6b82b02a2..d180d4778 100644
--- a/data/mods/experimental/init.lua
+++ b/data/mods/experimental/init.lua
@@ -405,4 +405,6 @@ minetest.register_abm({
end,
})--]]
+print("experimental modpath="..dump(minetest.get_modpath("experimental")))
+-- END
diff --git a/src/mods.h b/src/mods.h
index a6beb24f2..e85ec2f4c 100644
--- a/src/mods.h
+++ b/src/mods.h
@@ -17,6 +17,9 @@ 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
+
#include "irrlichttypes.h"
#include <set>
#include <string>
@@ -59,3 +62,5 @@ struct ModSpec
core::list<ModSpec> getMods(core::list<std::string> &modspaths)
throw(ModError);
+#endif
+
diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp
index c759683ed..40ad4d547 100644
--- a/src/scriptapi.cpp
+++ b/src/scriptapi.cpp
@@ -1334,6 +1334,23 @@ static int l_get_player_privs(lua_State *L)
return 1;
}
+// get_modpath(modname)
+static int l_get_modpath(lua_State *L)
+{
+ const char *modname = luaL_checkstring(L, 1);
+ // Get server from registry
+ lua_getfield(L, LUA_REGISTRYINDEX, "minetest_server");
+ Server *server = (Server*)lua_touserdata(L, -1);
+ // Do it
+ const ModSpec *mod = server->getModSpec(modname);
+ if(!mod){
+ lua_pushnil(L);
+ return 1;
+ }
+ lua_pushstring(L, mod->path.c_str());
+ return 1;
+}
+
static const struct luaL_Reg minetest_f [] = {
{"register_nodedef_defaults", l_register_nodedef_defaults},
{"register_entity", l_register_entity},
@@ -1350,6 +1367,7 @@ static const struct luaL_Reg minetest_f [] = {
{"chat_send_all", l_chat_send_all},
{"chat_send_player", l_chat_send_player},
{"get_player_privs", l_get_player_privs},
+ {"get_modpath", l_get_modpath},
{NULL, NULL}
};
diff --git a/src/server.cpp b/src/server.cpp
index 11c11b259..68a84b248 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -910,10 +910,10 @@ Server::Server(
throw ModError("Failed to load and run "+builtinpath);
}
// Load and run "mod" scripts
- core::list<ModSpec> mods = getMods(m_modspaths);
- for(core::list<ModSpec>::Iterator i = mods.begin();
- i != mods.end(); i++){
- ModSpec mod = *i;
+ m_mods = getMods(m_modspaths);
+ for(core::list<ModSpec>::Iterator i = m_mods.begin();
+ i != m_mods.end(); i++){
+ const ModSpec &mod = *i;
infostream<<"Server: Loading mod \""<<mod.name<<"\""<<std::endl;
std::string scriptpath = mod.path + DIR_DELIM + "init.lua";
bool success = scriptapi_loadmod(m_lua, scriptpath, mod.name);
@@ -4203,10 +4203,9 @@ void Server::SendTextures(u16 peer_id)
texture_bunches.push_back(core::list<SendableTexture>());
u32 texture_size_bunch_total = 0;
- core::list<ModSpec> mods = getMods(m_modspaths);
- for(core::list<ModSpec>::Iterator i = mods.begin();
- i != mods.end(); i++){
- ModSpec mod = *i;
+ for(core::list<ModSpec>::Iterator i = m_mods.begin();
+ i != m_mods.end(); i++){
+ const ModSpec &mod = *i;
std::string texturepath = mod.path + DIR_DELIM + "textures";
std::vector<fs::DirListNode> dirlist = fs::GetDirListing(texturepath);
for(u32 j=0; j<dirlist.size(); j++){
@@ -4560,6 +4559,17 @@ IWritableCraftItemDefManager* Server::getWritableCraftItemDefManager()
return m_craftitemdef;
}
+const ModSpec* Server::getModSpec(const std::string &modname)
+{
+ for(core::list<ModSpec>::Iterator i = m_mods.begin();
+ i != m_mods.end(); i++){
+ const ModSpec &mod = *i;
+ if(mod.name == modname)
+ return &mod;
+ }
+ return NULL;
+}
+
v3f findSpawnPos(ServerMap &map)
{
//return v3f(50,50,50)*BS;
diff --git a/src/server.h b/src/server.h
index f775f3391..ac8938175 100644
--- a/src/server.h
+++ b/src/server.h
@@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "gamedef.h"
#include "serialization.h" // For SER_FMT_VER_INVALID
#include "serverremoteplayer.h"
+#include "mods.h"
struct LuaState;
typedef struct lua_State lua_State;
class IWritableToolDefManager;
@@ -502,6 +503,8 @@ public:
IWritableCraftDefManager* getWritableCraftDefManager();
IWritableCraftItemDefManager* getWritableCraftItemDefManager();
+ const ModSpec* getModSpec(const std::string &modname);
+
private:
// con::PeerHandler implementation.
@@ -646,6 +649,9 @@ private:
// CraftItem definition manager
IWritableCraftItemDefManager *m_craftitemdef;
+ // Mods
+ core::list<ModSpec> m_mods;
+
/*
Threads
*/