add: Dedicated Server implementation

- Introduced `ServerMain.cpp` for the dedicated server logic, handling command-line arguments, server initialization, and network management.
- Created `postbuild_server.ps1` script for post-build tasks, including copying necessary resources and DLLs for the dedicated server.
- Added `CopyServerAssets.cmake` to manage the copying of server assets during the build process, ensuring required files are available for the dedicated server.
- Defined project filters in `Minecraft.Server.vcxproj.filters` for better organization of server-related files.
This commit is contained in:
kuwacom 2026-03-04 18:12:26 +09:00
parent a97ee4aab1
commit e4c8229e52
14 changed files with 1610 additions and 180 deletions

9
.gitignore vendored
View file

@ -423,6 +423,12 @@ Minecraft.World/x64_Debug/
Minecraft.World/Release/ Minecraft.World/Release/
Minecraft.World/x64_Release/ Minecraft.World/x64_Release/
Minecraft.Server/x64/
Minecraft.Server/Debug/
Minecraft.Server/x64_Debug/
Minecraft.Server/Release/
Minecraft.Server/x64_Release/
build/* build/*
# Existing build output files # Existing build output files
@ -433,3 +439,6 @@ build/*
# Local saves # Local saves
Minecraft.Client/Saves/ Minecraft.Client/Saves/
tmp*/
_server_asset_probe/

View file

@ -88,6 +88,58 @@ target_link_libraries(MinecraftClient PRIVATE
> >
) )
set(MINECRAFT_SERVER_SOURCES ${MINECRAFT_CLIENT_SOURCES})
list(APPEND MINECRAFT_SERVER_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Windows64/ServerMain.cpp"
)
add_executable(MinecraftServer ${MINECRAFT_SERVER_SOURCES})
target_include_directories(MinecraftServer PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/include"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Xbox/Sentient/Include"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.World/x64headers"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Windows64"
)
target_compile_definitions(MinecraftServer PRIVATE
$<$<CONFIG:Debug>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64>
$<$<NOT:$<CONFIG:Debug>>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64>
)
if(MSVC)
configure_msvc_target(MinecraftServer)
target_link_options(MinecraftServer PRIVATE
$<$<CONFIG:Release>:/LTCG /INCREMENTAL:NO>
)
endif()
set_target_properties(MinecraftServer PROPERTIES
OUTPUT_NAME "Minecraft.Server"
VS_DEBUGGER_WORKING_DIRECTORY "$<TARGET_FILE_DIR:MinecraftServer>"
VS_DEBUGGER_COMMAND_ARGUMENTS "-port 25565 -bind 0.0.0.0 -name DedicatedServer"
)
target_link_libraries(MinecraftServer PRIVATE
MinecraftWorld
d3d11
XInput9_1_0
wsock32
legacy_stdio_definitions
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggy_w64.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggyperfmon_w64.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggyexpruntime_w64.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Miles/lib/mss64.lib"
$<$<CONFIG:Debug>:
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input_d.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage_d.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Render_PC_d.lib"
>
$<$<NOT:$<CONFIG:Debug>>:
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Render_PC.lib"
>
)
add_custom_command(TARGET MinecraftClient POST_BUILD add_custom_command(TARGET MinecraftClient POST_BUILD
COMMAND "${CMAKE_COMMAND}" COMMAND "${CMAKE_COMMAND}"
-DPROJECT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}" -DPROJECT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
@ -97,4 +149,13 @@ add_custom_command(TARGET MinecraftClient POST_BUILD
VERBATIM VERBATIM
) )
set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT MinecraftClient) add_custom_command(TARGET MinecraftServer POST_BUILD
COMMAND "${CMAKE_COMMAND}"
-DPROJECT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
-DOUTPUT_DIR="$<TARGET_FILE_DIR:MinecraftServer>"
-DCONFIGURATION=$<CONFIG>
-P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyServerAssets.cmake"
VERBATIM
)
set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT MinecraftServer)

View file

@ -3,7 +3,9 @@
## Visual Studio (`.sln`) ## Visual Studio (`.sln`)
1. Open `MinecraftConsoles.sln` in Visual Studio 2022. 1. Open `MinecraftConsoles.sln` in Visual Studio 2022.
2. Set `Minecraft.Client` as the Startup Project. 2. Set Startup Project:
- Client: `Minecraft.Client`
- Dedicated server: `Minecraft.Server`
3. Select configuration: 3. Select configuration:
- `Debug` (recommended), or - `Debug` (recommended), or
- `Release` - `Release`
@ -12,6 +14,17 @@
- `Build > Build Solution` (or `Ctrl+Shift+B`) - `Build > Build Solution` (or `Ctrl+Shift+B`)
- Start debugging with `F5`. - Start debugging with `F5`.
### Dedicated server debug arguments
- Default debugger arguments for `Minecraft.Server`:
- `-port 25565 -bind 0.0.0.0 -name DedicatedServer`
- You can override arguments in:
- `Project Properties > Debugging > Command Arguments`
- `Minecraft.Server` post-build copies only the dedicated-server asset set:
- `Common/Media/MediaWindows64.arc`
- `Common/res`
- `Windows64/GameHDD`
## CMake (Windows x64) ## CMake (Windows x64)
Configure (use your VS Community instance explicitly): Configure (use your VS Community instance explicitly):
@ -32,6 +45,18 @@ Build Release:
cmake --build build --config Release --target MinecraftClient cmake --build build --config Release --target MinecraftClient
``` ```
Build Dedicated Server (Debug):
```powershell
cmake --build build --config Debug --target MinecraftServer
```
Build Dedicated Server (Release):
```powershell
cmake --build build --config Release --target MinecraftServer
```
Run executable: Run executable:
```powershell ```powershell
@ -39,6 +64,13 @@ cd .\build\Debug
.\MinecraftClient.exe .\MinecraftClient.exe
``` ```
Run dedicated server:
```powershell
cd .\build\Debug
.\Minecraft.Server.exe -port 25565 -bind 0.0.0.0 -name DedicatedServer
```
Notes: Notes:
- The CMake build is Windows-only and x64-only. - The CMake build is Windows-only and x64-only.
- Contributors on macOS or Linux need a Windows machine or VM to build the project. Running the game via Wine is separate from having a supported build environment. - Contributors on macOS or Linux need a Windows machine or VM to build the project. Running the game via Wine is separate from having a supported build environment.

View file

