implemented serialization for ItemInstance.

This commit is contained in:
Relintai 2019-10-07 19:19:34 +02:00
parent f3f019b5cb
commit f12640dbcc
4 changed files with 106 additions and 2 deletions

View File

@ -8,6 +8,12 @@ Ref<ItemTemplate> ItemInstance::get_item_template() const {
} }
void ItemInstance::set_item_template(const Ref<ItemTemplate> value) { void ItemInstance::set_item_template(const Ref<ItemTemplate> value) {
_item_template = value; _item_template = value;
_item_template_id = 0;
if (value.is_valid())
_item_template_id = value->get_id();
} }
Ref<ItemStatModifier> ItemInstance::get_item_stat_modifier(int index) { Ref<ItemStatModifier> ItemInstance::get_item_stat_modifier(int index) {
@ -37,8 +43,56 @@ void ItemInstance::set_stack_size(int value) {
_stack_size = value; _stack_size = value;
} }
Dictionary ItemInstance::to_dict() {
return call("_to_dict");
}
void ItemInstance::from_dict(const Dictionary &dict) {
call("_from_dict", dict);
}
Dictionary ItemInstance::_to_dict() {
Dictionary dict;
dict["item_id"] = _item_template->get_id();
dict["stack_size"] = _stack_size;
Array mods;
for (int i = 0; i < _modifiers.size(); ++i) {
mods.append(_modifiers.get(i)->to_dict());
}
dict["modifiers"] = mods;
return dict;
}
void ItemInstance::_from_dict(const Dictionary &dict) {
ERR_FAIL_COND(dict.empty());
_item_template_id = dict.get("item_id", 0);
if (DataManager::get_instance() != NULL) {
_item_template = DataManager::get_instance()->get_item_template(_item_template_id);
}
_stack_size = dict.get("stack_size", 0);
Array mods = dict.get("modifiers", Array());
for (int i = 0; i < mods.size(); ++i) {
Ref<ItemStatModifier> mod;
mod.instance();
mod->from_dict(mods.get(i));
_modifiers.push_back(mod);
}
}
ItemInstance::ItemInstance() { ItemInstance::ItemInstance() {
_stack_size = 1; _stack_size = 1;
_item_template_id = 0;
} }
ItemInstance::~ItemInstance() { ItemInstance::~ItemInstance() {
_modifiers.clear(); _modifiers.clear();
@ -60,4 +114,14 @@ void ItemInstance::_bind_methods() {
ClassDB::bind_method(D_METHOD("remove_item_stat_modifier", "index"), &ItemInstance::remove_item_stat_modifier); ClassDB::bind_method(D_METHOD("remove_item_stat_modifier", "index"), &ItemInstance::remove_item_stat_modifier);
ClassDB::bind_method(D_METHOD("clear_item_stat_modifiers"), &ItemInstance::clear_item_stat_modifiers); ClassDB::bind_method(D_METHOD("clear_item_stat_modifiers"), &ItemInstance::clear_item_stat_modifiers);
ClassDB::bind_method(D_METHOD("get_item_stat_modifier_count"), &ItemInstance::get_item_stat_modifier_count); ClassDB::bind_method(D_METHOD("get_item_stat_modifier_count"), &ItemInstance::get_item_stat_modifier_count);
//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"), &ItemInstance::from_dict);
ClassDB::bind_method(D_METHOD("to_dict"), &ItemInstance::to_dict);
ClassDB::bind_method(D_METHOD("_from_dict", "dict"), &ItemInstance::_from_dict);
ClassDB::bind_method(D_METHOD("_to_dict"), &ItemInstance::_to_dict);
} }

View File

@ -8,6 +8,8 @@
#include "../entities/stats/stat.h" #include "../entities/stats/stat.h"
#include "../item_enums.h" #include "../item_enums.h"
#include "data_manager.h"
class ItemTemplate; class ItemTemplate;
class ItemInstance : public Reference { class ItemInstance : public Reference {
@ -27,8 +29,11 @@ public:
int get_stack_size(); int get_stack_size();
void set_stack_size(int value); void set_stack_size(int value);
//to_dict(); Dictionary to_dict();
//from_dict(); void from_dict(const Dictionary &dict);
virtual Dictionary _to_dict();
virtual void _from_dict(const Dictionary &dict);
ItemInstance(); ItemInstance();
~ItemInstance(); ~ItemInstance();
@ -38,6 +43,7 @@ protected:
private: private:
Ref<ItemTemplate> _item_template; Ref<ItemTemplate> _item_template;
int _item_template_id;
int _stack_size; int _stack_size;

View File

@ -34,6 +34,34 @@ void ItemStatModifier::set_percent_mod(float value) {
_percent_mod = value; _percent_mod = value;
} }
Dictionary ItemStatModifier::to_dict() {
return call("_to_dict");
}
void ItemStatModifier::from_dict(const Dictionary &dict) {
call("_from_dict", dict);
}
Dictionary ItemStatModifier::_to_dict() {
Dictionary dict;
dict["stat_id"] = static_cast<int>(_stat_id);
dict["base_mod"] = _base_mod;
dict["bonus_mod"] = _bonus_mod;
dict["percent_mod"] = _percent_mod;
return dict;
}
void ItemStatModifier::_from_dict(const Dictionary &dict) {
ERR_FAIL_COND(dict.empty());
_stat_id = static_cast<Stat::StatId>(static_cast<int>(dict.get("stat_id", 0)));
_base_mod = dict.get("base_mod", 0);
_bonus_mod = dict.get("bonus_mod", 0);
_percent_mod = dict.get("percent_mod", 0);
}
ItemStatModifier::ItemStatModifier() { ItemStatModifier::ItemStatModifier() {
_stat_id = Stat::STAT_ID_HEALTH; _stat_id = Stat::STAT_ID_HEALTH;
_base_mod = 0; _base_mod = 0;

View File

@ -20,6 +20,12 @@ public:
float get_percent_mod(); float get_percent_mod();
void set_percent_mod(float value); void set_percent_mod(float value);
Dictionary to_dict();
void from_dict(const Dictionary &dict);
virtual Dictionary _to_dict();
virtual void _from_dict(const Dictionary &dict);
ItemStatModifier(); ItemStatModifier();
protected: protected: