aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/metadata.cpp69
-rw-r--r--src/metadata.h59
-rw-r--r--src/nodemetadata.cpp40
-rw-r--r--src/nodemetadata.h19
5 files changed, 134 insertions, 55 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index cab5a1139..afb591a04 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -430,6 +430,7 @@ set(common_SRCS
mapgen_valleys.cpp
mapnode.cpp
mapsector.cpp
+ metadata.cpp
mg_biome.cpp
mg_decoration.cpp
mg_ore.cpp
@@ -893,4 +894,3 @@ endif()
if (BUILD_CLIENT AND USE_FREETYPE)
add_subdirectory(cguittfont)
endif()
-
diff --git a/src/metadata.cpp b/src/metadata.cpp
new file mode 100644
index 000000000..8e04aa2d3
--- /dev/null
+++ b/src/metadata.cpp
@@ -0,0 +1,69 @@
+/*
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+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 "metadata.h"
+#include "exceptions.h"
+#include "gamedef.h"
+#include "log.h"
+#include <sstream>
+
+/*
+ Metadata
+*/
+
+void Metadata::clear()
+{
+ m_stringvars.clear();
+}
+
+bool Metadata::empty() const
+{
+ return m_stringvars.size() == 0;
+}
+
+std::string Metadata::getString(const std::string &name,
+ u16 recursion) const
+{
+ StringMap::const_iterator it = m_stringvars.find(name);
+ if (it == m_stringvars.end())
+ return "";
+
+ return resolveString(it->second, recursion);
+}
+
+void Metadata::setString(const std::string &name, const std::string &var)
+{
+ if (var.empty()) {
+ m_stringvars.erase(name);
+ } else {
+ m_stringvars[name] = var;
+ }
+}
+
+std::string Metadata::resolveString(const std::string &str,
+ u16 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;
+}
diff --git a/src/metadata.h b/src/metadata.h
new file mode 100644
index 000000000..a96bfc408
--- /dev/null
+++ b/src/metadata.h
@@ -0,0 +1,59 @@
+/*
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+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.
+*/
+
+#ifndef METADATA_HEADER
+#define METADATA_HEADER
+
+#include "irr_v3d.h"
+#include <iostream>
+#include <vector>
+#include "util/string.h"
+
+/*
+ NodeMetadata stores arbitary amounts of data for special blocks.
+ Used for furnaces, chests and signs.
+
+ There are two interaction methods: inventory menu and text input.
+ Only one can be used for a single metadata, thus only inventory OR
+ text input should exist in a metadata.
+*/
+
+class Inventory;
+class IItemDefManager;
+
+class Metadata
+{
+public:
+ void clear();
+ bool empty() const;
+
+ // Generic key/value store
+ std::string getString(const std::string &name, u16 recursion = 0) const;
+ void setString(const std::string &name, const std::string &var);
+ // Support variable names in values
+ std::string resolveString(const std::string &str, u16 recursion = 0) const;
+ const StringMap &getStrings() const
+ {
+ return m_stringvars;
+ }
+private:
+ StringMap m_stringvars;
+};
+
+#endif
diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp
index 0801a028b..9b60cf33e 100644
--- a/src/nodemetadata.cpp
+++ b/src/nodemetadata.cpp
@@ -31,10 +31,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/
NodeMetadata::NodeMetadata(IItemDefManager *item_def_mgr):
- m_stringvars(),
m_inventory(new Inventory(item_def_mgr))
-{
-}
+{}
NodeMetadata::~NodeMetadata()
{
@@ -70,13 +68,13 @@ void NodeMetadata::deSerialize(std::istream &is)
void NodeMetadata::clear()
{
- m_stringvars.clear();
+ Metadata::clear();
m_inventory->clear();
}
bool NodeMetadata::empty() const
{
- return m_stringvars.size() == 0 && m_inventory->getLists().size() == 0;
+ return Metadata::empty() && m_inventory->getLists().size() == 0;
}
/*
@@ -216,35 +214,3 @@ int NodeMetadataList::countNonEmpty() const
}
return n;
}
-
-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;
-}
-
diff --git a/src/nodemetadata.h b/src/nodemetadata.h
index da1bf595d..f46c0fe91 100644
--- a/src/nodemetadata.h
+++ b/src/nodemetadata.h
@@ -20,10 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef NODEMETADATA_HEADER
#define NODEMETADATA_HEADER
-#include "irr_v3d.h"
-#include <iostream>
-#include <vector>
-#include "util/string.h"
+#include "metadata.h"
/*
NodeMetadata stores arbitary amounts of data for special blocks.
@@ -37,7 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
class Inventory;
class IItemDefManager;
-class NodeMetadata
+class NodeMetadata : public Metadata
{
public:
NodeMetadata(IItemDefManager *item_def_mgr);
@@ -49,16 +46,6 @@ public:
void clear();
bool empty() const;
- // Generic key/value store
- std::string getString(const std::string &name, unsigned short recursion = 0) const;
- void setString(const std::string &name, const std::string &var);
- // Support variable names in values
- std::string resolveString(const std::string &str, unsigned short recursion = 0) const;
- StringMap getStrings() const
- {
- return m_stringvars;
- }
-
// The inventory
Inventory *getInventory()
{
@@ -66,7 +53,6 @@ public:
}
private:
- StringMap m_stringvars;
Inventory *m_inventory;
};
@@ -101,4 +87,3 @@ private:
};
#endif
-