@ -195,10 +195,12 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame
#endif #endif
__int64 seed = 0; __int64 seed = 0;
bool dedicatedNoLocalHostPlayer = false;
if(lpParameter != NULL) if(lpParameter != NULL)
{ {
NetworkGameInitData *param = (NetworkGameInitData *)lpParameter; NetworkGameInitData *param = (NetworkGameInitData *)lpParameter;
seed = param->seed; seed = param->seed;
dedicatedNoLocalHostPlayer = param->dedicatedNoLocalHostPlayer;
app.setLevelGenerationOptions(param->levelGen); app.setLevelGenerationOptions(param->levelGen);
if(param->levelGen != NULL) if(param->levelGen != NULL)
@ -354,186 +356,199 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame
// PRIMARY PLAYER // PRIMARY PLAYER
vector<ClientConnection *> createdConnections; vector<ClientConnection *> createdConnections;
ClientConnection *connection; ClientConnection *connection = NULL;
if( g_NetworkManager.IsHost() ) if( g_NetworkManager.IsHost() && dedicatedNoLocalHostPlayer )
{ {
connection = new ClientConnection(minecraft, NULL); app.DebugPrintf("Dedicated server mode: skipping local host client connection\n");
}
else
{
INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(ProfileManager.GetLockedProfile());
if(pNetworkPlayer == NULL)
{
MinecraftServer::HaltServer();
app.DebugPrintf("%d\n",ProfileManager.GetLockedProfile());
// If the player is NULL here then something went wrong in the session setup, and continuing will end up in a crash
return false;
}
Socket *socket = pNetworkPlayer->GetSocket(); // Keep telemetry behavior consistent with host path.
// Fix for #13259 - CRASH: Gameplay: loading process is halted when player loads saved data
if(socket == NULL)
{
assert(false);
MinecraftServer::HaltServer();
// If the socket is NULL here then something went wrong in the session setup, and continuing will end up in a crash
return false;
}
connection = new ClientConnection(minecraft, socket);
}
if( !connection->createdOk )
{
assert(false);
delete connection;
connection = NULL;
MinecraftServer::HaltServer();
return false;
}
connection->send( shared_ptr<PreLoginPacket>( new PreLoginPacket(minecraft->user->name) ) );
// Tick connection until we're ready to go. The stages involved in this are:
// (1) Creating the ClientConnection sends a prelogin packet to the server
// (2) the server sends a prelogin back, which is handled by the clientConnection, and returns a login packet
// (3) the server sends a login back, which is handled by the client connection to start the game
if( !g_NetworkManager.IsHost() )
{
Minecraft::GetInstance()->progressRenderer->progressStart(IDS_PROGRESS_CONNECTING);
}
else
{
// 4J Stu - Host needs to generate a unique multiplayer id for sentient telemetry reporting
INT multiplayerInstanceId = TelemetryManager->GenerateMultiplayerInstanceId(); INT multiplayerInstanceId = TelemetryManager->GenerateMultiplayerInstanceId();
TelemetryManager->SetMultiplayerInstanceId(multiplayerInstanceId); TelemetryManager->SetMultiplayerInstanceId(multiplayerInstanceId);
}
TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
do
{
app.DebugPrintf("ticking connection A\n");
connection->tick();
// 4J Stu - We were ticking this way too fast which could cause the connection to time out
// The connections should tick at 20 per second
Sleep(50);
} while ( (IsInSession() && !connection->isStarted() && !connection->isClosed() && !g_NetworkManager.IsLeavingGame()) || tPack->isLoadingData() || (Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()) );
ui.CleanUpSkinReload();
// 4J Stu - Fix for #11279 - CRASH: TCR 001: BAS Game Stability: Signing out of game will cause title to crash
// We need to break out of the above loop if m_bLeavingGame is set, and close the connection
if( g_NetworkManager.IsLeavingGame() || !IsInSession() )
{
connection->close();
}
if( connection->isStarted() && !connection->isClosed() )
{
createdConnections.push_back( connection );
int primaryPad = ProfileManager.GetPrimaryPad();
app.SetRichPresenceContext(primaryPad,CONTEXT_GAME_STATE_BLANK);
if (GetPlayerCount() > 1) // Are we offline or online, and how many players are there
{
if (IsLocalGame()) ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false);
else ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER,false);
}
else
{
if(IsLocalGame()) ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false);
else ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER_1P,false);
}
// ALL OTHER LOCAL PLAYERS
for(int idx = 0; idx < XUSER_MAX_COUNT; ++idx)
{
// Already have setup the primary pad
if(idx == ProfileManager.GetPrimaryPad() ) continue;
if( GetLocalPlayerByUserIndex(idx) != NULL && !ProfileManager.IsSignedIn(idx) )
{
INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(idx);
Socket *socket = pNetworkPlayer->GetSocket();
app.DebugPrintf("Closing socket due to player %d not being signed in any more\n");
if( !socket->close(false) ) socket->close(true);
continue;
}
// By default when we host we only have the local player, but currently allow multiple local players to join
// when joining any other way, so just because they are signed in doesn't mean they are in the session
// 4J Stu - If they are in the session, then we should add them to the game. Otherwise we won't be able to add them later
INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(idx);
if( pNetworkPlayer == NULL )
continue;
ClientConnection *connection;
Socket *socket = pNetworkPlayer->GetSocket();
connection = new ClientConnection(minecraft, socket, idx);
minecraft->addPendingLocalConnection(idx, connection);
//minecraft->createExtraLocalPlayer(idx, (convStringToWstring( ProfileManager.GetGamertag(idx) )).c_str(), idx, connection);
// Open the socket on the server end to accept incoming data
Socket::addIncomingSocket(socket);
connection->send( shared_ptr<PreLoginPacket>( new PreLoginPacket(convStringToWstring( ProfileManager.GetGamertag(idx) )) ) );
createdConnections.push_back( connection );
// Tick connection until we're ready to go. The stages involved in this are:
// (1) Creating the ClientConnection sends a prelogin packet to the server
// (2) the server sends a prelogin back, which is handled by the clientConnection, and returns a login packet
// (3) the server sends a login back, which is handled by the client connection to start the game
do
{
// We need to keep ticking the connections for players that already logged in
for(AUTO_VAR(it, createdConnections.begin()); it < createdConnections.end(); ++it)
{
(*it)->tick();
}
// 4J Stu - We were ticking this way too fast which could cause the connection to time out
// The connections should tick at 20 per second
Sleep(50);
app.DebugPrintf("<***> %d %d %d %d %d\n",IsInSession(), !connection->isStarted(),!connection->isClosed(),ProfileManager.IsSignedIn(idx),!g_NetworkManager.IsLeavingGame());
#if defined _XBOX || __PS3__
} while (IsInSession() && !connection->isStarted() && !connection->isClosed() && ProfileManager.IsSignedIn(idx) && !g_NetworkManager.IsLeavingGame() );
#else
// TODO - This SHOULD be something just like the code above but temporarily changing here so that we don't have to depend on the profilemanager behaviour
} while (IsInSession() && !connection->isStarted() && !connection->isClosed() && !g_NetworkManager.IsLeavingGame() );
#endif
// 4J Stu - Fix for #11279 - CRASH: TCR 001: BAS Game Stability: Signing out of game will cause title to crash
// We need to break out of the above loop if m_bLeavingGame is set, and stop creating new connections
// The connections in the createdConnections vector get closed at the end of the thread
if( g_NetworkManager.IsLeavingGame() || !IsInSession() ) break;
if( ProfileManager.IsSignedIn(idx) && !connection->isClosed() )
{
app.SetRichPresenceContext(idx,CONTEXT_GAME_STATE_BLANK);
if (IsLocalGame()) ProfileManager.SetCurrentGameActivity(idx,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false);
else ProfileManager.SetCurrentGameActivity(idx,CONTEXT_PRESENCE_MULTIPLAYER,false);
}
else
{
connection->close();
AUTO_VAR(it, find( createdConnections.begin(), createdConnections.end(), connection ));
if(it != createdConnections.end() ) createdConnections.erase( it );
}
}
app.SetGameMode( eMode_Multiplayer ); app.SetGameMode( eMode_Multiplayer );
} }
else if ( connection->isClosed() || !IsInSession()) else
{ {
// assert(false); if( g_NetworkManager.IsHost() )
MinecraftServer::HaltServer(); {
return false; connection = new ClientConnection(minecraft, NULL);
}
else
{
INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(ProfileManager.GetLockedProfile());
if(pNetworkPlayer == NULL)
{
MinecraftServer::HaltServer();
app.DebugPrintf("%d\n",ProfileManager.GetLockedProfile());
// If the player is NULL here then something went wrong in the session setup, and continuing will end up in a crash
return false;
}
Socket *socket = pNetworkPlayer->GetSocket();
// Fix for #13259 - CRASH: Gameplay: loading process is halted when player loads saved data
if(socket == NULL)
{
assert(false);
MinecraftServer::HaltServer();
// If the socket is NULL here then something went wrong in the session setup, and continuing will end up in a crash
return false;
}
connection = new ClientConnection(minecraft, socket);
}
if( !connection->createdOk )
{
assert(false);
delete connection;
connection = NULL;
MinecraftServer::HaltServer();
return false;
}
connection->send( shared_ptr<PreLoginPacket>( new PreLoginPacket(minecraft->user->name) ) );
// Tick connection until we're ready to go. The stages involved in this are:
// (1) Creating the ClientConnection sends a prelogin packet to the server
// (2) the server sends a prelogin back, which is handled by the clientConnection, and returns a login packet
// (3) the server sends a login back, which is handled by the client connection to start the game
if( !g_NetworkManager.IsHost() )
{
Minecraft::GetInstance()->progressRenderer->progressStart(IDS_PROGRESS_CONNECTING);
}
else
{
// 4J Stu - Host needs to generate a unique multiplayer id for sentient telemetry reporting
INT multiplayerInstanceId = TelemetryManager->GenerateMultiplayerInstanceId();
TelemetryManager->SetMultiplayerInstanceId(multiplayerInstanceId);
}
TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected();
do
{
app.DebugPrintf("ticking connection A\n");
connection->tick();
// 4J Stu - We were ticking this way too fast which could cause the connection to time out
// The connections should tick at 20 per second
Sleep(50);
} while ( (IsInSession() && !connection->isStarted() && !connection->isClosed() && !g_NetworkManager.IsLeavingGame()) || tPack->isLoadingData() || (Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()) );
ui.CleanUpSkinReload();
// 4J Stu - Fix for #11279 - CRASH: TCR 001: BAS Game Stability: Signing out of game will cause title to crash
// We need to break out of the above loop if m_bLeavingGame is set, and close the connection
if( g_NetworkManager.IsLeavingGame() || !IsInSession() )
{
connection->close();
}
if( connection->isStarted() && !connection->isClosed() )
{
createdConnections.push_back( connection );
int primaryPad = ProfileManager.GetPrimaryPad();
app.SetRichPresenceContext(primaryPad,CONTEXT_GAME_STATE_BLANK);
if (GetPlayerCount() > 1) // Are we offline or online, and how many players are there
{
if (IsLocalGame()) ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false);
else ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER,false);
}
else
{
if(IsLocalGame()) ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false);
else ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER_1P,false);
}
// ALL OTHER LOCAL PLAYERS
for(int idx = 0; idx < XUSER_MAX_COUNT; ++idx)
{
// Already have setup the primary pad
if(idx == ProfileManager.GetPrimaryPad() ) continue;
if( GetLocalPlayerByUserIndex(idx) != NULL && !ProfileManager.IsSignedIn(idx) )
{
INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(idx);
Socket *socket = pNetworkPlayer->GetSocket();
app.DebugPrintf("Closing socket due to player %d not being signed in any more\n");
if( !socket->close(false) ) socket->close(true);
continue;
}
// By default when we host we only have the local player, but currently allow multiple local players to join
// when joining any other way, so just because they are signed in doesn't mean they are in the session
// 4J Stu - If they are in the session, then we should add them to the game. Otherwise we won't be able to add them later
INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(idx);
if( pNetworkPlayer == NULL )
continue;
ClientConnection *connection;
Socket *socket = pNetworkPlayer->GetSocket();
connection = new ClientConnection(minecraft, socket, idx);
minecraft->addPendingLocalConnection(idx, connection);
//minecraft->createExtraLocalPlayer(idx, (convStringToWstring( ProfileManager.GetGamertag(idx) )).c_str(), idx, connection);
// Open the socket on the server end to accept incoming data
Socket::addIncomingSocket(socket);
connection->send( shared_ptr<PreLoginPacket>( new PreLoginPacket(convStringToWstring( ProfileManager.GetGamertag(idx) )) ) );
createdConnections.push_back( connection );
// Tick connection until we're ready to go. The stages involved in this are:
// (1) Creating the ClientConnection sends a prelogin packet to the server
// (2) the server sends a prelogin back, which is handled by the clientConnection, and returns a login packet
// (3) the server sends a login back, which is handled by the client connection to start the game
do
{
// We need to keep ticking the connections for players that already logged in
for(AUTO_VAR(it, createdConnections.begin()); it < createdConnections.end(); ++it)
{
(*it)->tick();
}
// 4J Stu - We were ticking this way too fast which could cause the connection to time out
// The connections should tick at 20 per second
Sleep(50);
app.DebugPrintf("<***> %d %d %d %d %d\n",IsInSession(), !connection->isStarted(),!connection->isClosed(),ProfileManager.IsSignedIn(idx),!g_NetworkManager.IsLeavingGame());
#if defined _XBOX || __PS3__
} while (IsInSession() && !connection->isStarted() && !connection->isClosed() && ProfileManager.IsSignedIn(idx) && !g_NetworkManager.IsLeavingGame() );
#else
// TODO - This SHOULD be something just like the code above but temporarily changing here so that we don't have to depend on the profilemanager behaviour
} while (IsInSession() && !connection->isStarted() && !connection->isClosed() && !g_NetworkManager.IsLeavingGame() );
#endif
// 4J Stu - Fix for #11279 - CRASH: TCR 001: BAS Game Stability: Signing out of game will cause title to crash
// We need to break out of the above loop if m_bLeavingGame is set, and stop creating new connections
// The connections in the createdConnections vector get closed at the end of the thread
if( g_NetworkManager.IsLeavingGame() || !IsInSession() ) break;
if( ProfileManager.IsSignedIn(idx) && !connection->isClosed() )
{
app.SetRichPresenceContext(idx,CONTEXT_GAME_STATE_BLANK);
if (IsLocalGame()) ProfileManager.SetCurrentGameActivity(idx,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false);
else ProfileManager.SetCurrentGameActivity(idx,CONTEXT_PRESENCE_MULTIPLAYER,false);
}
else
{
connection->close();
AUTO_VAR(it, find( createdConnections.begin(), createdConnections.end(), connection ));
if(it != createdConnections.end() ) createdConnections.erase( it );
}
}
app.SetGameMode( eMode_Multiplayer );
}
else if ( connection->isClosed() || !IsInSession())
{
// assert(false);
MinecraftServer::HaltServer();
return false;
}
} }

