]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Refactor some Lua API functions in preparation for async env
authorsfan5 <sfan5@live.de>
Sat, 9 Apr 2022 12:47:59 +0000 (14:47 +0200)
committersfan5 <sfan5@live.de>
Mon, 2 May 2022 18:54:55 +0000 (20:54 +0200)
src/gamedef.h
src/script/common/c_content.cpp
src/script/common/c_content.h
src/script/lua_api/l_craft.cpp
src/script/lua_api/l_item.cpp
src/script/lua_api/l_server.cpp
src/server.cpp
src/server.h

index 8a9246da24cbead4541bcfe8111593627fb2b13b..45b9c475011d420445e74c3ce8cdba896e32ae44 100644 (file)
@@ -63,6 +63,8 @@ class IGameDef
        virtual IRollbackManager* getRollbackManager() { return NULL; }
 
        // Shorthands
+       // TODO: these should be made const-safe so that a const IGameDef* is
+       //       actually usable
        IItemDefManager  *idef()     { return getItemDefManager(); }
        const NodeDefManager  *ndef() { return getNodeDefManager(); }
        ICraftDefManager *cdef()     { return getCraftDefManager(); }
index 36f4316ee2846f24fc5882a4a6ba57c9b6319800..a233afb0525899cd2eb31b50e5c78b41d643e641 100644 (file)
@@ -1371,7 +1371,7 @@ void push_inventory_lists(lua_State *L, const Inventory &inv)
 
 /******************************************************************************/
 void read_inventory_list(lua_State *L, int tableindex,
-               Inventory *inv, const char *name, Server* srv, int forcesize)
+               Inventory *inv, const char *name, IGameDef *gdef, int forcesize)
 {
        if(tableindex < 0)
                tableindex = lua_gettop(L) + 1 + tableindex;
@@ -1383,7 +1383,7 @@ void read_inventory_list(lua_State *L, int tableindex,
        }
 
        // Get Lua-specified items to insert into the list
-       std::vector<ItemStack> items = read_items(L, tableindex,srv);
+       std::vector<ItemStack> items = read_items(L, tableindex, gdef);
        size_t listsize = (forcesize >= 0) ? forcesize : items.size();
 
        // Create or resize/clear list
@@ -1635,7 +1635,7 @@ void push_items(lua_State *L, const std::vector<ItemStack> &items)
 }
 
 /******************************************************************************/
-std::vector<ItemStack> read_items(lua_State *L, int index, Server *srv)
+std::vector<ItemStack> read_items(lua_State *L, int index, IGameDef *gdef)
 {
        if(index < 0)
                index = lua_gettop(L) + 1 + index;
@@ -1651,7 +1651,7 @@ std::vector<ItemStack> read_items(lua_State *L, int index, Server *srv)
                if (items.size() < (u32) key) {
                        items.resize(key);
                }
-               items[key - 1] = read_item(L, -1, srv->idef());
+               items[key - 1] = read_item(L, -1, gdef->idef());
                lua_pop(L, 1);
        }
        return items;
index 11b39364f037aeb2a7ea3857f870775a6cad75d5..a7b8709c623ae5b797040024ed2b115f29c6618c 100644 (file)
@@ -59,7 +59,7 @@ class InventoryList;
 struct NodeBox;
 struct ContentFeatures;
 struct TileDef;
-class Server;
+class IGameDef;
 struct DigParams;
 struct HitParams;
 struct EnumString;
@@ -126,7 +126,7 @@ void               push_inventory_lists      (lua_State *L,
                                               const Inventory &inv);
 void               read_inventory_list       (lua_State *L, int tableindex,
                                               Inventory *inv, const char *name,
-                                              Server *srv, int forcesize=-1);
+                                              IGameDef *gdef, int forcesize=-1);
 
 MapNode            readnode                  (lua_State *L, int index,
                                               const NodeDefManager *ndef);
@@ -166,7 +166,7 @@ void               push_items                (lua_State *L,
 
 std::vector<ItemStack> read_items            (lua_State *L,
                                               int index,
-                                              Server* srv);
+                                              IGameDef* gdef);
 
 void               push_soundspec            (lua_State *L,
                                               const SimpleSoundSpec &spec);
