X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fnodemetadata.cpp;h=2a9131be0b014c55a2cad19695f12bb414886f36;hb=2c637ce1c26145269b09c62afb451240a8def401;hp=0b63d7779c6fe56d2946c50d393aadb86e68f2e7;hpb=c4315a7afafcc9adff945b5e63800340f6c2c008;p=minetest.git diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp index 0b63d7779..2a9131be0 100644 --- a/src/nodemetadata.cpp +++ b/src/nodemetadata.cpp @@ -1,29 +1,30 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +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 General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +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 "nodemetadata.h" -#include "utility.h" #include "exceptions.h" #include "gamedef.h" #include "inventory.h" -#include #include "log.h" +#include "util/serialize.h" +#include "constants.h" // MAP_BLOCKSIZE +#include /* NodeMetadata @@ -44,10 +45,11 @@ void NodeMetadata::serialize(std::ostream &os) const { int num_vars = m_stringvars.size(); writeU32(os, num_vars); - for(std::map::const_iterator - i = m_stringvars.begin(); i != m_stringvars.end(); i++){ - os<first); - os<second); + for (StringMap::const_iterator + it = m_stringvars.begin(); + it != m_stringvars.end(); ++it) { + os << serializeString(it->first); + os << serializeLongString(it->second); } m_inventory->serialize(os); @@ -82,7 +84,7 @@ void NodeMetadataList::serialize(std::ostream &os) const Version 0 is a placeholder for "nothing to see here; go away." */ - if(m_data.size() == 0){ + if(m_data.empty()){ writeU8(os, 0); // version return; } @@ -94,7 +96,7 @@ void NodeMetadataList::serialize(std::ostream &os) const for(std::map::const_iterator i = m_data.begin(); - i != m_data.end(); i++) + i != m_data.end(); ++i) { v3s16 p = i->first; NodeMetadata *data = i->second; @@ -108,10 +110,10 @@ void NodeMetadataList::serialize(std::ostream &os) const void NodeMetadataList::deSerialize(std::istream &is, IGameDef *gamedef) { - m_data.clear(); + clear(); u8 version = readU8(is); - + if(version == 0){ // Nothing return; @@ -129,12 +131,12 @@ void NodeMetadataList::deSerialize(std::istream &is, IGameDef *gamedef) { u16 p16 = readU16(is); - v3s16 p(0,0,0); - p.Z += p16 / MAP_BLOCKSIZE / MAP_BLOCKSIZE; - p16 -= p.Z * MAP_BLOCKSIZE * MAP_BLOCKSIZE; - p.Y += p16 / MAP_BLOCKSIZE; - p16 -= p.Y * MAP_BLOCKSIZE; - p.X += p16; + v3s16 p; + p.Z = p16 / MAP_BLOCKSIZE / MAP_BLOCKSIZE; + p16 &= MAP_BLOCKSIZE * MAP_BLOCKSIZE - 1; + p.Y = p16 / MAP_BLOCKSIZE; + p16 &= MAP_BLOCKSIZE - 1; + p.X = p16; if(m_data.find(p) != m_data.end()) { @@ -156,10 +158,21 @@ NodeMetadataList::~NodeMetadataList() clear(); } -NodeMetadata* NodeMetadataList::get(v3s16 p) +std::vector NodeMetadataList::getAllKeys() +{ + std::vector keys; + + std::map::const_iterator it; + for (it = m_data.begin(); it != m_data.end(); ++it) + keys.push_back(it->first); + + return keys; +} + +NodeMetadata *NodeMetadataList::get(v3s16 p) { - std::map::const_iterator n = m_data.find(p); - if(n == m_data.end()) + std::map::const_iterator n = m_data.find(p); + if (n == m_data.end()) return NULL; return n->second; } @@ -167,8 +180,7 @@ NodeMetadata* NodeMetadataList::get(v3s16 p) void NodeMetadataList::remove(v3s16 p) { NodeMetadata *olddata = get(p); - if(olddata) - { + if (olddata) { delete olddata; m_data.erase(p); } @@ -182,11 +194,41 @@ void NodeMetadataList::set(v3s16 p, NodeMetadata *d) void NodeMetadataList::clear() { - for(std::map::iterator - i = m_data.begin(); - i != m_data.end(); i++) - { - delete i->second; + std::map::iterator it; + for (it = m_data.begin(); it != m_data.end(); ++it) { + delete it->second; } m_data.clear(); } + +std::string NodeMetadata::getString(const std::string &name, + unsigned short recursion) const +{ + StringMap::const_iterator it = m_stringvars.find(name); + if (it == m_stringvars.end()) + return ""; + + return resolveString(it->second, recursion); +} + +void NodeMetadata::setString(const std::string &name, const std::string &var) +{ + if (var.empty()) { + m_stringvars.erase(name); + } else { + m_stringvars[name] = var; + } +} + +std::string NodeMetadata::resolveString(const std::string &str, + unsigned short recursion) const +{ + if (recursion > 1) { + return str; + } + if (str.substr(0, 2) == "${" && str[str.length() - 1] == '}') { + return getString(str.substr(2, str.length() - 3), recursion + 1); + } + return str; +} +