diff --git a/autoload/network/network.tscn b/autoload/network/network.tscn new file mode 100644 index 0000000..160e460 --- /dev/null +++ b/autoload/network/network.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://c0algfvajobwu"] + +[ext_resource type="Script" path="res://autoload/network/scripts/network.gd" id="1_6a6ho"] + +[node name="Network" type="Node"] +script = ExtResource("1_6a6ho") diff --git a/autoload/network/scripts/network.gd b/autoload/network/scripts/network.gd new file mode 100644 index 0000000..4764bd6 --- /dev/null +++ b/autoload/network/scripts/network.gd @@ -0,0 +1,100 @@ +extends Node + +#region Signals + +signal upnp_completed(error) +signal player_connected(peer_id, player_info) +signal player_disconnected(peer_id) +signal server_disconnected + +#endregion + +const PORT: int = 7000 +const DEFAULT_SERVER_IP: String = "127.0.0.1" +const MAX_CONNECTIONS: int = 20 + +var players = {} + +var player_info = {"name": "Name"} +var players_loaded: int = 0 + +var game_scene: String + +var thread = null + +func _ready(): + 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) + +func host_game(): + var peer = ENetMultiplayerPeer.new() + var error = peer.create_server(PORT, MAX_CONNECTIONS) + if error: + return error + multiplayer.multiplayer_peer = peer + + players[1] = player_info + player_connected.emit(1, player_info) + load_game.rpc_id(1, game_scene) + +func join_game(address: String): + address = DEFAULT_SERVER_IP if address.is_empty() else address + var peer = ENetMultiplayerPeer.new() + var error = peer.create_client(address, PORT) + if error: + return error + multiplayer.multiplayer_peer = peer + +func remove_multiplayer_peer(): + multiplayer.multiplayer_peer = null + +#region Events + +@rpc("call_local", "reliable") +func load_game(game_scene_path): + get_tree().change_scene_to_file(game_scene_path) + +@rpc("any_peer", "call_local", "reliable") +func player_loaded(): + if multiplayer.is_server(): + players_loaded += 1 + if players_loaded == players.size(): + players_loaded = 0 + +@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) + +#region Multiplayer Signal Handlers + +func _on_player_connected(id): + _register_player.rpc_id(id, player_info) + +func _on_player_disconnected(id): + players.erase(id) + player_disconnected.emit(id) + +func _on_connected_ok(): + var peer_id = multiplayer.get_unique_id() + players[peer_id] = player_info + print("Connected: ", peer_id, " ", players[peer_id]) + player_connected.emit(peer_id, player_info) + + load_game.rpc_id(peer_id, game_scene) + +func _on_connected_fail(): + multiplayer.multiplayer_peer = null + +func _on_server_disconnected(): + multiplayer.multiplayer_peer = null + players.clear() + server_disconnected.emit() + +#endregion + +#endregion diff --git a/project.godot b/project.godot index 9490d2b..8a5f2b1 100644 --- a/project.godot +++ b/project.godot @@ -20,6 +20,10 @@ config/icon="res://icon.svg" buses/default_bus_layout="res://voip_setup.tres" driver/enable_input=true +[autoload] + +Network="*res://autoload/network/network.tscn" + [dotnet] project/assembly_name="VoIP" diff --git a/ui/main_menu/scripts/main_menu.gd b/ui/main_menu/scripts/main_menu.gd index b0c61b2..58e1fc1 100644 --- a/ui/main_menu/scripts/main_menu.gd +++ b/ui/main_menu/scripts/main_menu.gd @@ -1,98 +1,13 @@ extends Control -#region Signals - -signal player_connected(peer_id, player_info) -signal player_disconnected(peer_id) -signal server_disconnected - -#endregion - +@onready var networking = get_node("/root/Network") @onready var host_ip: LineEdit = $MarginContainer/VBoxContainer/HostIP -const PORT: int = 7000 -const DEFAULT_SERVER_IP: String = "127.0.0.1" -const MAX_CONNECTIONS: int = 20 - -var players = {} - -var player_info = {"name": "Name"} -var players_loaded: int = 0 func _ready(): - 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) + networking.game_scene = "res://ui/main_scene/main_scene.tscn" func _on_host_game_pressed(): - var peer = ENetMultiplayerPeer.new() - var error = peer.create_server(PORT, MAX_CONNECTIONS) - if error: - return error - multiplayer.multiplayer_peer = peer - - players[1] = player_info - player_connected.emit(1, player_info) - load_game.rpc_id(1, "res://ui/main_scene/main_scene.tscn") + networking.host_game() func _on_join_game_pressed(): - var address: String = host_ip.text - if address.is_empty(): - address = DEFAULT_SERVER_IP - var peer = ENetMultiplayerPeer.new() - var error = peer.create_client(address, PORT) - if error: - return error - multiplayer.multiplayer_peer = peer - -func remove_multiplayer_peer(): - multiplayer.multiplayer_peer = null - -#region Events - -@rpc("call_local", "reliable") -func load_game(game_scene_path): - get_tree().change_scene_to_file(game_scene_path) - -@rpc("any_peer", "call_local", "reliable") -func player_loaded(): - if multiplayer.is_server(): - players_loaded += 1 - if players_loaded == players.size(): - players_loaded = 0 - -@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) - -#region Multiplayer Signal Handlers - -func _on_player_connected(id): - _register_player.rpc_id(id, player_info) - -func _on_player_disconnected(id): - players.erase(id) - player_disconnected.emit(id) - -func _on_connected_ok(): - var peer_id = multiplayer.get_unique_id() - players[peer_id] = player_info - print("Connected: ", peer_id, " ", players[peer_id]) - player_connected.emit(peer_id, player_info) - - load_game.rpc_id(peer_id, "res://ui/main_scene/main_scene.tscn") - -func _on_connected_fail(): - multiplayer.multiplayer_peer = null - -func _on_server_disconnected(): - multiplayer.multiplayer_peer = null - players.clear() - server_disconnected.emit() - -#endregion - -#endregion + networking.join_game(host_ip.text) diff --git a/ui/main_scene/main_scene.tscn b/ui/main_scene/main_scene.tscn index 0871794..1696a98 100644 --- a/ui/main_scene/main_scene.tscn +++ b/ui/main_scene/main_scene.tscn @@ -1,6 +1,7 @@ [gd_scene load_steps=7 format=3 uid="uid://dvy8ub5r3mnjc"] -[ext_resource type="Script" path="res://ui/main_scene/scripts/Microphone.gd" id="2_h65el"] +[ext_resource type="Script" path="res://ui/main_scene/scripts/microphone.gd" id="2_h65el"] + [sub_resource type="SystemFont" id="SystemFont_dukv4"] font_names = PackedStringArray("JetBrains Mono NL")