forked from Mirrorlandia_minetest/minetest
Improve item serialization
This commit is contained in:
parent
564c3a9c96
commit
8dd3622c6d
@ -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()
|
||||
|
13
src/strfnd.h
13
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;
|
||||
|
@ -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];
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user