@@ -2128,13 +2128,16 @@ void ServerSynchronizer::generate_snapshot(
21282128 r_snapshot_db.add (false );
21292129 }
21302130
2131+ std::vector<int > frame_index_added_for_peer;
2132+
21312133 if (p_group.is_trickled_node_list_changed () || p_force_full_snapshot) {
21322134 for (int i = 0 ; i < int (p_group.get_trickled_sync_objects ().size ()); ++i) {
21332135 if (p_group.get_trickled_sync_objects ()[i]._unknown || p_force_full_snapshot) {
21342136 generate_snapshot_object_data (
21352137 p_group.get_trickled_sync_objects ()[i].od ,
21362138 SNAPSHOT_GENERATION_MODE_FORCE_NODE_PATH_ONLY,
21372139 NS::SyncGroup::Change (),
2140+ frame_index_added_for_peer,
21382141 r_snapshot_db);
21392142 }
21402143 }
@@ -2151,6 +2154,7 @@ void ServerSynchronizer::generate_snapshot(
21512154 node_data,
21522155 mode,
21532156 relevant_node_data[i].change ,
2157+ frame_index_added_for_peer,
21542158 r_snapshot_db);
21552159 }
21562160 }
@@ -2163,6 +2167,7 @@ void ServerSynchronizer::generate_snapshot_object_data(
21632167 const NS::ObjectData *p_object_data,
21642168 SnapshotGenerationMode p_mode,
21652169 const NS::SyncGroup::Change &p_change,
2170+ std::vector<int > &r_frame_index_added_for_peer,
21662171 DataBuffer &r_snapshot_db) const {
21672172 if (p_object_data->app_object_handle == ObjectHandle::NONE) {
21682173 return ;
@@ -2191,12 +2196,16 @@ void ServerSynchronizer::generate_snapshot_object_data(
21912196 {
21922197 bool frame_input_encoded = false ;
21932198 if (p_object_data->get_controlled_by_peer () > 0 ) {
2194- const PeerNetworkedController *peer_controller = scene_synchronizer->get_controller_for_peer (p_object_data->get_controlled_by_peer ());
2195- if (peer_controller) {
2196- // Has controller FrameInput
2197- r_snapshot_db.add (true );
2198- r_snapshot_db.add (peer_controller->get_current_frame_index ().id );
2199- frame_input_encoded = true ;
2199+ if (!VecFunc::has (r_frame_index_added_for_peer, p_object_data->get_controlled_by_peer ())) {
2200+ // The FrameIndex was not added yet to this snapshot, so add it now.
2201+ const PeerNetworkedController *peer_controller = scene_synchronizer->get_controller_for_peer (p_object_data->get_controlled_by_peer ());
2202+ if (peer_controller) {
2203+ // Has controller FrameInput
2204+ r_snapshot_db.add (true );
2205+ r_snapshot_db.add (peer_controller->get_current_frame_index ().id );
2206+ r_frame_index_added_for_peer.push_back (p_object_data->get_controlled_by_peer ());
2207+ frame_input_encoded = true ;
2208+ }
22002209 }
22012210 }
22022211
@@ -3158,7 +3167,7 @@ bool ClientSynchronizer::parse_sync_data(
31583167 }
31593168
31603169 {
3161- // Fetch latencys
3170+ // Fetch latency
31623171 while (true ) {
31633172 bool has_next_latency = false ;
31643173 p_snapshot.read (has_next_latency);
0 commit comments