summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabio Alessandrelli <fabio.alessandrelli@gmail.com>2024-01-14 20:13:35 +0100
committerFabio Alessandrelli <fabio.alessandrelli@gmail.com>2024-01-14 21:04:03 +0100
commit89dacb88ec57dc7c7deb72defac49b60da2e4ca6 (patch)
tree4fbcf74dd0320e15440950766292550ec59ef795
parent26b1fd0d842fa3c2f090ead47e8ea7cd2d6515e1 (diff)
downloadredot-engine-89dacb88ec57dc7c7deb72defac49b60da2e4ca6.tar.gz
[MP] Fix remote net ID cleanup
Synchronizers for spawned nodes were not correctly keeping track of the net ID assigned by the remote, preventing the replication from performing the proper cleanup. This resulted in errors being thrown when sync messages were received after despawn (which is possible due to their unreliable nature).
-rw-r--r--modules/multiplayer/multiplayer_synchronizer.cpp2
-rw-r--r--modules/multiplayer/scene_replication_interface.cpp1
2 files changed, 2 insertions, 1 deletions
diff --git a/modules/multiplayer/multiplayer_synchronizer.cpp b/modules/multiplayer/multiplayer_synchronizer.cpp
index 12b4ac540d..02e3a11964 100644
--- a/modules/multiplayer/multiplayer_synchronizer.cpp
+++ b/modules/multiplayer/multiplayer_synchronizer.cpp
@@ -49,11 +49,11 @@ void MultiplayerSynchronizer::_stop() {
}
#endif
root_node_cache = ObjectID();
- reset();
Node *node = is_inside_tree() ? get_node_or_null(root_path) : nullptr;
if (node) {
get_multiplayer()->object_configuration_remove(node, this);
}
+ reset();
}
void MultiplayerSynchronizer::_start() {
diff --git a/modules/multiplayer/scene_replication_interface.cpp b/modules/multiplayer/scene_replication_interface.cpp
index 31307e648d..d0ba190bda 100644
--- a/modules/multiplayer/scene_replication_interface.cpp
+++ b/modules/multiplayer/scene_replication_interface.cpp
@@ -249,6 +249,7 @@ Error SceneReplicationInterface::on_replication_start(Object *p_obj, Variant p_c
uint32_t net_id = pending_sync_net_ids[0];
pending_sync_net_ids.pop_front();
peers_info[pending_spawn_remote].recv_sync_ids[net_id] = sync->get_instance_id();
+ sync->set_net_id(net_id);
// Try to apply spawn state (before ready).
if (pending_buffer_size > 0) {