mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-08-08 17:18:53 +00:00
NetPlay: Move host input authority logic to client
This is a prerequisite for golf mode, as the client needs to be in control of sending pad states.
This commit is contained in:
parent
42964e8531
commit
e2f1da5210
7 changed files with 112 additions and 109 deletions
|
@ -527,12 +527,16 @@ void NetPlayServer::AdjustPadBufferSize(unsigned int size)
|
|||
|
||||
m_target_buffer_size = size;
|
||||
|
||||
// tell clients to change buffer size
|
||||
sf::Packet spac;
|
||||
spac << static_cast<MessageId>(NP_MSG_PAD_BUFFER);
|
||||
spac << static_cast<u32>(m_target_buffer_size);
|
||||
// not needed on clients with host input authority
|
||||
if (!m_host_input_authority)
|
||||
{
|
||||
// tell clients to change buffer size
|
||||
sf::Packet spac;
|
||||
spac << static_cast<MessageId>(NP_MSG_PAD_BUFFER);
|
||||
spac << static_cast<u32>(m_target_buffer_size);
|
||||
|
||||
SendAsyncToClients(std::move(spac));
|
||||
SendAsyncToClients(std::move(spac));
|
||||
}
|
||||
}
|
||||
|
||||
void NetPlayServer::SetHostInputAuthority(const bool enable)
|
||||
|
@ -652,7 +656,7 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, Client& player)
|
|||
break;
|
||||
|
||||
sf::Packet spac;
|
||||
spac << static_cast<MessageId>(NP_MSG_PAD_DATA);
|
||||
spac << static_cast<MessageId>(m_host_input_authority ? NP_MSG_PAD_HOST_DATA : NP_MSG_PAD_DATA);
|
||||
|
||||
while (!packet.endOfPacket())
|
||||
{
|
||||
|
@ -670,59 +674,42 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, Client& player)
|
|||
packet >> pad.button >> pad.analogA >> pad.analogB >> pad.stickX >> pad.stickY >>
|
||||
pad.substickX >> pad.substickY >> pad.triggerLeft >> pad.triggerRight >> pad.isConnected;
|
||||
|
||||
if (m_host_input_authority)
|
||||
{
|
||||
m_last_pad_status[map] = pad;
|
||||
|
||||
if (!m_first_pad_status_received[map])
|
||||
{
|
||||
m_first_pad_status_received[map] = true;
|
||||
SendFirstReceivedToHost(map, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
spac << map << pad.button << pad.analogA << pad.analogB << pad.stickX << pad.stickY
|
||||
<< pad.substickX << pad.substickY << pad.triggerLeft << pad.triggerRight
|
||||
<< pad.isConnected;
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_host_input_authority)
|
||||
SendToClients(spac, player.pid);
|
||||
}
|
||||
break;
|
||||
|
||||
case NP_MSG_PAD_HOST_POLL:
|
||||
{
|
||||
PadIndex pad_num;
|
||||
packet >> pad_num;
|
||||
|
||||
sf::Packet spac;
|
||||
spac << static_cast<MessageId>(NP_MSG_PAD_DATA);
|
||||
|
||||
if (pad_num < 0)
|
||||
{
|
||||
for (size_t i = 0; i < m_pad_map.size(); i++)
|
||||
{
|
||||
if (m_pad_map[i] == 0)
|
||||
continue;
|
||||
|
||||
const GCPadStatus& pad = m_last_pad_status[i];
|
||||
spac << static_cast<PadIndex>(i) << pad.button << pad.analogA << pad.analogB << pad.stickX
|
||||
<< pad.stickY << pad.substickX << pad.substickY << pad.triggerLeft << pad.triggerRight
|
||||
<< pad.isConnected;
|
||||
}
|
||||
}
|
||||
else if (m_pad_map.at(pad_num) != 0)
|
||||
{
|
||||
const GCPadStatus& pad = m_last_pad_status[pad_num];
|
||||
spac << pad_num << pad.button << pad.analogA << pad.analogB << pad.stickX << pad.stickY
|
||||
spac << map << pad.button << pad.analogA << pad.analogB << pad.stickX << pad.stickY
|
||||
<< pad.substickX << pad.substickY << pad.triggerLeft << pad.triggerRight
|
||||
<< pad.isConnected;
|
||||
}
|
||||
|
||||
SendToClients(spac);
|
||||
if (m_host_input_authority)
|
||||
Send(m_players.at(1).socket, spac);
|
||||
else
|
||||
SendToClients(spac, player.pid);
|
||||
}
|
||||
break;
|
||||
|
||||
case NP_MSG_PAD_HOST_DATA:
|
||||
{
|
||||
// Kick player if they're not the host.
|
||||
if (!player.IsHost())
|
||||
return 1;
|
||||
|
||||
sf::Packet spac;
|
||||
spac << static_cast<MessageId>(NP_MSG_PAD_DATA);
|
||||
|
||||
while (!packet.endOfPacket())
|
||||
{
|
||||
PadIndex map;
|
||||
packet >> map;
|
||||
|
||||
GCPadStatus pad;
|
||||
packet >> pad.button >> pad.analogA >> pad.analogB >> pad.stickX >> pad.stickY >>
|
||||
pad.substickX >> pad.substickY >> pad.triggerLeft >> pad.triggerRight >> pad.isConnected;
|
||||
|
||||
spac << map << pad.button << pad.analogA << pad.analogB << pad.stickX << pad.stickY
|
||||
<< pad.substickX << pad.substickY << pad.triggerLeft << pad.triggerRight
|
||||
<< pad.isConnected;
|
||||
}
|
||||
|
||||
SendToClients(spac, player.pid);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1141,8 +1128,6 @@ bool NetPlayServer::StartGame()
|
|||
if (!m_host_input_authority)
|
||||
AdjustPadBufferSize(m_target_buffer_size);
|
||||
|
||||
m_first_pad_status_received.fill(false);
|
||||
|
||||
const sf::Uint64 initial_rtc = GetInitialNetPlayRTC();
|
||||
|
||||
const std::string region = SConfig::GetDirectoryForRegion(
|
||||
|
@ -1720,15 +1705,6 @@ bool NetPlayServer::CompressBufferIntoPacket(const std::vector<u8>& in_buffer, s
|
|||
return true;
|
||||
}
|
||||
|
||||
void NetPlayServer::SendFirstReceivedToHost(const PadIndex map, const bool state)
|
||||
{
|
||||
sf::Packet pac;
|
||||
pac << static_cast<MessageId>(NP_MSG_PAD_FIRST_RECEIVED);
|
||||
pac << map;
|
||||
pac << state;
|
||||
Send(m_players.at(1).socket, pac);
|
||||
}
|
||||
|
||||
u64 NetPlayServer::GetInitialNetPlayRTC() const
|
||||
{
|
||||
const auto& config = SConfig::GetInstance();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue