class_name MultiplayerSynchronizer2 extends Node signal property_changed(property_name: String, value: Variant) @export var root_node: Node @export var properties: Array[String] var skip_setter: Dictionary[String, bool] func _enter_tree() -> void: for property in properties: skip_setter.set(property, false) if not multiplayer.is_server(): if multiplayer.get_peers().size() > 0: sync_initial_value.rpc_id(1, property) else: multiplayer.peer_connected.connect(func(_id: int): sync_initial_value.rpc_id(1, property) ) func set_property(property_name: String, value: Variant) -> void: if not skip_setter.get(property_name, false): sync_property.rpc(property_name, value) @rpc("any_peer", "call_local") func sync_property(property_name: String, value: Variant) -> void: skip_setter.set(property_name, true) root_node.set(property_name, value) property_changed.emit(property_name, value) skip_setter.set(property_name, false) @rpc("any_peer", "call_remote") func sync_initial_value(property_name: String) -> void: sync_property.rpc_id(multiplayer.get_remote_sender_id(), property_name, root_node.get(property_name))