Browse Source

Refactor some Lua API functions in preparation for async env

sfan5 2 years ago
parent
commit
56a558baf8

+ 2 - 0
src/gamedef.h

@@ -63,6 +63,8 @@ public:
 	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(); }

+ 4 - 4
src/script/common/c_content.cpp

@@ -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;

+ 3 - 3
src/script/common/c_content.h

@@ -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);

+ 11 - 13
src/script/lua_api/l_craft.cpp

@@ -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;
 }
 

+ 3 - 3
src/script/lua_api/l_item.cpp

@@ -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);

+ 13 - 15
src/script/lua_api/l_server.cpp

@@ -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;
 }
 

+ 0 - 5
src/server.cpp

@@ -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";

+ 1 - 2
src/server.h

@@ -292,11 +292,10 @@ public:
 
 	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)