From 3f586d46d2367f32ff1b2503d5d1bc8e43cb81b9 Mon Sep 17 00:00:00 2001 From: Relintai Date: Sun, 13 Oct 2019 20:05:03 +0200 Subject: [PATCH] Fixed some deserialization <-> setup related issues. --- data/equipment_data.cpp | 11 +++++++++++ data/equipment_data.h | 2 ++ data/equipment_data_entry.cpp | 2 +- data/equipment_data_entry.h | 2 ++ entities/data/entity_data.cpp | 31 ++++++++++++++++++------------- entities/data/entity_data.h | 6 ++++++ entities/entity.cpp | 22 ++++++++++++++++++---- entities/entity.h | 1 + 8 files changed, 59 insertions(+), 18 deletions(-) diff --git a/data/equipment_data.cpp b/data/equipment_data.cpp index 0773d80..9a0814f 100644 --- a/data/equipment_data.cpp +++ b/data/equipment_data.cpp @@ -11,6 +11,17 @@ void EquipmentData::set_slot(int index, Ref entry) { _entries[index] = entry; } +Ref EquipmentData::get_item(int index) { + ERR_FAIL_INDEX_V(index, ItemEnums::EQUIP_SLOT_EQUIP_SLOT_MAX, Ref()); + + Ref ede = _entries[index]; + + if (!ede.is_valid()) + return Ref(); + + return ede->get_item(); +} + EquipmentData::EquipmentData() { } diff --git a/data/equipment_data.h b/data/equipment_data.h index 5c701c8..9367d95 100644 --- a/data/equipment_data.h +++ b/data/equipment_data.h @@ -13,6 +13,8 @@ public: Ref get_slot(int index); void set_slot(int index, Ref entry); + Ref get_item(int index); + EquipmentData(); ~EquipmentData(); diff --git a/data/equipment_data_entry.cpp b/data/equipment_data_entry.cpp index 5f483e1..1893343 100644 --- a/data/equipment_data_entry.cpp +++ b/data/equipment_data_entry.cpp @@ -1,6 +1,6 @@ #include "equipment_data_entry.h" -#include "item_instance.h" + Ref EquipmentDataEntry::get_item() { if (has_method("_get_item")) { diff --git a/data/equipment_data_entry.h b/data/equipment_data_entry.h index 2846189..f781248 100644 --- a/data/equipment_data_entry.h +++ b/data/equipment_data_entry.h @@ -3,6 +3,8 @@ #include "core/resource.h" +#include "item_instance.h" + class ItemInstance; class EquipmentDataEntry : public Resource { diff --git a/entities/data/entity_data.cpp b/entities/data/entity_data.cpp index ec04a00..0c5a9d6 100644 --- a/entities/data/entity_data.cpp +++ b/entities/data/entity_data.cpp @@ -2,8 +2,8 @@ #include "../../ai/ai_action.h" #include "../../data/aura.h" -#include "../../data/spell.h" #include "../../data/craft_recipe.h" +#include "../../data/spell.h" #include "../../infos/spell_cast_info.h" #include "../entity.h" #include "character_spec.h" @@ -80,7 +80,6 @@ void EntityData::set_bag_size(int value) { _bag_size = value; } - Ref EntityData::get_entity_class_data() { return _entity_class_data; } @@ -88,6 +87,13 @@ void EntityData::set_entity_class_data(Ref data) { _entity_class_data = data; } +Ref EntityData::get_equipment_data() { + return _equipment_data; +} +void EntityData::set_equipment_data(Ref data) { + _equipment_data = data; +} + Ref EntityData::get_loot_db() const { return _lootdb; } @@ -149,7 +155,6 @@ void EntityData::set_craft_recipes(const Vector &craft_datas) { } } - //void EntityData::_setup_resources(Entity *entity) { //} @@ -798,14 +803,14 @@ void EntityData::con_level_up_bind(Node *entity, int value) { //Equipment -void EntityData::son_equip_success(Entity* entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { +void EntityData::son_equip_success(Entity *entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { if (_entity_class_data.is_valid()) _entity_class_data->son_equip_success(entity, equip_slot, item, old_item, bag_slot); if (has_method("_son_equip_success")) call("_son_equip_success", entity, equip_slot, item, old_item, bag_slot); } -void EntityData::son_equip_success_bind(Node* entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { +void EntityData::son_equip_success_bind(Node *entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { ERR_FAIL_COND(!ObjectDB::instance_validate(entity)); Entity *e = Object::cast_to(entity); @@ -815,14 +820,14 @@ void EntityData::son_equip_success_bind(Node* entity, ItemEnums::EquipSlots equi son_equip_success(e, equip_slot, item, old_item, bag_slot); } -void EntityData::son_equip_fail(Entity* entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { +void EntityData::son_equip_fail(Entity *entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { if (_entity_class_data.is_valid()) _entity_class_data->son_equip_fail(entity, equip_slot, item, old_item, bag_slot); if (has_method("_son_equip_fail")) call("_son_equip_fail", entity, equip_slot, item, old_item, bag_slot); } -void EntityData::son_equip_fail_bind(Node* entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { +void EntityData::son_equip_fail_bind(Node *entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { ERR_FAIL_COND(!ObjectDB::instance_validate(entity)); Entity *e = Object::cast_to(entity); @@ -832,14 +837,14 @@ void EntityData::son_equip_fail_bind(Node* entity, ItemEnums::EquipSlots equip_s son_equip_fail(e, equip_slot, item, old_item, bag_slot); } -void EntityData::con_equip_success(Entity* entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { +void EntityData::con_equip_success(Entity *entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { if (_entity_class_data.is_valid()) _entity_class_data->con_equip_success(entity, equip_slot, item, old_item, bag_slot); if (has_method("_con_equip_success")) call("_con_equip_success", entity, equip_slot, item, old_item, bag_slot); } -void EntityData::con_equip_success_bind(Node* entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { +void EntityData::con_equip_success_bind(Node *entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { ERR_FAIL_COND(!ObjectDB::instance_validate(entity)); Entity *e = Object::cast_to(entity); @@ -849,14 +854,14 @@ void EntityData::con_equip_success_bind(Node* entity, ItemEnums::EquipSlots equi con_equip_success(e, equip_slot, item, old_item, bag_slot); } -void EntityData::con_equip_fail(Entity* entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { +void EntityData::con_equip_fail(Entity *entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { if (_entity_class_data.is_valid()) _entity_class_data->con_equip_fail(entity, equip_slot, item, old_item, bag_slot); if (has_method("_con_equip_fail")) call("_con_equip_fail", entity, equip_slot, item, old_item, bag_slot); } -void EntityData::con_equip_fail_bind(Node* entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { +void EntityData::con_equip_fail_bind(Node *entity, ItemEnums::EquipSlots equip_slot, Ref item, Ref old_item, int bag_slot) { ERR_FAIL_COND(!ObjectDB::instance_validate(entity)); Entity *e = Object::cast_to(entity); @@ -889,7 +894,7 @@ void EntityData::sai_regenerate(Entity *entity) { if (has_method("_sai_regenerate")) call("_sai_regenerate", entity); - else if(_entity_class_data.is_valid()) + else if (_entity_class_data.is_valid()) _entity_class_data->sai_regenerate(entity); } void EntityData::sai_attack(Entity *entity) { @@ -897,7 +902,7 @@ void EntityData::sai_attack(Entity *entity) { if (has_method("_sai_attack")) call("_sai_attack", entity); - else if (_entity_class_data.is_valid()) + else if (_entity_class_data.is_valid()) _entity_class_data->sai_attack(entity); } diff --git a/entities/data/entity_data.h b/entities/data/entity_data.h index bc693e6..345d98c 100644 --- a/entities/data/entity_data.h +++ b/entities/data/entity_data.h @@ -21,6 +21,8 @@ #include "entity_class_data.h" #include "item_container_data.h" +#include "../../data/equipment_data.h" + class Aura; class Spell; class Entity; @@ -68,6 +70,9 @@ public: Ref get_entity_class_data(); void set_entity_class_data(Ref data); + Ref get_equipment_data(); + void set_equipment_data(Ref data); + Ref get_loot_db() const; void set_loot_db(const Ref data); @@ -241,6 +246,7 @@ private: int _bag_size; Ref _entity_class_data; + Ref _equipment_data; Ref _lootdb; Ref _vendor_item_data; diff --git a/entities/entity.cpp b/entities/entity.cpp index 2a46384..b207070 100644 --- a/entities/entity.cpp +++ b/entities/entity.cpp @@ -246,7 +246,8 @@ void Entity::sets_entity_data(Ref value) { } void Entity::setup() { - _setup(); + if (_deserialized) + return; if (has_method("_setup")) { call_multilevel("_setup"); @@ -283,6 +284,17 @@ void Entity::_setup() { for (int i = 0; i < _s_entity_data->get_num_craft_recipes(); ++i) { adds_craft_recipe(_s_entity_data->get_craft_recipe(i)); } + + if (_s_entity_data->get_equipment_data().is_valid()) { + Ref eqd = _s_entity_data->get_equipment_data(); + + for (int i = 0; i < ItemEnums::EQUIP_SLOT_EQUIP_SLOT_MAX; ++i) { + Ref ii = eqd->get_item(i); + + if (ii.is_valid()) + _s_equipment[i] = ii; + } + } } if (!Engine::get_singleton()->is_editor_hint()) @@ -295,6 +307,8 @@ Dictionary Entity::to_dict() { void Entity::from_dict(const Dictionary &dict) { call("_from_dict", dict); + _deserialized = true; + emit_signal("deserialized", this); } @@ -722,6 +736,8 @@ void Entity::_from_dict(const Dictionary &dict) { } Entity::Entity() { + _deserialized = false; + _s_guid = 0; _c_guid = 0; @@ -1328,8 +1344,6 @@ void Entity::sequip(ItemEnums::EquipSlots equip_slot, int bag_slot) { call("_sequip", equip_slot, bag_slot); } void Entity::_sequip(ItemEnums::EquipSlots equip_slot, int bag_slot) { - - } void Entity::cequip_success(ItemEnums::EquipSlots equip_slot, int bag_slot) { ERR_FAIL_INDEX(equip_slot, ItemEnums::EQUIP_SLOT_EQUIP_SLOT_MAX); @@ -4338,7 +4352,7 @@ void Entity::_bind_methods() { ADD_SIGNAL(MethodInfo("onc_open_vendor_winow_request")); ClassDB::bind_method(D_METHOD("setup"), &Entity::setup); - //ClassDB::bind_method(D_METHOD("_setup"), &Entity::_setup); + ClassDB::bind_method(D_METHOD("_setup"), &Entity::_setup); //binds ClassDB::bind_method(D_METHOD("sdie"), &Entity::sdie); diff --git a/entities/entity.h b/entities/entity.h index 4b3447e..8b9899e 100644 --- a/entities/entity.h +++ b/entities/entity.h @@ -676,6 +676,7 @@ protected: private: const float SAVE_BASE_SECONDS = 10.0; + bool _deserialized; //// Paths ////