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");
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;
}