Skip to content

Multiple Multiplayer Peers in the same scene tree #35

@RegularTetragon

Description

@RegularTetragon

With ENetMultiplayer my game is structured like this to allow for separation of concerns, as well as split screen multiplayer:

  • Root
    • Server (ENetMultiplayerPeer 0)
    • Clients
      • Client 1 (ENetMultiplayerPeer 1)
      • Client 2 (ENetMultiplayerPeer 2)
      • ...

Starting a server with just one player is just a simpler case of this:

  • Root
    • Server (ENetMultiplayerPeer 0)
    • Clients
      • Client 1 (ENetMultiplayerPeer 1)

Each Server/Client has its own MultiplayerAPI and Peer. This is how the server is started:

# root.gd
var peer = ENetMultiplayerPeer
var error = peer.create_server(port, max_players)
server.start(peer)
# server.gd
func start(peer: MultiplayerPeer):
	get_tree().set_multiplayer(
		multiplayer.create_default_interface(),
		get_path()
	)
	multiplayer.multiplayer_peer = peer
	multiplayer.peer_connected.connect(player_joined)
	multiplayer.peer_disconnected.connect(player_left)

This is how the client is started

# root.gd
var peer = ENetMultiplayerPeer.new()
peer.create_client(address, port)
return start_client(peer)
# client.gd
func start(peer: MultiplayerPeer) -> void:
	get_tree().set_multiplayer(
		MultiplayerAPI.create_default_interface(),
		get_path()
	)
	multiplayer.multiplayer_peer = peer
	multiplayer.connected_to_server.connect(on_connected_to_server)
	multiplayer.connection_failed.connect(on_connection_failed)
	multiplayer.server_disconnected.connect(on_server_disconnected)

This works pretty well. It means I can have split screen multiplayer and networked multiplayer simultaneously for basically nothing. It also means my server and client logic are separated into entirely different scripts (e.g. PlayerServer, PlayerClientLocal, PlayerClientRemote). Now that I'm trying to integrate with Steam Multiplayer Peer though I can't seem to figure out a way to connect multiple client Steam Multiplayer Peers in the same scene tree to a server Steam Multiplayer Peer. Is it possible to do something similar with Steam Multiplayer Peer? I.e:

Steam.createLobby(Steam.LobbyType.LOBBY_TYPE_PUBLIC, max_players)
var lobby_id = (await Steam.lobby_created[1])
await Steam.lobby_joined

var server_peer = SteamMultiplayerPeer.new()
var server_error = server_peer.create_host(0)
var server = start_server(peer, gamemode, level)

var client_peer = SteamMultiplayerPeer.new()
var client_error = client_peer.create_client(Steam.getLobbyOwner(lobby_id, 0))
var client = start_client(peer)

When I try to do that, I get the following error_string
'Can't connect'

Which is not very helpful unfortunately, but I think is caused by trying to create multiple SteamMultiplayerPeers for my current user. Is there a way I can get this to work without rearchitecting my whole game?

Note: I only use RPC's, I don't use MultiplayerSpawner or MultiplayerSynchronizer.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions