Fix InventoryList reading order
Lua does not guarantee that the indexes of a table will be in numerical order.master
parent
8e1d78e9de
commit
829426c714
|
@ -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)
|
if(index < 0)
|
||||||
index = lua_gettop(L) + 1 + index;
|
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;
|
std::vector<ItemStack> items;
|
||||||
luaL_checktype(L, index, LUA_TTABLE);
|
luaL_checktype(L, index, LUA_TTABLE);
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
while(lua_next(L, index) != 0){
|
while (lua_next(L, index)) {
|
||||||
// key at index -2 and value at index -1
|
s32 key = luaL_checkinteger(L, -2);
|
||||||
items.push_back(read_item(L, -1, srv));
|
if (key < 1) {
|
||||||
// removes value, keeps key for next iteration
|
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);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
return items;
|
return items;
|
||||||
|
|
Loading…
Reference in New Issue