]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/itemstackmetadata.cpp
Remove obsolete eye_height related workaround
[dragonfireclient.git] / src / itemstackmetadata.cpp
index f63671425d390222397a35df81aa0a0dbbe68b10..529e0149f94c54b6a88becd05fbb39addc2ecbec 100644 (file)
@@ -1,6 +1,27 @@
+/*
+Minetest
+Copyright (C) 2017-8 rubenwardy <rw@rubenwardy.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+
 #include "itemstackmetadata.h"
 #include "util/serialize.h"
 #include "util/strfnd.h"
+#include <algorithm>
 
 #define DESERIALIZE_START '\x01'
 #define DESERIALIZE_KV_DELIM '\x02'
@@ -9,9 +30,37 @@
 #define DESERIALIZE_KV_DELIM_STR "\x02"
 #define DESERIALIZE_PAIR_DELIM_STR "\x03"
 
+#define TOOLCAP_KEY "tool_capabilities"
+
+void ItemStackMetadata::clear()
+{
+       Metadata::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)
+{
+       std::string clean_name = name;
+       std::string clean_var = var;
+       sanitize_string(clean_name);
+       sanitize_string(clean_var);
+
+       bool result = Metadata::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())
@@ -41,4 +90,29 @@ void ItemStackMetadata::deSerialize(std::istream &is)
                        m_stringvars[""] = in;
                }
        }
+       updateToolCapabilities();
+}
+
+void ItemStackMetadata::updateToolCapabilities()
+{
+       if (contains(TOOLCAP_KEY)) {
+               toolcaps_overridden = true;
+               toolcaps_override = ToolCapabilities();
+               std::istringstream is(getString(TOOLCAP_KEY));
+               toolcaps_override.deserializeJson(is);
+       } else {
+               toolcaps_overridden = false;
+       }
+}
+
+void ItemStackMetadata::setToolCapabilities(const ToolCapabilities &caps)
+{
+       std::ostringstream os;
+       caps.serializeJson(os);
+       setString(TOOLCAP_KEY, os.str());
+}
+
+void ItemStackMetadata::clearToolCapabilities()
+{
+       setString(TOOLCAP_KEY, "");
 }