From fe08da9d4ce926d166e75b93309cc8ce4481a48c Mon Sep 17 00:00:00 2001 From: Nikolai Rodionov Date: Wed, 22 Jan 2025 07:22:43 +0100 Subject: [PATCH] First lobby implementation --- scenes/utils/Menu.tscn | 12 +++++ scenes/utils/character.tscn | 3 +- scenes/utils/menu.gd | 91 ++++++++++++++++++++++++++++++++++++- 3 files changed, 102 insertions(+), 4 deletions(-) diff --git a/scenes/utils/Menu.tscn b/scenes/utils/Menu.tscn index b84f625..500f7b5 100644 --- a/scenes/utils/Menu.tscn +++ b/scenes/utils/Menu.tscn @@ -11,6 +11,14 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_5mxqd") +[node name="Start" type="Button" parent="."] +layout_mode = 0 +offset_left = 230.0 +offset_top = 296.0 +offset_right = 339.0 +offset_bottom = 368.0 +text = "Start" + [node name="Host" type="Button" parent="."] layout_mode = 0 offset_left = 113.0 @@ -27,5 +35,9 @@ offset_right = 224.0 offset_bottom = 220.0 text = "Join" +[connection signal="player_connected" from="." to="." method="_on_player_connected"] +[connection signal="player_disconnected" from="." to="." method="_on_player_disconnected"] +[connection signal="server_disconnected" from="." to="." method="_on_server_disconnected"] +[connection signal="pressed" from="Start" to="." method="_on_start_pressed"] [connection signal="pressed" from="Host" to="." method="_on_host_pressed"] [connection signal="pressed" from="Join" to="." method="_on_join_pressed"] diff --git a/scenes/utils/character.tscn b/scenes/utils/character.tscn index aa108b3..140a6b1 100644 --- a/scenes/utils/character.tscn +++ b/scenes/utils/character.tscn @@ -11,9 +11,8 @@ height = 1.8 [node name="Character" type="Node3D"] -[node name="CharacterBody3D" type="CharacterBody3D" parent="." node_paths=PackedStringArray("ANIMATION_PLAYER")] +[node name="CharacterBody3D" type="CharacterBody3D" parent="."] script = ExtResource("1_sue4n") -ANIMATION_PLAYER = NodePath("") [node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"] transform = Transform3D(1, 0, 0, 0, 1.42432, 0, 0, 0, 0.967678, 0, 1.27907, 0) diff --git a/scenes/utils/menu.gd b/scenes/utils/menu.gd index c26d7d7..21260a0 100644 --- a/scenes/utils/menu.gd +++ b/scenes/utils/menu.gd @@ -3,6 +3,11 @@ extends Control # Called when the node enters the scene tree for the first time. func _ready() -> void: + multiplayer.peer_connected.connect(_on_player_connected) + multiplayer.peer_disconnected.connect(_on_player_disconnected) + multiplayer.connected_to_server.connect(_on_connected_ok) + multiplayer.connection_failed.connect(_on_connected_fail) + multiplayer.server_disconnected.connect(_on_server_disconnected) pass # Replace with function body. @@ -12,11 +17,93 @@ func _process(delta: float) -> void: var peer = ENetMultiplayerPeer.new() +signal player_connected(peer_id, player_info) +signal player_disconnected(peer_id) +signal server_disconnected + +const PORT = 7000 +const DEFAULT_SERVER_IP = "127.0.0.1" # IPv4 localhost +const MAX_CONNECTIONS = 20 + +var players_loaded = 0 + +var player_info = {"name": "Name"} +var players = {} func _on_host_pressed() -> void: - get_tree().change_scene_to_file("res://scenes/maps/el_test.tscn") + var peer = ENetMultiplayerPeer.new() + var error = peer.create_server(PORT, MAX_CONNECTIONS) + if error: + print(error) + multiplayer.multiplayer_peer = peer + players[1] = player_info + player_connected.emit(1, player_info) + + +func remove_multiplayer_peer(): + multiplayer.multiplayer_peer = null + +# When the server decides to start the game from a UI scene, +# do Lobby.load_game.rpc(filepath) +@rpc("call_local", "reliable") +func load_game(game_scene_path): + get_tree().change_scene_to_file("res://scenes/maps/el_test.tscn") + +# Every peer will call this when they have loaded the game scene. +@rpc("any_peer", "call_local", "reliable") +func player_loaded(): + if multiplayer.is_server(): + players_loaded += 1 + if players_loaded == players.size(): + + players_loaded = 0 func _on_join_pressed() -> void: - print("join") + var address = '127.0.0.1' + var peer = ENetMultiplayerPeer.new() + var error = peer.create_client(address, PORT) + if error: + print(error) + multiplayer.multiplayer_peer = peer + + +func _on_player_connected(id: Variant, player_info: Variant) -> void: + print(player_info) + _register_player.rpc_id(id, player_info) + +@rpc("any_peer", "reliable") +func _register_player(new_player_info): + var new_player_id = multiplayer.get_remote_sender_id() + players[new_player_id] = new_player_info + player_connected.emit(new_player_id, new_player_info) + + +func _on_player_disconnected(id: Variant) -> void: + pass + players.erase(id) + player_disconnected.emit(id) + +func _on_connected_ok(): + var peer_id = multiplayer.get_unique_id() + players[peer_id] = player_info + player_connected.emit(peer_id, player_info) + + +func _on_connected_fail(): + multiplayer.multiplayer_peer = null + +func _on_server_disconnected() -> void: + multiplayer.multiplayer_peer = null + players.clear() + server_disconnected.emit() + + + +@rpc("call_local", "reliable", "any_peer") +func start_game(): + get_tree().change_scene_to_file("res://scenes/maps/el_test.tscn") + +func _on_start_pressed() -> void: + start_game.rpc()