From 930a104e503fdfa65221f38074c7936d9ac1e794 Mon Sep 17 00:00:00 2001 From: NaN Date: Mon, 3 Aug 2026 16:53:58 -0400 Subject: [PATCH 1/8] feat: add PS4 networking support --- .../Common/Network/NetworkSocketLayer.cpp | 87 +++++++++++++++++-- .../Common/UI/UIScene_JoinMenu.cpp | 58 +++++++++---- .../Common/UI/UIScene_LoadOrJoinMenu.cpp | 23 +++-- .../Common/UI/UIScene_MainMenu.cpp | 18 +++- Minecraft.Client/Minecraft.Client.vcxproj | 5 +- .../Orbis/OrbisExtras/OrbisStubs.cpp | 27 +++--- Minecraft.World/Minecraft.World.vcxproj | 2 +- 7 files changed, 174 insertions(+), 46 deletions(-) diff --git a/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp index 22900158..abee0fd9 100644 --- a/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp +++ b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp @@ -16,9 +16,11 @@ SOCKET NetworkSocketLayer::s_advertiseSock = -1; SOCKET NetworkSocketLayer::s_discoverySock = -1; #if defined __PS3__ +#define LCE_NET_ERRNO sys_net_errno int closesocket(int s) { return socketclose(s); }; void terminate_networking() { cellNetCtlTerm(); sys_net_finalize_network(); }; #elif defined __ORBIS__ +#define LCE_NET_ERRNO errno int closesocket(int s) { return sceNetSocketClose(s); }; int socketclose(int s) { return sceNetSocketClose(s); }; void terminate_networking() {}; @@ -60,10 +62,52 @@ std::vector NetworkSocketLayer::s_disconnectedSmallIds; CRITICAL_SECTION NetworkSocketLayer::s_freeSmallIdLock; std::vector NetworkSocketLayer::s_freeSmallIds; -bool g_MultiplayerHost = false; -bool g_MultiplayerJoin = true; -int g_MultiplayerPort = NETWORK_LAN_DEFAULT_PORT; -char g_MultiplayerIP[256] = "127.0.0.1"; +bool g_Win64MultiplayerHost = false; +#if defined __ORBIS__ +// Orbis has direct lan networking so it can bypass psn account checks +bool g_Win64MultiplayerJoin = true; +int g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; +char g_Win64MultiplayerIP[256] = ""; +#else +bool g_Win64MultiplayerJoin = false; +int g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; +char g_Win64MultiplayerIP[256] = "127.0.0.1"; +#endif + +#ifdef _WINDOWS64 +static int GetLocalIPv4Interfaces(SOCKET socketHandle, struct in_addr *localAddresses, + struct in_addr *broadcastAddresses, int capacity) +{ + INTERFACE_INFO interfaceList[32]; + DWORD bytesReturned = 0; + if(WSAIoctl(socketHandle, SIO_GET_INTERFACE_LIST, NULL, 0, interfaceList, + sizeof(interfaceList), &bytesReturned, NULL, NULL) == SOCKET_ERROR) + { + return 0; + } + + int interfaceCount = (int)(bytesReturned / sizeof(INTERFACE_INFO)); + int resultCount = 0; + for(int i = 0; i < interfaceCount && resultCount < capacity; ++i) + { + struct sockaddr_in *address = (struct sockaddr_in *)&interfaceList[i].iiAddress; + struct sockaddr_in *netmask = (struct sockaddr_in *)&interfaceList[i].iiNetmask; + if(address->sin_family != AF_INET) + continue; + + unsigned long hostAddress = ntohl(address->sin_addr.s_addr); + unsigned long hostNetmask = ntohl(netmask->sin_addr.s_addr); + if(hostAddress == 0 || (hostAddress & 0xff000000) == 0x7f000000 || hostNetmask == 0) + continue; + + localAddresses[resultCount] = address->sin_addr; + broadcastAddresses[resultCount].s_addr = htonl(hostAddress | ~hostNetmask); + ++resultCount; + } + + return resultCount; +} +#endif bool NetworkSocketLayer::Initialize() { @@ -555,6 +599,9 @@ bool NetworkSocketLayer::JoinGame(const char *ip, int port) struct sockaddr_in addr = {}; +#if defined(__ORBIS__) + addr.sin_len = sizeof(addr); +#endif addr.sin_family = AF_INET; addr.sin_port = htons((uint16_t)port); @@ -597,15 +644,16 @@ bool NetworkSocketLayer::JoinGame(const char *ip, int port) #endif iResult = connect(s_hostConnectionSocket, (struct sockaddr*)&addr, sizeof(addr)); + int connectError = iResult < 0 ? LCE_NET_ERRNO : 0; if (iResult < 0) { #if defined(__PS3__) - int err = sys_net_errno; + int err = connectError; if (err == SYS_NET_EINPROGRESS) { #elif defined(__ORBIS__) - int err = sce_net_errno; - if (err == SCE_NET_EINPROGRESS) + int err = connectError; + if (err == EINPROGRESS) { #endif fd_set writeFds, exceptFds; @@ -1205,8 +1253,31 @@ int NetworkSocketLayer::AdvertiseThreadProc(LPVOID param) data.gameHostSettings = htonl(data.gameHostSettings); data.texturePackParentId = htonl(data.texturePackParentId); - int sent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0, + int sent = -1; + +#ifdef _WINDOWS64 + struct in_addr localAddresses[32]; + struct in_addr broadcastAddresses[32]; + int interfaceCount = GetLocalIPv4Interfaces(s_advertiseSock, localAddresses, broadcastAddresses, 32); + for(int i = 0; i < interfaceCount; ++i) + { + broadcastAddr.sin_addr = broadcastAddresses[i]; + int interfaceSent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0, + (struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr)); + if(interfaceSent != SOCKET_ERROR) + sent = interfaceSent; + } + + if(interfaceCount == 0) + { + broadcastAddr.sin_addr.s_addr = INADDR_BROADCAST; + sent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0, + (struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr)); + } +#else + sent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0, (struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr)); +#endif #if defined _WINDOWS64 || defined _XBOX if (sent == SOCKET_ERROR && s_advertising) diff --git a/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp index 86b3806b..7d19b290 100644 --- a/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp @@ -7,6 +7,7 @@ #include "..\..\MinecraftServer.h" #include "..\..\..\Minecraft.World\net.minecraft.world.level.h" #include "..\..\..\Minecraft.World\net.minecraft.world.h" +#include "..\..\Common\Network\WinsockNetLayer.h" #define UPDATE_PLAYERS_TIMER_ID 0 #define UPDATE_PLAYERS_TIMER_TIME 30000 @@ -50,7 +51,6 @@ void UIScene_JoinMenu::tick() g_NetworkManager.GetFullFriendSessionInfo(m_selectedSession, &friendSessionUpdated, this); m_friendInfoRequestIssued = true; } - if( m_friendInfoUpdatedOK ) { m_friendInfoUpdatedOK = false; @@ -368,6 +368,12 @@ void UIScene_JoinMenu::checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, void UIScene_JoinMenu::StartSharedLaunchFlow() { + const bool bManualJoin = (g_Win64MultiplayerJoin == true); + if (bManualJoin) + { + JoinGame(this); + return; + } #if defined DISABLE_PSN JoinGame(this); #else @@ -421,6 +427,12 @@ int UIScene_JoinMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int // Shared function to join the game that is the same whether we used the sign-in UI or not void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) { + if (pClass == NULL) + { + return; + } + const bool bManualJoin = (g_Win64MultiplayerJoin == true); + DWORD dwSignedInUsers = 0; bool noPrivileges = false; DWORD dwLocalUsersMask = 0; @@ -428,10 +440,14 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) int iPadNotSignedInLive = -1; ProfileManager.SetLockedProfile(0); // TEMP! + if (bManualJoin) + { + isSignedInLive = true; + } // If we're in SD mode, then only the primary player gets to play if (app.IsLocalMultiplayerAvailable()) - { + { for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) { if(ProfileManager.IsSignedIn(index)) @@ -442,7 +458,7 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) iPadNotSignedInLive = index; } - if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + if( !bManualJoin && !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(index); isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(index); } @@ -452,7 +468,7 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) { if(ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) { - if( !ProfileManager.AllowedToPlayMultiplayer(ProfileManager.GetPrimaryPad()) ) noPrivileges = true; + if( !bManualJoin && !ProfileManager.AllowedToPlayMultiplayer(ProfileManager.GetPrimaryPad()) ) noPrivileges = true; dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(ProfileManager.GetPrimaryPad()); #ifndef DISABLE_PSN @@ -467,7 +483,7 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) } // If this is an online game but not all players are signed in to Live, stop! - if (!isSignedInLive) + if (!bManualJoin && !isSignedInLive) { #ifdef __ORBIS__ // Check if PSN is unavailable because of age restriction @@ -497,14 +513,22 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) BOOL pccFriendsAllowed = TRUE; #if !defined(DISABLE_PSN) && (defined(__PS3__) || defined(__PSVITA__)) - if(isSignedInLive) + if(!bManualJoin && isSignedInLive) { ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&noUGC,NULL,NULL); } #else - ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); - if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + if(!bManualJoin) + { + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + } #endif + if (bManualJoin) + { + noUGC = false; + noPrivileges = false; + } #ifdef __PSVITA__ @@ -534,13 +558,16 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } else - { -#if defined(__ORBIS__) || defined(__PSVITA__) - bool chatRestricted = false; - ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); - if(chatRestricted) { - ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); +#if defined(__ORBIS__) || defined(__PSVITA__) + if(!bManualJoin) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } } #endif CGameNetworkManager::eJoinGameResult result = g_NetworkManager.JoinGame( pClass->m_selectedSession, dwLocalUsersMask ); @@ -550,6 +577,7 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) if( result != CGameNetworkManager::JOINGAME_SUCCESS ) { + pClass->m_bIgnoreInput = false; int exitReasonStringId = -1; switch(result) { @@ -643,4 +671,4 @@ void UIScene_JoinMenu::handleTimerComplete(int id) } break; }; -} \ No newline at end of file +} diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp index 39bba779..f977ff91 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp @@ -14,6 +14,7 @@ #include "..\..\TexturePackRepository.h" #include "..\..\TexturePack.h" #include "..\Network\SessionInfo.h" +#include "..\..\Common\Network\WinsockNetLayer.h" #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) #include "Common\Network\Sony\SonyHttp.h" #include "Common\Network\Sony\SonyRemoteStorage.h" @@ -1385,20 +1386,24 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) if( m_buttonListGames.getItemCount() > 0 && gameIndex < m_currentSessions->size() ) { #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + const bool bManualJoin = (g_Win64MultiplayerJoin == true); // 4J-PB - is the player allowed to join games? bool noUGC=false; bool bContentRestricted=false; - // we're online, since we are joining a game - ProfileManager.GetChatAndContentRestrictions(m_iPad,true,&noUGC,&bContentRestricted,NULL); + // A direct LAN join should probnot use PSN matchmaking or account privileges (nansess) + if(!bManualJoin) + { + ProfileManager.GetChatAndContentRestrictions(m_iPad,true,&noUGC,&bContentRestricted,NULL); + } #ifdef __ORBIS__ // 4J Stu - On PS4 we don't restrict playing multiplayer based on chat restriction, so remove this check noUGC = false; bool bPlayStationPlus=true; - int iPadWithNoPlaystationPlus=0; - bool isSignedInLive = true; + int iPadWithNoPlaystationPlus=-1; + bool isSignedInLive = true; int iPadNotSignedInLive = -1; for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { @@ -1414,6 +1419,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) if(ProfileManager.HasPlayStationPlus(i)==false) { bPlayStationPlus=false; + iPadWithNoPlaystationPlus = (int)i; break; } } @@ -1427,7 +1433,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) } #endif - if(noUGC) + if(!bManualJoin && noUGC) { // not allowed to join #ifndef __PSVITA__ @@ -1443,7 +1449,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) m_bIgnoreInput=false; return; } - else if(bContentRestricted) + else if(!bManualJoin && bContentRestricted) { ui.RequestContentRestrictedMessageBox(); @@ -1452,7 +1458,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) } #ifdef __ORBIS__ // If this is an online game but not all players are signed in to Live, stop! - else if (!isSignedInLive) + else if (!bManualJoin && !isSignedInLive) { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; @@ -1471,7 +1477,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) } return; } - else if(bPlayStationPlus==false) + else if(!bManualJoin && bPlayStationPlus==false) { if(ProfileManager.RequestingPlaystationPlus(iPadWithNoPlaystationPlus)) @@ -1480,6 +1486,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) UINT uiIDA[1]; uiIDA[0]=IDS_OK; ui.RequestAlertMessage(IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL); + m_bIgnoreInput=false; return; } diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp index c9251291..8de760b5 100644 --- a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp @@ -8,6 +8,7 @@ #include "UIScene_MainMenu.h" #ifdef __ORBIS__ #include +#include "..\..\Common\Network\WinsockNetLayer.h" #endif Random *UIScene_MainMenu::random = new Random(); @@ -318,7 +319,16 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) //CD - Added for audio ui.PlayUISFX(eSFX_Press); - ProfileManager.RefreshChatAndContentRestrictions(RefreshChatAndContentRestrictionsReturned_PlayGame, this); + if(g_Win64MultiplayerJoin) + { + // request only completes after the platform network timeout. + // this needs to be done before hand or else the PS4 crashes ill need to look more into this + CreateLoad_SignInReturned(this, true, primaryPad); + } + else + { + ProfileManager.RefreshChatAndContentRestrictions(RefreshChatAndContentRestrictionsReturned_PlayGame, this); + } } #else m_eAction=eAction_RunGame; @@ -1098,6 +1108,12 @@ void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_PlayGame(void * int primaryPad = ProfileManager.GetPrimaryPad(); UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; + const bool bManualJoin = (g_Win64MultiplayerJoin == true); + if (bManualJoin) + { + CreateLoad_SignInReturned(pClass, true, primaryPad); + return; + } int (*signInReturnedFunc) (LPVOID,const bool, const int iPad) = NULL; diff --git a/Minecraft.Client/Minecraft.Client.vcxproj b/Minecraft.Client/Minecraft.Client.vcxproj index 50472670..0124434b 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -1015,7 +1015,8 @@ xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CUfalse $(OutDir)$(ProjectName).pch MultiThreaded - _FINAL_BUILD;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + + _LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_FINAL_BUILD;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) Disabled Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) true @@ -36126,4 +36127,4 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU - \ No newline at end of file + diff --git a/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp b/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp index 1cc40be5..37924651 100644 --- a/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp +++ b/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp @@ -619,7 +619,6 @@ DWORD GetFileAttributesA(LPCSTR lpFileName) SceFiosStat statData; if(sceFiosStatSync(NULL, filePath, &statData) != SCE_FIOS_OK) { - app.DebugPrintf("*** sceFiosStatSync Failed\n"); return -1; } if(statData.statFlags & SCE_FIOS_STATUS_DIRECTORY ) @@ -671,19 +670,25 @@ BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) #ifndef _FINAL_BUILD -VOID OutputDebugStringW(LPCWSTR lpOutputString) -{ - wprintf(lpOutputString); +VOID OutputDebugStringW(LPCWSTR lpOutputString) +{ + if (lpOutputString != NULL) + wprintf(L"%ls", lpOutputString); + fflush(stdout); } -VOID OutputDebugStringA(LPCSTR lpOutputString) -{ - printf(lpOutputString); +VOID OutputDebugStringA(LPCSTR lpOutputString) +{ + if (lpOutputString != NULL) + printf("%s", lpOutputString); + fflush(stdout); } -VOID OutputDebugString(LPCSTR lpOutputString) -{ - printf(lpOutputString); +VOID OutputDebugString(LPCSTR lpOutputString) +{ + if (lpOutputString != NULL) + printf("%s", lpOutputString); + fflush(stdout); } #endif // _CONTENT_PACKAGE @@ -787,4 +792,4 @@ DWORD XGetLocale() DWORD XEnableGuestSignin(BOOL fEnable) { return 0; -} \ No newline at end of file +} diff --git a/Minecraft.World/Minecraft.World.vcxproj b/Minecraft.World/Minecraft.World.vcxproj index f9105bc4..4d02015f 100644 --- a/Minecraft.World/Minecraft.World.vcxproj +++ b/Minecraft.World/Minecraft.World.vcxproj @@ -858,7 +858,7 @@ false $(OutDir)$(ProjectName).pch MultiThreaded - _FINAL_BUILD;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + _LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_FINAL_BUILD;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) Disabled true false -- 2.54.0 From 05e8ed3c669b32e9ffce3e52c07e74f402c342d7 Mon Sep 17 00:00:00 2001 From: NaN Date: Mon, 3 Aug 2026 19:14:56 -0400 Subject: [PATCH 2/8] update nework refrence --- .../Common/Network/NetworkSocketLayer.cpp | 14 +++++++------- Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp | 6 +++--- .../Common/UI/UIScene_LoadOrJoinMenu.cpp | 4 ++-- Minecraft.Client/Common/UI/UIScene_MainMenu.cpp | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp index abee0fd9..8136a657 100644 --- a/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp +++ b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp @@ -62,16 +62,16 @@ std::vector NetworkSocketLayer::s_disconnectedSmallIds; CRITICAL_SECTION NetworkSocketLayer::s_freeSmallIdLock; std::vector NetworkSocketLayer::s_freeSmallIds; -bool g_Win64MultiplayerHost = false; +bool g_MultiplayerHost = false; #if defined __ORBIS__ // Orbis has direct lan networking so it can bypass psn account checks -bool g_Win64MultiplayerJoin = true; -int g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; -char g_Win64MultiplayerIP[256] = ""; +bool g_MultiplayerJoin = true; +int g_MultiplayerPort = NETWORK_LAN_DEFAULT_PORT; +char g_MultiplayerIP[256] = ""; #else -bool g_Win64MultiplayerJoin = false; -int g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; -char g_Win64MultiplayerIP[256] = "127.0.0.1"; +bool g_MultiplayerJoin = false; +int g_MultiplayerPort = NETWORK_LAN_DEFAULT_PORT; +char g_MultiplayerIP[256] = "127.0.0.1"; #endif #ifdef _WINDOWS64 diff --git a/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp index 7d19b290..14654173 100644 --- a/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp @@ -7,7 +7,7 @@ #include "..\..\MinecraftServer.h" #include "..\..\..\Minecraft.World\net.minecraft.world.level.h" #include "..\..\..\Minecraft.World\net.minecraft.world.h" -#include "..\..\Common\Network\WinsockNetLayer.h" +#include "..\..\Common\Network\NetworkSocketLayer.h" #define UPDATE_PLAYERS_TIMER_ID 0 #define UPDATE_PLAYERS_TIMER_TIME 30000 @@ -368,7 +368,7 @@ void UIScene_JoinMenu::checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, void UIScene_JoinMenu::StartSharedLaunchFlow() { - const bool bManualJoin = (g_Win64MultiplayerJoin == true); + const bool bManualJoin = (g_MultiplayerJoin == true); if (bManualJoin) { JoinGame(this); @@ -431,7 +431,7 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) { return; } - const bool bManualJoin = (g_Win64MultiplayerJoin == true); + const bool bManualJoin = (g_MultiplayerJoin == true); DWORD dwSignedInUsers = 0; bool noPrivileges = false; diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp index f977ff91..cc7b74e0 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp @@ -14,7 +14,7 @@ #include "..\..\TexturePackRepository.h" #include "..\..\TexturePack.h" #include "..\Network\SessionInfo.h" -#include "..\..\Common\Network\WinsockNetLayer.h" +#include "..\..\Common\Network\NetworkSocketLayer.h" #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) #include "Common\Network\Sony\SonyHttp.h" #include "Common\Network\Sony\SonyRemoteStorage.h" @@ -1386,7 +1386,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) if( m_buttonListGames.getItemCount() > 0 && gameIndex < m_currentSessions->size() ) { #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) - const bool bManualJoin = (g_Win64MultiplayerJoin == true); + const bool bManualJoin = (g_MultiplayerJoin == true); // 4J-PB - is the player allowed to join games? bool noUGC=false; bool bContentRestricted=false; diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp index 8de760b5..d3508ef5 100644 --- a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp @@ -8,7 +8,7 @@ #include "UIScene_MainMenu.h" #ifdef __ORBIS__ #include -#include "..\..\Common\Network\WinsockNetLayer.h" +#include "..\..\Common\Network\NetworkSocketLayer.h" #endif Random *UIScene_MainMenu::random = new Random(); @@ -319,7 +319,7 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) //CD - Added for audio ui.PlayUISFX(eSFX_Press); - if(g_Win64MultiplayerJoin) + if(g_MultiplayerJoin) { // request only completes after the platform network timeout. // this needs to be done before hand or else the PS4 crashes ill need to look more into this @@ -1108,7 +1108,7 @@ void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_PlayGame(void * int primaryPad = ProfileManager.GetPrimaryPad(); UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; - const bool bManualJoin = (g_Win64MultiplayerJoin == true); + const bool bManualJoin = (g_MultiplayerJoin == true); if (bManualJoin) { CreateLoad_SignInReturned(pClass, true, primaryPad); -- 2.54.0 From ada85f871ec5f4a5c265e0576f548218eeca0992 Mon Sep 17 00:00:00 2001 From: NaN Date: Mon, 3 Aug 2026 23:09:17 -0400 Subject: [PATCH 3/8] fix ps4 crashing when creating single player game --- Minecraft.World/Minecraft.World.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Minecraft.World/Minecraft.World.vcxproj b/Minecraft.World/Minecraft.World.vcxproj index 4d02015f..534f32bf 100644 --- a/Minecraft.World/Minecraft.World.vcxproj +++ b/Minecraft.World/Minecraft.World.vcxproj @@ -1446,7 +1446,7 @@ true true Level2 - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;DEBUG_MENUS_ENABLED + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED -- 2.54.0 From d06e2e5eba356f53d783465067d4f93401118e73 Mon Sep 17 00:00:00 2001 From: NaN Date: Tue, 4 Aug 2026 01:31:46 -0400 Subject: [PATCH 4/8] ps4 support final --- .../Common/Network/NetworkSocketLayer.cpp | 103 +++++++++++++++++- .../Common/Network/PlatformNetworkManager.cpp | 4 +- Minecraft.Client/Orbis/Orbis_Minecraft.cpp | 7 +- 3 files changed, 104 insertions(+), 10 deletions(-) diff --git a/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp index 8136a657..9b29f088 100644 --- a/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp +++ b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp @@ -3,6 +3,11 @@ #include "NetworkSocketLayer.h" #include "..\..\Common\Network\PlatformNetworkManager.h" #include "..\..\..\Minecraft.World\Socket.h" +#ifdef __ORBIS__ +#include +#endif + +static const DWORD NETWORK_LAN_DISCOVERY_QUERY_MAGIC = 0x4D435152; #if defined _WINDOWS64 || defined _XBOX SOCKET NetworkSocketLayer::s_listenSocket = INVALID_SOCKET; @@ -1290,7 +1295,6 @@ int NetworkSocketLayer::AdvertiseThreadProc(LPVOID param) app.DebugPrintf("PS3 LAN: Broadcast sendto failed: %d\n", sent); } #endif - C4JThread::Sleep(1000); } @@ -1299,8 +1303,14 @@ int NetworkSocketLayer::AdvertiseThreadProc(LPVOID param) bool NetworkSocketLayer::StartDiscovery() { - if (s_discovering) return true; - if (!s_initialized) return false; + if (s_discovering) + { + return true; + } + if (!s_initialized) + { + return false; + } s_discoverySock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); #if defined _WINDOWS64 || defined _XBOX @@ -1321,6 +1331,8 @@ bool NetworkSocketLayer::StartDiscovery() BOOL reuseAddr = TRUE; setsockopt(s_discoverySock, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuseAddr, sizeof(reuseAddr)); + BOOL broadcast = TRUE; + setsockopt(s_discoverySock, SOL_SOCKET, SO_BROADCAST, (const char *)&broadcast, sizeof(broadcast)); struct sockaddr_in bindAddr; memset(&bindAddr, 0, sizeof(bindAddr)); @@ -1337,7 +1349,8 @@ bool NetworkSocketLayer::StartDiscovery() return false; } #elif defined __PS3__ || defined __ORBIS__ - if (::bind(s_discoverySock, (struct sockaddr *)&bindAddr, sizeof(bindAddr)) < 0) + int bindResult = ::bind(s_discoverySock, (struct sockaddr *)&bindAddr, sizeof(bindAddr)); + if (bindResult < 0) { #if defined(__PS3__) app.DebugPrintf("PS3 LAN: Discovery bind failed: %d\n", sys_net_errno); @@ -1349,8 +1362,15 @@ bool NetworkSocketLayer::StartDiscovery() return false; } #endif +#if defined _WINDOWS64 || defined _XBOX DWORD timeout = 500; setsockopt(s_discoverySock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(timeout)); +#elif defined __PS3__ || defined __ORBIS__ + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 500000; + setsockopt(s_discoverySock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(timeout)); +#endif s_discovering = true; s_discoveryThread = new C4JThread(DiscoveryThreadProc, NULL, "DiscoveryThreadProc"); @@ -1393,6 +1413,54 @@ void NetworkSocketLayer::StopDiscovery() std::vector NetworkSocketLayer::GetDiscoveredSessions() { std::vector result; + if (!s_discovering && !StartDiscovery()) + { + return result; + } + + DWORD query = htonl(NETWORK_LAN_DISCOVERY_QUERY_MAGIC); + struct sockaddr_in destination; + memset(&destination, 0, sizeof(destination)); + destination.sin_family = AF_INET; + destination.sin_port = htons(NETWORK_LAN_DISCOVERY_PORT); + destination.sin_addr.s_addr = INADDR_BROADCAST; + sendto(s_discoverySock, (const char *)&query, sizeof(query), 0, + (struct sockaddr *)&destination, sizeof(destination)); + +#ifdef __ORBIS__ + SceNetCtlInfo ipInfo; + SceNetCtlInfo maskInfo; + int ipResult = sceNetCtlGetInfo(SCE_NET_CTL_INFO_IP_ADDRESS, &ipInfo); + int maskResult = sceNetCtlGetInfo(SCE_NET_CTL_INFO_NETMASK, &maskInfo); + if (ipResult == SCE_OK && maskResult == SCE_OK) + { + struct in_addr localAddress; + struct in_addr netmask; + if (inet_pton(AF_INET, ipInfo.ip_address, &localAddress) == 1 && + inet_pton(AF_INET, maskInfo.netmask, &netmask) == 1) + { + DWORD local = ntohl(localAddress.s_addr); + DWORD mask = ntohl(netmask.s_addr); + DWORD first = (local & mask) + 1; + DWORD last = (local | ~mask) - 1; + if (last - first > 1023) + { + first = local & 0xFFFFFF00; + last = first + 254; + ++first; + } + for (DWORD address = first; address <= last; ++address) + { + if (address == local) + continue; + destination.sin_addr.s_addr = htonl(address); + sendto(s_discoverySock, (const char *)&query, sizeof(query), 0, + (struct sockaddr *)&destination, sizeof(destination)); + } + } + } +#endif + if (TryEnterCriticalSection(&s_discoveryLock)) { result = s_discoveredSessions; @@ -1430,8 +1498,30 @@ int NetworkSocketLayer::DiscoveryThreadProc(LPVOID param) } #endif - if (recvLen < (int)sizeof(LANBroadcast)) + if (recvLen == (int)sizeof(DWORD)) + { + DWORD query; + memcpy(&query, recvBuf, sizeof(query)); + if (ntohl(query) == NETWORK_LAN_DISCOVERY_QUERY_MAGIC && s_advertising) + { + EnterCriticalSection(&s_advertiseLock); + LANBroadcast response = s_advertiseData; + LeaveCriticalSection(&s_advertiseLock); + response.magic = htonl(response.magic); + response.netVersion = htons(response.netVersion); + response.gamePort = htons(response.gamePort); + response.gameHostSettings = htonl(response.gameHostSettings); + response.texturePackParentId = htonl(response.texturePackParentId); + sendto(s_discoverySock, (const char *)&response, sizeof(response), 0, + (struct sockaddr *)&senderAddr, senderLen); + } continue; + } + + if (recvLen < (int)sizeof(LANBroadcast)) + { + continue; + } LANBroadcast *broadcast = (LANBroadcast *)recvBuf; @@ -1442,7 +1532,9 @@ int NetworkSocketLayer::DiscoveryThreadProc(LPVOID param) broadcast->texturePackParentId = ntohl(broadcast->texturePackParentId); if (broadcast->magic != NETWORK_LAN_BROADCAST_MAGIC) + { continue; + } char senderIP[64]; #if defined _XBOX @@ -1453,7 +1545,6 @@ int NetworkSocketLayer::DiscoveryThreadProc(LPVOID param) #else inet_ntop(AF_INET, &senderAddr.sin_addr, senderIP, sizeof(senderIP)); #endif - DWORD now = GetTickCount(); EnterCriticalSection(&s_discoveryLock); diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManager.cpp b/Minecraft.Client/Common/Network/PlatformNetworkManager.cpp index 59ce1a0b..ce44a839 100644 --- a/Minecraft.Client/Common/Network/PlatformNetworkManager.cpp +++ b/Minecraft.Client/Common/Network/PlatformNetworkManager.cpp @@ -477,6 +477,8 @@ bool CPlatformNetworkManagerStub::_RunNetworkGame() { extern QNET_STATE _iQNetStubState; _iQNetStubState = QNET_STATE_GAME_PLAY; + if (m_pIQNet->IsHost()) + NetworkSocketLayer::UpdateAdvertiseJoinable(true); for (DWORD i = 0; i < IQNet::s_playerCount; i++) { @@ -698,7 +700,7 @@ void CPlatformNetworkManagerStub::SearchForGames() { std::vector lanSessions = NetworkSocketLayer::GetDiscoveredSessions(); - if (g_MultiplayerJoin) + if (g_MultiplayerJoin && g_MultiplayerIP[0] != '\0') { bool alreadyPresent = false; for (size_t i = 0; i < lanSessions.size(); i++) diff --git a/Minecraft.Client/Orbis/Orbis_Minecraft.cpp b/Minecraft.Client/Orbis/Orbis_Minecraft.cpp index d2366fbd..a658da4f 100644 --- a/Minecraft.Client/Orbis/Orbis_Minecraft.cpp +++ b/Minecraft.Client/Orbis/Orbis_Minecraft.cpp @@ -1059,9 +1059,10 @@ int main(int argc, const char *argv[] ) // XN_SYS_SIGNINCHANGED notifications. This does mean that we need to have a callback in the // ProfileManager for XN_LIVE_INVITE_ACCEPTED for QNet. - g_NetworkManager.Initialise(); - - // debug switch to trial version + g_NetworkManager.Initialise(); + NetworkSocketLayer::Initialize(); + + // debug switch to trial version ProfileManager.SetDebugFullOverride(true); #if 0 -- 2.54.0 From aca956007930808694bbde70f7c9a78ece66a7ff Mon Sep 17 00:00:00 2001 From: NaN Date: Tue, 4 Aug 2026 01:31:55 -0400 Subject: [PATCH 5/8] ps4 support final --- Minecraft.Client/Common/Audio/SoundEngine.cpp | 21 +++++++++++++++++++ .../Windows64/Windows64_Minecraft.cpp | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Minecraft.Client/Common/Audio/SoundEngine.cpp b/Minecraft.Client/Common/Audio/SoundEngine.cpp index dc813f6e..ee1fcc53 100644 --- a/Minecraft.Client/Common/Audio/SoundEngine.cpp +++ b/Minecraft.Client/Common/Audio/SoundEngine.cpp @@ -203,6 +203,14 @@ void AILCALL MilesMixerCB(HDIGDRIVER dig) void SoundEngine::init(Options *pOptions) { app.DebugPrintf("---SoundEngine::init\n"); +#ifdef _WINDOWS64 + HMODULE ntdll = GetModuleHandleA("ntdll.dll"); + if (ntdll != NULL && GetProcAddress(ntdll, "wine_get_version") != NULL) + { + app.DebugPrintf("---SoundEngine::init - Miles disabled under Wine\n"); + return; + } +#endif #ifdef __DISABLE_MILES__ return; #endif @@ -402,6 +410,7 @@ void SoundEngine::SetStreamingSounds(int iOverworldMin, int iOverWorldMax, int i // AP - moved to a separate function so it can be called from the mixer callback on Vita void SoundEngine::updateMiles() { + if (m_hDriver == 0) return; #ifdef __PSVITA__ //CD - We must check for Background Music [BGM] at any point //If it's playing disable our audio, otherwise enable @@ -630,6 +639,7 @@ static S32 running = AIL_ms_count(); void SoundEngine::tick(shared_ptr *players, float a) { ConsoleSoundEngine::tick(); + if (m_hDriver == 0) return; #ifdef __DISABLE_MILES__ return; #endif @@ -710,7 +720,13 @@ void SoundEngine::tick(shared_ptr *players, float a) SoundEngine::SoundEngine() { random = new Random(); + m_hBank=0; + m_hDriver=0; m_hStream=0; + m_MasterMusicVolume=1.0f; + m_MasterEffectsVolume=1.0f; + m_bSystemMusicPlaying=false; + m_openStreamThread=NULL; m_StreamState=eMusicStreamState_Idle; m_iMusicDelay=0; m_validListenerCount=0; @@ -759,6 +775,7 @@ void SoundEngine::GetSoundName(char *szSoundName,int iSound) ///////////////////////////////////////////// void SoundEngine::play(int iSound, float x, float y, float z, float volume, float pitch) { + if (m_hDriver == 0) return; U8 szSoundName[256]; if(iSound==-1) @@ -818,6 +835,7 @@ void SoundEngine::play(int iSound, float x, float y, float z, float volume, floa ///////////////////////////////////////////// void SoundEngine::playUI(int iSound, float volume, float pitch) { + if (m_hDriver == 0) return; U8 szSoundName[256]; wstring name; // we have some game sounds played as UI sounds... @@ -1134,6 +1152,7 @@ int SoundEngine::OpenStreamThreadProc( void* lpParameter ) return 0; #endif SoundEngine *soundEngine = (SoundEngine *)lpParameter; + if (soundEngine->m_hDriver == 0) return 0; soundEngine->m_hStream = AIL_open_stream(soundEngine->m_hDriver,soundEngine->m_szStreamName,0); if(soundEngine->m_hStream==0) @@ -1150,6 +1169,7 @@ int SoundEngine::OpenStreamThreadProc( void* lpParameter ) ///////////////////////////////////////////// void SoundEngine::playMusicTick() { + if (m_hDriver == 0) return; // AP - vita will update the music during the mixer callback #ifndef __PSVITA__ playMusicUpdate(); @@ -1159,6 +1179,7 @@ void SoundEngine::playMusicTick() // AP - moved to a separate function so it can be called from the mixer callback on Vita void SoundEngine::playMusicUpdate() { + if (m_hDriver == 0) return; //return; static bool firstCall = true; static float fMusicVol = 0.0f; diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index 9a45bb88..6f00d0f5 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -503,13 +503,13 @@ app.DebugPrintf("width: %d, height: %d\n", width, height); DXGI_SWAP_CHAIN_DESC sd; ZeroMemory( &sd, sizeof( sd ) ); - sd.BufferCount = 2; + sd.BufferCount = 1; sd.BufferDesc.Width = width; sd.BufferDesc.Height = height; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; - sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT; sd.OutputWindow = g_hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; -- 2.54.0 From 42b9349755f75e447420d386355621083256680e Mon Sep 17 00:00:00 2001 From: NaN Date: Tue, 4 Aug 2026 01:38:40 -0400 Subject: [PATCH 6/8] Revert Wine changes pushed by accident --- Minecraft.Client/Common/Audio/SoundEngine.cpp | 21 ------------------- .../Windows64/Windows64_Minecraft.cpp | 4 ++-- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/Minecraft.Client/Common/Audio/SoundEngine.cpp b/Minecraft.Client/Common/Audio/SoundEngine.cpp index ee1fcc53..dc813f6e 100644 --- a/Minecraft.Client/Common/Audio/SoundEngine.cpp +++ b/Minecraft.Client/Common/Audio/SoundEngine.cpp @@ -203,14 +203,6 @@ void AILCALL MilesMixerCB(HDIGDRIVER dig) void SoundEngine::init(Options *pOptions) { app.DebugPrintf("---SoundEngine::init\n"); -#ifdef _WINDOWS64 - HMODULE ntdll = GetModuleHandleA("ntdll.dll"); - if (ntdll != NULL && GetProcAddress(ntdll, "wine_get_version") != NULL) - { - app.DebugPrintf("---SoundEngine::init - Miles disabled under Wine\n"); - return; - } -#endif #ifdef __DISABLE_MILES__ return; #endif @@ -410,7 +402,6 @@ void SoundEngine::SetStreamingSounds(int iOverworldMin, int iOverWorldMax, int i // AP - moved to a separate function so it can be called from the mixer callback on Vita void SoundEngine::updateMiles() { - if (m_hDriver == 0) return; #ifdef __PSVITA__ //CD - We must check for Background Music [BGM] at any point //If it's playing disable our audio, otherwise enable @@ -639,7 +630,6 @@ static S32 running = AIL_ms_count(); void SoundEngine::tick(shared_ptr *players, float a) { ConsoleSoundEngine::tick(); - if (m_hDriver == 0) return; #ifdef __DISABLE_MILES__ return; #endif @@ -720,13 +710,7 @@ void SoundEngine::tick(shared_ptr *players, float a) SoundEngine::SoundEngine() { random = new Random(); - m_hBank=0; - m_hDriver=0; m_hStream=0; - m_MasterMusicVolume=1.0f; - m_MasterEffectsVolume=1.0f; - m_bSystemMusicPlaying=false; - m_openStreamThread=NULL; m_StreamState=eMusicStreamState_Idle; m_iMusicDelay=0; m_validListenerCount=0; @@ -775,7 +759,6 @@ void SoundEngine::GetSoundName(char *szSoundName,int iSound) ///////////////////////////////////////////// void SoundEngine::play(int iSound, float x, float y, float z, float volume, float pitch) { - if (m_hDriver == 0) return; U8 szSoundName[256]; if(iSound==-1) @@ -835,7 +818,6 @@ void SoundEngine::play(int iSound, float x, float y, float z, float volume, floa ///////////////////////////////////////////// void SoundEngine::playUI(int iSound, float volume, float pitch) { - if (m_hDriver == 0) return; U8 szSoundName[256]; wstring name; // we have some game sounds played as UI sounds... @@ -1152,7 +1134,6 @@ int SoundEngine::OpenStreamThreadProc( void* lpParameter ) return 0; #endif SoundEngine *soundEngine = (SoundEngine *)lpParameter; - if (soundEngine->m_hDriver == 0) return 0; soundEngine->m_hStream = AIL_open_stream(soundEngine->m_hDriver,soundEngine->m_szStreamName,0); if(soundEngine->m_hStream==0) @@ -1169,7 +1150,6 @@ int SoundEngine::OpenStreamThreadProc( void* lpParameter ) ///////////////////////////////////////////// void SoundEngine::playMusicTick() { - if (m_hDriver == 0) return; // AP - vita will update the music during the mixer callback #ifndef __PSVITA__ playMusicUpdate(); @@ -1179,7 +1159,6 @@ void SoundEngine::playMusicTick() // AP - moved to a separate function so it can be called from the mixer callback on Vita void SoundEngine::playMusicUpdate() { - if (m_hDriver == 0) return; //return; static bool firstCall = true; static float fMusicVol = 0.0f; diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index 6f00d0f5..9a45bb88 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -503,13 +503,13 @@ app.DebugPrintf("width: %d, height: %d\n", width, height); DXGI_SWAP_CHAIN_DESC sd; ZeroMemory( &sd, sizeof( sd ) ); - sd.BufferCount = 1; + sd.BufferCount = 2; sd.BufferDesc.Width = width; sd.BufferDesc.Height = height; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; - sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = g_hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; -- 2.54.0 From 83a62db82aa89ac57af720d12cf5a4b6fac2404e Mon Sep 17 00:00:00 2001 From: NaN Date: Tue, 4 Aug 2026 01:48:52 -0400 Subject: [PATCH 7/8] remove debug network code --- .../Common/Network/NetworkSocketLayer.cpp | 98 ++----------------- Minecraft.Client/Orbis/Orbis_Minecraft.cpp | 8 +- 2 files changed, 11 insertions(+), 95 deletions(-) diff --git a/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp index 9b29f088..cdfd7f14 100644 --- a/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp +++ b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp @@ -3,11 +3,6 @@ #include "NetworkSocketLayer.h" #include "..\..\Common\Network\PlatformNetworkManager.h" #include "..\..\..\Minecraft.World\Socket.h" -#ifdef __ORBIS__ -#include -#endif - -static const DWORD NETWORK_LAN_DISCOVERY_QUERY_MAGIC = 0x4D435152; #if defined _WINDOWS64 || defined _XBOX SOCKET NetworkSocketLayer::s_listenSocket = INVALID_SOCKET; @@ -1263,7 +1258,7 @@ int NetworkSocketLayer::AdvertiseThreadProc(LPVOID param) #ifdef _WINDOWS64 struct in_addr localAddresses[32]; struct in_addr broadcastAddresses[32]; - int interfaceCount = GetLocalIPv4Interfaces(s_advertiseSock, localAddresses, broadcastAddresses, 32); + int interfaceCount = GetLocalIPv4Interfaces(s_advertiseSock, localAddresses, broadcastAddresses, 32); // this is bad fyi and needs to be replaced for(int i = 0; i < interfaceCount; ++i) { broadcastAddr.sin_addr = broadcastAddresses[i]; @@ -1294,7 +1289,8 @@ int NetworkSocketLayer::AdvertiseThreadProc(LPVOID param) { app.DebugPrintf("PS3 LAN: Broadcast sendto failed: %d\n", sent); } -#endif +#endif + C4JThread::Sleep(1000); } @@ -1303,14 +1299,8 @@ int NetworkSocketLayer::AdvertiseThreadProc(LPVOID param) bool NetworkSocketLayer::StartDiscovery() { - if (s_discovering) - { - return true; - } - if (!s_initialized) - { - return false; - } + if (s_discovering) return true; + if (!s_initialized) return false; s_discoverySock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); #if defined _WINDOWS64 || defined _XBOX @@ -1331,8 +1321,6 @@ bool NetworkSocketLayer::StartDiscovery() BOOL reuseAddr = TRUE; setsockopt(s_discoverySock, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuseAddr, sizeof(reuseAddr)); - BOOL broadcast = TRUE; - setsockopt(s_discoverySock, SOL_SOCKET, SO_BROADCAST, (const char *)&broadcast, sizeof(broadcast)); struct sockaddr_in bindAddr; memset(&bindAddr, 0, sizeof(bindAddr)); @@ -1349,8 +1337,7 @@ bool NetworkSocketLayer::StartDiscovery() return false; } #elif defined __PS3__ || defined __ORBIS__ - int bindResult = ::bind(s_discoverySock, (struct sockaddr *)&bindAddr, sizeof(bindAddr)); - if (bindResult < 0) + if (::bind(s_discoverySock, (struct sockaddr *)&bindAddr, sizeof(bindAddr)) < 0) { #if defined(__PS3__) app.DebugPrintf("PS3 LAN: Discovery bind failed: %d\n", sys_net_errno); @@ -1413,54 +1400,6 @@ void NetworkSocketLayer::StopDiscovery() std::vector NetworkSocketLayer::GetDiscoveredSessions() { std::vector result; - if (!s_discovering && !StartDiscovery()) - { - return result; - } - - DWORD query = htonl(NETWORK_LAN_DISCOVERY_QUERY_MAGIC); - struct sockaddr_in destination; - memset(&destination, 0, sizeof(destination)); - destination.sin_family = AF_INET; - destination.sin_port = htons(NETWORK_LAN_DISCOVERY_PORT); - destination.sin_addr.s_addr = INADDR_BROADCAST; - sendto(s_discoverySock, (const char *)&query, sizeof(query), 0, - (struct sockaddr *)&destination, sizeof(destination)); - -#ifdef __ORBIS__ - SceNetCtlInfo ipInfo; - SceNetCtlInfo maskInfo; - int ipResult = sceNetCtlGetInfo(SCE_NET_CTL_INFO_IP_ADDRESS, &ipInfo); - int maskResult = sceNetCtlGetInfo(SCE_NET_CTL_INFO_NETMASK, &maskInfo); - if (ipResult == SCE_OK && maskResult == SCE_OK) - { - struct in_addr localAddress; - struct in_addr netmask; - if (inet_pton(AF_INET, ipInfo.ip_address, &localAddress) == 1 && - inet_pton(AF_INET, maskInfo.netmask, &netmask) == 1) - { - DWORD local = ntohl(localAddress.s_addr); - DWORD mask = ntohl(netmask.s_addr); - DWORD first = (local & mask) + 1; - DWORD last = (local | ~mask) - 1; - if (last - first > 1023) - { - first = local & 0xFFFFFF00; - last = first + 254; - ++first; - } - for (DWORD address = first; address <= last; ++address) - { - if (address == local) - continue; - destination.sin_addr.s_addr = htonl(address); - sendto(s_discoverySock, (const char *)&query, sizeof(query), 0, - (struct sockaddr *)&destination, sizeof(destination)); - } - } - } -#endif - if (TryEnterCriticalSection(&s_discoveryLock)) { result = s_discoveredSessions; @@ -1498,30 +1437,8 @@ int NetworkSocketLayer::DiscoveryThreadProc(LPVOID param) } #endif - if (recvLen == (int)sizeof(DWORD)) - { - DWORD query; - memcpy(&query, recvBuf, sizeof(query)); - if (ntohl(query) == NETWORK_LAN_DISCOVERY_QUERY_MAGIC && s_advertising) - { - EnterCriticalSection(&s_advertiseLock); - LANBroadcast response = s_advertiseData; - LeaveCriticalSection(&s_advertiseLock); - response.magic = htonl(response.magic); - response.netVersion = htons(response.netVersion); - response.gamePort = htons(response.gamePort); - response.gameHostSettings = htonl(response.gameHostSettings); - response.texturePackParentId = htonl(response.texturePackParentId); - sendto(s_discoverySock, (const char *)&response, sizeof(response), 0, - (struct sockaddr *)&senderAddr, senderLen); - } - continue; - } - if (recvLen < (int)sizeof(LANBroadcast)) - { continue; - } LANBroadcast *broadcast = (LANBroadcast *)recvBuf; @@ -1532,9 +1449,7 @@ int NetworkSocketLayer::DiscoveryThreadProc(LPVOID param) broadcast->texturePackParentId = ntohl(broadcast->texturePackParentId); if (broadcast->magic != NETWORK_LAN_BROADCAST_MAGIC) - { continue; - } char senderIP[64]; #if defined _XBOX @@ -1545,6 +1460,7 @@ int NetworkSocketLayer::DiscoveryThreadProc(LPVOID param) #else inet_ntop(AF_INET, &senderAddr.sin_addr, senderIP, sizeof(senderIP)); #endif + DWORD now = GetTickCount(); EnterCriticalSection(&s_discoveryLock); diff --git a/Minecraft.Client/Orbis/Orbis_Minecraft.cpp b/Minecraft.Client/Orbis/Orbis_Minecraft.cpp index a658da4f..a0d342b7 100644 --- a/Minecraft.Client/Orbis/Orbis_Minecraft.cpp +++ b/Minecraft.Client/Orbis/Orbis_Minecraft.cpp @@ -1059,10 +1059,10 @@ int main(int argc, const char *argv[] ) // XN_SYS_SIGNINCHANGED notifications. This does mean that we need to have a callback in the // ProfileManager for XN_LIVE_INVITE_ACCEPTED for QNet. - g_NetworkManager.Initialise(); - NetworkSocketLayer::Initialize(); - - // debug switch to trial version + g_NetworkManager.Initialise(); + NetworkSocketLayer::Initialize(); + + // debug switch to trial version ProfileManager.SetDebugFullOverride(true); #if 0 -- 2.54.0 From b67d9d2094ec71fdee81c0eaa6e3bde2fdc2ad8d Mon Sep 17 00:00:00 2001 From: NaN Date: Tue, 4 Aug 2026 01:56:00 -0400 Subject: [PATCH 8/8] clean up --- .../Common/Network/NetworkSocketLayer.cpp | 62 +------------------ 1 file changed, 2 insertions(+), 60 deletions(-) diff --git a/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp index cdfd7f14..f971b748 100644 --- a/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp +++ b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp @@ -74,41 +74,6 @@ int g_MultiplayerPort = NETWORK_LAN_DEFAULT_PORT; char g_MultiplayerIP[256] = "127.0.0.1"; #endif -#ifdef _WINDOWS64 -static int GetLocalIPv4Interfaces(SOCKET socketHandle, struct in_addr *localAddresses, - struct in_addr *broadcastAddresses, int capacity) -{ - INTERFACE_INFO interfaceList[32]; - DWORD bytesReturned = 0; - if(WSAIoctl(socketHandle, SIO_GET_INTERFACE_LIST, NULL, 0, interfaceList, - sizeof(interfaceList), &bytesReturned, NULL, NULL) == SOCKET_ERROR) - { - return 0; - } - - int interfaceCount = (int)(bytesReturned / sizeof(INTERFACE_INFO)); - int resultCount = 0; - for(int i = 0; i < interfaceCount && resultCount < capacity; ++i) - { - struct sockaddr_in *address = (struct sockaddr_in *)&interfaceList[i].iiAddress; - struct sockaddr_in *netmask = (struct sockaddr_in *)&interfaceList[i].iiNetmask; - if(address->sin_family != AF_INET) - continue; - - unsigned long hostAddress = ntohl(address->sin_addr.s_addr); - unsigned long hostNetmask = ntohl(netmask->sin_addr.s_addr); - if(hostAddress == 0 || (hostAddress & 0xff000000) == 0x7f000000 || hostNetmask == 0) - continue; - - localAddresses[resultCount] = address->sin_addr; - broadcastAddresses[resultCount].s_addr = htonl(hostAddress | ~hostNetmask); - ++resultCount; - } - - return resultCount; -} -#endif - bool NetworkSocketLayer::Initialize() { if (s_initialized) return true; @@ -1253,31 +1218,8 @@ int NetworkSocketLayer::AdvertiseThreadProc(LPVOID param) data.gameHostSettings = htonl(data.gameHostSettings); data.texturePackParentId = htonl(data.texturePackParentId); - int sent = -1; - -#ifdef _WINDOWS64 - struct in_addr localAddresses[32]; - struct in_addr broadcastAddresses[32]; - int interfaceCount = GetLocalIPv4Interfaces(s_advertiseSock, localAddresses, broadcastAddresses, 32); // this is bad fyi and needs to be replaced - for(int i = 0; i < interfaceCount; ++i) - { - broadcastAddr.sin_addr = broadcastAddresses[i]; - int interfaceSent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0, - (struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr)); - if(interfaceSent != SOCKET_ERROR) - sent = interfaceSent; - } - - if(interfaceCount == 0) - { - broadcastAddr.sin_addr.s_addr = INADDR_BROADCAST; - sent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0, - (struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr)); - } -#else - sent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0, + int sent = sendto(s_advertiseSock, (const char *)&data, sizeof(data), 0, (struct sockaddr *)&broadcastAddr, sizeof(broadcastAddr)); -#endif #if defined _WINDOWS64 || defined _XBOX if (sent == SOCKET_ERROR && s_advertising) @@ -1289,7 +1231,7 @@ int NetworkSocketLayer::AdvertiseThreadProc(LPVOID param) { app.DebugPrintf("PS3 LAN: Broadcast sendto failed: %d\n", sent); } -#endif +#endif C4JThread::Sleep(1000); } -- 2.54.0