index 18622ee00826faf939986a6a29e32fb233788cbc..c2c5a5551c1b908d716c32e4ca3fd8ac54da3272 100644 (file)
@@ -371,8 +371,9 @@ int ModApiCraft::l_clear_craft(lua_State *L)
 int ModApiCraft::l_get_craft_result(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
+       IGameDef *gdef = getGameDef(L);
 
-       int input_i = 1;
+       const int input_i = 1;
        std::string method_s = getstringfield_default(L, input_i, "method", "normal");
        enum CraftMethod method = (CraftMethod)getenumfield(L, input_i, "method",
                                es_CraftMethod, CRAFT_METHOD_NORMAL);
@@ -382,10 +383,9 @@ int ModApiCraft::l_get_craft_result(lua_State *L)
                width = luaL_checkinteger(L, -1);
        lua_pop(L, 1);
        lua_getfield(L, input_i, "items");
-       std::vector<ItemStack> items = read_items(L, -1,getServer(L));
+       std::vector<ItemStack> items = read_items(L, -1, gdef);
        lua_pop(L, 1); // items
 
-       IGameDef *gdef = getServer(L);
        ICraftDefManager *cdef = gdef->cdef();
        CraftInput input(method, width, items);
        CraftOutput output;
@@ -465,13 +465,13 @@ static void push_craft_recipes(lua_State *L, IGameDef *gdef,
                const std::vector<CraftDefinition*> &recipes,
                const CraftOutput &output)
 {
-       lua_createtable(L, recipes.size(), 0);
-
        if (recipes.empty()) {
                lua_pushnil(L);
                return;
        }
 
+       lua_createtable(L, recipes.size(), 0);
+
        std::vector<CraftDefinition*>::const_iterator it = recipes.begin();
        for (unsigned i = 0; it != recipes.end(); ++it) {
                lua_newtable(L);
@@ -487,10 +487,9 @@ int ModApiCraft::l_get_craft_recipe(lua_State *L)
        NO_MAP_LOCK_REQUIRED;
 
        std::string item = luaL_checkstring(L, 1);
-       Server *server = getServer(L);
+       IGameDef *gdef = getGameDef(L);
        CraftOutput output(item, 0);
-       std::vector<CraftDefinition*> recipes = server->cdef()
-                       ->getCraftRecipes(output, server, 1);
+       auto recipes = gdef->cdef()->getCraftRecipes(output, gdef, 1);
 
        lua_createtable(L, 1, 0);
 
@@ -500,7 +499,7 @@ int ModApiCraft::l_get_craft_recipe(lua_State *L)
                setintfield(L, -1, "width", 0);
                return 1;
        }
-       push_craft_recipe(L, server, recipes[0], output);
+       push_craft_recipe(L, gdef, recipes[0], output);
        return 1;
 }
 
@@ -510,12 +509,11 @@ int ModApiCraft::l_get_all_craft_recipes(lua_State *L)
        NO_MAP_LOCK_REQUIRED;
 
        std::string item = luaL_checkstring(L, 1);
-       Server *server = getServer(L);
+       IGameDef *gdef = getGameDef(L);
        CraftOutput output(item, 0);
-       std::vector<CraftDefinition*> recipes = server->cdef()
-                       ->getCraftRecipes(output, server);
+       auto recipes = gdef->cdef()->getCraftRecipes(output, gdef);
 
-       push_craft_recipes(L, server, recipes, output);
+       push_craft_recipes(L, gdef, recipes, output);
        return 1;
 }
 
index 794d8a6e5cafcd05666295c80b2cc5be1bbf6ffd..fc97a1736ca8a85625e12b69afca7218985609cb 100644 (file)
@@ -632,8 +632,8 @@ int ModApiItemMod::l_get_content_id(lua_State *L)
        NO_MAP_LOCK_REQUIRED;
        std::string name = luaL_checkstring(L, 1);
 
-       const IItemDefManager *idef = getGameDef(L)->getItemDefManager();
-       const NodeDefManager *ndef = getGameDef(L)->getNodeDefManager();
+       const IItemDefManager *idef = getGameDef(L)->idef();
+       const NodeDefManager *ndef = getGameDef(L)->ndef();
 
        // If this is called at mod load time, NodeDefManager isn't aware of
        // aliases yet, so we need to handle them manually
@@ -658,7 +658,7 @@ int ModApiItemMod::l_get_name_from_content_id(lua_State *L)
        NO_MAP_LOCK_REQUIRED;
        content_t c = luaL_checkint(L, 1);
 
