summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabio Alessandrelli <fabio.alessandrelli@gmail.com>2024-08-06 13:15:55 +0200
committerFabio Alessandrelli <fabio.alessandrelli@gmail.com>2024-08-06 13:21:47 +0200
commitc5fa7354bb17ce41a292282a14c92eff3e2ba5ab (patch)
tree37ae1de1254a5c7909e71bb01a1dc526929731b5
parent4359c28feafb39dd0157744a52f6746d49a38c37 (diff)
downloadredot-engine-c5fa7354bb17ce41a292282a14c92eff3e2ba5ab.tar.gz
[MP] Fix relay protocol routing with negative targets
Godot supports sending messages to "all but one peer" by sending a packet with a negative target (the negated ID of the excluded peer). The relay protocol was incorrectly interpreting the values and relaying the message to the wrong peers. This issue only affected "send_bytes" since the other subsystem (RPC and replication) "resolves" the correct IDs client-side (to match visibility information).
-rw-r--r--modules/multiplayer/scene_multiplayer.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/modules/multiplayer/scene_multiplayer.cpp b/modules/multiplayer/scene_multiplayer.cpp
index 6694376b30..e245101eeb 100644
--- a/modules/multiplayer/scene_multiplayer.cpp
+++ b/modules/multiplayer/scene_multiplayer.cpp
@@ -321,21 +321,24 @@ void SceneMultiplayer::_process_sys(int p_from, const uint8_t *p_packet, int p_p
multiplayer_peer->set_transfer_mode(p_mode);
multiplayer_peer->set_transfer_channel(p_channel);
if (peer > 0) {
+ // Single destination.
multiplayer_peer->set_target_peer(peer);
_send(data.ptr(), relay_buffer->get_position());
} else {
+ // Multiple destinations.
for (const int &P : connected_peers) {
// Not to sender, nor excluded.
- if (P == p_from || (peer < 0 && P != -peer)) {
+ if (P == p_from || P == -peer) {
continue;
}
multiplayer_peer->set_target_peer(P);
_send(data.ptr(), relay_buffer->get_position());
}
- }
- if (peer == 0 || peer == -1) {
- should_process = true;
- peer = p_from; // Process as the source.
+ if (peer != -1) {
+ // The server is one of the targets, process the packet with sender as source.
+ should_process = true;
+ peer = p_from;
+ }
}
} else {
ERR_FAIL_COND(p_from != 1); // Bug.