mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 16:13:46 +01:00
Fix incompatibility of ItemStack.to_table() introduced by stack meta
This commit is contained in:
parent
8bc6a303b4
commit
0680c47d6c
@ -848,6 +848,21 @@ ItemStack read_item(lua_State* L, int index,Server* srv)
|
|||||||
istack.metadata.setString("", value);
|
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;
|
return istack;
|
||||||
} else {
|
} else {
|
||||||
throw LuaError("Expecting itemstack, itemstring, table or nil");
|
throw LuaError("Expecting itemstack, itemstring, table or nil");
|
||||||
|
@ -225,23 +225,21 @@ int LuaItemStack::l_to_table(lua_State *L)
|
|||||||
lua_pushinteger(L, item.wear);
|
lua_pushinteger(L, item.wear);
|
||||||
lua_setfield(L, -2, "wear");
|
lua_setfield(L, -2, "wear");
|
||||||
|
|
||||||
if (item.metadata.size() == 1 && item.metadata.contains("")) {
|
const std::string &metadata_str = item.metadata.getString("");
|
||||||
const std::string &value = 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_pushlstring(L, value.c_str(), value.size());
|
||||||
lua_setfield(L, -2, "metadata");
|
lua_settable(L, -3);
|
||||||
} 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_setfield(L, -2, "meta");
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user