mirror of
https://github.com/godotengine/godot.git
synced 2025-04-07 00:44:24 +08:00
[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. (cherry picked from commit 754036f82f8c404972480c18d81130945fcbb3d9)
This commit is contained in:
parent
f14e43b68f
commit
966e1a3d71
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user