Add InvRef::get/set_lists()
authorShadowNinja <shadowninja@minetest.net>
Sun, 5 Jan 2014 00:07:30 +0000 (19:07 -0500)
committerShadowNinja <shadowninja@minetest.net>
Sat, 11 Jan 2014 18:52:26 +0000 (13:52 -0500)
doc/lua_api.txt
src/script/lua_api/l_inventory.cpp
src/script/lua_api/l_inventory.h

index 4e73136deec2a6a226ddd364bd4a8370f0e51aa9..afb142513aa9206e6fccdd55d29de34ca32b3d8c 100644 (file)
@@ -1761,6 +1761,8 @@ methods:
 - set_stack(listname, i, stack): copy stack to index i in list
 - get_list(listname): return full list
 - set_list(listname, list): set full list (size will not change)
+- get_lists(): returns list of inventory lists
+- set_lists(lists): sets inventory lists (size will not change)
 - add_item(listname, stack): add item somewhere in list, returns leftover ItemStack
 - room_for_item(listname, stack): returns true if the stack of items
     can be fully added to the list
index d783cf60ff693060565e90ec44f361f3a4579493..aef011da31443bcf25a0c94abfbce119d1327c7a 100644 (file)
@@ -241,6 +241,52 @@ int InvRef::l_set_list(lua_State *L)
        return 0;
 }
 
+// get_lists(self) -> list of InventoryLists
+int InvRef::l_get_lists(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+       InvRef *ref = checkobject(L, 1);
+       Inventory *inv = getinv(L, ref);
+       if (!inv) {
+               return 0;
+       }
+       std::vector<const InventoryList*> lists = inv->getLists();
+       std::vector<const InventoryList*>::iterator iter = lists.begin();
+       lua_createtable(L, 0, lists.size());
+       for (; iter != lists.end(); iter++) {
+               const char* name = (*iter)->getName().c_str();
+               lua_pushstring(L, name);
+               push_inventory_list(L, inv, name);
+               lua_rawset(L, -3);
+       }
+       return 1;
+}
+
+// set_lists(self, lists)
+int InvRef::l_set_lists(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+       InvRef *ref = checkobject(L, 1);
+       Inventory *inv = getinv(L, ref);
+       if (!inv) {
+               return 0;
+       }
+       lua_pushnil(L);
+       while (lua_next(L, 2)) {
+               const char* listname = lua_tostring(L, -2);
+               InventoryList *list = inv->getList(listname);
+               if (list) {
+                       read_inventory_list(L, -1, inv, listname,
+                                       getServer(L), list->getSize());
+               } else {
+                       read_inventory_list(L, -1, inv, listname,
+                                       getServer(L));
+               }
+               lua_pop(L, 1);
+       }
+       return 0;
+}
+
 // add_item(self, listname, itemstack or itemstring or table or nil) -> itemstack
 // Returns the leftover stack
 int InvRef::l_add_item(lua_State *L)
@@ -426,6 +472,8 @@ const luaL_reg InvRef::methods[] = {
        luamethod(InvRef, set_stack),
        luamethod(InvRef, get_list),
        luamethod(InvRef, set_list),
+       luamethod(InvRef, get_lists),
+       luamethod(InvRef, set_lists),
        luamethod(InvRef, add_item),
        luamethod(InvRef, room_for_item),
        luamethod(InvRef, contains_item),
index ed3249e5fd51bfe817030d292e1f0151ebea581b..03b2410349fc5a9c23b305e3641e22705d73f7af 100644 (file)
@@ -79,6 +79,12 @@ private:
        // set_list(self, listname, list)
        static int l_set_list(lua_State *L);
 
+       // get_lists(self) -> list of InventoryLists
+       static int l_get_lists(lua_State *L);
+
+       // set_lists(self, lists)
+       static int l_set_lists(lua_State *L);
+
        // add_item(self, listname, itemstack or itemstring or table or nil) -> itemstack
        // Returns the leftover stack
        static int l_add_item(lua_State *L);