Skip to content

Commit

Permalink
Fix incompatibility of ItemStack.to_table() introduced by stack meta
Browse files Browse the repository at this point in the history
  • Loading branch information
rubenwardy committed Feb 7, 2017
1 parent 8bc6a30 commit 0680c47
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 15 deletions.
15 changes: 15 additions & 0 deletions src/script/common/c_content.cpp
Expand Up @@ -848,6 +848,21 @@ ItemStack read_item(lua_State* L, int index,Server* srv)
istack.metadata.setString("", value);
}

lua_getfield(L, index, "meta");
fieldstable = lua_gettop(L);
if (lua_istable(L, fieldstable)) {
lua_pushnil(L);
while (lua_next(L, fieldstable) != 0) {
// key at index -2 and value at index -1
std::string key = lua_tostring(L, -2);
size_t value_len;
const char *value_cs = lua_tolstring(L, -1, &value_len);
std::string value(value_cs, value_len);
istack.metadata.setString(name, value);
lua_pop(L, 1); // removes value, keeps key for next iteration
}
}

return istack;
} else {
throw LuaError("Expecting itemstack, itemstring, table or nil");
Expand Down
28 changes: 13 additions & 15 deletions src/script/lua_api/l_item.cpp
Expand Up @@ -225,23 +225,21 @@ int LuaItemStack::l_to_table(lua_State *L)
lua_pushinteger(L, item.wear);
lua_setfield(L, -2, "wear");

if (item.metadata.size() == 1 && item.metadata.contains("")) {
const std::string &value = item.metadata.getString("");
const std::string &metadata_str = item.metadata.getString("");
lua_pushlstring(L, metadata_str.c_str(), metadata_str.size());
lua_setfield(L, -2, "metadata");

lua_newtable(L);
const StringMap &fields = item.metadata.getStrings();
for (StringMap::const_iterator it = fields.begin();
it != fields.end(); ++it) {
const std::string &name = it->first;
const std::string &value = it->second;
lua_pushlstring(L, name.c_str(), name.size());
lua_pushlstring(L, value.c_str(), value.size());
lua_setfield(L, -2, "metadata");
} else {
lua_newtable(L);
const StringMap &fields = item.metadata.getStrings();
for (StringMap::const_iterator it = fields.begin();
it != fields.end(); ++it) {
const std::string &name = it->first;
const std::string &value = it->second;
lua_pushlstring(L, name.c_str(), name.size());
lua_pushlstring(L, value.c_str(), value.size());
lua_settable(L, -3);
}
lua_setfield(L, -2, "metadata");
lua_settable(L, -3);
}
lua_setfield(L, -2, "meta");
}
return 1;
}
Expand Down

0 comments on commit 0680c47

Please sign in to comment.