Skip to content
This repository was archived by the owner on Jan 5, 2024. It is now read-only.

Commit 5a39f69

Browse files
committed
move multiplayer input handling to server to avoid framerate mismatch
1 parent 96d9710 commit 5a39f69

File tree

1 file changed

+48
-21
lines changed

1 file changed

+48
-21
lines changed

Managers/UInputMan.cpp

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
#include "SDL.h"
1515

16+
#include "imgui/imgui.h"
17+
1618
namespace RTE {
1719

1820
std::array<uint8_t, SDL_NUM_SCANCODES> UInputMan::s_PrevKeyStates;
@@ -67,10 +69,11 @@ namespace RTE {
6769

6870
for (int inputState = InputState::Held; inputState < InputState::InputStateCount; inputState++) {
6971
for (int element = InputElements::INPUT_L_UP; element < InputElements::INPUT_COUNT; element++) {
70-
m_NetworkInputElementState[player][element][inputState] = false;
72+
m_NetworkServerChangedInputElementState[player][element] = false;
73+
m_NetworkServerPreviousInputElementState[player][element] = false;
7174
}
7275
for (int mouseButton = MouseButtons::MOUSE_LEFT; mouseButton < MouseButtons::MAX_MOUSE_BUTTONS; mouseButton++) {
73-
m_NetworkMouseButtonState[player][mouseButton][inputState] = false;
76+
m_NetworkServerChangedMouseButtonState[player][mouseButton] = false;
7477
}
7578
}
7679
m_NetworkAccumulatedRawMouseMovement[player].Reset();
@@ -570,7 +573,7 @@ namespace RTE {
570573

571574
bool UInputMan::GetInputElementState(int whichPlayer, int whichElement, InputState whichState) {
572575
if (IsInMultiplayerMode() && whichPlayer >= Players::PlayerOne && whichPlayer < Players::MaxPlayerCount) {
573-
return m_TrapMousePosPerPlayer[whichPlayer] ? m_NetworkInputElementState[whichPlayer][whichElement][whichState] : false;
576+
return GetNetworkInputElementState(whichPlayer, whichElement, whichState);
574577
}
575578
bool elementState = false;
576579
InputDevice device = m_ControlScheme.at(whichPlayer).GetDevice();
@@ -589,6 +592,22 @@ namespace RTE {
589592
return elementState;
590593
}
591594

595+
bool UInputMan::GetNetworkInputElementState(int whichPlayer, int whichElement, InputState whichState) {
596+
if (!m_TrapMousePosPerPlayer[whichPlayer] || whichPlayer < Players::PlayerOne || whichPlayer >= Players::MaxPlayerCount || whichState < 0 || whichState > InputState::InputStateCount) {
597+
return false;
598+
}
599+
switch (whichState) {
600+
case InputState::Held:
601+
return m_NetworkServerPreviousInputElementState[whichPlayer][whichElement];
602+
case InputState::Pressed:
603+
return m_NetworkServerPreviousInputElementState[whichPlayer][whichElement] && m_NetworkServerChangedInputElementState[whichPlayer][whichElement];
604+
case InputState::Released:
605+
return (!m_NetworkServerPreviousInputElementState[whichPlayer][whichElement]) && m_NetworkServerChangedInputElementState[whichPlayer][whichElement];
606+
default:
607+
return false;
608+
}
609+
}
610+
592611
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
593612

594613
bool UInputMan::GetMenuButtonState(int whichButton, InputState whichState) {
@@ -637,13 +656,13 @@ namespace RTE {
637656
if (IsInMultiplayerMode()) {
638657
if (whichPlayer < Players::PlayerOne || whichPlayer >= Players::MaxPlayerCount) {
639658
for (int player = Players::PlayerOne; player < Players::MaxPlayerCount; player++) {
640-
if (m_NetworkMouseButtonState[player][whichButton][whichState]) {
641-
return m_NetworkMouseButtonState[player][whichButton][whichState];
659+
if (m_NetworkServerChangedMouseButtonState[player][whichButton]) {
660+
return m_NetworkServerChangedMouseButtonState[player][whichButton];
642661
}
643662
}
644-
return m_NetworkMouseButtonState[Players::PlayerOne][whichButton][whichState];
663+
return m_NetworkServerChangedMouseButtonState[Players::PlayerOne][whichButton];
645664
} else {
646-
return m_NetworkMouseButtonState[whichPlayer][whichButton][whichState];
665+
return m_NetworkServerChangedMouseButtonState[whichPlayer][whichButton];
647666
}
648667
}
649668

@@ -739,6 +758,11 @@ namespace RTE {
739758
std::fill(gamepad.m_Axis.begin(), gamepad.m_Axis.end(), 0);
740759
std::fill(gamepad.m_DigitalAxis.begin(), gamepad.m_DigitalAxis.end(), 0);
741760
}
761+
762+
if (IsInMultiplayerMode()) {
763+
ClearNetworkChangedState();
764+
}
765+
742766
m_TextInput.clear();
743767
m_MouseWheelChange = 0;
744768
m_RawMouseMovement.Reset();
@@ -789,7 +813,7 @@ namespace RTE {
789813
s_CurrentMouseButtonStates[inputEvent.button.button] = static_cast<bool>(inputEvent.button.state);
790814
break;
791815
case SDL_MOUSEWHEEL:
792-
m_MouseWheelChange = inputEvent.wheel.direction == SDL_MOUSEWHEEL_NORMAL ? inputEvent.wheel.y : -inputEvent.wheel.y;
816+
m_MouseWheelChange += inputEvent.wheel.direction == SDL_MOUSEWHEEL_NORMAL ? inputEvent.wheel.y : -inputEvent.wheel.y;
793817
break;
794818
case SDL_CONTROLLERAXISMOTION:
795819
case SDL_JOYAXISMOTION:
@@ -1168,33 +1192,36 @@ namespace RTE {
11681192
}
11691193
m_NetworkAccumulatedRawMouseMovement[player].Reset();
11701194

1171-
// Clear mouse events and inputs as they should've been already processed during by recipients.
1172-
// This is important so mouse readings are correct, e.g. to ensure events don't trigger multiple times on a single press.
1173-
for (int inputState = InputState::Pressed; inputState < InputState::InputStateCount; inputState++) {
1174-
for (int element = InputElements::INPUT_L_UP; element < InputElements::INPUT_COUNT; element++) {
1175-
m_NetworkInputElementState[player][element][inputState] = false;
1176-
}
1177-
for (int mouseButton = MouseButtons::MOUSE_LEFT; mouseButton < MouseButtons::MAX_MOUSE_BUTTONS; mouseButton++) {
1178-
m_NetworkMouseButtonState[player][mouseButton][inputState] = false;
1179-
}
1180-
}
11811195

11821196
// Reset mouse wheel state to stop over-wheeling
11831197
m_NetworkMouseWheelState[player] = 0;
11841198
}
11851199
}
11861200

1201+
void UInputMan::ClearNetworkChangedState() {
1202+
for (int player = Players::PlayerOne; player < Players::MaxPlayerCount; ++player) {
1203+
for (int element = InputElements::INPUT_L_UP; element < InputElements::INPUT_COUNT; element++) {
1204+
m_NetworkServerChangedInputElementState[player][element] = false;
1205+
}
1206+
for (int mouseButton = MouseButtons::MOUSE_LEFT; mouseButton < MouseButtons::MAX_MOUSE_BUTTONS; mouseButton++) {
1207+
m_NetworkServerChangedMouseButtonState[player][mouseButton] = false;
1208+
}
1209+
m_NetworkMouseWheelState[player] = 0;
1210+
}
1211+
}
11871212
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1188-
void UInputMan::SetNetworkInputElementState(int player, int element, InputState whichState, bool newState) {
1213+
void UInputMan::SetNetworkInputElementState(int player, int element, bool newState) {
11891214
if (element >= InputElements::INPUT_L_UP && element < InputElements::INPUT_COUNT && player >= Players::PlayerOne && player < Players::MaxPlayerCount) {
1190-
m_NetworkInputElementState[player][element][whichState] |= newState;
1215+
m_NetworkServerChangedInputElementState[player][element] = (newState != m_NetworkServerPreviousInputElementState[player][element]);
1216+
m_NetworkServerPreviousInputElementState[player][element] = newState;
11911217
}
11921218
}
11931219

11941220
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
11951221
void UInputMan::SetNetworkMouseButtonState(int player, int whichButton, InputState whichState, bool newState) {
11961222
if (whichButton >= MouseButtons::MOUSE_LEFT && whichButton < MouseButtons::MAX_MOUSE_BUTTONS && player >= Players::PlayerOne && player < Players::MaxPlayerCount) {
1197-
m_NetworkMouseButtonState[player][whichButton][whichState] |= newState;
1223+
m_NetworkServerChangedMouseButtonState[player][whichButton] = (newState != m_NetworkServerPreviousMouseButtonState[player][whichButton]);
1224+
m_NetworkServerPreviousMouseButtonState[player][whichButton] = newState;
11981225
}
11991226
}
12001227

0 commit comments

Comments
 (0)