1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

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

View file

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