+ throw runtime_error("failed to write generator config");
+ }
+}
+
+
+bool WorldSave::Exists(const Player &player) const {
+ return is_file(PlayerPath(player));
+}
+
+void WorldSave::Read(Player &player) const {
+ ifstream is(PlayerPath(player));
+ TokenStreamReader in(is);
+ string name;
+ EntityState state;
+ while (in.HasMore()) {
+ in.ReadIdentifier(name);
+ in.Skip(Token::EQUALS);
+ if (name == "chunk") {
+ in.ReadVec(state.pos.chunk);
+ } else if (name == "position") {
+ in.ReadVec(state.pos.block);
+ } else if (name == "orientation") {
+ in.ReadQuat(state.orient);
+ } else if (name == "pitch") {
+ state.pitch = in.GetFloat();
+ } else if (name == "yaw") {
+ state.yaw = in.GetFloat();
+ } else if (name == "slot") {
+ int slot;
+ in.ReadNumber(slot);
+ player.SetInventorySlot(slot);
+ }
+ if (in.HasMore() && in.Peek().type == Token::SEMICOLON) {
+ in.Skip(Token::SEMICOLON);
+ }