View file

@ -361,9 +361,13 @@ void CPlatformNetworkManagerStub::HostGame(int localUsersMask, bool bOnlineGame,
_HostGame( localUsersMask, publicSlots, privateSlots ); _HostGame( localUsersMask, publicSlots, privateSlots );
#ifdef _WINDOWS64 #ifdef _WINDOWS64
int port = WIN64_NET_DEFAULT_PORT; int port = (g_Win64MultiplayerPort > 0) ? g_Win64MultiplayerPort : WIN64_NET_DEFAULT_PORT;
const char *bindIP = g_Win64MultiplayerIP;
if (bindIP != NULL && bindIP[0] == 0)
bindIP = NULL;
if (!WinsockNetLayer::IsActive()) if (!WinsockNetLayer::IsActive())
WinsockNetLayer::HostGame(port); WinsockNetLayer::HostGame(bindIP, port);
const wchar_t* hostName = IQNet::m_player[0].m_gamertag; const wchar_t* hostName = IQNet::m_player[0].m_gamertag;
unsigned int settings = app.GetGameHostOption(eGameHostOption_All); unsigned int settings = app.GetGameHostOption(eGameHostOption_All);

View file

@ -40,6 +40,7 @@ typedef struct _NetworkGameInitData
LevelGenerationOptions *levelGen; LevelGenerationOptions *levelGen;
DWORD texturePackId; DWORD texturePackId;
bool findSeed; bool findSeed;
bool dedicatedNoLocalHostPlayer;
unsigned int xzSize; unsigned int xzSize;
unsigned char hellScale; unsigned char hellScale;
ESavePlatform savePlatform; ESavePlatform savePlatform;
@ -52,6 +53,7 @@ typedef struct _NetworkGameInitData
levelGen = NULL; levelGen = NULL;
texturePackId = 0; texturePackId = 0;
findSeed = false; findSeed = false;
dedicatedNoLocalHostPlayer = false;
xzSize = LEVEL_LEGACY_WIDTH; xzSize = LEVEL_LEGACY_WIDTH;
hellScale = HELL_LEVEL_LEGACY_SCALE; hellScale = HELL_LEVEL_LEGACY_SCALE;
savePlatform = SAVE_FILE_PLATFORM_LOCAL; savePlatform = SAVE_FILE_PLATFORM_LOCAL;

View file

@ -47,7 +47,7 @@ std::vector<BYTE> WinsockNetLayer::s_freeSmallIds;
bool g_Win64MultiplayerHost = false; bool g_Win64MultiplayerHost = false;
bool g_Win64MultiplayerJoin = false; bool g_Win64MultiplayerJoin = false;
int g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; int g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT;
char g_Win64MultiplayerIP[256] = "127.0.0.1"; char g_Win64MultiplayerIP[256] = "0.0.0.0";
bool WinsockNetLayer::Initialize() bool WinsockNetLayer::Initialize()
{ {
@ -137,6 +137,11 @@ void WinsockNetLayer::Shutdown()
} }
bool WinsockNetLayer::HostGame(int port) bool WinsockNetLayer::HostGame(int port)
{
return HostGame(NULL, port);
}
bool WinsockNetLayer::HostGame(const char *bindIp, int port)
{ {
if (!s_initialized && !Initialize()) return false; if (!s_initialized && !Initialize()) return false;
@ -161,10 +166,16 @@ bool WinsockNetLayer::HostGame(int port)
char portStr[16]; char portStr[16];
sprintf_s(portStr, "%d", port); sprintf_s(portStr, "%d", port);
int iResult = getaddrinfo(NULL, portStr, &hints, &result); const char *bindNode = NULL;
if (bindIp != NULL && bindIp[0] != 0 && strcmp(bindIp, "*") != 0)
{
bindNode = bindIp;
}
int iResult = getaddrinfo(bindNode, portStr, &hints, &result);
if (iResult != 0) if (iResult != 0)
{ {
app.DebugPrintf("getaddrinfo failed: %d\n", iResult); app.DebugPrintf("getaddrinfo failed for bind '%s': %d\n", bindNode ? bindNode : "0.0.0.0", iResult);
return false; return false;
} }
@ -203,7 +214,7 @@ bool WinsockNetLayer::HostGame(int port)
s_acceptThread = CreateThread(NULL, 0, AcceptThreadProc, NULL, 0, NULL); s_acceptThread = CreateThread(NULL, 0, AcceptThreadProc, NULL, 0, NULL);
app.DebugPrintf("Win64 LAN: Hosting on port %d\n", port); app.DebugPrintf("Win64 LAN: Hosting on %s:%d\n", bindNode ? bindNode : "0.0.0.0", port);
return true; return true;
} }

View file

@ -62,6 +62,7 @@ public:
static bool Initialize(); static bool Initialize();
static void Shutdown(); static void Shutdown();
static bool HostGame(const char *bindIp, int port);
static bool HostGame(int port); static bool HostGame(int port);
static bool JoinGame(const char *ip, int port); static bool JoinGame(const char *ip, int port);

View file

@ -0,0 +1,672 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>MinecraftServer</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
<Import Project="$(VCTargetsPath)\BuildCustomizations\masm.props" />
</ImportGroup>
<ImportGroup Label="Shared" />
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir)$(Platform)\Minecraft.Server\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)$(Platform)\Minecraft.Server\$(Configuration)\obj\MinecraftServer\</IntDir>
<TargetName>Minecraft.Server</TargetName>
<LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>
<LocalDebuggerCommandArguments>-port 25565 -bind 0.0.0.0 -name DedicatedServer</LocalDebuggerCommandArguments>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)$(Platform)\Minecraft.Server\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)$(Platform)\Minecraft.Server\$(Configuration)\obj\MinecraftServer\</IntDir>
<TargetName>Minecraft.Server</TargetName>
<LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>
<LocalDebuggerCommandArguments>-port 25565 -bind 0.0.0.0 -name DedicatedServer</LocalDebuggerCommandArguments>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderOutputFile>$(OutDir)MinecraftServer.pch</PrecompiledHeaderOutputFile>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<ExceptionHandling>Sync</ExceptionHandling>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<PreprocessorDefinitions>_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\Minecraft.Client;..\Minecraft.Client\Windows64\Iggy\include;..\Minecraft.Client\Xbox\Sentient\Include;..\Minecraft.World\x64headers;$(ProjectDir)Windows64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<MASM>
<UseSafeExceptionHandlers>false</UseSafeExceptionHandlers>
</MASM>
<ResourceCompile>
<PreprocessorDefinitions>_WINDOWS64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\Minecraft.Client;..\Minecraft.Client\Xbox;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<SubSystem>Console</SubSystem>
<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>d3d11.lib;XInput9_1_0.lib;wsock32.lib;legacy_stdio_definitions.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;..\Minecraft.Client\Windows64\Iggy\lib\iggy_w64.lib;..\Minecraft.Client\Windows64\Iggy\lib\iggyperfmon_w64.lib;..\Minecraft.Client\Windows64\Iggy\lib\iggyexpruntime_w64.lib;..\Minecraft.Client\Windows64\Miles\lib\mss64.lib;..\Minecraft.Client\Windows64\4JLibs\libs\4J_Input_d.lib;..\Minecraft.Client\Windows64\4JLibs\libs\4J_Storage_d.lib;..\Minecraft.Client\Windows64\4JLibs\libs\4J_Render_PC_d.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>powershell -ExecutionPolicy Bypass -File "$(ProjectDir)Windows64\postbuild_server.ps1" -OutDir "$(OutDir)." -ProjectRoot "$(ProjectDir).." -Configuration "$(Configuration)"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderOutputFile>$(OutDir)MinecraftServer.pch</PrecompiledHeaderOutputFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<ExceptionHandling>Sync</ExceptionHandling>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<PreprocessorDefinitions>_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\Minecraft.Client;..\Minecraft.Client\Windows64\Iggy\include;..\Minecraft.Client\Xbox\Sentient\Include;..\Minecraft.World\x64headers;$(ProjectDir)Windows64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<MASM>
<UseSafeExceptionHandlers>false</UseSafeExceptionHandlers>
</MASM>
<ResourceCompile>
<PreprocessorDefinitions>_WINDOWS64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\Minecraft.Client;..\Minecraft.Client\Xbox;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<SubSystem>Console</SubSystem>
<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>d3d11.lib;XInput9_1_0.lib;wsock32.lib;legacy_stdio_definitions.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;..\Minecraft.Client\Windows64\Iggy\lib\iggy_w64.lib;..\Minecraft.Client\Windows64\Iggy\lib\iggyperfmon_w64.lib;..\Minecraft.Client\Windows64\Iggy\lib\iggyexpruntime_w64.lib;..\Minecraft.Client\Windows64\Miles\lib\mss64.lib;..\Minecraft.Client\Windows64\4JLibs\libs\4J_Input.lib;..\Minecraft.Client\Windows64\4JLibs\libs\4J_Storage.lib;..\Minecraft.Client\Windows64\4JLibs\libs\4J_Render_PC.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>powershell -ExecutionPolicy Bypass -File "$(ProjectDir)Windows64\postbuild_server.ps1" -OutDir "$(OutDir)." -ProjectRoot "$(ProjectDir).." -Configuration "$(Configuration)"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\Minecraft.Client\AbstractTexturePack.cpp" />
<ClCompile Include="..\Minecraft.Client\AchievementPopup.cpp" />
<ClCompile Include="..\Minecraft.Client\AchievementScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\AllowAllCuller.cpp" />
<ClCompile Include="..\Minecraft.Client\ArchiveFile.cpp" />
<ClCompile Include="..\Minecraft.Client\ArrowRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\BatModel.cpp" />
<ClCompile Include="..\Minecraft.Client\BatRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\BeaconRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\BlazeModel.cpp" />
<ClCompile Include="..\Minecraft.Client\BlazeRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\BoatModel.cpp" />
<ClCompile Include="..\Minecraft.Client\BoatRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\BookModel.cpp" />
<ClCompile Include="..\Minecraft.Client\BossMobGuiInfo.cpp" />
<ClCompile Include="..\Minecraft.Client\BreakingItemParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\BubbleParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\BufferedImage.cpp" />
<ClCompile Include="..\Minecraft.Client\Button.cpp" />
<ClCompile Include="..\Minecraft.Client\Camera.cpp" />
<ClCompile Include="..\Minecraft.Client\CaveSpiderRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\ChatScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\ChestModel.cpp" />
<ClCompile Include="..\Minecraft.Client\ChestRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\ChickenModel.cpp" />
<ClCompile Include="..\Minecraft.Client\ChickenRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\Chunk.cpp" />
<ClCompile Include="..\Minecraft.Client\ClientConnection.cpp" />
<ClCompile Include="..\Minecraft.Client\ClientConstants.cpp" />
<ClCompile Include="..\Minecraft.Client\ClockTexture.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Audio\Consoles_SoundEngine.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Audio\SoundEngine.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Audio\SoundNames.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Colours\ColourTable.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\ConsoleGameMode.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Console_Utils.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Consoles_App.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCAudioFile.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCCapeFile.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCColourTableFile.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCFile.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCGameRulesFile.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCGameRulesHeader.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCLocalisationFile.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCManager.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCPack.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCSkinFile.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCTextureFile.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\DLC\DLCUIDataFile.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\AddEnchantmentRuleDefinition.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\AddItemRuleDefinition.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\ApplySchematicRuleDefinition.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\BiomeOverride.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\CollectItemRuleDefinition.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\CompleteAllRuleDefinition.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\CompoundGameRuleDefinition.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\ConsoleGenerateStructure.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\ConsoleSchematicFile.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\GameRule.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\GameRuleDefinition.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\GameRuleManager.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\LevelGenerationOptions.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\LevelGenerators.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\LevelRules.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\LevelRuleset.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\NamedAreaRuleDefinition.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\StartFeature.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\UpdatePlayerRuleDefinition.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\UseTileRuleDefinition.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\XboxStructureActionGenerateBox.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\XboxStructureActionPlaceBlock.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\XboxStructureActionPlaceContainer.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\GameRules\XboxStructureActionPlaceSpawner.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Leaderboards\LeaderboardInterface.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Leaderboards\LeaderboardManager.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Network\GameNetworkManager.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Network\PlatformNetworkManagerStub.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Telemetry\TelemetryManager.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Trial\TrialMode.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\AreaConstraint.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\AreaHint.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\AreaTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\ChangeStateConstraint.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\ChoiceTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\CompleteUsingItemTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\ControllerTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\CraftTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\DiggerItemHint.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\EffectChangedTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\FullTutorial.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\FullTutorialActiveTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\FullTutorialMode.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\HorseChoiceTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\InfoTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\InputConstraint.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\LookAtEntityHint.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\LookAtTileHint.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\PickupTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\ProcedureCompoundTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\ProgressFlagTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\RideEntityTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\StatTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\TakeItemHint.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\Tutorial.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\TutorialHint.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\TutorialMessage.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\TutorialMode.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\TutorialTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\UseItemTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\UseTileTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\Tutorial\XuiCraftingTask.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_AbstractContainerMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_AnvilMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_BeaconMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_BrewingMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_CommandBlockMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_ContainerMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_CraftingMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_CreativeMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_DispenserMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_EnchantingMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_FireworksMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_FurnaceMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_HUD.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_HopperMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_HorseInventoryMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_InventoryMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_PauseMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_StartGame.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\IUIScene_TradingMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIBitmapFont.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIComponent_Chat.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIComponent_DebugUIConsole.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIComponent_DebugUIMarketingGuide.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIComponent_Logo.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIComponent_MenuBackground.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIComponent_Panorama.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIComponent_PressStartToPlay.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIComponent_Tooltips.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIComponent_TutorialPopup.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_Base.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_BeaconEffectButton.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_BitmapIcon.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_Button.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_ButtonList.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_CheckBox.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_Cursor.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_DLCList.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_DynamicLabel.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_EnchantmentBook.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_EnchantmentButton.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_HTMLLabel.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_Label.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_LeaderboardList.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_MinecraftHorse.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_MinecraftPlayer.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_PlayerList.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_PlayerSkinPreview.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_Progress.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_SaveList.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_Slider.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_SlotList.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_SpaceIndicatorBar.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_TextInput.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIControl_TexturePackList.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIController.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIFontData.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIGroup.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UILayer.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_AbstractContainerMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_AnvilMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_BeaconMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_BrewingStandMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_ConnectingProgress.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_ContainerMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_ControlsMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_CraftingMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_CreateWorldMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_CreativeMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_Credits.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_DLCMainMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_DLCOffersMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_DeathMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_DebugCreateSchematic.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_DebugOptions.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_DebugOverlay.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_DebugSetCamera.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_DispenserMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_EULA.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_EnchantingMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_EndPoem.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_FireworksMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_FullscreenProgress.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_FurnaceMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_HUD.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_HelpAndOptionsMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_HopperMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_HorseInventoryMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_HowToPlay.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_HowToPlayMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_InGameHostOptionsMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_InGameInfoMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_InGamePlayerOptionsMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_Intro.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_InventoryMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_JoinMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_Keyboard.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_LanguageSelector.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_LaunchMoreOptionsMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_LeaderboardsMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_LoadMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_LoadOrJoinMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_MainMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_MessageBox.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_NewUpdateMessage.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_PauseMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_QuadrantSignin.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_ReinstallMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_SaveMessage.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_SettingsAudioMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_SettingsControlMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_SettingsGraphicsMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_SettingsMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_SettingsOptionsMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_SettingsUIMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_SignEntryMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_SkinSelectMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_TeleportMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_Timer.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_TradingMenu.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIScene_TrialExitUpsell.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UIString.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\UI\UITTFFont.cpp" />
<ClCompile Include="..\Minecraft.Client\Common\zlib\adler32.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\compress.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\crc32.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\deflate.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\gzclose.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\gzlib.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\gzread.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\gzwrite.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\infback.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\inffast.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\inflate.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\inftrees.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\trees.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\uncompr.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\Common\zlib\zutil.c">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\CompassTexture.cpp" />
<ClCompile Include="..\Minecraft.Client\ConfirmScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\ConsoleInput.cpp" />
<ClCompile Include="..\Minecraft.Client\ControlsScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\CowModel.cpp" />
<ClCompile Include="..\Minecraft.Client\CowRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\CreateWorldScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\CreeperModel.cpp" />
<ClCompile Include="..\Minecraft.Client\CreeperRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\CritParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\CritParticle2.cpp" />
<ClCompile Include="..\Minecraft.Client\Cube.cpp" />
<ClCompile Include="..\Minecraft.Client\DLCTexturePack.cpp" />
<ClCompile Include="..\Minecraft.Client\DeathScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\DefaultRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\DefaultTexturePack.cpp" />
<ClCompile Include="..\Minecraft.Client\DemoUser.cpp" />
<ClCompile Include="..\Minecraft.Client\DerivedServerLevel.cpp" />
<ClCompile Include="..\Minecraft.Client\DirtyChunkSorter.cpp" />
<ClCompile Include="..\Minecraft.Client\DispenserBootstrap.cpp" />
<ClCompile Include="..\Minecraft.Client\DistanceChunkSorter.cpp" />
<ClCompile Include="..\Minecraft.Client\DragonBreathParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\DragonModel.cpp" />
<ClCompile Include="..\Minecraft.Client\DripParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\EchantmentTableParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\EditBox.cpp" />
<ClCompile Include="..\Minecraft.Client\EnchantTableRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\EnderChestRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\EnderCrystalModel.cpp" />
<ClCompile Include="..\Minecraft.Client\EnderCrystalRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\EnderDragonRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\EnderParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\EndermanModel.cpp" />
<ClCompile Include="..\Minecraft.Client\EndermanRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\EntityRenderDispatcher.cpp" />
<ClCompile Include="..\Minecraft.Client\EntityRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\EntityTileRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\EntityTracker.cpp" />
<ClCompile Include="..\Minecraft.Client\ErrorScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\ExperienceOrbRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\ExplodeParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\Extrax64Stubs.cpp" />
<ClCompile Include="..\Minecraft.Client\FallingTileRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\FileTexturePack.cpp" />
<ClCompile Include="..\Minecraft.Client\FireballRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\FireworksParticles.cpp" />
<ClCompile Include="..\Minecraft.Client\FishingHookRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\FlameParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\FolderTexturePack.cpp" />
<ClCompile Include="..\Minecraft.Client\Font.cpp" />
<ClCompile Include="..\Minecraft.Client\FootstepParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\Frustum.cpp" />
<ClCompile Include="..\Minecraft.Client\FrustumCuller.cpp" />
<ClCompile Include="..\Minecraft.Client\FrustumData.cpp" />
<ClCompile Include="..\Minecraft.Client\GameRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\GhastModel.cpp" />
<ClCompile Include="..\Minecraft.Client\GhastRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\GiantMobRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\Gui.cpp" />
<ClCompile Include="..\Minecraft.Client\GuiComponent.cpp" />
<ClCompile Include="..\Minecraft.Client\GuiMessage.cpp" />
<ClCompile Include="..\Minecraft.Client\GuiParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\GuiParticles.cpp" />
<ClCompile Include="..\Minecraft.Client\HeartParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\HorseRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\HttpTexture.cpp" />
<ClCompile Include="..\Minecraft.Client\HugeExplosionParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\HugeExplosionSeedParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\HumanoidMobRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\HumanoidModel.cpp" />
<ClCompile Include="..\Minecraft.Client\InBedChatScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\Input.cpp" />
<ClCompile Include="..\Minecraft.Client\ItemFrameRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\ItemInHandRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\ItemRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\ItemSpriteRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\JoinMultiplayerScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\KeyMapping.cpp" />
<ClCompile Include="..\Minecraft.Client\LargeChestModel.cpp" />
<ClCompile Include="..\Minecraft.Client\LavaParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\LavaSlimeModel.cpp" />
<ClCompile Include="..\Minecraft.Client\LavaSlimeRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\LeashKnotModel.cpp" />
<ClCompile Include="..\Minecraft.Client\LeashKnotRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\LevelRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\Lighting.cpp" />
<ClCompile Include="..\Minecraft.Client\LightningBoltRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\LivingEntityRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\LocalPlayer.cpp" />
<ClCompile Include="..\Minecraft.Client\MemTexture.cpp" />
<ClCompile Include="..\Minecraft.Client\MemoryTracker.cpp" />
<ClCompile Include="..\Minecraft.Client\MinecartModel.cpp" />
<ClCompile Include="..\Minecraft.Client\MinecartRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\MinecartSpawnerRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\Minecraft.cpp" />
<ClCompile Include="..\Minecraft.Client\MinecraftServer.cpp" />
<ClCompile Include="..\Minecraft.Client\Minimap.cpp" />
<ClCompile Include="..\Minecraft.Client\MobRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\MobSkinMemTextureProcessor.cpp" />
<ClCompile Include="..\Minecraft.Client\MobSkinTextureProcessor.cpp" />
<ClCompile Include="..\Minecraft.Client\MobSpawnerRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\Model.cpp" />
<ClCompile Include="..\Minecraft.Client\ModelHorse.cpp" />
<ClCompile Include="..\Minecraft.Client\ModelPart.cpp" />
<ClCompile Include="..\Minecraft.Client\MultiPlayerChunkCache.cpp" />
<ClCompile Include="..\Minecraft.Client\MultiPlayerGameMode.cpp" />
<ClCompile Include="..\Minecraft.Client\MultiPlayerLevel.cpp" />
<ClCompile Include="..\Minecraft.Client\MultiPlayerLocalPlayer.cpp" />
<ClCompile Include="..\Minecraft.Client\MushroomCowRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\NameEntryScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\NetherPortalParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\NoteParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\OcelotModel.cpp" />
<ClCompile Include="..\Minecraft.Client\OcelotRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\OffsettedRenderList.cpp" />
<ClCompile Include="..\Minecraft.Client\Options.cpp" />
<ClCompile Include="..\Minecraft.Client\OptionsScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\PS3\PS3Extras\ShutdownManager.cpp" />
<ClCompile Include="..\Minecraft.Client\PaintingRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\Particle.cpp" />
<ClCompile Include="..\Minecraft.Client\ParticleEngine.cpp" />
<ClCompile Include="..\Minecraft.Client\PauseScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\PendingConnection.cpp" />
<ClCompile Include="..\Minecraft.Client\PigModel.cpp" />
<ClCompile Include="..\Minecraft.Client\PigRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\PistonPieceRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\PlayerChunkMap.cpp" />
<ClCompile Include="..\Minecraft.Client\PlayerCloudParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\PlayerConnection.cpp" />
<ClCompile Include="..\Minecraft.Client\PlayerList.cpp" />
<ClCompile Include="..\Minecraft.Client\PlayerRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\Polygon.cpp" />
<ClCompile Include="..\Minecraft.Client\PreStitchedTextureMap.cpp" />
<ClCompile Include="..\Minecraft.Client\ProgressRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\QuadrupedModel.cpp" />
<ClCompile Include="..\Minecraft.Client\Rect2i.cpp" />
<ClCompile Include="..\Minecraft.Client\RedDustParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\RemotePlayer.cpp" />
<ClCompile Include="..\Minecraft.Client\RenameWorldScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\Screen.cpp" />
<ClCompile Include="..\Minecraft.Client\ScreenSizeCalculator.cpp" />
<ClCompile Include="..\Minecraft.Client\ScrolledSelectionList.cpp" />
<ClCompile Include="..\Minecraft.Client\SelectWorldScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\ServerChunkCache.cpp" />
<ClCompile Include="..\Minecraft.Client\ServerCommandDispatcher.cpp" />
<ClCompile Include="..\Minecraft.Client\ServerConnection.cpp" />
<ClCompile Include="..\Minecraft.Client\ServerLevel.cpp" />
<ClCompile Include="..\Minecraft.Client\ServerLevelListener.cpp" />
<ClCompile Include="..\Minecraft.Client\ServerPlayer.cpp" />
<ClCompile Include="..\Minecraft.Client\ServerPlayerGameMode.cpp" />
<ClCompile Include="..\Minecraft.Client\ServerScoreboard.cpp" />
<ClCompile Include="..\Minecraft.Client\Settings.cpp" />
<ClCompile Include="..\Minecraft.Client\SheepFurModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SheepModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SheepRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\SignModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SignRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\SilverfishModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SilverfishRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\SimpleIcon.cpp" />
<ClCompile Include="..\Minecraft.Client\SkeletonHeadModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SkeletonModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SkeletonRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\SkiModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SkullTileRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\SlideButton.cpp" />
<ClCompile Include="..\Minecraft.Client\SlimeModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SlimeRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\SmallButton.cpp" />
<ClCompile Include="..\Minecraft.Client\SmokeParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\SnowManModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SnowManRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\SnowShovelParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\SpellParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\SpiderModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SpiderRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\SplashParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\SquidModel.cpp" />
<ClCompile Include="..\Minecraft.Client\SquidRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\StatsCounter.cpp" />
<ClCompile Include="..\Minecraft.Client\StatsScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\StatsSyncher.cpp" />
<ClCompile Include="..\Minecraft.Client\StitchSlot.cpp" />
<ClCompile Include="..\Minecraft.Client\StitchedTexture.cpp" />
<ClCompile Include="..\Minecraft.Client\Stitcher.cpp" />
<ClCompile Include="..\Minecraft.Client\StringTable.cpp" />
<ClCompile Include="..\Minecraft.Client\SuspendedParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\SuspendedTownParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\TakeAnimationParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\TeleportCommand.cpp" />
<ClCompile Include="..\Minecraft.Client\TerrainParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\Tesselator.cpp" />
<ClCompile Include="..\Minecraft.Client\TexOffs.cpp" />
<ClCompile Include="..\Minecraft.Client\Texture.cpp" />
<ClCompile Include="..\Minecraft.Client\TextureAtlas.cpp" />
<ClCompile Include="..\Minecraft.Client\TextureHolder.cpp" />
<ClCompile Include="..\Minecraft.Client\TextureManager.cpp" />
<ClCompile Include="..\Minecraft.Client\TextureMap.cpp" />
<ClCompile Include="..\Minecraft.Client\TexturePack.cpp" />
<ClCompile Include="..\Minecraft.Client\TexturePackRepository.cpp" />
<ClCompile Include="..\Minecraft.Client\Textures.cpp" />
<ClCompile Include="..\Minecraft.Client\TheEndPortalRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\TileEntityRenderDispatcher.cpp" />
<ClCompile Include="..\Minecraft.Client\TileEntityRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\TileRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\Timer.cpp" />
<ClCompile Include="..\Minecraft.Client\TitleScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\TntMinecartRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\TntRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\TrackedEntity.cpp" />
<ClCompile Include="..\Minecraft.Client\User.cpp" />
<ClCompile Include="..\Minecraft.Client\Vertex.cpp" />
<ClCompile Include="..\Minecraft.Client\VideoSettingsScreen.cpp" />
<ClCompile Include="..\Minecraft.Client\ViewportCuller.cpp" />
<ClCompile Include="..\Minecraft.Client\VillagerGolemModel.cpp" />
<ClCompile Include="..\Minecraft.Client\VillagerGolemRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\VillagerModel.cpp" />
<ClCompile Include="..\Minecraft.Client\VillagerRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\VillagerZombieModel.cpp" />
<ClCompile Include="..\Minecraft.Client\WaterDropParticle.cpp" />
<ClCompile Include="..\Minecraft.Client\Windows64\Iggy\gdraw\gdraw_d3d11.cpp" />
<ClCompile Include="..\Minecraft.Client\Windows64\KeyboardMouseInput.cpp" />
<ClCompile Include="..\Minecraft.Client\Windows64\Leaderboards\WindowsLeaderboardManager.cpp" />
<ClCompile Include="..\Minecraft.Client\Windows64\Windows64_App.cpp" />
<ClCompile Include="..\Minecraft.Client\Windows64\Windows64_Minecraft.cpp" />
<ClCompile Include="..\Minecraft.Client\Windows64\Windows64_UIController.cpp" />
<ClCompile Include="..\Minecraft.Client\Windows64\Network\WinsockNetLayer.cpp" />
<ClCompile Include="..\Minecraft.Client\WitchModel.cpp" />
<ClCompile Include="..\Minecraft.Client\WitchRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\WitherBossModel.cpp" />
<ClCompile Include="..\Minecraft.Client\WitherBossRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\WitherSkullRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\WolfModel.cpp" />
<ClCompile Include="..\Minecraft.Client\WolfRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\WstringLookup.cpp" />
<ClCompile Include="..\Minecraft.Client\Xbox\Network\NetworkPlayerXbox.cpp" />
<ClCompile Include="..\Minecraft.Client\ZombieModel.cpp" />
<ClCompile Include="..\Minecraft.Client\ZombieRenderer.cpp" />
<ClCompile Include="..\Minecraft.Client\compat_shims.cpp">
<PrecompiledHeader>NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\glWrapper.cpp" />
<ClCompile Include="..\Minecraft.Client\stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\Minecraft.Client\stubs.cpp" />
<ClCompile Include="Windows64\ServerMain.cpp" />
</ItemGroup>
<ItemGroup>
<MASM Include="..\Minecraft.Client\iob_shim.asm" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\Minecraft.Client\Xbox\MinecraftWindows.rc" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Minecraft.World\Minecraft.World.vcxproj">
<Project>{F046C3CE-9749-4823-B32B-D9CC10B1A2C8}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
<Import Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" />
</ImportGroup>
</Project>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Server">
<UniqueIdentifier>{A8A47C24-66C0-4912-9D34-2CBF87F1D707}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Windows64\ServerMain.cpp">
<Filter>Server</Filter>
</ClCompile>
</ItemGroup>
</Project>

