diff --git a/Source/diablo.cpp b/Source/diablo.cpp index cc3f4cf0b..da770ea4d 100644 --- a/Source/diablo.cpp +++ b/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; diff --git a/Source/dvlnet/abstract_net.h b/Source/dvlnet/abstract_net.h index ea9fb8898..52954e1f2 100644 --- a/Source/dvlnet/abstract_net.h +++ b/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) { } diff --git a/Source/dvlnet/base.cpp b/Source/dvlnet/base.cpp index d892b7acc..8edb215bb 100644 --- a/Source/dvlnet/base.cpp +++ b/Source/dvlnet/base.cpp @@ -18,6 +18,14 @@ namespace devilution { namespace net { +void base::process_network_packets() +{ + tl::expected 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]; diff --git a/Source/dvlnet/base.h b/Source/dvlnet/base.h index 200d50dea..46b0ccea4 100644 --- a/Source/dvlnet/base.h +++ b/Source/dvlnet/base.h @@ -34,6 +34,8 @@ public: virtual tl::expected 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; diff --git a/Source/dvlnet/cdwrap.cpp b/Source/dvlnet/cdwrap.cpp index f12492424..e7bc59308 100644 --- a/Source/dvlnet/cdwrap.cpp +++ b/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); diff --git a/Source/dvlnet/cdwrap.h b/Source/dvlnet/cdwrap.h index 597f9506b..d14d40a7c 100644 --- a/Source/dvlnet/cdwrap.h +++ b/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; diff --git a/Source/dvlnet/tcp_client.cpp b/Source/dvlnet/tcp_client.cpp index e583538ca..0e1a18e9b 100644 --- a/Source/dvlnet/tcp_client.cpp +++ b/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(); diff --git a/Source/msg.cpp b/Source/msg.cpp index f5cb1b9fa..cd6c3167b 100644 --- a/Source/msg.cpp +++ b/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(); diff --git a/Source/multi.cpp b/Source/multi.cpp index 63f1746fd..192c36d03 100644 --- a/Source/multi.cpp +++ b/Source/multi.cpp @@ -684,7 +684,7 @@ bool multi_handle_delta() return true; } -void multi_process_network_packets() +void ProcessGameMessagePackets() { ClearPlayerLeftState(); ProcessTmsgs(); diff --git a/Source/multi.h b/Source/multi.h index df3ec90ea..43ebdf3e1 100644 --- a/Source/multi.h +++ b/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); diff --git a/Source/storm/storm_net.cpp b/Source/storm/storm_net.cpp index 8625ba3a2..2f97a5eac 100644 --- a/Source/storm/storm_net.cpp +++ b/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(); diff --git a/Source/storm/storm_net.hpp b/Source/storm/storm_net.hpp index dd91f50cb..4464abf07 100644 --- a/Source/storm/storm_net.hpp +++ b/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 DvlNet_GetGamelist();