X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fitemstackmetadata.cpp;h=4aa1a09030541e42ceb6800ac242f29799c16661;hb=4f9c33de640a748d020e63c7c85ccbbe341ab7a7;hp=02c548abb6ae88b18519eec027f480381f385f0d;hpb=1d086aee7cc193bed2f8ca09cc2e020f509378f1;p=dragonfireclient.git diff --git a/src/itemstackmetadata.cpp b/src/itemstackmetadata.cpp index 02c548abb..4aa1a0903 100644 --- a/src/itemstackmetadata.cpp +++ b/src/itemstackmetadata.cpp @@ -1,3 +1,23 @@ +/* +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" @@ -9,13 +29,30 @@ #define DESERIALIZE_KV_DELIM_STR "\x02" #define DESERIALIZE_PAIR_DELIM_STR "\x03" +#define TOOLCAP_KEY "tool_capabilities" + +void ItemStackMetadata::clear() +{ + Metadata::clear(); + updateToolCapabilities(); +} + +bool ItemStackMetadata::setString(const std::string &name, const std::string &var) +{ + bool result = Metadata::setString(name, var); + if (name == TOOLCAP_KEY) + updateToolCapabilities(); + return result; +} + void ItemStackMetadata::serialize(std::ostream &os) const { std::ostringstream os2; os2 << DESERIALIZE_START; for (const auto &stringvar : m_stringvars) { - os2 << stringvar.first << DESERIALIZE_KV_DELIM - << stringvar.second << DESERIALIZE_PAIR_DELIM; + if (!stringvar.first.empty() || !stringvar.second.empty()) + os2 << stringvar.first << DESERIALIZE_KV_DELIM + << stringvar.second << DESERIALIZE_PAIR_DELIM; } os << serializeJsonStringIfNeeded(os2.str()); } @@ -40,4 +77,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, ""); }