@@ -218,7 +218,7 @@ void PeerNetworkedController::remove_synchronizer() {
218
218
scene_synchronizer = nullptr ;
219
219
}
220
220
221
- NS:: SceneSynchronizerBase *PeerNetworkedController::get_scene_synchronizer () const {
221
+ SceneSynchronizerBase *PeerNetworkedController::get_scene_synchronizer () const {
222
222
return scene_synchronizer;
223
223
}
224
224
@@ -295,7 +295,7 @@ void PeerNetworkedController::encode_inputs(std::deque<FrameInput> &p_frames_inp
295
295
// |-- First byte the amount of times this input is duplicated in the packet.
296
296
// |-- Input buffer.
297
297
298
- const size_t inputs_count = std::min (p_frames_input.size (), static_cast <size_t >(get_max_redundant_inputs () + 1 ));
298
+ const size_t inputs_count = std::min (p_frames_input.size (), std::max ( static_cast <size_t >(1 ), static_cast < size_t >( get_max_redundant_inputs ()) ));
299
299
if make_unlikely (inputs_count <= 0 ) {
300
300
// Nothing to send.
301
301
return ;
@@ -931,9 +931,15 @@ PlayerController::PlayerController(PeerNetworkedController *p_peer_controller) :
931
931
932
932
event_handler_state_validated =
933
933
peer_controller->scene_synchronizer ->event_state_validated .bind (std::bind (&PlayerController::on_state_validated, this , std::placeholders::_1, std::placeholders::_2));
934
+
935
+ event_handler_on_end_process =
936
+ peer_controller->scene_synchronizer ->event_app_process_end .bind (std::bind (&PlayerController::on_app_process_end, this , std::placeholders::_1));
934
937
}
935
938
936
939
PlayerController::~PlayerController () {
940
+ peer_controller->scene_synchronizer ->event_app_process_end .unbind (event_handler_on_end_process);
941
+ event_handler_on_end_process = NS::NullPHandler;
942
+
937
943
peer_controller->scene_synchronizer ->event_rewind_frame_begin .unbind (event_handler_rewind_frame_begin);
938
944
event_handler_rewind_frame_begin = NS::NullPHandler;
939
945
@@ -1104,7 +1110,7 @@ void PlayerController::process(float p_delta) {
1104
1110
1105
1111
// Keep sending inputs, despite the server seems not responding properly,
1106
1112
// to make sure the server becomes up to date at some point.
1107
- send_frame_input_buffer_to_server () ;
1113
+ has_pending_inputs_sent = true ;
1108
1114
}
1109
1115
}
1110
1116
}
@@ -1113,6 +1119,10 @@ void PlayerController::on_state_validated(FrameIndex p_frame_index, bool p_detec
1113
1119
notify_frame_checked (p_frame_index);
1114
1120
}
1115
1121
1122
+ void PlayerController::on_app_process_end (float p_delta_seconds) {
1123
+ send_frame_input_buffer_to_server ();
1124
+ }
1125
+
1116
1126
FrameIndex PlayerController::get_current_frame_index () const {
1117
1127
return current_input_id;
1118
1128
}
@@ -1146,6 +1156,11 @@ void PlayerController::store_input_buffer(FrameIndex p_frame_index) {
1146
1156
}
1147
1157
1148
1158
void PlayerController::send_frame_input_buffer_to_server () {
1159
+ if (!has_pending_inputs_sent) {
1160
+ return ;
1161
+ }
1162
+ has_pending_inputs_sent = false ;
1163
+
1149
1164
peer_controller->encode_inputs (frames_input, cached_packet_data);
1150
1165
1151
1166
peer_controller->scene_synchronizer ->call_rpc_receive_inputs (
0 commit comments