diff options
Diffstat (limited to 'modules/multiplayer/multiplayer_synchronizer.cpp')
-rw-r--r-- | modules/multiplayer/multiplayer_synchronizer.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/modules/multiplayer/multiplayer_synchronizer.cpp b/modules/multiplayer/multiplayer_synchronizer.cpp index 9c2d281f72..12b4ac540d 100644 --- a/modules/multiplayer/multiplayer_synchronizer.cpp +++ b/modules/multiplayer/multiplayer_synchronizer.cpp @@ -107,6 +107,9 @@ void MultiplayerSynchronizer::reset() { net_id = 0; last_sync_usec = 0; last_inbound_sync = 0; + last_watch_usec = 0; + sync_started = false; + watchers.clear(); } uint32_t MultiplayerSynchronizer::get_net_id() const { @@ -131,7 +134,9 @@ bool MultiplayerSynchronizer::update_outbound_sync_time(uint64_t p_usec) { } bool MultiplayerSynchronizer::update_inbound_sync_time(uint16_t p_network_time) { - if (p_network_time <= last_inbound_sync && last_inbound_sync - p_network_time < 32767) { + if (!sync_started) { + sync_started = true; + } else if (p_network_time <= last_inbound_sync && last_inbound_sync - p_network_time < 32767) { return false; } last_inbound_sync = p_network_time; @@ -149,14 +154,14 @@ PackedStringArray MultiplayerSynchronizer::get_configuration_warnings() const { } Error MultiplayerSynchronizer::get_state(const List<NodePath> &p_properties, Object *p_obj, Vector<Variant> &r_variant, Vector<const Variant *> &r_variant_ptrs) { - ERR_FAIL_COND_V(!p_obj, ERR_INVALID_PARAMETER); + ERR_FAIL_NULL_V(p_obj, ERR_INVALID_PARAMETER); r_variant.resize(p_properties.size()); r_variant_ptrs.resize(r_variant.size()); int i = 0; for (const NodePath &prop : p_properties) { bool valid = false; const Object *obj = _get_prop_target(p_obj, prop); - ERR_FAIL_COND_V(!obj, FAILED); + ERR_FAIL_NULL_V(obj, FAILED); r_variant.write[i] = obj->get_indexed(prop.get_subnames(), &valid); r_variant_ptrs.write[i] = &r_variant[i]; ERR_FAIL_COND_V_MSG(!valid, ERR_INVALID_DATA, vformat("Property '%s' not found.", prop)); @@ -166,11 +171,11 @@ Error MultiplayerSynchronizer::get_state(const List<NodePath> &p_properties, Obj } Error MultiplayerSynchronizer::set_state(const List<NodePath> &p_properties, Object *p_obj, const Vector<Variant> &p_state) { - ERR_FAIL_COND_V(!p_obj, ERR_INVALID_PARAMETER); + ERR_FAIL_NULL_V(p_obj, ERR_INVALID_PARAMETER); int i = 0; for (const NodePath &prop : p_properties) { Object *obj = _get_prop_target(p_obj, prop); - ERR_FAIL_COND_V(!obj, FAILED); + ERR_FAIL_NULL_V(obj, FAILED); obj->set_indexed(prop.get_subnames(), p_state[i]); i += 1; } @@ -343,6 +348,9 @@ void MultiplayerSynchronizer::update_visibility(int p_for_peer) { } void MultiplayerSynchronizer::set_root_path(const NodePath &p_path) { + if (p_path == root_path) { + return; + } _stop(); root_path = p_path; _start(); @@ -353,15 +361,12 @@ NodePath MultiplayerSynchronizer::get_root_path() const { } void MultiplayerSynchronizer::set_multiplayer_authority(int p_peer_id, bool p_recursive) { - Node *node = is_inside_tree() ? get_node_or_null(root_path) : nullptr; - if (!node || get_multiplayer_authority() == p_peer_id) { - Node::set_multiplayer_authority(p_peer_id, p_recursive); + if (get_multiplayer_authority() == p_peer_id) { return; } - - get_multiplayer()->object_configuration_remove(node, this); + _stop(); Node::set_multiplayer_authority(p_peer_id, p_recursive); - get_multiplayer()->object_configuration_add(node, this); + _start(); } Error MultiplayerSynchronizer::_watch_changes(uint64_t p_usec) { @@ -374,7 +379,7 @@ Error MultiplayerSynchronizer::_watch_changes(uint64_t p_usec) { return OK; } Node *node = get_root_node(); - ERR_FAIL_COND_V(!node, FAILED); + ERR_FAIL_NULL_V(node, FAILED); int idx = -1; Watcher *ptr = watchers.ptrw(); for (const NodePath &prop : props) { @@ -382,7 +387,7 @@ Error MultiplayerSynchronizer::_watch_changes(uint64_t p_usec) { bool valid = false; const Object *obj = _get_prop_target(node, prop); ERR_CONTINUE_MSG(!obj, vformat("Node not found for property '%s'.", prop)); - Variant v = obj->get(prop.get_concatenated_subnames(), &valid); + Variant v = obj->get_indexed(prop.get_subnames(), &valid); ERR_CONTINUE_MSG(!valid, vformat("Property '%s' not found.", prop)); Watcher &w = ptr[idx]; if (w.prop != prop) { @@ -441,6 +446,10 @@ List<NodePath> MultiplayerSynchronizer::get_delta_properties(uint64_t p_indexes) return out; } +SceneReplicationConfig *MultiplayerSynchronizer::get_replication_config_ptr() const { + return replication_config.ptr(); +} + MultiplayerSynchronizer::MultiplayerSynchronizer() { // Publicly visible by default. peer_visibility.insert(0); |