@@ -132,6 +132,9 @@ void SceneSynchronizerBase::setup(SynchronizerManager &p_synchronizer_interface)
132132 // Make sure to reset all the assigned controllers.
133133 reset_controllers ();
134134
135+ // Spawn the self peer.
136+ on_peer_connected (get_network_interface ().fetch_local_peer_id ());
137+
135138 // Init the peers already connected.
136139 std::vector<int > peer_ids;
137140 network_interface->fetch_connected_peers (peer_ids);
@@ -624,7 +627,7 @@ void SceneSynchronizerBase::untrack_variable_changes(ListenerHandle p_handle) {
624627 delete listener;
625628}
626629
627- NS::PHandler SceneSynchronizerBase::register_process (ObjectLocalId p_id, ProcessPhase p_phase, std::function<void (float )> p_func) {
630+ NS::PHandler SceneSynchronizerBase::register_process (ObjectLocalId p_id, ProcessPhase p_phase, std::function<void (double )> p_func) {
628631 ERR_FAIL_COND_V (p_id == NS::ObjectLocalId::NONE, NS::NullPHandler);
629632 ERR_FAIL_COND_V (!p_func, NS::NullPHandler);
630633
@@ -651,7 +654,7 @@ void SceneSynchronizerBase::unregister_process(ObjectLocalId p_id, ProcessPhase
651654void SceneSynchronizerBase::set_trickled_sync (
652655 ObjectLocalId p_id,
653656 std::function<void (DataBuffer & /* out_buffer*/ , float /* update_rate*/ )> p_func_trickled_collect,
654- std::function<void (float /* delta*/ , float /* interpolation_alpha*/ , DataBuffer & /* past_buffer*/ , DataBuffer & /* future_buffer*/ )> p_func_trickled_apply) {
657+ std::function<void (double /* delta*/ , float /* interpolation_alpha*/ , DataBuffer & /* past_buffer*/ , DataBuffer & /* future_buffer*/ )> p_func_trickled_apply) {
655658 ERR_FAIL_COND (p_id == ObjectLocalId::NONE);
656659
657660 NS::ObjectData *od = get_object_data (p_id);
@@ -884,7 +887,13 @@ bool SceneSynchronizerBase::is_peer_networking_enabled(int p_peer) const {
884887void SceneSynchronizerBase::on_peer_connected (int p_peer) {
885888 PeerData npd;
886889 auto pd_it = MapFunc::insert_if_new (peer_data, p_peer, std::move (npd));
890+ if (pd_it->second .get_controller ()) {
891+ // Nothing to do, already initialized.
892+ return ;
893+ }
894+
887895 pd_it->second .make_controller (*this , p_peer);
896+ reset_controller (*pd_it->second .get_controller ());
888897
889898 event_peer_status_updated.broadcast (p_peer, true , true );
890899
@@ -1372,7 +1381,7 @@ void SceneSynchronizerBase::process_functions__execute() {
13721381 cached_process_functions_valid = true ;
13731382 }
13741383
1375- SceneSynchronizerDebugger::singleton ()->debug_print (network_interface , " Process functions START" , true );
1384+ SceneSynchronizerDebugger::singleton ()->print (INFO , " Process functions START" );
13761385
13771386 // Pre process phase
13781387 for (int process_phase = PROCESSPHASE_EARLY; process_phase < PROCESSPHASE_PROCESS; ++process_phase) {
@@ -1386,9 +1395,9 @@ void SceneSynchronizerBase::process_functions__execute() {
13861395 const std::string info = " process phase -- CONTROLLER --" ;
13871396 NS_PROFILE_WITH_INFO (info);
13881397
1389- // TODO optimize this, as `is_realtime_enabled ` is expensive.
1398+ // TODO optimize this, as `can_simulate ` is expensive.
13901399 for (auto &pd : peer_data) {
1391- if (pd.second .get_controller () && pd.second .get_controller ()->is_realtime_enabled ()) {
1400+ if (pd.second .get_controller () && pd.second .get_controller ()->can_simulate ()) {
13921401 pd.second .get_controller ()->process (get_fixed_frame_delta ());
13931402 }
13941403 }
@@ -1935,6 +1944,11 @@ void ServerSynchronizer::process_snapshot_notificator() {
19351944 delta_snapshot.begin_write (MD_SIZE);
19361945
19371946 for (int peer_id : group.get_listening_peers ()) {
1947+ if (peer_id == scene_synchronizer->get_network_interface ().fetch_local_peer_id ()) {
1948+ // Never send the snapshot to self (notice `self` is the server).
1949+ continue ;
1950+ }
1951+
19381952 NS::PeerData *peer = MapFunc::get_or_null (scene_synchronizer->peer_data , peer_id);
19391953 if (peer == nullptr ) {
19401954 SceneSynchronizerDebugger::singleton ()->print (ERROR, " The `process_snapshot_notificator` failed to lookup the peer_id `" + std::to_string (peer_id) + " `. Was it removed but never cleared from sync_groups. Report this error, as this is a bug." );
@@ -2243,6 +2257,11 @@ void ServerSynchronizer::process_latency_update() {
22432257 const std::chrono::high_resolution_clock::time_point now = std::chrono::high_resolution_clock::now ();
22442258
22452259 for (auto &[peer, peer_data] : scene_synchronizer->get_peers ()) {
2260+ if (peer == scene_synchronizer->get_network_interface ().fetch_local_peer_id ()) {
2261+ // No need to update the ping for `self` (the server).
2262+ continue ;
2263+ }
2264+
22462265 std::map<int , PeerServerData>::iterator peer_server_data_it = NS::MapFunc::insert_if_new (peers_data, peer, PeerServerData ());
22472266 if (peer_server_data_it->second .latency_calculation_in_progress ) {
22482267 continue ;
@@ -2291,7 +2310,7 @@ void ServerSynchronizer::process_adjust_clients_controller_tick_rate(double p_de
22912310}
22922311
22932312void ServerSynchronizer::process_adjust_client_controller_tick_rate (double p_delta, int p_controller_peer, NetworkedControllerBase &p_controller) {
2294- CRASH_COND (! p_controller.is_server_controller ());
2313+ ASSERT_COND ( p_controller.is_server_controller ());
22952314
22962315 if (!p_controller.get_server_controller_unchecked ()->streaming_paused ) {
22972316 return ;
@@ -2368,7 +2387,7 @@ void ClientSynchronizer::process(double p_delta) {
23682387 process_trickled_sync (p_delta);
23692388
23702389#if DEBUG_ENABLED
2371- if (player_controller) {
2390+ if (player_controller && player_controller-> can_simulate () ) {
23722391 const int client_peer = scene_synchronizer->network_interface ->fetch_local_peer_id ();
23732392 SceneSynchronizerDebugger::singleton ()->write_dump (client_peer, player_controller->get_current_frame_index ().id );
23742393 SceneSynchronizerDebugger::singleton ()->start_new_frame ();
@@ -2447,7 +2466,7 @@ void ClientSynchronizer::signal_end_sync_changed_variables_events() {
24472466}
24482467
24492468void ClientSynchronizer::on_controller_reset (NetworkedControllerBase &p_controller) {
2450- if (player_controller-> is_player_controller ()) {
2469+ if (p_controller. is_player_controller ()) {
24512470 // This can't trigger because the reset function creates the player
24522471 // controller when the following condition is true.
24532472 ASSERT_COND (p_controller.get_authority_peer () == scene_synchronizer->get_network_interface ().fetch_local_peer_id ());
@@ -2461,7 +2480,7 @@ void ClientSynchronizer::on_controller_reset(NetworkedControllerBase &p_controll
24612480}
24622481
24632482const std::vector<ObjectData *> &ClientSynchronizer::get_active_objects () const {
2464- if make_likely (player_controller && enabled) {
2483+ if make_likely (player_controller && player_controller-> can_simulate () && enabled) {
24652484 return active_objects;
24662485 } else {
24672486 // Since there is no player controller or the sync is disabled, this
@@ -2901,7 +2920,7 @@ int ClientSynchronizer::calculates_sub_ticks(const double p_delta) {
29012920void ClientSynchronizer::process_simulation (double p_delta) {
29022921 NS_PROFILE
29032922
2904- if make_unlikely (player_controller == nullptr || enabled == false ) {
2923+ if make_unlikely (player_controller == nullptr || enabled == false || !player_controller-> can_simulate () ) {
29052924 // No player controller so can't process the simulation.
29062925 // TODO Remove this constraint?
29072926
@@ -3434,7 +3453,7 @@ bool ClientSynchronizer::parse_snapshot(DataBuffer &p_snapshot) {
34343453 return false ;
34353454 }
34363455
3437- if make_unlikely (received_snapshot.input_id == FrameIndex::NONE && player_controller != nullptr ) {
3456+ if make_unlikely (received_snapshot.input_id == FrameIndex::NONE && player_controller && player_controller-> can_simulate () ) {
34383457 // We espect that the player_controller is updated by this new snapshot,
34393458 // so make sure it's done so.
34403459 SceneSynchronizerDebugger::singleton ()->print (ERROR, " The player controller (" + std::to_string (player_controller->get_authority_peer ()) + " ) was not part of the received snapshot, this happens when the server destroys the peer controller." );
0 commit comments