Fix duplication of node with script
When duplicating node with script, properties of script weren't copied sometimes. It happened because properties were copied in arbitrary order, and properties of the script were setted before the "script" property itself, i.e. while script is sill NULL. Also, DUPLICATE_SCRIPTS flag wasn't working - script was always copied because `_duplicate` looked for "script/script" property while it should be just "script". Now "script" property is being set before all others, and "script/script" changed to `CoreStringNames::get_singleton()->_script`.
This commit is contained in:
parent
cd2ffdc672
commit
521280ec44
1 changed files with 12 additions and 1 deletions
|
@ -29,6 +29,7 @@
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
|
|
||||||
|
#include "core/core_string_names.h"
|
||||||
#include "instance_placeholder.h"
|
#include "instance_placeholder.h"
|
||||||
#include "io/resource_loader.h"
|
#include "io/resource_loader.h"
|
||||||
#include "message_queue.h"
|
#include "message_queue.h"
|
||||||
|
@ -2104,12 +2105,22 @@ Node *Node::_duplicate(int p_flags) const {
|
||||||
|
|
||||||
get_property_list(&plist);
|
get_property_list(&plist);
|
||||||
|
|
||||||
|
StringName script_property_name = CoreStringNames::get_singleton()->_script;
|
||||||
|
|
||||||
|
if (p_flags & DUPLICATE_SCRIPTS) {
|
||||||
|
bool is_valid = false;
|
||||||
|
Variant script = get(script_property_name, &is_valid);
|
||||||
|
if (is_valid) {
|
||||||
|
node->set(script_property_name, script);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
|
for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
|
||||||
|
|
||||||
if (!(E->get().usage & PROPERTY_USAGE_STORAGE))
|
if (!(E->get().usage & PROPERTY_USAGE_STORAGE))
|
||||||
continue;
|
continue;
|
||||||
String name = E->get().name;
|
String name = E->get().name;
|
||||||
if (!(p_flags & DUPLICATE_SCRIPTS) && name == "script/script")
|
if (name == script_property_name)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Variant value = get(name);
|
Variant value = get(name);
|
||||||
|
|
Loading…
Reference in a new issue