fix win64 crashes and enable LARGE_WORLDS

This commit is contained in:
552eden
2026-08-05 12:27:03 +03:00
parent 1cb41e61c1
commit b5c3832e07
5 changed files with 50 additions and 13 deletions
@@ -59,18 +59,16 @@ std::vector<BYTE> NetworkSocketLayer::s_freeSmallIds;
// only goes true on a successful Initialize(), and a failed one gets retried
static bool s_locksCreated = false;
bool g_MultiplayerHost = false;
#if defined __ORBIS__
// Orbis has direct lan networking so it can bypass psn account checks
bool g_MultiplayerJoin = true;
int g_MultiplayerPort = NETWORK_LAN_DEFAULT_PORT;
char g_MultiplayerIP[256] = "";
#else
#if defined _WINDOWS64
bool g_MultiplayerHost = true;
bool g_MultiplayerJoin = false;
int g_MultiplayerPort = NETWORK_LAN_DEFAULT_PORT;
char g_MultiplayerIP[256] = "127.0.0.1";
#else
bool g_MultiplayerHost = false;
bool g_MultiplayerJoin = true;
#endif
int g_MultiplayerPort = NETWORK_LAN_DEFAULT_PORT;
char g_MultiplayerIP[256] = "192.168.0.69";
bool NetworkSocketLayer::Initialize()
{
@@ -1266,6 +1264,38 @@ int NetworkSocketLayer::AdvertiseThreadProc(LPVOID param)
#ifdef __PSVITA__
int sent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0,
(const sockaddr *)&broadcastAddr, sizeof(broadcastAddr));
#elif defined _WINDOWS64
//Broadcast on all interfaces.
INTERFACE_INFO ifaces[32];
DWORD ifaceBytes = 0;
int numIfaces = 0;
int sent = SOCKET_ERROR;
if (WSAIoctl(s_advertiseSock, SIO_GET_INTERFACE_LIST, NULL, 0,
ifaces, sizeof(ifaces), &ifaceBytes, NULL, NULL) != SOCKET_ERROR)
{
numIfaces = (int)(ifaceBytes / sizeof(INTERFACE_INFO));
}
for (int i = 0; i < numIfaces; i++)
{
if (!(ifaces[i].iiFlags & IFF_UP)) continue;
if (ifaces[i].iiFlags & IFF_LOOPBACK) continue;
if (!(ifaces[i].iiFlags & IFF_BROADCAST)) continue;
u_long ifIp = ifaces[i].iiAddress.AddressIn.sin_addr.s_addr;
u_long ifMask = ifaces[i].iiNetmask.AddressIn.sin_addr.s_addr;
broadcastAddr.sin_addr.s_addr = (ifIp & ifMask) | ~ifMask;
int r = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0,
(struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr));
if (r != SOCKET_ERROR) sent = r;
}
if (sent == SOCKET_ERROR)
{
// no interface worked
broadcastAddr.sin_addr.s_addr = INADDR_BROADCAST;
sent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0,
(struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr));
}
#else
int sent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0,
(struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr));