From 5c1c47f5ce7473017763089440b7d3c19d871886 Mon Sep 17 00:00:00 2001 From: Relintai Date: Tue, 8 Oct 2019 13:37:08 +0200 Subject: [PATCH] implemented serialization for EntityDataContainer. --- entities/data/entity_data_container.cpp | 27 ++++++++++++++++++++++ entities/data/entity_data_container.h | 7 ++++++ entities/entity.cpp | 30 +++++++++++++++++++++---- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/entities/data/entity_data_container.cpp b/entities/data/entity_data_container.cpp index 97887e7..bea0a4f 100644 --- a/entities/data/entity_data_container.cpp +++ b/entities/data/entity_data_container.cpp @@ -1,5 +1,23 @@ #include "entity_data_container.h" +Dictionary EntityDataContainer::to_dict() { + return call("_to_dict"); +} +void EntityDataContainer::from_dict(const Dictionary &dict) { + call("_from_dict", dict); +} + +Dictionary EntityDataContainer::_to_dict() { + Dictionary dict; + + dict["class_name"] = get_class_static(); + + return dict; +} +void EntityDataContainer::_from_dict(const Dictionary &dict) { + ERR_FAIL_COND(dict.empty()); + +} EntityDataContainer::EntityDataContainer() { } @@ -7,4 +25,13 @@ EntityDataContainer::~EntityDataContainer() { } void EntityDataContainer::_bind_methods() { + //Serialization + BIND_VMETHOD(MethodInfo("_from_dict", PropertyInfo(Variant::DICTIONARY, "dict"))); + BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::DICTIONARY, "dict"), "_to_dict")); + + ClassDB::bind_method(D_METHOD("from_dict", "dict"), &EntityDataContainer::from_dict); + ClassDB::bind_method(D_METHOD("to_dict"), &EntityDataContainer::to_dict); + + ClassDB::bind_method(D_METHOD("_from_dict", "dict"), &EntityDataContainer::_from_dict); + ClassDB::bind_method(D_METHOD("_to_dict"), &EntityDataContainer::_to_dict); } diff --git a/entities/data/entity_data_container.h b/entities/data/entity_data_container.h index 498f29f..dd1468f 100644 --- a/entities/data/entity_data_container.h +++ b/entities/data/entity_data_container.h @@ -2,11 +2,18 @@ #define ENTITY_DATA_CONTAINER_H #include "core/reference.h" +#include "core/dictionary.h" class EntityDataContainer : public Reference { GDCLASS(EntityDataContainer, Reference); public: + Dictionary to_dict(); + void from_dict(const Dictionary &dict); + + Dictionary _to_dict(); + void _from_dict(const Dictionary &dict); + EntityDataContainer(); ~EntityDataContainer(); diff --git a/entities/entity.cpp b/entities/entity.cpp index d3cdd86..8d576f6 100644 --- a/entities/entity.cpp +++ b/entities/entity.cpp @@ -390,8 +390,14 @@ Dictionary Entity::_to_dict() { dict["talents"] = _s_talents; //// Data //// - //Vector > _s_data; - //Vector > _c_data; + + Array entity_datas; + + for (int i = 0; i < _s_data.size(); ++i) { + entity_datas.append(_s_data.get(i)->to_dict()); + } + + dict["entity_datas"] = entity_datas; //// Crafting //// @@ -556,8 +562,24 @@ void Entity::_from_dict(const Dictionary &dict) { //// Data //// - //Vector > _s_data; - //Vector > _c_data; + Array entity_datas = dict.get("entity_datas", Array()); + + for (int i = 0; i < entity_datas.size(); ++i) { + Dictionary entry = entity_datas.get(i); + + String class_name = dict.get("class_name", EntityDataContainer::get_class_static()); + + if (ClassDB::can_instance(class_name) && ClassDB::is_parent_class(class_name, EntityDataContainer::get_class_static())) { + Ref data = Ref(ClassDB::instance(class_name)); + + if (data.is_valid()) { + data->from_dict(entry); + + _s_data.push_back(data); + _c_data.push_back(data); + } + } + } //// Crafting ////