X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnodemetadata.cpp;h=141c779f14e176b40b8774c1e487c6abbdfde15c;hb=8eb717d4d0d4131eb5b82a73b343c7309b1ebf47;hp=775b59b241bfc6f85e5d008d94670c2a5c1d446c;hpb=3a58f8179f09ea90cefb4ef7ff18ed1d8e27d0f2;p=oweals%2Fminetest.git diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp index 775b59b24..141c779f1 100644 --- a/src/nodemetadata.cpp +++ b/src/nodemetadata.cpp @@ -3,147 +3,132 @@ Minetest-c55 Copyright (C) 2010-2011 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 "mapnode.h" #include "exceptions.h" +#include "gamedef.h" +#include "inventory.h" +#include "log.h" +#include "util/serialize.h" +#include "constants.h" // MAP_BLOCKSIZE +#include /* NodeMetadata */ -core::map NodeMetadata::m_types; - -NodeMetadata::NodeMetadata() +NodeMetadata::NodeMetadata(IGameDef *gamedef): + m_stringvars(), + m_inventory(new Inventory(gamedef->idef())) { } NodeMetadata::~NodeMetadata() { + delete m_inventory; } -NodeMetadata* NodeMetadata::deSerialize(std::istream &is) +void NodeMetadata::serialize(std::ostream &os) const { - u8 buf[2]; - is.read((char*)buf, 2); - s16 id = readS16(buf); - - core::map::Node *n; - n = m_types.find(id); - if(n == NULL) - { - dstream<<"NodeMetadata(): No factory for typeId="<::const_iterator + i = m_stringvars.begin(); i != m_stringvars.end(); i++){ + os<first); + os<second); } - - Factory f = n->getValue(); - NodeMetadata *meta = (*f)(is); - return meta; + + m_inventory->serialize(os); } -void NodeMetadata::serialize(std::ostream &os) +void NodeMetadata::deSerialize(std::istream &is) { - u8 buf[2]; - writeU16(buf, typeId()); - os.write((char*)buf, 2); + m_stringvars.clear(); + int num_vars = readU32(is); + for(int i=0; ideSerialize(is); } -void NodeMetadata::registerType(u16 id, Factory f) +void NodeMetadata::clear() { - core::map::Node *n; - n = m_types.find(id); - if(n) - return; - m_types.insert(id, f); + m_stringvars.clear(); + m_inventory->clear(); } /* - SignNodeMetadata + NodeMetadataList */ -SignNodeMetadata::SignNodeMetadata(std::string text): - m_text(text) -{ - NodeMetadata::registerType(typeId(), create); -} -u16 SignNodeMetadata::typeId() const +void NodeMetadataList::serialize(std::ostream &os) const { - return CONTENT_SIGN_WALL; -} -NodeMetadata* SignNodeMetadata::create(std::istream &is) -{ - std::string text = deSerializeString(is); - return new SignNodeMetadata(text); -} -NodeMetadata* SignNodeMetadata::clone() -{ - return new SignNodeMetadata(m_text); -} -void SignNodeMetadata::serializeBody(std::ostream &os) -{ - os<::Iterator - i = m_data.getIterator(); - i.atEnd()==false; i++) + for(std::map::const_iterator + i = m_data.begin(); + i != m_data.end(); i++) { - v3s16 p = i.getNode()->getKey(); - NodeMetadata *data = i.getNode()->getValue(); - + v3s16 p = i->first; + NodeMetadata *data = i->second; + u16 p16 = p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X; - writeU16(buf, p16); - os.write((char*)buf, 2); + writeU16(os, p16); data->serialize(os); } - } -void NodeMetadataList::deSerialize(std::istream &is) + +void NodeMetadataList::deSerialize(std::istream &is, IGameDef *gamedef) { m_data.clear(); - u8 buf[6]; - - is.read((char*)buf, 2); - u16 count = readU16(buf); + u8 version = readU8(is); + if(version == 0){ + // Nothing + return; + } + + if(version != 1){ + infostream<<__FUNCTION_NAME<<": version "<deSerialize(is); + m_data[p] = data; } } - + NodeMetadataList::~NodeMetadataList() { - for(core::map::Iterator - i = m_data.getIterator(); - i.atEnd()==false; i++) - { - delete i.getNode()->getValue(); - } + clear(); } NodeMetadata* NodeMetadataList::get(v3s16 p) { - core::map::Node *n; - n = m_data.find(p); - if(n == NULL) + std::map::const_iterator n = m_data.find(p); + if(n == m_data.end()) return NULL; - return n->getValue(); + return n->second; } void NodeMetadataList::remove(v3s16 p) @@ -192,13 +171,23 @@ void NodeMetadataList::remove(v3s16 p) if(olddata) { delete olddata; - m_data.remove(p); + m_data.erase(p); } } void NodeMetadataList::set(v3s16 p, NodeMetadata *d) { remove(p); - m_data.insert(p, d); + m_data.insert(std::make_pair(p, d)); } +void NodeMetadataList::clear() +{ + for(std::map::iterator + i = m_data.begin(); + i != m_data.end(); i++) + { + delete i->second; + } + m_data.clear(); +}