Reputation: 2321
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
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