diff options
author | Daniel Weipert <git@mail.dweipert.de> | 2025-02-12 20:05:59 +0100 |
---|---|---|
committer | Daniel Weipert <git@mail.dweipert.de> | 2025-02-12 20:05:59 +0100 |
commit | 218748f67a6a6b35efc4a732ad11426d0f528709 (patch) | |
tree | e58504dd758ce6525844872007221cda2a8b6926 /network | |
parent | f6c81b065cf4d7f1302a50f2f72cfab32204a1ec (diff) |
Diffstat (limited to 'network')
-rw-r--r-- | network/multiplayer_synchronizer_2.gd | 40 | ||||
-rw-r--r-- | network/multiplayer_synchronizer_2.gd.uid | 1 | ||||
-rw-r--r-- | network/multiplayer_synchronizer_2.tscn | 6 | ||||
-rw-r--r-- | network/network.gd | 21 |
4 files changed, 67 insertions, 1 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)) diff --git a/network/multiplayer_synchronizer_2.gd.uid b/network/multiplayer_synchronizer_2.gd.uid new file mode 100644 index 0000000..6120cdf --- /dev/null +++ b/network/multiplayer_synchronizer_2.gd.uid @@ -0,0 +1 @@ +uid://6b8m7sadluig diff --git a/network/multiplayer_synchronizer_2.tscn b/network/multiplayer_synchronizer_2.tscn new file mode 100644 index 0000000..cdff837 --- /dev/null +++ b/network/multiplayer_synchronizer_2.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://dpfo4lt54o3jj"] + +[ext_resource type="Script" uid="uid://6b8m7sadluig" path="res://network/multiplayer_synchronizer_2.gd" id="1_016wp"] + +[node name="MultiplayerSynchronizer2" type="Node"] +script = ExtResource("1_016wp") diff --git a/network/network.gd b/network/network.gd index c6e3351..38eba42 100644 --- a/network/network.gd +++ b/network/network.gd @@ -1,6 +1,8 @@ extends Node +signal connected + var local_player: Player signal current_player_changed @@ -74,8 +76,25 @@ func _on_peer_connected(id: int): sync_current_player.rpc_id(id, current_player_id) player_order.append(id) else: - get_player(id).set_initial_values() + check_is_connected() + #get_player(id).set_initial_values() func _on_peer_disconnected(id: int): %Players.remove_child(%Players.get_node(str(id))) + + +# check is connected +# TODO: check how to correctly do player setup at join + +func check_is_connected(): + server_check_is_connected.rpc_id(1, multiplayer.get_peers().size()) + +@rpc("any_peer", "call_remote") +func server_check_is_connected(remote_peers_size: int): + if multiplayer.get_peers().size() == remote_peers_size: + server_tells_connected.rpc_id(multiplayer.get_remote_sender_id()) + +@rpc("authority", "call_remote") +func server_tells_connected(): + connected.emit() |