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;
|
is>>count;
|
||||||
// Convert old materials
|
// Convert old materials
|
||||||
if(material <= 0xff)
|
if(material <= 0xff)
|
||||||
{
|
|
||||||
material = content_translate_from_19_to_internal(material);
|
material = content_translate_from_19_to_internal(material);
|
||||||
}
|
|
||||||
if(material > MAX_CONTENT)
|
if(material > MAX_CONTENT)
|
||||||
throw SerializationError("Too large material number");
|
throw SerializationError("Too large material number");
|
||||||
return new MaterialItem(gamedef, material, count);
|
return new MaterialItem(gamedef, material, count);
|
||||||
@ -96,13 +94,22 @@ InventoryItem* InventoryItem::deSerialize(std::istream &is, IGameDef *gamedef)
|
|||||||
throw SerializationError("Too large material number");
|
throw SerializationError("Too large material number");
|
||||||
return new MaterialItem(gamedef, material, count);
|
return new MaterialItem(gamedef, material, count);
|
||||||
}
|
}
|
||||||
else if(name == "MaterialItem3")
|
else if(name == "NodeItem" || name == "MaterialItem3")
|
||||||
{
|
{
|
||||||
std::string all;
|
std::string all;
|
||||||
std::getline(is, all, '\n');
|
std::getline(is, all, '\n');
|
||||||
|
std::string nodename;
|
||||||
|
// First attempt to read inside ""
|
||||||
Strfnd fnd(all);
|
Strfnd fnd(all);
|
||||||
fnd.next("\"");
|
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("")));
|
u16 count = stoi(trim(fnd.next("")));
|
||||||
return new MaterialItem(gamedef, nodename, count);
|
return new MaterialItem(gamedef, nodename, count);
|
||||||
}
|
}
|
||||||
@ -114,18 +121,42 @@ InventoryItem* InventoryItem::deSerialize(std::istream &is, IGameDef *gamedef)
|
|||||||
}
|
}
|
||||||
else if(name == "CraftItem")
|
else if(name == "CraftItem")
|
||||||
{
|
{
|
||||||
|
std::string all;
|
||||||
|
std::getline(is, all, '\n');
|
||||||
std::string subname;
|
std::string subname;
|
||||||
std::getline(is, subname, ' ');
|
// First attempt to read inside ""
|
||||||
u16 count;
|
Strfnd fnd(all);
|
||||||
is>>count;
|
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);
|
return new CraftItem(gamedef, subname, count);
|
||||||
}
|
}
|
||||||
else if(name == "ToolItem")
|
else if(name == "ToolItem")
|
||||||
{
|
{
|
||||||
|
std::string all;
|
||||||
|
std::getline(is, all, '\n');
|
||||||
std::string toolname;
|
std::string toolname;
|
||||||
std::getline(is, toolname, ' ');
|
// First attempt to read inside ""
|
||||||
u16 wear;
|
Strfnd fnd(all);
|
||||||
is>>wear;
|
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);
|
return new ToolItem(gamedef, toolname, wear);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -139,22 +139,11 @@ public:
|
|||||||
}
|
}
|
||||||
virtual void serialize(std::ostream &os) const
|
virtual void serialize(std::ostream &os) const
|
||||||
{
|
{
|
||||||
std::string nodename = m_nodename;
|
os<<"NodeItem";
|
||||||
if(nodename == "")
|
|
||||||
nodename = "unknown_block";
|
|
||||||
|
|
||||||
os<<"MaterialItem3";
|
|
||||||
os<<" \"";
|
os<<" \"";
|
||||||
os<<nodename;
|
os<<m_nodename;
|
||||||
os<<"\" ";
|
os<<"\" ";
|
||||||
os<<m_count;
|
os<<m_count;
|
||||||
|
|
||||||
// Old
|
|
||||||
/*os<<"MaterialItem2";
|
|
||||||
os<<" ";
|
|
||||||
os<<(unsigned int)m_content;
|
|
||||||
os<<" ";
|
|
||||||
os<<m_count;*/
|
|
||||||
}
|
}
|
||||||
virtual InventoryItem* clone()
|
virtual InventoryItem* clone()
|
||||||
{
|
{
|
||||||
@ -225,9 +214,9 @@ public:
|
|||||||
virtual void serialize(std::ostream &os) const
|
virtual void serialize(std::ostream &os) const
|
||||||
{
|
{
|
||||||
os<<getName();
|
os<<getName();
|
||||||
os<<" ";
|
os<<" \"";
|
||||||
os<<m_subname;
|
os<<m_subname;
|
||||||
os<<" ";
|
os<<"\" ";
|
||||||
os<<m_count;
|
os<<m_count;
|
||||||
}
|
}
|
||||||
virtual InventoryItem* clone()
|
virtual InventoryItem* clone()
|
||||||
@ -304,9 +293,9 @@ public:
|
|||||||
virtual void serialize(std::ostream &os) const
|
virtual void serialize(std::ostream &os) const
|
||||||
{
|
{
|
||||||
os<<getName();
|
os<<getName();
|
||||||
os<<" ";
|
os<<" \"";
|
||||||
os<<m_toolname;
|
os<<m_toolname;
|
||||||
os<<" ";
|
os<<"\" ";
|
||||||
os<<m_wear;
|
os<<m_wear;
|
||||||
}
|
}
|
||||||
virtual InventoryItem* clone()
|
virtual InventoryItem* clone()
|
||||||
|
13
src/strfnd.h
13
src/strfnd.h
@ -65,6 +65,19 @@ public:
|
|||||||
//std::cout<<"palautus=\""<<palautus<<"\""<<std::endl;
|
//std::cout<<"palautus=\""<<palautus<<"\""<<std::endl;
|
||||||
return palautus;
|
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(){
|
bool atend(){
|
||||||
if(p>=tek.size()) return true;
|
if(p>=tek.size()) return true;
|
||||||
return false;
|
return false;
|
||||||
|
@ -32,9 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
|
|
||||||
#include "common_irrlicht.h"
|
#include "common_irrlicht.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "strfnd.h"
|
|
||||||
#include "exceptions.h"
|
#include "exceptions.h"
|
||||||
#include "porting.h"
|
#include "porting.h"
|
||||||
|
#include "strfnd.h" // For trim()
|
||||||
|
|
||||||
extern const v3s16 g_6dirs[6];
|
extern const v3s16 g_6dirs[6];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user