Add minetest.get_modpath(modname)
authorPerttu Ahola <celeron55@gmail.com>
Sun, 11 Dec 2011 14:49:40 +0000 (16:49 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Sun, 11 Dec 2011 14:49:40 +0000 (16:49 +0200)
data/mods/default/init.lua
data/mods/experimental/init.lua
src/mods.h
src/scriptapi.cpp
src/server.cpp
src/server.h

index 782eba5a546530b05b993f5a3cabe993a58e5949..95d9c19ff2e9ebb630bc41836fccd7fe5acdad7b 100644 (file)
 -- 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
index 6b82b02a2237462e249ca3dd00331ea27a248e02..d180d4778e5f09580b16447ef6efb578a1d5bfb7 100644 (file)
@@ -405,4 +405,6 @@ minetest.register_abm({
     end,
 })--]]
 
+print("experimental modpath="..dump(minetest.get_modpath("experimental")))
 
+-- END
index a6beb24f2b8f22c2648a3211759648ca80e6cafa..e85ec2f4c85f4dc5f5c22a64904f1c6d35eb3538 100644 (file)
@@ -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
+
index c759683edb388959c07c5e2565991eb3c1801e1c..40ad4d54787192ca1005317f3bb9867cdafecbf2 100644 (file)
@@ -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}
 };
 
index 11c11b259c729da64167eb29eb1cb275d146bab4..68a84b2486521a76b1fa9762790f5ffe6a215eb5 100644 (file)
@@ -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;
index f775f33918fafd517f13dda24d432965e9c5088f..ac893817540124836eda84de2f7ccce76ee581c0 100644 (file)
@@ -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
        */