Godot Version
Question
I am trying to have a single Godot game instance act as a “Host” in that it is both a Server and Client. This way players can host network games with their friends without needing a dedicated server.
If I try to create a Server and a Client on the same game instance, it doesn’t seem to act as though the “host” client connects with the server. If instead I have a 2nd game instance be a client it then fires off “on connect” events properly.
I’m likely missing something simple, but how can I have a single game instance be a Host and not only a Server or only a Client?
Here’s my basic C# code thus far:
public partial class NetworkServer : Node
{
const int PORT = 4444;
public override void _Ready()
{
base._Ready();
Multiplayer.PeerConnected += OnPeerConnected;
Multiplayer.PeerDisconnected += OnPeerDisconnected;
this.Name = "NetworkServer";
var peer = new ENetMultiplayerPeer();
var error = peer.CreateServer(PORT, 16);
if (error != Error.Ok)
{
GD.Print("Error creating server: " + error);
return;
}
peer.Host.Compress(ENetConnection.CompressionMode.RangeCoder);
this.Multiplayer.MultiplayerPeer = peer;
}
}
public partial class NetworkClient : Node
{
const int PORT = 4444;
private string _address = "localhost";
public override void _Ready()
{
base._Ready();
this.Name = "NetworkClient";
var peer = new ENetMultiplayerPeer();
var error = peer.CreateClient(_address, PORT);
if (error != Error.Ok)
{
GD.Print("Error creating client: " + error);
return;
}
peer.Host.Compress(ENetConnection.CompressionMode.RangeCoder);
this.Multiplayer.MultiplayerPeer = peer;
}
}
public void CreateHost()
{
CreateServer();
CreateClient("localhost");
}
public void CreateServer()
{
var server = _serverScene.Instantiate<NetworkServer>();
GetTree().Root.AddChild(server);
GD.Print("Create Server");
}
public void CreateClient(string address)
{
var client = _clientScene.Instantiate<NetworkClient>();
GetTree().Root.AddChild(client);
GD.Print("Create Client");
}