summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
author398utubzyt <398utubzyt@gmail.com>2023-05-23 09:25:34 -0700
committer398utubzyt <398utubzyt@gmail.com>2023-09-15 20:35:25 -0700
commit2df37a237a4b2d1fb8c39078b4d320dc92050800 (patch)
tree8b7b2848d32b4c8b9af6836b7d67cbe0d2c440e2 /core
parent3ed4497113fa10611b90290ce22a751fb9d26e2e (diff)
downloadredot-engine-2df37a237a4b2d1fb8c39078b4d320dc92050800.tar.gz
C#: Abstract script class support
Diffstat (limited to 'core')
-rw-r--r--core/object/class_db.cpp14
-rw-r--r--core/object/object.cpp5
-rw-r--r--core/object/script_language.cpp1
-rw-r--r--core/object/script_language.h1
-rw-r--r--core/object/script_language_extension.cpp1
-rw-r--r--core/object/script_language_extension.h6
6 files changed, 25 insertions, 3 deletions
diff --git a/core/object/class_db.cpp b/core/object/class_db.cpp
index 100cb8e6a2..26ccf07320 100644
--- a/core/object/class_db.cpp
+++ b/core/object/class_db.cpp
@@ -31,6 +31,7 @@
#include "class_db.h"
#include "core/config/engine.h"
+#include "core/io/resource_loader.h"
#include "core/object/script_language.h"
#include "core/os/mutex.h"
#include "core/version.h"
@@ -377,7 +378,14 @@ bool ClassDB::can_instantiate(const StringName &p_class) {
OBJTYPE_RLOCK;
ClassInfo *ti = classes.getptr(p_class);
- ERR_FAIL_NULL_V_MSG(ti, false, "Cannot get class '" + String(p_class) + "'.");
+ if (!ti) {
+ if (!ScriptServer::is_global_class(p_class)) {
+ ERR_FAIL_V_MSG(false, "Cannot get class '" + String(p_class) + "'.");
+ }
+ String path = ScriptServer::get_global_class_path(p_class);
+ Ref<Script> scr = ResourceLoader::load(path);
+ return scr.is_valid() && scr->is_valid() && !scr->is_abstract();
+ }
#ifdef TOOLS_ENABLED
if (ti->api == API_EDITOR && !Engine::get_singleton()->is_editor_hint()) {
return false;
@@ -394,7 +402,9 @@ bool ClassDB::is_virtual(const StringName &p_class) {
if (!ScriptServer::is_global_class(p_class)) {
ERR_FAIL_V_MSG(false, "Cannot get class '" + String(p_class) + "'.");
}
- return false;
+ String path = ScriptServer::get_global_class_path(p_class);
+ Ref<Script> scr = ResourceLoader::load(path);
+ return scr.is_valid() && scr->is_valid() && scr->is_abstract();
}
#ifdef TOOLS_ENABLED
if (ti->api == API_EDITOR && !Engine::get_singleton()->is_editor_hint()) {
diff --git a/core/object/object.cpp b/core/object/object.cpp
index 3fd7fe36e0..0e231622b6 100644
--- a/core/object/object.cpp
+++ b/core/object/object.cpp
@@ -880,7 +880,10 @@ void Object::set_script(const Variant &p_script) {
}
Ref<Script> s = p_script;
- ERR_FAIL_COND_MSG(s.is_null() && !p_script.is_null(), "Invalid parameter, it should be a reference to a valid script (or null).");
+ if (!p_script.is_null()) {
+ ERR_FAIL_COND_MSG(s.is_null(), "Cannot set object script. Parameter should be null or a reference to a valid script.");
+ ERR_FAIL_COND_MSG(s->is_abstract(), vformat("Cannot set object script. Script '%s' should not be abstract.", s->get_path()));
+ }
script = p_script;
diff --git a/core/object/script_language.cpp b/core/object/script_language.cpp
index abf2b7b054..011f4203ea 100644
--- a/core/object/script_language.cpp
+++ b/core/object/script_language.cpp
@@ -146,6 +146,7 @@ void Script::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_property_default_value", "property"), &Script::_get_property_default_value);
ClassDB::bind_method(D_METHOD("is_tool"), &Script::is_tool);
+ ClassDB::bind_method(D_METHOD("is_abstract"), &Script::is_abstract);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "source_code", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_source_code", "get_source_code");
}
diff --git a/core/object/script_language.h b/core/object/script_language.h
index e0c4d650dd..75294a08d1 100644
--- a/core/object/script_language.h
+++ b/core/object/script_language.h
@@ -150,6 +150,7 @@ public:
virtual bool is_tool() const = 0;
virtual bool is_valid() const = 0;
+ virtual bool is_abstract() const = 0;
virtual ScriptLanguage *get_language() const = 0;
diff --git a/core/object/script_language_extension.cpp b/core/object/script_language_extension.cpp
index bf8bac476a..14de85f104 100644
--- a/core/object/script_language_extension.cpp
+++ b/core/object/script_language_extension.cpp
@@ -59,6 +59,7 @@ void ScriptExtension::_bind_methods() {
GDVIRTUAL_BIND(_is_tool);
GDVIRTUAL_BIND(_is_valid);
+ GDVIRTUAL_BIND(_is_abstract);
GDVIRTUAL_BIND(_get_language);
GDVIRTUAL_BIND(_has_script_signal, "signal");
diff --git a/core/object/script_language_extension.h b/core/object/script_language_extension.h
index e06f005320..bb84581c45 100644
--- a/core/object/script_language_extension.h
+++ b/core/object/script_language_extension.h
@@ -110,6 +110,12 @@ public:
EXBIND0RC(bool, is_tool)
EXBIND0RC(bool, is_valid)
+ virtual bool is_abstract() const override {
+ bool abst;
+ return GDVIRTUAL_CALL(_is_abstract, abst) && abst;
+ }
+ GDVIRTUAL0RC(bool, _is_abstract)
+
EXBIND0RC(ScriptLanguage *, get_language)
EXBIND1RC(bool, has_script_signal, const StringName &)