Networking: Part 2 -> Added the initial roomname handshake.
This commit is contained in:
		
							parent
							
								
									cb24b0b629
								
							
						
					
					
						commit
						7aaacecec8
					
				
					 5 changed files with 66 additions and 43 deletions
				
			
		|  | @ -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") | ||||
|  |  | |||
|  | @ -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 == "": | ||||
|  |  | |||
|  | @ -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() | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue