X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fitemstackmetadata.cpp;h=7a26fbb0ea2a26661cccc0e90622b33be78ca1de;hb=a049e8267fabd101cb5c6528b3270214cb0647f0;hp=f63671425d390222397a35df81aa0a0dbbe68b10;hpb=557bbc670451f82c384032383df80a1a92ffe724;p=dragonfireclient.git diff --git a/src/itemstackmetadata.cpp b/src/itemstackmetadata.cpp index f63671425..7a26fbb0e 100644 --- a/src/itemstackmetadata.cpp +++ b/src/itemstackmetadata.cpp @@ -1,6 +1,27 @@ +/* +Minetest +Copyright (C) 2017-8 rubenwardy + +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 #define DESERIALIZE_START '\x01' #define DESERIALIZE_KV_DELIM '\x02' @@ -9,6 +30,34 @@ #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; @@ -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, ""); }