Fix InventoryList reading order
authorShadowNinja <shadowninja@minetest.net>
Mon, 30 Dec 2013 19:00:05 +0000 (14:00 -0500)
committerShadowNinja <shadowninja@minetest.net>
Mon, 30 Dec 2013 19:00:05 +0000 (14:00 -0500)
Lua does not guarantee that the indexes of a table will be in numerical order.

src/script/common/c_content.cpp

index cb5a92ae46fcc31286f609652b4df376b955ee7d..a8f87424197ab1bc3505a77753cb54819dfe6d6d 100644 (file)
@@ -884,7 +884,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, Server *srv)
 {
        if(index < 0)
                index = lua_gettop(L) + 1 + index;
@@ -892,10 +892,15 @@ std::vector<ItemStack> read_items(lua_State *L, int index,Server* srv)
        std::vector<ItemStack> items;
        luaL_checktype(L, index, LUA_TTABLE);
        lua_pushnil(L);
-       while(lua_next(L, index) != 0){
-               // key at index -2 and value at index -1
-               items.push_back(read_item(L, -1, srv));
-               // removes value, keeps key for next iteration
+       while (lua_next(L, index)) {
+               s32 key = luaL_checkinteger(L, -2);
+               if (key < 1) {
+                       throw LuaError(NULL, "Invalid inventory list index");
+               }
+               if (items.size() < (u32) key) {
+                       items.resize(key);
+               }
+               items[key - 1] = read_item(L, -1, srv);
                lua_pop(L, 1);
        }
        return items;