-       const NodeDefManager *ndef = getGameDef(L)->getNodeDefManager();
+       const NodeDefManager *ndef = getGameDef(L)->ndef();
        const char *name = ndef->get(c).name.c_str();
 
        lua_pushstring(L, name);
index 5b3054d179ff168acd87dfdf4ffa3554bb619041..42725e5d2e6d7426c393803b1481685140f53168 100644 (file)
@@ -61,11 +61,8 @@ int ModApiServer::l_get_server_uptime(lua_State *L)
 int ModApiServer::l_get_server_max_lag(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
-       ServerEnvironment *s_env = dynamic_cast<ServerEnvironment *>(getEnv(L));
-       if (!s_env)
-               lua_pushnil(L);
-       else
-               lua_pushnumber(L, s_env->getMaxLagEstimate());
+       GET_ENV_PTR;
+       lua_pushnumber(L, env->getMaxLagEstimate());
        return 1;
 }
 
@@ -395,12 +392,11 @@ int ModApiServer::l_get_modpath(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
        std::string modname = luaL_checkstring(L, 1);
-       const ModSpec *mod = getServer(L)->getModSpec(modname);
-       if (!mod) {
+       const ModSpec *mod = getGameDef(L)->getModSpec(modname);
+       if (!mod)
                lua_pushnil(L);
-               return 1;
-       }
-       lua_pushstring(L, mod->path.c_str());
+       else
+               lua_pushstring(L, mod->path.c_str());
        return 1;
 }
 
@@ -412,13 +408,14 @@ int ModApiServer::l_get_modnames(lua_State *L)
 
        // Get a list of mods
        std::vector<std::string> modlist;
-       getServer(L)->getModNames(modlist);
+       for (auto &it : getGameDef(L)->getMods())
+               modlist.emplace_back(it.name);
 
        std::sort(modlist.begin(), modlist.end());
 
        // Package them up for Lua
        lua_createtable(L, modlist.size(), 0);
-       std::vector<std::string>::iterator iter = modlist.begin();
+       auto iter = modlist.begin();
        for (u16 i = 0; iter != modlist.end(); ++iter) {
                lua_pushstring(L, iter->c_str());
                lua_rawseti(L, -2, ++i);
@@ -430,8 +427,8 @@ int ModApiServer::l_get_modnames(lua_State *L)
 int ModApiServer::l_get_worldpath(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
-       std::string worldpath = getServer(L)->getWorldPath();
-       lua_pushstring(L, worldpath.c_str());
+       const Server *srv = getServer(L);
+       lua_pushstring(L, srv->getWorldPath().c_str());
        return 1;
 }
 
@@ -513,7 +510,8 @@ int ModApiServer::l_dynamic_add_media(lua_State *L)
 int ModApiServer::l_is_singleplayer(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
-       lua_pushboolean(L, getServer(L)->isSingleplayer());
+       const Server *srv = getServer(L);
+       lua_pushboolean(L, srv->isSingleplayer());
        return 1;
 }
 
index 9d7e8e56347a00f0a2655ee10030e2c2b215b34d..dec6cf44ce3e28af18c452ee73aa32f00ffc6c1b 100644 (file)
@@ -3658,11 +3658,6 @@ const ModSpec *Server::getModSpec(const std::string &modname) const
        return m_modmgr->getModSpec(modname);
 }
 
-void Server::getModNames(std::vector<std::string> &modlist)
-{
-       m_modmgr->getModNames(modlist);
-}
-
 std::string Server::getBuiltinLuaPath()
 {
        return porting::path_share + DIR_DELIM + "builtin";
index 008213c5d6e66dd8893d33412f8bd3dac3c35f5d..bd799c31363288854d1d4ca686d8e4f7fe7fdd3a 100644 (file)
@@ -292,11 +292,10 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 
        virtual const std::vector<ModSpec> &getMods() const;
        virtual const ModSpec* getModSpec(const std::string &modname) const;
-       void getModNames(std::vector<std::string> &modlist);
        std::string getBuiltinLuaPath();
        virtual std::string getWorldPath() const { return m_path_world; }
 
-       inline bool isSingleplayer()
+       inline bool isSingleplayer() const
                        { return m_simple_singleplayer_mode; }
 
        inline void setAsyncFatalError(const std::string &error)