From ae24f3da80c531492a46044190dda28d93550ee2 Mon Sep 17 00:00:00 2001 From: Belonit <54427022+Belonit@users.noreply.github.com> Date: Wed, 22 Apr 2026 02:17:32 +0300 Subject: [PATCH] fix: port-match logic (closes #65) Co-Authored-By: Kirill Andriiashin <5639388+ZivDero@users.noreply.github.com> --- Private | 2 +- src/Spawner/NetHack.cpp | 4 ++-- src/Spawner/NetHack.h | 2 +- src/Spawner/Spawner.cpp | 17 ++++++++++------- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Private b/Private index d07b5b05..a1553b4d 160000 --- a/Private +++ b/Private @@ -1 +1 @@ -Subproject commit d07b5b05dd6b34347b7bf61361fc8d2cba685b07 +Subproject commit a1553b4dca9bf4b6b710ebc2052b254a6e1e7ffd diff --git a/src/Spawner/NetHack.cpp b/src/Spawner/NetHack.cpp index b6c4a410..0b3c0378 100644 --- a/src/Spawner/NetHack.cpp +++ b/src/Spawner/NetHack.cpp @@ -24,7 +24,7 @@ ListAddress ListAddress::Array[8] = {}; -bool NetHack::PortHack = true; +bool NetHack::RequirePortMatch = false; u_short Tunnel::Id = 0; u_long Tunnel::Ip = 0; @@ -80,7 +80,7 @@ int WINAPI NetHack::RecvFrom( continue; // compare port - if (!NetHack::PortHack && src_addr->sin_port != player.Port) + if (NetHack::RequirePortMatch && src_addr->sin_port != player.Port) continue; // found it, set this index to source addr diff --git a/src/Spawner/NetHack.h b/src/Spawner/NetHack.h index a73f05e4..69ec0c13 100644 --- a/src/Spawner/NetHack.h +++ b/src/Spawner/NetHack.h @@ -27,7 +27,7 @@ struct ListAddress class NetHack { public: - static bool PortHack; + static bool RequirePortMatch; static int WINAPI SendTo( int sockfd, diff --git a/src/Spawner/Spawner.cpp b/src/Spawner/Spawner.cpp index 2cc048db..37bb0dd5 100644 --- a/src/Spawner/Spawner.cpp +++ b/src/Spawner/Spawner.cpp @@ -245,7 +245,7 @@ bool Spawner::StartScenario(const char* pScenarioName) } { // Added Human Players - NetHack::PortHack = true; + NetHack::RequirePortMatch = false; const char maxPlayers = Spawner::Config->IsCampaign ? 1 : (char)std::size(Spawner::Config->Players); for (char playerIndex = 0; playerIndex < maxPlayers; playerIndex++) { @@ -274,14 +274,17 @@ bool Spawner::StartScenario(const char* pScenarioName) if (playerIndex > 0) { + const auto playerPort = static_cast(pPlayer->Port); + const auto listenPort = static_cast(Spawner::Config->ListenPort); + pNode->Address.sin_addr.s_addr = playerIndex; + ListAddress::Array[playerIndex - 1].Ip = inet_addr(pPlayer->Ip); + ListAddress::Array[playerIndex - 1].Port = htons(playerPort); - const auto Ip = inet_addr(pPlayer->Ip); - const auto Port = htons((u_short)pPlayer->Port); - ListAddress::Array[playerIndex - 1].Ip = Ip; - ListAddress::Array[playerIndex - 1].Port = Port; - if (Port != (u_short)Spawner::Config->ListenPort) - NetHack::PortHack = false; + // Accumulate this flag across all players in the loop. + // Do not overwrite it on each iteration. + if (playerPort != listenPort) + NetHack::RequirePortMatch = true; } }