]> git.lizzy.rs Git - minetest.git/blobdiff - src/itemstackmetadata.cpp
Add callback on_mapblocks_changed
[minetest.git] / src / itemstackmetadata.cpp
index 4aa1a09030541e42ceb6800ac242f29799c16661..c8ce2449f622d00cfaf35d619007626c300ac9f0 100644 (file)
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "itemstackmetadata.h"
 #include "util/serialize.h"
 #include "util/strfnd.h"
+#include <algorithm>
 
 #define DESERIALIZE_START '\x01'
 #define DESERIALIZE_KV_DELIM '\x02'
@@ -33,21 +34,33 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 void ItemStackMetadata::clear()
 {
-       Metadata::clear();
+       SimpleMetadata::clear();
        updateToolCapabilities();
 }
 
+static void sanitize_string(std::string &str)
+{
+       str.erase(std::remove(str.begin(), str.end(), DESERIALIZE_START), str.end());
+       str.erase(std::remove(str.begin(), str.end(), DESERIALIZE_KV_DELIM), str.end());
+       str.erase(std::remove(str.begin(), str.end(), DESERIALIZE_PAIR_DELIM), str.end());
+}
+
 bool ItemStackMetadata::setString(const std::string &name, const std::string &var)
 {
-       bool result = Metadata::setString(name, var);
-       if (name == TOOLCAP_KEY)
+       std::string clean_name = name;
+       std::string clean_var = var;
+       sanitize_string(clean_name);
+       sanitize_string(clean_var);
+
+       bool result = SimpleMetadata::setString(clean_name, clean_var);
+       if (clean_name == TOOLCAP_KEY)
                updateToolCapabilities();
        return result;
 }
 
 void ItemStackMetadata::serialize(std::ostream &os) const
 {
-       std::ostringstream os2;
+       std::ostringstream os2(std::ios_base::binary);
        os2 << DESERIALIZE_START;
        for (const auto &stringvar : m_stringvars) {
                if (!stringvar.first.empty() || !stringvar.second.empty())