]> git.lizzy.rs Git - minetest.git/commitdiff
Inventory: show error on invalid list names (#11368)
authorSmallJoker <SmallJoker@users.noreply.github.com>
Sun, 20 Jun 2021 15:21:50 +0000 (17:21 +0200)
committerGitHub <noreply@github.com>
Sun, 20 Jun 2021 15:21:50 +0000 (17:21 +0200)
src/inventory.h
src/script/common/c_content.cpp

index f36bc57cf64e3ffc11443c4c21201ce849326a65..fbf995fab3af3727461322ba52077177907b35f5 100644 (file)
@@ -298,6 +298,7 @@ class Inventory
        void serialize(std::ostream &os, bool incremental = false) const;
        void deSerialize(std::istream &is);
 
+       // Adds a new list or clears and resizes an existing one
        InventoryList * addList(const std::string &name, u32 size);
        InventoryList * getList(const std::string &name);
        const InventoryList * getList(const std::string &name) const;
index 52baeae9d5c5758f0a0cd698e045b3c66ff923f8..f8cc4092735f491adf74a180def3fa27df880abb 100644 (file)
@@ -1350,26 +1350,28 @@ void read_inventory_list(lua_State *L, int tableindex,
 {
        if(tableindex < 0)
                tableindex = lua_gettop(L) + 1 + tableindex;
+
        // If nil, delete list
        if(lua_isnil(L, tableindex)){
                inv->deleteList(name);
                return;
        }
-       // Otherwise set list
+
+       // Get Lua-specified items to insert into the list
        std::vector<ItemStack> items = read_items(L, tableindex,srv);
-       int listsize = (forcesize != -1) ? forcesize : items.size();
+       size_t listsize = (forcesize > 0) ? forcesize : items.size();
+
+       // Create or clear list
        InventoryList *invlist = inv->addList(name, listsize);
-       int index = 0;
-       for(std::vector<ItemStack>::const_iterator
-                       i = items.begin(); i != items.end(); ++i){
-               if(forcesize != -1 && index == forcesize)
-                       break;
-               invlist->changeItem(index, *i);
-               index++;
+       if (!invlist) {
+               luaL_error(L, "inventory list: cannot create list named '%s'", name);
+               return;
        }
-       while(forcesize != -1 && index < forcesize){
-               invlist->deleteItem(index);
-               index++;
+
+       for (size_t i = 0; i < items.size(); ++i) {
+               if (i == listsize)
+                       break; // Truncate provided list of items
+               invlist->changeItem(i, items[i]);
        }
 }