View file

@ -0,0 +1,411 @@
#include "stdafx.h"
#include "Common/App_Defines.h"
#include "Common/Network/GameNetworkManager.h"
#include "Input.h"
#include "Minecraft.h"
#include "MinecraftServer.h"
#include "Options.h"
#include "Tesselator.h"
#include "Windows64/4JLibs/inc/4J_Render.h"
#include "Windows64/GameConfig/Minecraft.spa.h"
#include "Windows64/KeyboardMouseInput.h"
#include "Windows64/Network/WinsockNetLayer.h"
#include "Windows64/Windows64_UIController.h"
#include "../../Minecraft.World/AABB.h"
#include "../../Minecraft.World/Vec3.h"
#include "../../Minecraft.World/IntCache.h"
#include "../../Minecraft.World/TilePos.h"
#include "../../Minecraft.World/compression.h"
#include "../../Minecraft.World/OldChunkStorage.h"
#include "../../Minecraft.World/net.minecraft.world.level.tile.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern ATOM MyRegisterClass(HINSTANCE hInstance);
extern BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
extern HRESULT InitDevice();
extern void CleanupDevice();
extern void DefineActions(void);
extern HWND g_hWnd;
extern int g_iScreenWidth;
extern int g_iScreenHeight;
extern char g_Win64Username[17];
extern wchar_t g_Win64UsernameW[17];
extern ID3D11Device* g_pd3dDevice;
extern ID3D11DeviceContext* g_pImmediateContext;
extern IDXGISwapChain* g_pSwapChain;
extern ID3D11RenderTargetView* g_pRenderTargetView;
extern ID3D11DepthStencilView* g_pDepthStencilView;
extern DWORD dwProfileSettingsA[];
static const int kProfileValueCount = 5;
static const int kProfileSettingCount = 4;
struct DedicatedServerConfig
{
int port;
char bindIP[256];
char name[17];
int maxPlayers;
__int64 seed;
bool hasSeed;
bool showHelp;
};
static volatile bool g_shutdownRequested = false;
static BOOL WINAPI ConsoleCtrlHandlerProc(DWORD ctrlType)
{
switch (ctrlType)
{
case CTRL_C_EVENT:
case CTRL_BREAK_EVENT:
case CTRL_CLOSE_EVENT:
case CTRL_SHUTDOWN_EVENT:
g_shutdownRequested = true;
app.m_bShutdown = true;
return TRUE;
default:
return FALSE;
}
}
static int WaitForServerStoppedThreadProc(void *)
{
if (g_NetworkManager.ServerStoppedValid())
{
g_NetworkManager.ServerStoppedWait();
}
return 0;
}
static void PrintUsage()
{
printf("Minecraft.Server.exe [options]\n");
printf(" -port <1-65535> Listen TCP port (default: 25565)\n");
printf(" -ip <addr> Bind address (default: 0.0.0.0)\n");
printf(" -bind <addr> Alias of -ip\n");
printf(" -name <name> Host display name (max 16 chars)\n");
printf(" -maxplayers <1-8> Public slots (default: 8)\n");
printf(" -seed <int64> World seed\n");
printf(" -help Show this help\n");
}
static void LogStartupStep(const char *message)
{
printf("[startup] %s\n", message);
fflush(stdout);
}
static bool ParseIntArg(const char *value, int *outValue)
{
if (value == NULL || *value == 0)
return false;
char *end = NULL;
long parsed = strtol(value, &end, 10);
if (end == value || *end != 0)
return false;
*outValue = (int)parsed;
return true;
}
static bool ParseInt64Arg(const char *value, __int64 *outValue)
{
if (value == NULL || *value == 0)
return false;
char *end = NULL;
__int64 parsed = _strtoi64(value, &end, 10);
if (end == value || *end != 0)
return false;
*outValue = parsed;
return true;
}
static bool ParseCommandLine(int argc, char **argv, DedicatedServerConfig *config)
{
for (int i = 1; i < argc; ++i)
{
const char *arg = argv[i];
if (_stricmp(arg, "-help") == 0 || _stricmp(arg, "--help") == 0 || _stricmp(arg, "-h") == 0)
{
config->showHelp = true;
return true;
}
else if ((_stricmp(arg, "-port") == 0) && (i + 1 < argc))
{
int port = 0;
if (!ParseIntArg(argv[++i], &port) || port <= 0 || port > 65535)
{
printf("Invalid -port value.\n");
return false;
}
config->port = port;
}
else if ((_stricmp(arg, "-ip") == 0 || _stricmp(arg, "-bind") == 0) && (i + 1 < argc))
{
strncpy_s(config->bindIP, sizeof(config->bindIP), argv[++i], _TRUNCATE);
}
else if ((_stricmp(arg, "-name") == 0) && (i + 1 < argc))
{
strncpy_s(config->name, sizeof(config->name), argv[++i], _TRUNCATE);
}
else if ((_stricmp(arg, "-maxplayers") == 0) && (i + 1 < argc))
{
int maxPlayers = 0;
if (!ParseIntArg(argv[++i], &maxPlayers) || maxPlayers <= 0 || maxPlayers > MINECRAFT_NET_MAX_PLAYERS)
{
printf("Invalid -maxplayers value.\n");
return false;
}
config->maxPlayers = maxPlayers;
}
else if ((_stricmp(arg, "-seed") == 0) && (i + 1 < argc))
{
if (!ParseInt64Arg(argv[++i], &config->seed))
{
printf("Invalid -seed value.\n");
return false;
}
config->hasSeed = true;
}
else
{
printf("Unknown or incomplete argument: %s\n", arg);
return false;
}
}
return true;
}
static void SetExeWorkingDirectory()
{
char exePath[MAX_PATH] = {};
GetModuleFileNameA(NULL, exePath, MAX_PATH);
char *slash = strrchr(exePath, '\\');
if (slash != NULL)
{
*(slash + 1) = 0;
SetCurrentDirectoryA(exePath);
}
}
int main(int argc, char **argv)
{
DedicatedServerConfig config;
config.port = WIN64_NET_DEFAULT_PORT;
strncpy_s(config.bindIP, sizeof(config.bindIP), "0.0.0.0", _TRUNCATE);
strncpy_s(config.name, sizeof(config.name), "DedicatedServer", _TRUNCATE);
config.maxPlayers = MINECRAFT_NET_MAX_PLAYERS;
config.seed = 0;
config.hasSeed = false;
config.showHelp = false;
if (!ParseCommandLine(argc, argv, &config))
{
PrintUsage();
return 1;
}
if (config.showHelp)
{
PrintUsage();
return 0;
}
LogStartupStep("initializing process state");
SetConsoleCtrlHandler(ConsoleCtrlHandlerProc, TRUE);
SetExeWorkingDirectory();
g_iScreenWidth = 1280;
g_iScreenHeight = 720;
strncpy_s(g_Win64Username, sizeof(g_Win64Username), config.name, _TRUNCATE);
MultiByteToWideChar(CP_ACP, 0, g_Win64Username, -1, g_Win64UsernameW, 17);
g_Win64MultiplayerHost = true;
g_Win64MultiplayerJoin = false;
g_Win64MultiplayerPort = config.port;
strncpy_s(g_Win64MultiplayerIP, sizeof(g_Win64MultiplayerIP), config.bindIP, _TRUNCATE);
LogStartupStep("registering hidden window class");
HINSTANCE hInstance = GetModuleHandle(NULL);
MyRegisterClass(hInstance);
LogStartupStep("creating hidden window");
if (!InitInstance(hInstance, SW_HIDE))
{
printf("Failed to create window instance.\n");
return 2;
}
ShowWindow(g_hWnd, SW_HIDE);
LogStartupStep("initializing graphics device wrappers");
if (FAILED(InitDevice()))
{
printf("Failed to initialize D3D device.\n");
CleanupDevice();
return 2;
}
LogStartupStep("loading media/string tables");
app.loadMediaArchive();
RenderManager.Initialise(g_pd3dDevice, g_pSwapChain);
app.loadStringTable();
ui.init(g_pd3dDevice, g_pImmediateContext, g_pRenderTargetView, g_pDepthStencilView, g_iScreenWidth, g_iScreenHeight);
InputManager.Initialise(1, 3, MINECRAFT_ACTION_MAX, ACTION_MAX_MENU);
KMInput.Init(g_hWnd);
DefineActions();
InputManager.SetJoypadMapVal(0, 0);
InputManager.SetKeyRepeatRate(0.3f, 0.2f);
ProfileManager.Initialise(
TITLEID_MINECRAFT,
app.m_dwOfferID,
PROFILE_VERSION_10,
kProfileValueCount,
kProfileSettingCount,
dwProfileSettingsA,
app.GAME_DEFINED_PROFILE_DATA_BYTES * XUSER_MAX_COUNT,
&app.uiGameDefinedDataChangedBitmask);
ProfileManager.SetDefaultOptionsCallback(&CConsoleMinecraftApp::DefaultOptionsCallback, (LPVOID)&app);
ProfileManager.SetDebugFullOverride(true);
LogStartupStep("initializing network manager");
g_NetworkManager.Initialise();
for (int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i)
{
IQNet::m_player[i].m_smallId = (BYTE)i;
IQNet::m_player[i].m_isRemote = false;
IQNet::m_player[i].m_isHostPlayer = (i == 0);
swprintf_s(IQNet::m_player[i].m_gamertag, 32, L"Player%d", i);
}
wcscpy_s(IQNet::m_player[0].m_gamertag, 32, g_Win64UsernameW);
WinsockNetLayer::Initialize();
Tesselator::CreateNewThreadStorage(1024 * 1024);
AABB::CreateNewThreadStorage();
Vec3::CreateNewThreadStorage();
IntCache::CreateNewThreadStorage();
Compression::CreateNewThreadStorage();
OldChunkStorage::CreateNewThreadStorage();
Level::enableLightingCache();
Tile::CreateNewThreadStorage();
LogStartupStep("creating Minecraft singleton");
Minecraft::main();
Minecraft *minecraft = Minecraft::GetInstance();
if (minecraft == NULL)
{
printf("Minecraft initialization failed.\n");
CleanupDevice();
return 3;
}
app.InitGameSettings();
if (minecraft->options != NULL)
{
minecraft->options->set(Options::Option::MUSIC, 0.0f);
minecraft->options->set(Options::Option::SOUND, 0.0f);
}
MinecraftServer::resetFlags();
app.SetTutorialMode(false);
app.SetCorruptSaveDeleted(false);
app.SetGameHostOption(eGameHostOption_Difficulty, 1);
app.SetGameHostOption(eGameHostOption_FriendsOfFriends, 0);
app.SetGameHostOption(eGameHostOption_Gamertags, 1);
app.SetGameHostOption(eGameHostOption_BedrockFog, 1);
app.SetGameHostOption(eGameHostOption_GameType, 0);
app.SetGameHostOption(eGameHostOption_LevelType, 0);
app.SetGameHostOption(eGameHostOption_Structures, 1);
app.SetGameHostOption(eGameHostOption_BonusChest, 0);
app.SetGameHostOption(eGameHostOption_PvP, 1);
app.SetGameHostOption(eGameHostOption_TrustPlayers, 1);
app.SetGameHostOption(eGameHostOption_FireSpreads, 1);
app.SetGameHostOption(eGameHostOption_TNT, 1);
app.SetGameHostOption(eGameHostOption_HostCanFly, 1);
app.SetGameHostOption(eGameHostOption_HostCanChangeHunger, 1);
app.SetGameHostOption(eGameHostOption_HostCanBeInvisible, 1);
NetworkGameInitData *param = new NetworkGameInitData();
if (config.hasSeed)
{
param->seed = config.seed;
}
param->saveData = NULL;
param->settings = app.GetGameHostOption(eGameHostOption_All);
param->dedicatedNoLocalHostPlayer = true;
LogStartupStep("starting hosted network game thread");
g_NetworkManager.HostGame(0, true, false, (unsigned char)config.maxPlayers, 0);
g_NetworkManager.FakeLocalPlayerJoined();
C4JThread *startThread = new C4JThread(&CGameNetworkManager::RunNetworkGameThreadProc, (LPVOID)param, "RunNetworkGame");
startThread->Run();
while (startThread->isRunning() && !g_shutdownRequested)
{
g_NetworkManager.DoWork();
ProfileManager.Tick();
StorageManager.Tick();
Sleep(10);
}
startThread->WaitForCompletion(INFINITE);
int startupResult = startThread->GetExitCode();
delete startThread;
if (startupResult != 0)
{
printf("Failed to start dedicated server (code %d).\n", startupResult);
WinsockNetLayer::Shutdown();
g_NetworkManager.Terminate();
CleanupDevice();
return 4;
}
LogStartupStep("server startup complete");
printf("Dedicated server listening on %s:%d\n", g_Win64MultiplayerIP, g_Win64MultiplayerPort);
while (!g_shutdownRequested && !app.m_bShutdown)
{
g_NetworkManager.DoWork();
ProfileManager.Tick();
StorageManager.Tick();
app.HandleXuiActions();
if (MinecraftServer::serverHalted())
{
break;
}
Sleep(10);
}
printf("Stopping dedicated server...\n");
MinecraftServer::HaltServer();
if (g_NetworkManager.ServerStoppedValid())
{
C4JThread waitThread(&WaitForServerStoppedThreadProc, NULL, "WaitServerStopped");
waitThread.Run();
waitThread.WaitForCompletion(INFINITE);
}
WinsockNetLayer::Shutdown();
g_NetworkManager.Terminate();
CleanupDevice();
return 0;
}

