diff --git a/singletons/ess.cpp b/singletons/ess.cpp index 819a062..26bdc3a 100644 --- a/singletons/ess.cpp +++ b/singletons/ess.cpp @@ -88,13 +88,17 @@ void ESS::set_resource_db(const Ref &resource_db) { _ess_resource_db = resource_db; } -Ref ESS::get_entity_spawner() { +ESSEntitySpawner *ESS::get_entity_spawner() { return _ess_entity_spawner; } -void ESS::set_entity_spawner(const Ref &spawner) { +void ESS::set_entity_spawner(ESSEntitySpawner *spawner) { _ess_entity_spawner = spawner; } +void ESS::set_entity_spawner_bind(Node *spawner) { + _ess_entity_spawner = Object::cast_to(spawner); +} + String ESS::get_resource_db_path() { return _ess_resource_db_path; } @@ -102,19 +106,12 @@ void ESS::set_resource_db_path(const String &path) { _ess_resource_db_path = path; } -String ESS::get_entity_spawner_path() { - return _ess_entity_spawner_path; -} -void ESS::set_entity_spawner_path(const String &path) { - _ess_entity_spawner_path = path; -} - void ESS::request_entity_spawn(Ref info) { - if (_ess_entity_spawner.is_valid()) + if (_ess_entity_spawner) _ess_entity_spawner->request_entity_spawn(info); } void ESS::request_entity_spawn_deferred(Ref info) { - if (_ess_entity_spawner.is_valid()) + if (_ess_entity_spawner) _ess_entity_spawner->request_entity_spawn_deferred(info); } @@ -130,18 +127,6 @@ void ESS::load_resource_db() { _ess_resource_db = d; } -void ESS::load_entity_spawner() { - _Directory dir; - - ERR_FAIL_COND(_ess_entity_spawner_path == ""); - - Ref d = load_resource(_ess_entity_spawner_path, "ESSEntitySpawner"); - - ERR_FAIL_COND(!d.is_valid()); - - _ess_entity_spawner = d; -} - Ref ESS::load_resource(const String &path, const String &type_hint) { _ResourceLoader *rl = _ResourceLoader::get_singleton(); @@ -160,16 +145,10 @@ Ref ESS::load_resource(const String &path, const String &type_hint) { void ESS::load_all() { load_resource_db(); - load_entity_spawner(); _ess_resource_db->initialize(); } -void ESS::setup(const Ref &resource_db, const Ref &entity_spawner) { - _ess_resource_db = resource_db; - _ess_entity_spawner = entity_spawner; -} - //Stats void ESS::stat_set_string(const String &stat_enum_string) { _stat_enum_string = stat_enum_string; @@ -564,20 +543,15 @@ void ESS::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "resource_db", PROPERTY_HINT_RESOURCE_TYPE, "ESSResourceDB"), "set_resource_db", "get_resource_db"); ClassDB::bind_method(D_METHOD("get_entity_spawner"), &ESS::get_entity_spawner); - ClassDB::bind_method(D_METHOD("set_entity_spawner"), &ESS::set_entity_spawner); + ClassDB::bind_method(D_METHOD("set_entity_spawner"), &ESS::set_entity_spawner_bind); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "entity_spawner", PROPERTY_HINT_RESOURCE_TYPE, "ESSEntitySpawner"), "set_entity_spawner", "get_entity_spawner"); ClassDB::bind_method(D_METHOD("get_resource_db_path"), &ESS::get_resource_db_path); ClassDB::bind_method(D_METHOD("set_resource_db_path", "path"), &ESS::set_resource_db_path); ADD_PROPERTY(PropertyInfo(Variant::STRING, "resource_db_path"), "set_resource_db_path", "get_resource_db_path"); - ClassDB::bind_method(D_METHOD("get_entity_spawner_path"), &ESS::get_entity_spawner_path); - ClassDB::bind_method(D_METHOD("set_entity_spawner_path", "path"), &ESS::set_entity_spawner_path); - ADD_PROPERTY(PropertyInfo(Variant::STRING, "entity_spawner_path"), "set_entity_spawner_path", "get_entity_spawner_path"); - //load ClassDB::bind_method(D_METHOD("load_resource_db"), &ESS::load_resource_db); - ClassDB::bind_method(D_METHOD("load_entity_spawner"), &ESS::load_entity_spawner); ClassDB::bind_method(D_METHOD("load_resource", "path", "type_hint"), &ESS::load_resource, DEFVAL("")); @@ -586,8 +560,6 @@ void ESS::_bind_methods() { ClassDB::bind_method(D_METHOD("load_all"), &ESS::load_all); - ClassDB::bind_method(D_METHOD("setup", "resource_db", "entity_spawner"), &ESS::setup); - //Stats ClassDB::bind_method(D_METHOD("stat_get_string"), &ESS::stat_get_string); ClassDB::bind_method(D_METHOD("stat_set_string", "stat_enum_string"), &ESS::stat_set_string); @@ -682,6 +654,7 @@ void ESS::_bind_methods() { ESS::ESS() { instance = this; + _ess_entity_spawner = NULL; _use_spell_points = GLOBAL_DEF("ess/spells/use_spell_points", false); _scale_spells_by_default = GLOBAL_DEF("ess/spells/scale_spells_by_default", false); @@ -696,7 +669,6 @@ ESS::ESS() { _automatic_load = GLOBAL_DEF("ess/data/automatic_load", false); _ess_resource_db_path = GLOBAL_DEF("ess/data/ess_resource_db_path", ""); - _ess_entity_spawner_path = GLOBAL_DEF("ess/data/ess_entity_spawner_path", ""); stat_set_string(GLOBAL_DEF("ess/enums/stats", "Agility,Strength,Stamina,Intellect,Spirit,Health,Speed,Global Cooldown,Haste")); _stat_main_stat_count = GLOBAL_DEF("ess/enums/main_stat_count", 5); @@ -727,7 +699,7 @@ ESS::~ESS() { instance = NULL; _ess_resource_db.unref(); - _ess_entity_spawner.unref(); + _ess_entity_spawner = NULL; _stat_id_to_name.clear(); _stat_name_to_id.clear(); diff --git a/singletons/ess.h b/singletons/ess.h index 048ed63..2d58815 100644 --- a/singletons/ess.h +++ b/singletons/ess.h @@ -72,26 +72,21 @@ public: Ref get_resource_db(); void set_resource_db(const Ref &resource_db); - Ref get_entity_spawner(); - void set_entity_spawner(const Ref &spawner); + ESSEntitySpawner *get_entity_spawner(); + void set_entity_spawner(ESSEntitySpawner *spawner); + void set_entity_spawner_bind(Node *spawner); String get_resource_db_path(); void set_resource_db_path(const String &path); - String get_entity_spawner_path(); - void set_entity_spawner_path(const String &path); - void request_entity_spawn(Ref info); void request_entity_spawn_deferred(Ref info); void load_resource_db(); - void load_entity_spawner(); Ref load_resource(const String &path, const String &type_hint = ""); void load_all(); - void setup(const Ref &resource_db, const Ref &entity_spawner); - //Stats String stat_get_string() const; void stat_set_string(const String &stat_enum_string); @@ -188,10 +183,9 @@ private: bool _automatic_load; Ref _ess_resource_db; - Ref _ess_entity_spawner; + ESSEntitySpawner *_ess_entity_spawner; String _ess_resource_db_path; - String _ess_entity_spawner_path; static ESS *instance; diff --git a/spawners/ess_entity_spawner.cpp b/spawners/ess_entity_spawner.cpp index 5eb0d37..ead2449 100644 --- a/spawners/ess_entity_spawner.cpp +++ b/spawners/ess_entity_spawner.cpp @@ -22,6 +22,8 @@ SOFTWARE. #include "ess_entity_spawner.h" +#include "../singletons/ess.h" + #include "../utility/entity_create_info.h" _FORCE_INLINE_ void ESSEntitySpawner::request_entity_spawn(Ref info) { @@ -35,17 +37,21 @@ _FORCE_INLINE_ void ESSEntitySpawner::request_entity_spawn_deferred(Refset_entity_spawner(this); + } } ESSEntitySpawner::~ESSEntitySpawner() { + if (ESS::get_singleton() && ESS::get_singleton()->get_entity_spawner() == this) { + ESS::get_singleton()->set_entity_spawner(NULL); + } } void ESSEntitySpawner::_bind_methods() { BIND_VMETHOD(MethodInfo("_request_entity_spawn", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "EntityCreateInfo"))); ADD_SIGNAL(MethodInfo("on_entity_spawn", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "EntityCreateInfo"))); - ClassDB::bind_method(D_METHOD("get_scene_tree"), &ESSEntitySpawner::get_scene_tree); - ClassDB::bind_method(D_METHOD("request_entity_spawn", "info"), &ESSEntitySpawner::request_entity_spawn); ClassDB::bind_method(D_METHOD("request_entity_spawn_deferred", "info"), &ESSEntitySpawner::request_entity_spawn_deferred); } diff --git a/spawners/ess_entity_spawner.h b/spawners/ess_entity_spawner.h index 746dc64..27ca96e 100644 --- a/spawners/ess_entity_spawner.h +++ b/spawners/ess_entity_spawner.h @@ -23,20 +23,16 @@ SOFTWARE. #ifndef ESS_ENTITY_SPAWNER_H #define ESS_ENTITY_SPAWNER_H -#include "core/resource.h" +#include "scene/main/node.h" #include "scene/main/scene_tree.h" class EntityCreateInfo; -class ESSEntitySpawner : public Resource { - GDCLASS(ESSEntitySpawner, Resource); +class ESSEntitySpawner : public Node { + GDCLASS(ESSEntitySpawner, Node); public: - _FORCE_INLINE_ SceneTree *get_scene_tree() const { - return SceneTree::get_singleton(); - } - void request_entity_spawn(Ref info); void request_entity_spawn_deferred(Ref info);