Improve item serialization

This commit is contained in:
Perttu Ahola 2011-11-16 22:47:37 +02:00
parent 564c3a9c96
commit 8dd3622c6d
4 changed files with 61 additions and 28 deletions

@ -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

@ -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()

@ -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;

@ -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];