View file

@ -0,0 +1,70 @@
param(
[string]$OutDir,
[string]$ProjectRoot,
[string]$Configuration
)
if ([string]::IsNullOrWhiteSpace($OutDir)) {
throw "OutDir is required."
}
if ([string]::IsNullOrWhiteSpace($ProjectRoot)) {
$ProjectRoot = Resolve-Path (Join-Path $PSScriptRoot "..\\..")
}
if ([string]::IsNullOrWhiteSpace($Configuration)) {
$Configuration = "Debug"
}
$OutDir = [System.IO.Path]::GetFullPath($OutDir)
$ProjectRoot = [System.IO.Path]::GetFullPath($ProjectRoot)
$ClientRoot = Join-Path $ProjectRoot "Minecraft.Client"
Write-Host "Server post-build started. OutDir: $OutDir"
function Ensure-Dir([string]$path) {
if (-not (Test-Path $path)) {
New-Item -ItemType Directory -Path $path -Force | Out-Null
}
}
function Copy-Tree-IfExists([string]$src, [string]$dst) {
if (Test-Path $src) {
Ensure-Dir $dst
xcopy /q /y /i /s /e /d "$src" "$dst" 2>$null | Out-Null
}
}
function Copy-File-IfExists([string]$src, [string]$dst) {
if (Test-Path $src) {
$dstDir = Split-Path -Parent $dst
Ensure-Dir $dstDir
xcopy /q /y /d "$src" "$dstDir" 2>$null | Out-Null
}
}
function Copy-FirstExisting([string[]]$candidates, [string]$dstFile) {
foreach ($candidate in $candidates) {
if (Test-Path $candidate) {
Copy-File-IfExists $candidate $dstFile
return
}
}
}
# Dedicated server only needs core resources for current startup path.
Copy-File-IfExists (Join-Path $ClientRoot "Common\\Media\\MediaWindows64.arc") (Join-Path $OutDir "Common\\Media\\MediaWindows64.arc")
Copy-Tree-IfExists (Join-Path $ClientRoot "Common\\res") (Join-Path $OutDir "Common\\res")
Copy-Tree-IfExists (Join-Path $ClientRoot "Windows64\\GameHDD") (Join-Path $OutDir "Windows64\\GameHDD")
# Runtime DLLs.
Copy-FirstExisting @(
(Join-Path $ClientRoot "Windows64\\Iggy\\lib\\redist64\\iggy_w64.dll"),
(Join-Path $ProjectRoot ("x64\\{0}\\iggy_w64.dll" -f $Configuration))
) (Join-Path $OutDir "iggy_w64.dll")
Copy-FirstExisting @(
(Join-Path $ClientRoot "Windows64\\Miles\\lib\\redist64\\mss64.dll"),
(Join-Path $ProjectRoot ("x64\\{0}\\mss64.dll" -f $Configuration))
) (Join-Path $OutDir "mss64.dll")

