diff --git a/scripts/lobby.gd b/scripts/lobby.gd index 6a068fe..3c13183 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -10,6 +10,7 @@ var my_info = {} var begun = false var server_playing = true var global_server_ip = "nv.cosinegaming.com" +var ip = null var players_done = [] var is_connected = false # Technically this can be done with ENetcetera but it's easier this way @@ -47,6 +48,7 @@ func _ready(): my_info.version = [0,0,0] # Semantic versioning: [0].[1].[2] randomize() + parse_args() get_node("GameBrowser/Play").connect("pressed", self, "connect_global_server") get_node("PlayerSettings/HeroSelect").connect("item_selected", self, "select_hero") @@ -57,6 +59,11 @@ func _ready(): get_node("CustomGame/Singleplayer").connect("pressed", self, "_singleplayer_init") get_node("CustomGame/LevelSelect").connect("item_selected", self, "select_level") + get_tree().connect("network_peer_connected", self, "_player_connected") + get_tree().connect("network_peer_disconnected", self, "_player_disconnected") + get_tree().connect("connected_to_server", self, "_connected_ok") + +func parse_args(): var o = setup_options() o.parse() @@ -89,19 +96,19 @@ func _ready(): o.print_help() quit() - get_tree().connect("network_peer_connected", self, "_player_connected") - get_tree().connect("network_peer_disconnected", self, "_player_disconnected") - get_tree().connect("connected_to_server", self, "_connected_ok") - func connect_global_server(): - _client_init(global_server_ip) + ip = global_server_ip + _client_init() -func _client_init(ip=null): +slave func _client_init(given_port=null): collect_info() var peer = NetworkedMultiplayerENet.new() if not ip: ip = get_node("CustomGame/IP").get_text() ip = IP.resolve_hostname(ip) + if given_port: + port = given_port + print("Connecting to " + ip + ":" + str(port)) peer.create_client(ip, port) get_tree().set_network_peer(peer) get_node("CustomGame/Client").set_text("Clienting!") @@ -117,7 +124,8 @@ func _singleplayer_init(): func _server_init(): collect_info() var peer = NetworkedMultiplayerENet.new() - peer.create_server(port, matchmaking.SERVER_SIZE) + print("Starting server on port " + str(port)) + peer.create_server(port, matchmaking.GAME_SIZE) get_tree().set_network_peer(peer) is_connected = true get_node("CustomGame/Server").set_text("Serving!") @@ -180,7 +188,7 @@ remote func register_player(new_peer, info): rpc_id(1, "begin_player_deferred", new_peer) # Spawning is deferred var assign_right_team = right_team_count * 2 < player_info.size() rpc("assign_team", new_peer, assign_right_team) - if not begun and player_info.size() == matchmaking.SERVER_SIZE: + if not begun and player_info.size() == matchmaking.GAME_SIZE: start_game() if begun: rpc_id(new_peer, "pre_configure_game", my_info.level) diff --git a/scripts/matchmaking.gd b/scripts/matchmaking.gd index d0d2653..a758313 100644 --- a/scripts/matchmaking.gd +++ b/scripts/matchmaking.gd @@ -2,7 +2,9 @@ extends Node var SERVER_TO_SERVER_PORT = 54671 var MATCHMAKING_PORT = 54672 -var SERVER_SIZE = 6 +var GAME_SIZE = 6 +# Number of games we can make without blowing up the computer +var MAX_GAMES = 50 # Totally random guess var next_port = 54673 @@ -19,15 +21,33 @@ var game_streams = [] # Matchmaker to game servers var matchmaker_to_games +onready var lobby = get_node("..") + func _ready(): + # By default, having this node doesn't do naything + # You must call run_matchmaker to enable it + # If not called, don't call _process (= don't matchmake) set_process(false) func run_matchmaker(): + # Actually run the matchmaker + set_process(true) + + # Setup skirmish server skirmish = spawn_server() + + # Set up communication between GAMESERVERS + # This is necessary for eg, when a player leaves to backfill matchmaker_to_games = TCP_Server.new() if matchmaker_to_games.listen(SERVER_TO_SERVER_PORT): print("Error, could not listen") - set_process(true) + + # Use ENet for matchmaker because we can (makes client code cleaner) + var matchmaker_to_players = NetworkedMultiplayerENet.new() + print("Starting matchmaker on port " + str(MATCHMAKING_PORT)) + matchmaker_to_players.create_server(MATCHMAKING_PORT, MAX_GAMES) + get_tree().set_network_peer(matchmaker_to_players) + matchmaker_to_players.connect("peer_connected", self, "queue") func _process(delta): # Manage connection to GAMESERVERS (not clients) @@ -39,21 +59,26 @@ func _process(delta): game_streams.append(stream) # make new data transfer object for game print("Server has requested connection") -master func queue(info): - var netid = get_tree().get_rpc_sender_id() - rpc_id(netid, "join_game", skirmish) - skirmishing_players.push(netid) +func queue(netid): + print("Player " + str(netid) + " connected.") + $"..".rpc_id(netid, "_client_init", skirmish) + skirmishing_players.append(netid) check_queue() +# # This is only for clients, but it's in here so we can rpc it easily +# slave func join_game(port): +# # + func check_queue(): - if skirmishing_players.size() >= SERVER_SIZE: + if skirmishing_players.size() >= GAME_SIZE: var port = spawn_server() games.push(port) - for p in skirmishing_players: + for i in range(GAME_SIZE): + var p = skirmishing_players[i] rpc_id(p.netid, "join_game", port) func spawn_server(): - OS.execute("util/server.sh", [], false) + OS.execute("util/server.sh", ['-port='+str(next_port)], false) next_port += 1 return (next_port - 1) # Return original port diff --git a/util/server.sh b/util/server.sh index 9959782..d08c8bb 100644 --- a/util/server.sh +++ b/util/server.sh @@ -1,2 +1,2 @@ -godot-server -level=2 -silent -server -start-game +godot-server -level=2 -silent -server -start-game "$@"