summaryrefslogtreecommitdiffstats
path: root/modules/multiplayer
diff options
context:
space:
mode:
authorFabio Alessandrelli <fabio.alessandrelli@gmail.com>2023-12-17 13:19:07 +0100
committerFabio Alessandrelli <fabio.alessandrelli@gmail.com>2024-01-14 21:38:06 +0100
commit754036f82f8c404972480c18d81130945fcbb3d9 (patch)
treed0df3c069ca592e2039dce6497a9eca56b00c7bd /modules/multiplayer
parent26b1fd0d842fa3c2f090ead47e8ea7cd2d6515e1 (diff)
downloadredot-engine-754036f82f8c404972480c18d81130945fcbb3d9.tar.gz
[MP] Fix auth not waiting for confirmation in some cases
The auth implementation was treating any received packet as a remote confirmation after the peer was confirmed locally. It now correctly awaits for the remote confirmation packet before admitting new peers.
Diffstat (limited to 'modules/multiplayer')
-rw-r--r--modules/multiplayer/scene_multiplayer.cpp46
1 files changed, 20 insertions, 26 deletions
diff --git a/modules/multiplayer/scene_multiplayer.cpp b/modules/multiplayer/scene_multiplayer.cpp
index 665b246bc5..f10b3048ba 100644
--- a/modules/multiplayer/scene_multiplayer.cpp
+++ b/modules/multiplayer/scene_multiplayer.cpp
@@ -96,35 +96,29 @@ Error SceneMultiplayer::poll() {
#endif
if (pending_peers.has(sender)) {
- if (pending_peers[sender].local) {
- // If the auth is over, admit the peer at the first packet.
- pending_peers.erase(sender);
- _admit_peer(sender);
+ ERR_CONTINUE(len < 2 || (packet[0] & CMD_MASK) != NETWORK_COMMAND_SYS || packet[1] != SYS_COMMAND_AUTH);
+ // Auth message.
+ PackedByteArray pba;
+ pba.resize(len - 2);
+ if (pba.size()) {
+ memcpy(pba.ptrw(), &packet[2], len - 2);
+ // User callback
+ const Variant sv = sender;
+ const Variant pbav = pba;
+ const Variant *argv[2] = { &sv, &pbav };
+ Variant ret;
+ Callable::CallError ce;
+ auth_callback.callp(argv, 2, ret, ce);
+ ERR_CONTINUE_MSG(ce.error != Callable::CallError::CALL_OK, "Failed to call authentication callback");
} else {
- ERR_CONTINUE(len < 2 || (packet[0] & CMD_MASK) != NETWORK_COMMAND_SYS || packet[1] != SYS_COMMAND_AUTH);
- // Auth message.
- PackedByteArray pba;
- pba.resize(len - 2);
- if (pba.size()) {
- memcpy(pba.ptrw(), &packet[2], len - 2);
- // User callback
- const Variant sv = sender;
- const Variant pbav = pba;
- const Variant *argv[2] = { &sv, &pbav };
- Variant ret;
- Callable::CallError ce;
- auth_callback.callp(argv, 2, ret, ce);
- ERR_CONTINUE_MSG(ce.error != Callable::CallError::CALL_OK, "Failed to call authentication callback");
- } else {
- // Remote complete notification.
- pending_peers[sender].remote = true;
- if (pending_peers[sender].local) {
- pending_peers.erase(sender);
- _admit_peer(sender);
- }
+ // Remote complete notification.
+ pending_peers[sender].remote = true;
+ if (pending_peers[sender].local) {
+ pending_peers.erase(sender);
+ _admit_peer(sender);
}
- continue; // Auth in progress.
}
+ continue; // Auth in progress.
}
ERR_CONTINUE(!connected_peers.has(sender));