Browse Source

Add player to skirmish on connect to matchmaker

master
Luna 7 years ago
parent
commit
8f5a8417e1
3 changed files with 51 additions and 18 deletions
  1. +16
    -8
      scripts/lobby.gd
  2. +34
    -9
      scripts/matchmaking.gd
  3. +1
    -1
      util/server.sh

+ 16
- 8
scripts/lobby.gd View File

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


+ 34
- 9
scripts/matchmaking.gd View File

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

+ 1
- 1
util/server.sh View File

@ -1,2 +1,2 @@
godot-server -level=2 -silent -server -start-game
godot-server -level=2 -silent -server -start-game "$@"

Loading…
Cancel
Save