bool MultiNodeEdit::_set_impl(const StringName &p_name, const Variant &p_value, const String &p_field) { Node *es = EditorNode::get_singleton()->get_edited_scene(); if (!es) return false; String name = p_name; if (name == "scripts") { // script set is intercepted at object level (check Variant Object::get() ) ,so use a different name name = "script"; } UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("MultiNode Set") + " " + String(name)); for (const List<NodePath>::Element *E = nodes.front(); E; E = E->next()) { if (!es->has_node(E->get())) continue; Node *n = es->get_node(E->get()); if (!n) continue; if (p_value.get_type() == Variant::NODE_PATH) { Node *tonode = n->get_node(p_value); NodePath p_path = n->get_path_to(tonode); ur->add_do_property(n, name, p_path); } else { Variant new_value; if (p_field == "") { // whole value new_value = p_value; } else { // only one field new_value = fieldwise_assign(n->get(name), p_value, p_field); } ur->add_do_property(n, name, new_value); } ur->add_undo_property(n, name, n->get(name)); } ur->add_do_method(EditorNode::get_singleton()->get_inspector(), "refresh"); ur->add_undo_method(EditorNode::get_singleton()->get_inspector(), "refresh"); ur->commit_action(); return true; }