diff --git a/modules/network_synchronizer/networked_controller.cpp b/modules/network_synchronizer/networked_controller.cpp index 4ed101cafa76..72ac8a31fed6 100644 --- a/modules/network_synchronizer/networked_controller.cpp +++ b/modules/network_synchronizer/networked_controller.cpp @@ -35,7 +35,9 @@ #include "networked_controller.h" #include "core/config/engine.h" +#include "core/config/project_settings.h" #include "core/io/marshalls.h" +#include "core/multiplayer/multiplayer_api.h" #include "scene_synchronizer.h" #include @@ -120,21 +122,12 @@ void NetworkedController::_bind_methods() { GDVIRTUAL_BIND(_collect_inputs, "delta", "buffer"); GDVIRTUAL_BIND(_controller_process, "delta", "buffer"); GDVIRTUAL_BIND(_are_inputs_different, "inputs_A", "inputs_B"); - GDVIRTUAL_BIND( _count_input_size, "inputs"); + GDVIRTUAL_BIND(_count_input_size, "inputs"); GDVIRTUAL_BIND(_collect_epoch_data, "buffer"); GDVIRTUAL_BIND(_setup_interpolator, "interpolator"); GDVIRTUAL_BIND(_parse_epoch_data, "interpolator", "buffer"); GDVIRTUAL_BIND(_apply_epoch, "delta", "interpolated_data"); - // BIND_VMETHOD(MethodInfo("_collect_inputs", PropertyInfo(Variant::FLOAT, "delta"), PropertyInfo(Variant::OBJECT, "buffer", PROPERTY_HINT_RESOURCE_TYPE, "DataBuffer"))); - // BIND_VMETHOD(MethodInfo("_controller_process", PropertyInfo(Variant::FLOAT, "delta"), PropertyInfo(Variant::OBJECT, "buffer", PROPERTY_HINT_RESOURCE_TYPE, "DataBuffer"))); - // BIND_VMETHOD(MethodInfo(Variant::BOOL, "_are_inputs_different", PropertyInfo(Variant::OBJECT, "inputs_A", PROPERTY_HINT_RESOURCE_TYPE, "DataBuffer"), PropertyInfo(Variant::OBJECT, "inputs_B", PROPERTY_HINT_RESOURCE_TYPE, "DataBuffer"))); - // BIND_VMETHOD(MethodInfo(Variant::INT, "_count_input_size", PropertyInfo(Variant::OBJECT, "inputs", PROPERTY_HINT_RESOURCE_TYPE, "DataBuffer"))); - // BIND_VMETHOD(MethodInfo("_collect_epoch_data", PropertyInfo(Variant::OBJECT, "buffer", PROPERTY_HINT_RESOURCE_TYPE, "DataBuffer"))); - // BIND_VMETHOD(MethodInfo("_setup_interpolator", PropertyInfo(Variant::OBJECT, "interpolator", PROPERTY_HINT_RESOURCE_TYPE, "Interpolator"))); - // BIND_VMETHOD(MethodInfo("_parse_epoch_data", PropertyInfo(Variant::OBJECT, "interpolator", PROPERTY_HINT_RESOURCE_TYPE, "Interpolator"), PropertyInfo(Variant::OBJECT, "buffer", PROPERTY_HINT_RESOURCE_TYPE, "DataBuffer"))); - // BIND_VMETHOD(MethodInfo("_apply_epoch", PropertyInfo(Variant::FLOAT, "delta"), PropertyInfo(Variant::ARRAY, "interpolated_data"))); - ADD_PROPERTY(PropertyInfo(Variant::INT, "input_storage_size", PROPERTY_HINT_RANGE, "5,2000,1"), "set_player_input_storage_size", "get_player_input_storage_size"); ADD_PROPERTY(PropertyInfo(Variant::INT, "max_redundant_inputs", PROPERTY_HINT_RANGE, "0,1000,1"), "set_max_redundant_inputs", "get_max_redundant_inputs"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "tick_speedup_notification_delay", PROPERTY_HINT_RANGE, "0.001,2.0,0.001"), "set_tick_speedup_notification_delay", "get_tick_speedup_notification_delay"); @@ -157,10 +150,11 @@ void NetworkedController::_bind_methods() { } NetworkedController::NetworkedController() { - rpc_config(SNAME("_rpc_server_send_inputs"), Multiplayer::RPC_MODE_ANY_PEER, Multiplayer::TRANSFER_MODE_UNRELIABLE); - rpc_config(SNAME("_rpc_send_tick_additional_speed"), Multiplayer::RPC_MODE_ANY_PEER, Multiplayer::TRANSFER_MODE_UNRELIABLE); - rpc_config(SNAME("_rpc_doll_notify_sync_pause"), Multiplayer::RPC_MODE_ANY_PEER, Multiplayer::TRANSFER_MODE_RELIABLE); - rpc_config(SNAME("_rpc_doll_send_epoch_batch"), Multiplayer::RPC_MODE_ANY_PEER, Multiplayer::TRANSFER_MODE_UNRELIABLE); + constexpr bool call_local = false; + rpc_config(SNAME("_rpc_server_send_inputs"), Multiplayer::RPC_MODE_ANY_PEER, call_local, Multiplayer::TRANSFER_MODE_UNRELIABLE); + rpc_config(SNAME("_rpc_send_tick_additional_speed"), Multiplayer::RPC_MODE_ANY_PEER, call_local, Multiplayer::TRANSFER_MODE_UNRELIABLE); + rpc_config(SNAME("_rpc_doll_notify_sync_pause"), Multiplayer::RPC_MODE_ANY_PEER, call_local, Multiplayer::TRANSFER_MODE_RELIABLE); + rpc_config(SNAME("_rpc_doll_send_epoch_batch"), Multiplayer::RPC_MODE_ANY_PEER, call_local, Multiplayer::TRANSFER_MODE_UNRELIABLE); } void NetworkedController::set_player_input_storage_size(int p_size) { @@ -319,7 +313,7 @@ void NetworkedController::set_doll_collect_rate_factor(int p_peer, real_t p_fact void NetworkedController::set_doll_peer_active(int p_peer_id, bool p_active) { ERR_FAIL_COND_MSG(is_server_controller() == false, "You can set doll activation only on server"); - ERR_FAIL_COND_MSG(p_peer_id == get_network_master(), "This `peer_id` is equal to the Master `peer_id`, which is not allowed."); + ERR_FAIL_COND_MSG(p_peer_id == get_multiplayer_authority(), "This `peer_id` is equal to the Master `peer_id`, which is not allowed."); ServerController *server_controller = static_cast(controller); const uint32_t pos = server_controller->find_peer(p_peer_id); @@ -505,14 +499,14 @@ void NetworkedController::_notification(int p_what) { return; } - ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDEN(_collect_inputs) == false, "In your script you must inherit the virtual method `_collect_inputs` to correctly use the `NetworkedController`."); - ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDEN(_controller_process) == false, "In your script you must inherit the virtual method `_controller_process` to correctly use the `NetworkedController`."); - ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDEN(_are_inputs_different) == false, "In your script you must inherit the virtual method `_are_inputs_different` to correctly use the `NetworkedController`."); - ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDEN(_count_input_size) == false, "In your script you must inherit the virtual method `_count_input_size` to correctly use the `NetworkedController`."); - ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDEN(_collect_epoch_data) == false, "In your script you must inherit the virtual method `_collect_epoch_data` to correctly use the `NetworkedController`."); - ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDEN(_setup_interpolator) == false, "In your script you must inherit the virtual method `_setup_interpolator` to correctly use the `NetworkedController`."); - ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDEN(_parse_epoch_data) == false, "In your script you must inherit the virtual method `_parse_epoch_data` to correctly use the `NetworkedController`."); - ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDEN(_apply_epoch) == false, "In your script you must inherit the virtual method `_apply_epoch` to correctly use the `NetworkedController`."); + ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDDEN(_collect_inputs) == false, "In your script you must inherit the virtual method `_collect_inputs` to correctly use the `NetworkedController`."); + ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDDEN(_controller_process) == false, "In your script you must inherit the virtual method `_controller_process` to correctly use the `NetworkedController`."); + ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDDEN(_are_inputs_different) == false, "In your script you must inherit the virtual method `_are_inputs_different` to correctly use the `NetworkedController`."); + ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDDEN(_count_input_size) == false, "In your script you must inherit the virtual method `_count_input_size` to correctly use the `NetworkedController`."); + ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDDEN(_collect_epoch_data) == false, "In your script you must inherit the virtual method `_collect_epoch_data` to correctly use the `NetworkedController`."); + ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDDEN(_setup_interpolator) == false, "In your script you must inherit the virtual method `_setup_interpolator` to correctly use the `NetworkedController`."); + ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDDEN(_parse_epoch_data) == false, "In your script you must inherit the virtual method `_parse_epoch_data` to correctly use the `NetworkedController`."); + ERR_FAIL_COND_MSG(GDVIRTUAL_IS_OVERRIDDEN(_apply_epoch) == false, "In your script you must inherit the virtual method `_apply_epoch` to correctly use the `NetworkedController`."); } break; #endif @@ -541,7 +535,8 @@ void ServerController::process(real_t p_delta) { node->get_inputs_buffer_mut().begin_read(); node->get_inputs_buffer_mut().seek(METADATA_SIZE); - node->GDVIRTUAL_CALL( + GDVIRTUAL_CALL_PTR( + node, _controller_process, p_delta, &node->get_inputs_buffer_mut()); @@ -602,9 +597,9 @@ void ServerController::activate_peer(int p_peer) { #ifdef DEBUG_ENABLED // Unreachable because this is the server controller. - CRASH_COND(node->get_tree()->get_multiplayer()->is_network_server() == false); + CRASH_COND(node->get_tree()->get_multiplayer()->is_server() == false); #endif - if (p_peer == node->get_network_master()) { + if (p_peer == node->get_multiplayer_authority()) { // This is self, so not a doll. return; } @@ -618,7 +613,7 @@ void ServerController::activate_peer(int p_peer) { void ServerController::deactivate_peer(int p_peer) { const uint32_t index = find_peer(p_peer); if (index != UINT32_MAX) { - peers.remove_unordered(index); + peers.remove_at_unordered(index); } } @@ -669,8 +664,8 @@ void ServerController::receive_inputs(const Vector &p_data) { const bool has_data = pir.read_bool(); int input_size = 0; - if (has_data){ - if (!node->GDVIRTUAL_CALL(_count_input_size, const_cast(&pir), input_size)) { + if (has_data) { + if (!GDVIRTUAL_CALL_PTR(node, _count_input_size, const_cast(&pir), input_size)) { ERR_PRINT("The function `_count_input_size` was not executed."); } } @@ -860,8 +855,8 @@ bool ServerController::fetch_next_input() { pir_B.seek(METADATA_SIZE); bool is_meaningful = true; - const bool executed = node->GDVIRTUAL_CALL(_are_inputs_different, const_cast(&pir_A), const_cast(&pir_B), is_meaningful); - if(executed == false) { + const bool executed = GDVIRTUAL_CALL_PTR(node, _are_inputs_different, const_cast(&pir_A), const_cast(&pir_B), is_meaningful); + if (executed == false) { ERR_PRINT("The function _are_inputs_different was not executed!"); } @@ -932,7 +927,7 @@ void ServerController::doll_sync(real_t p_delta) { if (epoch_state_collected == false) { epoch_state_data_cache.begin_write(0); epoch_state_data_cache.add_int(epoch, DataBuffer::COMPRESSION_LEVEL_1); - node->GDVIRTUAL_CALL(_collect_epoch_data, &epoch_state_data_cache); + GDVIRTUAL_CALL_PTR(node, _collect_epoch_data, &epoch_state_data_cache); epoch_state_data_cache.dry(); epoch_state_collected = true; } @@ -1038,7 +1033,7 @@ void ServerController::calculates_player_tick_rate(real_t p_delta) { const real_t acc = distance_to_optimal_count * node->get_tick_acceleration() * p_delta; // Used to avoid oscillations. const real_t damp = -(client_tick_additional_speed * 0.95); - client_tick_additional_speed += acc + damp * ((SGN(acc) * SGN(damp) + 1) / 2.0); + client_tick_additional_speed += acc + damp * ((SIGN(acc) * SIGN(damp) + 1) / 2.0); client_tick_additional_speed = CLAMP(client_tick_additional_speed, -MAX_ADDITIONAL_TICK_SPEED, MAX_ADDITIONAL_TICK_SPEED); #ifdef DEBUG_ENABLED @@ -1060,7 +1055,7 @@ void ServerController::adjust_player_tick_rate(real_t p_delta) { packet_data.push_back(new_speed); node->rpc_id( - node->get_network_master(), + node->get_multiplayer_authority(), SNAME("_rpc_send_tick_additional_speed"), packet_data); } @@ -1096,7 +1091,7 @@ void PlayerController::process(real_t p_delta) { node->get_inputs_buffer_mut().begin_write(METADATA_SIZE); node->get_inputs_buffer_mut().seek(1); - node->GDVIRTUAL_CALL(_collect_inputs, p_delta, &node->get_inputs_buffer_mut()); + GDVIRTUAL_CALL_PTR(node, _collect_inputs, p_delta, &node->get_inputs_buffer_mut()); // Set metadata data. node->get_inputs_buffer_mut().seek(0); @@ -1116,7 +1111,7 @@ void PlayerController::process(real_t p_delta) { // The physics process is always emitted, because we still need to simulate // the character motion even if we don't store the player inputs. - node->GDVIRTUAL_CALL(_controller_process, p_delta, &node->get_inputs_buffer()); + GDVIRTUAL_CALL_PTR(node, _controller_process, p_delta, &node->get_inputs_buffer()); node->player_set_has_new_input(false); if (accept_new_inputs) { @@ -1201,7 +1196,7 @@ bool PlayerController::process_instant(int p_i, real_t p_delta) { ib.shrink_to(METADATA_SIZE, frames_snapshot[i].buffer_size_bit - METADATA_SIZE); ib.begin_read(); ib.seek(METADATA_SIZE); - node->GDVIRTUAL_CALL(_controller_process, p_delta, &ib); + GDVIRTUAL_CALL_PTR(node, _controller_process, p_delta, &ib); return (i + 1) < frames_snapshot.size(); } else { @@ -1278,8 +1273,8 @@ void PlayerController::send_frame_input_buffer_to_server() { pir_B.seek(METADATA_SIZE); bool are_different = true; - const bool executed = node->GDVIRTUAL_CALL(_are_inputs_different, const_cast(&pir_A), const_cast(&pir_B), are_different); - if(executed == false) { + const bool executed = GDVIRTUAL_CALL_PTR(node, _are_inputs_different, const_cast(&pir_A), const_cast(&pir_B), are_different); + if (executed == false) { ERR_PRINT("The function _are_inputs_different was not executed!"); } @@ -1373,7 +1368,8 @@ DollController::DollController(NetworkedController *p_node) : void DollController::ready() { interpolator.reset(); - node->GDVIRTUAL_CALL( + GDVIRTUAL_CALL_PTR( + node, _setup_interpolator, &interpolator); interpolator.terminate_init(); @@ -1388,10 +1384,11 @@ void DollController::process(real_t p_delta) { } const real_t fractional_part = advancing_epoch; - node->GDVIRTUAL_CALL( + GDVIRTUAL_CALL_PTR( + node, _apply_epoch, p_delta, - Array(interpolator.pop_epoch(frame_epoch, fractional_part))); + interpolator.pop_epoch(frame_epoch, fractional_part)); } uint32_t DollController::get_current_input_id() const { @@ -1425,9 +1422,9 @@ void DollController::receive_batch(const Vector &p_data) { while (buffer_start_position < p_data.size()) { const int buffer_size = p_data[buffer_start_position]; - const Vector buffer = p_data.subarray( + const Vector buffer = p_data.slice( buffer_start_position + 1, - buffer_start_position + 1 + buffer_size - 1); + buffer_start_position + 1 + buffer_size); ERR_FAIL_COND(buffer.size() <= 0); @@ -1494,7 +1491,7 @@ uint32_t DollController::receive_epoch(const Vector &p_data) { } interpolator.begin_write(epoch); - node->GDVIRTUAL_CALL(_parse_epoch_data, &interpolator, &buffer); + GDVIRTUAL_CALL_PTR(node, _parse_epoch_data, &interpolator, &buffer); interpolator.end_write(); return epoch; @@ -1587,10 +1584,10 @@ NoNetController::NoNetController(NetworkedController *p_node) : void NoNetController::process(real_t p_delta) { node->get_inputs_buffer_mut().begin_write(0); // No need of meta in this case. - node->GDVIRTUAL_CALL(_collect_inputs, p_delta, &node->get_inputs_buffer_mut()); + GDVIRTUAL_CALL_PTR(node, _collect_inputs, p_delta, &node->get_inputs_buffer_mut()); node->get_inputs_buffer_mut().dry(); node->get_inputs_buffer_mut().begin_read(); - node->GDVIRTUAL_CALL(_controller_process, p_delta, &node->get_inputs_buffer_mut()); + GDVIRTUAL_CALL_PTR(node, _controller_process, p_delta, &node->get_inputs_buffer_mut()); frame_id += 1; } diff --git a/modules/network_synchronizer/register_types.cpp b/modules/network_synchronizer/register_types.cpp index 49b4b83fae66..e61c6bd95155 100644 --- a/modules/network_synchronizer/register_types.cpp +++ b/modules/network_synchronizer/register_types.cpp @@ -34,6 +34,7 @@ #include "register_types.h" +#include "core/config/project_settings.h" #include "data_buffer.h" #include "interpolator.h" #include "networked_controller.h" diff --git a/modules/network_synchronizer/scene_synchronizer.cpp b/modules/network_synchronizer/scene_synchronizer.cpp index 6433757b9835..08e201656787 100644 --- a/modules/network_synchronizer/scene_synchronizer.cpp +++ b/modules/network_synchronizer/scene_synchronizer.cpp @@ -34,6 +34,7 @@ #include "scene_synchronizer.h" +#include "core/multiplayer/multiplayer_api.h" #include "networked_controller.h" #include "scene/main/window.h" #include "scene_diff.h" @@ -129,7 +130,7 @@ void SceneSynchronizer::_notification(int p_what) { return; // TODO add a signal that allows to not check this each frame. - if (unlikely(peer_ptr != get_multiplayer()->get_network_peer().ptr())) { + if (unlikely(peer_ptr != get_multiplayer()->get_multiplayer_peer().ptr())) { reset_synchronizer_mode(); } @@ -145,8 +146,8 @@ void SceneSynchronizer::_notification(int p_what) { clear(); reset_synchronizer_mode(); - get_multiplayer()->connect(SNAME("network_peer_connected"), Callable(this, SNAME("_on_peer_connected"))); - get_multiplayer()->connect(SNAME("network_peer_disconnected"), Callable(this, SNAME("_on_peer_disconnected"))); + get_multiplayer()->connect(SNAME("peer_connected"), Callable(this, SNAME("_on_peer_connected"))); + get_multiplayer()->connect(SNAME("peer_disconnected"), Callable(this, SNAME("_on_peer_disconnected"))); get_tree()->connect(SNAME("node_removed"), Callable(this, SNAME("_on_node_removed"))); @@ -154,11 +155,10 @@ void SceneSynchronizer::_notification(int p_what) { reset_controllers(); // Init the peers already connected. - if (get_tree()->get_multiplayer()->get_network_peer().is_valid()) { - const Vector peer_ids = get_tree()->get_multiplayer()->get_network_connected_peers(); - const int *peer_ids_ptr = peer_ids.ptr(); - for (int i = 0; i < peer_ids.size(); i += 1) { - _on_peer_connected(peer_ids_ptr[i]); + if (get_tree()->get_multiplayer()->get_multiplayer_peer().is_valid()) { + const Set peer_ids = get_tree()->get_multiplayer()->get_connected_peers(); + for (Set::ConstIterator it = peer_ids.begin(); it != peer_ids.end(); ++it) { + _on_peer_connected(*it); } } @@ -169,8 +169,8 @@ void SceneSynchronizer::_notification(int p_what) { clear_peers(); - get_multiplayer()->disconnect(SNAME("network_peer_connected"), Callable(this, SNAME("_on_peer_connected"))); - get_multiplayer()->disconnect(SNAME("network_peer_disconnected"), Callable(this, SNAME("_on_peer_disconnected"))); + get_multiplayer()->disconnect(SNAME("peer_connected"), Callable(this, SNAME("_on_peer_connected"))); + get_multiplayer()->disconnect(SNAME("peer_disconnected"), Callable(this, SNAME("_on_peer_disconnected"))); get_tree()->disconnect(SNAME("node_removed"), Callable(this, SNAME("_on_node_removed"))); @@ -191,10 +191,11 @@ void SceneSynchronizer::_notification(int p_what) { } SceneSynchronizer::SceneSynchronizer() { - rpc_config(SNAME("_rpc_send_state"), MultiplayerAPI::RPC_MODE_REMOTE, MultiplayerPeer::TRANSFER_MODE_RELIABLE); - rpc_config(SNAME("_rpc_notify_need_full_snapshot"), MultiplayerAPI::RPC_MODE_REMOTE, MultiplayerPeer::TRANSFER_MODE_RELIABLE); - rpc_config(SNAME("_rpc_set_network_enabled"), MultiplayerAPI::RPC_MODE_REMOTE, MultiplayerPeer::TRANSFER_MODE_RELIABLE); - rpc_config(SNAME("_rpc_notify_peer_status"), MultiplayerAPI::RPC_MODE_REMOTE, MultiplayerPeer::TRANSFER_MODE_RELIABLE); + constexpr bool call_local = false; + rpc_config(SNAME("_rpc_send_state"), Multiplayer::RPC_MODE_ANY_PEER, call_local, Multiplayer::TRANSFER_MODE_RELIABLE); + rpc_config(SNAME("_rpc_notify_need_full_snapshot"), Multiplayer::RPC_MODE_ANY_PEER, call_local, Multiplayer::TRANSFER_MODE_RELIABLE); + rpc_config(SNAME("_rpc_set_network_enabled"), Multiplayer::RPC_MODE_ANY_PEER, call_local, Multiplayer::TRANSFER_MODE_RELIABLE); + rpc_config(SNAME("_rpc_notify_peer_status"), Multiplayer::RPC_MODE_ANY_PEER, call_local, Multiplayer::TRANSFER_MODE_RELIABLE); // Avoid too much useless re-allocations. event_listener.reserve(100); @@ -638,7 +639,7 @@ void SceneSynchronizer::unregister_process(Node *p_node, const StringName &p_fun } void SceneSynchronizer::start_tracking_scene_changes(Object *p_diff_handle) const { - ERR_FAIL_COND_MSG(get_tree()->get_multiplayer()->is_network_server() == false, "This function is supposed to be called only on server."); + ERR_FAIL_COND_MSG(get_tree()->get_multiplayer()->is_server() == false, "This function is supposed to be called only on server."); SceneDiff *diff = Object::cast_to(p_diff_handle); ERR_FAIL_COND_MSG(diff == nullptr, "The object is not a SceneDiff class."); @@ -646,7 +647,7 @@ void SceneSynchronizer::start_tracking_scene_changes(Object *p_diff_handle) cons } void SceneSynchronizer::stop_tracking_scene_changes(Object *p_diff_handle) const { - ERR_FAIL_COND_MSG(get_tree()->get_multiplayer()->is_network_server() == false, "This function is supposed to be called only on server."); + ERR_FAIL_COND_MSG(get_tree()->get_multiplayer()->is_server() == false, "This function is supposed to be called only on server."); SceneDiff *diff = Object::cast_to(p_diff_handle); ERR_FAIL_COND_MSG(diff == nullptr, "The object is not a SceneDiff class."); @@ -744,7 +745,7 @@ void SceneSynchronizer::apply_scene_changes(const Variant &p_sync_data) { if (success == false) { NET_DEBUG_ERR("Scene changes:"); - NET_DEBUG_ERR(p_sync_data); + NET_DEBUG_ERR(p_sync_data.stringify()); } change_events_flush(); @@ -839,7 +840,7 @@ bool SceneSynchronizer::is_peer_networking_enable(int p_peer) const { return true; } - NetUtility::PeerData *pd = peer_data.lookup_ptr(p_peer); + const NetUtility::PeerData *pd = peer_data.lookup_ptr(p_peer); ERR_FAIL_COND_V_MSG(pd == nullptr, false, "The peer: " + itos(p_peer) + " is not know. [bug]"); return pd->enabled; } else { @@ -878,14 +879,14 @@ void SceneSynchronizer::reset_synchronizer_mode() { synchronizer_type = SYNCHRONIZER_TYPE_NULL; } - peer_ptr = get_multiplayer() == nullptr ? nullptr : get_multiplayer()->get_network_peer().ptr(); + peer_ptr = get_multiplayer() == nullptr ? nullptr : get_multiplayer()->get_multiplayer_peer().ptr(); - if (get_tree() == nullptr || get_tree()->get_multiplayer()->get_network_peer().is_null()) { + if (get_tree() == nullptr || get_tree()->get_multiplayer()->get_multiplayer_peer().is_null()) { synchronizer_type = SYNCHRONIZER_TYPE_NONETWORK; synchronizer = memnew(NoNetSynchronizer(this)); generate_id = true; - } else if (get_tree()->get_multiplayer()->is_network_server()) { + } else if (get_tree()->get_multiplayer()->is_server()) { synchronizer_type = SYNCHRONIZER_TYPE_SERVER; synchronizer = memnew(ServerSynchronizer(this)); generate_id = true; @@ -967,7 +968,7 @@ void SceneSynchronizer::_rpc_send_state(const Variant &p_snapshot) { void SceneSynchronizer::_rpc_notify_need_full_snapshot() { ERR_FAIL_COND_MSG(is_server() == false, "Only the server can receive the request to send a full snapshot."); - const int sender_peer = get_tree()->get_multiplayer()->get_rpc_sender_id(); + const int sender_peer = get_tree()->get_multiplayer()->get_remote_sender_id(); NetUtility::PeerData *pd = peer_data.lookup_ptr(sender_peer); ERR_FAIL_COND(pd == nullptr); pd->need_full_snapshot = true; @@ -976,7 +977,7 @@ void SceneSynchronizer::_rpc_notify_need_full_snapshot() { void SceneSynchronizer::_rpc_set_network_enabled(bool p_enabled) { ERR_FAIL_COND_MSG(is_server() == false, "The peer status is supposed to be received by the server."); set_peer_networking_enable( - get_multiplayer()->get_rpc_sender_id(), + get_multiplayer()->get_remote_sender_id(), p_enabled); } @@ -1005,7 +1006,7 @@ void SceneSynchronizer::update_peers() { NetUtility::NodeData *nd = get_node_data(it.value->controller_id); if (nd == nullptr || nd->is_controller == false || - nd->node->get_network_master() != (*it.key)) { + nd->node->get_multiplayer_authority() != (*it.key)) { // Invalidate the controller id it.value->controller_id = UINT32_MAX; } @@ -1014,7 +1015,7 @@ void SceneSynchronizer::update_peers() { if (it.value->controller_id == UINT32_MAX) { // The controller_id is not assigned, search it. for (uint32_t i = 0; i < node_data_controllers.size(); i += 1) { - if (node_data_controllers[i]->node->get_network_master() == (*it.key)) { + if (node_data_controllers[i]->node->get_multiplayer_authority() == (*it.key)) { // Controller found. it.value->controller_id = node_data_controllers[i]->id; break; @@ -1146,7 +1147,7 @@ void SceneSynchronizer::change_events_flush() { } Callable::CallError e; - obj->call(listener.method, vars_ptr.ptr(), vars_ptr.size(), e); + obj->callp(listener.method, vars_ptr.ptr(), vars_ptr.size(), e); } recover_in_progress = false; @@ -1235,8 +1236,8 @@ void SceneSynchronizer::drop_node_data(NetUtility::NodeData *p_node_data) { for (uint32_t i = 0; i < node_data_controllers.size(); i += 1) { const int64_t index = node_data_controllers[i]->dependency_nodes.find(p_node_data); if (index != -1) { - node_data_controllers[i]->dependency_nodes.remove_unordered(index); - node_data_controllers[i]->dependency_nodes_end.remove_unordered(index); + node_data_controllers[i]->dependency_nodes.remove_at_unordered(index); + node_data_controllers[i]->dependency_nodes_end.remove_at_unordered(index); } } @@ -1257,7 +1258,7 @@ void SceneSynchronizer::drop_node_data(NetUtility::NodeData *p_node_data) { // Nothing more to do. break; } else { - event_listener[i].watching_vars.remove_unordered(index_to_remove); + event_listener[i].watching_vars.remove_at_unordered(index_to_remove); } } } @@ -1291,13 +1292,13 @@ bool SceneSynchronizer::compare(const Variant &p_first, const Variant &p_second) bool SceneSynchronizer::compare(const Vector2 &p_first, const Vector2 &p_second, real_t p_tolerance) { return Math::is_equal_approx(p_first.x, p_second.x, p_tolerance) && - Math::is_equal_approx(p_first.y, p_second.y, p_tolerance); + Math::is_equal_approx(p_first.y, p_second.y, p_tolerance); } bool SceneSynchronizer::compare(const Vector3 &p_first, const Vector3 &p_second, real_t p_tolerance) { return Math::is_equal_approx(p_first.x, p_second.x, p_tolerance) && - Math::is_equal_approx(p_first.y, p_second.y, p_tolerance) && - Math::is_equal_approx(p_first.z, p_second.z, p_tolerance); + Math::is_equal_approx(p_first.y, p_second.y, p_tolerance) && + Math::is_equal_approx(p_first.z, p_second.z, p_tolerance); } bool SceneSynchronizer::compare(const Variant &p_first, const Variant &p_second, real_t p_tolerance) { @@ -1326,9 +1327,9 @@ bool SceneSynchronizer::compare(const Variant &p_first, const Variant &p_second, case Variant::TRANSFORM2D: { const Transform2D a(p_first); const Transform2D b(p_second); - if (compare(a.elements[0], b.elements[0], p_tolerance)) { - if (compare(a.elements[1], b.elements[1], p_tolerance)) { - if (compare(a.elements[2], b.elements[2], p_tolerance)) { + if (compare(a.columns[0], b.columns[0], p_tolerance)) { + if (compare(a.columns[1], b.columns[1], p_tolerance)) { + if (compare(a.columns[2], b.columns[2], p_tolerance)) { return true; } } @@ -1367,9 +1368,9 @@ bool SceneSynchronizer::compare(const Variant &p_first, const Variant &p_second, case Variant::BASIS: { const Basis a = p_first; const Basis b = p_second; - if (compare(a.elements[0], b.elements[0], p_tolerance)) { - if (compare(a.elements[1], b.elements[1], p_tolerance)) { - if (compare(a.elements[2], b.elements[2], p_tolerance)) { + if (compare(a.rows[0], b.rows[0], p_tolerance)) { + if (compare(a.rows[1], b.rows[1], p_tolerance)) { + if (compare(a.rows[2], b.rows[2], p_tolerance)) { return true; } } @@ -1380,9 +1381,9 @@ bool SceneSynchronizer::compare(const Variant &p_first, const Variant &p_second, const Transform3D a = p_first; const Transform3D b = p_second; if (compare(a.origin, b.origin, p_tolerance)) { - if (compare(a.basis.elements[0], b.basis.elements[0], p_tolerance)) { - if (compare(a.basis.elements[1], b.basis.elements[1], p_tolerance)) { - if (compare(a.basis.elements[2], b.basis.elements[2], p_tolerance)) { + if (compare(a.basis.rows[0], b.basis.rows[0], p_tolerance)) { + if (compare(a.basis.rows[1], b.basis.rows[1], p_tolerance)) { + if (compare(a.basis.rows[2], b.basis.rows[2], p_tolerance)) { return true; } } @@ -1488,8 +1489,8 @@ void SceneSynchronizer::purge_node_dependencies() { if (node_data_controllers[i]->dependency_nodes_end[d] < client_sync->last_checked_input) { // This controller dependency can be cleared because the server // snapshot check has - node_data_controllers[i]->dependency_nodes.remove_unordered(d); - node_data_controllers[i]->dependency_nodes_end.remove_unordered(d); + node_data_controllers[i]->dependency_nodes.remove_at_unordered(d); + node_data_controllers[i]->dependency_nodes_end.remove_at_unordered(d); d -= 1; } } @@ -1572,13 +1573,13 @@ void SceneSynchronizer::reset_controller(NetUtility::NodeData *p_controller_nd) return; } - if (get_tree()->get_multiplayer()->get_network_peer().is_null()) { + if (get_tree()->get_multiplayer()->get_multiplayer_peer().is_null()) { controller->controller_type = NetworkedController::CONTROLLER_TYPE_NONETWORK; controller->controller = memnew(NoNetController(controller)); - } else if (get_tree()->get_multiplayer()->is_network_server()) { + } else if (get_tree()->get_multiplayer()->is_server()) { controller->controller_type = NetworkedController::CONTROLLER_TYPE_SERVER; controller->controller = memnew(ServerController(controller, controller->get_network_traced_frames())); - } else if (controller->is_network_master()) { + } else if (controller->is_multiplayer_authority()) { controller->controller_type = NetworkedController::CONTROLLER_TYPE_PLAYER; controller->controller = memnew(PlayerController(controller)); } else { @@ -2425,7 +2426,7 @@ void ClientSynchronizer::process_controllers_recovery(real_t p_delta) { nodes_to_recover[i]->vars[v].var.value = s_vars_ptr[v].value.duplicate(true); node->set(s_vars_ptr[v].name, s_vars_ptr[v].value); - NET_DEBUG_PRINT(" |- Variable: " + s_vars_ptr[v].name + " New value: " + s_vars_ptr[v].value); + NET_DEBUG_PRINT(" |- Variable: " + s_vars_ptr[v].name + " New value: " + s_vars_ptr[v].value.stringify()); scene_synchronizer->change_event_add( nodes_to_recover[i], v, @@ -2534,7 +2535,7 @@ void ClientSynchronizer::process_controllers_recovery(real_t p_delta) { rew_node_data->vars[rew_var_index].var.value = vars_ptr[v].value.duplicate(true); node->set(vars_ptr[v].name, vars_ptr[v].value); - NET_DEBUG_PRINT(" |- Variable: " + vars_ptr[v].name + "; old value: " + old_val + " new value: " + vars_ptr[v].value); + NET_DEBUG_PRINT(" |- Variable: " + vars_ptr[v].name + "; old value: " + old_val.stringify() + " new value: " + vars_ptr[v].value.stringify()); scene_synchronizer->change_event_add( rew_node_data, rew_var_index, @@ -2602,7 +2603,7 @@ void ClientSynchronizer::process_paused_controller_recovery(real_t p_delta) { rew_node_data->vars[var_id].var.value = snap_vars_ptr[var_id].value; node->set(snap_vars_ptr[var_id].name, snap_vars_ptr[var_id].value); NET_DEBUG_PRINT("[Snapshot paused controller] Node: " + node->get_path()); - NET_DEBUG_PRINT(" |- Variable: " + snap_vars_ptr[var_id].name + "; value: " + snap_vars_ptr[var_id].value); + NET_DEBUG_PRINT(" |- Variable: " + snap_vars_ptr[var_id].name + "; value: " + snap_vars_ptr[var_id].value.stringify()); scene_synchronizer->change_event_add( rew_node_data, var_id, @@ -2950,7 +2951,7 @@ bool ClientSynchronizer::parse_snapshot(Variant p_snapshot) { if (success == false) { NET_DEBUG_ERR("Snapshot:"); - NET_DEBUG_ERR(p_snapshot); + NET_DEBUG_ERR(p_snapshot.stringify()); return false; } @@ -2958,7 +2959,7 @@ bool ClientSynchronizer::parse_snapshot(Variant p_snapshot) { // so make sure it's done so. if (unlikely(last_received_snapshot.input_id == UINT32_MAX)) { NET_DEBUG_PRINT("Recovery aborted, the player controller (" + player_controller_node_data->node->get_path() + ") was not part of the received snapshot, probably the server doesn't have important informations for this peer. NetUtility::Snapshot:"); - NET_DEBUG_PRINT(p_snapshot); + NET_DEBUG_PRINT(p_snapshot.stringify()); return false; } else { // Success. @@ -2984,13 +2985,13 @@ bool ClientSynchronizer::compare_vars( NET_DEBUG_PRINT("Difference found: The server has a different variable count (" + itos(p_server_vars.size()) + ") compared to the client (" + itos(p_client_vars.size()) + ")."); NET_DEBUG_PRINT("Server variables:"); for (int i = 0; i < p_server_vars.size(); i += 1) { - NET_DEBUG_PRINT(" |- " + p_server_vars[i].name + ": " + p_server_vars[i].value); + NET_DEBUG_PRINT(" |- " + p_server_vars[i].name + ": " + p_server_vars[i].value.stringify()); } NET_DEBUG_PRINT(" ------"); NET_DEBUG_PRINT("Client variables:"); for (int i = 0; i < p_client_vars.size(); i += 1) { - NET_DEBUG_PRINT(" |- " + p_client_vars[i].name + ": " + p_client_vars[i].value); + NET_DEBUG_PRINT(" |- " + p_client_vars[i].name + ": " + p_client_vars[i].value.stringify()); } NET_DEBUG_PRINT(" ------"); return true; @@ -3019,10 +3020,10 @@ bool ClientSynchronizer::compare_vars( } else { // The vars are different. NET_DEBUG_PRINT("Difference found on var #" + itos(var_index) + " " + p_synchronizer_node_data->vars[var_index].var.name + " " + - "Server value: `" + s_vars[var_index].value + "` " + - "Client value: `" + c_vars[var_index].value + "`. " + - "[Server name: `" + s_vars[var_index].name + "` " + - "Client name: `" + c_vars[var_index].name + "`]."); + "Server value: `" + s_vars[var_index].value.stringify() + "` " + + "Client value: `" + c_vars[var_index].value.stringify() + "`. " + + "[Server name: `" + s_vars[var_index].name + "` " + + "Client name: `" + c_vars[var_index].name + "`]."); #ifdef DEBUG_ENABLED diff = true; #else