diff --git a/project.godot b/project.godot index 09741b5..6c81e50 100644 --- a/project.godot +++ b/project.godot @@ -65,7 +65,3 @@ gdscript/warnings/confusable_capture_reassignment=2 gdscript/warnings/property_used_as_function=2 gdscript/warnings/constant_used_as_function=2 gdscript/warnings/function_used_as_property=2 - -[editor] - -run/main_run_args="--testmode --logmode 4" diff --git a/scripts/utils/game.gd b/scripts/utils/game.gd index f7502f8..0f55da3 100644 --- a/scripts/utils/game.gd +++ b/scripts/utils/game.gd @@ -1,13 +1,12 @@ extends Node -var testmode: bool = true -var errortest: bool = true - var logmode: int = 4 -const IP_ADDRESS: String = "127.0.0.1" -const PORT: int = 25262 -const MAX_CLIENTS: int = 1024 +var ip: String = "127.0.0.1" +var port: int = 25262 +var max_clients: int = 1024 + +var room_name: String = "sample" func _ready() -> void: var args: PackedStringArray = OS.get_cmdline_args() @@ -16,21 +15,13 @@ func _ready() -> void: if !skip: Log.info("Argument %s passed." % args[i]) match args[i]: - "--testmode": - testmode = true - "--errortest": - errortest = true "--logmode": logmode = int(args[i+1]) skip = true + "--server": + if Networking.start_server() != OK: + Log.error("Failed to start server! Closing application.", "Failed to start server!") + "--client": + Networking.join_room() _: Log.warning("Unknown argument: %s!" % args[i]) - run_tests() - -func run_tests() -> void: - if testmode: - Log.info("Starting singleton tests.") - Networking.test() - Log.test() - if errortest: - Log.error("Test", "Test") diff --git a/scripts/utils/log.gd b/scripts/utils/log.gd index 740a059..03d4f93 100644 --- a/scripts/utils/log.gd +++ b/scripts/utils/log.gd @@ -7,11 +7,6 @@ extends Node # 3 -> Errors/Warnings/Infos # 4 -> All -func test() -> void: - debug("Test") - info("Test") - warning("Test") - # Used for errors. func error(message: String, alert_message: String) -> void: if message == "": diff --git a/scripts/utils/networking.gd b/scripts/utils/networking.gd index 508d0b5..5ed509e 100644 --- a/scripts/utils/networking.gd +++ b/scripts/utils/networking.gd @@ -1,29 +1,70 @@ extends Node -func test() -> void: - start_server() - join_server() - close_network() +## Connection Code + +# Connect the signals. +func _ready() -> void: + if multiplayer.connected_to_server.connect(_on_connected_ok) != OK: + Log.error("FAILED to connect the connected_to_server signal to _on_connected_ok!", "Internal Error: Failed to connect signal.") + if multiplayer.connection_failed.connect(close_network) != OK: + Log.error("FAILED to connect the connection_failed signal to _on_connected_fail!", "Internal Error: Failed to connect signal.") + if multiplayer.server_disconnected.connect(close_network) != OK: + Log.error("FAILED to connect the server_disconnected signal to _on_server_disconnected!", "Internal Error: Failed to connect signal.") # Start the network listener. -func start_server() -> void: +func start_server() -> Error: var peer: ENetMultiplayerPeer = ENetMultiplayerPeer.new() - if peer.create_server(Game.PORT, Game.MAX_CLIENTS) != OK: - Log.warning("Couldn't create the server at port %d!" % Game.PORT) - return + if peer.create_server(Game.port, Game.max_clients) != OK: + Log.warning("Couldn't create the server at port %d!" % Game.port) + return FAILED multiplayer.multiplayer_peer = peer - Log.info("Created the server at port %d." % Game.PORT) + Log.info("Created the server at port %d." % Game.port) + return OK # Connect to a server. -func join_server() -> void: +func join_server() -> Error: var peer: ENetMultiplayerPeer = ENetMultiplayerPeer.new() - if peer.create_client(Game.IP_ADDRESS, Game.PORT) != OK: - Log.warning("Couldn't connect to the server at %s:%d!" % [Game.IP_ADDRESS, Game.PORT]) - return + if peer.create_client(Game.ip, Game.port) != OK: + Log.warning("Couldn't connect to the server at %s:%d!" % [Game.ip, Game.port]) + return FAILED multiplayer.multiplayer_peer = peer - Log.info("Connected to the server at %s:%d." % [Game.IP_ADDRESS, Game.PORT]) + Log.info("Connected to the server at %s:%d." % [Game.ip, Game.port]) + return OK # Close all network connections. func close_network() -> void: multiplayer.multiplayer_peer = null Log.info("Closed all network connections.") + +## Matchmaking Code + +var mutex: Mutex = Mutex.new() +var rooms: Dictionary = {} +var peers: Dictionary = {} + +func join_room() -> void: + if join_server() != OK: + Log.warning("Failed to connect to sever.") + +func _on_connected_ok() -> void: + if rpc_id(1, "send_roomname", Game.room_name) != OK: + Log.warning("Failed to send roomname!") + +@rpc("any_peer", "call_remote", "reliable") +func send_roomname(roomname: String) -> void: + mutex.lock() + if multiplayer.get_unique_id() == 1: + if !rooms.has(roomname) and !rooms.has(multiplayer.get_remote_sender_id()): + rooms[roomname] = multiplayer.get_remote_sender_id() + rooms[multiplayer.get_remote_sender_id()] = roomname + peers[roomname] = [multiplayer.get_remote_sender_id()] + Log.info("Room %s registered." % roomname) + elif peers[roomname] is Array: + # For some odd reason, Godot doesn't allow casting peers[roomname] to an Array, but this works? + var peer_array: Array = peers[roomname] + peer_array.append(multiplayer.get_remote_sender_id()) + peers[roomname] = peer_array + Log.debug("Room %s joined by peer %d." % [roomname, multiplayer.get_remote_sender_id()]) + else: + Log.warning("Peer %d tried to send this client a request meant for the authority!" % multiplayer.get_remote_sender_id()) + mutex.unlock() diff --git a/start.tscn b/start.tscn index 453f319..911b56d 100644 --- a/start.tscn +++ b/start.tscn @@ -1,3 +1,3 @@ [gd_scene format=3 uid="uid://dhi34ugxtgmlg"] -[node name="Test" type="Node2D"] +[node name="Start" type="Node2D"]