summaryrefslogtreecommitdiffstats
path: root/modules/multiplayer/multiplayer_synchronizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/multiplayer/multiplayer_synchronizer.cpp')
-rw-r--r--modules/multiplayer/multiplayer_synchronizer.cpp35
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);