Browse Source

[WIP] Begin dummy matchmaking code

master
Luna 7 years ago
parent
commit
16aec4ae32
3 changed files with 76 additions and 6 deletions
  1. +18
    -6
      scripts/lobby.gd
  2. +57
    -0
      scripts/matchmaking.gd
  3. +1
    -0
      util/matchmaker.sh

+ 18
- 6
scripts/lobby.gd View File

@ -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)


+ 57
- 0
scripts/matchmaking.gd View File

@ -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

+ 1
- 0
util/matchmaker.sh View File

@ -0,0 +1 @@
godot-server -matchmaker

Loading…
Cancel
Save