View file

@ -1,4 +1,4 @@

Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.14.37012.4 d17.14 VisualStudioVersion = 17.14.37012.4 d17.14
@ -10,6 +10,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Minecraft.Client", "Minecra
{F046C3CE-9749-4823-B32B-D9CC10B1A2C8} = {F046C3CE-9749-4823-B32B-D9CC10B1A2C8} {F046C3CE-9749-4823-B32B-D9CC10B1A2C8} = {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}
EndProjectSection EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Minecraft.Server", "Minecraft.Server\Minecraft.Server.vcxproj", "{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}"
ProjectSection(ProjectDependencies) = postProject
{F046C3CE-9749-4823-B32B-D9CC10B1A2C8} = {F046C3CE-9749-4823-B32B-D9CC10B1A2C8}
EndProjectSection
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
ContentPackage_NO_TU|ARM64EC = ContentPackage_NO_TU|ARM64EC ContentPackage_NO_TU|ARM64EC = ContentPackage_NO_TU|ARM64EC
@ -223,6 +228,54 @@ Global
{1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|Windows64.ActiveCfg = ReleaseForArt|x64 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|Windows64.ActiveCfg = ReleaseForArt|x64
{1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|Xbox 360.ActiveCfg = Release|Xbox 360 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|Xbox 360.ActiveCfg = Release|Xbox 360
{1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|Xbox 360.Build.0 = Release|Xbox 360 {1B9A8C38-DD48-448C-AA24-E1A35E0089A3}.ReleaseForArt|Xbox 360.Build.0 = Release|Xbox 360
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage_NO_TU|ARM64EC.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage_NO_TU|Durango.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage_NO_TU|ORBIS.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage_NO_TU|PS3.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage_NO_TU|PSVita.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage_NO_TU|Windows64.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage_NO_TU|Windows64.Build.0 = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage_NO_TU|Xbox 360.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.CONTENTPACKAGE_SYMBOLS|ARM64EC.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.CONTENTPACKAGE_SYMBOLS|Durango.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.CONTENTPACKAGE_SYMBOLS|ORBIS.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.CONTENTPACKAGE_SYMBOLS|PS3.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.CONTENTPACKAGE_SYMBOLS|PSVita.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.CONTENTPACKAGE_SYMBOLS|Windows64.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.CONTENTPACKAGE_SYMBOLS|Windows64.Build.0 = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.CONTENTPACKAGE_SYMBOLS|Xbox 360.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage|ARM64EC.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage|Durango.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage|ORBIS.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage|PS3.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage|PSVita.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage|Windows64.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage|Windows64.Build.0 = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ContentPackage|Xbox 360.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Debug|ARM64EC.ActiveCfg = Debug|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Debug|Durango.ActiveCfg = Debug|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Debug|ORBIS.ActiveCfg = Debug|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Debug|PS3.ActiveCfg = Debug|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Debug|PSVita.ActiveCfg = Debug|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Debug|Windows64.ActiveCfg = Debug|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Debug|Windows64.Build.0 = Debug|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Debug|Xbox 360.ActiveCfg = Debug|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Release|ARM64EC.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Release|Durango.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Release|ORBIS.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Release|PS3.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Release|PSVita.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Release|Windows64.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Release|Windows64.Build.0 = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.Release|Xbox 360.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ReleaseForArt|ARM64EC.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ReleaseForArt|Durango.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ReleaseForArt|ORBIS.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ReleaseForArt|PS3.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ReleaseForArt|PSVita.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ReleaseForArt|Windows64.ActiveCfg = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ReleaseForArt|Windows64.Build.0 = Release|x64
{7CB40BFC-C8E4-4293-A22E-D2041348D5AF}.ReleaseForArt|Xbox 360.ActiveCfg = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View file

@ -0,0 +1,76 @@
if(NOT DEFINED PROJECT_SOURCE_DIR OR NOT DEFINED OUTPUT_DIR OR NOT DEFINED CONFIGURATION)
message(FATAL_ERROR "CopyServerAssets.cmake requires PROJECT_SOURCE_DIR, OUTPUT_DIR, and CONFIGURATION.")
endif()
string(REPLACE "\"" "" PROJECT_SOURCE_DIR "${PROJECT_SOURCE_DIR}")
string(REPLACE "\"" "" OUTPUT_DIR "${OUTPUT_DIR}")
string(REPLACE "\"" "" CONFIGURATION "${CONFIGURATION}")
set(_project_dir "${PROJECT_SOURCE_DIR}/Minecraft.Client")
function(copy_tree_if_exists src_rel dst_rel)
set(_src "${_project_dir}/${src_rel}")
set(_dst "${OUTPUT_DIR}/${dst_rel}")
if(EXISTS "${_src}")
file(MAKE_DIRECTORY "${_dst}")
file(GLOB_RECURSE _files RELATIVE "${_src}" "${_src}/*")
foreach(_file IN LISTS _files)
if(NOT _file MATCHES "\\.(cpp|c|h|hpp|xml|lang)$")
set(_full_src "${_src}/${_file}")
set(_full_dst "${_dst}/${_file}")
if(IS_DIRECTORY "${_full_src}")
file(MAKE_DIRECTORY "${_full_dst}")
else()
get_filename_component(_dst_dir "${_full_dst}" DIRECTORY)
file(MAKE_DIRECTORY "${_dst_dir}")
execute_process(
COMMAND "${CMAKE_COMMAND}" -E copy_if_different
"${_full_src}" "${_full_dst}"
)
endif()
endif()
endforeach()
endif()
endfunction()
function(copy_file_if_exists src_rel dst_rel)
set(_src "${PROJECT_SOURCE_DIR}/${src_rel}")
set(_dst "${OUTPUT_DIR}/${dst_rel}")
get_filename_component(_dst_dir "${_dst}" DIRECTORY)
file(MAKE_DIRECTORY "${_dst_dir}")
if(EXISTS "${_src}")
execute_process(
COMMAND "${CMAKE_COMMAND}" -E copy_if_different
"${_src}" "${_dst}"
)
endif()
endfunction()
function(copy_first_existing dst_rel)
foreach(_candidate IN LISTS ARGN)
if(EXISTS "${PROJECT_SOURCE_DIR}/${_candidate}")
copy_file_if_exists("${_candidate}" "${dst_rel}")
return()
endif()
endforeach()
endfunction()
# Dedicated server runtime assets (minimal set validated in startup tests).
copy_file_if_exists("Minecraft.Client/Common/Media/MediaWindows64.arc" "Common/Media/MediaWindows64.arc")
copy_tree_if_exists("Common/res" "Common/res")
copy_tree_if_exists("Windows64/GameHDD" "Windows64/GameHDD")
copy_first_existing("iggy_w64.dll"
"Minecraft.Client/Windows64/Iggy/lib/redist64/iggy_w64.dll"
"x64/${CONFIGURATION}/iggy_w64.dll"
)
copy_first_existing("mss64.dll"
"Minecraft.Client/Windows64/Miles/lib/redist64/mss64.dll"
"x64/${CONFIGURATION}/mss64.dll"
)