diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index dd7ade5e..231cc685 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -356,6 +356,24 @@ dynamic::Value Entities::serialize(const Entity& entity) { return root; } +dynamic::List_sptr Entities::serialize(const std::vector& entities) { + auto list = dynamic::create_list(); + for (auto& entity : entities) { + if (!entity.getDef().save.enabled) { + continue; + } + level->entities->onSave(entity); + list->put(level->entities->serialize(entity)); + } + return list; +} + +void Entities::despawn(std::vector entities) { + for (auto& entity : entities) { + entity.destroy(); + } +} + void Entities::clean() { for (auto it = entities.begin(); it != entities.end();) { if (!registry.get(it->second).destroyFlag) { diff --git a/src/objects/Entities.hpp b/src/objects/Entities.hpp index 0ab53635..4ab157c3 100644 --- a/src/objects/Entities.hpp +++ b/src/objects/Entities.hpp @@ -240,7 +240,9 @@ public: std::vector getAllInside(AABB aabb); std::vector getAllInRadius(glm::vec3 center, float radius); void despawn(entityid_t id); + void despawn(std::vector entities); dynamic::Value serialize(const Entity& entity); + dynamic::List_sptr serialize(const std::vector& entities); void setNextID(entityid_t id) { nextID = id; diff --git a/src/voxels/Chunks.cpp b/src/voxels/Chunks.cpp index cfff7b0c..a445c729 100644 --- a/src/voxels/Chunks.cpp +++ b/src/voxels/Chunks.cpp @@ -743,17 +743,13 @@ void Chunks::save(Chunk* chunk) { ) ); auto entities = level->entities->getAllInside(aabb); - auto root = dynamic::create_map(); - auto& list = root->putList("data"); - for (auto& entity : entities) { - level->entities->onSave(entity); - list.put(level->entities->serialize(entity)); - entity.destroy(); - } if (!entities.empty()) { + auto root = dynamic::create_map(); + root->put("data", level->entities->serialize(entities)); + level->entities->despawn(std::move(entities)); chunk->flags.entities = true; + worldFiles->getRegions().put(chunk, json::to_binary(root, true)); } - worldFiles->getRegions().put(chunk, json::to_binary(root, true)); } }