David Menard
David Menard

Reputation: 2321

Godot multipler C# - Multiplayer.PeerConnected not emitted

I have a very simple multiplayer game in Godot 4.0. I can confirm that server and clients are connecting, I can see the two players if I Spawn them manually.

My problem is that the PeerConnected signal is not emitted, or I'm registering it wrong somehow.

Here's my code:

public override void _Ready()
{
    _main = GetTree().Root.GetNode("Main");
    _players = _main.GetNode("Players");

    _menu = ResourceLoader.Load<PackedScene>("res://scenes/menu.tscn").Instantiate();
    _main.AddChild(_menu);

    Multiplayer.PeerConnected += SpawnPlayer;
    Multiplayer.PeerDisconnected += RemovePlayer;

    // This is not a signal, causes an error
    var error = Multiplayer.Connect("PeerConnected", new Callable(this, "SpawnPlayer"));
    if(error != Error.Ok)
    {
        GD.Print("derp1");
    }

    //This is a signal, no errors
    error = Multiplayer.Connect("peer_connected", new Callable(this, "SpawnPlayer"));
    if(error != Error.Ok)
    {
        GD.Print("derp2");
    }
}

public void SpawnPlayer(long id)
{
    GD.Print("derpers1"); // never called!
    Player player = (Player)ResourceLoader.Load<PackedScene>("res://scenes/player.tscn").Instantiate();
    player.PeerID = Mathf.RoundToInt(id);
    _players.AddChild(player);
}

Derp1 is printed as expected, because "PeerConnected" is not the name of the signal. "depr2" is not printed, and SpawnPlayer is never called.

What am I not seeing here?

Upvotes: 2

Views: 628

Answers (1)

Majo
Majo

Reputation: 76

Try connecting like this using C# events without calling Multiplayer.Connect. It provides more type-safety as per C# signals docs. You can also do it through the Connect/Disconnect API but you don't need both.

public override void _Ready()
{
    // connect to peer connected signal
    Multiplayer.PeerConnected += SpawnPlayer;
    // you don't ned this
    // error = Multiplayer.Connect("peer_connected", new Callable(this, "SpawnPlayer"));
}


private void SpawnPlayer(long id)
{
    GD.Print("Player Connected! " + id.ToString());
    // rest of your code
}

Upvotes: 1

Related Questions