add entity 'save' property support

This commit is contained in:
MihailRis 2024-08-08 17:07:24 +03:00
parent 5b5abd1ab0
commit 51f6f0e629
3 changed files with 24 additions and 8 deletions

View File

@ -356,6 +356,24 @@ dynamic::Value Entities::serialize(const Entity& entity) {
return root; return root;
} }
dynamic::List_sptr Entities::serialize(const std::vector<Entity>& 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<Entity> entities) {
for (auto& entity : entities) {
entity.destroy();
}
}
void Entities::clean() { void Entities::clean() {
for (auto it = entities.begin(); it != entities.end();) { for (auto it = entities.begin(); it != entities.end();) {
if (!registry.get<EntityId>(it->second).destroyFlag) { if (!registry.get<EntityId>(it->second).destroyFlag) {

View File

@ -240,7 +240,9 @@ public:
std::vector<Entity> getAllInside(AABB aabb); std::vector<Entity> getAllInside(AABB aabb);
std::vector<Entity> getAllInRadius(glm::vec3 center, float radius); std::vector<Entity> getAllInRadius(glm::vec3 center, float radius);
void despawn(entityid_t id); void despawn(entityid_t id);
void despawn(std::vector<Entity> entities);
dynamic::Value serialize(const Entity& entity); dynamic::Value serialize(const Entity& entity);
dynamic::List_sptr serialize(const std::vector<Entity>& entities);
void setNextID(entityid_t id) { void setNextID(entityid_t id) {
nextID = id; nextID = id;

View File

@ -743,19 +743,15 @@ void Chunks::save(Chunk* chunk) {
) )
); );
auto entities = level->entities->getAllInside(aabb); 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()) { 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; chunk->flags.entities = true;
}
worldFiles->getRegions().put(chunk, json::to_binary(root, true)); worldFiles->getRegions().put(chunk, json::to_binary(root, true));
} }
} }
}
void Chunks::saveAll() { void Chunks::saveAll() {
for (size_t i = 0; i < volume; i++) { for (size_t i = 0; i < volume; i++) {