summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-11-16 22:47:37 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-11-29 19:13:48 +0200
commit8dd3622c6d3c85adbb293eacf61f76c1118c9255 (patch)
tree70422f67bdad21924b27a5c6d9a6260fa4c77e7a /src
parent564c3a9c960e84b69502540d39fcc056fcd4bdf7 (diff)
downloadminetest-8dd3622c6d3c85adbb293eacf61f76c1118c9255.tar.gz
minetest-8dd3622c6d3c85adbb293eacf61f76c1118c9255.tar.bz2
minetest-8dd3622c6d3c85adbb293eacf61f76c1118c9255.zip
Improve item serialization
Diffstat (limited to 'src')
-rw-r--r--src/inventory.cpp51
-rw-r--r--src/inventory.h23
-rw-r--r--src/strfnd.h13
-rw-r--r--src/utility.h2
4 files changed, 61 insertions, 28 deletions
diff --git a/src/inventory.cpp b/src/inventory.cpp
index 5b29818dc..386868663 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -79,9 +79,7 @@ InventoryItem* InventoryItem::deSerialize(std::istream &is, IGameDef *gamedef)
is>>count;
// Convert old materials
if(material <= 0xff)
- {
material = content_translate_from_19_to_internal(material);
- }
if(material > MAX_CONTENT)
throw SerializationError("Too large material number");
return new MaterialItem(gamedef, material, count);
@@ -96,13 +94,22 @@ InventoryItem* InventoryItem::deSerialize(std::istream &is, IGameDef *gamedef)
throw SerializationError("Too large material number");
return new MaterialItem(gamedef, material, count);
}
- else if(name == "MaterialItem3")
+ else if(name == "NodeItem" || name == "MaterialItem3")
{
std::string all;
std::getline(is, all, '\n');
+ std::string nodename;
+ // First attempt to read inside ""
Strfnd fnd(all);
fnd.next("\"");
- std::string nodename = fnd.next("\"");
+ // If didn't skip to end, we have ""s
+ if(!fnd.atend()){
+ nodename = fnd.next("\"");
+ } else { // No luck, just read a word then
+ fnd.start(all);
+ nodename = fnd.next(" ");
+ }
+ fnd.skip_over(" ");
u16 count = stoi(trim(fnd.next("")));
return new MaterialItem(gamedef, nodename, count);
}
@@ -114,18 +121,42 @@ InventoryItem* InventoryItem::deSerialize(std::istream &is, IGameDef *gamedef)
}
else if(name == "CraftItem")
{
+ std::string all;
+ std::getline(is, all, '\n');
std::string subname;
- std::getline(is, subname, ' ');
- u16 count;
- is>>count;
+ // First attempt to read inside ""
+ Strfnd fnd(all);
+ fnd.next("\"");
+ // If didn't skip to end, we have ""s
+ if(!fnd.atend()){
+ subname = fnd.next("\"");
+ } else { // No luck, just read a word then
+ fnd.start(all);
+ subname = fnd.next(" ");
+ }
+ // Then read count
+ fnd.skip_over(" ");
+ u16 count = stoi(trim(fnd.next("")));
return new CraftItem(gamedef, subname, count);
}
else if(name == "ToolItem")
{
+ std::string all;
+ std::getline(is, all, '\n');
std::string toolname;
- std::getline(is, toolname, ' ');
- u16 wear;
- is>>wear;
+ // First attempt to read inside ""
+ Strfnd fnd(all);
+ fnd.next("\"");
+ // If didn't skip to end, we have ""s
+ if(!fnd.atend()){
+ toolname = fnd.next("\"");
+ } else { // No luck, just read a word then
+ fnd.start(all);
+ toolname = fnd.next(" ");
+ }
+ // Then read wear
+ fnd.skip_over(" ");
+ u16 wear = stoi(trim(fnd.next("")));
return new ToolItem(gamedef, toolname, wear);
}
else
diff --git a/src/inventory.h b/src/inventory.h
index 64fab921b..9c6a967a2 100644
--- a/src/inventory.h
+++ b/src/inventory.h
@@ -139,22 +139,11 @@ public:
}
virtual void serialize(std::ostream &os) const
{
- std::string nodename = m_nodename;
- if(nodename == "")
- nodename = "unknown_block";
-
- os<<"MaterialItem3";
+ os<<"NodeItem";
os<<" \"";
- os<<nodename;
+ os<<m_nodename;
os<<"\" ";
os<<m_count;
-
- // Old
- /*os<<"MaterialItem2";
- os<<" ";
- os<<(unsigned int)m_content;
- os<<" ";
- os<<m_count;*/
}
virtual InventoryItem* clone()
{
@@ -225,9 +214,9 @@ public:
virtual void serialize(std::ostream &os) const
{
os<<getName();
- os<<" ";
+ os<<" \"";
os<<m_subname;
- os<<" ";
+ os<<"\" ";
os<<m_count;
}
virtual InventoryItem* clone()
@@ -304,9 +293,9 @@ public:
virtual void serialize(std::ostream &os) const
{
os<<getName();
- os<<" ";
+ os<<" \"";
os<<m_toolname;
- os<<" ";
+ os<<"\" ";
os<<m_wear;
}
virtual InventoryItem* clone()
diff --git a/src/strfnd.h b/src/strfnd.h
index e3d380e37..049ae0bae 100644
--- a/src/strfnd.h
+++ b/src/strfnd.h
@@ -65,6 +65,19 @@ public:
//std::cout<<"palautus=\""<<palautus<<"\""<<std::endl;
return palautus;
}
+ void skip_over(std::string chars){
+ while(p < tek.size()){
+ bool is = false;
+ for(unsigned int i=0; i<chars.size(); i++){
+ if(chars[i] == tek[p]){
+ is = true;
+ break;
+ }
+ }
+ if(!is) break;
+ p++;
+ }
+ }
bool atend(){
if(p>=tek.size()) return true;
return false;
diff --git a/src/utility.h b/src/utility.h
index 7c1fde6f0..935df4b2e 100644
--- a/src/utility.h
+++ b/src/utility.h
@@ -32,9 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "common_irrlicht.h"
#include "debug.h"
-#include "strfnd.h"
#include "exceptions.h"
#include "porting.h"
+#include "strfnd.h" // For trim()
extern const v3s16 g_6dirs[6];