From 16aec4ae32d8848748985f8e849534f78b5299e0 Mon Sep 17 00:00:00 2001 From: Luna Date: Mon, 7 May 2018 19:22:22 -0400 Subject: [PATCH] [WIP] Begin dummy matchmaking code --- scripts/lobby.gd | 24 +++++++++++++++------ scripts/matchmaking.gd | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ util/matchmaker.sh | 1 + 3 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 scripts/matchmaking.gd create mode 100644 util/matchmaker.sh diff --git a/scripts/lobby.gd b/scripts/lobby.gd index 4f37dc1..faca79f 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -3,8 +3,7 @@ extends "res://scripts/args.gd" # class member variables go here, for example: # var a = 2 # var b = "textvar" -var SERVER_PORT = 54672 -var MAX_PLAYERS = 10 +var port = null # Defined by command-line argument with default var player_info = {} var my_info = {} @@ -14,13 +13,17 @@ var global_server_ip = "nv.cosinegaming.com" var players_done = [] var is_connected = false # Technically this can be done with ENetcetera but it's easier this way +onready var matchmaking = preload("res://scripts/matchmaking.gd").new() + func setup_options(): var opts = Options.new() opts.set_banner(('A non-violent MOBA inspired by Overwatch and Zineth')) opts.add('-singleplayer', false, 'Whether to run singeplayer, starting immediately') opts.add('-server', false, 'Whether to run as server') + opts.add('-matchmaker', false, 'Whether to be the sole matchmaker') opts.add('-client', false, 'Immediately connect as client') opts.add('-silent', false, 'If the server is not playing, merely serving') + opts.add('-port', 54672, 'The port to run a server on or connect to') opts.add('-hero', 'r', 'Your choice of hero (index)') opts.add('-level', 'r', 'Your choice of level (index) - server only!') opts.add('-start-game', false, 'Join as a client and immediately start the game') @@ -39,6 +42,8 @@ func option_sel(button_name, option): func _ready(): + add_child(matchmaking) + my_info.version = [0,0,0] # Semantic versioning: [0].[1].[2] randomize() @@ -66,8 +71,12 @@ func _ready(): option_sel("CustomGame/LevelSelect", o.get_value("-level")) if o.get_value("-server"): call_deferred("_server_init") + if o.get_value("-matchmaker"): + call_deferred("_matchmaker_init") if o.get_value("-client"): call_deferred("_client_init") + if o.get_value("-port"): + port = o.get_value("-port") if o.get_value("-start-game"): my_info.start_game = true call_deferred("_client_init") @@ -94,14 +103,14 @@ func _client_init(ip=null): if not ip: ip = get_node("CustomGame/IP").get_text() ip = IP.resolve_hostname(ip) - peer.create_client(ip, SERVER_PORT) + peer.create_client(ip, port) get_tree().set_network_peer(peer) get_node("CustomGame/Client").set_text("Clienting!") func _singleplayer_init(): collect_info() var peer = NetworkedMultiplayerENet.new() - peer.create_server(SERVER_PORT, 1) + peer.create_server(port, 1) get_tree().set_network_peer(peer) player_info[1] = my_info start_game() @@ -109,7 +118,7 @@ func _singleplayer_init(): func _server_init(): collect_info() var peer = NetworkedMultiplayerENet.new() - peer.create_server(SERVER_PORT, MAX_PLAYERS) + peer.create_server(port, matchmaking.SERVER_SIZE) get_tree().set_network_peer(peer) is_connected = true get_node("CustomGame/Server").set_text("Serving!") @@ -117,6 +126,9 @@ func _server_init(): if server_playing: player_info[1] = my_info +func _matchmaker_init(): + matchmaking.run_matchmaker() + func _player_connected(id): pass @@ -167,7 +179,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() == MAX_PLAYERS: + if not begun and player_info.size() == matchmaking.SERVER_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 new file mode 100644 index 0000000..f4e5916 --- /dev/null +++ b/scripts/matchmaking.gd @@ -0,0 +1,57 @@ +extends Node + +var SERVER_TO_SERVER_PORT = 54671 +var MATCHMAKING_PORT = 54672 +var SERVER_SIZE = 6 + +var next_port = 54673 + +# Filled with queue info which contains +# { "netid" } +var queue = [] +var skirmish +# To avoid the confusion of the gameSERVERS being CLIENTS, +# we just call them games whenever possible +var games = [] +var game_connections = [] +var game_streams = [] + +# Matchmaker to game servers +var matchmaker_to_games + +func _ready(): + set_process(false) + +func run_matchmaker(): + skirmish = spawn_server() + matchmaker_to_games = TCP_Server.new() + if matchmaker_to_games.listen(SERVER_TO_SERVER_PORT): + print("Error, could not listen") + set_process(true) + +func _process(delta): + # Manage connection to GAMESERVERS (not clients) + if matchmaker_to_games.is_connection_available(): # check if a gameserver's trying to connect + var game = matchmaker_to_games.take_connection() # accept connection + game_connections.append(game) # store the connection + var stream = PacketPeerStream.new() + stream.set_stream_peer(game) # bind peerstream to new client + game_streams.append(stream) # make new data transfer object for game + print("Server has requested connection") + +master func _queue(info): + queue.push(info) + check_queue() + +func check_queue(): + if queue.size() >= SERVER_SIZE: + var port = spawn_server() + games.push(port) + for p in queue: + rpc_id(p.netid, "join_game", port) + +func spawn_server(): + OS.execute("util/server.sh", [], false) + next_port += 1 + return (next_port - 1) # Return original port + diff --git a/util/matchmaker.sh b/util/matchmaker.sh new file mode 100644 index 0000000..1fb5897 --- /dev/null +++ b/util/matchmaker.sh @@ -0,0 +1 @@ +godot-server -matchmaker