////////////// // List Tag // ////////////// // Code omitted void NBT::Tag::List::ClearMismatchedTypes(){ for (std::vector >::iterator i = Value.begin(); i != Value.end();){ if ((*i)->GetType() != Type) i = Value.erase(i); else ++i; } } // Code omitted bool NBT::Tag::List::Load(std::istream &Stream, bool LoadExtra){ // Code omitted int8_t ID = ReadByte(Stream); if (!Stream.good() || ID < 0 || ID > 10) return false; SetTagType(ID); int32_t Length = ReadInt(Stream); if (!Stream.good()) return false; std::vector > NewValue; for (int32_t i = 0; i < Length; i++){ std::shared_ptr NewTag; switch (ID){ case NBT::TagID::Byte:{ NewTag.reset(new NBT::Tag::Byte("", 0)); break; } case NBT::TagID::Short:{ NewTag.reset(new NBT::Tag::Short("", 0)); break; } case NBT::TagID::Int:{ NewTag.reset(new NBT::Tag::Int("", 0)); break; } case NBT::TagID::Long:{ NewTag.reset(new NBT::Tag::Long("", 0)); break; } case NBT::TagID::Float:{ NewTag.reset(new NBT::Tag::Float("", 0)); break; } case NBT::TagID::Double:{ NewTag.reset(new NBT::Tag::Double("", 0)); break; } case NBT::TagID::ByteArray:{ NewTag.reset(new NBT::Tag::ByteArray("", std::vector())); break; } case NBT::TagID::String:{ NewTag.reset(new NBT::Tag::String("", "")); break; } case NBT::TagID::List:{ NewTag.reset(new NBT::Tag::List("", std::vector >())); break; } case NBT::TagID::Compound:{ NewTag.reset(new NBT::Tag::Compound("", std::map >())); break; } default: break; } if (NewTag.get() == NULL){ NewValue.clear(); return false; } if (!NewTag->Load(Stream, false) || !Stream.good()){ NewTag.reset(); NewValue.clear(); return false; } std::cout << "Pointer: " << NewTag.get() << '\n'; NewValue.push_back(NewTag); } if (!Stream.good()){ NewValue.clear(); return false; } SetValue(NewValue); std::cout << Value.size() << " entries\n"; std::cout << "Pointers:\n"; for (std::vector >::iterator i = Value.begin(); i != Value.end(); i++) std::cout << i->get() << '\n'; std::cout << "}\n"; return true; } // Code omitted void NBT::Tag::List::SetTagType(int8_t NewType){ Type = NewType; ClearMismatchedTypes(); } void NBT::Tag::List::SetValue(std::vector > &NewValue){ Value.clear(); for (std::vector >::iterator i = NewValue.begin(); i != NewValue.end(); i++) Value.push_back(*i); if (Value.size() > 0) SetTagType(Value.front()->GetType()); else SetTagType(-1); } // Code omitted ////////////////// // Compound Tag // ////////////////// // Code omitted bool NBT::Tag::Compound::Load(std::istream &Stream, bool LoadExtra){ // Code omitted std::map > NewValue; while (true){ std::shared_ptr NewTag; int8_t ID = ReadByte(Stream); if (!Stream.good() || ID < 0 || ID > 10){ NewValue.clear(); return false; } if (ID == 0) break; switch (ID){ case NBT::TagID::Byte:{ NewTag.reset(new NBT::Tag::Byte("", 0)); break; } case NBT::TagID::Short:{ NewTag.reset(new NBT::Tag::Short("", 0)); break; } case NBT::TagID::Int:{ NewTag.reset(new NBT::Tag::Int("", 0)); break; } case NBT::TagID::Long:{ NewTag.reset(new NBT::Tag::Long("", 0)); break; } case NBT::TagID::Float:{ NewTag.reset(new NBT::Tag::Float("", 0)); break; } case NBT::TagID::Double:{ NewTag.reset(new NBT::Tag::Double("", 0)); break; } case NBT::TagID::ByteArray:{ NewTag.reset(new NBT::Tag::ByteArray("", std::vector())); break; } case NBT::TagID::String:{ NewTag.reset(new NBT::Tag::String("", "")); break; } case NBT::TagID::List:{ NewTag.reset(new NBT::Tag::List("", std::vector >())); break; } case NBT::TagID::Compound:{ NewTag.reset(new NBT::Tag::Compound("", std::map >())); break; } default: break; } if (NewTag.get() == NULL){ NewValue.clear(); return false; } if (!NewTag->Load(Stream, true) || !Stream.good()){ NewTag.reset(); NewValue.clear(); return false; } std::cout << "Pointer: " << NewTag.get() << '\n'; NewValue.insert(std::pair >(NewTag->GetName(), NewTag)); } if (!Stream.good()){ NewValue.clear(); return false; } SetValue(NewValue); std::cout << Value.size() << " entries\n"; std::cout << "Pointers:\n"; for (std::map >::iterator i = Value.begin(); i != Value.end(); i++) std::cout << i->second.get() << '\n'; std::cout << "}\n"; return true; } // Code omitted void NBT::Tag::Compound::SetValue(std::map > &NewValue){ Value.clear(); Value = NewValue; } // Code omitted