Skip to content

Commit c4c28f8

Browse files
committed
Merge pull request #106281 from KoBeWi/false
Fix wrong children range when duplicating node
2 parents 502e157 + 258062e commit c4c28f8

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

scene/main/node.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2999,18 +2999,18 @@ Node *Node::_duplicate(int p_flags, HashMap<const Node *, Node *> *r_duplimap) c
29992999
}
30003000

30013001
for (int i = 0; i < get_child_count(false); i++) {
3002-
if (instantiated && get_child(i)->data.owner == this) {
3002+
if (instantiated && get_child(i, false)->data.owner == this) {
30033003
continue; //part of instance
30043004
}
30053005

3006-
Node *dup = get_child(i)->_duplicate(p_flags, r_duplimap);
3006+
Node *dup = get_child(i, false)->_duplicate(p_flags, r_duplimap);
30073007
if (!dup) {
30083008
memdelete(node);
30093009
return nullptr;
30103010
}
30113011

30123012
node->add_child(dup);
3013-
if (i < node->get_child_count() - 1) {
3013+
if (i < node->get_child_count(false) - 1) {
30143014
node->move_child(dup, i);
30153015
}
30163016
}
@@ -3029,9 +3029,9 @@ Node *Node::_duplicate(int p_flags, HashMap<const Node *, Node *> *r_duplimap) c
30293029
}
30303030

30313031
parent->add_child(dup);
3032-
int pos = E->get_index();
3032+
int pos = E->get_index(false);
30333033

3034-
if (pos < parent->get_child_count() - 1) {
3034+
if (pos < parent->get_child_count(false) - 1) {
30353035
parent->move_child(dup, pos);
30363036
}
30373037
}

tests/scene/test_node.h

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,13 @@ class TestNode : public Node {
9696

9797
void set_exported_nodes(const Array &p_nodes) { exported_nodes = p_nodes; }
9898
Array get_exported_nodes() const { return exported_nodes; }
99+
100+
TestNode() {
101+
Node *internal = memnew(Node);
102+
add_child(internal, false, INTERNAL_MODE_FRONT);
103+
internal = memnew(Node);
104+
add_child(internal, false, INTERNAL_MODE_BACK);
105+
}
99106
};
100107

101108
TEST_CASE("[SceneTree][Node] Testing node operations with a very simple scene tree") {
@@ -498,6 +505,24 @@ TEST_CASE("[SceneTree][Node] Testing node operations with a more complex simple
498505
memdelete(node2);
499506
}
500507

508+
TEST_CASE("[SceneTree][Node] Duplicating node with internal children") {
509+
GDREGISTER_CLASS(TestNode);
510+
511+
TestNode *node = memnew(TestNode);
512+
Node *child = memnew(Node);
513+
child->set_name("Child");
514+
node->add_child(child);
515+
516+
int child_count = node->get_child_count();
517+
518+
Node *dup = node->duplicate();
519+
CHECK(dup->get_child_count() == child_count);
520+
CHECK(dup->has_node(String("Child")));
521+
522+
memdelete(node);
523+
memdelete(dup);
524+
}
525+
501526
TEST_CASE("[SceneTree][Node]Exported node checks") {
502527
TestNode *node = memnew(TestNode);
503528
SceneTree::get_singleton()->get_root()->add_child(node);
@@ -523,7 +548,7 @@ TEST_CASE("[SceneTree][Node]Exported node checks") {
523548

524549
TestNode *dup = Object::cast_to<TestNode>(node->duplicate());
525550
Node *new_exported = Object::cast_to<Node>(dup->get("exported_node"));
526-
CHECK(new_exported == dup->get_child(0));
551+
CHECK(new_exported == dup->get_child(0, false));
527552

528553
memdelete(dup);
529554
}
@@ -578,10 +603,10 @@ TEST_CASE("[SceneTree][Node]Exported node checks") {
578603
root->add_child(sub_child);
579604
sub_child->set_owner(root);
580605

581-
sub_child->set("exported_node", sub_child->get_child(1));
606+
sub_child->set("exported_node", sub_child->get_child(1, false));
582607

583608
children = Array();
584-
children.append(sub_child->get_child(1));
609+
children.append(sub_child->get_child(1, false));
585610
sub_child->set("exported_nodes", children);
586611

587612
Ref<PackedScene> ps2;

0 commit comments

Comments
 (0)