summaryrefslogtreecommitdiff
path: root/network/multiplayer_synchronizer_2.gd
diff options
context:
space:
mode:
Diffstat (limited to 'network/multiplayer_synchronizer_2.gd')
-rw-r--r--network/multiplayer_synchronizer_2.gd40
1 files changed, 40 insertions, 0 deletions
diff --git a/network/multiplayer_synchronizer_2.gd b/network/multiplayer_synchronizer_2.gd
new file mode 100644
index 0000000..f843f6b
--- /dev/null
+++ b/network/multiplayer_synchronizer_2.gd
@@ -0,0 +1,40 @@
+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))