From ce3e83039dd25b54db80c39d187e86554174f20f Mon Sep 17 00:00:00 2001 From: piebot Date: Mon, 3 Aug 2026 04:18:33 +0300 Subject: [PATCH] rename network scripts --- Minecraft.Client/ClientConnection.cpp | 2 +- .../Common/Network/GameNetworkManager.h | 2 +- ...ockNetLayer.cpp => NetworkSocketLayer.cpp} | 162 +- ...WinsockNetLayer.h => NetworkSocketLayer.h} | 36 +- ...gerStub.cpp => PlatformNetworkManager.cpp} | 1886 ++++++++--------- ...ManagerStub.h => PlatformNetworkManager.h} | 342 +-- Minecraft.Client/Extrax64Stubs.cpp | 12 +- Minecraft.Client/Minecraft.Client.vcxproj | 8 +- .../Minecraft.Client.vcxproj.filters | 18 +- Minecraft.Client/Orbis/Orbis_Minecraft.cpp | 2 +- Minecraft.Client/PS3/PS3_Minecraft.cpp | 4 +- .../Windows64/Windows64_Minecraft.cpp | 12 +- 12 files changed, 1243 insertions(+), 1243 deletions(-) rename Minecraft.Client/Common/Network/{WinsockNetLayer.cpp => NetworkSocketLayer.cpp} (89%) rename Minecraft.Client/Common/Network/{WinsockNetLayer.h => NetworkSocketLayer.h} (84%) rename Minecraft.Client/Common/Network/{PlatformNetworkManagerStub.cpp => PlatformNetworkManager.cpp} (91%) rename Minecraft.Client/Common/Network/{PlatformNetworkManagerStub.h => PlatformNetworkManager.h} (97%) diff --git a/Minecraft.Client/ClientConnection.cpp b/Minecraft.Client/ClientConnection.cpp index f62f8bb6..b3476836 100644 --- a/Minecraft.Client/ClientConnection.cpp +++ b/Minecraft.Client/ClientConnection.cpp @@ -57,7 +57,7 @@ #if defined _WINDOWS64 || defined DISABLE_PSN || defined _DISABLE_XBLIVE #include "Xbox\Network\NetworkPlayerXbox.h" -#include "Common\Network\PlatformNetworkManagerStub.h" +#include "Common\Network\PlatformNetworkManager.h" #endif #ifdef _DURANGO diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.h b/Minecraft.Client/Common/Network/GameNetworkManager.h index 8aeeb3d3..4c707ba8 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.h +++ b/Minecraft.Client/Common/Network/GameNetworkManager.h @@ -13,7 +13,7 @@ using namespace std; #elif defined _DURANGO #include "..\..\Durango\Network\PlatformNetworkManagerDurango.h" #else -#include "PlatformNetworkManagerStub.h" +#include "PlatformNetworkManager.h" #endif #include "SessionInfo.h" diff --git a/Minecraft.Client/Common/Network/WinsockNetLayer.cpp b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp similarity index 89% rename from Minecraft.Client/Common/Network/WinsockNetLayer.cpp rename to Minecraft.Client/Common/Network/NetworkSocketLayer.cpp index 725d2de7..22900158 100644 --- a/Minecraft.Client/Common/Network/WinsockNetLayer.cpp +++ b/Minecraft.Client/Common/Network/NetworkSocketLayer.cpp @@ -1,19 +1,19 @@ #include "stdafx.h" -#include "WinsockNetLayer.h" -#include "..\..\Common\Network\PlatformNetworkManagerStub.h" +#include "NetworkSocketLayer.h" +#include "..\..\Common\Network\PlatformNetworkManager.h" #include "..\..\..\Minecraft.World\Socket.h" #if defined _WINDOWS64 || defined _XBOX -SOCKET WinsockNetLayer::s_listenSocket = INVALID_SOCKET; -SOCKET WinsockNetLayer::s_hostConnectionSocket = INVALID_SOCKET; -SOCKET WinsockNetLayer::s_advertiseSock = INVALID_SOCKET; -SOCKET WinsockNetLayer::s_discoverySock = INVALID_SOCKET; +SOCKET NetworkSocketLayer::s_listenSocket = INVALID_SOCKET; +SOCKET NetworkSocketLayer::s_hostConnectionSocket = INVALID_SOCKET; +SOCKET NetworkSocketLayer::s_advertiseSock = INVALID_SOCKET; +SOCKET NetworkSocketLayer::s_discoverySock = INVALID_SOCKET; #elif defined __PS3__ || defined __ORBIS__ -SOCKET WinsockNetLayer::s_listenSocket = -1; -SOCKET WinsockNetLayer::s_hostConnectionSocket = -1; -SOCKET WinsockNetLayer::s_advertiseSock = -1; -SOCKET WinsockNetLayer::s_discoverySock = -1; +SOCKET NetworkSocketLayer::s_listenSocket = -1; +SOCKET NetworkSocketLayer::s_hostConnectionSocket = -1; +SOCKET NetworkSocketLayer::s_advertiseSock = -1; +SOCKET NetworkSocketLayer::s_discoverySock = -1; #if defined __PS3__ int closesocket(int s) { return socketclose(s); }; @@ -22,50 +22,50 @@ void terminate_networking() { cellNetCtlTerm(); sys_net_finalize_network(); }; int closesocket(int s) { return sceNetSocketClose(s); }; int socketclose(int s) { return sceNetSocketClose(s); }; void terminate_networking() {}; +#endif void WSACleanup() {}; #endif -#endif -C4JThread* WinsockNetLayer::s_acceptThread = NULL; -C4JThread* WinsockNetLayer::s_clientRecvThread = NULL; +C4JThread* NetworkSocketLayer::s_acceptThread = NULL; +C4JThread* NetworkSocketLayer::s_clientRecvThread = NULL; -bool WinsockNetLayer::s_isHost = false; -bool WinsockNetLayer::s_connected = false; -bool WinsockNetLayer::s_active = false; -bool WinsockNetLayer::s_initialized = false; +bool NetworkSocketLayer::s_isHost = false; +bool NetworkSocketLayer::s_connected = false; +bool NetworkSocketLayer::s_active = false; +bool NetworkSocketLayer::s_initialized = false; -BYTE WinsockNetLayer::s_localSmallId = 0; -BYTE WinsockNetLayer::s_hostSmallId = 0; -BYTE WinsockNetLayer::s_nextSmallId = 1; +BYTE NetworkSocketLayer::s_localSmallId = 0; +BYTE NetworkSocketLayer::s_hostSmallId = 0; +BYTE NetworkSocketLayer::s_nextSmallId = 1; -CRITICAL_SECTION WinsockNetLayer::s_sendLock; -CRITICAL_SECTION WinsockNetLayer::s_connectionsLock; +CRITICAL_SECTION NetworkSocketLayer::s_sendLock; +CRITICAL_SECTION NetworkSocketLayer::s_connectionsLock; -std::vector WinsockNetLayer::s_connections; +std::vector NetworkSocketLayer::s_connections; -C4JThread* WinsockNetLayer::s_advertiseThread = NULL; -volatile bool WinsockNetLayer::s_advertising = false; -Win64LANBroadcast WinsockNetLayer::s_advertiseData = {}; -CRITICAL_SECTION WinsockNetLayer::s_advertiseLock; -int WinsockNetLayer::s_hostGamePort = WIN64_NET_DEFAULT_PORT; +C4JThread* NetworkSocketLayer::s_advertiseThread = NULL; +volatile bool NetworkSocketLayer::s_advertising = false; +LANBroadcast NetworkSocketLayer::s_advertiseData = {}; +CRITICAL_SECTION NetworkSocketLayer::s_advertiseLock; +int NetworkSocketLayer::s_hostGamePort = NETWORK_LAN_DEFAULT_PORT; -C4JThread* WinsockNetLayer::s_discoveryThread = NULL; -volatile bool WinsockNetLayer::s_discovering = false; -CRITICAL_SECTION WinsockNetLayer::s_discoveryLock; -std::vector WinsockNetLayer::s_discoveredSessions; +C4JThread* NetworkSocketLayer::s_discoveryThread = NULL; +volatile bool NetworkSocketLayer::s_discovering = false; +CRITICAL_SECTION NetworkSocketLayer::s_discoveryLock; +std::vector NetworkSocketLayer::s_discoveredSessions; -CRITICAL_SECTION WinsockNetLayer::s_disconnectLock; -std::vector WinsockNetLayer::s_disconnectedSmallIds; +CRITICAL_SECTION NetworkSocketLayer::s_disconnectLock; +std::vector NetworkSocketLayer::s_disconnectedSmallIds; -CRITICAL_SECTION WinsockNetLayer::s_freeSmallIdLock; -std::vector WinsockNetLayer::s_freeSmallIds; +CRITICAL_SECTION NetworkSocketLayer::s_freeSmallIdLock; +std::vector NetworkSocketLayer::s_freeSmallIds; -bool g_Win64MultiplayerHost = false; -bool g_Win64MultiplayerJoin = true; -int g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; -char g_Win64MultiplayerIP[256] = "127.0.0.1"; +bool g_MultiplayerHost = false; +bool g_MultiplayerJoin = true; +int g_MultiplayerPort = NETWORK_LAN_DEFAULT_PORT; +char g_MultiplayerIP[256] = "127.0.0.1"; -bool WinsockNetLayer::Initialize() +bool NetworkSocketLayer::Initialize() { if (s_initialized) return true; #if defined _WINDOWS64 || defined _XBOX @@ -105,7 +105,7 @@ bool WinsockNetLayer::Initialize() return true; } -void WinsockNetLayer::Shutdown() +void NetworkSocketLayer::Shutdown() { StopAdvertising(); StopDiscovery(); @@ -185,7 +185,7 @@ void WinsockNetLayer::Shutdown() } } -bool WinsockNetLayer::HostGame(int port) +bool NetworkSocketLayer::HostGame(int port) { if (!s_initialized && !Initialize()) return false; @@ -322,7 +322,7 @@ bool WinsockNetLayer::HostGame(int port) return true; } -bool WinsockNetLayer::JoinGame(const char *ip, int port) +bool NetworkSocketLayer::JoinGame(const char *ip, int port) { if (!s_initialized && !Initialize()) return false; @@ -704,7 +704,7 @@ bool WinsockNetLayer::JoinGame(const char *ip, int port) } -bool WinsockNetLayer::SendOnSocket(SOCKET sock, const void *data, int dataSize) +bool NetworkSocketLayer::SendOnSocket(SOCKET sock, const void *data, int dataSize) { #if defined _WINDOWS64 || defined _XBOX if (sock == INVALID_SOCKET || dataSize <= 0) return false; @@ -758,7 +758,7 @@ bool WinsockNetLayer::SendOnSocket(SOCKET sock, const void *data, int dataSize) return true; } -bool WinsockNetLayer::SendToSmallId(BYTE targetSmallId, const void *data, int dataSize) +bool NetworkSocketLayer::SendToSmallId(BYTE targetSmallId, const void *data, int dataSize) { if (!s_active) return false; @@ -778,7 +778,7 @@ bool WinsockNetLayer::SendToSmallId(BYTE targetSmallId, const void *data, int da } } -SOCKET WinsockNetLayer::GetSocketForSmallId(BYTE smallId) +SOCKET NetworkSocketLayer::GetSocketForSmallId(BYTE smallId) { EnterCriticalSection(&s_connectionsLock); for (size_t i = 0; i < s_connections.size(); i++) @@ -810,7 +810,7 @@ static bool RecvExact(SOCKET sock, BYTE *buf, int len) return true; } -void WinsockNetLayer::HandleDataReceived(BYTE fromSmallId, BYTE toSmallId, unsigned char *data, unsigned int dataSize) +void NetworkSocketLayer::HandleDataReceived(BYTE fromSmallId, BYTE toSmallId, unsigned char *data, unsigned int dataSize) { INetworkPlayer *pPlayerFrom = g_NetworkManager.GetPlayerBySmallId(fromSmallId); INetworkPlayer *pPlayerTo = g_NetworkManager.GetPlayerBySmallId(toSmallId); @@ -831,7 +831,7 @@ void WinsockNetLayer::HandleDataReceived(BYTE fromSmallId, BYTE toSmallId, unsig } } -int WinsockNetLayer::AcceptThreadProc(LPVOID param) +int NetworkSocketLayer::AcceptThreadProc(LPVOID param) { while (s_active) { @@ -892,7 +892,7 @@ int WinsockNetLayer::AcceptThreadProc(LPVOID param) continue; } - Win64RemoteConnection conn; + RemoteConnection conn; conn.tcpSocket = clientSocket; conn.smallId = assignedSmallId; conn.active = true; @@ -926,7 +926,7 @@ int WinsockNetLayer::AcceptThreadProc(LPVOID param) return 0; } -int WinsockNetLayer::RecvThreadProc(LPVOID param) +int NetworkSocketLayer::RecvThreadProc(LPVOID param) { DWORD connIdx = *(DWORD *)param; delete (DWORD *)param; @@ -942,7 +942,7 @@ int WinsockNetLayer::RecvThreadProc(LPVOID param) LeaveCriticalSection(&s_connectionsLock); std::vector recvBuf; - recvBuf.resize(WIN64_NET_RECV_BUFFER_SIZE); + recvBuf.resize(NETWORK_LAN_RECV_BUFFER_SIZE); while (s_active) { @@ -959,12 +959,12 @@ int WinsockNetLayer::RecvThreadProc(LPVOID param) ((uint32_t)header[2] << 8) | ((uint32_t)header[3]); - if (packetSize <= 0 || packetSize > WIN64_NET_MAX_PACKET_SIZE) + if (packetSize <= 0 || packetSize > NETWORK_LAN_MAX_PACKET_SIZE) { app.DebugPrintf("LAN: Invalid packet size %d from client smallId=%d (max=%d)\n", packetSize, clientSmallId, - (int)WIN64_NET_MAX_PACKET_SIZE); + (int)NETWORK_LAN_MAX_PACKET_SIZE); break; } @@ -1006,7 +1006,7 @@ int WinsockNetLayer::RecvThreadProc(LPVOID param) return 0; } -bool WinsockNetLayer::PopDisconnectedSmallId(BYTE *outSmallId) +bool NetworkSocketLayer::PopDisconnectedSmallId(BYTE *outSmallId) { bool found = false; EnterCriticalSection(&s_disconnectLock); @@ -1020,14 +1020,14 @@ bool WinsockNetLayer::PopDisconnectedSmallId(BYTE *outSmallId) return found; } -void WinsockNetLayer::PushFreeSmallId(BYTE smallId) +void NetworkSocketLayer::PushFreeSmallId(BYTE smallId) { EnterCriticalSection(&s_freeSmallIdLock); s_freeSmallIds.push_back(smallId); LeaveCriticalSection(&s_freeSmallIdLock); } -void WinsockNetLayer::CloseConnectionBySmallId(BYTE smallId) +void NetworkSocketLayer::CloseConnectionBySmallId(BYTE smallId) { EnterCriticalSection(&s_connectionsLock); for (size_t i = 0; i < s_connections.size(); i++) @@ -1043,10 +1043,10 @@ void WinsockNetLayer::CloseConnectionBySmallId(BYTE smallId) LeaveCriticalSection(&s_connectionsLock); } -int WinsockNetLayer::ClientRecvThreadProc(LPVOID param) +int NetworkSocketLayer::ClientRecvThreadProc(LPVOID param) { std::vector recvBuf; - recvBuf.resize(WIN64_NET_RECV_BUFFER_SIZE); + recvBuf.resize(NETWORK_LAN_RECV_BUFFER_SIZE); #if defined _WINDOWS64 || defined _XBOX while (s_active && s_hostConnectionSocket != INVALID_SOCKET) @@ -1063,7 +1063,7 @@ int WinsockNetLayer::ClientRecvThreadProc(LPVOID param) int packetSize = (header[0] << 24) | (header[1] << 16) | (header[2] << 8) | header[3]; - if (packetSize <= 0 || packetSize > WIN64_NET_MAX_PACKET_SIZE) + if (packetSize <= 0 || packetSize > NETWORK_LAN_MAX_PACKET_SIZE) { app.DebugPrintf("LAN: Invalid packet size %d from host\n", packetSize); break; @@ -1088,14 +1088,14 @@ int WinsockNetLayer::ClientRecvThreadProc(LPVOID param) return 0; } -bool WinsockNetLayer::StartAdvertising(int gamePort, const wchar_t *hostName, unsigned int gameSettings, unsigned int texPackId, unsigned char subTexId, unsigned short netVer) +bool NetworkSocketLayer::StartAdvertising(int gamePort, const wchar_t *hostName, unsigned int gameSettings, unsigned int texPackId, unsigned char subTexId, unsigned short netVer) { if (s_advertising) return true; if (!s_initialized) return false; EnterCriticalSection(&s_advertiseLock); memset(&s_advertiseData, 0, sizeof(s_advertiseData)); - s_advertiseData.magic = WIN64_LAN_BROADCAST_MAGIC; + s_advertiseData.magic = NETWORK_LAN_BROADCAST_MAGIC; s_advertiseData.netVersion = netVer; s_advertiseData.gamePort = (WORD)gamePort; size_t converted = wcstombs(s_advertiseData.hostName, hostName, 32); @@ -1129,11 +1129,11 @@ bool WinsockNetLayer::StartAdvertising(int gamePort, const wchar_t *hostName, un s_advertising = true; s_advertiseThread = new C4JThread(AdvertiseThreadProc, NULL, "AdvertiseThreadProc"); s_advertiseThread->Run(); - app.DebugPrintf("Win64 LAN: Started advertising on UDP port %d\n", WIN64_LAN_DISCOVERY_PORT); + app.DebugPrintf("Win64 LAN: Started advertising on UDP port %d\n", NETWORK_LAN_DISCOVERY_PORT); return true; } -void WinsockNetLayer::StopAdvertising() +void NetworkSocketLayer::StopAdvertising() { s_advertising = false; @@ -1159,14 +1159,14 @@ void WinsockNetLayer::StopAdvertising() } } -void WinsockNetLayer::UpdateAdvertisePlayerCount(BYTE count) +void NetworkSocketLayer::UpdateAdvertisePlayerCount(BYTE count) { EnterCriticalSection(&s_advertiseLock); s_advertiseData.playerCount = count; LeaveCriticalSection(&s_advertiseLock); } -void WinsockNetLayer::UpdateAdvertisePlayerNames(BYTE count, const char playerNames[][XUSER_NAME_SIZE]) +void NetworkSocketLayer::UpdateAdvertisePlayerNames(BYTE count, const char playerNames[][XUSER_NAME_SIZE]) { EnterCriticalSection(&s_advertiseLock); memset(s_advertiseData.playerNames, 0, sizeof(s_advertiseData.playerNames)); @@ -1178,25 +1178,25 @@ void WinsockNetLayer::UpdateAdvertisePlayerNames(BYTE count, const char playerNa LeaveCriticalSection(&s_advertiseLock); } -void WinsockNetLayer::UpdateAdvertiseJoinable(bool joinable) +void NetworkSocketLayer::UpdateAdvertiseJoinable(bool joinable) { EnterCriticalSection(&s_advertiseLock); s_advertiseData.isJoinable = joinable ? 1 : 0; LeaveCriticalSection(&s_advertiseLock); } -int WinsockNetLayer::AdvertiseThreadProc(LPVOID param) +int NetworkSocketLayer::AdvertiseThreadProc(LPVOID param) { struct sockaddr_in broadcastAddr; memset(&broadcastAddr, 0, sizeof(broadcastAddr)); broadcastAddr.sin_family = AF_INET; - broadcastAddr.sin_port = htons(WIN64_LAN_DISCOVERY_PORT); + broadcastAddr.sin_port = htons(NETWORK_LAN_DISCOVERY_PORT); broadcastAddr.sin_addr.s_addr = INADDR_BROADCAST; while (s_advertising) { EnterCriticalSection(&s_advertiseLock); - Win64LANBroadcast data = s_advertiseData; + LANBroadcast data = s_advertiseData; LeaveCriticalSection(&s_advertiseLock); data.magic = htonl(data.magic); @@ -1226,7 +1226,7 @@ int WinsockNetLayer::AdvertiseThreadProc(LPVOID param) return 0; } -bool WinsockNetLayer::StartDiscovery() +bool NetworkSocketLayer::StartDiscovery() { if (s_discovering) return true; if (!s_initialized) return false; @@ -1254,7 +1254,7 @@ bool WinsockNetLayer::StartDiscovery() struct sockaddr_in bindAddr; memset(&bindAddr, 0, sizeof(bindAddr)); bindAddr.sin_family = AF_INET; - bindAddr.sin_port = htons(WIN64_LAN_DISCOVERY_PORT); + bindAddr.sin_port = htons(NETWORK_LAN_DISCOVERY_PORT); bindAddr.sin_addr.s_addr = INADDR_ANY; #if defined _WINDOWS64 || defined _XBOX @@ -1285,11 +1285,11 @@ bool WinsockNetLayer::StartDiscovery() s_discoveryThread = new C4JThread(DiscoveryThreadProc, NULL, "DiscoveryThreadProc"); s_discoveryThread->Run(); - app.DebugPrintf("LAN: Listening for LAN games on UDP port %d\n", WIN64_LAN_DISCOVERY_PORT); + app.DebugPrintf("LAN: Listening for LAN games on UDP port %d\n", NETWORK_LAN_DISCOVERY_PORT); return true; } -void WinsockNetLayer::StopDiscovery() +void NetworkSocketLayer::StopDiscovery() { s_discovering = false; @@ -1319,9 +1319,9 @@ void WinsockNetLayer::StopDiscovery() LeaveCriticalSection(&s_discoveryLock); } -std::vector WinsockNetLayer::GetDiscoveredSessions() +std::vector NetworkSocketLayer::GetDiscoveredSessions() { - std::vector result; + std::vector result; if (TryEnterCriticalSection(&s_discoveryLock)) { result = s_discoveredSessions; @@ -1330,7 +1330,7 @@ std::vector WinsockNetLayer::GetDiscoveredSessions() return result; } -int WinsockNetLayer::DiscoveryThreadProc(LPVOID param) +int NetworkSocketLayer::DiscoveryThreadProc(LPVOID param) { app.DebugPrintf("Discovery thread started\n"); char recvBuf[1024]; @@ -1359,10 +1359,10 @@ int WinsockNetLayer::DiscoveryThreadProc(LPVOID param) } #endif - if (recvLen < (int)sizeof(Win64LANBroadcast)) + if (recvLen < (int)sizeof(LANBroadcast)) continue; - Win64LANBroadcast *broadcast = (Win64LANBroadcast *)recvBuf; + LANBroadcast *broadcast = (LANBroadcast *)recvBuf; broadcast->magic = ntohl(broadcast->magic); broadcast->netVersion = ntohs(broadcast->netVersion); @@ -1370,7 +1370,7 @@ int WinsockNetLayer::DiscoveryThreadProc(LPVOID param) broadcast->gameHostSettings = ntohl(broadcast->gameHostSettings); broadcast->texturePackParentId = ntohl(broadcast->texturePackParentId); - if (broadcast->magic != WIN64_LAN_BROADCAST_MAGIC) + if (broadcast->magic != NETWORK_LAN_BROADCAST_MAGIC) continue; char senderIP[64]; @@ -1415,7 +1415,7 @@ int WinsockNetLayer::DiscoveryThreadProc(LPVOID param) if (!found) { - Win64LANSession session; + LANSession session; memset(&session, 0, sizeof(session)); strncpy(session.hostIP, senderIP, sizeof(session.hostIP) - 1); session.hostIP[sizeof(session.hostIP) - 1] = '\0'; diff --git a/Minecraft.Client/Common/Network/WinsockNetLayer.h b/Minecraft.Client/Common/Network/NetworkSocketLayer.h similarity index 84% rename from Minecraft.Client/Common/Network/WinsockNetLayer.h rename to Minecraft.Client/Common/Network/NetworkSocketLayer.h index 0ccb8025..823cfeee 100644 --- a/Minecraft.Client/Common/Network/WinsockNetLayer.h +++ b/Minecraft.Client/Common/Network/NetworkSocketLayer.h @@ -30,12 +30,12 @@ #pragma comment(lib, "Ws2_32.lib") #endif -#define WIN64_NET_DEFAULT_PORT 25565 -#define WIN64_NET_MAX_CLIENTS 7 -#define WIN64_NET_RECV_BUFFER_SIZE 65536 -#define WIN64_NET_MAX_PACKET_SIZE (4 * 1024 * 1024) -#define WIN64_LAN_DISCOVERY_PORT 25566 -#define WIN64_LAN_BROADCAST_MAGIC 0x4D434C4E +#define NETWORK_LAN_DEFAULT_PORT 25565 +#define NETWORK_LAN_MAX_CLIENTS 7 +#define NETWORK_LAN_RECV_BUFFER_SIZE 65536 +#define NETWORK_LAN_MAX_PACKET_SIZE (4 * 1024 * 1024) +#define NETWORK_LAN_DISCOVERY_PORT 25566 +#define NETWORK_LAN_BROADCAST_MAGIC 0x4D434C4E #if defined __PS3__ || defined __ORBIS__ typedef int SOCKET; @@ -45,7 +45,7 @@ typedef int SOCKET; class Socket; #pragma pack(push, 1) -struct Win64LANBroadcast +struct LANBroadcast { DWORD magic; WORD netVersion; @@ -61,7 +61,7 @@ struct Win64LANBroadcast }; #pragma pack(pop) -struct Win64LANSession +struct LANSession { char hostIP[64]; int hostPort; @@ -77,7 +77,7 @@ struct Win64LANSession char playerNames[8][XUSER_NAME_SIZE]; }; -struct Win64RemoteConnection +struct RemoteConnection { SOCKET tcpSocket; BYTE smallId; @@ -85,7 +85,7 @@ struct Win64RemoteConnection volatile bool active; }; -class WinsockNetLayer +class NetworkSocketLayer { public: static bool Initialize(); @@ -120,7 +120,7 @@ public: static bool StartDiscovery(); static void StopDiscovery(); - static vector GetDiscoveredSessions(); + static vector GetDiscoveredSessions(); static int GetHostPort() { return s_hostGamePort; } @@ -148,12 +148,12 @@ private: static CRITICAL_SECTION s_sendLock; static CRITICAL_SECTION s_connectionsLock; - static std::vector s_connections; + static std::vector s_connections; static SOCKET s_advertiseSock; static C4JThread* s_advertiseThread; static volatile bool s_advertising; - static Win64LANBroadcast s_advertiseData; + static LANBroadcast s_advertiseData; static CRITICAL_SECTION s_advertiseLock; static int s_hostGamePort; @@ -161,7 +161,7 @@ private: static C4JThread* s_discoveryThread; static volatile bool s_discovering; static CRITICAL_SECTION s_discoveryLock; - static std::vector s_discoveredSessions; + static std::vector s_discoveredSessions; static CRITICAL_SECTION s_disconnectLock; static std::vector s_disconnectedSmallIds; @@ -170,7 +170,7 @@ private: static std::vector s_freeSmallIds; }; -extern bool g_Win64MultiplayerHost; -extern bool g_Win64MultiplayerJoin; -extern int g_Win64MultiplayerPort; -extern char g_Win64MultiplayerIP[256]; \ No newline at end of file +extern bool g_MultiplayerHost; +extern bool g_MultiplayerJoin; +extern int g_MultiplayerPort; +extern char g_MultiplayerIP[256]; \ No newline at end of file diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp b/Minecraft.Client/Common/Network/PlatformNetworkManager.cpp similarity index 91% rename from Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp rename to Minecraft.Client/Common/Network/PlatformNetworkManager.cpp index e517cdb6..59ce1a0b 100644 --- a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp +++ b/Minecraft.Client/Common/Network/PlatformNetworkManager.cpp @@ -1,947 +1,947 @@ -#include "stdafx.h" -#include "..\..\..\Minecraft.World\Socket.h" -#include "..\..\..\Minecraft.World\StringHelpers.h" -#include "PlatformNetworkManagerStub.h" -#include "..\..\Xbox\Network\NetworkPlayerXbox.h" // TODO - stub version of this? -#include "..\..\Minecraft.h" -#include "..\..\User.h" -#include "..\..\Common\Network\WinsockNetLayer.h" - -CPlatformNetworkManagerStub *g_pPlatformNetworkManager; - - -void CPlatformNetworkManagerStub::NotifyPlayerJoined(IQNetPlayer *pQNetPlayer ) -{ - const char * pszDescription; - - // 4J Stu - We create a fake socket for every where that we need an INBOUND queue of game data. Outbound - // is all handled by QNet so we don't need that. Therefore each client player has one, and the host has one - // for each client player. - bool createFakeSocket = false; - bool localPlayer = false; - - NetworkPlayerXbox *networkPlayer = (NetworkPlayerXbox *)addNetworkPlayer(pQNetPlayer); - - if( pQNetPlayer->IsLocal() ) - { - localPlayer = true; - if( pQNetPlayer->IsHost() ) - { - pszDescription = "local host"; - // 4J Stu - No socket for the localhost as it uses a special loopback queue - - m_machineQNetPrimaryPlayers.push_back( pQNetPlayer ); - } - else - { - pszDescription = "local"; - - // We need an inbound queue on all local players to receive data from the host - createFakeSocket = true; - } - } - else - { - if( pQNetPlayer->IsHost() ) - { - pszDescription = "remote host"; - } - else - { - pszDescription = "remote"; - - // If we are the host, then create a fake socket for every remote player - if( m_pIQNet->IsHost() ) - { - createFakeSocket = true; - } - } - - if( m_pIQNet->IsHost() && !m_bHostChanged ) - { - // Do we already have a primary player for this system? - bool systemHasPrimaryPlayer = false; - for(AUTO_VAR(it, m_machineQNetPrimaryPlayers.begin()); it < m_machineQNetPrimaryPlayers.end(); ++it) - { - IQNetPlayer *pQNetPrimaryPlayer = *it; - if( pQNetPlayer->IsSameSystem(pQNetPrimaryPlayer) ) - { - systemHasPrimaryPlayer = true; - break; - } - } - if( !systemHasPrimaryPlayer ) - m_machineQNetPrimaryPlayers.push_back( pQNetPlayer ); - } - } - g_NetworkManager.PlayerJoining( networkPlayer ); - - if( createFakeSocket == true && !m_bHostChanged ) - { - g_NetworkManager.CreateSocket( networkPlayer, localPlayer ); - } - - app.DebugPrintf( "Player 0x%p \"%ls\" joined; %s; voice %i; camera %i.\n", - pQNetPlayer, - pQNetPlayer->GetGamertag(), - pszDescription, - (int) pQNetPlayer->HasVoice(), - (int) pQNetPlayer->HasCamera() ); - - - if( m_pIQNet->IsHost() ) - { - // 4J-PB - only the host should do this - g_NetworkManager.UpdateAndSetGameSessionData(); - SystemFlagAddPlayer( networkPlayer ); - } - - for( int idx = 0; idx < XUSER_MAX_COUNT; ++idx) - { - if(playerChangedCallback[idx] != NULL) - playerChangedCallback[idx]( playerChangedCallbackParam[idx], networkPlayer, false ); - } - - if(m_pIQNet->GetState() == QNET_STATE_GAME_PLAY) - { - int localPlayerCount = 0; - for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) - { - if( m_pIQNet->GetLocalPlayerByUserIndex(idx) != NULL ) ++localPlayerCount; - } - - float appTime = app.getAppTime(); - - // Only record stats for the primary player here - m_lastPlayerEventTimeStart = appTime; - } -} - -void CPlatformNetworkManagerStub::NotifyPlayerLeaving(IQNetPlayer *pQNetPlayer) -{ - app.DebugPrintf("Player 0x%p \"%ls\" leaving.\n", pQNetPlayer, pQNetPlayer->GetGamertag()); - - INetworkPlayer *networkPlayer = getNetworkPlayer(pQNetPlayer); - if (networkPlayer == NULL) - return; - - Socket *socket = networkPlayer->GetSocket(); - if (socket != NULL) - { - if (m_pIQNet->IsHost()) - g_NetworkManager.CloseConnection(networkPlayer); - } - - if (m_pIQNet->IsHost()) - { - SystemFlagRemovePlayer(networkPlayer); - } - - g_NetworkManager.PlayerLeaving(networkPlayer); - - if (m_pIQNet->IsHost()) - { - g_NetworkManager.UpdateAndSetGameSessionData(networkPlayer); - } - - for (int idx = 0; idx < XUSER_MAX_COUNT; ++idx) - { - if (playerChangedCallback[idx] != NULL) - playerChangedCallback[idx](playerChangedCallbackParam[idx], networkPlayer, true); - } - - removeNetworkPlayer(pQNetPlayer); -} - -bool CPlatformNetworkManagerStub::Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize) -{ - m_pGameNetworkManager = pGameNetworkManager; - m_flagIndexSize = flagIndexSize; - m_pIQNet = new IQNet(); - g_pPlatformNetworkManager = this; - for( int i = 0; i < XUSER_MAX_COUNT; i++ ) - { - playerChangedCallback[ i ] = NULL; - } - - m_bLeavingGame = false; - m_bLeaveGameOnTick = false; - m_bHostChanged = false; - - m_bSearchResultsReady = false; - m_bSearchPending = false; - - m_bIsOfflineGame = false; - m_pSearchParam = NULL; - m_SessionsUpdatedCallback = NULL; - - for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) - { - m_searchResultsCount[i] = 0; - m_lastSearchStartTime[i] = 0; - - // The results that will be filled in with the current search - m_pSearchResults[i] = NULL; - m_pQoSResult[i] = NULL; - m_pCurrentSearchResults[i] = NULL; - m_pCurrentQoSResult[i] = NULL; - m_currentSearchResultsCount[i] = 0; - } - - // Success! - return true; -} - -void CPlatformNetworkManagerStub::Terminate() -{ -} - -int CPlatformNetworkManagerStub::GetJoiningReadyPercentage() -{ - return 100; -} - -int CPlatformNetworkManagerStub::CorrectErrorIDS(int IDS) -{ - return IDS; -} - -bool CPlatformNetworkManagerStub::isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer) -{ - return true; -} - -// We call this twice a frame, either side of the render call so is a good place to "tick" things -void CPlatformNetworkManagerStub::DoWork() -{ - extern QNET_STATE _iQNetStubState; - if (_iQNetStubState == QNET_STATE_SESSION_STARTING && app.GetGameStarted()) - { - _iQNetStubState = QNET_STATE_GAME_PLAY; - if (m_pIQNet->IsHost()) - WinsockNetLayer::UpdateAdvertiseJoinable(true); - } - if (_iQNetStubState == QNET_STATE_IDLE) - TickSearch(); - if (_iQNetStubState == QNET_STATE_GAME_PLAY && m_pIQNet->IsHost()) - { - BYTE disconnectedSmallId; - while (WinsockNetLayer::PopDisconnectedSmallId(&disconnectedSmallId)) - { - IQNetPlayer *qnetPlayer = m_pIQNet->GetPlayerBySmallId(disconnectedSmallId); - if (qnetPlayer != NULL && qnetPlayer->m_smallId == disconnectedSmallId) - { - NotifyPlayerLeaving(qnetPlayer); - qnetPlayer->m_smallId = 0; - qnetPlayer->m_isRemote = false; - qnetPlayer->m_isHostPlayer = false; - qnetPlayer->m_gamertag[0] = 0; - qnetPlayer->SetCustomDataValue(0); - WinsockNetLayer::PushFreeSmallId(disconnectedSmallId); - if (IQNet::s_playerCount > 1) - IQNet::s_playerCount--; - } - } - - for (int i = 1; i < MINECRAFT_NET_MAX_PLAYERS; i++) - { - IQNetPlayer *qp = &IQNet::m_player[i]; - if (qp->GetCustomDataValue() == 0) - continue; - INetworkPlayer *np = (INetworkPlayer *)qp->GetCustomDataValue(); - Socket *sock = np->GetSocket(); - if (sock != NULL && sock->isClosing()) - { - WinsockNetLayer::CloseConnectionBySmallId((BYTE)i); - } - } - } - if (_iQNetStubState == QNET_STATE_GAME_PLAY && !m_pIQNet->IsHost()) - { - if (!WinsockNetLayer::IsConnected() && !g_NetworkManager.IsLeavingGame()) - { - if (app.GetDisconnectReason() == DisconnectPacket::eDisconnect_None) - app.SetDisconnectReason(DisconnectPacket::eDisconnect_Quitting); - app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ExitWorld, (void *)TRUE); - } - } -} - -int CPlatformNetworkManagerStub::GetPlayerCount() -{ - return m_pIQNet->GetPlayerCount(); -} - -bool CPlatformNetworkManagerStub::ShouldMessageForFullSession() -{ - return false; -} - -int CPlatformNetworkManagerStub::GetOnlinePlayerCount() -{ - return 1; -} - -int CPlatformNetworkManagerStub::GetLocalPlayerMask(int playerIndex) -{ - return 1 << playerIndex; -} - -bool CPlatformNetworkManagerStub::AddLocalPlayerByUserIndex( int userIndex ) -{ - NotifyPlayerJoined(m_pIQNet->GetLocalPlayerByUserIndex(userIndex)); - return ( m_pIQNet->AddLocalPlayerByUserIndex(userIndex) == S_OK ); -} - -bool CPlatformNetworkManagerStub::RemoveLocalPlayerByUserIndex( int userIndex ) -{ - return true; -} - -bool CPlatformNetworkManagerStub::IsInStatsEnabledSession() -{ - return true; -} - -bool CPlatformNetworkManagerStub::SessionHasSpace(unsigned int spaceRequired /*= 1*/) -{ - return true; -} - -void CPlatformNetworkManagerStub::SendInviteGUI(int quadrant) -{ -} - -bool CPlatformNetworkManagerStub::IsAddingPlayer() -{ - return false; -} - -bool CPlatformNetworkManagerStub::LeaveGame(bool bMigrateHost) -{ - if( m_bLeavingGame ) return true; - - m_bLeavingGame = true; - WinsockNetLayer::StopAdvertising(); - - // If we are the host wait for the game server to end - if(m_pIQNet->IsHost() && g_NetworkManager.ServerStoppedValid()) - { - m_pIQNet->EndGame(); - g_NetworkManager.ServerStoppedWait(); - g_NetworkManager.ServerStoppedDestroy(); - } - else - { - m_pIQNet->EndGame(); - } - - for (AUTO_VAR(it, currentNetworkPlayers.begin()); it != currentNetworkPlayers.end(); it++) - delete *it; - currentNetworkPlayers.clear(); - m_machineQNetPrimaryPlayers.clear(); - SystemFlagReset(); - - WinsockNetLayer::Shutdown(); - WinsockNetLayer::Initialize(); - - return true; -} - -bool CPlatformNetworkManagerStub::_LeaveGame(bool bMigrateHost, bool bLeaveRoom) -{ - return true; -} - -void CPlatformNetworkManagerStub::HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) -{ -// #ifdef _XBOX - // 4J Stu - We probably did this earlier as well, but just to be sure! - SetLocalGame( !bOnlineGame ); - SetPrivateGame( bIsPrivate ); - SystemFlagReset(); - - // Make sure that the Primary Pad is in by default - localUsersMask |= GetLocalPlayerMask( g_NetworkManager.GetPrimaryPad() ); - - m_bLeavingGame = false; - - m_pIQNet->HostGame(); - - IQNet::m_player[0].m_smallId = 0; - IQNet::m_player[0].m_isRemote = false; - IQNet::m_player[0].m_isHostPlayer = true; - IQNet::s_playerCount = 1; - - _HostGame( localUsersMask, publicSlots, privateSlots ); - - int port = WIN64_NET_DEFAULT_PORT; - if (!WinsockNetLayer::IsActive()) - WinsockNetLayer::HostGame(port); - - const wchar_t *hostName = IQNet::m_player[0].m_gamertag; - unsigned int settings = app.GetGameHostOption(eGameHostOption_All); - WinsockNetLayer::StartAdvertising(port, hostName, settings, 0, 0, MINECRAFT_NET_VERSION); -//#endif -} - -void CPlatformNetworkManagerStub::_HostGame(int usersMask, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) -{ -} - -bool CPlatformNetworkManagerStub::_StartGame() -{ - return true; -} - -int CPlatformNetworkManagerStub::JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex) -{ - if (searchResult == NULL) - return CGameNetworkManager::JOINGAME_FAIL_GENERAL; - - const char *hostIP = searchResult->data.hostIP; - int hostPort = searchResult->data.hostPort; - - if (hostPort <= 0 || hostIP[0] == 0) - return CGameNetworkManager::JOINGAME_FAIL_GENERAL; - - m_bLeavingGame = false; - IQNet::s_isHosting = false; - m_pIQNet->ClientJoinGame(); - - IQNet::m_player[0].m_smallId = 0; - IQNet::m_player[0].m_isRemote = true; - IQNet::m_player[0].m_isHostPlayer = true; - wcsncpy(IQNet::m_player[0].m_gamertag, searchResult->data.hostName, 31); - - WinsockNetLayer::StopDiscovery(); - - if (!WinsockNetLayer::JoinGame(hostIP, hostPort)) - { - app.DebugPrintf("Win64 LAN: Failed to connect to %s:%d\n", hostIP, hostPort); - return CGameNetworkManager::JOINGAME_FAIL_GENERAL; - } - - BYTE localSmallId = WinsockNetLayer::GetLocalSmallId(); - - IQNet::m_player[localSmallId].m_smallId = localSmallId; - IQNet::m_player[localSmallId].m_isRemote = false; - IQNet::m_player[localSmallId].m_isHostPlayer = false; - - Minecraft *pMinecraft = Minecraft::GetInstance(); - wcsncpy(IQNet::m_player[localSmallId].m_gamertag, pMinecraft->user->name.c_str(), 32); - IQNet::s_playerCount = localSmallId + 1; - - NotifyPlayerJoined(&IQNet::m_player[0]); - NotifyPlayerJoined(&IQNet::m_player[localSmallId]); - - m_pGameNetworkManager->StateChange_AnyToStarting(); - - return CGameNetworkManager::JOINGAME_SUCCESS; -} - -bool CPlatformNetworkManagerStub::SetLocalGame(bool isLocal) -{ - m_bIsOfflineGame = isLocal; - - return true; -} - -void CPlatformNetworkManagerStub::SetPrivateGame(bool isPrivate) -{ - app.DebugPrintf("Setting as private game: %s\n", isPrivate ? "yes" : "no" ); - m_bIsPrivateGame = isPrivate; -} - -void CPlatformNetworkManagerStub::RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) -{ - playerChangedCallback[iPad] = callback; - playerChangedCallbackParam[iPad] = callbackParam; -} - -void CPlatformNetworkManagerStub::UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) -{ - if(playerChangedCallbackParam[iPad] == callbackParam) - { - playerChangedCallback[iPad] = NULL; - playerChangedCallbackParam[iPad] = NULL; - } -} - -void CPlatformNetworkManagerStub::HandleSignInChange() -{ - return; -} - -bool CPlatformNetworkManagerStub::_RunNetworkGame() -{ - extern QNET_STATE _iQNetStubState; - _iQNetStubState = QNET_STATE_GAME_PLAY; - - for (DWORD i = 0; i < IQNet::s_playerCount; i++) - { - if (IQNet::m_player[i].m_isRemote) - { - INetworkPlayer *pNetworkPlayer = getNetworkPlayer(&IQNet::m_player[i]); - if (pNetworkPlayer != NULL && pNetworkPlayer->GetSocket() != NULL) - { - Socket::addIncomingSocket(pNetworkPlayer->GetSocket()); - } - } - } - - return true; -} - -void CPlatformNetworkManagerStub::UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving /*= NULL*/) -{ - if (this->m_bLeavingGame) - return; - - if (!m_pIQNet->IsHost()) - return; - - DWORD playerCount = m_pIQNet->GetPlayerCount(); - - m_hostGameSessionData.m_uiGameHostSettings = app.GetGameHostOption(eGameHostOption_All); - m_hostGameSessionData.playerCount = (unsigned char)playerCount; - - for (unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) - { - if (i < playerCount) - { - INetworkPlayer *pNetworkPlayer = GetPlayerByIndex(i); - - if (pNetworkPlayer != NULL && pNetworkPlayer != pNetworkPlayerLeaving) - { - m_hostGameSessionData.players[i] = (GameSessionUID)(i + 1); - - const wchar_t *name = pNetworkPlayer->GetOnlineName(); - char nameBuf[XUSER_NAME_SIZE]; - memset(nameBuf, 0, sizeof(nameBuf)); - wcstombs(nameBuf, name, XUSER_NAME_SIZE - 1); - memcpy(m_hostGameSessionData.szPlayers[i], nameBuf, XUSER_NAME_SIZE); - } - else - { - m_hostGameSessionData.players[i] = 0; - memset(m_hostGameSessionData.szPlayers[i], 0, XUSER_NAME_SIZE); - } - } - else - { - m_hostGameSessionData.players[i] = 0; - memset(m_hostGameSessionData.szPlayers[i], 0, XUSER_NAME_SIZE); - } - } - - // update the LAN advertiser with current player names and count - WinsockNetLayer::UpdateAdvertisePlayerNames(m_hostGameSessionData.playerCount, m_hostGameSessionData.szPlayers); -} - -int CPlatformNetworkManagerStub::RemovePlayerOnSocketClosedThreadProc( void* lpParam ) -{ - INetworkPlayer *pNetworkPlayer = (INetworkPlayer *)lpParam; - - Socket *socket = pNetworkPlayer->GetSocket(); - - if( socket != NULL ) - { - //printf("Waiting for socket closed event\n"); - socket->m_socketClosedEvent->WaitForSignal(INFINITE); - - //printf("Socket closed event has fired\n"); - // 4J Stu - Clear our reference to this socket - pNetworkPlayer->SetSocket( NULL ); - delete socket; - } - - return g_pPlatformNetworkManager->RemoveLocalPlayer( pNetworkPlayer ); -} - -bool CPlatformNetworkManagerStub::RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ) -{ - return true; -} - -CPlatformNetworkManagerStub::PlayerFlags::PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count) -{ - // 4J Stu - Don't assert, just make it a multiple of 8! This count is calculated from a load of separate values, - // and makes tweaking world/render sizes a pain if we hit an assert here - count = (count + 8 - 1) & ~(8 - 1); - //assert( ( count % 8 ) == 0 ); - this->m_pNetworkPlayer = pNetworkPlayer; - this->flags = new unsigned char [ count / 8 ]; - memset( this->flags, 0, count / 8 ); - this->count = count; -} -CPlatformNetworkManagerStub::PlayerFlags::~PlayerFlags() -{ - delete [] flags; -} - -// Add a player to the per system flag storage - if we've already got a player from that system, copy its flags over -void CPlatformNetworkManagerStub::SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer) -{ - PlayerFlags *newPlayerFlags = new PlayerFlags( pNetworkPlayer, m_flagIndexSize); - // If any of our existing players are on the same system, then copy over flags from that one - for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) - { - if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) - { - memcpy( newPlayerFlags->flags, m_playerFlags[i]->flags, m_playerFlags[i]->count / 8 ); - break; - } - } - m_playerFlags.push_back(newPlayerFlags); -} - -// Remove a player from the per system flag storage - just maintains the m_playerFlags vector without any gaps in it -void CPlatformNetworkManagerStub::SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer) -{ - for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) - { - if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) - { - delete m_playerFlags[i]; - m_playerFlags[i] = m_playerFlags.back(); - m_playerFlags.pop_back(); - return; - } - } -} - -void CPlatformNetworkManagerStub::SystemFlagReset() -{ - for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) - { - delete m_playerFlags[i]; - } - m_playerFlags.clear(); -} - -// Set a per system flag - this is done by setting the flag on every player that shares that system -void CPlatformNetworkManagerStub::SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index) -{ - if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return; - if( pNetworkPlayer == NULL ) return; - - for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) - { - if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) - { - m_playerFlags[i]->flags[ index / 8 ] |= ( 128 >> ( index % 8 ) ); - } - } -} - -// Get value of a per system flag - can be read from the flags of the passed in player as anything else sent to that -// system should also have been duplicated here -bool CPlatformNetworkManagerStub::SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index) -{ - if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return false; - if( pNetworkPlayer == NULL ) - { - return false; - } - - for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) - { - if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) - { - return ( ( m_playerFlags[i]->flags[ index / 8 ] & ( 128 >> ( index % 8 ) ) ) != 0 ); - } - } - return false; -} - -wstring CPlatformNetworkManagerStub::GatherStats() -{ - return L""; -} - -wstring CPlatformNetworkManagerStub::GatherRTTStats() -{ - wstring stats(L"Rtt: "); - - wchar_t stat[32]; - - for(unsigned int i = 0; i < GetPlayerCount(); ++i) - { - IQNetPlayer *pQNetPlayer = ((NetworkPlayerXbox *)GetPlayerByIndex( i ))->GetQNetPlayer(); - - if(!pQNetPlayer->IsLocal()) - { - ZeroMemory(stat,32*sizeof(WCHAR)); - swprintf(stat, 32, L"%d: %d/", i, pQNetPlayer->GetCurrentRtt() ); - stats.append(stat); - } - } - return stats; -} - -void CPlatformNetworkManagerStub::TickSearch() -{ - if (m_SessionsUpdatedCallback == NULL) - return; - - static DWORD lastSearchTime = 0; - DWORD now = GetTickCount(); - if (now - lastSearchTime < 2000) - return; - lastSearchTime = now; - - SearchForGames(); -} - -void CPlatformNetworkManagerStub::SearchForGames() -{ - std::vector lanSessions = WinsockNetLayer::GetDiscoveredSessions(); - - if (g_Win64MultiplayerJoin) - { - bool alreadyPresent = false; - for (size_t i = 0; i < lanSessions.size(); i++) - { - if (strcmp(lanSessions[i].hostIP, g_Win64MultiplayerIP) == 0 && - lanSessions[i].hostPort == g_Win64MultiplayerPort) - { - alreadyPresent = true; - break; - } - } - if (!alreadyPresent) - { - Win64LANSession manual; - memset(&manual, 0, sizeof(manual)); - strncpy(manual.hostIP, g_Win64MultiplayerIP, sizeof(manual.hostIP) - 1); - manual.hostIP[sizeof(manual.hostIP) - 1] = '\0'; - - manual.hostPort = g_Win64MultiplayerPort; - - swprintf(manual.hostName, 32, L"%hs:%d", g_Win64MultiplayerIP, g_Win64MultiplayerPort); - manual.hostName[31] = L'\0'; - manual.playerCount = 0; - manual.maxPlayers = MINECRAFT_NET_MAX_PLAYERS; - manual.isJoinable = true; - manual.lastSeenTick = GetTickCount(); - lanSessions.push_back(manual); - } - } - - for (size_t i = 0; i < friendsSessions[0].size(); i++) - delete friendsSessions[0][i]; - friendsSessions[0].clear(); - - for (size_t i = 0; i < lanSessions.size(); i++) - { - FriendSessionInfo *info = new FriendSessionInfo(); - size_t nameLen = wcslen(lanSessions[i].hostName); - info->displayLabel = new wchar_t[nameLen + 1]; - wcsncpy(info->displayLabel, lanSessions[i].hostName, nameLen); - info->displayLabel[nameLen] = L'\0'; - info->displayLabelLength = (unsigned char)nameLen; - info->displayLabelViewableStartIndex = 0; - - info->data.netVersion = lanSessions[i].netVersion; - info->data.m_uiGameHostSettings = lanSessions[i].gameHostSettings; - info->data.texturePackParentId = lanSessions[i].texturePackParentId; - info->data.subTexturePackId = lanSessions[i].subTexturePackId; - info->data.isReadyToJoin = lanSessions[i].isJoinable; - info->data.isJoinable = lanSessions[i].isJoinable; - strncpy(info->data.hostIP, lanSessions[i].hostIP, sizeof(info->data.hostIP) - 1); - info->data.hostIP[sizeof(info->data.hostIP) - 1] = '\0'; - info->data.hostPort = lanSessions[i].hostPort; - wcsncpy(info->data.hostName, lanSessions[i].hostName, XUSER_NAME_SIZE - 1); - info->data.hostName[XUSER_NAME_SIZE - 1] = L'\0'; - info->data.playerCount = lanSessions[i].playerCount; - info->data.maxPlayers = lanSessions[i].maxPlayers; - - memset(info->data.players, 0, sizeof(info->data.players)); - memset(info->data.szPlayers, 0, sizeof(info->data.szPlayers)); - for (int p = 0; p < MINECRAFT_NET_MAX_PLAYERS && p < lanSessions[i].playerCount; p++) - { - if (lanSessions[i].playerNames[p][0] != 0) - { - info->data.players[p] = (GameSessionUID)(p + 1); - memcpy(info->data.szPlayers[p], lanSessions[i].playerNames[p], XUSER_NAME_SIZE); - } - } - +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Socket.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "PlatformNetworkManager.h" +#include "..\..\Xbox\Network\NetworkPlayerXbox.h" // TODO - stub version of this? +#include "..\..\Minecraft.h" +#include "..\..\User.h" +#include "..\..\Common\Network\NetworkSocketLayer.h" + +CPlatformNetworkManagerStub *g_pPlatformNetworkManager; + + +void CPlatformNetworkManagerStub::NotifyPlayerJoined(IQNetPlayer *pQNetPlayer ) +{ + const char * pszDescription; + + // 4J Stu - We create a fake socket for every where that we need an INBOUND queue of game data. Outbound + // is all handled by QNet so we don't need that. Therefore each client player has one, and the host has one + // for each client player. + bool createFakeSocket = false; + bool localPlayer = false; + + NetworkPlayerXbox *networkPlayer = (NetworkPlayerXbox *)addNetworkPlayer(pQNetPlayer); + + if( pQNetPlayer->IsLocal() ) + { + localPlayer = true; + if( pQNetPlayer->IsHost() ) + { + pszDescription = "local host"; + // 4J Stu - No socket for the localhost as it uses a special loopback queue + + m_machineQNetPrimaryPlayers.push_back( pQNetPlayer ); + } + else + { + pszDescription = "local"; + + // We need an inbound queue on all local players to receive data from the host + createFakeSocket = true; + } + } + else + { + if( pQNetPlayer->IsHost() ) + { + pszDescription = "remote host"; + } + else + { + pszDescription = "remote"; + + // If we are the host, then create a fake socket for every remote player + if( m_pIQNet->IsHost() ) + { + createFakeSocket = true; + } + } + + if( m_pIQNet->IsHost() && !m_bHostChanged ) + { + // Do we already have a primary player for this system? + bool systemHasPrimaryPlayer = false; + for(AUTO_VAR(it, m_machineQNetPrimaryPlayers.begin()); it < m_machineQNetPrimaryPlayers.end(); ++it) + { + IQNetPlayer *pQNetPrimaryPlayer = *it; + if( pQNetPlayer->IsSameSystem(pQNetPrimaryPlayer) ) + { + systemHasPrimaryPlayer = true; + break; + } + } + if( !systemHasPrimaryPlayer ) + m_machineQNetPrimaryPlayers.push_back( pQNetPlayer ); + } + } + g_NetworkManager.PlayerJoining( networkPlayer ); + + if( createFakeSocket == true && !m_bHostChanged ) + { + g_NetworkManager.CreateSocket( networkPlayer, localPlayer ); + } + + app.DebugPrintf( "Player 0x%p \"%ls\" joined; %s; voice %i; camera %i.\n", + pQNetPlayer, + pQNetPlayer->GetGamertag(), + pszDescription, + (int) pQNetPlayer->HasVoice(), + (int) pQNetPlayer->HasCamera() ); + + + if( m_pIQNet->IsHost() ) + { + // 4J-PB - only the host should do this + g_NetworkManager.UpdateAndSetGameSessionData(); + SystemFlagAddPlayer( networkPlayer ); + } + + for( int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(playerChangedCallback[idx] != NULL) + playerChangedCallback[idx]( playerChangedCallbackParam[idx], networkPlayer, false ); + } + + if(m_pIQNet->GetState() == QNET_STATE_GAME_PLAY) + { + int localPlayerCount = 0; + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if( m_pIQNet->GetLocalPlayerByUserIndex(idx) != NULL ) ++localPlayerCount; + } + + float appTime = app.getAppTime(); + + // Only record stats for the primary player here + m_lastPlayerEventTimeStart = appTime; + } +} + +void CPlatformNetworkManagerStub::NotifyPlayerLeaving(IQNetPlayer *pQNetPlayer) +{ + app.DebugPrintf("Player 0x%p \"%ls\" leaving.\n", pQNetPlayer, pQNetPlayer->GetGamertag()); + + INetworkPlayer *networkPlayer = getNetworkPlayer(pQNetPlayer); + if (networkPlayer == NULL) + return; + + Socket *socket = networkPlayer->GetSocket(); + if (socket != NULL) + { + if (m_pIQNet->IsHost()) + g_NetworkManager.CloseConnection(networkPlayer); + } + + if (m_pIQNet->IsHost()) + { + SystemFlagRemovePlayer(networkPlayer); + } + + g_NetworkManager.PlayerLeaving(networkPlayer); + + if (m_pIQNet->IsHost()) + { + g_NetworkManager.UpdateAndSetGameSessionData(networkPlayer); + } + + for (int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if (playerChangedCallback[idx] != NULL) + playerChangedCallback[idx](playerChangedCallbackParam[idx], networkPlayer, true); + } + + removeNetworkPlayer(pQNetPlayer); +} + +bool CPlatformNetworkManagerStub::Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize) +{ + m_pGameNetworkManager = pGameNetworkManager; + m_flagIndexSize = flagIndexSize; + m_pIQNet = new IQNet(); + g_pPlatformNetworkManager = this; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + playerChangedCallback[ i ] = NULL; + } + + m_bLeavingGame = false; + m_bLeaveGameOnTick = false; + m_bHostChanged = false; + + m_bSearchResultsReady = false; + m_bSearchPending = false; + + m_bIsOfflineGame = false; + m_pSearchParam = NULL; + m_SessionsUpdatedCallback = NULL; + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_searchResultsCount[i] = 0; + m_lastSearchStartTime[i] = 0; + + // The results that will be filled in with the current search + m_pSearchResults[i] = NULL; + m_pQoSResult[i] = NULL; + m_pCurrentSearchResults[i] = NULL; + m_pCurrentQoSResult[i] = NULL; + m_currentSearchResultsCount[i] = 0; + } + + // Success! + return true; +} + +void CPlatformNetworkManagerStub::Terminate() +{ +} + +int CPlatformNetworkManagerStub::GetJoiningReadyPercentage() +{ + return 100; +} + +int CPlatformNetworkManagerStub::CorrectErrorIDS(int IDS) +{ + return IDS; +} + +bool CPlatformNetworkManagerStub::isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer) +{ + return true; +} + +// We call this twice a frame, either side of the render call so is a good place to "tick" things +void CPlatformNetworkManagerStub::DoWork() +{ + extern QNET_STATE _iQNetStubState; + if (_iQNetStubState == QNET_STATE_SESSION_STARTING && app.GetGameStarted()) + { + _iQNetStubState = QNET_STATE_GAME_PLAY; + if (m_pIQNet->IsHost()) + NetworkSocketLayer::UpdateAdvertiseJoinable(true); + } + if (_iQNetStubState == QNET_STATE_IDLE) + TickSearch(); + if (_iQNetStubState == QNET_STATE_GAME_PLAY && m_pIQNet->IsHost()) + { + BYTE disconnectedSmallId; + while (NetworkSocketLayer::PopDisconnectedSmallId(&disconnectedSmallId)) + { + IQNetPlayer *qnetPlayer = m_pIQNet->GetPlayerBySmallId(disconnectedSmallId); + if (qnetPlayer != NULL && qnetPlayer->m_smallId == disconnectedSmallId) + { + NotifyPlayerLeaving(qnetPlayer); + qnetPlayer->m_smallId = 0; + qnetPlayer->m_isRemote = false; + qnetPlayer->m_isHostPlayer = false; + qnetPlayer->m_gamertag[0] = 0; + qnetPlayer->SetCustomDataValue(0); + NetworkSocketLayer::PushFreeSmallId(disconnectedSmallId); + if (IQNet::s_playerCount > 1) + IQNet::s_playerCount--; + } + } + + for (int i = 1; i < MINECRAFT_NET_MAX_PLAYERS; i++) + { + IQNetPlayer *qp = &IQNet::m_player[i]; + if (qp->GetCustomDataValue() == 0) + continue; + INetworkPlayer *np = (INetworkPlayer *)qp->GetCustomDataValue(); + Socket *sock = np->GetSocket(); + if (sock != NULL && sock->isClosing()) + { + NetworkSocketLayer::CloseConnectionBySmallId((BYTE)i); + } + } + } + if (_iQNetStubState == QNET_STATE_GAME_PLAY && !m_pIQNet->IsHost()) + { + if (!NetworkSocketLayer::IsConnected() && !g_NetworkManager.IsLeavingGame()) + { + if (app.GetDisconnectReason() == DisconnectPacket::eDisconnect_None) + app.SetDisconnectReason(DisconnectPacket::eDisconnect_Quitting); + app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ExitWorld, (void *)TRUE); + } + } +} + +int CPlatformNetworkManagerStub::GetPlayerCount() +{ + return m_pIQNet->GetPlayerCount(); +} + +bool CPlatformNetworkManagerStub::ShouldMessageForFullSession() +{ + return false; +} + +int CPlatformNetworkManagerStub::GetOnlinePlayerCount() +{ + return 1; +} + +int CPlatformNetworkManagerStub::GetLocalPlayerMask(int playerIndex) +{ + return 1 << playerIndex; +} + +bool CPlatformNetworkManagerStub::AddLocalPlayerByUserIndex( int userIndex ) +{ + NotifyPlayerJoined(m_pIQNet->GetLocalPlayerByUserIndex(userIndex)); + return ( m_pIQNet->AddLocalPlayerByUserIndex(userIndex) == S_OK ); +} + +bool CPlatformNetworkManagerStub::RemoveLocalPlayerByUserIndex( int userIndex ) +{ + return true; +} + +bool CPlatformNetworkManagerStub::IsInStatsEnabledSession() +{ + return true; +} + +bool CPlatformNetworkManagerStub::SessionHasSpace(unsigned int spaceRequired /*= 1*/) +{ + return true; +} + +void CPlatformNetworkManagerStub::SendInviteGUI(int quadrant) +{ +} + +bool CPlatformNetworkManagerStub::IsAddingPlayer() +{ + return false; +} + +bool CPlatformNetworkManagerStub::LeaveGame(bool bMigrateHost) +{ + if( m_bLeavingGame ) return true; + + m_bLeavingGame = true; + NetworkSocketLayer::StopAdvertising(); + + // If we are the host wait for the game server to end + if(m_pIQNet->IsHost() && g_NetworkManager.ServerStoppedValid()) + { + m_pIQNet->EndGame(); + g_NetworkManager.ServerStoppedWait(); + g_NetworkManager.ServerStoppedDestroy(); + } + else + { + m_pIQNet->EndGame(); + } + + for (AUTO_VAR(it, currentNetworkPlayers.begin()); it != currentNetworkPlayers.end(); it++) + delete *it; + currentNetworkPlayers.clear(); + m_machineQNetPrimaryPlayers.clear(); + SystemFlagReset(); + + NetworkSocketLayer::Shutdown(); + NetworkSocketLayer::Initialize(); + + return true; +} + +bool CPlatformNetworkManagerStub::_LeaveGame(bool bMigrateHost, bool bLeaveRoom) +{ + return true; +} + +void CPlatformNetworkManagerStub::HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) +{ +// #ifdef _XBOX + // 4J Stu - We probably did this earlier as well, but just to be sure! + SetLocalGame( !bOnlineGame ); + SetPrivateGame( bIsPrivate ); + SystemFlagReset(); + + // Make sure that the Primary Pad is in by default + localUsersMask |= GetLocalPlayerMask( g_NetworkManager.GetPrimaryPad() ); + + m_bLeavingGame = false; + + m_pIQNet->HostGame(); + + IQNet::m_player[0].m_smallId = 0; + IQNet::m_player[0].m_isRemote = false; + IQNet::m_player[0].m_isHostPlayer = true; + IQNet::s_playerCount = 1; + + _HostGame( localUsersMask, publicSlots, privateSlots ); + + int port = NETWORK_LAN_DEFAULT_PORT; + if (!NetworkSocketLayer::IsActive()) + NetworkSocketLayer::HostGame(port); + + const wchar_t *hostName = IQNet::m_player[0].m_gamertag; + unsigned int settings = app.GetGameHostOption(eGameHostOption_All); + NetworkSocketLayer::StartAdvertising(port, hostName, settings, 0, 0, MINECRAFT_NET_VERSION); +//#endif +} + +void CPlatformNetworkManagerStub::_HostGame(int usersMask, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) +{ +} + +bool CPlatformNetworkManagerStub::_StartGame() +{ + return true; +} + +int CPlatformNetworkManagerStub::JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex) +{ + if (searchResult == NULL) + return CGameNetworkManager::JOINGAME_FAIL_GENERAL; + + const char *hostIP = searchResult->data.hostIP; + int hostPort = searchResult->data.hostPort; + + if (hostPort <= 0 || hostIP[0] == 0) + return CGameNetworkManager::JOINGAME_FAIL_GENERAL; + + m_bLeavingGame = false; + IQNet::s_isHosting = false; + m_pIQNet->ClientJoinGame(); + + IQNet::m_player[0].m_smallId = 0; + IQNet::m_player[0].m_isRemote = true; + IQNet::m_player[0].m_isHostPlayer = true; + wcsncpy(IQNet::m_player[0].m_gamertag, searchResult->data.hostName, 31); + + NetworkSocketLayer::StopDiscovery(); + + if (!NetworkSocketLayer::JoinGame(hostIP, hostPort)) + { + app.DebugPrintf("Win64 LAN: Failed to connect to %s:%d\n", hostIP, hostPort); + return CGameNetworkManager::JOINGAME_FAIL_GENERAL; + } + + BYTE localSmallId = NetworkSocketLayer::GetLocalSmallId(); + + IQNet::m_player[localSmallId].m_smallId = localSmallId; + IQNet::m_player[localSmallId].m_isRemote = false; + IQNet::m_player[localSmallId].m_isHostPlayer = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + wcsncpy(IQNet::m_player[localSmallId].m_gamertag, pMinecraft->user->name.c_str(), 32); + IQNet::s_playerCount = localSmallId + 1; + + NotifyPlayerJoined(&IQNet::m_player[0]); + NotifyPlayerJoined(&IQNet::m_player[localSmallId]); + + m_pGameNetworkManager->StateChange_AnyToStarting(); + + return CGameNetworkManager::JOINGAME_SUCCESS; +} + +bool CPlatformNetworkManagerStub::SetLocalGame(bool isLocal) +{ + m_bIsOfflineGame = isLocal; + + return true; +} + +void CPlatformNetworkManagerStub::SetPrivateGame(bool isPrivate) +{ + app.DebugPrintf("Setting as private game: %s\n", isPrivate ? "yes" : "no" ); + m_bIsPrivateGame = isPrivate; +} + +void CPlatformNetworkManagerStub::RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + playerChangedCallback[iPad] = callback; + playerChangedCallbackParam[iPad] = callbackParam; +} + +void CPlatformNetworkManagerStub::UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + if(playerChangedCallbackParam[iPad] == callbackParam) + { + playerChangedCallback[iPad] = NULL; + playerChangedCallbackParam[iPad] = NULL; + } +} + +void CPlatformNetworkManagerStub::HandleSignInChange() +{ + return; +} + +bool CPlatformNetworkManagerStub::_RunNetworkGame() +{ + extern QNET_STATE _iQNetStubState; + _iQNetStubState = QNET_STATE_GAME_PLAY; + + for (DWORD i = 0; i < IQNet::s_playerCount; i++) + { + if (IQNet::m_player[i].m_isRemote) + { + INetworkPlayer *pNetworkPlayer = getNetworkPlayer(&IQNet::m_player[i]); + if (pNetworkPlayer != NULL && pNetworkPlayer->GetSocket() != NULL) + { + Socket::addIncomingSocket(pNetworkPlayer->GetSocket()); + } + } + } + + return true; +} + +void CPlatformNetworkManagerStub::UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving /*= NULL*/) +{ + if (this->m_bLeavingGame) + return; + + if (!m_pIQNet->IsHost()) + return; + + DWORD playerCount = m_pIQNet->GetPlayerCount(); + + m_hostGameSessionData.m_uiGameHostSettings = app.GetGameHostOption(eGameHostOption_All); + m_hostGameSessionData.playerCount = (unsigned char)playerCount; + + for (unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if (i < playerCount) + { + INetworkPlayer *pNetworkPlayer = GetPlayerByIndex(i); + + if (pNetworkPlayer != NULL && pNetworkPlayer != pNetworkPlayerLeaving) + { + m_hostGameSessionData.players[i] = (GameSessionUID)(i + 1); + + const wchar_t *name = pNetworkPlayer->GetOnlineName(); + char nameBuf[XUSER_NAME_SIZE]; + memset(nameBuf, 0, sizeof(nameBuf)); + wcstombs(nameBuf, name, XUSER_NAME_SIZE - 1); + memcpy(m_hostGameSessionData.szPlayers[i], nameBuf, XUSER_NAME_SIZE); + } + else + { + m_hostGameSessionData.players[i] = 0; + memset(m_hostGameSessionData.szPlayers[i], 0, XUSER_NAME_SIZE); + } + } + else + { + m_hostGameSessionData.players[i] = 0; + memset(m_hostGameSessionData.szPlayers[i], 0, XUSER_NAME_SIZE); + } + } + + // update the LAN advertiser with current player names and count + NetworkSocketLayer::UpdateAdvertisePlayerNames(m_hostGameSessionData.playerCount, m_hostGameSessionData.szPlayers); +} + +int CPlatformNetworkManagerStub::RemovePlayerOnSocketClosedThreadProc( void* lpParam ) +{ + INetworkPlayer *pNetworkPlayer = (INetworkPlayer *)lpParam; + + Socket *socket = pNetworkPlayer->GetSocket(); + + if( socket != NULL ) + { + //printf("Waiting for socket closed event\n"); + socket->m_socketClosedEvent->WaitForSignal(INFINITE); + + //printf("Socket closed event has fired\n"); + // 4J Stu - Clear our reference to this socket + pNetworkPlayer->SetSocket( NULL ); + delete socket; + } + + return g_pPlatformNetworkManager->RemoveLocalPlayer( pNetworkPlayer ); +} + +bool CPlatformNetworkManagerStub::RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ) +{ + return true; +} + +CPlatformNetworkManagerStub::PlayerFlags::PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count) +{ + // 4J Stu - Don't assert, just make it a multiple of 8! This count is calculated from a load of separate values, + // and makes tweaking world/render sizes a pain if we hit an assert here + count = (count + 8 - 1) & ~(8 - 1); + //assert( ( count % 8 ) == 0 ); + this->m_pNetworkPlayer = pNetworkPlayer; + this->flags = new unsigned char [ count / 8 ]; + memset( this->flags, 0, count / 8 ); + this->count = count; +} +CPlatformNetworkManagerStub::PlayerFlags::~PlayerFlags() +{ + delete [] flags; +} + +// Add a player to the per system flag storage - if we've already got a player from that system, copy its flags over +void CPlatformNetworkManagerStub::SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer) +{ + PlayerFlags *newPlayerFlags = new PlayerFlags( pNetworkPlayer, m_flagIndexSize); + // If any of our existing players are on the same system, then copy over flags from that one + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) + { + memcpy( newPlayerFlags->flags, m_playerFlags[i]->flags, m_playerFlags[i]->count / 8 ); + break; + } + } + m_playerFlags.push_back(newPlayerFlags); +} + +// Remove a player from the per system flag storage - just maintains the m_playerFlags vector without any gaps in it +void CPlatformNetworkManagerStub::SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer) +{ + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) + { + delete m_playerFlags[i]; + m_playerFlags[i] = m_playerFlags.back(); + m_playerFlags.pop_back(); + return; + } + } +} + +void CPlatformNetworkManagerStub::SystemFlagReset() +{ + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + delete m_playerFlags[i]; + } + m_playerFlags.clear(); +} + +// Set a per system flag - this is done by setting the flag on every player that shares that system +void CPlatformNetworkManagerStub::SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index) +{ + if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return; + if( pNetworkPlayer == NULL ) return; + + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) + { + m_playerFlags[i]->flags[ index / 8 ] |= ( 128 >> ( index % 8 ) ); + } + } +} + +// Get value of a per system flag - can be read from the flags of the passed in player as anything else sent to that +// system should also have been duplicated here +bool CPlatformNetworkManagerStub::SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index) +{ + if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return false; + if( pNetworkPlayer == NULL ) + { + return false; + } + + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) + { + return ( ( m_playerFlags[i]->flags[ index / 8 ] & ( 128 >> ( index % 8 ) ) ) != 0 ); + } + } + return false; +} + +wstring CPlatformNetworkManagerStub::GatherStats() +{ + return L""; +} + +wstring CPlatformNetworkManagerStub::GatherRTTStats() +{ + wstring stats(L"Rtt: "); + + wchar_t stat[32]; + + for(unsigned int i = 0; i < GetPlayerCount(); ++i) + { + IQNetPlayer *pQNetPlayer = ((NetworkPlayerXbox *)GetPlayerByIndex( i ))->GetQNetPlayer(); + + if(!pQNetPlayer->IsLocal()) + { + ZeroMemory(stat,32*sizeof(WCHAR)); + swprintf(stat, 32, L"%d: %d/", i, pQNetPlayer->GetCurrentRtt() ); + stats.append(stat); + } + } + return stats; +} + +void CPlatformNetworkManagerStub::TickSearch() +{ + if (m_SessionsUpdatedCallback == NULL) + return; + + static DWORD lastSearchTime = 0; + DWORD now = GetTickCount(); + if (now - lastSearchTime < 2000) + return; + lastSearchTime = now; + + SearchForGames(); +} + +void CPlatformNetworkManagerStub::SearchForGames() +{ + std::vector lanSessions = NetworkSocketLayer::GetDiscoveredSessions(); + + if (g_MultiplayerJoin) + { + bool alreadyPresent = false; + for (size_t i = 0; i < lanSessions.size(); i++) + { + if (strcmp(lanSessions[i].hostIP, g_MultiplayerIP) == 0 && + lanSessions[i].hostPort == g_MultiplayerPort) + { + alreadyPresent = true; + break; + } + } + if (!alreadyPresent) + { + LANSession manual; + memset(&manual, 0, sizeof(manual)); + strncpy(manual.hostIP, g_MultiplayerIP, sizeof(manual.hostIP) - 1); + manual.hostIP[sizeof(manual.hostIP) - 1] = '\0'; + + manual.hostPort = g_MultiplayerPort; + + swprintf(manual.hostName, 32, L"%hs:%d", g_MultiplayerIP, g_MultiplayerPort); + manual.hostName[31] = L'\0'; + manual.playerCount = 0; + manual.maxPlayers = MINECRAFT_NET_MAX_PLAYERS; + manual.isJoinable = true; + manual.lastSeenTick = GetTickCount(); + lanSessions.push_back(manual); + } + } + + for (size_t i = 0; i < friendsSessions[0].size(); i++) + delete friendsSessions[0][i]; + friendsSessions[0].clear(); + + for (size_t i = 0; i < lanSessions.size(); i++) + { + FriendSessionInfo *info = new FriendSessionInfo(); + size_t nameLen = wcslen(lanSessions[i].hostName); + info->displayLabel = new wchar_t[nameLen + 1]; + wcsncpy(info->displayLabel, lanSessions[i].hostName, nameLen); + info->displayLabel[nameLen] = L'\0'; + info->displayLabelLength = (unsigned char)nameLen; + info->displayLabelViewableStartIndex = 0; + + info->data.netVersion = lanSessions[i].netVersion; + info->data.m_uiGameHostSettings = lanSessions[i].gameHostSettings; + info->data.texturePackParentId = lanSessions[i].texturePackParentId; + info->data.subTexturePackId = lanSessions[i].subTexturePackId; + info->data.isReadyToJoin = lanSessions[i].isJoinable; + info->data.isJoinable = lanSessions[i].isJoinable; + strncpy(info->data.hostIP, lanSessions[i].hostIP, sizeof(info->data.hostIP) - 1); + info->data.hostIP[sizeof(info->data.hostIP) - 1] = '\0'; + info->data.hostPort = lanSessions[i].hostPort; + wcsncpy(info->data.hostName, lanSessions[i].hostName, XUSER_NAME_SIZE - 1); + info->data.hostName[XUSER_NAME_SIZE - 1] = L'\0'; + info->data.playerCount = lanSessions[i].playerCount; + info->data.maxPlayers = lanSessions[i].maxPlayers; + + memset(info->data.players, 0, sizeof(info->data.players)); + memset(info->data.szPlayers, 0, sizeof(info->data.szPlayers)); + for (int p = 0; p < MINECRAFT_NET_MAX_PLAYERS && p < lanSessions[i].playerCount; p++) + { + if (lanSessions[i].playerNames[p][0] != 0) + { + info->data.players[p] = (GameSessionUID)(p + 1); + memcpy(info->data.szPlayers[p], lanSessions[i].playerNames[p], XUSER_NAME_SIZE); + } + } + #ifdef __ORBIS__ SceNetInAddr ip_addr = {}; sceNetInetPton(SCE_NET_AF_INET, lanSessions[i].hostIP, &ip_addr); info->sessionId = (ULONGLONG)((uint64_t)ip_addr.s_addr | ((uint64_t)lanSessions[i].hostPort << 32)); -#else - info->sessionId = (ULONGLONG)((unsigned __int64)inet_addr(lanSessions[i].hostIP) | ((unsigned __int64)lanSessions[i].hostPort << 32)); -#endif - friendsSessions[0].push_back(info); - } - - m_searchResultsCount[0] = (int)friendsSessions[0].size(); - - if (m_SessionsUpdatedCallback != NULL) - m_SessionsUpdatedCallback(m_pSearchParam); -} - -int CPlatformNetworkManagerStub::SearchForGamesThreadProc( void* lpParameter ) -{ - return 0; -} - -void CPlatformNetworkManagerStub::SetSearchResultsReady(int resultCount) -{ - m_bSearchResultsReady = true; - m_searchResultsCount[m_lastSearchPad] = resultCount; -} - -vector *CPlatformNetworkManagerStub::GetSessionList(int iPad, int localPlayers, bool partyOnly) -{ - vector *filteredList = new vector(); - for (size_t i = 0; i < friendsSessions[0].size(); i++) - filteredList->push_back(friendsSessions[0][i]); - return filteredList; -} - -bool CPlatformNetworkManagerStub::GetGameSessionInfo(int iPad, SessionID sessionId, FriendSessionInfo *foundSessionInfo) -{ - for (size_t i = 0; i < friendsSessions[0].size(); i++) - { - if (friendsSessions[0][i]->sessionId == sessionId) - { - if (foundSessionInfo != NULL) - { - foundSessionInfo->sessionId = friendsSessions[0][i]->sessionId; - foundSessionInfo->data = friendsSessions[0][i]->data; - foundSessionInfo->hasPartyMember = friendsSessions[0][i]->hasPartyMember; - } - return true; - } - } -} - -void CPlatformNetworkManagerStub::SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ) -{ - m_SessionsUpdatedCallback = SessionsUpdatedCallback; m_pSearchParam = pSearchParam; -} - -void CPlatformNetworkManagerStub::GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) -{ - FriendSessionUpdatedFn(true, pParam); -} - -void CPlatformNetworkManagerStub::ForceFriendsSessionRefresh() -{ - app.DebugPrintf("Resetting friends session search data\n"); - - for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) - { - m_searchResultsCount[i] = 0; - m_lastSearchStartTime[i] = 0; - delete m_pSearchResults[i]; - m_pSearchResults[i] = NULL; - } -} - -INetworkPlayer *CPlatformNetworkManagerStub::addNetworkPlayer(IQNetPlayer *pQNetPlayer) -{ - NetworkPlayerXbox *pNetworkPlayer = new NetworkPlayerXbox(pQNetPlayer); - pQNetPlayer->SetCustomDataValue((ULONG_PTR)pNetworkPlayer); - currentNetworkPlayers.push_back( pNetworkPlayer ); - return pNetworkPlayer; -} - -void CPlatformNetworkManagerStub::removeNetworkPlayer(IQNetPlayer *pQNetPlayer) -{ - INetworkPlayer *pNetworkPlayer = getNetworkPlayer(pQNetPlayer); - for( AUTO_VAR(it, currentNetworkPlayers.begin()); it != currentNetworkPlayers.end(); it++ ) - { - if( *it == pNetworkPlayer ) - { - currentNetworkPlayers.erase(it); - return; - } - } -} - -INetworkPlayer *CPlatformNetworkManagerStub::getNetworkPlayer(IQNetPlayer *pQNetPlayer) -{ - return pQNetPlayer ? (INetworkPlayer *)(pQNetPlayer->GetCustomDataValue()) : NULL; -} - - -INetworkPlayer *CPlatformNetworkManagerStub::GetLocalPlayerByUserIndex(int userIndex ) -{ - return getNetworkPlayer(m_pIQNet->GetLocalPlayerByUserIndex(userIndex)); -} - -INetworkPlayer *CPlatformNetworkManagerStub::GetPlayerByIndex(int playerIndex) -{ - return getNetworkPlayer(m_pIQNet->GetPlayerByIndex(playerIndex)); -} - -INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerByXuid(PlayerUID xuid) -{ - return getNetworkPlayer( m_pIQNet->GetPlayerByXuid(xuid)) ; -} - -INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerBySmallId(unsigned char smallId) -{ - IQNetPlayer *qnetPlayer = m_pIQNet->GetPlayerBySmallId(smallId); - if (qnetPlayer == NULL) - return NULL; - - INetworkPlayer *networkPlayer = getNetworkPlayer(qnetPlayer); - if (networkPlayer == NULL && smallId != 0 && !m_pIQNet->IsHost()) - { - qnetPlayer->m_isRemote = true; - qnetPlayer->m_isHostPlayer = false; - NotifyPlayerJoined(qnetPlayer); - networkPlayer = getNetworkPlayer(qnetPlayer); - } - return networkPlayer; -} - -INetworkPlayer *CPlatformNetworkManagerStub::GetHostPlayer() -{ - return getNetworkPlayer(m_pIQNet->GetHostPlayer()); -} - -bool CPlatformNetworkManagerStub::IsHost() -{ - return m_pIQNet->IsHost() && !m_bHostChanged; -} - -bool CPlatformNetworkManagerStub::JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo) -{ - return ( m_pIQNet->JoinGameFromInviteInfo( userIndex, userMask, pInviteInfo ) == S_OK); -} - -void CPlatformNetworkManagerStub::SetSessionTexturePackParentId( int id ) -{ - m_hostGameSessionData.texturePackParentId = id; -} - -void CPlatformNetworkManagerStub::SetSessionSubTexturePackId( int id ) -{ - m_hostGameSessionData.subTexturePackId = id; -} - -void CPlatformNetworkManagerStub::Notify(int ID, ULONG_PTR Param) -{ -} - -bool CPlatformNetworkManagerStub::IsInSession() -{ - return m_pIQNet->GetState() != QNET_STATE_IDLE; -} - -bool CPlatformNetworkManagerStub::IsInGameplay() -{ - return m_pIQNet->GetState() == QNET_STATE_GAME_PLAY; -} - -bool CPlatformNetworkManagerStub::IsReadyToPlayOrIdle() -{ - return true; -} +#else + info->sessionId = (ULONGLONG)((unsigned __int64)inet_addr(lanSessions[i].hostIP) | ((unsigned __int64)lanSessions[i].hostPort << 32)); +#endif + friendsSessions[0].push_back(info); + } + + m_searchResultsCount[0] = (int)friendsSessions[0].size(); + + if (m_SessionsUpdatedCallback != NULL) + m_SessionsUpdatedCallback(m_pSearchParam); +} + +int CPlatformNetworkManagerStub::SearchForGamesThreadProc( void* lpParameter ) +{ + return 0; +} + +void CPlatformNetworkManagerStub::SetSearchResultsReady(int resultCount) +{ + m_bSearchResultsReady = true; + m_searchResultsCount[m_lastSearchPad] = resultCount; +} + +vector *CPlatformNetworkManagerStub::GetSessionList(int iPad, int localPlayers, bool partyOnly) +{ + vector *filteredList = new vector(); + for (size_t i = 0; i < friendsSessions[0].size(); i++) + filteredList->push_back(friendsSessions[0][i]); + return filteredList; +} + +bool CPlatformNetworkManagerStub::GetGameSessionInfo(int iPad, SessionID sessionId, FriendSessionInfo *foundSessionInfo) +{ + for (size_t i = 0; i < friendsSessions[0].size(); i++) + { + if (friendsSessions[0][i]->sessionId == sessionId) + { + if (foundSessionInfo != NULL) + { + foundSessionInfo->sessionId = friendsSessions[0][i]->sessionId; + foundSessionInfo->data = friendsSessions[0][i]->data; + foundSessionInfo->hasPartyMember = friendsSessions[0][i]->hasPartyMember; + } + return true; + } + } +} + +void CPlatformNetworkManagerStub::SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ) +{ + m_SessionsUpdatedCallback = SessionsUpdatedCallback; m_pSearchParam = pSearchParam; +} + +void CPlatformNetworkManagerStub::GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) +{ + FriendSessionUpdatedFn(true, pParam); +} + +void CPlatformNetworkManagerStub::ForceFriendsSessionRefresh() +{ + app.DebugPrintf("Resetting friends session search data\n"); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_searchResultsCount[i] = 0; + m_lastSearchStartTime[i] = 0; + delete m_pSearchResults[i]; + m_pSearchResults[i] = NULL; + } +} + +INetworkPlayer *CPlatformNetworkManagerStub::addNetworkPlayer(IQNetPlayer *pQNetPlayer) +{ + NetworkPlayerXbox *pNetworkPlayer = new NetworkPlayerXbox(pQNetPlayer); + pQNetPlayer->SetCustomDataValue((ULONG_PTR)pNetworkPlayer); + currentNetworkPlayers.push_back( pNetworkPlayer ); + return pNetworkPlayer; +} + +void CPlatformNetworkManagerStub::removeNetworkPlayer(IQNetPlayer *pQNetPlayer) +{ + INetworkPlayer *pNetworkPlayer = getNetworkPlayer(pQNetPlayer); + for( AUTO_VAR(it, currentNetworkPlayers.begin()); it != currentNetworkPlayers.end(); it++ ) + { + if( *it == pNetworkPlayer ) + { + currentNetworkPlayers.erase(it); + return; + } + } +} + +INetworkPlayer *CPlatformNetworkManagerStub::getNetworkPlayer(IQNetPlayer *pQNetPlayer) +{ + return pQNetPlayer ? (INetworkPlayer *)(pQNetPlayer->GetCustomDataValue()) : NULL; +} + + +INetworkPlayer *CPlatformNetworkManagerStub::GetLocalPlayerByUserIndex(int userIndex ) +{ + return getNetworkPlayer(m_pIQNet->GetLocalPlayerByUserIndex(userIndex)); +} + +INetworkPlayer *CPlatformNetworkManagerStub::GetPlayerByIndex(int playerIndex) +{ + return getNetworkPlayer(m_pIQNet->GetPlayerByIndex(playerIndex)); +} + +INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerByXuid(PlayerUID xuid) +{ + return getNetworkPlayer( m_pIQNet->GetPlayerByXuid(xuid)) ; +} + +INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerBySmallId(unsigned char smallId) +{ + IQNetPlayer *qnetPlayer = m_pIQNet->GetPlayerBySmallId(smallId); + if (qnetPlayer == NULL) + return NULL; + + INetworkPlayer *networkPlayer = getNetworkPlayer(qnetPlayer); + if (networkPlayer == NULL && smallId != 0 && !m_pIQNet->IsHost()) + { + qnetPlayer->m_isRemote = true; + qnetPlayer->m_isHostPlayer = false; + NotifyPlayerJoined(qnetPlayer); + networkPlayer = getNetworkPlayer(qnetPlayer); + } + return networkPlayer; +} + +INetworkPlayer *CPlatformNetworkManagerStub::GetHostPlayer() +{ + return getNetworkPlayer(m_pIQNet->GetHostPlayer()); +} + +bool CPlatformNetworkManagerStub::IsHost() +{ + return m_pIQNet->IsHost() && !m_bHostChanged; +} + +bool CPlatformNetworkManagerStub::JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo) +{ + return ( m_pIQNet->JoinGameFromInviteInfo( userIndex, userMask, pInviteInfo ) == S_OK); +} + +void CPlatformNetworkManagerStub::SetSessionTexturePackParentId( int id ) +{ + m_hostGameSessionData.texturePackParentId = id; +} + +void CPlatformNetworkManagerStub::SetSessionSubTexturePackId( int id ) +{ + m_hostGameSessionData.subTexturePackId = id; +} + +void CPlatformNetworkManagerStub::Notify(int ID, ULONG_PTR Param) +{ +} + +bool CPlatformNetworkManagerStub::IsInSession() +{ + return m_pIQNet->GetState() != QNET_STATE_IDLE; +} + +bool CPlatformNetworkManagerStub::IsInGameplay() +{ + return m_pIQNet->GetState() == QNET_STATE_GAME_PLAY; +} + +bool CPlatformNetworkManagerStub::IsReadyToPlayOrIdle() +{ + return true; +} diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h b/Minecraft.Client/Common/Network/PlatformNetworkManager.h similarity index 97% rename from Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h rename to Minecraft.Client/Common/Network/PlatformNetworkManager.h index 1cfce001..919efd71 100644 --- a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h +++ b/Minecraft.Client/Common/Network/PlatformNetworkManager.h @@ -1,171 +1,171 @@ -#pragma once -using namespace std; -#include -#include "..\..\..\Minecraft.World\C4JThread.h" -#include "NetworkPlayerInterface.h" -#include "PlatformNetworkManagerInterface.h" -#include "SessionInfo.h" - -class CPlatformNetworkManagerStub : public CPlatformNetworkManager -{ - friend class CGameNetworkManager; -public: - virtual bool Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize); - virtual void Terminate(); - virtual int GetJoiningReadyPercentage(); - virtual int CorrectErrorIDS(int IDS); - - virtual void DoWork(); - virtual int GetPlayerCount(); - virtual int GetOnlinePlayerCount(); - virtual int GetLocalPlayerMask(int playerIndex); - virtual bool AddLocalPlayerByUserIndex( int userIndex ); - virtual bool RemoveLocalPlayerByUserIndex( int userIndex ); - virtual INetworkPlayer *GetLocalPlayerByUserIndex( int userIndex ); - virtual INetworkPlayer *GetPlayerByIndex(int playerIndex); - virtual INetworkPlayer * GetPlayerByXuid(PlayerUID xuid); - virtual INetworkPlayer * GetPlayerBySmallId(unsigned char smallId); - virtual bool ShouldMessageForFullSession(); - - virtual INetworkPlayer *GetHostPlayer(); - virtual bool IsHost(); - virtual bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo); - virtual bool LeaveGame(bool bMigrateHost); - - virtual bool IsInSession(); - virtual bool IsInGameplay(); - virtual bool IsReadyToPlayOrIdle(); - virtual bool IsInStatsEnabledSession(); - virtual bool SessionHasSpace(unsigned int spaceRequired = 1); - virtual void SendInviteGUI(int quadrant); - virtual bool IsAddingPlayer(); - - virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); - virtual int JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex ); - virtual bool SetLocalGame(bool isLocal); - virtual bool IsLocalGame() { return m_bIsOfflineGame; } - virtual void SetPrivateGame(bool isPrivate); - virtual bool IsPrivateGame() { return m_bIsPrivateGame; } - virtual bool IsLeavingGame() { return m_bLeavingGame; } - virtual void ResetLeavingGame() { m_bLeavingGame = false; } - - virtual void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); - virtual void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); - - virtual void HandleSignInChange(); - - virtual bool _RunNetworkGame(); - -private: - bool isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer); - virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom); - virtual void _HostGame(int dwUsersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); - virtual bool _StartGame(); - - IQNet * m_pIQNet; // pointer to QNet interface - - HANDLE m_notificationListener; - - vector m_machineQNetPrimaryPlayers; // collection of players that we deem to be the main one for that system - - bool m_bLeavingGame; - bool m_bLeaveGameOnTick; - bool m_migrateHostOnLeave; - bool m_bHostChanged; - - bool m_bIsOfflineGame; - bool m_bIsPrivateGame; - int m_flagIndexSize; - - // This is only maintained by the host, and is not valid on client machines - GameSessionData m_hostGameSessionData; - CGameNetworkManager *m_pGameNetworkManager; -public: - virtual void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL); - -private: - // TODO 4J Stu - Do we need to be able to have more than one of these? - void (*playerChangedCallback[XUSER_MAX_COUNT])(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); - void *playerChangedCallbackParam[XUSER_MAX_COUNT]; - - static int RemovePlayerOnSocketClosedThreadProc( void* lpParam ); - virtual bool RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ); - - // Things for handling per-system flags - class PlayerFlags - { - public: - INetworkPlayer *m_pNetworkPlayer; - unsigned char *flags; - unsigned int count; - PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count); - ~PlayerFlags(); - }; - vector m_playerFlags; - void SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer); - void SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer); - void SystemFlagReset(); -public: - virtual void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index); - virtual bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index); - - // For telemetry -private: - float m_lastPlayerEventTimeStart; - -public: - wstring GatherStats(); - wstring GatherRTTStats(); - -private: - vector friendsSessions[XUSER_MAX_COUNT]; - int m_searchResultsCount[XUSER_MAX_COUNT]; - int m_lastSearchStartTime[XUSER_MAX_COUNT]; - - // The results that will be filled in with the current search - XSESSION_SEARCHRESULT_HEADER *m_pSearchResults[XUSER_MAX_COUNT]; - XNQOS *m_pQoSResult[XUSER_MAX_COUNT]; - - // The results from the previous search, which are currently displayed in the game - XSESSION_SEARCHRESULT_HEADER *m_pCurrentSearchResults[XUSER_MAX_COUNT]; - XNQOS *m_pCurrentQoSResult[XUSER_MAX_COUNT]; - int m_currentSearchResultsCount[XUSER_MAX_COUNT]; - - int m_lastSearchPad; - bool m_bSearchResultsReady; - bool m_bSearchPending; - LPVOID m_pSearchParam; - void (*m_SessionsUpdatedCallback)(LPVOID pParam); - - C4JThread* m_SearchingThread; - - void TickSearch(); - void SearchForGames(); - static int SearchForGamesThreadProc( void* lpParameter ); - - void SetSearchResultsReady(int resultCount = 0); - - vectorcurrentNetworkPlayers; - INetworkPlayer *addNetworkPlayer(IQNetPlayer *pQNetPlayer); - void removeNetworkPlayer(IQNetPlayer *pQNetPlayer); - static INetworkPlayer *getNetworkPlayer(IQNetPlayer *pQNetPlayer); - - virtual void SetSessionTexturePackParentId( int id ); - virtual void SetSessionSubTexturePackId( int id ); - virtual void Notify(int ID, ULONG_PTR Param); - -public: - virtual vector *GetSessionList(int iPad, int localPlayers, bool partyOnly); - virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession); - virtual void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ); - virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); - virtual void ForceFriendsSessionRefresh(); - -public: - void NotifyPlayerJoined( IQNetPlayer *pQNetPlayer ); - void NotifyPlayerLeaving( IQNetPlayer *pQNetPlayer ); - -#ifndef _XBOX - void FakeLocalPlayerJoined() { NotifyPlayerJoined(m_pIQNet->GetLocalPlayerByUserIndex(0)); } -#endif -}; +#pragma once +using namespace std; +#include +#include "..\..\..\Minecraft.World\C4JThread.h" +#include "NetworkPlayerInterface.h" +#include "PlatformNetworkManagerInterface.h" +#include "SessionInfo.h" + +class CPlatformNetworkManagerStub : public CPlatformNetworkManager +{ + friend class CGameNetworkManager; +public: + virtual bool Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize); + virtual void Terminate(); + virtual int GetJoiningReadyPercentage(); + virtual int CorrectErrorIDS(int IDS); + + virtual void DoWork(); + virtual int GetPlayerCount(); + virtual int GetOnlinePlayerCount(); + virtual int GetLocalPlayerMask(int playerIndex); + virtual bool AddLocalPlayerByUserIndex( int userIndex ); + virtual bool RemoveLocalPlayerByUserIndex( int userIndex ); + virtual INetworkPlayer *GetLocalPlayerByUserIndex( int userIndex ); + virtual INetworkPlayer *GetPlayerByIndex(int playerIndex); + virtual INetworkPlayer * GetPlayerByXuid(PlayerUID xuid); + virtual INetworkPlayer * GetPlayerBySmallId(unsigned char smallId); + virtual bool ShouldMessageForFullSession(); + + virtual INetworkPlayer *GetHostPlayer(); + virtual bool IsHost(); + virtual bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo); + virtual bool LeaveGame(bool bMigrateHost); + + virtual bool IsInSession(); + virtual bool IsInGameplay(); + virtual bool IsReadyToPlayOrIdle(); + virtual bool IsInStatsEnabledSession(); + virtual bool SessionHasSpace(unsigned int spaceRequired = 1); + virtual void SendInviteGUI(int quadrant); + virtual bool IsAddingPlayer(); + + virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + virtual int JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex ); + virtual bool SetLocalGame(bool isLocal); + virtual bool IsLocalGame() { return m_bIsOfflineGame; } + virtual void SetPrivateGame(bool isPrivate); + virtual bool IsPrivateGame() { return m_bIsPrivateGame; } + virtual bool IsLeavingGame() { return m_bLeavingGame; } + virtual void ResetLeavingGame() { m_bLeavingGame = false; } + + virtual void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + virtual void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + + virtual void HandleSignInChange(); + + virtual bool _RunNetworkGame(); + +private: + bool isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer); + virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom); + virtual void _HostGame(int dwUsersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + virtual bool _StartGame(); + + IQNet * m_pIQNet; // pointer to QNet interface + + HANDLE m_notificationListener; + + vector m_machineQNetPrimaryPlayers; // collection of players that we deem to be the main one for that system + + bool m_bLeavingGame; + bool m_bLeaveGameOnTick; + bool m_migrateHostOnLeave; + bool m_bHostChanged; + + bool m_bIsOfflineGame; + bool m_bIsPrivateGame; + int m_flagIndexSize; + + // This is only maintained by the host, and is not valid on client machines + GameSessionData m_hostGameSessionData; + CGameNetworkManager *m_pGameNetworkManager; +public: + virtual void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL); + +private: + // TODO 4J Stu - Do we need to be able to have more than one of these? + void (*playerChangedCallback[XUSER_MAX_COUNT])(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + void *playerChangedCallbackParam[XUSER_MAX_COUNT]; + + static int RemovePlayerOnSocketClosedThreadProc( void* lpParam ); + virtual bool RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ); + + // Things for handling per-system flags + class PlayerFlags + { + public: + INetworkPlayer *m_pNetworkPlayer; + unsigned char *flags; + unsigned int count; + PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count); + ~PlayerFlags(); + }; + vector m_playerFlags; + void SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer); + void SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer); + void SystemFlagReset(); +public: + virtual void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index); + virtual bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index); + + // For telemetry +private: + float m_lastPlayerEventTimeStart; + +public: + wstring GatherStats(); + wstring GatherRTTStats(); + +private: + vector friendsSessions[XUSER_MAX_COUNT]; + int m_searchResultsCount[XUSER_MAX_COUNT]; + int m_lastSearchStartTime[XUSER_MAX_COUNT]; + + // The results that will be filled in with the current search + XSESSION_SEARCHRESULT_HEADER *m_pSearchResults[XUSER_MAX_COUNT]; + XNQOS *m_pQoSResult[XUSER_MAX_COUNT]; + + // The results from the previous search, which are currently displayed in the game + XSESSION_SEARCHRESULT_HEADER *m_pCurrentSearchResults[XUSER_MAX_COUNT]; + XNQOS *m_pCurrentQoSResult[XUSER_MAX_COUNT]; + int m_currentSearchResultsCount[XUSER_MAX_COUNT]; + + int m_lastSearchPad; + bool m_bSearchResultsReady; + bool m_bSearchPending; + LPVOID m_pSearchParam; + void (*m_SessionsUpdatedCallback)(LPVOID pParam); + + C4JThread* m_SearchingThread; + + void TickSearch(); + void SearchForGames(); + static int SearchForGamesThreadProc( void* lpParameter ); + + void SetSearchResultsReady(int resultCount = 0); + + vectorcurrentNetworkPlayers; + INetworkPlayer *addNetworkPlayer(IQNetPlayer *pQNetPlayer); + void removeNetworkPlayer(IQNetPlayer *pQNetPlayer); + static INetworkPlayer *getNetworkPlayer(IQNetPlayer *pQNetPlayer); + + virtual void SetSessionTexturePackParentId( int id ); + virtual void SetSessionSubTexturePackId( int id ); + virtual void Notify(int ID, ULONG_PTR Param); + +public: + virtual vector *GetSessionList(int iPad, int localPlayers, bool partyOnly); + virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession); + virtual void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ); + virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); + virtual void ForceFriendsSessionRefresh(); + +public: + void NotifyPlayerJoined( IQNetPlayer *pQNetPlayer ); + void NotifyPlayerLeaving( IQNetPlayer *pQNetPlayer ); + +#ifndef _XBOX + void FakeLocalPlayerJoined() { NotifyPlayerJoined(m_pIQNet->GetLocalPlayerByUserIndex(0)); } +#endif +}; diff --git a/Minecraft.Client/Extrax64Stubs.cpp b/Minecraft.Client/Extrax64Stubs.cpp index cd8b4cd3..1c8df457 100644 --- a/Minecraft.Client/Extrax64Stubs.cpp +++ b/Minecraft.Client/Extrax64Stubs.cpp @@ -5,7 +5,7 @@ #ifdef __PS3__ #include "PS3\Sentient\SentientManager.h" -#include "Common\Network\WinsockNetLayer.h" +#include "Common\Network\NetworkSocketLayer.h" #include "StatsCounter.h" #include "PS3\Social\SocialManager.h" #include @@ -18,7 +18,7 @@ #include "Durango\DurangoExtras\xcompress.h" #elif defined _WINDOWS64 #include "Windows64\Sentient\SentientManager.h" -#include "Common\Network\WinsockNetLayer.h" +#include "Common\Network\NetworkSocketLayer.h" #include "StatsCounter.h" #include "Windows64\Social\SocialManager.h" #include "Windows64\Sentient\DynamicConfigurations.h" @@ -43,7 +43,7 @@ #endif #if defined(DISABLE_PSN) || defined(_DISABLE_XBLIVE) -#include "Common\Network\WinsockNetLayer.h" +#include "Common\Network\NetworkSocketLayer.h" #endif #ifndef _DISABLE_XBLIVE @@ -425,9 +425,9 @@ void C_4JProfile::Initialise( DWORD dwTitleID, BYTE IQNetPlayer::GetSmallId() { return m_smallId; } void IQNetPlayer::SendData(IQNetPlayer *player, const void *pvData, DWORD dwDataSize, DWORD dwFlags) { - if (WinsockNetLayer::IsActive()) + if (NetworkSocketLayer::IsActive()) { - WinsockNetLayer::SendToSmallId(player->m_smallId, pvData, dwDataSize); + NetworkSocketLayer::SendToSmallId(player->m_smallId, pvData, dwDataSize); } } bool IQNetPlayer::IsSameSystem(IQNetPlayer *player) { return (this == player) || (!m_isRemote && !player->m_isRemote); } @@ -593,7 +593,7 @@ void C_4JProfile::GetXUID(int iPad, PlayerUID *pXuid,bool bOnlineXuid) if (IQNet::s_isHosting) *pXuid = 0xe000d45248242f2e; else - *pXuid = 0xe000d45248242f2e + WinsockNetLayer::GetLocalSmallId(); + *pXuid = 0xe000d45248242f2e + NetworkSocketLayer::GetLocalSmallId(); } BOOL C_4JProfile::AreXUIDSEqual(PlayerUID xuid1,PlayerUID xuid2) { return xuid1 == xuid2; } BOOL C_4JProfile::XUIDIsGuest(PlayerUID xuid) { return false; } diff --git a/Minecraft.Client/Minecraft.Client.vcxproj b/Minecraft.Client/Minecraft.Client.vcxproj index 5d741989..50472670 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -3840,7 +3840,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU - + true true true @@ -4041,7 +4041,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + @@ -20929,7 +20929,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue - + true true true @@ -21131,7 +21131,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.filters b/Minecraft.Client/Minecraft.Client.vcxproj.filters index 949aa288..ff5a19d4 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj.filters +++ b/Minecraft.Client/Minecraft.Client.vcxproj.filters @@ -3110,9 +3110,6 @@ Xbox\Source Files\Network - - Common\Source Files\Network - Xbox\Source Files\Network @@ -3779,10 +3776,13 @@ PSVita - + Common\Source Files\Network - + + Common\Source Files\Network + + Common\Source Files\Network @@ -5335,9 +5335,6 @@ Xbox\Source Files\Network - - Common\Source Files\Network - Xbox\Source Files\Network @@ -5929,7 +5926,10 @@ PSVita - + + Common\Source Files\Network + + Common\Source Files\Network diff --git a/Minecraft.Client/Orbis/Orbis_Minecraft.cpp b/Minecraft.Client/Orbis/Orbis_Minecraft.cpp index e1d5ffd5..d2366fbd 100644 --- a/Minecraft.Client/Orbis/Orbis_Minecraft.cpp +++ b/Minecraft.Client/Orbis/Orbis_Minecraft.cpp @@ -43,7 +43,7 @@ #include "Network/Orbis_NPToolkit.h" #include "Orbis\Network\SonyVoiceChat_Orbis.h" #else -#include "..\..\Minecraft.Client\Common\Network\WinsockNetLayer.h" +#include "..\..\Minecraft.Client\Common\Network\NetworkSocketLayer.h" #endif #define THEME_NAME "584111F70AAAAAAA" diff --git a/Minecraft.Client/PS3/PS3_Minecraft.cpp b/Minecraft.Client/PS3/PS3_Minecraft.cpp index 6f6859aa..cf47bbb7 100644 --- a/Minecraft.Client/PS3/PS3_Minecraft.cpp +++ b/Minecraft.Client/PS3/PS3_Minecraft.cpp @@ -24,7 +24,7 @@ SYS_PROCESS_PARAM(1001, 0x10000); // thread priority, and stack size #include #include "PS3/Network/SonyRemoteStorage_PS3.h" -#include "..\..\Minecraft.Client\Common\Network\WinsockNetLayer.h" +#include "..\..\Minecraft.Client\Common\Network\NetworkSocketLayer.h" // define to use spurs (otherwise SPU threads or raw will be used) #define USE_SPURS @@ -1129,7 +1129,7 @@ int main() if(ShutdownManager::ShouldRun(ShutdownManager::eMainThread)) { g_NetworkManager.Initialise(); - WinsockNetLayer::Initialize(); + NetworkSocketLayer::Initialize(); g_NetworkManager.SetLocalGame(true); } diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index ecd036e1..9a45bb88 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -37,7 +37,7 @@ #include "Resource.h" #include "..\..\Minecraft.World\compression.h" #include "..\..\Minecraft.World\OldChunkStorage.h" -#include "..\..\Minecraft.Client\Common\Network\WinsockNetLayer.h" +#include "..\..\Minecraft.Client\Common\Network\NetworkSocketLayer.h" #include "Xbox/resource.h" @@ -661,8 +661,8 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, int n = 0; while (ipArg[n] && ipArg[n] != ' ' && n < 255) { ipBuf[n] = ipArg[n]; n++; } ipBuf[n] = 0; - strncpy_s(g_Win64MultiplayerIP, 256, ipBuf, _TRUNCATE); - g_Win64MultiplayerJoin = true; + strncpy_s(g_MultiplayerIP, 256, ipBuf, _TRUNCATE); + g_MultiplayerJoin = true; } char *portArg = strstr(cmdLineA, "-port "); @@ -674,8 +674,8 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, int n = 0; while (portArg[n] && portArg[n] != ' ' && n < 15) { portBuf[n] = portArg[n]; n++; } portBuf[n] = 0; - g_Win64MultiplayerPort = atoi(portBuf); - if (g_Win64MultiplayerPort <= 0) g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; + g_MultiplayerPort = atoi(portBuf); + if (g_MultiplayerPort <= 0) g_MultiplayerPort = NETWORK_LAN_DEFAULT_PORT; } } @@ -860,7 +860,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, extern wchar_t g_Win64UsernameW[17]; wcscpy_s(IQNet::m_player[0].m_gamertag, 32, g_Win64UsernameW); - WinsockNetLayer::Initialize(); + NetworkSocketLayer::Initialize(); // 4J-PB moved further down //app.InitGameSettings();