Browse Source

Process network packets independent of the game's tick rate

pull/8298/head
staphen 4 months ago committed by Anders Jenbo
parent
commit
9affb1a79b
  1. 3
      Source/diablo.cpp
  2. 4
      Source/dvlnet/abstract_net.h
  3. 14
      Source/dvlnet/base.cpp
  4. 2
      Source/dvlnet/base.h
  5. 5
      Source/dvlnet/cdwrap.cpp
  6. 1
      Source/dvlnet/cdwrap.h
  7. 2
      Source/dvlnet/tcp_client.cpp
  8. 2
      Source/msg.cpp
  9. 2
      Source/multi.cpp
  10. 2
      Source/multi.h
  11. 5
      Source/storm/storm_net.cpp
  12. 1
      Source/storm/storm_net.hpp

3
Source/diablo.cpp

@ -917,6 +917,7 @@ void RunGameLoop(interface_mode uMsg)
if (!runGameLoop) {
if (processInput)
ProcessInput();
DvlNet_ProcessNetworkPackets();
if (!drawGame)
continue;
RedrawViewport();
@ -924,7 +925,7 @@ void RunGameLoop(interface_mode uMsg)
continue;
}
multi_process_network_packets();
ProcessGameMessagePackets();
if (game_loop(gbGameLoopStartup))
diablo_color_cyc_logic();
gbGameLoopStartup = false;

4
Source/dvlnet/abstract_net.h

@ -34,6 +34,10 @@ public:
virtual std::string make_default_gamename() = 0;
virtual void process_network_packets()
{
}
virtual void setup_password(std::string passwd)
{
}

14
Source/dvlnet/base.cpp

@ -18,6 +18,14 @@
namespace devilution {
namespace net {
void base::process_network_packets()
{
tl::expected<void, PacketError> result = poll();
if (!result.has_value()) {
LogVerbose("Error polling network: {}", result.error().what());
}
}
void base::setup_gameinfo(buffer_t info)
{
game_init_info = std::move(info);
@ -233,7 +241,7 @@ bool base::SNetReceiveMessage(uint8_t *sender, void **data, size_t *size)
SendEchoRequest(i);
lastEchoTime = now;
}
poll();
process_network_packets();
if (message_queue.empty())
return false;
message_last = message_queue.front();
@ -292,7 +300,7 @@ bool base::AllTurnsArrived()
bool base::SNetReceiveTurns(char **data, size_t *size, uint32_t *status)
{
poll();
process_network_packets();
for (size_t i = 0; i < Players.size(); ++i) {
status[i] = 0;
@ -528,7 +536,7 @@ plr_t base::GetOwner()
bool base::SNetGetOwnerTurnsWaiting(uint32_t *turns)
{
poll();
process_network_packets();
const plr_t owner = GetOwner();
const PlayerState &playerState = playerStateTable_[owner];

2
Source/dvlnet/base.h

@ -34,6 +34,8 @@ public:
virtual tl::expected<void, PacketError> send(packet &pkt) = 0;
virtual void DisconnectNet(plr_t plr);
void process_network_packets() override;
void setup_gameinfo(buffer_t info) override;
void setup_password(std::string pw) override;

5
Source/dvlnet/cdwrap.cpp

@ -30,6 +30,11 @@ int cdwrap::join(std::string_view addrstr)
return dvlnet_wrap->join(addrstr);
}
void cdwrap::process_network_packets()
{
dvlnet_wrap->process_network_packets();
}
void cdwrap::setup_gameinfo(buffer_t info)
{
game_init_info = std::move(info);

1
Source/dvlnet/cdwrap.h

@ -45,6 +45,7 @@ public:
bool SNetDropPlayer(int playerid, net::leaveinfo_t flags) override;
bool SNetGetOwnerTurnsWaiting(uint32_t *turns) override;
bool SNetGetTurnsInTransit(uint32_t *turns) override;
void process_network_packets() override;
void setup_gameinfo(buffer_t info) override;
std::string make_default_gamename() override;
bool send_info_request() override;

2
Source/dvlnet/tcp_client.cpp

@ -240,7 +240,7 @@ void tcp_client::DisconnectNet(plr_t plr)
bool tcp_client::SNetLeaveGame(net::leaveinfo_t type)
{
auto ret = base::SNetLeaveGame(type);
poll();
process_network_packets();
if (local_server != nullptr)
local_server->Close();
sock.close();

2
Source/msg.cpp

@ -509,7 +509,7 @@ int WaitForTurns()
return 0;
sgbDeltaChunks++;
}
multi_process_network_packets();
ProcessGameMessagePackets();
nthread_send_and_recv_turn(0, 0);
if (nthread_has_500ms_passed()) {
nthread_recv_turns();

2
Source/multi.cpp

@ -684,7 +684,7 @@ bool multi_handle_delta()
return true;
}
void multi_process_network_packets()
void ProcessGameMessagePackets()
{
ClearPlayerLeftState();
ProcessTmsgs();

2
Source/multi.h

@ -81,7 +81,7 @@ void multi_net_ping();
* @return Always true for singleplayer
*/
bool multi_handle_delta();
void multi_process_network_packets();
void ProcessGameMessagePackets();
void multi_send_zero_packet(uint8_t pnum, _cmd_id bCmd, const std::byte *data, size_t size);
void NetClose();
bool NetInit(bool bSinglePlayer);

5
Source/storm/storm_net.cpp

@ -235,6 +235,11 @@ bool SNetSetBasePlayer(int /*unused*/)
return true;
}
void DvlNet_ProcessNetworkPackets()
{
return dvlnet_inst->process_network_packets();
}
bool DvlNet_SendInfoRequest()
{
return dvlnet_inst->send_info_request();

1
Source/storm/storm_net.hpp

@ -139,6 +139,7 @@ bool SNetSetBasePlayer(int);
bool SNetInitializeProvider(uint32_t provider, struct GameData *gameData);
void SNetGetProviderCaps(struct _SNETCAPS *);
void DvlNet_ProcessNetworkPackets();
bool DvlNet_SendInfoRequest();
void DvlNet_ClearGamelist();
std::vector<GameInfo> DvlNet_GetGamelist();

Loading…
Cancel
Save