Fix bone-attached entities (#10015)
[oweals/minetest.git] / src / metadata.cpp
index 2ce9af5afe403777dfba5636054ca156368c8ef9..453ac1c9adc905d7193415ce588f321a0fb80fa5 100644 (file)
@@ -18,12 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "metadata.h"
-#include "exceptions.h"
-#include "gamedef.h"
 #include "log.h"
-#include <sstream>
-#include "constants.h" // MAP_BLOCKSIZE
-#include <sstream>
 
 /*
        Metadata
@@ -32,11 +27,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 void Metadata::clear()
 {
        m_stringvars.clear();
+       m_modified = true;
 }
 
 bool Metadata::empty() const
 {
-       return m_stringvars.size() == 0;
+       return m_stringvars.empty();
 }
 
 size_t Metadata::size() const
@@ -54,18 +50,15 @@ bool Metadata::operator==(const Metadata &other) const
        if (size() != other.size())
                return false;
 
-       for (StringMap::const_iterator it = m_stringvars.begin();
-                       it != m_stringvars.end(); ++it) {
-               if (!other.contains(it->first) ||
-                               other.getString(it->first) != it->second)
+       for (const auto &sv : m_stringvars) {
+               if (!other.contains(sv.first) || other.getString(sv.first) != sv.second)
                        return false;
        }
 
        return true;
 }
 
-const std::string &Metadata::getString(const std::string &name,
-               u16 recursion) const
+const std::string &Metadata::getString(const std::string &name, u16 recursion) const
 {
        StringMap::const_iterator it = m_stringvars.find(name);
        if (it == m_stringvars.end()) {
@@ -76,6 +69,18 @@ const std::string &Metadata::getString(const std::string &name,
        return resolveString(it->second, recursion);
 }
 
+bool Metadata::getStringToRef(
+               const std::string &name, std::string &str, u16 recursion) const
+{
+       StringMap::const_iterator it = m_stringvars.find(name);
+       if (it == m_stringvars.end()) {
+               return false;
+       }
+
+       str = resolveString(it->second, recursion);
+       return true;
+}
+
 /**
  * Sets var to name key in the metadata storage
  *
@@ -96,16 +101,15 @@ bool Metadata::setString(const std::string &name, const std::string &var)
        }
 
        m_stringvars[name] = var;
+       m_modified = true;
        return true;
 }
 
-const std::string &Metadata::resolveString(const std::string &str,
-               u16 recursion) const
+const std::string &Metadata::resolveString(const std::string &str, u16 recursion) const
 {
-       if (recursion <= 1 &&
-                       str.substr(0, 2) == "${" && str[str.length() - 1] == '}') {
+       if (recursion <= 1 && str.substr(0, 2) == "${" && str[str.length() - 1] == '}') {
                return getString(str.substr(2, str.length() - 3), recursion + 1);
-       } else {
-               return str;
        }
+
+       return str;
 }