diff --git a/.gitattributes b/.gitattributes index 2a377d08..e69de29b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,8 +0,0 @@ -*.png filter=lfs diff=lfs merge=lfs -text -*.jpg filter=lfs diff=lfs merge=lfs -text -*.ogg filter=lfs diff=lfs merge=lfs -text -*.binka filter=lfs diff=lfs merge=lfs -text -*.arc filter=lfs diff=lfs merge=lfs -text -*.ttf filter=lfs diff=lfs merge=lfs -text -*.bin filter=lfs diff=lfs merge=lfs -text -*.ico filter=lfs diff=lfs merge=lfs -text diff --git a/.github/banner.png b/.github/banner.png new file mode 100644 index 00000000..60c45515 Binary files /dev/null and b/.github/banner.png differ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index a499ff84..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Build Minecraft Legacy Console Edition -on: - workflow_dispatch: - -jobs: - build: - runs-on: windows-2022 - - strategy: - matrix: - configuration: [Release, Debug] - - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Setup MSBuild - uses: microsoft/setup-msbuild@v2 - - - name: Build Minecraft Legacy Console Edition - run: | - msbuild MinecraftConsoles.sln ` - /p:Configuration=${{ matrix.configuration }} ` - /p:Platform=Windows64 ` - /m - - - name: Upload Release + Debug Artifacts - uses: actions/upload-artifact@v4 - with: - name: MinecraftClient-${{ matrix.configuration }} - path: x64/${{ matrix.configuration }} diff --git a/.github/workflows/debug-test.yml b/.github/workflows/debug-test.yml deleted file mode 100644 index 4acd5fc5..00000000 --- a/.github/workflows/debug-test.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: MSBuild Debug Test - -on: - workflow_dispatch: - pull_request: - types: [opened, reopened, synchronize] - paths-ignore: - - '.gitignore' - - '*.md' - - '.github/*.md' - push: - branches: - - 'main' - paths-ignore: - - '.gitignore' - - '*.md' - - '.github/*.md' - -jobs: - build: - name: Build Windows64 (DEBUG) - runs-on: windows-latest - - steps: - - name: Checkout - uses: actions/checkout@v6 - - - name: Setup msbuild - uses: microsoft/setup-msbuild@v2 - - - name: Build - run: MSBuild.exe MinecraftConsoles.sln /p:Configuration=Debug /p:Platform="Windows64" diff --git a/.github/workflows/nightly-server.yml b/.github/workflows/nightly-server.yml new file mode 100644 index 00000000..5450de9a --- /dev/null +++ b/.github/workflows/nightly-server.yml @@ -0,0 +1,167 @@ +name: Nightly Server Release + +on: + workflow_dispatch: + push: + branches: + - 'main' + paths-ignore: + - '.gitignore' + - '*.md' + - '.github/**' + - '!.github/workflows/nightly-server.yml' + +permissions: + contents: write + packages: write + +concurrency: + group: nightly-server + cancel-in-progress: true + +jobs: + build: + runs-on: windows-latest + + strategy: + matrix: + platform: [Windows64] + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set platform lowercase + run: echo "MATRIX_PLATFORM=$('${{ matrix.platform }}'.ToLower())" >> $env:GITHUB_ENV + + - name: Setup MSVC + uses: ilammy/msvc-dev-cmd@v1 + + - name: Setup CMake + uses: lukka/get-cmake@latest + + - name: Run CMake + uses: lukka/run-cmake@v10 + env: + VCPKG_ROOT: "" # Disable vcpkg for CI builds + with: + configurePreset: ${{ env.MATRIX_PLATFORM }} + buildPreset: ${{ env.MATRIX_PLATFORM }}-release + buildPresetAdditionalArgs: "['--target', 'Minecraft.Server']" + + - name: Zip Build + run: 7z a -r LCEServer${{ matrix.platform }}.zip ./build/${{ env.MATRIX_PLATFORM }}/Minecraft.Server/Release/* "-x!*.ipdb" "-x!*.iobj" + + - name: Stage artifacts + run: | + New-Item -ItemType Directory -Force -Path staging + Copy-Item LCEServer${{ matrix.platform }}.zip staging/ + + - name: Stage exe and pdb + if: matrix.platform == 'Windows64' + run: | + Copy-Item ./build/${{ env.MATRIX_PLATFORM }}/Minecraft.Server/Release/Minecraft.Server.exe staging/ + + - name: Upload artifacts + uses: actions/upload-artifact@v6 + with: + name: build-${{ matrix.platform }} + path: staging/* + + release: + needs: build + runs-on: ubuntu-latest + + steps: + - name: Download all artifacts + uses: actions/download-artifact@v7 + with: + path: artifacts + merge-multiple: true + + - name: Update release + uses: andelf/nightly-release@main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: nightly-dedicated-server + name: Nightly Dedicated Server Release + body: | + Dedicated Server runtime for Windows64. + + Download `LCEServerWindows64.zip` and extract it to a folder where you'd like to keep the server runtime. + files: | + artifacts/* + + docker: + name: Build and Push Docker Image + runs-on: ubuntu-latest + needs: build + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Download dedicated server runtime from artifacts + uses: actions/download-artifact@v4 + with: + name: build-Windows64 + path: .artifacts/ + + - name: Prepare Docker runtime directory + shell: bash + run: | + set -euo pipefail + + rm -rf runtime + mkdir -p runtime + unzip .artifacts/LCEServerWindows64.zip -d runtime + + - name: Compute image name + id: image + shell: bash + run: | + owner="$(echo "${{ vars.CONTAINER_REGISTRY_OWNER || github.repository_owner }}" | tr '[:upper:]' '[:lower:]')" + image_tag="nightly" + # if [[ "${{ github.ref }}" != "refs/heads/main" ]]; then + # image_tag="nightly-test" + # fi + echo "owner=$owner" >> "$GITHUB_OUTPUT" + echo "image=ghcr.io/$owner/minecraft-lce-dedicated-server" >> "$GITHUB_OUTPUT" + echo "image_tag=$image_tag" >> "$GITHUB_OUTPUT" + + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ steps.image.outputs.image }} + tags: | + type=raw,value=${{ steps.image.outputs.image_tag }} + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ secrets.GHCR_USERNAME || github.actor }} + password: ${{ secrets.GHCR_TOKEN || secrets.GITHUB_TOKEN }} + + - name: Build and push image + uses: docker/build-push-action@v6 + with: + context: . + file: docker/dedicated-server/Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + MC_RUNTIME_DIR=runtime + + cleanup: + needs: [build, release, docker] + if: always() + runs-on: ubuntu-latest + steps: + - name: Cleanup artifacts + uses: geekyeggo/delete-artifact@v5 + with: + name: build-* diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 402f3cb6..789db3e8 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -8,25 +8,75 @@ on: paths-ignore: - '.gitignore' - '*.md' - - '.github/*.md' + - '.github/**' + - '!.github/workflows/nightly.yml' + +permissions: + contents: write + +concurrency: + group: nightly + cancel-in-progress: true jobs: build: - name: Build Windows64 runs-on: windows-latest + strategy: + matrix: + platform: [Windows64] + steps: - name: Checkout uses: actions/checkout@v6 - - name: Setup msbuild - uses: microsoft/setup-msbuild@v2 + - name: Set platform lowercase + run: echo "MATRIX_PLATFORM=$('${{ matrix.platform }}'.ToLower())" >> $env:GITHUB_ENV - - name: Build - run: MSBuild.exe MinecraftConsoles.sln /p:Configuration=Release /p:Platform="Windows64" + - name: Setup MSVC + uses: ilammy/msvc-dev-cmd@v1 + + - name: Setup CMake + uses: lukka/get-cmake@latest + + - name: Run CMake + uses: lukka/run-cmake@v10 + env: + VCPKG_ROOT: "" # Disable vcpkg for CI builds + with: + configurePreset: ${{ env.MATRIX_PLATFORM }} + buildPreset: ${{ env.MATRIX_PLATFORM }}-release + buildPresetAdditionalArgs: "['--target', 'Minecraft.Client']" - name: Zip Build - run: 7z a -r LCEWindows64.zip ./x64/Release/* + run: 7z a -r LCE${{ matrix.platform }}.zip ./build/${{ env.MATRIX_PLATFORM }}/Minecraft.Client/Release/* "-x!*.ipdb" "-x!*.iobj" + + - name: Stage artifacts + run: | + New-Item -ItemType Directory -Force -Path staging + Copy-Item LCE${{ matrix.platform }}.zip staging/ + + - name: Stage exe and pdb + if: matrix.platform == 'Windows64' + run: | + Copy-Item ./build/${{ env.MATRIX_PLATFORM }}/Minecraft.Client/Release/Minecraft.Client.exe staging/ + + - name: Upload artifacts + uses: actions/upload-artifact@v6 + with: + name: build-${{ matrix.platform }} + path: staging/* + + release: + needs: build + runs-on: ubuntu-latest + + steps: + - name: Download all artifacts + uses: actions/download-artifact@v7 + with: + path: artifacts + merge-multiple: true - name: Update release uses: andelf/nightly-release@main @@ -34,13 +84,21 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: nightly - name: Nightly Release + name: Nightly Client Release body: | - Requires at least Windows 7 and DirectX 11 compatible GPU to run. Compiled with MSVC v14.44.35207 in Release mode with Whole Program Optimization, as well as `/O2 /Ot /Oi /Ob3 /GF /fp:precise`. + Requires at least Windows 7 and DirectX 11 compatible GPU to run. # 🚨 First time here? 🚨 If you've never downloaded the game before, you need to download `LCEWindows64.zip` and extract it to the folder where you'd like to keep the game. The other files are included in this `.zip` file! files: | - LCEWindows64.zip - ./x64/Release/Minecraft.Client.exe - ./x64/Release/Minecraft.Client.pdb + artifacts/* + + cleanup: + needs: [build, release] + if: always() + runs-on: ubuntu-latest + steps: + - name: Cleanup artifacts + uses: geekyeggo/delete-artifact@v5 + with: + name: build-* diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 00000000..9d57f4b4 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,32 @@ +name: Pull Request Build + +on: + workflow_dispatch: + pull_request: + types: [opened, reopened, synchronize] + paths-ignore: + - '.gitignore' + - '*.md' + - '.github/*.md' + +jobs: + build: + runs-on: windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Setup MSVC + uses: ilammy/msvc-dev-cmd@v1 + + - name: Setup CMake + uses: lukka/get-cmake@latest + + - name: Run CMake + uses: lukka/run-cmake@v10 + env: + VCPKG_ROOT: "" # Disable vcpkg for CI builds + with: + configurePreset: windows64 + buildPreset: windows64-debug diff --git a/.gitignore b/.gitignore index 9abf7507..10e49ddb 100644 --- a/.gitignore +++ b/.gitignore @@ -379,11 +379,8 @@ MigrationBackup/ FodyWeavers.xsd # VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json +.vscode/ +!.vscode/*.example.json *.code-workspace # Local History for Visual Studio Code @@ -410,30 +407,10 @@ enc_temp_folder/ Minecraft.Client/Schematics/ Minecraft.Client/Windows64/GameHDD/ -# Intermediate build files (per-project) -Minecraft.Client/x64/ -Minecraft.Client/Debug/ -Minecraft.Client/x64_Debug/ -Minecraft.Client/Release/ -Minecraft.Client/x64_Release/ +# CMake build output +build/ -Minecraft.World/x64/ -Minecraft.World/Debug/ -Minecraft.World/x64_Debug/ -Minecraft.World/Release/ -Minecraft.World/x64_Release/ - -build/* - -# Existing build output files -!x64/**/Effects.msscmp -!x64/**/iggy_w64.dll -!x64/**/mss64.dll -!x64/**/redist64/ - -# Local saves -Minecraft.Client/Saves/ - -# Visual Studio Per-User Config -*.user -/out +# Server data +tmp*/ +_server_asset_probe/ +server-data/ diff --git a/.vscode/settings.json b/.vscode/settings.example.json similarity index 100% rename from .vscode/settings.json rename to .vscode/settings.example.json diff --git a/BACKPORTING.md b/BACKPORTING.md new file mode 100644 index 00000000..484fb3d2 --- /dev/null +++ b/BACKPORTING.md @@ -0,0 +1,15 @@ +# Approach to Backported Features +All backported features incorperated into MinecraftConsoles should be, when merged, functionally identical to their state in the version of the game we're currently targeting. This should be in reference to a known 4J build of LCE. Verification can either be done by doing a decompilation based match of the implementation or, alternatively, all functionality and limitations of the given feature should be compared against the version of LCE we're targeting. + +# Approach to Bugfixes +Anything that does not behave in an "expected" manner, especially if its behavior is not widely accepted as a gameplay mechanic, is valid for fixing in our repository. This includes bugfixes that were made in versions past the version we target, but excludes any visual changes that may not have been included at the build we're targeting. + +If you provide a visual bugfix that fixes a distinctive quirk of the LCE renderer, it should be provided in an "off by default" state that can be toggled on in-game by the user. There is no guarantee that we will merge it. + +If your visual bugfix is a fix added in a future version of LCE than the one we're targeting, it should also be put behind a toggle or equivalent system for keeping it off by default. + +# Targeted Version +We are currently accepting backports for up to and including TU24. Feature backports from TU25 and above will not be accepted. + +# Original Codebase +MinecraftConsoles is based on a WIP build of TU19, built on top of the December 2014 codebase. diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c6eb80e..63071a0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,138 +13,101 @@ if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) message(FATAL_ERROR "Use a 64-bit generator/toolchain (x64).") endif() +set(CMAKE_CONFIGURATION_TYPES + "Debug" + "Release" + CACHE STRING "" FORCE +) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") -function(configure_msvc_target target) - target_compile_options(${target} PRIVATE - $<$>,$>:/W3> - $<$,$>:/W0> - $<$:/MP> - $<$:/FS> - $<$:/EHsc> - $<$,$>:/GL /O2 /Oi /GT /GF> - ) +function(configure_compiler_target target) + # MSVC and compatible compilers (like Clang-cl) + if (MSVC) + target_compile_options(${target} PRIVATE + $<$,$>:/W3> + $<$,$>:/W0> + $<$:/MP> + $<$:/FS> + $<$:/GS> + $<$:/EHsc> + $<$:/GR> + $<$,$>:/Od> + $<$,$>:/O2 /Oi /GT /GF> + ) + endif() + + # MSVC + if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + target_compile_options(${target} PRIVATE + $<$,$>:/GL> + ) + target_link_options(${target} PRIVATE + $<$:/LTCG:incremental> + ) + endif() + + # Clang + if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + target_compile_options(${target} PRIVATE + $<$,$>:-O0 -Wall> + $<$,$>:-O2 -w -flto> + ) + target_link_options(${target} PRIVATE + $<$:-flto> + ) + endif() endfunction() -include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/WorldSources.cmake") -include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/ClientSources.cmake") -list(TRANSFORM MINECRAFT_WORLD_SOURCES PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.World/") -list(TRANSFORM MINECRAFT_CLIENT_SOURCES PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/") -list(APPEND MINECRAFT_CLIENT_SOURCES - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Xbox/MinecraftWindows.rc" +# --- +# Configuration +# --- +set(MINECRAFT_SHARED_DEFINES + _LARGE_WORLDS + _DEBUG_MENUS_ENABLED + $<$:_DEBUG> + _CRT_NON_CONFORMING_SWPRINTFS + _CRT_SECURE_NO_WARNINGS ) -add_library(MinecraftWorld STATIC ${MINECRAFT_WORLD_SOURCES}) -target_include_directories(MinecraftWorld PRIVATE - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.World" - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.World/x64headers" -) -target_compile_definitions(MinecraftWorld PRIVATE - $<$:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64> - $<$>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64> -) -if(MSVC) - configure_msvc_target(MinecraftWorld) +# Add platform-specific defines +list(APPEND MINECRAFT_SHARED_DEFINES ${PLATFORM_DEFINES}) + +# --- +# Sources +# --- +add_subdirectory(Minecraft.World) +add_subdirectory(Minecraft.Client) +if(PLATFORM_NAME STREQUAL "Windows64") # Server is only supported on Windows for now + add_subdirectory(Minecraft.Server) endif() -add_executable(MinecraftClient WIN32 ${MINECRAFT_CLIENT_SOURCES}) -target_include_directories(MinecraftClient 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}/include/" +# --- +# Build versioning +# --- +set(BUILDVER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateBuildVer.cmake") +set(BUILDVER_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/generated/Common/BuildVer.h") + +add_custom_target(GenerateBuildVer + COMMAND ${CMAKE_COMMAND} + "-DOUTPUT_FILE=${BUILDVER_OUTPUT}" + -P "${BUILDVER_SCRIPT}" + COMMENT "Generating BuildVer.h..." + VERBATIM ) -target_compile_definitions(MinecraftClient PRIVATE - $<$:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64> - $<$>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64> -) -if(MSVC) - configure_msvc_target(MinecraftClient) - target_link_options(MinecraftClient PRIVATE - $<$:/LTCG /INCREMENTAL:NO> - ) + +add_dependencies(Minecraft.World GenerateBuildVer) +add_dependencies(Minecraft.Client GenerateBuildVer) +if(PLATFORM_NAME STREQUAL "Windows64") + add_dependencies(Minecraft.Server GenerateBuildVer) endif() -set_target_properties(MinecraftClient PROPERTIES - VS_DEBUGGER_WORKING_DIRECTORY "$" -) +# --- +# Project organisation +# --- +# Set the startup project for Visual Studio +set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT Minecraft.Client) -target_link_libraries(MinecraftClient 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/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" - > - $<$>: - "${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" - > -) - -if(CMAKE_HOST_WIN32) - message(STATUS "Starting redist copy...") - execute_process( - COMMAND robocopy.exe - "${CMAKE_CURRENT_SOURCE_DIR}/x64/Release" - "${CMAKE_CURRENT_BINARY_DIR}" - /S /MT /R:0 /W:0 /NP - ) - message(STATUS "Starting asset copy...") - execute_process( - COMMAND robocopy.exe - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client" - "${CMAKE_CURRENT_BINARY_DIR}" - /S /MT /R:0 /W:0 /NP - /XF "*.cpp" "*.c" "*.h" "*.hpp" "*.asm" - "*.xml" "*.lang" "*.vcxproj" "*.vcxproj.*" "*.sln" - "*.docx" "*.xls" - "*.bat" "*.cmd" "*.ps1" "*.py" - "*Test*" - /XD "Durango*" "Orbis*" "PS*" "Xbox" - ) - message(STATUS "Patching Windows64Media...") - execute_process( - COMMAND robocopy.exe - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/DurangoMedia" - "${CMAKE_CURRENT_BINARY_DIR}/Windows64Media" - /S /MT /R:0 /W:0 /NP - /XF "*.h" "*.xml" "*.lang" "*.bat" - ) -elseif(CMAKE_HOST_UNIX) - message(STATUS "Starting redist copy...") - execute_process( - COMMAND rsync -av "${CMAKE_CURRENT_SOURCE_DIR}/x64/Release/" "${CMAKE_CURRENT_BINARY_DIR}/" - ) - message(STATUS "Starting asset copy...") - execute_process( - COMMAND rsync -av - "--exclude=*.cpp" "--exclude=*.c" "--exclude=*.h" "--exclude=*.hpp" "--exclude=*.asm" - "--exclude=*.xml" "--exclude=*.lang" "--exclude=*.vcxproj" "--exclude=*.vcxproj.*" "--exclude=*.sln" - "--exclude=*.docx" "--exclude=*.xls" - "--exclude=*.bat" "--exclude=*.cmd" "--exclude=*.ps1" "--exclude=*.py" - "--exclude=*Test*" - "--exclude=Durango*" "--exclude=Orbis*" "--exclude=PS*" "--exclude=Xbox" - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/" "${CMAKE_CURRENT_BINARY_DIR}/" - ) - message(STATUS "Patching Windows64Media...") - execute_process( - COMMAND rsync -av - "--exclude=*.h" "--exclude=*.xml" "--exclude=*.lang" "--exclude=*.bat" - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/DurangoMedia/" "${CMAKE_CURRENT_BINARY_DIR}/Windows64Media/" - ) -else() - message(FATAL_ERROR "Redist and asset copying is only supported on Windows (Robocopy) and Unix systems (rsync).") -endif() - -set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT MinecraftClient) +# Setup folders for Visual Studio, just hides the build targets under a sub folder +set_property(GLOBAL PROPERTY USE_FOLDERS ON) +set_property(TARGET GenerateBuildVer PROPERTY FOLDER "Build") diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 00000000..eb37f11b --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,94 @@ +{ + "version": 5, + "configurePresets": [ + { + "name": "base", + "generator": "Ninja Multi-Config", + "binaryDir": "${sourceDir}/build/${presetName}", + "hidden": true + }, + { + "name": "windows64", + "displayName": "Windows64", + "inherits": "base", + "cacheVariables": { + "PLATFORM_DEFINES": "_WINDOWS64", + "PLATFORM_NAME": "Windows64", + "IGGY_LIBS": "iggy_w64.lib;iggyperfmon_w64.lib;iggyexpruntime_w64.lib" + } + }, + { + "name": "durango", + "displayName": "Durango", + "inherits": "base", + "toolchainFile": "${sourceDir}/cmake/toolchains/durango.cmake", + "cacheVariables": { + "PLATFORM_DEFINES": "_DURANGO;_XBOX_ONE", + "PLATFORM_NAME": "Durango", + "IGGY_LIBS": "iggy_durango.lib;iggyperfmon_durango.lib" + } + }, + { + "name": "orbis", + "displayName": "ORBIS", + "inherits": "base", + "toolchainFile": "${sourceDir}/cmake/toolchains/orbis.cmake", + "cacheVariables": { + "PLATFORM_DEFINES": "__ORBIS__", + "PLATFORM_NAME": "Orbis", + "IGGY_LIBS": "libiggy_orbis.a;libiggyperfmon_orbis.a" + } + }, + { + "name": "ps3", + "displayName": "PS3", + "inherits": "base", + "toolchainFile": "${sourceDir}/cmake/toolchains/ps3.cmake", + "cacheVariables": { + "PLATFORM_DEFINES": "__PS3__", + "PLATFORM_NAME": "PS3", + "IGGY_LIBS": "libiggy_ps3.a;libiggyperfmon_ps3.a;libiggyexpruntime_ps3.a" + } + }, + { + "name": "psvita", + "displayName": "PSVita", + "inherits": "base", + "toolchainFile": "${sourceDir}/cmake/toolchains/psvita.cmake", + "cacheVariables": { + "PLATFORM_DEFINES": "__PSVITA__", + "PLATFORM_NAME": "PSVita", + "IGGY_LIBS": "libiggy_psp2.a;libiggyperfmon_psp2.a" + } + }, + { + "name": "xbox360", + "displayName": "Xbox 360", + "inherits": "base", + "toolchainFile": "${sourceDir}/cmake/toolchains/xbox360.cmake", + "cacheVariables": { + "PLATFORM_DEFINES": "_XBOX", + "PLATFORM_NAME": "Xbox" + } + } + ], + "buildPresets": [ + { "name": "windows64-debug", "displayName": "Windows64 - Debug", "configurePreset": "windows64", "configuration": "Debug" }, + { "name": "windows64-release", "displayName": "Windows64 - Release", "configurePreset": "windows64", "configuration": "Release" }, + + { "name": "durango-debug", "displayName": "Durango - Debug", "configurePreset": "durango", "configuration": "Debug" }, + { "name": "durango-release", "displayName": "Durango - Release", "configurePreset": "durango", "configuration": "Release" }, + + { "name": "orbis-debug", "displayName": "ORBIS - Debug", "configurePreset": "orbis", "configuration": "Debug" }, + { "name": "orbis-release", "displayName": "ORBIS - Release", "configurePreset": "orbis", "configuration": "Release" }, + + { "name": "ps3-debug", "displayName": "PS3 - Debug", "configurePreset": "ps3", "configuration": "Debug" }, + { "name": "ps3-release", "displayName": "PS3 - Release", "configurePreset": "ps3", "configuration": "Release" }, + + { "name": "psvita-debug", "displayName": "PSVita - Debug", "configurePreset": "psvita", "configuration": "Debug" }, + { "name": "psvita-release", "displayName": "PSVita - Release", "configurePreset": "psvita", "configuration": "Release" }, + + { "name": "xbox360-debug", "displayName": "Xbox 360 - Debug", "configurePreset": "xbox360", "configuration": "Debug" }, + { "name": "xbox360-release", "displayName": "Xbox 360 - Release", "configurePreset": "xbox360", "configuration": "Release" } + ] +} \ No newline at end of file diff --git a/COMPILE.md b/COMPILE.md index b62c9575..4a9d56b9 100644 --- a/COMPILE.md +++ b/COMPILE.md @@ -1,46 +1,78 @@ # Compile Instructions -## Visual Studio (`.sln`) +## Visual Studio -1. Open `MinecraftConsoles.sln` in Visual Studio 2022. -2. Set `Minecraft.Client` as the Startup Project. -3. Select configuration: - - `Debug` (recommended), or - - `Release` -4. Select platform: `Windows64`. -5. Build and run: +1. Clone or download the repository +1. Open the repo folder in Visual Studio 2022+. +2. Wait for cmake to configure the project and load all assets (this may take a few minutes on the first run). +3. Right click a folder in the solution explorer and switch to the 'CMake Targets View' +4. Select platform and configuration from the dropdown. EG: `Windows64 - Debug` or `Windows64 - Release` +5. Pick the startup project `Minecraft.Client.exe` or `Minecraft.Server.exe` using the debug targets dropdown +6. Build and run the project: - `Build > Build Solution` (or `Ctrl+Shift+B`) - 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) Configure (use your VS Community instance explicitly): +Open `Developer PowerShell for VS` and run: + ```powershell -cmake -S . -B build -G "Visual Studio 17 2022" -A x64 -DCMAKE_GENERATOR_INSTANCE="C:/Program Files/Microsoft Visual Studio/2022/Community" +cmake --preset windows64 ``` Build Debug: ```powershell -cmake --build build --config Debug --target MinecraftClient +cmake --build --preset windows64-debug --target Minecraft.Client ``` Build Release: ```powershell -cmake --build build --config Release --target MinecraftClient +cmake --build --preset windows64-release --target Minecraft.Client +``` + +Build Dedicated Server (Debug): + +```powershell +cmake --build --preset windows64-debug --target Minecraft.Server +``` + +Build Dedicated Server (Release): + +```powershell +cmake --build --preset windows64-release --target Minecraft.Server ``` Run executable: ```powershell -cd .\build\Debug -.\MinecraftClient.exe +cd .\build\windows64\Minecraft.Client\Debug +.\Minecraft.Client.exe +``` + +Run dedicated server: + +```powershell +cd .\build\windows64\Minecraft.Server\Debug +.\Minecraft.Server.exe -port 25565 -bind 0.0.0.0 -name DedicatedServer ``` Notes: - 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. -- Post-build asset copy is automatic for `MinecraftClient` in CMake (Debug and Release variants). +- Post-build asset copy is automatic for `Minecraft.Client` in CMake (Debug and Release variants). - The game relies on relative paths (for example `Common\Media\...`), so launching from the output directory is required. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c75279d7..fd5d7f03 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,9 @@ # Scope of Project At the moment, this project's scope is generally limited outside of adding new content to the game (blocks, mobs, items). We are currently prioritizing stability, quality of life, and platform support over these things. +## Backporting +If you're backporting a feature, please read [BACKPORTING.md](./BACKPORTING.md) + ## Parity We are attempting to keep our version of LCE as close to visual and experience parity with the original console experience of LCE as possible. This means that we will not be accepting changes that... - Backport things from Java Edition that did not ever exist in LCE @@ -46,6 +49,13 @@ However, we would accept changes that... - Having workable multi-platform compilation for ARM, Consoles, Linux - Being a good base for further expansion and modding of LCE, such as backports and "modpacks". +# Scope of PRs +All Pull Requests should fully document the changes they include in their file changes. They should also be limited to one general topic and not touch all over the codebase unless its justifiable. + +For example, we would not accept a PR that reworks UI, multiplayer code, and furnace ticking even if its a "fixup" PR as its too difficult to review a ton of code changes that are all irrelevant from each other. However, a PR focused on adding a bunch of commands or fixes several crashes that are otherwise irrelevant to each other would be accepted. + +If your PR includes any undocumented changes it will be closed. + # Use of AI and LLMs We currently do not accept any new code into the project that was written largely, entirely, or even noticably by an LLM. All contributions should be made by humans that understand the codebase. diff --git a/Minecraft.Client/CMakeLists.txt b/Minecraft.Client/CMakeLists.txt new file mode 100644 index 00000000..9f75efd2 --- /dev/null +++ b/Minecraft.Client/CMakeLists.txt @@ -0,0 +1,96 @@ +include("${CMAKE_CURRENT_LIST_DIR}/cmake/sources/Common.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/cmake/sources/Durango.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/cmake/sources/ORBIS.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/cmake/sources/PS3.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/cmake/sources/PSVita.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/cmake/sources/Windows.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/cmake/sources/Xbox360.cmake") + +include("${CMAKE_SOURCE_DIR}/cmake/CommonSources.cmake") + +include("${CMAKE_SOURCE_DIR}/cmake/Utils.cmake") + +# Combine all source files into a single variable for the target +# We cant use CMAKE_CONFIGURE_PRESET here as VS doesn't set it, so just rely on the folder +set(MINECRAFT_CLIENT_SOURCES + ${MINECRAFT_CLIENT_COMMON} + $<$:${MINECRAFT_CLIENT_DURANGO}> + $<$:${MINECRAFT_CLIENT_ORBIS}> + $<$:${MINECRAFT_CLIENT_PS3}> + $<$:${MINECRAFT_CLIENT_PSVITA}> + $<$:${MINECRAFT_CLIENT_WINDOWS}> + $<$:${MINECRAFT_CLIENT_XBOX360}> + ${SOURCES_COMMON} +) + +add_executable(Minecraft.Client ${MINECRAFT_CLIENT_SOURCES}) + +# Only define executable on windows +if(PLATFORM_NAME STREQUAL "Windows64") + set_target_properties(Minecraft.Client PROPERTIES WIN32_EXECUTABLE TRUE) +endif() + +target_include_directories(Minecraft.Client PRIVATE + "${CMAKE_BINARY_DIR}/generated/" # This is for the generated BuildVer.h + "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/${PLATFORM_NAME}/Iggy/include" + "${CMAKE_SOURCE_DIR}/include/" +) +target_compile_definitions(Minecraft.Client PRIVATE + ${MINECRAFT_SHARED_DEFINES} +) +target_precompile_headers(Minecraft.Client PRIVATE "$<$:stdafx.h>") +set_source_files_properties(compat_shims.cpp PROPERTIES SKIP_PRECOMPILE_HEADERS ON) # This redefines internal MSVC CRT symbols which will cause an issue with PCH + +configure_compiler_target(Minecraft.Client) + +set_target_properties(Minecraft.Client PROPERTIES + OUTPUT_NAME "Minecraft.Client" + VS_DEBUGGER_WORKING_DIRECTORY "$" +) + +target_link_libraries(Minecraft.Client PRIVATE + Minecraft.World + d3d11 + d3dcompiler + XInput9_1_0 + wsock32 + legacy_stdio_definitions + $<$: # Debug 4J libraries + "${CMAKE_CURRENT_SOURCE_DIR}/${PLATFORM_NAME}/4JLibs/libs/4J_Input_d.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/${PLATFORM_NAME}/4JLibs/libs/4J_Storage_d.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/${PLATFORM_NAME}/4JLibs/libs/4J_Render_PC_d.lib" + > + $<$>: # Release 4J libraries + "${CMAKE_CURRENT_SOURCE_DIR}/${PLATFORM_NAME}/4JLibs/libs/4J_Input.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/${PLATFORM_NAME}/4JLibs/libs/4J_Storage.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/${PLATFORM_NAME}/4JLibs/libs/4J_Render_PC.lib" + > +) + +# Iggy libs +foreach(lib IN LISTS IGGY_LIBS) + target_link_libraries(Minecraft.Client PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/${PLATFORM_NAME}/Iggy/lib/${lib}") +endforeach() + +# --- +# Asset / redist copy +# --- +include("${CMAKE_SOURCE_DIR}/cmake/CopyAssets.cmake") +set(ASSET_FOLDER_PAIRS + "${CMAKE_CURRENT_SOURCE_DIR}/music" "music" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Media" "Common/Media" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res" "Common/res" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Trial" "Common/Trial" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Tutorial" "Common/Tutorial" + "${CMAKE_CURRENT_SOURCE_DIR}/${PLATFORM_NAME}Media" "${PLATFORM_NAME}Media" +) +setup_asset_folder_copy(Minecraft.Client "${ASSET_FOLDER_PAIRS}") + +# Copy redist files +add_copyredist_target(Minecraft.Client) + +# Make sure GameHDD exists on Windows +if(PLATFORM_NAME STREQUAL "Windows64") + add_gamehdd_target(Minecraft.Client) +endif() diff --git a/Minecraft.Client/ClientConnection.cpp b/Minecraft.Client/ClientConnection.cpp index ba40b43e..a80af5d2 100644 --- a/Minecraft.Client/ClientConnection.cpp +++ b/Minecraft.Client/ClientConnection.cpp @@ -149,8 +149,56 @@ bool ClientConnection::isPrimaryConnection() const return g_NetworkManager.IsHost() || m_userIndex == ProfileManager.GetPrimaryPad(); } +ClientConnection* ClientConnection::findPrimaryConnection() const +{ + if (level == nullptr) return nullptr; + int primaryPad = ProfileManager.GetPrimaryPad(); + MultiPlayerLevel* mpLevel = (MultiPlayerLevel*)level; + for (ClientConnection* conn : mpLevel->connections) + { + if (conn != this && conn->m_userIndex == primaryPad) + return conn; + } + return nullptr; +} + +bool ClientConnection::shouldProcessForEntity(int entityId) const +{ + if (g_NetworkManager.IsHost()) return true; + if (m_userIndex == ProfileManager.GetPrimaryPad()) return true; + + ClientConnection* primary = findPrimaryConnection(); + if (primary == nullptr) return true; + return !primary->isTrackingEntity(entityId); +} + +bool ClientConnection::shouldProcessForPosition(int blockX, int blockZ) const +{ + if (g_NetworkManager.IsHost()) return true; + if (m_userIndex == ProfileManager.GetPrimaryPad()) return true; + + ClientConnection* primary = findPrimaryConnection(); + if (primary == nullptr) return true; + return !primary->m_visibleChunks.count(chunkKey(blockX >> 4, blockZ >> 4)); +} + +bool ClientConnection::anyOtherConnectionHasChunk(int x, int z) const +{ + if (level == nullptr) return false; + MultiPlayerLevel* mpLevel = (MultiPlayerLevel*)level; + int64_t key = chunkKey(x, z); + for (ClientConnection* conn : mpLevel->connections) + { + if (conn != this && conn->m_visibleChunks.count(key)) + return true; + } + return false; +} + ClientConnection::~ClientConnection() { + m_trackedEntityIds.clear(); + m_visibleChunks.clear(); delete connection; delete random; delete savedDataStorage; @@ -664,6 +712,7 @@ void ClientConnection::handleAddEntity(shared_ptr packet) } e->entityId = packet->id; level->putEntity(packet->id, e); + m_trackedEntityIds.insert(packet->id); if (packet->data > -1) // 4J - changed "no data" value to be -1, we can have a valid entity id of 0 { @@ -712,6 +761,7 @@ void ClientConnection::handleAddExperienceOrb(shared_ptr e->xRot = 0; e->entityId = packet->id; level->putEntity(packet->id, e); + m_trackedEntityIds.insert(packet->id); } void ClientConnection::handleAddGlobalEntity(shared_ptr packet) @@ -738,13 +788,13 @@ void ClientConnection::handleAddPainting(shared_ptr packet) { shared_ptr painting = std::make_shared(level, packet->x, packet->y, packet->z, packet->dir, packet->motive); level->putEntity(packet->id, painting); + m_trackedEntityIds.insert(packet->id); } void ClientConnection::handleSetEntityMotion(shared_ptr packet) { - if (!isPrimaryConnection()) + if (!shouldProcessForEntity(packet->id)) { - // Secondary connection: only accept motion for our own local player (knockback) if (minecraft->localplayers[m_userIndex] == NULL || packet->id != minecraft->localplayers[m_userIndex]->entityId) return; @@ -939,6 +989,7 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) app.DebugPrintf("Custom cape for player %ls is %ls\n",player->name.c_str(),player->customTextureUrl2.c_str()); level->putEntity(packet->id, player); + m_trackedEntityIds.insert(packet->id); vector > *unpackedData = packet->getUnpackedData(); if (unpackedData != nullptr) @@ -979,7 +1030,7 @@ void ClientConnection::handleSetCarriedItem(shared_ptr pac void ClientConnection::handleMoveEntity(shared_ptr packet) { - if (!isPrimaryConnection()) return; + if (!shouldProcessForEntity(packet->id)) return; shared_ptr e = getEntity(packet->id); if (e == nullptr) return; e->xp += packet->xa; @@ -1009,7 +1060,7 @@ void ClientConnection::handleRotateMob(shared_ptr packet) void ClientConnection::handleMoveEntitySmall(shared_ptr packet) { - if (!isPrimaryConnection()) return; + if (!shouldProcessForEntity(packet->id)) return; shared_ptr e = getEntity(packet->id); if (e == nullptr) return; e->xp += packet->xa; @@ -1068,6 +1119,7 @@ void ClientConnection::handleRemoveEntity(shared_ptr packe #endif for (int i = 0; i < packet->ids.length; i++) { + m_trackedEntityIds.erase(packet->ids[i]); level->removeEntity(packet->ids[i]); } } @@ -1136,19 +1188,35 @@ void ClientConnection::handleChunkVisibilityArea(shared_ptrm_minZ; z <= packet->m_maxZ; ++z) + { for(int x = packet->m_minX; x <= packet->m_maxX; ++x) + { + m_visibleChunks.insert(chunkKey(x, z)); level->setChunkVisible(x, z, true); + } + } } void ClientConnection::handleChunkVisibility(shared_ptr packet) { if (level == NULL) return; - level->setChunkVisible(packet->x, packet->z, packet->visible); + if (packet->visible) + { + m_visibleChunks.insert(chunkKey(packet->x, packet->z)); + level->setChunkVisible(packet->x, packet->z, true); + } + else + { + m_visibleChunks.erase(chunkKey(packet->x, packet->z)); + if (!anyOtherConnectionHasChunk(packet->x, packet->z)) + { + level->setChunkVisible(packet->x, packet->z, false); + } + } } void ClientConnection::handleChunkTilesUpdate(shared_ptr packet) { - if (!isPrimaryConnection()) return; // 4J - changed to encode level in packet MultiPlayerLevel *dimensionLevel = (MultiPlayerLevel *)minecraft->levels[packet->levelIdx]; if( dimensionLevel ) @@ -1218,7 +1286,6 @@ void ClientConnection::handleChunkTilesUpdate(shared_ptr void ClientConnection::handleBlockRegionUpdate(shared_ptr packet) { - if (!isPrimaryConnection()) return; // 4J - changed to encode level in packet MultiPlayerLevel *dimensionLevel = (MultiPlayerLevel *)minecraft->levels[packet->levelIdx]; if( dimensionLevel ) @@ -1279,7 +1346,6 @@ void ClientConnection::handleBlockRegionUpdate(shared_ptr packet) { - if (!isPrimaryConnection()) return; // 4J added - using a block of 255 to signify that this is a packet for destroying a tile, where we need to inform the level renderer that we are about to do so. // This is used in creative mode as the point where a tile is first destroyed at the client end of things. Packets formed like this are potentially sent from // ServerPlayerGameMode::destroyBlock @@ -1394,7 +1460,7 @@ void ClientConnection::send(shared_ptr packet) void ClientConnection::handleTakeItemEntity(shared_ptr packet) { - if (!isPrimaryConnection()) return; + if (!shouldProcessForEntity(packet->itemId)) return; shared_ptr from = getEntity(packet->itemId); shared_ptr to = dynamic_pointer_cast(getEntity(packet->playerId)); @@ -2414,6 +2480,8 @@ void ClientConnection::close() // If it's already done, then we don't need to do anything here. And in fact trying to do something could cause a crash if(done) return; done = true; + m_trackedEntityIds.clear(); + m_visibleChunks.clear(); connection->flush(); connection->close(DisconnectPacket::eDisconnect_Closed); } @@ -2453,6 +2521,7 @@ void ClientConnection::handleAddMob(shared_ptr packet) mob->yd = packet->yd / 8000.0f; mob->zd = packet->zd / 8000.0f; level->putEntity(packet->id, mob); + m_trackedEntityIds.insert(packet->id); vector > *unpackedData = packet->getUnpackedData(); if (unpackedData != nullptr) @@ -2792,6 +2861,9 @@ void ClientConnection::handleRespawn(shared_ptr packet) // so it doesn't leak into the new dimension level->playStreamingMusic(L"", 0, 0, 0); + m_trackedEntityIds.clear(); + m_visibleChunks.clear(); + // Remove client connection from this level level->removeClientConnection(this, false); @@ -2899,8 +2971,7 @@ void ClientConnection::handleRespawn(shared_ptr packet) void ClientConnection::handleExplosion(shared_ptr packet) { - // World modification (block destruction) must only happen once - if (isPrimaryConnection()) + if (shouldProcessForPosition((int)packet->x, (int)packet->z)) { if(!packet->m_bKnockbackOnly) { @@ -3244,7 +3315,6 @@ void ClientConnection::handleTileEditorOpen(shared_ptr pac void ClientConnection::handleSignUpdate(shared_ptr packet) { - if (!isPrimaryConnection()) return; app.DebugPrintf("ClientConnection::handleSignUpdate - "); if (minecraft->level->hasChunkAt(packet->x, packet->y, packet->z)) { @@ -3278,7 +3348,6 @@ void ClientConnection::handleSignUpdate(shared_ptr packet) void ClientConnection::handleTileEntityData(shared_ptr packet) { - if (!isPrimaryConnection()) return; if (minecraft->level->hasChunkAt(packet->x, packet->y, packet->z)) { shared_ptr te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z); @@ -3331,7 +3400,6 @@ void ClientConnection::handleContainerClose(shared_ptr pac void ClientConnection::handleTileEvent(shared_ptr packet) { - if (!isPrimaryConnection()) return; PIXBeginNamedEvent(0,"Handle tile event\n"); minecraft->level->tileEvent(packet->x, packet->y, packet->z, packet->tile, packet->b0, packet->b1); PIXEndNamedEvent(); @@ -3339,7 +3407,6 @@ void ClientConnection::handleTileEvent(shared_ptr packet) void ClientConnection::handleTileDestruction(shared_ptr packet) { - if (!isPrimaryConnection()) return; minecraft->level->destroyTileProgress(packet->getEntityId(), packet->getX(), packet->getY(), packet->getZ(), packet->getState()); } @@ -3421,7 +3488,6 @@ void ClientConnection::handleGameEvent(shared_ptr gameEventPack void ClientConnection::handleComplexItemData(shared_ptr packet) { - if (!isPrimaryConnection()) return; if (packet->itemType == Item::map->id) { MapItem::getSavedData(packet->itemId, minecraft->level)->handleComplexItemData(packet->data); @@ -3436,7 +3502,7 @@ void ClientConnection::handleComplexItemData(shared_ptr p void ClientConnection::handleLevelEvent(shared_ptr packet) { - if (!isPrimaryConnection()) return; + if (!shouldProcessForPosition(packet->x, packet->z)) return; if (packet->type == LevelEvent::SOUND_DRAGON_DEATH) { for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) @@ -3456,8 +3522,6 @@ void ClientConnection::handleLevelEvent(shared_ptr packet) { minecraft->level->levelEvent(packet->type, packet->x, packet->y, packet->z, packet->data); } - - minecraft->level->levelEvent(packet->type, packet->x, packet->y, packet->z, packet->data); } void ClientConnection::handleAwardStat(shared_ptr packet) @@ -3660,7 +3724,6 @@ void ClientConnection::handlePlayerAbilities(shared_ptr p void ClientConnection::handleSoundEvent(shared_ptr packet) { - if (!isPrimaryConnection()) return; minecraft->level->playLocalSound(packet->getX(), packet->getY(), packet->getZ(), packet->getSound(), packet->getVolume(), packet->getPitch(), false); } @@ -3973,7 +4036,8 @@ void ClientConnection::handleSetPlayerTeamPacket(shared_ptr void ClientConnection::handleParticleEvent(shared_ptr packet) { - if (!isPrimaryConnection()) return; + ePARTICLE_TYPE particleId = (ePARTICLE_TYPE)Integer::parseInt(packet->getName()); + for (int i = 0; i < packet->getCount(); i++) { double xVarience = random->nextGaussian() * packet->getXDist(); @@ -3983,10 +4047,6 @@ void ClientConnection::handleParticleEvent(shared_ptr pack double ya = random->nextGaussian() * packet->getMaxSpeed(); double za = random->nextGaussian() * packet->getMaxSpeed(); - // TODO: determine particle ID from name - assert(0); - ePARTICLE_TYPE particleId = eParticleType_heart; - level->addParticle(particleId, packet->getX() + xVarience, packet->getY() + yVarience, packet->getZ() + zVarience, xa, ya, za); } } diff --git a/Minecraft.Client/ClientConnection.h b/Minecraft.Client/ClientConnection.h index f13b93e7..3448496d 100644 --- a/Minecraft.Client/ClientConnection.h +++ b/Minecraft.Client/ClientConnection.h @@ -1,4 +1,5 @@ #pragma once +#include #include "..\Minecraft.World\net.minecraft.network.h" class Minecraft; class MultiPlayerLevel; @@ -44,6 +45,20 @@ public: private: DWORD m_userIndex; // 4J Added bool isPrimaryConnection() const; + + std::unordered_set m_trackedEntityIds; + std::unordered_set m_visibleChunks; + + static int64_t chunkKey(int x, int z) { return ((int64_t)x << 32) | ((int64_t)z & 0xFFFFFFFF); } + + ClientConnection* findPrimaryConnection() const; + bool shouldProcessForEntity(int entityId) const; + bool shouldProcessForPosition(int blockX, int blockZ) const; + bool anyOtherConnectionHasChunk(int x, int z) const; + +public: + bool isTrackingEntity(int entityId) const { return m_trackedEntityIds.count(entityId) > 0; } + public: SavedDataStorage *savedDataStorage; ClientConnection(Minecraft *minecraft, const wstring& ip, int port); diff --git a/Minecraft.Client/Common/Audio/SoundEngine.cpp b/Minecraft.Client/Common/Audio/SoundEngine.cpp index 24cb7bf4..cf140c78 100644 --- a/Minecraft.Client/Common/Audio/SoundEngine.cpp +++ b/Minecraft.Client/Common/Audio/SoundEngine.cpp @@ -260,9 +260,9 @@ void SoundEngine::updateMiniAudio() continue; } - float finalVolume = s->info.volume * m_MasterEffectsVolume; - if (finalVolume > 1.0f) - finalVolume = 1.0f; + float finalVolume = s->info.volume * m_MasterEffectsVolume * SFX_VOLUME_MULTIPLIER; + if (finalVolume > SFX_MAX_GAIN) + finalVolume = SFX_MAX_GAIN; ma_sound_set_volume(&s->sound, finalVolume); ma_sound_set_pitch(&s->sound, s->info.pitch); @@ -557,10 +557,13 @@ void SoundEngine::play(int iSound, float x, float y, float z, float volume, floa } ma_sound_set_spatialization_enabled(&s->sound, MA_TRUE); + ma_sound_set_min_distance(&s->sound, SFX_3D_MIN_DISTANCE); + ma_sound_set_max_distance(&s->sound, SFX_3D_MAX_DISTANCE); + ma_sound_set_rolloff(&s->sound, SFX_3D_ROLLOFF); - float finalVolume = volume * m_MasterEffectsVolume; - if (finalVolume > 1.0f) - finalVolume = 1.0f; + float finalVolume = volume * m_MasterEffectsVolume * SFX_VOLUME_MULTIPLIER; + if (finalVolume > SFX_MAX_GAIN) + finalVolume = SFX_MAX_GAIN; ma_sound_set_volume(&s->sound, finalVolume); ma_sound_set_pitch(&s->sound, pitch); diff --git a/Minecraft.Client/Common/Audio/SoundEngine.h b/Minecraft.Client/Common/Audio/SoundEngine.h index 2134c491..38d70d41 100644 --- a/Minecraft.Client/Common/Audio/SoundEngine.h +++ b/Minecraft.Client/Common/Audio/SoundEngine.h @@ -6,6 +6,12 @@ using namespace std; #include "miniaudio.h" +constexpr float SFX_3D_MIN_DISTANCE = 1.0f; +constexpr float SFX_3D_MAX_DISTANCE = 16.0f; +constexpr float SFX_3D_ROLLOFF = 0.5f; +constexpr float SFX_VOLUME_MULTIPLIER = 1.5f; +constexpr float SFX_MAX_GAIN = 1.5f; + enum eMUSICFILES { eStream_Overworld_Calm1 = 0, diff --git a/Minecraft.Client/Common/CommonMedia.sln b/Minecraft.Client/Common/CommonMedia.sln deleted file mode 100644 index 9f83988e..00000000 --- a/Minecraft.Client/Common/CommonMedia.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CommonMedia", "CommonMedia.vcxproj", "{21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}" -EndProject -Global - GlobalSection(TeamFoundationVersionControl) = preSolution - SccNumberOfProjects = 2 - SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - SccTeamFoundationServer = http://tfs_server:8080/tfs/storiespark - SccProjectUniqueName0 = CommonMedia.vcxproj - SccLocalPath0 = . - SccLocalPath1 = . - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Debug|Win32.ActiveCfg = Debug|Win32 - {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Debug|Win32.Build.0 = Debug|Win32 - {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Release|Win32.ActiveCfg = Release|Win32 - {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Minecraft.Client/Common/CommonMedia.vcxproj b/Minecraft.Client/Common/CommonMedia.vcxproj deleted file mode 100644 index 5a472e0b..00000000 --- a/Minecraft.Client/Common/CommonMedia.vcxproj +++ /dev/null @@ -1,115 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27} - MakeFileProj - SAK - SAK - SAK - SAK - - - - Makefile - true - v110 - - - Makefile - false - v110 - - - - - - - - - - - - - WIN32;_DEBUG;$(NMakePreprocessorDefinitions) - echo Creating languages.loc -copy .\Media\strings.resx .\Media\en-EN.lang -copy .\Media\fr-FR\strings.resx .\Media\fr-FR\fr-FR.lang -copy .\Media\ja-JP\strings.resx .\Media\ja-JP\ja-JP.lang -..\..\..\Tools\NewLocalisationPacker.exe --static .\Media .\Media\languages.loc - -echo Making archive -..\..\..\Tools\ArchiveFilePacker.exe -cd $(ProjectDir)\Media media.arc media.txt - -echo Copying Durango strings.h -copy .\Media\strings.h ..\Durango\strings.h - -echo Copying PS3 strings.h -copy .\Media\strings.h ..\PS3\strings.h - -echo Copying PS4 strings.h -copy .\Media\strings.h ..\Orbis\strings.h - -echo Copying Win strings.h -copy .\Media\strings.h ..\Windows64\strings.h - - - WIN32;NDEBUG;$(NMakePreprocessorDefinitions) - - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/Common/CommonMedia.vcxproj.filters b/Minecraft.Client/Common/CommonMedia.vcxproj.filters deleted file mode 100644 index 9fb0927d..00000000 --- a/Minecraft.Client/Common/CommonMedia.vcxproj.filters +++ /dev/null @@ -1,136 +0,0 @@ - - - - - {55c7ab2e-b3e5-4aed-9ffe-3308591d9c34} - - - {eaa0eb72-0b27-4080-ad53-f68e42f37ba8} - - - {711ad95b-eb56-4e18-b001-34ad7b8075a3} - - - {1432ec3d-c5d0-46da-91b6-e7737095a97e} - - - {4b2aeaf1-04d7-454d-b2d9-08364799831c} - - - {4b0eaef6-fa2f-4605-b0da-a81ffb5659bc} - - - {bf1c74da-21f1-4bdd-98ed-83457946e4cc} - - - - - IggyMedia - - - IggyMedia - - - IggyMedia - - - IggyMedia - - - IggyMedia - - - IggyMedia - - - IggyMedia - - - Archive - - - Archive - - - IggyMedia - - - IggyMedia - - - IggyMedia - - - IggyMedia - - - IggyMedia - - - IggyMedia - - - IggyMedia - - - - - Strings - - - - - Strings - - - Strings - - - Strings - - - Strings - - - Strings - - - Strings - - - Strings - - - Strings - - - Strings - - - Strings - - - Strings - - - Strings - - - Archive - - - - - Archive\Durango - - - Archive\PS3 - - - Archive\PS4 - - - Archive\Win64 - - - \ No newline at end of file diff --git a/Minecraft.Client/Common/Console_Utils.cpp b/Minecraft.Client/Common/Console_Utils.cpp index cb0f1b58..9a64dbea 100644 --- a/Minecraft.Client/Common/Console_Utils.cpp +++ b/Minecraft.Client/Common/Console_Utils.cpp @@ -1,21 +1,32 @@ #include "stdafx.h" +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) +#include "..\..\Minecraft.Server\ServerLogManager.h" +#endif //-------------------------------------------------------------------------------------- // Name: DebugSpewV() // Desc: Internal helper function //-------------------------------------------------------------------------------------- #ifndef _CONTENT_PACKAGE -static VOID DebugSpewV( const CHAR* strFormat, const va_list pArgList ) +static VOID DebugSpewV( const CHAR* strFormat, va_list pArgList ) { #if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ - assert(0); + assert(0); #else - CHAR str[2048]; - // Use the secure CRT to avoid buffer overruns. Specify a count of - // _TRUNCATE so that too long strings will be silently truncated - // rather than triggering an error. - _vsnprintf_s( str, _TRUNCATE, strFormat, pArgList ); - OutputDebugStringA( str ); +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + // Dedicated server routes legacy debug spew through ServerLogger to preserve CLI prompt handling. + if (ServerRuntime::ServerLogManager::ShouldForwardClientDebugLogs()) + { + ServerRuntime::ServerLogManager::ForwardClientDebugSpewLogV(strFormat, pArgList); + return; + } +#endif + CHAR str[2048]; + // Use the secure CRT to avoid buffer overruns. Specify a count of + // _TRUNCATE so that too long strings will be silently truncated + // rather than triggering an error. + _vsnprintf_s( str, _TRUNCATE, strFormat, pArgList ); + OutputDebugStringA( str ); #endif } #endif @@ -31,10 +42,9 @@ VOID CDECL DebugPrintf( const CHAR* strFormat, ... ) #endif { #ifndef _CONTENT_PACKAGE - va_list pArgList; - va_start( pArgList, strFormat ); - DebugSpewV( strFormat, pArgList ); - va_end( pArgList ); + va_list pArgList; + va_start( pArgList, strFormat ); + DebugSpewV( strFormat, pArgList ); + va_end( pArgList ); #endif } - diff --git a/Minecraft.Client/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp index c3a623d5..0a2fd159 100644 --- a/Minecraft.Client/Common/Consoles_App.cpp +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -38,6 +38,9 @@ #include "GameRules\ConsoleSchematicFile.h" #include "..\User.h" #include "..\..\Minecraft.World\LevelData.h" +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) +#include "..\..\Minecraft.Server\ServerLogManager.h" +#endif #include "..\..\Minecraft.World\net.minecraft.world.entity.player.h" #include "..\EntityRenderDispatcher.h" #include "..\..\Minecraft.World\compression.h" @@ -240,12 +243,21 @@ void CMinecraftApp::DebugPrintf(const char *szFormat, ...) { #ifndef _FINAL_BUILD - char buf[1024]; - va_list ap; - va_start(ap, szFormat); - vsnprintf(buf, sizeof(buf), szFormat, ap); - va_end(ap); - OutputDebugStringA(buf); + va_list ap; + va_start(ap, szFormat); +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + // Dedicated server routes client debug spew through ServerLogger so CLI output stays prompt-safe. + if (ServerRuntime::ServerLogManager::ShouldForwardClientDebugLogs()) + { + ServerRuntime::ServerLogManager::ForwardClientAppDebugLogV(szFormat, ap); + va_end(ap); + return; + } +#endif + char buf[1024]; + vsnprintf(buf, sizeof(buf), szFormat, ap); + va_end(ap); + OutputDebugStringA(buf); #endif } @@ -253,53 +265,62 @@ void CMinecraftApp::DebugPrintf(const char *szFormat, ...) void CMinecraftApp::DebugPrintf(int user, const char *szFormat, ...) { #ifndef _FINAL_BUILD - if(user == USER_NONE) - return; - char buf[1024]; - va_list ap; - va_start(ap, szFormat); - vsnprintf(buf, sizeof(buf), szFormat, ap); - va_end(ap); + if(user == USER_NONE) + return; + va_list ap; + va_start(ap, szFormat); +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + // Dedicated server routes client debug spew through ServerLogger so CLI output stays prompt-safe. + if (ServerRuntime::ServerLogManager::ShouldForwardClientDebugLogs()) + { + ServerRuntime::ServerLogManager::ForwardClientUserDebugLogV(user, szFormat, ap); + va_end(ap); + return; + } +#endif + char buf[1024]; + vsnprintf(buf, sizeof(buf), szFormat, ap); + va_end(ap); #ifdef __PS3__ - unsigned int writelen; - sys_tty_write(SYS_TTYP_USER1 + ( user - 1 ), buf, strlen(buf), &writelen ); + unsigned int writelen; + sys_tty_write(SYS_TTYP_USER1 + ( user - 1 ), buf, strlen(buf), &writelen ); #elif defined __PSVITA__ - switch(user) - { - case 0: - { - SceUID tty2 = sceIoOpen("tty2:", SCE_O_WRONLY, 0); - if(tty2>=0) - { - std::string string1(buf); - sceIoWrite(tty2, string1.c_str(), string1.length()); - sceIoClose(tty2); - } - } - break; - case 1: - { - SceUID tty3 = sceIoOpen("tty3:", SCE_O_WRONLY, 0); - if(tty3>=0) - { - std::string string1(buf); - sceIoWrite(tty3, string1.c_str(), string1.length()); - sceIoClose(tty3); - } - } - break; - default: - OutputDebugStringA(buf); - break; - } + switch(user) + { + case 0: + { + SceUID tty2 = sceIoOpen("tty2:", SCE_O_WRONLY, 0); + if(tty2>=0) + { + std::string string1(buf); + sceIoWrite(tty2, string1.c_str(), string1.length()); + sceIoClose(tty2); + } + } + break; + case 1: + { + SceUID tty3 = sceIoOpen("tty3:", SCE_O_WRONLY, 0); + if(tty3>=0) + { + std::string string1(buf); + sceIoWrite(tty3, string1.c_str(), string1.length()); + sceIoClose(tty3); + } + } + break; + default: + OutputDebugStringA(buf); + break; + } #else - OutputDebugStringA(buf); + OutputDebugStringA(buf); #endif #ifndef _XBOX - if(user == USER_UI) - { - ui.logDebugString(buf); - } + if(user == USER_UI) + { + ui.logDebugString(buf); + } #endif #endif } diff --git a/Minecraft.Client/Common/DLC/DLCManager.cpp b/Minecraft.Client/Common/DLC/DLCManager.cpp index 931b0e1d..c363becf 100644 --- a/Minecraft.Client/Common/DLC/DLCManager.cpp +++ b/Minecraft.Client/Common/DLC/DLCManager.cpp @@ -10,6 +10,7 @@ const WCHAR *DLCManager::wchTypeNamesA[]= { + L"XMLVERSION", L"DISPLAYNAME", L"THEMENAME", L"FREE", @@ -387,41 +388,65 @@ bool DLCManager::processDLCDataFile(DWORD &dwFilesProcessed, PBYTE pbData, DWORD // // unsigned long, p = number of parameters // // p * DLC_FILE_PARAM describing each parameter for this file // // ulFileSize bytes of data blob of the file added - unsigned int uiVersion=*(unsigned int *)pbData; + unsigned int uiVersion=readUInt32(pbData, false); uiCurrentByte+=sizeof(int); - if(uiVersion < CURRENT_DLC_VERSION_NUM) - { - if(pbData!=nullptr) delete [] pbData; - app.DebugPrintf("DLC version of %d is too old to be read\n", uiVersion); + bool bSwapEndian = false; + unsigned int uiVersionSwapped = SwapInt32(uiVersion); + if (uiVersion >= 0 && uiVersion <= CURRENT_DLC_VERSION_NUM) { + bSwapEndian = false; + } else if (uiVersionSwapped >= 0 && uiVersionSwapped <= CURRENT_DLC_VERSION_NUM) { + bSwapEndian = true; + } else { + if(pbData!=nullptr) delete [] pbData; + app.DebugPrintf("Unknown DLC version of %d\n", uiVersion); return false; } pack->SetDataPointer(pbData); - unsigned int uiParameterCount=*(unsigned int *)&pbData[uiCurrentByte]; + unsigned int uiParameterCount=readUInt32(&pbData[uiCurrentByte], bSwapEndian); uiCurrentByte+=sizeof(int); C4JStorage::DLC_FILE_PARAM *pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + bool bXMLVersion = false; //DWORD dwwchCount=0; for(unsigned int i=0;idwType = bSwapEndian ? SwapInt32(pParams->dwType) : pParams->dwType; + pParams->dwWchCount = bSwapEndian ? SwapInt32(pParams->dwWchCount) : pParams->dwWchCount; + char16_t* wchData = reinterpret_cast(pParams->wchData); + if (bSwapEndian) { + SwapUTF16Bytes(wchData, pParams->dwWchCount); + } + // Map DLC strings to application strings, then store the DLC index mapping to application index wstring parameterName(static_cast(pParams->wchData)); EDLCParameterType type = getParameterType(parameterName); if( type != e_DLCParamType_Invalid ) { parameterMapping[pParams->dwType] = type; + + if (type == e_DLCParamType_XMLVersion) + { + bXMLVersion = true; + } } uiCurrentByte+= sizeof(C4JStorage::DLC_FILE_PARAM)+(pParams->dwWchCount*sizeof(WCHAR)); pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; } //ulCurrentByte+=ulParameterCount * sizeof(C4JStorage::DLC_FILE_PARAM); - unsigned int uiFileCount=*(unsigned int *)&pbData[uiCurrentByte]; + if (bXMLVersion) + { + uiCurrentByte += sizeof(int); + } + + unsigned int uiFileCount=readUInt32(&pbData[uiCurrentByte], bSwapEndian); uiCurrentByte+=sizeof(int); C4JStorage::DLC_FILE_DETAILS *pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; DWORD dwTemp=uiCurrentByte; for(unsigned int i=0;idwWchCount = bSwapEndian ? SwapInt32(pFile->dwWchCount) : pFile->dwWchCount; dwTemp+=sizeof(C4JStorage::DLC_FILE_DETAILS)+pFile->dwWchCount*sizeof(WCHAR); pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[dwTemp]; } @@ -430,6 +455,13 @@ bool DLCManager::processDLCDataFile(DWORD &dwFilesProcessed, PBYTE pbData, DWORD for(unsigned int i=0;idwType = bSwapEndian ? SwapInt32(pFile->dwType) : pFile->dwType; + pFile->uiFileSize = bSwapEndian ? SwapInt32(pFile->uiFileSize) : pFile->uiFileSize; + char16_t* wchFile = reinterpret_cast(pFile->wchFile); + if (bSwapEndian) { + SwapUTF16Bytes(wchFile, pFile->dwWchCount); + } + EDLCType type = static_cast(pFile->dwType); DLCFile *dlcFile = nullptr; @@ -445,12 +477,18 @@ bool DLCManager::processDLCDataFile(DWORD &dwFilesProcessed, PBYTE pbData, DWORD } // Params - uiParameterCount=*(unsigned int *)pbTemp; + uiParameterCount=readUInt32(pbTemp, bSwapEndian); pbTemp+=sizeof(int); pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; for(unsigned int j=0;jdwType = bSwapEndian ? SwapInt32(pParams->dwType) : pParams->dwType; + pParams->dwWchCount = bSwapEndian ? SwapInt32(pParams->dwWchCount) : pParams->dwWchCount; + char16_t* wchData = reinterpret_cast(pParams->wchData); + if (bSwapEndian) { + SwapUTF16Bytes(wchData, pParams->dwWchCount); + } auto it = parameterMapping.find(pParams->dwType); diff --git a/Minecraft.Client/Common/DLC/DLCManager.h b/Minecraft.Client/Common/DLC/DLCManager.h index d4dd2508..f114bd07 100644 --- a/Minecraft.Client/Common/DLC/DLCManager.h +++ b/Minecraft.Client/Common/DLC/DLCManager.h @@ -31,7 +31,8 @@ public: { e_DLCParamType_Invalid = -1, - e_DLCParamType_DisplayName = 0, + e_DLCParamType_XMLVersion = 0, + e_DLCParamType_DisplayName, e_DLCParamType_ThemeName, e_DLCParamType_Free, // identify free skins e_DLCParamType_Credit, // legal credits for DLC @@ -94,6 +95,30 @@ public: bool readDLCDataFile(DWORD &dwFilesProcessed, const string &path, DLCPack *pack, bool fromArchive = false); DWORD retrievePackIDFromDLCDataFile(const string &path, DLCPack *pack); + static unsigned short SwapInt16(unsigned short value) { + return (value >> 8) | (value << 8); + } + + static unsigned int SwapInt32(unsigned int value) { + return ((value & 0xFF) << 24) | + ((value & 0xFF00) << 8) | + ((value & 0xFF0000) >> 8) | + ((value & 0xFF000000) >> 24); + } + + static void SwapUTF16Bytes(char16_t* buffer, size_t count) { + for (size_t i = 0; i < count; ++i) { + char16_t& c = buffer[i]; + c = (c >> 8) | (c << 8); + } + } + + static unsigned int readUInt32(unsigned char* ptr, bool endian) { + unsigned int val = *(unsigned int*)ptr; + if (endian) val = SwapInt32(val); + return val; + } + private: bool processDLCDataFile(DWORD &dwFilesProcessed, PBYTE pbData, DWORD dwLength, DLCPack *pack); diff --git a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp index ff294a65..95434c08 100644 --- a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp +++ b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp @@ -344,6 +344,7 @@ void GameRuleManager::writeRuleFile(DataOutputStream *dos) // Write schematic files. unordered_map *files; files = getLevelGenerationOptions()->getUnfinishedSchematicFiles(); + dos->writeInt((int)files->size()); for ( auto& it : *files ) { const wstring& filename = it.first; @@ -497,17 +498,36 @@ bool GameRuleManager::readRuleFile(LevelGenerationOptions *lgo, byte *dIn, UINT }*/ // subfile + // Old saves didn't write a numFiles count before the schematic entries. + // Detect this: a real count is small, but a UTF filename prefix reads as a large int. UINT numFiles = contentDis->readInt(); - for (UINT i = 0; i < numFiles; i++) + + if (lgo->isFromSave() && numFiles > 100) { - wstring sFilename = contentDis->readUTF(); - int length = contentDis->readInt(); - byteArray ba( length ); - - contentDis->read(ba); - - levelGenerator->loadSchematicFile(sFilename, ba.data, ba.length); + contentDis->skip(-4); + while (true) + { + int peek = contentDis->readInt(); + if (peek <= 100) { contentDis->skip(-4); break; } + contentDis->skip(-4); + wstring sFilename = contentDis->readUTF(); + int length = contentDis->readInt(); + byteArray ba( length ); + contentDis->read(ba); + levelGenerator->loadSchematicFile(sFilename, ba.data, ba.length); + } + } + else + { + for (UINT i = 0; i < numFiles; i++) + { + wstring sFilename = contentDis->readUTF(); + int length = contentDis->readInt(); + byteArray ba( length ); + contentDis->read(ba); + levelGenerator->loadSchematicFile(sFilename, ba.data, ba.length); + } } LEVEL_GEN_ID lgoID = LEVEL_GEN_ID_NULL; diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp index 2f121f4f..2af1826c 100644 --- a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp @@ -455,6 +455,74 @@ unordered_map *LevelGenerationOptions::getUnfin void LevelGenerationOptions::loadBaseSaveData() { +#ifdef _WINDOWS64 + + int gameRulesCount = m_parentDLCPack ? m_parentDLCPack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader) : 0; + + wstring baseSave = getBaseSavePath(); + wstring packName = baseSave.substr(0, baseSave.find(L'.')); + + for (int i = 0; i < gameRulesCount; ++i) + { + DLCGameRulesHeader* dlcFile = static_cast(m_parentDLCPack->getFile(DLCManager::e_DLCType_GameRulesHeader, i)); + + if (!dlcFile->getGrfPath().empty()) + { + File grf(L"Windows64Media\\DLC\\" + packName + L"\\Data\\" + dlcFile->getGrfPath()); + + if (grf.exists()) + { + wstring path = grf.getPath(); + HANDLE fileHandle = CreateFileW(path.c_str(), GENERIC_READ, 0, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr); + + if (fileHandle != INVALID_HANDLE_VALUE) + { + DWORD dwFileSize = grf.length(); + DWORD bytesRead; + PBYTE pbData = new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle, pbData, dwFileSize, &bytesRead, nullptr); + CloseHandle(fileHandle); + + if (bSuccess) + { + dlcFile->setGrfData(pbData, dwFileSize, m_stringTable); + app.m_gameRules.setLevelGenerationOptions(dlcFile->lgo); + } + delete[] pbData; + } + } + } + } + + if (requiresBaseSave() && !getBaseSavePath().empty()) + { + File save(L"Windows64Media\\DLC\\" + packName + L"\\Data\\" + baseSave); + + if (save.exists()) + { + wstring path = save.getPath(); + HANDLE fileHandle = CreateFileW(path.c_str(), GENERIC_READ, 0, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr); + + if (fileHandle != INVALID_HANDLE_VALUE) + { + DWORD dwFileSize = GetFileSize(fileHandle, nullptr); + DWORD bytesRead; + PBYTE pbData = new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle, pbData, dwFileSize, &bytesRead, nullptr); + CloseHandle(fileHandle); + + if (bSuccess) + setBaseSaveData(pbData, dwFileSize); + else + delete[] pbData; + } + } + } + + setLoadedData(); + app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack); + +#else int mountIndex = -1; if(m_parentDLCPack != nullptr) mountIndex = m_parentDLCPack->GetDLCMountIndex(); @@ -481,6 +549,7 @@ void LevelGenerationOptions::loadBaseSaveData() setLoadedData(); app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack); } +#endif } int LevelGenerationOptions::packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask) diff --git a/Minecraft.Client/Common/Media/Intro1080.swf b/Minecraft.Client/Common/Media/Intro1080.swf index c9f2d3ba..e0a90a57 100644 Binary files a/Minecraft.Client/Common/Media/Intro1080.swf and b/Minecraft.Client/Common/Media/Intro1080.swf differ diff --git a/Minecraft.Client/Common/Media/MediaWindows64.arc b/Minecraft.Client/Common/Media/MediaWindows64.arc index 6ce552c5..b810e4d8 100644 Binary files a/Minecraft.Client/Common/Media/MediaWindows64.arc and b/Minecraft.Client/Common/Media/MediaWindows64.arc differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf index f6866abf..2495b434 100644 Binary files a/Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf and b/Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf index c360db92..aae01e78 100644 Binary files a/Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf and b/Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf index 418b1ba2..4e860fb1 100644 Binary files a/Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf and b/Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/languages.loc b/Minecraft.Client/Common/Media/languages.loc index c267b1ac..3fb5b1a0 100644 Binary files a/Minecraft.Client/Common/Media/languages.loc and b/Minecraft.Client/Common/Media/languages.loc differ diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.cpp b/Minecraft.Client/Common/Network/GameNetworkManager.cpp index 3c032bf9..50aeae68 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.cpp +++ b/Minecraft.Client/Common/Network/GameNetworkManager.cpp @@ -200,10 +200,12 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame #endif int64_t seed = 0; + bool dedicatedNoLocalHostPlayer = false; if (lpParameter != nullptr) { NetworkGameInitData *param = static_cast(lpParameter); seed = param->seed; + dedicatedNoLocalHostPlayer = param->dedicatedNoLocalHostPlayer; app.setLevelGenerationOptions(param->levelGen); if(param->levelGen != nullptr) @@ -359,9 +361,19 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame // PRIMARY PLAYER vector createdConnections; - ClientConnection *connection; + ClientConnection *connection = nullptr; - if( g_NetworkManager.IsHost() ) + if( g_NetworkManager.IsHost() && dedicatedNoLocalHostPlayer ) + { + app.DebugPrintf("Dedicated server mode: skipping local host client connection\n"); + + // Keep telemetry behavior consistent with the host path. + INT multiplayerInstanceId = TelemetryManager->GenerateMultiplayerInstanceId(); + TelemetryManager->SetMultiplayerInstanceId(multiplayerInstanceId); + + app.SetGameMode( eMode_Multiplayer ); + } + else if( g_NetworkManager.IsHost() ) { connection = new ClientConnection(minecraft, nullptr); } @@ -390,16 +402,18 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame connection = new ClientConnection(minecraft, socket); } - if( !connection->createdOk ) + if (connection != nullptr) { - assert(false); - delete connection; - connection = nullptr; - MinecraftServer::HaltServer(); - return false; - } + if( !connection->createdOk ) + { + assert(false); + delete connection; + connection = nullptr; + MinecraftServer::HaltServer(); + return false; + } - connection->send(std::make_shared(minecraft->user->name)); + connection->send(std::make_shared(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 @@ -434,9 +448,9 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame connection->close(); } - if( connection->isStarted() && !connection->isClosed() ) - { - createdConnections.push_back( connection ); + if( connection->isStarted() && !connection->isClosed() ) + { + createdConnections.push_back( connection ); int primaryPad = ProfileManager.GetPrimaryPad(); app.SetRichPresenceContext(primaryPad,CONTEXT_GAME_STATE_BLANK); @@ -533,13 +547,14 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame } } - app.SetGameMode( eMode_Multiplayer ); - } - else if ( connection->isClosed() || !IsInSession()) - { + app.SetGameMode( eMode_Multiplayer ); + } + else if ( connection->isClosed() || !IsInSession()) + { // assert(false); - MinecraftServer::HaltServer(); - return false; + MinecraftServer::HaltServer(); + return false; + } } @@ -942,13 +957,18 @@ int CGameNetworkManager::ServerThreadProc( void* lpParameter ) app.SetGameHostOption(eGameHostOption_All,param->settings); // 4J Stu - If we are loading a DLC save that's separate from the texture pack, load - if( param->levelGen != nullptr && (param->texturePackId == 0 || param->levelGen->getRequiredTexturePackId() != param->texturePackId) ) + if (param != nullptr && param->levelGen != nullptr && param->levelGen->isFromDLC()) { while((Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin())) { Sleep(1); } param->levelGen->loadBaseSaveData(); + + while (!param->levelGen->hasLoadedData()) + { + Sleep(1); + } } } diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.h b/Minecraft.Client/Common/Network/GameNetworkManager.h index 3357b3cd..22d58807 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.h +++ b/Minecraft.Client/Common/Network/GameNetworkManager.h @@ -47,7 +47,8 @@ public: { JOINGAME_SUCCESS, JOINGAME_FAIL_GENERAL, - JOINGAME_FAIL_SERVER_FULL + JOINGAME_FAIL_SERVER_FULL, + JOINGAME_PENDING } eJoinGameResult; void Initialise(); diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp index b32cc934..430f2c11 100644 --- a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp @@ -173,6 +173,11 @@ bool CPlatformNetworkManagerStub::Initialise(CGameNetworkManager *pGameNetworkMa m_bSearchPending = false; m_bIsOfflineGame = false; +#ifdef _WINDOWS64 + m_bJoinPending = false; + m_joinLocalUsersMask = 0; + m_joinHostName[0] = 0; +#endif m_pSearchParam = nullptr; m_SessionsUpdatedCallback = nullptr; @@ -240,7 +245,13 @@ void CPlatformNetworkManagerStub::DoWork() qnetPlayer->m_resolvedXuid = INVALID_XUID; qnetPlayer->m_gamertag[0] = 0; qnetPlayer->SetCustomDataValue(0); - if (IQNet::s_playerCount > 1) + // Recalculate s_playerCount as the highest active slot + 1. + // A blind decrement would hide players at higher-indexed slots when a + // lower-indexed player disconnects first: GetPlayerBySmallId scans + // [0, s_playerCount) so any slot at or above the decremented count + // becomes invisible, causing its disconnect to be missed (ghost player). + while (IQNet::s_playerCount > 1 && + IQNet::m_player[IQNet::s_playerCount - 1].GetCustomDataValue() == 0) IQNet::s_playerCount--; } // NOTE: Do NOT call PushFreeSmallId here. The old PlayerConnection's @@ -257,6 +268,57 @@ void CPlatformNetworkManagerStub::DoWork() SystemFlagRemoveBySmallId(disconnectedSmallId); } } + + // Client-side host disconnect detection: + // if TCP is gone, propagate through normal network-disconnect flow so UI returns to menus. + // The processing from the Xbox version will be reused. + if (_iQNetStubState == QNET_STATE_GAME_PLAY && !m_pIQNet->IsHost() && !m_bLeavingGame) + { + if (!WinsockNetLayer::IsConnected()) + { + if (!m_bLeaveGameOnTick) + { + m_bLeaveGameOnTick = true; + g_NetworkManager.HandleDisconnect(false); + } + } + else + { + m_bLeaveGameOnTick = false; + } + } + + if (m_bJoinPending) + { + WinsockNetLayer::eJoinState state = WinsockNetLayer::GetJoinState(); + if (state == WinsockNetLayer::eJoinState_Success) + { + WinsockNetLayer::FinalizeJoin(); + + BYTE localSmallId = WinsockNetLayer::GetLocalSmallId(); + + IQNet::m_player[localSmallId].m_smallId = localSmallId; + IQNet::m_player[localSmallId].m_isRemote = false; + IQNet::m_player[localSmallId].m_isHostPlayer = false; + IQNet::m_player[localSmallId].m_resolvedXuid = Win64Xuid::ResolvePersistentXuid(); + + Minecraft* pMinecraft = Minecraft::GetInstance(); + wcscpy_s(IQNet::m_player[localSmallId].m_gamertag, 32, pMinecraft->user->name.c_str()); + IQNet::s_playerCount = localSmallId + 1; + + NotifyPlayerJoined(&IQNet::m_player[0]); + NotifyPlayerJoined(&IQNet::m_player[localSmallId]); + + m_pGameNetworkManager->StateChange_AnyToStarting(); + m_bJoinPending = false; + } + else if (state == WinsockNetLayer::eJoinState_Failed || + state == WinsockNetLayer::eJoinState_Rejected || + state == WinsockNetLayer::eJoinState_Cancelled) + { + m_bJoinPending = false; + } + } #endif } @@ -356,6 +418,7 @@ bool CPlatformNetworkManagerStub::LeaveGame(bool bMigrateHost) if( m_bLeavingGame ) return true; m_bLeavingGame = true; + m_bLeaveGameOnTick = false; #ifdef _WINDOWS64 WinsockNetLayer::StopAdvertising(); @@ -404,6 +467,7 @@ void CPlatformNetworkManagerStub::HostGame(int localUsersMask, bool bOnlineGame, localUsersMask |= GetLocalPlayerMask( g_NetworkManager.GetPrimaryPad() ); m_bLeavingGame = false; + m_bLeaveGameOnTick = false; m_pIQNet->HostGame(); @@ -433,9 +497,23 @@ void CPlatformNetworkManagerStub::HostGame(int localUsersMask, bool bOnlineGame, if (WinsockNetLayer::IsActive()) { - const wchar_t* hostName = IQNet::m_player[0].m_gamertag; - unsigned int settings = app.GetGameHostOption(eGameHostOption_All); - WinsockNetLayer::StartAdvertising(port, hostName, settings, 0, 0, MINECRAFT_NET_VERSION); + // For Dedicated Server, refer to `lan-advertise` in `server.properties` + bool enableLanAdvertising = true; + if (g_Win64DedicatedServer) + { + enableLanAdvertising = g_Win64DedicatedServerLanAdvertise; + } + + if (enableLanAdvertising) + { + const wchar_t* hostName = IQNet::m_player[0].m_gamertag; + unsigned int settings = app.GetGameHostOption(eGameHostOption_All); + WinsockNetLayer::StartAdvertising(port, hostName, settings, 0, 0, MINECRAFT_NET_VERSION); + } + else + { + WinsockNetLayer::StopAdvertising(); + } } #endif //#endif @@ -463,42 +541,29 @@ int CPlatformNetworkManagerStub::JoinGame(FriendSessionInfo* searchResult, int l return CGameNetworkManager::JOINGAME_FAIL_GENERAL; m_bLeavingGame = false; + m_bLeaveGameOnTick = false; IQNet::s_isHosting = false; m_pIQNet->ClientJoinGame(); IQNet::m_player[0].m_smallId = 0; IQNet::m_player[0].m_isRemote = true; IQNet::m_player[0].m_isHostPlayer = true; - // Remote host still maps to legacy host XUID in mixed old/new sessions. IQNet::m_player[0].m_resolvedXuid = Win64Xuid::GetLegacyEmbeddedHostXuid(); wcsncpy_s(IQNet::m_player[0].m_gamertag, 32, searchResult->data.hostName, _TRUNCATE); WinsockNetLayer::StopDiscovery(); - if (!WinsockNetLayer::JoinGame(hostIP, hostPort)) + wcsncpy_s(m_joinHostName, 32, searchResult->data.hostName, _TRUNCATE); + m_joinLocalUsersMask = localUsersMask; + + if (!WinsockNetLayer::BeginJoinGame(hostIP, hostPort)) { app.DebugPrintf("Win64 LAN: Failed to connect to %s:%d\n", hostIP, hostPort); return CGameNetworkManager::JOINGAME_FAIL_GENERAL; } - BYTE localSmallId = WinsockNetLayer::GetLocalSmallId(); - - IQNet::m_player[localSmallId].m_smallId = localSmallId; - IQNet::m_player[localSmallId].m_isRemote = false; - IQNet::m_player[localSmallId].m_isHostPlayer = false; - // Local non-host identity is the persistent uid.dat XUID. - IQNet::m_player[localSmallId].m_resolvedXuid = Win64Xuid::ResolvePersistentXuid(); - - Minecraft* pMinecraft = Minecraft::GetInstance(); - wcscpy_s(IQNet::m_player[localSmallId].m_gamertag, 32, pMinecraft->user->name.c_str()); - IQNet::s_playerCount = localSmallId + 1; - - NotifyPlayerJoined(&IQNet::m_player[0]); - NotifyPlayerJoined(&IQNet::m_player[localSmallId]); - - m_pGameNetworkManager->StateChange_AnyToStarting(); - - return CGameNetworkManager::JOINGAME_SUCCESS; + m_bJoinPending = true; + return CGameNetworkManager::JOINGAME_PENDING; #else return CGameNetworkManager::JOINGAME_SUCCESS; #endif diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h index 4a3f4068..dffa3953 100644 --- a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h @@ -77,6 +77,12 @@ private: bool m_bIsPrivateGame; int m_flagIndexSize; +#ifdef _WINDOWS64 + bool m_bJoinPending; + int m_joinLocalUsersMask; + wchar_t m_joinHostName[32]; +#endif + // This is only maintained by the host, and is not valid on client machines GameSessionData m_hostGameSessionData; CGameNetworkManager *m_pGameNetworkManager; diff --git a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp index d18bfd8f..7db52b3f 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp @@ -9,6 +9,7 @@ #include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" #include "..\..\MultiplayerLocalPlayer.h" #include "..\..\Minecraft.h" +#include "..\..\Options.h" #ifdef __ORBIS__ #include @@ -16,8 +17,6 @@ #ifdef _WINDOWS64 #include "..\..\Windows64\KeyboardMouseInput.h" - -SavedInventoryCursorPos g_savedInventoryCursorPos = { 0.0f, 0.0f, false }; #endif IUIScene_AbstractContainerMenu::IUIScene_AbstractContainerMenu() @@ -1298,10 +1297,8 @@ void IUIScene_AbstractContainerMenu::onMouseTick() } } - vPointerPos.x = floor(vPointerPos.x); - vPointerPos.x += ( static_cast(vPointerPos.x)%2); - vPointerPos.y = floor(vPointerPos.y); - vPointerPos.y += ( static_cast(vPointerPos.y)%2); + vPointerPos.x = static_cast(floor(vPointerPos.x + 0.5f)); + vPointerPos.y = static_cast(floor(vPointerPos.y + 0.5f)); m_pointerPos = vPointerPos; adjustPointerForSafeZone(); @@ -1679,7 +1676,13 @@ vector *IUIScene_AbstractContainerMenu::GetItemDescription(Slot *slo { if(slot == nullptr) return nullptr; - vector *lines = slot->getItem()->getHoverText(nullptr, false); + bool advanced = false; + if (const Minecraft* pMinecraft = Minecraft::GetInstance()) + { + if (pMinecraft->options) + advanced = pMinecraft->options->advancedTooltips; + } + vector *lines = slot->getItem()->getHoverText(nullptr, advanced); // Add rarity to first line if (lines->size() > 0) diff --git a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h index 718a2d44..6710e18f 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h @@ -1,15 +1,5 @@ #pragma once -#ifdef _WINDOWS64 -struct SavedInventoryCursorPos -{ - float x; - float y; - bool hasSavedPos; -}; -extern SavedInventoryCursorPos g_savedInventoryCursorPos; -#endif - // Uncomment to enable tap input detection to jump 1 slot. Doesn't work particularly well yet, and I feel the system does not need it. // Would probably be required if we decide to slow down the pointer movement. // 4J Stu - There was a request to be able to navigate the scenes with the dpad, so I have used much of the TAP_DETECTION diff --git a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h index 03a58378..fa8d9bd1 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h @@ -20,9 +20,9 @@ protected: eGroupTab_Right }; - static const int m_iMaxHSlotC = 12; - static const int m_iMaxHCraftingSlotC = 10; - static const int m_iMaxVSlotC = 17; + static const int m_iMaxHSlotC = 40; + static const int m_iMaxHCraftingSlotC = 40; + static const int m_iMaxVSlotC = 99; static const int m_iMaxDisplayedVSlotC = 3; static const int m_iIngredients3x3SlotC = 9; static const int m_iIngredients2x2SlotC = 4; diff --git a/Minecraft.Client/Common/UI/IUIScene_HUD.cpp b/Minecraft.Client/Common/UI/IUIScene_HUD.cpp index fd977966..d2754789 100644 --- a/Minecraft.Client/Common/UI/IUIScene_HUD.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_HUD.cpp @@ -195,8 +195,8 @@ void IUIScene_HUD::renderPlayerHealth() // Update health bool blink = pMinecraft->localplayers[iPad]->invulnerableTime / 3 % 2 == 1; if (pMinecraft->localplayers[iPad]->invulnerableTime < 10) blink = false; - int currentHealth = pMinecraft->localplayers[iPad]->getHealth(); - int oldHealth = pMinecraft->localplayers[iPad]->lastHealth; + int currentHealth = static_cast(ceil(pMinecraft->localplayers[iPad]->getHealth())); + int oldHealth = static_cast(ceil(pMinecraft->localplayers[iPad]->lastHealth)); bool bHasPoison = pMinecraft->localplayers[iPad]->hasEffect(MobEffect::poison); bool bHasWither = pMinecraft->localplayers[iPad]->hasEffect(MobEffect::wither); AttributeInstance *maxHealthAttribute = pMinecraft->localplayers[iPad]->getAttribute(SharedMonsterAttributes::MAX_HEALTH); diff --git a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp index 0b1e0df2..d7939d8c 100644 --- a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp @@ -4,6 +4,7 @@ #include "..\..\..\Minecraft.World\net.minecraft.world.item.h" #include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" #include "..\..\Minecraft.h" +#include "..\..\Options.h" #include "..\..\MultiPlayerLocalPlayer.h" #include "..\..\ClientConnection.h" #include "IUIScene_TradingMenu.h" @@ -368,7 +369,13 @@ void IUIScene_TradingMenu::setTradeItem(int index, shared_ptr item vector *IUIScene_TradingMenu::GetItemDescription(shared_ptr item) { - vector *lines = item->getHoverText(nullptr, false); + bool advanced = false; + if (const Minecraft* pMinecraft = Minecraft::GetInstance()) + { + if (pMinecraft->options) + advanced = pMinecraft->options->advancedTooltips; + } + vector *lines = item->getHoverText(nullptr, advanced); // Add rarity to first line if (lines->size() > 0) diff --git a/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp b/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp index 418546b7..4f60de5f 100644 --- a/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp @@ -93,18 +93,22 @@ void UIComponent_Tooltips::updateSafeZone() case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: safeTop = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); + break; case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: - safeBottom = getSafeZoneHalfHeight(); + safeTop = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); + break; case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: - safeLeft = getSafeZoneHalfWidth(); + safeTop = getSafeZoneHalfHeight(); safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); break; case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: - safeRight = getSafeZoneHalfWidth(); + safeTop = getSafeZoneHalfHeight(); safeBottom = getSafeZoneHalfHeight(); + break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: safeTop = getSafeZoneHalfHeight(); @@ -112,22 +116,22 @@ void UIComponent_Tooltips::updateSafeZone() break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: safeTop = getSafeZoneHalfHeight(); - safeRight = getSafeZoneHalfWidth(); + break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: - safeBottom = getSafeZoneHalfHeight(); + safeTop = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: - safeBottom = getSafeZoneHalfHeight(); - safeRight = getSafeZoneHalfWidth(); + safeTop = getSafeZoneHalfHeight(); + break; case C4JRender::VIEWPORT_TYPE_FULLSCREEN: default: safeTop = getSafeZoneHalfHeight(); safeBottom = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); - safeRight = getSafeZoneHalfWidth(); + break; } setSafeZone(safeTop, safeBottom, safeLeft, safeRight); diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp index fcbd17f3..76d3babf 100644 --- a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "UI.h" #include "UIComponent_TutorialPopup.h" +#include "UISplitScreenHelpers.h" #include "..\..\Common\Tutorial\Tutorial.h" #include "..\..\..\Minecraft.World\StringHelpers.h" #include "..\..\MultiplayerLocalPlayer.h" @@ -474,27 +475,17 @@ void UIComponent_TutorialPopup::render(S32 width, S32 height, C4JRender::eViewpo { if(viewport != C4JRender::VIEWPORT_TYPE_FULLSCREEN) { - S32 xPos = 0; - S32 yPos = 0; - switch( viewport ) - { - case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: - xPos = static_cast(ui.getScreenWidth() / 2); - yPos = static_cast(ui.getScreenHeight() / 2); - break; - case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: - yPos = static_cast(ui.getScreenHeight() / 2); - break; - case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: - case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: - case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: - xPos = static_cast(ui.getScreenWidth() / 2); - break; - case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: - xPos = static_cast(ui.getScreenWidth() / 2); - yPos = static_cast(ui.getScreenHeight() / 2); - break; - } + // Derive the viewport origin and fit a 16:9 box inside it (same as UIScene::render), + // then apply safezone nudges so the popup stays clear of screen edges. + F32 originX, originY, viewW, viewH; + GetViewportRect(ui.getScreenWidth(), ui.getScreenHeight(), viewport, originX, originY, viewW, viewH); + + S32 fitW, fitH, offsetX, offsetY; + Fit16x9(viewW, viewH, fitW, fitH, offsetX, offsetY); + + S32 xPos = static_cast(originX) + offsetX; + S32 yPos = static_cast(originY) + offsetY; + //Adjust for safezone switch( viewport ) { @@ -505,6 +496,7 @@ void UIComponent_TutorialPopup::render(S32 width, S32 height, C4JRender::eViewpo case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: yPos += getSafeZoneHalfHeight(); break; + default: break; } switch( viewport ) { @@ -515,10 +507,11 @@ void UIComponent_TutorialPopup::render(S32 width, S32 height, C4JRender::eViewpo case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: xPos -= getSafeZoneHalfWidth(); break; + default: break; } ui.setupRenderPosition(xPos, yPos); - IggyPlayerSetDisplaySize( getMovie(), width, height ); + IggyPlayerSetDisplaySize( getMovie(), fitW, fitH ); IggyPlayerDraw( getMovie() ); } else diff --git a/Minecraft.Client/Common/UI/UIControl_Slider.cpp b/Minecraft.Client/Common/UI/UIControl_Slider.cpp index 2d56a29c..c9b773a7 100644 --- a/Minecraft.Client/Common/UI/UIControl_Slider.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Slider.cpp @@ -66,12 +66,44 @@ void UIControl_Slider::init(UIString label, int id, int min, int max, int curren #endif } +bool IsUsingKeyboardMouse() +{ +#ifdef _WINDOWS64 + + if (g_KBMInput.IsKBMActive()) return true; + + return g_KBMInput.HasAnyInput(); +#else + return false; +#endif +} + void UIControl_Slider::handleSliderMove(int newValue) { if (m_current!=newValue) { - ui.PlayUISFX(eSFX_Scroll); - m_current = newValue; + int valueCount = 1; + if (!m_allPossibleLabels.empty()) { + valueCount = static_cast(m_allPossibleLabels.size()); + } + else { + long long range = static_cast(m_max) - static_cast(m_min) + 1; + if (range <= 0) range = 1; + valueCount = static_cast(range); + } + + if (IsUsingKeyboardMouse() == true) { + if (newValue % 10 == 0) { + ui.PlayUISFX(eSFX_Scroll); + m_current = newValue; + } else if (valueCount <= 20) { + ui.PlayUISFX(eSFX_Scroll); + m_current = newValue; + } + } else { + ui.PlayUISFX(eSFX_Scroll); + m_current = newValue; + } if(newValue < m_allPossibleLabels.size()) { diff --git a/Minecraft.Client/Common/UI/UIControl_TextInput.cpp b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp index 8e679b7c..76f25afb 100644 --- a/Minecraft.Client/Common/UI/UIControl_TextInput.cpp +++ b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "UI.h" #include "UIControl_TextInput.h" +#include "..\..\Screen.h" UIControl_TextInput::UIControl_TextInput() { @@ -211,6 +212,31 @@ UIControl_TextInput::EDirectEditResult UIControl_TextInput::tickDirectEdit() } } + // Paste from clipboard + if (g_KBMInput.IsKeyPressed('V') && g_KBMInput.IsKeyDown(VK_CONTROL)) + { + wstring pasted = Screen::getClipboard(); + wstring sanitized; + sanitized.reserve(pasted.length()); + + for (wchar_t pc : pasted) + { + if (pc >= 0x20) // Keep printable characters + { + if (m_iCharLimit > 0 && (m_editBuffer.length() + sanitized.length()) >= (size_t)m_iCharLimit) + break; + sanitized += pc; + } + } + + if (!sanitized.empty()) + { + m_editBuffer.insert(m_iCursorPos, sanitized); + m_iCursorPos += (int)sanitized.length(); + changed = true; + } + } + // Arrow keys, Home, End, Delete for cursor movement if (g_KBMInput.IsKeyPressed(VK_LEFT) && m_iCursorPos > 0) { diff --git a/Minecraft.Client/Common/UI/UIScene.cpp b/Minecraft.Client/Common/UI/UIScene.cpp index 5630e972..303897a7 100644 --- a/Minecraft.Client/Common/UI/UIScene.cpp +++ b/Minecraft.Client/Common/UI/UIScene.cpp @@ -172,15 +172,22 @@ void UIScene::updateSafeZone() { case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: - safeBottom = getSafeZoneHalfHeight(); + // safeTop mirrors SPLIT_TOP for visual symmetry. safeBottom omitted. + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + safeTop = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); break; case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: - safeRight = getSafeZoneHalfWidth(); + safeTop = getSafeZoneHalfHeight(); + break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: safeTop = getSafeZoneHalfHeight(); @@ -188,22 +195,22 @@ void UIScene::updateSafeZone() break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: safeTop = getSafeZoneHalfHeight(); - safeRight = getSafeZoneHalfWidth(); + break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: - safeBottom = getSafeZoneHalfHeight(); + safeTop = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: - safeBottom = getSafeZoneHalfHeight(); - safeRight = getSafeZoneHalfWidth(); + safeTop = getSafeZoneHalfHeight(); + break; case C4JRender::VIEWPORT_TYPE_FULLSCREEN: default: safeTop = getSafeZoneHalfHeight(); safeBottom = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); - safeRight = getSafeZoneHalfWidth(); + break; } setSafeZone(safeTop, safeBottom, safeLeft, safeRight); @@ -578,9 +585,12 @@ bool UIScene::handleMouseClick(F32 x, F32 y) if (bestCtrl->getControlType() == UIControl::eCheckBox) { UIControl_CheckBox *cb = static_cast(bestCtrl); - bool newState = !cb->IsChecked(); - cb->setChecked(newState); - handleCheckboxToggled((F64)bestId, newState); + if (cb->IsEnabled()) + { + bool newState = !cb->IsChecked(); + cb->setChecked(newState); + handleCheckboxToggled((F64)bestId, newState); + } } else { diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp index 0c3b6096..c5dc0554 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp @@ -41,10 +41,6 @@ void UIScene_AbstractContainerMenu::handleDestroy() app.DebugPrintf("UIScene_AbstractContainerMenu::handleDestroy\n"); #ifdef _WINDOWS64 - g_savedInventoryCursorPos.x = m_pointerPos.x; - g_savedInventoryCursorPos.y = m_pointerPos.y; - g_savedInventoryCursorPos.hasSavedPos = true; - g_KBMInput.SetScreenCursorHidden(false); g_KBMInput.SetCursorHiddenForUI(false); #endif @@ -173,16 +169,16 @@ void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex) m_pointerPos = vPointerPos; #ifdef _WINDOWS64 - if (g_savedInventoryCursorPos.hasSavedPos) + if ((iPad == 0) && g_KBMInput.IsKBMActive()) { - m_pointerPos.x = g_savedInventoryCursorPos.x; - m_pointerPos.y = g_savedInventoryCursorPos.y; - - if (m_pointerPos.x < m_fPointerMinX) m_pointerPos.x = m_fPointerMinX; - if (m_pointerPos.x > m_fPointerMaxX) m_pointerPos.x = m_fPointerMaxX; - if (m_pointerPos.y < m_fPointerMinY) m_pointerPos.y = m_fPointerMinY; - if (m_pointerPos.y > m_fPointerMaxY) m_pointerPos.y = m_fPointerMaxY; + m_pointerPos.x = ((m_fPanelMinX + m_fPanelMaxX) * 0.5f) - m_fPointerImageOffsetX; + m_pointerPos.y = ((m_fPanelMinY + m_fPanelMaxY) * 0.5f) - m_fPointerImageOffsetY; } + + if (m_pointerPos.x < m_fPointerMinX) m_pointerPos.x = m_fPointerMinX; + if (m_pointerPos.x > m_fPointerMaxX) m_pointerPos.x = m_fPointerMaxX; + if (m_pointerPos.y < m_fPointerMinY) m_pointerPos.y = m_fPointerMinY; + if (m_pointerPos.y > m_fPointerMaxY) m_pointerPos.y = m_fPointerMaxY; #endif IggyEvent mouseEvent; diff --git a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp index e10a5a62..40557cd5 100644 --- a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp +++ b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp @@ -2,6 +2,16 @@ #include "UI.h" #include "UIScene_ConnectingProgress.h" #include "..\..\Minecraft.h" +#ifdef _WINDOWS64 +#include "..\..\Windows64\Network\WinsockNetLayer.h" +#include "..\..\..\Minecraft.World\DisconnectPacket.h" + +static int ConnectingProgress_OnRejectedDialogOK(LPVOID, int iPad, const C4JStorage::EMessageResult) +{ + ui.NavigateBack(iPad); + return 0; +} +#endif UIScene_ConnectingProgress::UIScene_ConnectingProgress(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) { @@ -43,6 +53,12 @@ UIScene_ConnectingProgress::UIScene_ConnectingProgress(int iPad, void *_initData m_cancelFuncParam = param->cancelFuncParam; m_removeLocalPlayer = false; m_showingButton = false; + +#ifdef _WINDOWS64 + WinsockNetLayer::eJoinState initState = WinsockNetLayer::GetJoinState(); + m_asyncJoinActive = (initState != WinsockNetLayer::eJoinState_Idle && initState != WinsockNetLayer::eJoinState_Cancelled); + m_asyncJoinFailed = false; +#endif } UIScene_ConnectingProgress::~UIScene_ConnectingProgress() @@ -53,6 +69,18 @@ UIScene_ConnectingProgress::~UIScene_ConnectingProgress() void UIScene_ConnectingProgress::updateTooltips() { +#ifdef _WINDOWS64 + if (m_asyncJoinActive) + { + ui.SetTooltips( m_iPad, -1, IDS_TOOLTIPS_BACK); + return; + } + if (m_asyncJoinFailed) + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT, -1); + return; + } +#endif // 4J-PB - removing the option of cancel join, since it didn't work anyway //ui.SetTooltips( m_iPad, -1, m_showTooltips?IDS_TOOLTIPS_CANCEL_JOIN:-1); ui.SetTooltips( m_iPad, -1, -1); @@ -62,6 +90,85 @@ void UIScene_ConnectingProgress::tick() { UIScene::tick(); +#ifdef _WINDOWS64 + if (m_asyncJoinActive) + { + WinsockNetLayer::eJoinState state = WinsockNetLayer::GetJoinState(); + if (state == WinsockNetLayer::eJoinState_Connecting) + { + // connecting............. + int attempt = WinsockNetLayer::GetJoinAttempt(); + int maxAttempts = WinsockNetLayer::GetJoinMaxAttempts(); + char buf[128]; + if (attempt <= 1) + sprintf_s(buf, "Connecting..."); + else + sprintf_s(buf, "Connecting failed, trying again (%d/%d)", attempt, maxAttempts); + wchar_t wbuf[128]; + mbstowcs(wbuf, buf, 128); + m_labelTitle.setLabel(wstring(wbuf)); + } + else if (state == WinsockNetLayer::eJoinState_Success) + { + m_asyncJoinActive = false; + // go go go + } + else if (state == WinsockNetLayer::eJoinState_Cancelled) + { + // cancel + m_asyncJoinActive = false; + navigateBack(); + } + else if (state == WinsockNetLayer::eJoinState_Rejected) + { + // server full and banned are passed differently compared to other disconnects it seems + m_asyncJoinActive = false; + DisconnectPacket::eDisconnectReason reason = WinsockNetLayer::GetJoinRejectReason(); + int exitReasonStringId; + switch (reason) + { + case DisconnectPacket::eDisconnect_ServerFull: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + break; + case DisconnectPacket::eDisconnect_Banned: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + default: + exitReasonStringId = IDS_CONNECTION_LOST_SERVER; + break; + } + UINT uiIDA[1]; + uiIDA[0] = IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA, 1, ProfileManager.GetPrimaryPad(), ConnectingProgress_OnRejectedDialogOK, nullptr, nullptr); + } + else if (state == WinsockNetLayer::eJoinState_Failed) + { + // FAIL + m_asyncJoinActive = false; + m_asyncJoinFailed = true; + + int maxAttempts = WinsockNetLayer::GetJoinMaxAttempts(); + char buf[256]; + sprintf_s(buf, "Failed to connect after %d attempts. The server may be unavailable.", maxAttempts); + wchar_t wbuf[256]; + mbstowcs(wbuf, buf, 256); + + // TIL that these exist + // not going to use a actual popup due to it requiring messing with strings which can really mess things up + // i dont trust myself with that + // these need to be touched up later as teh button is a bit offset + m_labelTitle.setLabel(L"Unable to connect to server"); + m_progressBar.setLabel(wstring(wbuf)); + m_progressBar.showBar(false); + m_progressBar.setVisible(true); + m_buttonConfirm.setVisible(true); + m_showingButton = true; + m_controlTimer.setVisible(false); + } + return; + } +#endif + if( m_removeLocalPlayer ) { m_removeLocalPlayer = false; @@ -94,6 +201,8 @@ void UIScene_ConnectingProgress::handleGainFocus(bool navBack) void UIScene_ConnectingProgress::handleLoseFocus() { + if (!m_runFailTimer) return; + int millisecsLeft = getTimer(0)->targetTime - System::currentTimeMillis(); int millisecsTaken = getTimer(0)->duration - millisecsLeft; app.DebugPrintf("\n"); @@ -208,6 +317,17 @@ void UIScene_ConnectingProgress::handleInput(int iPad, int key, bool repeat, boo switch(key) { // 4J-PB - Removed the option to cancel join - it didn't work anyway +#ifdef _WINDOWS64 + case ACTION_MENU_CANCEL: + if (pressed && m_asyncJoinActive) + { + m_asyncJoinActive = false; + WinsockNetLayer::CancelJoinGame(); + navigateBack(); + handled = true; + } + break; +#endif // case ACTION_MENU_CANCEL: // { // if(m_cancelFunc != nullptr) @@ -250,6 +370,13 @@ void UIScene_ConnectingProgress::handlePress(F64 controlId, F64 childId) case eControl_Confirm: if(m_showingButton) { +#ifdef _WINDOWS64 + if (m_asyncJoinFailed) + { + navigateBack(); + } + else +#endif if( m_iPad != ProfileManager.GetPrimaryPad() && g_NetworkManager.IsInSession() ) { // The connection failed if we see the button, so the temp player should be removed and the viewports updated again diff --git a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h index 2c52284c..eaaea7f6 100644 --- a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h +++ b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h @@ -13,6 +13,11 @@ private: void (*m_cancelFunc)(LPVOID param); LPVOID m_cancelFuncParam; +#ifdef _WINDOWS64 + bool m_asyncJoinActive; + bool m_asyncJoinFailed; +#endif + enum EControls { eControl_Confirm diff --git a/Minecraft.Client/Common/UI/UIScene_Credits.cpp b/Minecraft.Client/Common/UI/UIScene_Credits.cpp index 9900169c..8c8d43bc 100644 --- a/Minecraft.Client/Common/UI/UIScene_Credits.cpp +++ b/Minecraft.Client/Common/UI/UIScene_Credits.cpp @@ -480,14 +480,6 @@ SCreditTextItemDef UIScene_Credits::gs_aCreditDefs[MAX_CREDIT_STRINGS] = { L"Copyright (C) 2009-2013 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line #else { L"Copyright (C) 2009-2014 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line -#endif - { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line - { L"", CREDIT_ICON, eCreditIcon_Miles,eSmallText }, // extra blank line - { L"Uses Miles Sound System.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line -#ifdef __PS3__ - { L"Copyright (C) 1991-2013 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line -#else - { L"Copyright (C) 1991-2014 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line #endif #ifdef __PS3__ { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line @@ -496,6 +488,26 @@ SCreditTextItemDef UIScene_Credits::gs_aCreditDefs[MAX_CREDIT_STRINGS] = { L"are trademarks of Dolby Laboratories.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line #endif #endif + {L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"MinecraftConsoles", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eExtraLargeText}, + {L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"Project Maintainers", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eLargeText}, + {L"codeHusky", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"mattsumi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"Former Maintainers", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eLargeText}, + {L"smartcmd", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"Patoke", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"rtm516", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"Thank you to our 120+ contributors on GitHub!", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eLargeText}, + {L"github.com/MCLCE/MinecraftConsoles", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"(formerly smartcmd/MinecraftConsoles)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText}, + {L"Additional Thanks", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eLargeText}, + {L"notpies - Security Fixes", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING, eSmallText} }; UIScene_Credits::UIScene_Credits(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) diff --git a/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp b/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp index e89c0626..6a4ea096 100644 --- a/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp +++ b/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp @@ -278,7 +278,7 @@ void UIScene_FullscreenProgress::handleInput(int iPad, int key, bool repeat, boo #ifdef __ORBIS__ case ACTION_MENU_TOUCHPAD_PRESS: #endif - if(pressed) + if(pressed && m_threadCompleted) { sendInputToMovie(key, repeat, pressed, released); } @@ -292,6 +292,7 @@ void UIScene_FullscreenProgress::handleInput(int iPad, int key, bool repeat, boo } break; } + handled = true; } } diff --git a/Minecraft.Client/Common/UI/UIScene_HUD.cpp b/Minecraft.Client/Common/UI/UIScene_HUD.cpp index 0d8adcb2..213caa8d 100644 --- a/Minecraft.Client/Common/UI/UIScene_HUD.cpp +++ b/Minecraft.Client/Common/UI/UIScene_HUD.cpp @@ -65,22 +65,26 @@ void UIScene_HUD::updateSafeZone() case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: safeTop = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); - safeRight = getSafeZoneHalfWidth(); + break; case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: - safeBottom = getSafeZoneHalfHeight(); + // safeTop mirrors SPLIT_TOP so both players have the same vertical inset + // from their viewport's top edge (split divider), keeping GUI symmetrical. + // safeBottom is intentionally omitted: it would shift m_Hud.y upward in + // ActionScript, placing the hotbar too high relative to SPLIT_TOP. + safeTop = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); - safeRight = getSafeZoneHalfWidth(); + break; case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: - safeLeft = getSafeZoneHalfWidth(); safeTop = getSafeZoneHalfHeight(); safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); break; case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: - safeRight = getSafeZoneHalfWidth(); safeTop = getSafeZoneHalfHeight(); safeBottom = getSafeZoneHalfHeight(); + break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: safeTop = getSafeZoneHalfHeight(); @@ -88,22 +92,22 @@ void UIScene_HUD::updateSafeZone() break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: safeTop = getSafeZoneHalfHeight(); - safeRight = getSafeZoneHalfWidth(); + break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: - safeBottom = getSafeZoneHalfHeight(); + safeTop = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: - safeBottom = getSafeZoneHalfHeight(); - safeRight = getSafeZoneHalfWidth(); + safeTop = getSafeZoneHalfHeight(); + break; case C4JRender::VIEWPORT_TYPE_FULLSCREEN: default: safeTop = getSafeZoneHalfHeight(); safeBottom = getSafeZoneHalfHeight(); safeLeft = getSafeZoneHalfWidth(); - safeRight = getSafeZoneHalfWidth(); + break; } setSafeZone(safeTop, safeBottom, safeLeft, safeRight); @@ -734,7 +738,7 @@ void UIScene_HUD::render(S32 width, S32 height, C4JRender::eViewportType viewpor IggyPlayerSetDisplaySize( getMovie(), (S32)(m_movieWidth * scale), (S32)(m_movieHeight * scale) ); - repositionHud(tileWidth, tileHeight, scale); + repositionHud(tileWidth, tileHeight, scale, needsYTile); m_renderWidth = tileWidth; m_renderHeight = tileHeight; @@ -805,7 +809,7 @@ void UIScene_HUD::handleTimerComplete(int id) //setVisible(anyVisible); } -void UIScene_HUD::repositionHud(S32 tileWidth, S32 tileHeight, F32 scale) +void UIScene_HUD::repositionHud(S32 tileWidth, S32 tileHeight, F32 scale, bool needsYTile) { if(!m_bSplitscreen) return; diff --git a/Minecraft.Client/Common/UI/UIScene_HUD.h b/Minecraft.Client/Common/UI/UIScene_HUD.h index 569b5234..04468c8e 100644 --- a/Minecraft.Client/Common/UI/UIScene_HUD.h +++ b/Minecraft.Client/Common/UI/UIScene_HUD.h @@ -176,5 +176,5 @@ protected: #endif private: - void repositionHud(S32 tileWidth, S32 tileHeight, F32 scale); + void repositionHud(S32 tileWidth, S32 tileHeight, F32 scale, bool needsYTile); }; diff --git a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp index 7fc3d035..338d1905 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp @@ -150,8 +150,6 @@ void UIScene_InGameInfoMenu::updateTooltips() void UIScene_InGameInfoMenu::handleDestroy() { g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &UIScene_InGameInfoMenu::OnPlayerChanged, this); - - m_parentLayer->removeComponent(eUIComponent_MenuBackground); } void UIScene_InGameInfoMenu::handleGainFocus(bool navBack) diff --git a/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp index 417c1700..5b83ea7c 100644 --- a/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp @@ -583,6 +583,24 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) // Alert the app the we no longer want to be informed of ethernet connections app.SetLiveLinkRequired( false ); +#ifdef _WINDOWS64 + if (result == CGameNetworkManager::JOINGAME_PENDING) + { + pClass->m_bIgnoreInput = false; + + ConnectionProgressParams *param = new ConnectionProgressParams(); + param->iPad = ProfileManager.GetPrimaryPad(); + param->stringId = -1; + param->showTooltips = true; + param->setFailTimer = false; + param->timerTime = 0; + param->cancelFunc = nullptr; + param->cancelFuncParam = nullptr; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_ConnectingProgress, param); + return; + } +#endif + if( result != CGameNetworkManager::JOINGAME_SUCCESS ) { int exitReasonStringId = -1; diff --git a/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp b/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp index 2f2f9132..35edf17f 100644 --- a/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp +++ b/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "UI.h" #include "UIScene_Keyboard.h" +#include "..\..\Screen.h" #ifdef _WINDOWS64 // Global buffer that stores the text entered in the native keyboard scene. @@ -224,6 +225,38 @@ void UIScene_Keyboard::tick() } } + // Paste from clipboard + if (g_KBMInput.IsKeyPressed('V') && g_KBMInput.IsKeyDown(VK_CONTROL)) + { + wstring pasted = Screen::getClipboard(); + wstring sanitized; + sanitized.reserve(pasted.length()); + + for (wchar_t pc : pasted) + { + if (pc >= 0x20) // Keep printable characters + { + if (static_cast(m_win64TextBuffer.length() + sanitized.length()) >= m_win64MaxChars) + break; + sanitized += pc; + } + } + + if (!sanitized.empty()) + { + if (m_bPCMode) + { + m_win64TextBuffer.insert(m_iCursorPos, sanitized); + m_iCursorPos += (int)sanitized.length(); + } + else + { + m_win64TextBuffer += sanitized; + } + changed = true; + } + } + if (m_bPCMode) { // Arrow keys, Home, End, Delete for cursor movement diff --git a/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp index b2981ebf..1832e40c 100644 --- a/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp @@ -557,8 +557,8 @@ int UIScene_LaunchMoreOptionsMenu::KeyboardCompleteSeedCallback(LPVOID lpParam,b uint16_t pchText[128]; ZeroMemory(pchText, 128 * sizeof(uint16_t)); Win64_GetKeyboardText(pchText, 128); - pClass->m_editSeed.setLabel((wchar_t *)pchText); - pClass->m_params->seed = (wchar_t *)pchText; + pClass->m_editSeed.setLabel(reinterpret_cast(pchText)); + pClass->m_params->seed = static_cast(reinterpret_cast(pchText)); #else #ifdef __PSVITA__ uint16_t pchText[2048]; @@ -584,7 +584,7 @@ void UIScene_LaunchMoreOptionsMenu::getDirectEditInputs(vectorseed = input->getEditBuffer(); + m_params->seed = static_cast(input->getEditBuffer()); } #endif diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp index d73148f5..d7ad789a 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp @@ -206,6 +206,8 @@ int UIScene_LoadOrJoinMenu::LoadSaveCallback(LPVOID lpParam,bool bRes) UIScene_LoadOrJoinMenu::UIScene_LoadOrJoinMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) { + constexpr uint64_t MAXIMUM_SAVE_STORAGE = 4LL * 1024LL * 1024LL * 1024LL; + // Setup all the Iggy references we need for this scene initialiseMovie(); app.SetLiveLinkRequired( true ); @@ -230,8 +232,8 @@ UIScene_LoadOrJoinMenu::UIScene_LoadOrJoinMenu(int iPad, void *initData, UILayer m_controlJoinTimer.setVisible( true ); -#if defined(_XBOX_ONE) || defined(__ORBIS__) - m_spaceIndicatorSaves.init(L"",eControl_SpaceIndicator,0, (4LL *1024LL * 1024LL * 1024LL) ); +#if defined(_XBOX_ONE) || defined(__ORBIS__) || defined(_WINDOWS64) + m_spaceIndicatorSaves.init(L"",eControl_SpaceIndicator,0, MAXIMUM_SAVE_STORAGE); #endif m_bUpdateSaveSize = false; @@ -695,7 +697,7 @@ void UIScene_LoadOrJoinMenu::tick() if(m_eSaveTransferState == eSaveTransfer_Idle) m_bSaveTransferRunning = false; #endif -#if defined(_XBOX_ONE) || defined(__ORBIS__) +#if defined(_XBOX_ONE) || defined(__ORBIS__) || defined(_WINDOWS64) if(m_bUpdateSaveSize) { if((m_iDefaultButtonsC > 0) && (m_iSaveListIndex >= m_iDefaultButtonsC)) @@ -716,7 +718,7 @@ void UIScene_LoadOrJoinMenu::tick() if(m_pSaveDetails!=nullptr) { //CD - Fix - Adding define for ORBIS/XBOXONE -#if defined(_XBOX_ONE) || defined(__ORBIS__) +#if defined(_XBOX_ONE) || defined(__ORBIS__) || defined(_WINDOWS64) m_spaceIndicatorSaves.reset(); #endif @@ -758,6 +760,22 @@ void UIScene_LoadOrJoinMenu::tick() { #if defined(_XBOX_ONE) m_spaceIndicatorSaves.addSave(m_pSaveDetails->SaveInfoA[i].totalSize); +#elif defined(_WINDOWS64) + int origIdx = sortedIdx[i]; + wchar_t wFilename[MAX_SAVEFILENAME_LENGTH]; + ZeroMemory(wFilename, sizeof(wFilename)); + mbstowcs(wFilename, m_pSaveDetails->SaveInfoA[origIdx].UTF8SaveFilename, MAX_SAVEFILENAME_LENGTH - 1); + wstring filePath = wstring(L"Windows64\\GameHDD\\") + wstring(wFilename) + wstring(L"\\saveData.ms"); + + HANDLE hFile = CreateFileW(filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr); + DWORD fileSize = 0; + + if (hFile != INVALID_HANDLE_VALUE) { + fileSize = GetFileSize(hFile, nullptr); + if (fileSize < 12 || fileSize == INVALID_FILE_SIZE) fileSize = 0; + CloseHandle(hFile); + } + m_spaceIndicatorSaves.addSave(fileSize); #elif defined(__ORBIS__) m_spaceIndicatorSaves.addSave(m_pSaveDetails->SaveInfoA[i].blocksUsed * (32 * 1024) ); #endif @@ -770,12 +788,8 @@ void UIScene_LoadOrJoinMenu::tick() #else #ifdef _WINDOWS64 { - int origIdx = sortedIdx[i]; - wchar_t wFilename[MAX_SAVEFILENAME_LENGTH]; - ZeroMemory(wFilename, sizeof(wFilename)); - mbstowcs(wFilename, m_pSaveDetails->SaveInfoA[origIdx].UTF8SaveFilename, MAX_SAVEFILENAME_LENGTH - 1); - wstring filePath = wstring(L"Windows64\\GameHDD\\") + wstring(wFilename) + wstring(L"\\saveData.ms"); wstring levelName = ReadLevelNameFromSaveFile(filePath); + if (!levelName.empty()) { m_buttonListSaves.addItem(levelName, wstring(L"")); diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h index 9f5fe17f..76a7ed43 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h @@ -20,7 +20,7 @@ private: { eControl_SavesList, eControl_GamesList, -#if defined(_XBOX_ONE) || defined(__ORBIS__) +#if defined(_XBOX_ONE) || defined(__ORBIS__) || defined(_WINDOWS64) eControl_SpaceIndicator, #endif }; @@ -52,7 +52,7 @@ protected: UIControl_SaveList m_buttonListGames; UIControl_Label m_labelSavesListTitle, m_labelJoinListTitle, m_labelNoGames; UIControl m_controlSavesTimer, m_controlJoinTimer; -#if defined(_XBOX_ONE) || defined(__ORBIS__) +#if defined(_XBOX_ONE) || defined(__ORBIS__) || defined(_WINDOWS64) UIControl_SpaceIndicatorBar m_spaceIndicatorSaves; #endif @@ -68,7 +68,7 @@ private: UI_MAP_ELEMENT( m_controlSavesTimer, "SavesTimer") UI_MAP_ELEMENT( m_controlJoinTimer, "JoinTimer") -#if defined(_XBOX_ONE) || defined(__ORBIS__) +#if defined(_XBOX_ONE) || defined(__ORBIS__) || defined(_WINDOWS64) UI_MAP_ELEMENT( m_spaceIndicatorSaves, "SaveSizeBar") #endif UI_END_MAP_ELEMENTS_AND_NAMES() diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp index a1cbc144..93f1edf1 100644 --- a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp @@ -368,7 +368,7 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) UINT uiIDA[2]; uiIDA[0]=IDS_CANCEL; uiIDA[1]=IDS_OK; - ui.RequestErrorMessage(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this); + ui.RequestErrorMessage(IDS_WINDOWS_EXIT, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this); } else { diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp index b258d8c3..e9a85fa5 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp @@ -222,9 +222,8 @@ void UIScene_SettingsGraphicsMenu::handleSliderMove(F64 sliderId, F64 currentVal const int fovValue = sliderValueToFov(value); pMinecraft->gameRenderer->SetFovVal(static_cast(fovValue)); app.SetGameSettings(m_iPad, eGameSetting_FOV, value); - WCHAR tempString[256]; - swprintf(tempString, 256, L"FOV: %d", fovValue); - m_sliderFOV.setLabel(tempString); + swprintf(TempString, 256, L"FOV: %d", fovValue); + m_sliderFOV.setLabel(TempString); } break; diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.sln b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.sln deleted file mode 100644 index 31c1bd39..00000000 --- a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.sln +++ /dev/null @@ -1,30 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GameRules", "GameRules.vcxproj", "{0DD2FD59-36AC-476F-9201-D687A4CE9E98}" -EndProject -Global - GlobalSection(TeamFoundationVersionControl) = preSolution - SccNumberOfProjects = 2 - SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - SccTeamFoundationServer = http://tfs_server:8080/tfs/storiespark - SccProjectUniqueName0 = GameRules.vcxproj - SccLocalPath0 = . - SccLocalPath1 = . - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Xbox 360 = Debug|Xbox 360 - Release|Xbox 360 = Release|Xbox 360 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Debug|Xbox 360.ActiveCfg = Debug|Xbox 360 - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Debug|Xbox 360.Build.0 = Debug|Xbox 360 - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360 - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Release|Xbox 360.Build.0 = Release|Xbox 360 - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Release|Xbox 360.Deploy.0 = Release|Xbox 360 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj deleted file mode 100644 index 0bcb4e30..00000000 --- a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Debug - Xbox 360 - - - Release - Xbox 360 - - - - {0DD2FD59-36AC-476F-9201-D687A4CE9E98} - MakeFileProj - SAK - SAK - SAK - SAK - - - - Makefile - - - Makefile - - - - - - - - - - - - - - - _DEBUG;$(NMakePreprocessorDefinitions) - BuildGameRule.cmd Tutorial - - - GameRules.xex - NDEBUG;$(NMakePreprocessorDefinitions) - - - - - - - - CopyToHardDrive - - - - - - Designer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.filters b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.filters deleted file mode 100644 index 9c46ad82..00000000 --- a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.filters +++ /dev/null @@ -1,114 +0,0 @@ - - - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {ab02d5da-7fb3-494b-a636-03764d9a8acd} - - - {e1a87048-bca2-46e6-a234-91d7d64eb983} - - - {da425f4a-cf76-48e8-87cb-d9fda0f42365} - - - {c0ba5f53-4881-495e-8158-5d87f379426d} - - - {61651432-41a1-42f0-a853-c7795d813418} - - - {e194e42b-1c9b-4e35-9a4b-dabd68eab3e0} - - - - - Tutorial - - - Tutorial\Loc - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Packs - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - - - - - - - - - - - Shared - - - \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.vspscc b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.sln b/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.sln deleted file mode 100644 index 31c1bd39..00000000 --- a/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.sln +++ /dev/null @@ -1,30 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GameRules", "GameRules.vcxproj", "{0DD2FD59-36AC-476F-9201-D687A4CE9E98}" -EndProject -Global - GlobalSection(TeamFoundationVersionControl) = preSolution - SccNumberOfProjects = 2 - SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - SccTeamFoundationServer = http://tfs_server:8080/tfs/storiespark - SccProjectUniqueName0 = GameRules.vcxproj - SccLocalPath0 = . - SccLocalPath1 = . - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Xbox 360 = Debug|Xbox 360 - Release|Xbox 360 = Release|Xbox 360 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Debug|Xbox 360.ActiveCfg = Debug|Xbox 360 - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Debug|Xbox 360.Build.0 = Debug|Xbox 360 - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360 - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Release|Xbox 360.Build.0 = Release|Xbox 360 - {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Release|Xbox 360.Deploy.0 = Release|Xbox 360 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj b/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj deleted file mode 100644 index 0bcb4e30..00000000 --- a/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Debug - Xbox 360 - - - Release - Xbox 360 - - - - {0DD2FD59-36AC-476F-9201-D687A4CE9E98} - MakeFileProj - SAK - SAK - SAK - SAK - - - - Makefile - - - Makefile - - - - - - - - - - - - - - - _DEBUG;$(NMakePreprocessorDefinitions) - BuildGameRule.cmd Tutorial - - - GameRules.xex - NDEBUG;$(NMakePreprocessorDefinitions) - - - - - - - - CopyToHardDrive - - - - - - Designer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.filters b/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.filters deleted file mode 100644 index 9c46ad82..00000000 --- a/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.filters +++ /dev/null @@ -1,114 +0,0 @@ - - - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {ab02d5da-7fb3-494b-a636-03764d9a8acd} - - - {e1a87048-bca2-46e6-a234-91d7d64eb983} - - - {da425f4a-cf76-48e8-87cb-d9fda0f42365} - - - {c0ba5f53-4881-495e-8158-5d87f379426d} - - - {61651432-41a1-42f0-a853-c7795d813418} - - - {e194e42b-1c9b-4e35-9a4b-dabd68eab3e0} - - - - - Tutorial - - - Tutorial\Loc - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Tutorial\Loc\Microsoft - - - Packs - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - Tutorial\schematics - - - - - - - - - - - - - Shared - - - \ No newline at end of file diff --git a/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.vspscc b/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/Durango/Layout/Image/Loose/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/DurangoMedia/Layout/Contributors/015236CEB96771670B67A93104CDDD.filestate.xml b/Minecraft.Client/DurangoMedia/Layout/Contributors/015236CEB96771670B67A93104CDDD.filestate.xml deleted file mode 100644 index c7421404..00000000 --- a/Minecraft.Client/DurangoMedia/Layout/Contributors/015236CEB96771670B67A93104CDDD.filestate.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/AppxManifest.xml b/Minecraft.Client/DurangoMedia/Layout/Image/Loose/AppxManifest.xml deleted file mode 100644 index ae7d93e5..00000000 --- a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/AppxManifest.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - - Minecraft: Xbox One Edition - Microsoft Studios - StoreLogo.png - Minecraft - - - 6.2 - 6.2 - title - era - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - windows.xbox.networking.realtimesession.dll - - - - - - Microsoft.Xbox.GameChat.dll - - - - - - Microsoft.Xbox.Services.dll - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/Microsoft.Xbox.GameChat.dll b/Minecraft.Client/DurangoMedia/Layout/Image/Loose/Microsoft.Xbox.GameChat.dll deleted file mode 100644 index 3d83ce3f..00000000 Binary files a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/Microsoft.Xbox.GameChat.dll and /dev/null differ diff --git a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/Microsoft.Xbox.Services.dll b/Minecraft.Client/DurangoMedia/Layout/Image/Loose/Microsoft.Xbox.Services.dll deleted file mode 100644 index 853404c1..00000000 Binary files a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/Microsoft.Xbox.Services.dll and /dev/null differ diff --git a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/Minecraft.Client.exe b/Minecraft.Client/DurangoMedia/Layout/Image/Loose/Minecraft.Client.exe deleted file mode 100644 index e505c521..00000000 Binary files a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/Minecraft.Client.exe and /dev/null differ diff --git a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/SmallLogo.png b/Minecraft.Client/DurangoMedia/Layout/Image/Loose/SmallLogo.png deleted file mode 100644 index 00b54071..00000000 Binary files a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/SmallLogo.png and /dev/null differ diff --git a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/SplashScreen.png b/Minecraft.Client/DurangoMedia/Layout/Image/Loose/SplashScreen.png deleted file mode 100644 index 948fdad7..00000000 Binary files a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/SplashScreen.png and /dev/null differ diff --git a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/StoreLogo.png b/Minecraft.Client/DurangoMedia/Layout/Image/Loose/StoreLogo.png deleted file mode 100644 index 679b33da..00000000 Binary files a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/StoreLogo.png and /dev/null differ diff --git a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/appdata.bin b/Minecraft.Client/DurangoMedia/Layout/Image/Loose/appdata.bin deleted file mode 100644 index 42e51480..00000000 Binary files a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/appdata.bin and /dev/null differ diff --git a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/windows.xbox.networking.realtimesession.dll b/Minecraft.Client/DurangoMedia/Layout/Image/Loose/windows.xbox.networking.realtimesession.dll deleted file mode 100644 index 7ff53c86..00000000 Binary files a/Minecraft.Client/DurangoMedia/Layout/Image/Loose/windows.xbox.networking.realtimesession.dll and /dev/null differ diff --git a/Minecraft.Client/EnderDragonRenderer.cpp b/Minecraft.Client/EnderDragonRenderer.cpp index 8b5b248c..424bdff8 100644 --- a/Minecraft.Client/EnderDragonRenderer.cpp +++ b/Minecraft.Client/EnderDragonRenderer.cpp @@ -89,6 +89,11 @@ void EnderDragonRenderer::render(shared_ptr _mob, double x, double y, do // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); BossMobGuiInfo::setBossHealth(mob, false); + if (!mob->getCustomName().empty()) + { + BossMobGuiInfo::name = mob->getCustomName(); + } + MobRenderer::render(mob, x, y, z, rot, a); if (mob->nearestCrystal != nullptr) { diff --git a/Minecraft.Client/Font.cpp b/Minecraft.Client/Font.cpp index db2a18c0..1040eaa0 100644 --- a/Minecraft.Client/Font.cpp +++ b/Minecraft.Client/Font.cpp @@ -45,46 +45,46 @@ Font::Font(Options *options, const wstring& name, Textures* textures, bool enfor random = new Random(); // Load the image - BufferedImage *img = textures->readImage(textureLocation->getTexture(), name); + BufferedImage *img = textures->readImage(textureLocation->getTexture(), name); /* - 4J - TODO try { - img = ImageIO.read(Textures.class.getResourceAsStream(name)); - } catch (IOException e) { - throw new RuntimeException(e); - } + img = ImageIO.read(Textures.class.getResourceAsStream(name)); + } catch (IOException e) { + throw new RuntimeException(e); + } */ - int w = img->getWidth(); - int h = img->getHeight(); - intArray rawPixels(w * h); - img->getRGB(0, 0, w, h, rawPixels, 0, w); + int w = img->getWidth(); + int h = img->getHeight(); + intArray rawPixels(w * h); + img->getRGB(0, 0, w, h, rawPixels, 0, w); - for (int i = 0; i < charC; i++) + for (int i = 0; i < charC; i++) { - int xt = i % m_cols; - int yt = i / m_cols; + int xt = i % m_cols; + int yt = i / m_cols; - int x = 7; - for (; x >= 0; x--) + int x = 7; + for (; x >= 0; x--) { - int xPixel = xt * 8 + x; - bool emptyColumn = true; - for (int y = 0; y < 8 && emptyColumn; y++) + int xPixel = xt * 8 + x; + bool emptyColumn = true; + for (int y = 0; y < 8 && emptyColumn; y++) { - int yPixel = (yt * 8 + y) * w; + int yPixel = (yt * 8 + y) * w; bool emptyPixel = (rawPixels[xPixel + yPixel] >> 24) == 0; // Check the alpha value - if (!emptyPixel) emptyColumn = false; - } - if (!emptyColumn) + if (!emptyPixel) emptyColumn = false; + } + if (!emptyColumn) { - break; - } - } + break; + } + } - if (i == ' ') x = 4 - 2; - charWidths[i] = x + 2; - } + if (i == ' ') x = 4 - 2; + charWidths[i] = x + 2; + } delete img; @@ -130,6 +130,7 @@ Font::~Font() } #endif +// Legacy helper used by renderCharacter() only. void Font::renderStyleLine(float x0, float y0, float x1, float y1) { Tesselator* t = Tesselator::getInstance(); @@ -146,7 +147,20 @@ void Font::renderStyleLine(float x0, float y0, float x1, float y1) t->end(); } -void Font::addCharacterQuad(wchar_t c) +void Font::addSolidQuad(float x0, float y0, float x1, float y1) +{ + Tesselator *t = Tesselator::getInstance(); + t->tex(0.0f, 0.0f); + t->vertex(x0, y1, 0.0f); + t->tex(0.0f, 0.0f); + t->vertex(x1, y1, 0.0f); + t->tex(0.0f, 0.0f); + t->vertex(x1, y0, 0.0f); + t->tex(0.0f, 0.0f); + t->vertex(x0, y0, 0.0f); +} + +void Font::emitCharacterGeometry(wchar_t c) { float xOff = c % m_cols * m_charWidth; float yOff = c / m_cols * m_charHeight; // was m_charWidth — wrong when glyphs aren't square @@ -180,52 +194,45 @@ void Font::addCharacterQuad(wchar_t c) t->tex(xOff / fontWidth, yOff / fontHeight); t->vertex(x0 + dx, y0, 0.0f); } - - xPos += static_cast(charWidths[c]); } +void Font::addCharacterQuad(wchar_t c) +{ + float height = m_charHeight - .01f; + float x0 = xPos; + float y0 = yPos; + float y1 = yPos + height; + float advance = static_cast(charWidths[c]); + + emitCharacterGeometry(c); + + if (m_underline) + { + addSolidQuad(x0, y1 - 1.0f, xPos + advance, y1); + } + + if (m_strikethrough) + { + float mid = y0 + height * 0.5f; + addSolidQuad(x0, mid - 0.5f, xPos + advance, mid + 0.5f); + } + + xPos += advance; +} + +// Legacy helper used by drawLiteral() only. void Font::renderCharacter(wchar_t c) { - float xOff = c % m_cols * m_charWidth; - float yOff = c / m_cols * m_charHeight; // was m_charWidth — wrong when glyphs aren't square - - float width = charWidths[c] - .01f; float height = m_charHeight - .01f; - - float fontWidth = m_cols * m_charWidth; - float fontHeight = m_rows * m_charHeight; - - const float shear = m_italic ? (height * 0.25f) : 0.0f; - float x0 = xPos, x1 = xPos + width + shear; - float y0 = yPos, y1 = yPos + height; + float x0 = xPos; + float y0 = yPos; + float y1 = yPos + height; Tesselator *t = Tesselator::getInstance(); t->begin(); - t->tex(xOff / fontWidth, (yOff + 7.99f) / fontHeight); - t->vertex(x0, y1, 0.0f); - t->tex((xOff + width) / fontWidth, (yOff + 7.99f) / fontHeight); - t->vertex(x1, y1, 0.0f); - t->tex((xOff + width) / fontWidth, yOff / fontHeight); - t->vertex(x1, y0, 0.0f); - t->tex(xOff / fontWidth, yOff / fontHeight); - t->vertex(x0, y0, 0.0f); + emitCharacterGeometry(c); t->end(); - if (m_bold) - { - float dx = 1.0f; - t->begin(); - t->tex(xOff / fontWidth, (yOff + 7.99f) / fontHeight); - t->vertex(x0 + dx, y1, 0.0f); - t->tex((xOff + width) / fontWidth, (yOff + 7.99f) / fontHeight); - t->vertex(x1 + dx, y1, 0.0f); - t->tex((xOff + width) / fontWidth, yOff / fontHeight); - t->vertex(x1 + dx, y0, 0.0f); - t->tex(xOff / fontWidth, yOff / fontHeight); - t->vertex(x0 + dx, y0, 0.0f); - t->end(); - } - if (m_underline) renderStyleLine(x0, y1 - 1.0f, xPos + static_cast(charWidths[c]), y1); @@ -240,8 +247,8 @@ void Font::renderCharacter(wchar_t c) void Font::drawShadow(const wstring& str, int x, int y, int color) { - draw(str, x + 1, y + 1, color, true); - draw(str, x, y, color, false); + draw(str, x + 1, y + 1, color, true); + draw(str, x, y, color, false); } void Font::drawShadowLiteral(const wstring& str, int x, int y, int color) @@ -289,7 +296,7 @@ static bool isSectionFormatCode(wchar_t ca) return l == L'l' || l == L'o' || l == L'n' || l == L'm' || l == L'r' || l == L'k'; } -void Font::draw(const wstring &str, bool dropShadow) +void Font::draw(const wstring &str, bool dropShadow, int initialColor) { // Bind the texture textures->bindTexture(m_textureLocation); @@ -297,8 +304,11 @@ void Font::draw(const wstring &str, bool dropShadow) m_bold = m_italic = m_underline = m_strikethrough = false; wstring cleanStr = sanitize(str); + int currentColor = initialColor; + Tesselator *t = Tesselator::getInstance(); t->begin(); + t->color(currentColor & 0x00ffffff, (currentColor >> 24) & 255); for (int i = 0; i < static_cast(cleanStr.length()); ++i) { @@ -310,10 +320,8 @@ void Font::draw(const wstring &str, bool dropShadow) wchar_t ca = cleanStr[i+1]; if (!isSectionFormatCode(ca)) { - t->end(); - renderCharacter(167); - renderCharacter(ca); - t->begin(); + addCharacterQuad(167); + addCharacterQuad(ca); i += 1; continue; } @@ -329,7 +337,12 @@ void Font::draw(const wstring &str, bool dropShadow) else if (l == L'o') m_italic = true; else if (l == L'n') m_underline = true; else if (l == L'm') m_strikethrough = true; - else if (l == L'r') m_bold = m_italic = m_underline = m_strikethrough = noise = false; + else if (l == L'r') + { + m_bold = m_italic = m_underline = m_strikethrough = noise = false; + currentColor = initialColor; + t->color(currentColor & 0x00ffffff, (currentColor >> 24) & 255); + } else if (l == L'k') noise = true; } else @@ -337,8 +350,8 @@ void Font::draw(const wstring &str, bool dropShadow) noise = false; if (colorN < 0 || colorN > 15) colorN = 15; if (dropShadow) colorN += 16; - int color = colors[colorN]; - glColor3f((color >> 16) / 255.0F, ((color >> 8) & 255) / 255.0F, (color & 255) / 255.0F); + currentColor = (initialColor & 0xff000000) | colors[colorN]; + t->color(currentColor & 0x00ffffff, (currentColor >> 24) & 255); } i += 1; continue; @@ -371,11 +384,11 @@ void Font::draw(const wstring& str, int x, int y, int color, bool dropShadow) if (dropShadow) // divide RGB by 4, preserve alpha color = (color & 0xfcfcfc) >> 2 | (color & (-1 << 24)); - glColor4f((color >> 16 & 255) / 255.0F, (color >> 8 & 255) / 255.0F, (color & 255) / 255.0F, (color >> 24 & 255) / 255.0F); + glColor4f(1.0F, 1.0F, 1.0F, 1.0F); xPos = x; yPos = y; - draw(str, dropShadow); + draw(str, dropShadow, color); } } @@ -422,9 +435,9 @@ wstring Font::sanitize(const wstring& str) { wstring sb = str; - for (unsigned int i = 0; i < sb.length(); i++) + for (unsigned int i = 0; i < sb.length(); i++) { - if (CharacterExists(sb[i])) + if (CharacterExists(sb[i])) { sb[i] = MapCharacter(sb[i]); } @@ -433,8 +446,8 @@ wstring Font::sanitize(const wstring& str) // If this character isn't supported, just show the first character (empty square box character) sb[i] = 0; } - } - return sb; + } + return sb; } int Font::MapCharacter(wchar_t c) @@ -487,95 +500,95 @@ void Font::drawWordWrap(const wstring &string, int x, int y, int w, int col, boo void Font::drawWordWrapInternal(const wstring& string, int x, int y, int w, int col, bool darken, int h) { - vectorlines = stringSplit(string,L'\n'); - if (lines.size() > 1) + vectorlines = stringSplit(string,L'\n'); + if (lines.size() > 1) { - for ( auto& it : lines ) - { + for ( auto& it : lines ) + { // 4J Stu - Don't draw text that will be partially cutoff/overlap something it shouldn't if( (y + this->wordWrapHeight(it, w)) > h) break; - drawWordWrapInternal(it, x, y, w, col, h); - y += this->wordWrapHeight(it, w); - } - return; - } - vector words = stringSplit(string,L' '); - unsigned int pos = 0; - while (pos < words.size()) + drawWordWrapInternal(it, x, y, w, col, h); + y += this->wordWrapHeight(it, w); + } + return; + } + vector words = stringSplit(string,L' '); + unsigned int pos = 0; + while (pos < words.size()) { - wstring line = words[pos++] + L" "; - while (pos < words.size() && width(line + words[pos]) < w) + wstring line = words[pos++] + L" "; + while (pos < words.size() && width(line + words[pos]) < w) { - line += words[pos++] + L" "; - } - while (width(line) > w) + line += words[pos++] + L" "; + } + while (width(line) > w) { - int l = 0; - while (width(line.substr(0, l + 1)) <= w) + int l = 0; + while (width(line.substr(0, l + 1)) <= w) { - l++; - } - if (trimString(line.substr(0, l)).length() > 0) + l++; + } + if (trimString(line.substr(0, l)).length() > 0) { - draw(line.substr(0, l), x, y, col); - y += 8; - } - line = line.substr(l); + draw(line.substr(0, l), x, y, col); + y += 8; + } + line = line.substr(l); // 4J Stu - Don't draw text that will be partially cutoff/overlap something it shouldn't if( (y + 8) > h) break; - } + } // 4J Stu - Don't draw text that will be partially cutoff/overlap something it shouldn't - if (trimString(line).length() > 0 && !( (y + 8) > h) ) + if (trimString(line).length() > 0 && !( (y + 8) > h) ) { - draw(line, x, y, col); - y += 8; - } - } + draw(line, x, y, col); + y += 8; + } + } } int Font::wordWrapHeight(const wstring& string, int w) { - vector lines = stringSplit(string,L'\n'); - if (lines.size() > 1) + vector lines = stringSplit(string,L'\n'); + if (lines.size() > 1) { - int h = 0; - for ( auto& it : lines ) - { - h += this->wordWrapHeight(it, w); - } - return h; - } + int h = 0; + for ( auto& it : lines ) + { + h += this->wordWrapHeight(it, w); + } + return h; + } vector words = stringSplit(string,L' '); - unsigned int pos = 0; - int y = 0; - while (pos < words.size()) + unsigned int pos = 0; + int y = 0; + while (pos < words.size()) { - wstring line = words[pos++] + L" "; - while (pos < words.size() && width(line + words[pos]) < w) + wstring line = words[pos++] + L" "; + while (pos < words.size() && width(line + words[pos]) < w) { - line += words[pos++] + L" "; - } - while (width(line) > w) + line += words[pos++] + L" "; + } + while (width(line) > w) { - int l = 0; + int l = 0; while (width(line.substr(0, l + 1)) <= w) { - l++; - } - if (trimString(line.substr(0, l)).length() > 0) + l++; + } + if (trimString(line.substr(0, l)).length() > 0) { - y += 8; - } - line = line.substr(l); - } - if (trimString(line).length() > 0) { - y += 8; - } - } - if (y < 8) y += 8; - return y; + y += 8; + } + line = line.substr(l); + } + if (trimString(line).length() > 0) { + y += 8; + } + } + if (y < 8) y += 8; + return y; } diff --git a/Minecraft.Client/Font.h b/Minecraft.Client/Font.h index c78ea678..58bceb4c 100644 --- a/Minecraft.Client/Font.h +++ b/Minecraft.Client/Font.h @@ -38,7 +38,7 @@ private: std::map m_charMap; public: - Font(Options *options, const wstring& name, Textures* textures, bool enforceUnicode, ResourceLocation *textureLocation, int cols, int rows, int charWidth, int charHeight, unsigned short charMap[] = nullptr); + Font(Options *options, const wstring& name, Textures* textures, bool enforceUnicode, ResourceLocation *textureLocation, int cols, int rows, int charWidth, int charHeight, unsigned short charMap[] = nullptr); #ifndef _XBOX // 4J Stu - This dtor clashes with one in xui! We never delete these anyway so take it out for now. Can go back when we have got rid of XUI ~Font(); @@ -48,6 +48,8 @@ public: private: void renderCharacter(wchar_t c); // 4J added void addCharacterQuad(wchar_t c); + void addSolidQuad(float x0, float y0, float x1, float y1); + void emitCharacterGeometry(wchar_t c); void renderStyleLine(float x0, float y0, float x1, float y1); // solid line for underline/strikethrough public: @@ -65,7 +67,7 @@ public: private: wstring reorderBidi(const wstring &str); - void draw(const wstring &str, bool dropShadow); + void draw(const wstring &str, bool dropShadow, int baseColor); void draw(const wstring& str, int x, int y, int color, bool dropShadow); void drawLiteral(const wstring& str, int x, int y, int color); // no § parsing int MapCharacter(wchar_t c); // 4J added diff --git a/Minecraft.Client/GameRenderer.cpp b/Minecraft.Client/GameRenderer.cpp index 73b39529..0b99a231 100644 --- a/Minecraft.Client/GameRenderer.cpp +++ b/Minecraft.Client/GameRenderer.cpp @@ -359,14 +359,17 @@ void GameRenderer::pick(float a) } } +// Toru - wrapping these methods for backwards compatibility, +// no longer setting m_fov as its use doesn't respect applyEffects param in GameRenderer::getFov void GameRenderer::SetFovVal(float fov) { - m_fov=fov; + //m_fov=fov; + mc->options->set(Options::Option::FOV, (fov - 70) / 40); } float GameRenderer::GetFovVal() { - return m_fov; + return 70 + mc->options->fov * 40;//m_fov; } void GameRenderer::tickFov() @@ -390,6 +393,8 @@ float GameRenderer::getFov(float a, bool applyEffects) shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); int playerIdx = player ? player->GetXboxPad() : 0; float fov = m_fov;//70; + if (fov < 1) fov = 1; // Crash fix + if (applyEffects) { fov += mc->options->fov * 40; diff --git a/Minecraft.Client/Gui.cpp b/Minecraft.Client/Gui.cpp index 43b41998..5e3a954f 100644 --- a/Minecraft.Client/Gui.cpp +++ b/Minecraft.Client/Gui.cpp @@ -443,7 +443,8 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) double maxHealth = minecraft->localplayers[iPad]->getAttribute(SharedMonsterAttributes.MAX_HEALTH); double totalAbsorption = minecraft->localplayers[iPad]->getAbsorptionAmount(); - int numHealthRows = Mth.ceil((maxHealth + totalAbsorption) / 2 / (float) NUM_HEARTS_PER_ROW); + const double healthHalves = (maxHealth + totalAbsorption) / 2.0; + int numHealthRows = Mth.ceil(healthHalves / (float) NUM_HEARTS_PER_ROW); int healthRowHeight = Math.max(10 - (numHealthRows - 2), 3); int yLine2 = yLine1 - (numHealthRows - 1) * healthRowHeight - 10; absorption = totalAbsorption; @@ -469,7 +470,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) } //minecraft.profiler.popPush("health"); - for (int i = Mth.ceil((maxHealth + totalAbsorption) / 2) - 1; i >= 0; i--) + for (int i = (int)Mth.ceil(healthHalves) - 1; i >= 0; i--) { int healthTexBaseX = 16; if (minecraft.player.hasEffect(MobEffect.poison)) @@ -607,8 +608,11 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) // render air bubbles if (minecraft->player->isUnderLiquid(Material::water)) { - int count = (int) ceil((minecraft->player->getAirSupply() - 2) * 10.0f / Player::TOTAL_AIR_SUPPLY); - int extra = (int) ceil((minecraft->player->getAirSupply()) * 10.0f / Player::TOTAL_AIR_SUPPLY) - count; + const int airSupply = minecraft->player->getAirSupply(); + const float airScale = 10.0f / Player::TOTAL_AIR_SUPPLY; + const float airSupplyScaled = airSupply * airScale; + int count = (int) ceil((airSupply - 2) * airScale); + int extra = (int) ceil(airSupplyScaled) - count; for (int i = 0; i < count + extra; i++) { // Air bubbles @@ -725,7 +729,8 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) Lighting::turnOn(); glRotatef(-45 - 90, 0, 1, 0); - glRotatef(-(float) atan(yd / 40.0f ) * 20, 1, 0, 0); + const float xRotAngle = -(float) atan(yd / 40.0f) * 20; + glRotatef(xRotAngle, 1, 0, 0); float bodyRot = (minecraft->player->yBodyRotO + (minecraft->player->yBodyRot - minecraft->player->yBodyRotO)); // Fixed rotation angle of degrees, adjusted by bodyRot to negate the rotation that occurs in the renderer // bodyRot in the rotation below is a simplification of "180 - (180 - bodyRot)" where the first 180 is EntityRenderDispatcher::instance->playerRotY that we set below @@ -736,7 +741,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) // Set head rotation to body rotation to make head static minecraft->player->yRot = bodyRot; minecraft->player->yRotO = minecraft->player->yRot; - minecraft->player->xRot = -(float) atan(yd / 40.0f) * 20; + minecraft->player->xRot = xRotAngle; minecraft->player->onFire = 0; minecraft->player->setSharedFlag(Entity::FLAG_ONFIRE, false); @@ -849,207 +854,6 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) // font.draw(str, x + 1, y, 0xffffff); // } -#ifndef _FINAL_BUILD - MemSect(31); - - // temporarily render overlay at all times so version is more obvious in bug reports - // we can turn this off once things stabilize - if (true)// minecraft->options->renderDebug && minecraft->player != nullptr && minecraft->level != nullptr) - { - const int debugLeft = 1; - const int debugTop = 1; - const float maxContentWidth = 1200.f; - const float maxContentHeight = 420.f; - float scale = static_cast(screenWidth - debugLeft - 8) / maxContentWidth; - float scaleV = static_cast(screenHeight - debugTop - 80) / maxContentHeight; - if (scaleV < scale) scale = scaleV; - if (scale > 1.f) scale = 1.f; - if (scale < 0.5f) scale = 0.5f; - glPushMatrix(); - glTranslatef(static_cast(debugLeft), static_cast(debugTop), 0.f); - glScalef(scale, scale, 1.f); - glTranslatef(static_cast(-debugLeft), static_cast(-debugTop), 0.f); - - vector lines; - - lines.push_back(ClientConstants::VERSION_STRING); - lines.push_back(ClientConstants::BRANCH_STRING); - if (minecraft->options->renderDebug && minecraft->player != nullptr && minecraft->level != nullptr) - { - lines.push_back(minecraft->fpsString); - lines.push_back(L"E: " + std::to_wstring(minecraft->level->getAllEntities().size())); // Could maybe use entity::shouldRender to work out how many are rendered but thats like expensive - // TODO Add server information with packet counts - once multiplayer is more stable - int renderDistance = app.GetGameSettings(iPad, eGameSetting_RenderDistance); - // Calculate the chunk sections using 16 * (2n + 1)^2 - lines.push_back(L"C: " + std::to_wstring(16 * (2 * renderDistance + 1) * (2 * renderDistance + 1)) + L" D: " + std::to_wstring(renderDistance)); - lines.push_back(minecraft->gatherStats4()); // Chunk Cache - - // Dimension - wstring dimension = L"unknown"; - switch (minecraft->player->dimension) - { - case -1: - dimension = L"minecraft:the_nether"; - break; - case 0: - dimension = L"minecraft:overworld"; - break; - case 1: - dimension = L"minecraft:the_end"; - break; - } - lines.push_back(dimension); - - lines.push_back(L""); // Spacer - - // Players block pos - int xBlockPos = Mth::floor(minecraft->player->x); - int yBlockPos = Mth::floor(minecraft->player->y); - int zBlockPos = Mth::floor(minecraft->player->z); - - // Chunk player is in - int xChunkPos = xBlockPos >> 4; - int yChunkPos = yBlockPos >> 4; - int zChunkPos = zBlockPos >> 4; - - // Players offset within the chunk - int xChunkOffset = xBlockPos & 15; - int yChunkOffset = yBlockPos & 15; - int zChunkOffset = zBlockPos & 15; - - // Format the position like java with limited decumal places - WCHAR posString[44]; // Allows upto 7 digit positions (+-9_999_999) - swprintf(posString, 44, L"%.3f / %.5f / %.3f", minecraft->player->x, minecraft->player->y, minecraft->player->z); - - lines.push_back(L"XYZ: " + std::wstring(posString)); - lines.push_back(L"Block: " + std::to_wstring(static_cast(xBlockPos)) + L" " + std::to_wstring(static_cast(yBlockPos)) + L" " + std::to_wstring(static_cast(zBlockPos))); - lines.push_back(L"Chunk: " + std::to_wstring(xChunkOffset) + L" " + std::to_wstring(yChunkOffset) + L" " + std::to_wstring(zChunkOffset) + L" in " + std::to_wstring(xChunkPos) + L" " + std::to_wstring(yChunkPos) + L" " + std::to_wstring(zChunkPos)); - - // Wrap the yRot to 360 then adjust to (-180 to 180) range to match java - float yRotDisplay = fmod(minecraft->player->yRot, 360.0f); - if (yRotDisplay > 180.0f) - { - yRotDisplay -= 360.0f; - } - if (yRotDisplay < -180.0f) - { - yRotDisplay += 360.0f; - } - // Generate the angle string in the format "yRot / xRot" with one decimal place, similar to java edition - WCHAR angleString[16]; - swprintf(angleString, 16, L"%.1f / %.1f", yRotDisplay, minecraft->player->xRot); - - // Work out the named direction - int direction = Mth::floor(minecraft->player->yRot * 4.0f / 360.0f + 0.5) & 0x3; - wstring cardinalDirection; - switch (direction) - { - case 0: - cardinalDirection = L"south"; - break; - case 1: - cardinalDirection = L"west"; - break; - case 2: - cardinalDirection = L"north"; - break; - case 3: - cardinalDirection = L"east"; - break; - } - - lines.push_back(L"Facing: " + cardinalDirection + L" (" + angleString + L")"); - - // We have to limit y to 256 as we don't get any information past that - if (minecraft->level != NULL && minecraft->level->hasChunkAt(xBlockPos, fmod(yBlockPos, 256), zBlockPos)) - { - LevelChunk *chunkAt = minecraft->level->getChunkAt(xBlockPos, zBlockPos); - if (chunkAt != NULL) - { - int skyLight = chunkAt->getBrightness(LightLayer::Sky, xChunkOffset, yChunkOffset, zChunkOffset); - int blockLight = chunkAt->getBrightness(LightLayer::Block, xChunkOffset, yChunkOffset, zChunkOffset); - int maxLight = fmax(skyLight, blockLight); - lines.push_back(L"Light: " + std::to_wstring(maxLight) + L" (" + std::to_wstring(skyLight) + L" sky, " + std::to_wstring(blockLight) + L" block)"); - - lines.push_back(L"CH S: " + std::to_wstring(chunkAt->getHeightmap(xChunkOffset, zChunkOffset))); - - Biome *biome = chunkAt->getBiome(xChunkOffset, zChunkOffset, minecraft->level->getBiomeSource()); - lines.push_back(L"Biome: " + biome->m_name + L" (" + std::to_wstring(biome->id) + L")"); - - lines.push_back(L"Difficulty: " + std::to_wstring(minecraft->level->difficulty) + L" (Day " + std::to_wstring(minecraft->level->getGameTime() / Level::TICKS_PER_DAY) + L")"); - } - } - - // This is all LCE only stuff, it was never on java - lines.push_back(L""); // Spacer - lines.push_back(L"Seed: " + std::to_wstring(minecraft->level->getLevelData()->getSeed())); - lines.push_back(minecraft->gatherStats1()); // Time to autosave - lines.push_back(minecraft->gatherStats2()); // Empty currently - CPlatformNetworkManagerStub::GatherStats() - lines.push_back(minecraft->gatherStats3()); // RTT - } - -#ifdef _DEBUG // Only show terrain features in debug builds not release - // TERRAIN FEATURES - if (minecraft->level->dimension->id == 0) - { - wstring wfeature[eTerrainFeature_Count]; - - wfeature[eTerrainFeature_Stronghold] = L"Stronghold: "; - wfeature[eTerrainFeature_Mineshaft] = L"Mineshaft: "; - wfeature[eTerrainFeature_Village] = L"Village: "; - wfeature[eTerrainFeature_Ravine] = L"Ravine: "; - - float maxW = static_cast(screenWidth - debugLeft - 8) / scale; - float maxWForContent = maxW - static_cast(font->width(L"...")); - bool truncated[eTerrainFeature_Count] = {}; - - for (size_t i = 0; i < app.m_vTerrainFeatures.size(); i++) - { - FEATURE_DATA *pFeatureData = app.m_vTerrainFeatures[i]; - int type = pFeatureData->eTerrainFeature; - if (type < eTerrainFeature_Stronghold || type > eTerrainFeature_Ravine) - { - continue; - } - if (truncated[type]) - { - continue; - } - - wstring itemInfo = L"[" + std::to_wstring(pFeatureData->x * 16) + L", " + std::to_wstring(pFeatureData->z * 16) + L"] "; - if (font->width(wfeature[type] + itemInfo) <= maxWForContent) - { - wfeature[type] += itemInfo; - } - else - { - wfeature[type] += L"..."; - truncated[type] = true; - } - } - - lines.push_back(L""); // Add a spacer line - for (int i = eTerrainFeature_Stronghold; i <= static_cast(eTerrainFeature_Ravine); i++) - { - lines.push_back(wfeature[i]); - } - lines.push_back(L""); - } -#endif - - // Loop through the lines and draw them all on screen - int yPos = debugTop; - for (const auto &line : lines) - { - drawString(font, line, debugLeft, yPos, 0xffffff); - yPos += 10; - } - - glPopMatrix(); - } - MemSect(0); -#endif - lastTickA = a; // 4J Stu - This is now displayed in a xui scene #if 0 @@ -1203,6 +1007,228 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) glPopMatrix(); } +#ifndef _FINAL_BUILD + MemSect(31); + if (true) + { + // Real window dimensions updated on every WM_SIZE — always current + extern int g_rScreenWidth; + extern int g_rScreenHeight; + + // Set up a fresh projection using physical pixel coordinates so the debug + // text is never distorted regardless of aspect ratio, splitscreen layout, + // or menu state. 1 coordinate unit = 1 physical pixel. + // Compute the actual viewport dimensions for this player's screen section. + // glOrtho must match the viewport exactly for 1 unit = 1 physical pixel. + int vpW = g_rScreenWidth; + int vpH = g_rScreenHeight; + switch (minecraft->player->m_iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + vpH /= 2; + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + vpW /= 2; + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + vpW /= 2; + vpH /= 2; + break; + default: // VIEWPORT_TYPE_FULLSCREEN + break; + } + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, vpW, vpH, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + + // Font was designed for guiScale px/unit; scale up so characters appear + // at the same physical size as the rest of the HUD at 0.5x. + const float fontScale = static_cast(guiScale) * 1.0f; + const int debugLeft = 1; + const int debugTop = 1; + + glTranslatef(static_cast(debugLeft), static_cast(debugTop), 0.f); + glScalef(fontScale, fontScale, 1.f); + glTranslatef(static_cast(-debugLeft), static_cast(-debugTop), 0.f); + + vector lines; + + // Only show version/branch for player 0 to avoid cluttering each splitscreen viewport + if (iPad == 0) + { + lines.push_back(ClientConstants::VERSION_STRING); + lines.push_back(ClientConstants::BRANCH_STRING); + } + + if (minecraft->options->renderDebug && minecraft->player != nullptr && minecraft->level != nullptr) + { + lines.push_back(minecraft->fpsString); + lines.push_back(L"E: " + std::to_wstring(minecraft->level->getAllEntities().size())); + int renderDistance = app.GetGameSettings(iPad, eGameSetting_RenderDistance); + // Calculate the chunk sections using 16 * (2n + 1)^2 + lines.push_back(L"C: " + std::to_wstring(16 * (2 * renderDistance + 1) * (2 * renderDistance + 1)) + L" D: " + std::to_wstring(renderDistance)); + lines.push_back(minecraft->gatherStats4()); + + // Dimension + wstring dimension = L"unknown"; + switch (minecraft->player->dimension) + { + case -1: + dimension = L"minecraft:the_nether"; + break; + case 0: + dimension = L"minecraft:overworld"; + break; + case 1: + dimension = L"minecraft:the_end"; + break; + } + lines.push_back(dimension); + + lines.push_back(L""); // Spacer + + // Players block pos + int xBlockPos = Mth::floor(minecraft->player->x); + int yBlockPos = Mth::floor(minecraft->player->y); + int zBlockPos = Mth::floor(minecraft->player->z); + + // Chunk player is in + int xChunkPos = xBlockPos >> 4; + int yChunkPos = yBlockPos >> 4; + int zChunkPos = zBlockPos >> 4; + + // Players offset within the chunk + int xChunkOffset = xBlockPos & 15; + int yChunkOffset = yBlockPos & 15; + int zChunkOffset = zBlockPos & 15; + + // Format the position like java with limited decumal places + WCHAR posString[44]; // Allows upto 7 digit positions (+-9_999_999) + swprintf(posString, 44, L"%.3f / %.5f / %.3f", minecraft->player->x, minecraft->player->y, minecraft->player->z); + + lines.push_back(L"XYZ: " + std::wstring(posString)); + lines.push_back(L"Block: " + std::to_wstring(xBlockPos) + L" " + std::to_wstring(yBlockPos) + L" " + std::to_wstring(zBlockPos)); + lines.push_back(L"Chunk: " + std::to_wstring(xChunkOffset) + L" " + std::to_wstring(yChunkOffset) + L" " + std::to_wstring(zChunkOffset) + L" in " + std::to_wstring(xChunkPos) + L" " + std::to_wstring(yChunkPos) + L" " + std::to_wstring(zChunkPos)); + + // Wrap the yRot to 360 then adjust to (-180 to 180) range to match java + float yRotDisplay = fmod(minecraft->player->yRot, 360.0f); + if (yRotDisplay > 180.0f) yRotDisplay -= 360.0f; + if (yRotDisplay < -180.0f) yRotDisplay += 360.0f; + // Generate the angle string in the format "yRot / xRot" with one decimal place, similar to java edition + WCHAR angleString[16]; + swprintf(angleString, 16, L"%.1f / %.1f", yRotDisplay, minecraft->player->xRot); + + // Work out the named direction + int direction = Mth::floor(minecraft->player->yRot * 4.0f / 360.0f + 0.5) & 0x3; + const wchar_t* cardinals[] = { L"south", L"west", L"north", L"east" }; + lines.push_back(L"Facing: " + std::wstring(cardinals[direction]) + L" (" + angleString + L")"); + + // We have to limit y to 256 as we don't get any information past that + if (minecraft->level != NULL && minecraft->level->hasChunkAt(xBlockPos, fmod(yBlockPos, 256), zBlockPos)) + { + LevelChunk *chunkAt = minecraft->level->getChunkAt(xBlockPos, zBlockPos); + if (chunkAt != NULL) + { + int skyLight = chunkAt->getBrightness(LightLayer::Sky, xChunkOffset, yChunkOffset, zChunkOffset); + int blockLight = chunkAt->getBrightness(LightLayer::Block, xChunkOffset, yChunkOffset, zChunkOffset); + int maxLight = fmax(skyLight, blockLight); + lines.push_back(L"Light: " + std::to_wstring(maxLight) + L" (" + std::to_wstring(skyLight) + L" sky, " + std::to_wstring(blockLight) + L" block)"); + + lines.push_back(L"CH S: " + std::to_wstring(chunkAt->getHeightmap(xChunkOffset, zChunkOffset))); + + Biome *biome = chunkAt->getBiome(xChunkOffset, zChunkOffset, minecraft->level->getBiomeSource()); + lines.push_back(L"Biome: " + biome->m_name + L" (" + std::to_wstring(biome->id) + L")"); + + lines.push_back(L"Difficulty: " + std::to_wstring(minecraft->level->difficulty) + L" (Day " + std::to_wstring(minecraft->level->getGameTime() / Level::TICKS_PER_DAY) + L")"); + } + } + + // This is all LCE only stuff, it was never on java + lines.push_back(L""); // Spacer + lines.push_back(L"Seed: " + std::to_wstring(minecraft->level->getLevelData()->getSeed())); + lines.push_back(minecraft->gatherStats1()); // Time to autosave + lines.push_back(minecraft->gatherStats2()); // Empty currently - CPlatformNetworkManagerStub::GatherStats() + lines.push_back(minecraft->gatherStats3()); // RTT + +#ifdef _DEBUG // Only show terrain features in debug builds not release + + // No point trying to render this when not in the overworld + if (minecraft->level->dimension->id == 0) + { + wstring wfeature[eTerrainFeature_Count]; + wfeature[eTerrainFeature_Stronghold] = L"Stronghold: "; + wfeature[eTerrainFeature_Mineshaft] = L"Mineshaft: "; + wfeature[eTerrainFeature_Village] = L"Village: "; + wfeature[eTerrainFeature_Ravine] = L"Ravine: "; + + // maxW in font units: physical width divided by font scale + float maxW = (static_cast(g_rScreenWidth) - debugLeft - 8) / fontScale; + float maxWForContent = maxW - static_cast(font->width(L"...")); + bool truncated[eTerrainFeature_Count] = {}; + + for (size_t i = 0; i < app.m_vTerrainFeatures.size(); i++) + { + FEATURE_DATA *pFeatureData = app.m_vTerrainFeatures[i]; + int type = pFeatureData->eTerrainFeature; + if (type < eTerrainFeature_Stronghold || type > eTerrainFeature_Ravine) continue; + if (truncated[type]) continue; + + wstring itemInfo = L"[" + std::to_wstring(pFeatureData->x * 16) + L", " + std::to_wstring(pFeatureData->z * 16) + L"] "; + if (font->width(wfeature[type] + itemInfo) <= maxWForContent) + { + wfeature[type] += itemInfo; + } + else + { + wfeature[type] += L"..."; + truncated[type] = true; + } + } + + lines.push_back(L""); // Spacer + for (int i = eTerrainFeature_Stronghold; i <= static_cast(eTerrainFeature_Ravine); i++) + { + lines.push_back(wfeature[i]); + } + lines.push_back(L""); // Spacer + } +#endif + } + + // Disable the depth test so the text shows on top of the paperdoll + glDisable(GL_DEPTH_TEST); + + // Loop through the lines and draw them all on screen + int yPos = debugTop; + for (const auto &line : lines) + { + drawString(font, line, debugLeft, yPos, 0xffffff); + yPos += 10; + } + + // Restore the depth test + glEnable(GL_DEPTH_TEST); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + } + MemSect(0); +#endif + glColor4f(1, 1, 1, 1); glDisable(GL_BLEND); glEnable(GL_ALPHA_TEST); diff --git a/Minecraft.Client/HumanoidModel.cpp b/Minecraft.Client/HumanoidModel.cpp index c6c6b9f4..f44654c3 100644 --- a/Minecraft.Client/HumanoidModel.cpp +++ b/Minecraft.Client/HumanoidModel.cpp @@ -241,7 +241,7 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float if (riding) { - if(uiBitmaskOverrideAnim&(1<xRot += -HALF_PI * 0.4f; arm1->xRot += -HALF_PI * 0.4f; diff --git a/Minecraft.Client/ItemInHandRenderer.cpp b/Minecraft.Client/ItemInHandRenderer.cpp index 66c922b4..749337da 100644 --- a/Minecraft.Client/ItemInHandRenderer.cpp +++ b/Minecraft.Client/ItemInHandRenderer.cpp @@ -228,7 +228,7 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptrid]->getColor(item,0); + int col = Item::items[item->id]->getColor(item, layer); float red = ((col >> 16) & 0xff) / 255.0f; float g = ((col >> 8) & 0xff) / 255.0f; float b = ((col) & 0xff) / 255.0f; @@ -286,6 +286,20 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptrgetAnimOverrideBitmask() & (1 << HumanoidModel::eAnim_SmallModel)) + { + if (mob->isRiding()) + { + std::shared_ptr ridingEntity = mob->riding; + if (ridingEntity != nullptr) // Safety check; + { + yo += 0.3f; // reverts the change in Boat.cpp for smaller models. + } + } + } glEnable(GL_RESCALE_NORMAL); glTranslatef(-xo, -yo, 0); diff --git a/Minecraft.Client/Minecraft.Client.vcxproj b/Minecraft.Client/Minecraft.Client.vcxproj deleted file mode 100644 index d97cbc38..00000000 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ /dev/null @@ -1,48741 +0,0 @@ - - - - - ContentPackage_NO_TU - ARM64EC - - - ContentPackage_NO_TU - Durango - - - ContentPackage_NO_TU - ORBIS - - - ContentPackage_NO_TU - PS3 - - - ContentPackage_NO_TU - PSVita - - - ContentPackage_NO_TU - Win32 - - - ContentPackage_NO_TU - x64 - - - ContentPackage_NO_TU - Xbox 360 - - - CONTENTPACKAGE_SYMBOLS - ARM64EC - - - CONTENTPACKAGE_SYMBOLS - Durango - - - CONTENTPACKAGE_SYMBOLS - ORBIS - - - CONTENTPACKAGE_SYMBOLS - PS3 - - - CONTENTPACKAGE_SYMBOLS - PSVita - - - CONTENTPACKAGE_SYMBOLS - Win32 - - - CONTENTPACKAGE_SYMBOLS - x64 - - - CONTENTPACKAGE_SYMBOLS - Xbox 360 - - - ContentPackage_Vita - ARM64EC - - - ContentPackage_Vita - Durango - - - ContentPackage_Vita - ORBIS - - - ContentPackage_Vita - PS3 - - - ContentPackage_Vita - PSVita - - - ContentPackage_Vita - Win32 - - - ContentPackage_Vita - x64 - - - ContentPackage_Vita - Xbox 360 - - - ContentPackage - ARM64EC - - - ContentPackage - Durango - - - ContentPackage - ORBIS - - - ContentPackage - PS3 - - - ContentPackage - PSVita - - - ContentPackage - Win32 - - - ContentPackage - x64 - - - ContentPackage - Xbox 360 - - - Debug - ARM64EC - - - Debug - Durango - - - Debug - ORBIS - - - Debug - PS3 - - - Debug - PSVita - - - Debug - Win32 - - - Debug - x64 - - - Debug - Xbox 360 - - - ReleaseForArt - ARM64EC - - - ReleaseForArt - Durango - - - ReleaseForArt - ORBIS - - - ReleaseForArt - PS3 - - - ReleaseForArt - PSVita - - - ReleaseForArt - Win32 - - - ReleaseForArt - x64 - - - ReleaseForArt - Xbox 360 - - - Release - ARM64EC - - - Release - Durango - - - Release - ORBIS - - - Release - PS3 - - - Release - PSVita - - - Release - Win32 - - - Release - x64 - - - Release - Xbox 360 - - - - en-US - {1B9A8C38-DD48-448C-AA24-E1A35E0089A3} - SAK - SAK - SAK - SAK - Xbox360Proj - title - - - - Application - MultiByte - - - Application - MultiByte - - - Application - MultiByte - - - Application - MultiByte - WithExceptsWithRtti - SNC - - - Application - MultiByte - WithExceptsWithRtti - SNC - - - Application - MultiByte - WithExceptsWithRtti - NoTocRestore2 - - - Application - MultiByte - WithExceptsWithRtti - NoTocRestore2 - - - Application - MultiByte - WithExceptsWithRtti - NoTocRestore2 - - - Application - MultiByte - WithExceptsWithRtti - NoTocRestore2 - - - Application - MultiByte - v143 - - - Application - MultiByte - v143 - - - Application - MultiByte - v143 - - - Application - Unicode - v143 - false - - - Application - MultiByte - v143 - true - - - Application - MultiByte - v143 - - - Application - MultiByte - v143 - - - Application - MultiByte - v143 - - - Application - MultiByte - v143 - - - Application - MultiByte - v143 - - - Application - Unicode - v143 - true - - - Application - Unicode - v143 - true - - - Application - MultiByte - true - - - Application - MultiByte - true - - - Application - MultiByte - true - - - Application - MultiByte - true - - - Application - MultiByte - true - WithExceptsWithRtti - NoTocRestore2 - - - Application - MultiByte - WithExceptsWithRtti - NoTocRestore2 - - - Application - MultiByte - true - WithExceptsWithRtti - NoTocRestore2 - - - Application - MultiByte - true - WithExceptsWithRtti - NoTocRestore2 - - - Application - MultiByte - true - WithExceptsWithRtti - - - Application - MultiByte - true - WithExceptsWithRtti - - - Application - MultiByte - true - - - Application - MultiByte - true - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - Unicode - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Application - MultiByte - true - v143 - - - Clang - - - Clang - - - Clang - - - Clang - - - Clang - - - Clang - - - Clang - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)$(ProjectName).xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)$(ProjectName).xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers - false - - - true - $(OutDir)$(ProjectName)_D.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras - false - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers - - - true - $(OutDir)$(ProjectName)_D.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras - - - true - $(OutDir)$(ProjectName)_D.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(MINECRAFT_CONSOLES_DIR)\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - false - false - false - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)Durango\DurangoExtras;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) - $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(Console_SdkLibPath) - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - true - $(ProjectName) - $(Platform)_$(Configuration)\ - $(SolutionDir)$(Platform)_$(Configuration)\ - false - - - - - false - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - false - false - false - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - false - false - false - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)Durango\DurangoExtras;$(ProjectDir)\x64headers;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) - $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(Console_SdkLibPath) - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(ProjectName) - $(Platform)_$(Configuration)\ - $(SolutionDir)$(Platform)_$(Configuration)\ - - - true - $(OutDir)$(ProjectName)_D.xex - $(ProjectDir)Durango\DurangoExtras;$(ProjectDir)\x64headers;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) - $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(Console_SdkLibPath) - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(ProjectName) - $(Platform)_$(Configuration)\ - $(SolutionDir)$(Platform)_$(Configuration)\ - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers - .elf - - - true - $(OutDir)$(ProjectName)_D.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers - .elf - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras - .elf - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers - .self - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras - .self - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - false - false - false - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - false - false - false - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - false - false - false - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - false - false - false - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)Durango\DurangoExtras;$(ProjectDir)\x64headers;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) - $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(Console_SdkLibPath) - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(ProjectName) - $(SolutionDir)$(Platform)_$(Configuration)\ - $(Platform)_$(Configuration)\ - true - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) - $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(Console_SdkLibPath) - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) - $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(Console_SdkLibPath) - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) - $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(Console_SdkLibPath) - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - - - false - $(OutDir)default$(TargetExt) - $(OutDir)default.xex - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) - $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - $(Console_SdkLibPath) - $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) - - - $(ProjectDir)\..\Minecraft.Client\Orbis\Assert;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common - - - $(ProjectDir)\..\Minecraft.Client\Orbis\Assert;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common - - - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common; - - - $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common; - - - $(ProjectDir)\..\Minecraft.Client\Orbis\Assert;$(ProjectDir);$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common - - - $(ProjectDir)\..\Minecraft.Client\Orbis\Assert;$(ProjectDir);$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common - - - $(ProjectDir)\..\Minecraft.Client\Orbis\Assert;$(ProjectDir);$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common - - - false - false - - - - Use - Level3 - ProgramDatabase - Disabled - false - false - false - $(OutDir)$(ProjectName).pch - MultiThreadedDebug - _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;_DEBUG;_XBOX;%(PreprocessorDefinitions) - Disabled - $(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - $(IntDir)/%(RelativeDir)/ - - - true - $(OutDir)$(ProjectName).pdb - xavatar2d.lib;xapilibd.lib;d3d9d.lib;d3dx9d.lib;xgraphicsd.lib;xboxkrnl.lib;xnetd.lib;xaudiod2.lib;xactd3.lib;x3daudiod.lib;xmcored.lib;xbdm.lib;vcompd.lib;xuirund.lib;xuirenderd.lib;xuihtmld.lib;xonline.lib;xhvd2.lib;qnetxaudio2d.lib;xpartyd.lib;..\Minecraft.World\Debug\Minecraft.World.lib;xbox\4JLibs\libs\4J_Input_d.lib;xbox\4JLibs\libs\4J_Storage_d.lib;xbox\4JLibs\libs\4J_Profile_d.lib;xbox\4JLibs\libs\4J_Render_d.lib;xsocialpostd.lib;xrnmd.lib;xbox\Sentient\libs\SenCoreD.lib;xbox\Sentient\libs\SenNewsD.lib;xbox\Sentient\libs\SenUGCD.lib;xbox\Sentient\libs\SenBoxArtD.lib;nuiapid.lib;STd.lib;NuiFitnessApid.lib;NuiHandlesd.lib;NuiSpeechd.lib;xhttpd.lib;xauthd.lib;xgetserviceendpointd.lib;xavd.lib;xjsond.lib;xbox\4JLibs\libs\4J_XTMS_d.lib;%(AdditionalDependencies) - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Common\res;$(RemoteRoot)=XboxMedia\AvatarAwards;$(RemoteRoot)\Tutorial=Common\Tutorial\Tutorial;$(RemoteRoot)=XboxMedia\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=XboxMedia\XZP\TMSFiles.xzp;$(RemoteRoot)\DummyTexturePack=Common\DummyTexturePack - - - - - Use - Level3 - ProgramDatabase - Full - false - false - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;%(PreprocessorDefinitions);PROFILE - Disabled - $(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - true - true - true - $(IntDir)/%(RelativeDir)/ - - - true - $(OutDir)$(ProjectName).pdb - xavatar2.lib;xapilibi.lib;d3d9i.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xparty.lib;xbox\4JLibs\libs\4J_Input_r.lib;xbox\4JLibs\libs\4J_Storage_r.lib;xbox\4JLibs\libs\4J_Profile_r.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\Release\Minecraft.World.lib;xbdm.lib;xsocialpost.lib;xrnm.lib;xbox\Sentient\libs\SenCore.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;xbox\4JLibs\libs\4J_XTMS_r.lib;%(AdditionalDependencies) - xapilib.lib - true - false - UseLinkTimeCodeGeneration - true - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\XZP\Minecraft.xzp,RO - false - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Common\res;$(RemoteRoot)=XboxMedia\AvatarAwards;$(RemoteRoot)\Tutorial=Common\Tutorial\Tutorial;$(RemoteRoot)=XboxMedia\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=XboxMedia\XZP\TMSFiles.xzp;$(RemoteRoot)\DummyTexturePack=Common\DummyTexturePack - - - - - Use - Level3 - ProgramDatabase - Full - false - false - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;%(PreprocessorDefinitions);PROFILE - Disabled - $(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - true - true - true - $(IntDir)/%(RelativeDir)/ - - - true - $(OutDir)$(ProjectName).pdb - xavatar2.lib;xapilibi.lib;d3d9i.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xparty.lib;xbox\4JLibs\libs\4J_Input_r.lib;xbox\4JLibs\libs\4J_Storage_r.lib;xbox\4JLibs\libs\4J_Profile_r.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\Release\Minecraft.World.lib;xbdm.lib;xsocialpost.lib;xrnm.lib;xbox\Sentient\libs\SenCore.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;xtms.lib;%(AdditionalDependencies) - xapilib.lib - true - false - UseLinkTimeCodeGeneration - true - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\XZP\Minecraft.xzp,RO - false - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Common\res;$(RemoteRoot)=XboxMedia\AvatarAwards;$(RemoteRoot)\Tutorial=Common\Tutorial\Tutorial;$(RemoteRoot)=XboxMedia\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=XboxMedia\XZP\TMSFiles.xzp;$(RemoteRoot)\DummyTexturePack=Common\DummyTexturePack - - - - - Use - Level3 - ProgramDatabase - Disabled - false - true - false - $(OutDir)$(ProjectName).pch - MultiThreadedDebug - _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;_DEBUG;%(PreprocessorDefinitions) - Disabled - PS3\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - true - true - GenerateWarnings - Level0 - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - - - true - $(OutDir)$(ProjectName).pdb - $(OutDir)Minecraft.World.a;ps3\4JLibs\libs\4j_Render_d.a;ps3\4JLibs\libs\4j_Input_d.a;ps3\4JLibs\libs\4j_Storage_d.a;ps3\4JLibs\libs\4j_Profile_d.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\mssspurs.o;ps3\Miles\lib\audps3.a;ps3\Miles\lib\BinkAPS3.A;ps3\Miles\lib\spu\mssppu_spurs.a;PS3\Iggy\lib\libiggy_ps3.a;ps3\Edge\lib\libedgezlib_dbg.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;PS3\PS3Extras\HeapInspector\Server\PS3\Debug_RTTI_EH\libHeapInspectorServer.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libnet_stub.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmddbg;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;%(AdditionalDependencies) - StripFuncsAndData - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - - - - - Use - Level3 - ProgramDatabase - Disabled - false - true - false - $(OutDir)$(ProjectName).pch - MultiThreadedDebug - _EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;_DEBUG;__PSVITA__;%(PreprocessorDefinitions) - Disabled - PSVita\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - true - true - GenerateWarnings - Level0 - 1700;613;1011;1786;2623;2624;1628 - -Xpch_override=1 %(AdditionalOptions) - Cpp11 - true - - - true - $(OutDir)$(ProjectName).pdb - -lSceDbg_stub;-lSceGxm_stub;-lSceAppUtil_stub;-lSceCommonDialog_stub;-lSceDisplay_stub;-lSceTouch_stub;-lSceCtrl_stub;-lSceAudio_stub;-lSceDbgFont;-lSceRazorCapture_stub_weak;-lSceSysmodule_stub;-lSceDeflt;-lScePng;$(OutDir)Minecraft.World.a;libSceRtc_stub.a;libSceFios2_stub_weak.a;libSceCes.a;libScePerf_stub.a;libScePerf_stub_weak.a;libSceUlt_stub.a;libSceUlt_stub_weak.a;libSceNpManager_stub_weak.a;libSceNpCommon_stub_weak.a;libSceNpCommerce2_stub.a;libSceHttp_stub.a;libSceNpTrophy_stub.a;libSceNpScore_stub.a;libSceRudp_stub_weak.a;libSceVoice_stub.a;libSceNetAdhocMatching_stub.a;libScePspnetAdhoc_stub.a;libScePower_stub.a;libSceAppUtil_stub.a;libSceAppMgr_stub.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2.a;..\Minecraft.Client\PSVita\Miles\lib\binkapsp2.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2midi.a;..\Minecraft.Client\PSVita\Miles\lib\fltpsp2.a;..\Minecraft.Client\Common\Network\Sony\sceRemoteStorage\psvita\lib\sceRemoteStorage.a - StripFuncsAndData - --strip-duplicates - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - - - xcopy /I /Y "$(SCE_PSP2_SDK_DIR)\target\sce_module" "$(TargetDir)\sce_module\" -if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" - - - - - Use - Level3 - ProgramDatabase - Disabled - false - true - false - $(OutDir)$(ProjectName).pch - MultiThreadedDebug - _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;%(PreprocessorDefinitions) - Disabled - PS3\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - true - true - GenerateWarnings - Levels - Branchless2 - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - $(ProjectDir)\..\Minecraft.Client\PS3\Assert - true - Yes - - - true - $(OutDir)$(ProjectName).pdb - $(OutDir)Minecraft.World.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\mssspurs.o;ps3\Miles\lib\audps3.a;ps3\Miles\lib\BinkAPS3.A;ps3\Miles\lib\spu\mssppu_spurs.a;PS3\Iggy\lib\libiggy_ps3.a;ps3\Edge\lib\libedgezlib.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;PS3\PS3Extras\HeapInspector\Server\PS3\Debug_RTTI_EH\libHeapInspectorServer.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libnet_stub.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmd;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;%(AdditionalDependencies) - StripFuncsAndData - --no-toc-restore --strip-duplicates - None - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - - - - - Use - Level3 - ProgramDatabase - Disabled - false - true - false - $(OutDir)$(ProjectName).pch - MultiThreadedDebug - _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;%(PreprocessorDefinitions) - Disabled - PS3\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - true - true - GenerateWarnings - Levels - Branchless2 - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - $(ProjectDir)\..\Minecraft.Client\PS3\Assert - true - Yes - - - true - $(OutDir)$(ProjectName).pdb - $(OutDir)Minecraft.World.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\mssspurs.o;ps3\Miles\lib\audps3.a;ps3\Miles\lib\BinkAPS3.A;ps3\Miles\lib\spu\mssppu_spurs.a;PS3\Iggy\lib\libiggy_ps3.a;ps3\Edge\lib\libedgezlib.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;PS3\PS3Extras\HeapInspector\Server\PS3\Debug_RTTI_EH\libHeapInspectorServer.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libnet_stub.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmd;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;%(AdditionalDependencies) - StripFuncsAndData - --no-toc-restore --strip-duplicates - None - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - - - - - Use - Level3 - ProgramDatabase - Disabled - false - true - false - $(OutDir)$(ProjectName).pch - MultiThreadedDebug - _EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;__PSVITA__;%(PreprocessorDefinitions) - Disabled - PSVita\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - true - true - GenerateWarnings - Levels - Branchless2 - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - true - Yes - Cpp11 - true - - - true - $(OutDir)$(ProjectName).pdb - -lSceDbg_stub;-lSceGxm_stub;-lSceAppUtil_stub;-lSceCommonDialog_stub;-lSceDisplay_stub;-lSceTouch_stub;-lSceCtrl_stub;-lSceAudio_stub;-lSceDbgFont;-lSceRazorCapture_stub_weak;-lSceSysmodule_stub;-lSceDeflt;-lScePng;$(OutDir)Minecraft.World.a;libSceRtc_stub.a;libSceFios2_stub_weak.a;libSceCes.a;libScePerf_stub.a;libScePerf_stub_weak.a;libSceUlt_stub.a;libSceUlt_stub_weak.a;libSceNpManager_stub_weak.a;libSceNpCommon_stub_weak.a;libSceHttp_stub.a;libSceNpTrophy_stub.a;libSceNpScore_stub.a;libSceRudp_stub_weak.a;libSceVoice_stub.a;libSceNetAdhocMatching_stub.a;libScePspnetAdhoc_stub.a;libScePower_stub.a;libSceAppUtil_stub.a;libSceAppMgr_stub.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2.a;..\Minecraft.Client\PSVita\Miles\lib\binkapsp2.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2midi.a;..\Minecraft.Client\PSVita\Miles\lib\fltpsp2.a;..\Minecraft.Client\Common\Network\Sony\sceRemoteStorage\psvita\lib\sceRemoteStorage.a - StripFuncsAndData - --strip-duplicates - None - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - - - xcopy /I /Y "$(SCE_PSP2_SDK_DIR)\target\sce_module" "$(TargetDir)\sce_module\" -if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" - - - - - Use - Level3 - ProgramDatabase - Disabled - false - true - false - $(OutDir)$(ProjectName).pch - MultiThreadedDebug - _EXTENDED_ACHIEVEMENTS;_CONTENT_PACKAGE;_FINAL_BUILD;__PSVITA__;%(PreprocessorDefinitions) - Disabled - PSVita\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - true - false - GenerateWarnings - Level3 - Branchless2 - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - false - Yes - Cpp11 - true - - - true - $(OutDir)$(ProjectName).pdb - -lSceGxm_stub;-lSceAppUtil_stub;-lSceCommonDialog_stub;-lSceDisplay_stub;-lSceTouch_stub;-lSceCtrl_stub;-lSceAudio_stub;-lSceSysmodule_stub;-lSceDeflt;-lScePng;$(OutDir)Minecraft.World.a;libSceRtc_stub.a;libSceFios2_stub_weak.a;libSceCes.a;libScePerf_stub.a;libScePerf_stub_weak.a;libSceUlt_stub.a;libSceUlt_stub_weak.a;libSceHttp_stub.a;libSceNet_stub.a;libSceSsl_stub.a;libSceNetCtl_stub.a;libSceNpManager_stub.a;libSceNpBasic_stub.a;libSceNpCommon_stub.a;libSceNpUtility_stub.a;libSceNpMatching2_stub.a;libSceNpScore_stub.a;libSceNpToolkit.a;libSceNpToolkitUtils.a;libSceNpTrophy_stub.a;libSceRudp_stub_weak.a;libSceVoice_stub.a;libSceNetAdhocMatching_stub.a;libScePspnetAdhoc_stub.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2.a;..\Minecraft.Client\PSVita\Miles\lib\binkapsp2.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2midi.a;..\Minecraft.Client\PSVita\Miles\lib\fltpsp2.a;libSceAppMgr_stub.a;libSceSysmodule_stub.a;libSceCommonDialog_stub.a;libSceCtrl_stub.a;libSceGxm_stub.a;libSceDisplay_stub.a;libSceSystemGesture_stub.a;libSceTouch_stub.a;libSceFios2_stub.a;libSceAppUtil_stub.a;libSceNearUtil_stub.a;libScePower_stub.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Input.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Profile.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Render.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Storage.a;..\Minecraft.Client\Common\Network\Sony\sceRemoteStorage\psvita\lib\sceRemoteStorage.a - StripFuncsAndData - --strip-duplicates - None - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - - - xcopy /I /Y "$(SCE_PSP2_SDK_DIR)\target\sce_module" "$(TargetDir)\sce_module\" -if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" - - - - - Use - Level3 - ProgramDatabase - Disabled - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreadedDebug - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) - Disabled - Windows64\Iggy\include;$(ProjectDir);$(ProjectDir)..\include;%(AdditionalIncludeDirectories) - true - true - Default - false - /FS %(AdditionalOptions) - stdcpp17 - - - true - $(OutDir)$(ProjectName).pdb - legacy_stdio_definitions.lib;d3d11.lib;d3dcompiler.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;wsock32.lib - NotSet - false - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" - - - Run post-build script - - - powershell -ExecutionPolicy Bypass -File "$(ProjectDir)prebuild.ps1" - - - Run pre-build script - - - - - Use - Level3 - ProgramDatabase - Disabled - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreadedDebug - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) - Disabled - Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - - - true - $(OutDir)$(ProjectName).pdb - d3d11.lib;..\Minecraft.World\ARM64EC_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;wsock32.lib - NotSet - false - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" - - - Run post-build script - - - - - Use - Level3 - ProgramDatabase - Disabled - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreadedDebug - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) - Disabled - Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - - - true - $(OutDir)$(ProjectName).pdb - d3d11.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib - NotSet - false - - - Run postbuild script - powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - Use - Level3 - ProgramDatabase - Disabled - Sync - true - $(OutDir)$(ProjectName).pch - MultiThreadedDebugDLL - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions) - Disabled - Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - EnableFastChecks - false - true - true - $(ForcedInc) - $(SlashAI) - false - false - - - true - $(OutDir)$(ProjectName).pdb - ws2_32.lib;pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_Debug\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib - NotSet - true - Console - true - - - false - false - Default - kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res -xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font -xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media -xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound -xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music -xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\Tutorial $(LayoutDir)Image\Loose\Tutorial -copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ -xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ -xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CU - - - Copying files for deployment - - - Package.appxmanifest - - - call $(ProjectDir)\Build\XboxOne\AppxPrebuild.cmd $(ProjectDir) - - - /VM %(AdditionalOptions) - - - call $(ProjectDir)\DurangoBuild\AppxPrebuild.cmd $(ProjectDir) - $(ProjectDir)\Durango\Autogenerated.appxmanifest - Creating Autogenerated.appxmanifest - $(ProjectDir)\Durango\manifest.xml - true - - - - - Use - TurnOffAllWarnings - ProgramDatabase - MaxSpeed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) - Disabled - Windows64\Iggy\include;$(ProjectDir);$(ProjectDir)..\include\;%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - true - true - true - /FS /Ob3 %(AdditionalOptions) - stdcpp17 - - - true - $(OutDir)$(ProjectName).pdb - legacy_stdio_definitions.lib;d3d11.lib;d3dcompiler.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) - NotSet - false - UseLinkTimeCodeGeneration - - - Run postbuild script - powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - powershell -ExecutionPolicy Bypass -File "$(ProjectDir)prebuild.ps1" - - - Run pre-build script - - - - - Use - Level3 - ProgramDatabase - Full - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) - Disabled - Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - - - true - $(OutDir)$(ProjectName).pdb - legacy_stdio_definitions.lib;d3d11.lib;d3dcompiler.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) - NotSet - false - - - Run postbuild script - powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - Use - Level3 - ProgramDatabase - Full - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) - Disabled - Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - - - true - $(OutDir)$(ProjectName).pdb - d3d11.lib;d3dcompiler.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) - NotSet - false - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - Use - Level3 - ProgramDatabase - Full - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) - Disabled - Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - stdcpp17 - - - true - $(OutDir)$(ProjectName).pdb - d3d11.lib;d3dcompiler.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) - NotSet - false - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - Use - Level3 - ProgramDatabase - Full - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) - Disabled - Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - - - true - $(OutDir)$(ProjectName).pdb - d3d11.lib;d3dcompiler.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) - NotSet - false - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - Use - Level3 - ProgramDatabase - Full - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) - Disabled - Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - - - true - $(OutDir)$(ProjectName).pdb - d3d11.lib;d3dcompiler.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) - NotSet - false - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - Use - Level3 - ProgramDatabase - MaxSpeed - Sync - true - $(OutDir)$(ProjectName).pch - MultiThreadedDLL - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;PROFILE;NDEBUG;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;%(PreprocessorDefinitions) - Disabled - Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - true - true - $(ForcedInc) - false - false - - - true - $(OutDir)$(ProjectName).pdb - ws2_32.lib;pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_Release\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib - NotSet - true - Console - - - true - true - - - kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib - Default - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res -xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font -xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media -xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound -xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music -xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\Tutorial $(LayoutDir)Image\Loose\Tutorial -copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ -xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ -xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CU - - - Copying files for deployment - - - Package.appxmanifest - - - call $(ProjectDir)\Build\XboxOne\AppxPrebuild.cmd $(ProjectDir) - - - - - Use - Level3 - ProgramDatabase - MaxSpeed - Sync - true - $(OutDir)$(ProjectName).pch - MultiThreadedDLL - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;PROFILE;NDEBUG;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;%(PreprocessorDefinitions) - Disabled - Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - true - true - $(ForcedInc) - false - false - - - true - $(OutDir)$(ProjectName).pdb - ws2_32.lib;pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_Release\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib - NotSet - true - Console - - - true - true - - - kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib - Default - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res -xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font -xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media -xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound -xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music -copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ - - - Copying files for deployment - - - Package.appxmanifest - - - - - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - false - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - $(ProjectDir);%(AdditionalIncludeDirectories) - $(IntDir)/%(RelativeDir)/ - - - true - true - true - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;xbox\4JLibs\libs\4J_XTMS_r.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - true - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - false - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - $(ProjectDir);%(AdditionalIncludeDirectories) - - - true - true - true - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;xtms.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - true - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - false - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - $(ProjectDir);%(AdditionalIncludeDirectories) - - - true - true - true - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;xtms.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - true - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - false - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _FINAL_BUILD;_CONTENT_PACKAGE;NDEBUG;_ITERATOR_DEBUG_LEVEL=0;_XBOX;%(PreprocessorDefinitions) - true - true - Disabled - Default - $(ProjectDir);%(AdditionalIncludeDirectories) - $(IntDir)/%(RelativeDir)/ - - - true - true - true - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage_NO_TU\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;xbox\4JLibs\libs\4J_XTMS_r.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - true - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _CONTENT_PACKAGE;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;%(PreprocessorDefinitions) - true - true - Disabled - Default - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - PS3\Iggy\include;%(AdditionalIncludeDirectories) - Levels - true - Branchless2 - Yes - - - true - true - false - $(OutDir)default.pdb - true - $(OutDir)Minecraft.World.a;ps3\4JLibs\libs\4j_Render.a;ps3\4JLibs\libs\4j_Input.a;ps3\4JLibs\libs\4j_Storage.a;ps3\4JLibs\libs\4j_Profile.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\audps3.a;ps3\Miles\lib\spu\mssppu_spurs.a;ps3\Miles\lib\BinkAPS3.A;PS3\Iggy\lib\libiggy_ps3.a;ps3\Miles\lib\mssspurs.o;ps3\Edge\lib\libedgezlib.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libnet_stub.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmd;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;-lsysutil_avconf_ext_stub;%(AdditionalDependencies) - xapilib.lib - false - false - ELFFile - FullMapFile - --no-toc-restore --strip-duplicates --ppuguid %(AdditionalOptions) - StripSymsAndDebug - StripFuncsAndData - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _EXTENDED_ACHIEVEMENTS;_CONTENT_PACKAGE;_FINAL_BUILD;__PSVITA__;%(PreprocessorDefinitions) - true - true - Disabled - Default - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - PSVita\Iggy\include;%(AdditionalIncludeDirectories) - Level3 - false - Branchless2 - Yes - Cpp11 - true - true - - - true - $(OutDir)$(ProjectName).pdb - -lSceGxm_stub;-lSceAppUtil_stub;-lSceCommonDialog_stub;-lSceDisplay_stub;-lSceTouch_stub;-lSceCtrl_stub;-lSceAudio_stub;-lSceSysmodule_stub;-lSceDeflt;-lScePng;$(OutDir)Minecraft.World.a;libSceRtc_stub.a;libSceFios2_stub_weak.a;libSceCes.a;libScePerf_stub.a;libScePerf_stub_weak.a;libSceUlt_stub.a;libSceUlt_stub_weak.a;libSceHttp_stub.a;libSceNet_stub.a;libSceSsl_stub.a;libSceNetCtl_stub.a;libSceNpManager_stub.a;libSceNpBasic_stub.a;libSceNpCommon_stub.a;libSceNpUtility_stub.a;libSceNpMatching2_stub.a;libSceNpScore_stub.a;libSceNpToolkit.a;libSceNpToolkitUtils.a;libSceNpTrophy_stub.a;libSceRudp_stub_weak.a;libSceVoice_stub.a;libSceNetAdhocMatching_stub.a;libScePspnetAdhoc_stub.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2.a;..\Minecraft.Client\PSVita\Miles\lib\binkapsp2.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2midi.a;..\Minecraft.Client\PSVita\Miles\lib\fltpsp2.a;libSceAppMgr_stub.a;libSceSysmodule_stub.a;libSceCommonDialog_stub.a;libSceCtrl_stub.a;libSceGxm_stub.a;libSceDisplay_stub.a;libSceSystemGesture_stub.a;libSceTouch_stub.a;libSceFios2_stub.a;libSceAppUtil_stub.a;libSceNearUtil_stub.a;libScePower_stub.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Input.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Profile.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Render.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Storage.a;..\Minecraft.Client\Common\Network\Sony\sceRemoteStorage\psvita\lib\sceRemoteStorage.a - StripFuncsAndData - --strip-duplicates - None - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - xcopy /I /Y "$(SCE_PSP2_SDK_DIR)\target\sce_module" "$(TargetDir)\sce_module\" -if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _CONTENT_PACKAGE;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;%(PreprocessorDefinitions) - true - true - Disabled - Default - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - PS3\Iggy\include;%(AdditionalIncludeDirectories) - Levels - true - Branchless2 - Yes - - - true - true - false - $(OutDir)default.pdb - true - $(OutDir)Minecraft.World.a;ps3\4JLibs\libs\4j_Render.a;ps3\4JLibs\libs\4j_Input.a;ps3\4JLibs\libs\4j_Storage.a;ps3\4JLibs\libs\4j_Profile.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\audps3.a;ps3\Miles\lib\spu\mssppu_spurs.a;ps3\Miles\lib\BinkAPS3.A;PS3\Iggy\lib\libiggy_ps3.a;ps3\Miles\lib\mssspurs.o;ps3\Edge\lib\libedgezlib.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libnet_stub.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmd;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;-lsysutil_avconf_ext_stub;%(AdditionalDependencies) - xapilib.lib - false - false - ELFFile - FullMapFile - --no-toc-restore --strip-duplicates --ppuguid %(AdditionalOptions) - None - StripFuncsAndData - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _EXTENDED_ACHIEVEMENTS;_CONTENT_PACKAGE;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;__PSVITA__;%(PreprocessorDefinitions) - true - true - Disabled - Default - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - PS3\Iggy\include;%(AdditionalIncludeDirectories) - Levels - true - Branchless2 - Yes - Cpp11 - - - true - true - false - $(OutDir)default.pdb - true - $(OutDir)Minecraft.World.a - xapilib.lib - false - false - ELFFile - FullMapFile - --strip-duplicates - None - StripFuncsAndData - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _RELEASE_FOR_ART;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;%(PreprocessorDefinitions) - true - true - Disabled - Default - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - PS3\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - Level2 - false - Branchless2 - $(ProjectDir)\..\Minecraft.Client\PS3\Assert - - - true - true - false - $(OutDir)default.pdb - true - $(OutDir)Minecraft.World.a;ps3\4JLibs\libs\4j_Render_r.a;ps3\4JLibs\libs\4j_Input_r.a;ps3\4JLibs\libs\4j_Storage_r.a;ps3\4JLibs\libs\4j_Profile_r.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\mssspurs.o;ps3\Miles\lib\audps3.a;ps3\Miles\lib\BinkAPS3.A;ps3\Miles\lib\spu\mssppu_spurs.a;PS3\Iggy\lib\libiggy_ps3.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;PS3\PS3Extras\HeapInspector\Server\PS3\Release_RTTI_EH\libHeapInspectorServer.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libnet_stub.a;libedgezlib_dbg.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmd;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;%(AdditionalDependencies) - xapilib.lib - false - false - FSELFFile - None - - - StripFuncsAndData - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;__PSVITA__;%(PreprocessorDefinitions) - true - true - Disabled - Default - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - PSVita\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - Level3 - true - Branchless2 - Cpp11 - true - - - true - true - false - $(OutDir)default.pdb - true - -lSceDbg_stub;-lSceGxm_stub;-lSceAppUtil_stub;-lSceCommonDialog_stub;-lSceDisplay_stub;-lSceTouch_stub;-lSceCtrl_stub;-lSceAudio_stub;-lSceDbgFont;-lSceRazorCapture_stub_weak;-lSceSysmodule_stub;-lSceDeflt;-lScePng;$(OutDir)Minecraft.World.a;libSceRtc_stub.a;libSceFios2_stub_weak.a;libSceCes.a;libScePerf_stub.a;libScePerf_stub_weak.a;libSceUlt_stub.a;libSceUlt_stub_weak.a;libSceNpManager_stub_weak.a;libSceNpCommon_stub_weak.a;libSceHttp_stub.a;libSceNpTrophy_stub.a;libSceNpScore_stub.a;libSceRudp_stub_weak.a;libSceVoice_stub.a;libSceNetAdhocMatching_stub.a;libScePspnetAdhoc_stub.a;libScePower_stub.a;libSceAppUtil_stub.a;libSceAppMgr_stub.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2.a;..\Minecraft.Client\PSVita\Miles\lib\binkapsp2.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2midi.a;..\Minecraft.Client\PSVita\Miles\lib\fltpsp2.a;..\Minecraft.Client\Common\Network\Sony\sceRemoteStorage\psvita\lib\sceRemoteStorage.a - xapilib.lib - false - false - FSELFFile - None - --strip-duplicates - StripFuncsAndData - StripSymsAndDebug - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - StripFuncsAndData - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _EXTENDED_ACHIEVEMENTS;_TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;__PSVITA__;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - true - true - Disabled - Default - 1700;613;1011 - -Xpch_override=1 %(AdditionalOptions) - Cpp11 - - - true - true - false - $(OutDir)default.pdb - true - $(OutDir)Minecraft.World.a - xapilib.lib - false - false - StripFuncsAndData - --strip-duplicates - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - stdcpp17 - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - true - true - Disabled - Default - stdcpp17 - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - stdcpp17 - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - stdcpp17 - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - - - Level3 - Use - MaxSpeed - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreadedDLL - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_FINAL_BUILD;_CONTENT_PACKAGE;NDEBUG;__WRL_NO_DEFAULT_LIB__;_XM_AVX_INTRINSICS_;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - true - true - Disabled - Default - Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - false - $(ForcedInc) - - - true - true - false - $(OutDir)$(ProjectName).pdb - false - ws2_32.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_ContentPackage\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib - kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib - true - false - Console - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res -xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font -xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media -xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound -xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music -copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ -xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ -xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\Tutorial $(LayoutDir)Image\Loose\Tutorial -xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CU - - - Copying files for deployment - - - Autogenerated.appxmanifest - - - call $(ProjectDir)\Build\XboxOne\AppxPrebuild.cmd $(ProjectDir) - - - _UNICODE;UNICODE;%(PreprocessorDefinitions) - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res - - - Copying files for deployment - - - call $(ProjectDir)\DurangoBuild\AppxPrebuild.cmd $(ProjectDir) - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res -xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font -xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media -xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound -xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music -xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ -xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ -xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU - - - Copying files for deployment - - - call $(ProjectDir)\DurangoBuild\AppxPrebuild.cmd $(ProjectDir) - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res - - - Copying files for deployment - - - call $(ProjectDir)\DurangoBuild\AppxPrebuild.cmd $(ProjectDir) - - - - - Level3 - Use - Full - true - true - ProgramDatabase - Speed - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); - true - true - Disabled - Default - - - true - true - false - $(OutDir)default.pdb - true - xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) - xapilib.lib - false - false - - - $(ProjectDir)xbox\xex.xml - 1480659447 - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech - - - xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res - - - Copying files for deployment - - - - - WarningsOff - true - Use - $(OutDir)$(ProjectName).pch - true - true - Level2 - Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED - - - ..\Minecraft.World\ORBIS_Release\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input_r.a;Orbis\4JLibs\libs\4J_Storage_r.a;Orbis\4JLibs\libs\4J_Profile_r.a;Orbis\Iggy\lib\libiggy_orbis.a;Orbis\Miles\lib\mssorbis.a;Orbis\Miles\lib\binkaorbis.a;Common\Network\Sony\sceRemoteStorage\ps4\lib\sceRemoteStorage.a;-lSceGnmDriver_stub_weak;-lSceGnmx;-lSceGnm;-lSceGpuAddress;-lSceCes;-lSceVideoOut_stub_weak;-lScePad_stub_weak;-lScePngDec_stub_weak;-lScePngEnc_stub_weak;-lSceFios2_stub_weak;-lSceUlt_stub_weak;-lSceShaderBinary;-lSceUserService_stub_weak;-lSceSysmodule_stub_weak;-lSceImeDialog_stub_weak;-lScePosix_stub_weak;-lSceAudioOut_stub_weak;-lSceSaveData_stub_weak;-lSceRtc_stub_weak;-lSceSystemService_stub_weak;-lSceNetCtl_stub_weak;-lSceNpCommon_stub_weak;-lSceNpManager_stub_weak;-lSceNpToolkit_rtti;-lSceNpToolkitUtils_rtti;-lSceNpWebApi_stub_weak;-lSceNpAuth_stub_weak;-lSceNpTrophy_stub_weak;-lSceInvitationDialog_stub_weak;-lSceGameCustomDataDialog_stub_weak;-lSceNpCommerce_stub_weak;-lSceNet_stub_weak;-lSceHttp_stub_weak;-lSceSsl_stub_weak;-lSceNpMatching2_stub_weak;-lSceNpTus_stub_weak;-lSceNpUtility_stub_weak;-lSceNpScore_stub_weak;-lSceCommonDialog_stub_weak;-lSceNpSns_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;-lSceSaveDataDialog_stub_weak;-lSceErrorDialog_stub_weak;-lSceMsgDialog_stub_weak;-lSceGameLiveStreaming_stub_weak;%(AdditionalDependencies) - true - - - false - - - - - WarningsOff - true - Use - $(OutDir)$(ProjectName).pch - true - true - Level2 - Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED - - - ..\Minecraft.World\ORBIS_Release\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input_r.a;Orbis\4JLibs\libs\4J_Storage_r.a;Orbis\4JLibs\libs\4J_Profile_r.a;Orbis\Iggy\lib\libiggy_orbis.a;Orbis\Miles\lib\mssorbis.a;Orbis\Miles\lib\binkaorbis.a;Common\Network\Sony\sceRemoteStorage\ps4\lib\sceRemoteStorage.a;-lSceGnmDriver_stub_weak;-lSceGnmx;-lSceGnm;-lSceGpuAddress;-lSceCes;-lSceVideoOut_stub_weak;-lScePad_stub_weak;-lScePngDec_stub_weak;-lScePngEnc_stub_weak;-lSceFios2_stub_weak;-lSceUlt_stub_weak;-lSceShaderBinary;-lSceUserService_stub_weak;-lSceSysmodule_stub_weak;-lSceImeDialog_stub_weak;-lScePosix_stub_weak;-lSceAudioOut_stub_weak;-lSceSaveData_stub_weak;-lSceRtc_stub_weak;-lSceSystemService_stub_weak;-lSceNetCtl_stub_weak;-lSceNpCommon_stub_weak;-lSceNpManager_stub_weak;-lSceNpToolkit_rtti;-lSceNpToolkitUtils_rtti;-lSceNpWebApi_stub_weak;-lSceNpAuth_stub_weak;-lSceNpTrophy_stub_weak;-lSceInvitationDialog_stub_weak;-lSceGameCustomDataDialog_stub_weak;-lSceNpCommerce_stub_weak;-lSceNet_stub_weak;-lSceHttp_stub_weak;-lSceSsl_stub_weak;-lSceNpMatching2_stub_weak;-lSceNpTus_stub_weak;-lSceNpUtility_stub_weak;-lSceNpScore_stub_weak;-lSceCommonDialog_stub_weak;-lSceNpSns_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;%(AdditionalDependencies) - true - - - false - - - - - Use - $(OutDir)$(ProjectName).pch - true - Level3 - true - true - Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_CONTENT_PACKAGE;_FINAL_BUILD - false - true - - - false - - - ..\ORBIS_ContentPackage\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input.a;Orbis\4JLibs\libs\4J_Storage.a;Orbis\4JLibs\libs\4J_Profile.a;Orbis\Iggy\lib\libiggy_orbis.a;Orbis\Miles\lib\mssorbis.a;Orbis\Miles\lib\binkaorbis.a;Common\Network\Sony\sceRemoteStorage\ps4\lib\sceRemoteStorage.a;-lSceGnmDriver_stub_weak;-lSceGnmx;-lSceGnm;-lSceGpuAddress;-lSceCes;-lSceVideoOut_stub_weak;-lScePad_stub_weak;-lScePngDec_stub_weak;-lScePngEnc_stub_weak;-lSceFios2_stub_weak;-lSceUlt_stub_weak;-lSceShaderBinary;-lSceUserService_stub_weak;-lSceSysmodule_stub_weak;-lSceImeDialog_stub_weak;-lScePosix_stub_weak;-lSceAudioOut_stub_weak;-lSceSaveData_stub_weak;-lSceRtc_stub_weak;-lSceSystemService_stub_weak;-lSceNetCtl_stub_weak;-lSceNpCommon_stub_weak;-lSceNpManager_stub_weak;-lSceNpToolkit_rtti;-lSceNpToolkitUtils_rtti;-lSceNpWebApi_stub_weak;-lSceNpAuth_stub_weak;-lSceNpTrophy_stub_weak;-lSceInvitationDialog_stub_weak;-lSceGameCustomDataDialog_stub_weak;-lSceNpCommerce_stub_weak;-lSceNet_stub_weak;-lSceHttp_stub_weak;-lSceSsl_stub_weak;-lSceNpMatching2_stub_weak;-lSceNpTus_stub_weak;-lSceNpUtility_stub_weak;-lSceNpScore_stub_weak;-lSceCommonDialog_stub_weak;-lSceNpSns_stub_weak;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;-lSceSaveDataDialog_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceErrorDialog_stub_weak;-lSceMsgDialog_stub_weak;-lSceGameLiveStreaming_stub_weak - - - None - - - StripFuncsAndData - - - - - Use - $(OutDir)$(ProjectName).pch - true - Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_CONTENT_PACKAGE;_FINAL_BUILD - Level3 - true - true - false - true - - - false - - - ..\ORBIS_ContentPackage\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input.a;Orbis\4JLibs\libs\4J_Storage.a;Orbis\4JLibs\libs\4J_Profile.a;Orbis\Iggy\lib\libiggy_orbis.a;Orbis\Miles\lib\mssorbis.a;Orbis\Miles\lib\binkaorbis.a;Common\Network\Sony\sceRemoteStorage\ps4\lib\sceRemoteStorage.a;-lSceGnmDriver_stub_weak;-lSceGnmx;-lSceGnm;-lSceGpuAddress;-lSceCes;-lSceVideoOut_stub_weak;-lScePad_stub_weak;-lScePngDec_stub_weak;-lScePngEnc_stub_weak;-lSceFios2_stub_weak;-lSceUlt_stub_weak;-lSceShaderBinary;-lSceUserService_stub_weak;-lSceSysmodule_stub_weak;-lSceImeDialog_stub_weak;-lScePosix_stub_weak;-lSceAudioOut_stub_weak;-lSceSaveData_stub_weak;-lSceRtc_stub_weak;-lSceSystemService_stub_weak;-lSceNetCtl_stub_weak;-lSceNpCommon_stub_weak;-lSceNpManager_stub_weak;-lSceNpToolkit_rtti;-lSceNpToolkitUtils_rtti;-lSceNpWebApi_stub_weak;-lSceNpAuth_stub_weak;-lSceNpTrophy_stub_weak;-lSceInvitationDialog_stub_weak;-lSceGameCustomDataDialog_stub_weak;-lSceNpCommerce_stub_weak;-lSceNet_stub_weak;-lSceHttp_stub_weak;-lSceSsl_stub_weak;-lSceNpMatching2_stub_weak;-lSceNpTus_stub_weak;-lSceNpUtility_stub_weak;-lSceNpScore_stub_weak;-lSceCommonDialog_stub_weak;-lSceNpSns_stub_weak;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;-lSceSaveDataDialog_stub_weak - StripFuncsAndData - - - - - Use - $(OutDir)$(ProjectName).pch - true - Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_ART_BUILD - WarningsOff - Levels - - - false - - - StripSymsAndDebug - - - StripFuncsAndData - ..\Minecraft.World\ORBIS_ReleaseForArt\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input_r.a;Orbis\4JLibs\libs\4J_Storage_r.a;Orbis\4JLibs\libs\4J_Profile_r.a;Orbis\Iggy\lib\libiggy_orbis.a;Orbis\Miles\lib\mssorbis.a;Orbis\Miles\lib\binkaorbis.a;Common\Network\Sony\sceRemoteStorage\ps4\lib\sceRemoteStorage.a;-lSceGnmDriver_stub_weak;-lSceGnmx;-lSceGnm;-lSceGpuAddress;-lSceCes;-lSceVideoOut_stub_weak;-lScePad_stub_weak;-lScePngDec_stub_weak;-lScePngEnc_stub_weak;-lSceFios2_stub_weak;-lSceUlt_stub_weak;-lSceShaderBinary;-lSceUserService_stub_weak;-lSceSysmodule_stub_weak;-lSceImeDialog_stub_weak;-lScePosix_stub_weak;-lSceAudioOut_stub_weak;-lSceSaveData_stub_weak;-lSceRtc_stub_weak;-lSceSystemService_stub_weak;-lSceNetCtl_stub_weak;-lSceNpCommon_stub_weak;-lSceNpManager_stub_weak;-lSceNpToolkit_rtti;-lSceNpToolkitUtils_rtti;-lSceNpWebApi_stub_weak;-lSceNpAuth_stub_weak;-lSceNpTrophy_stub_weak;-lSceInvitationDialog_stub_weak;-lSceGameCustomDataDialog_stub_weak;-lSceNpCommerce_stub_weak;-lSceNet_stub_weak;-lSceHttp_stub_weak;-lSceSsl_stub_weak;-lSceNpMatching2_stub_weak;-lSceNpTus_stub_weak;-lSceNpUtility_stub_weak;-lSceNpScore_stub_weak;-lSceCommonDialog_stub_weak;-lSceNpSns_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;-lSceSaveDataDialog_stub_weak;-lSceErrorDialog_stub_weak;-lSceMsgDialog_stub_weak;-lSceGameLiveStreaming_stub_weak - - - - - Use - $(OutDir)$(ProjectName).pch - true - - - false - - - - - Use - $(OutDir)$(ProjectName).pch - true - true - WarningsOff - true - true - Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_DEBUG;%(PreprocessorDefinitions) - - - ..\Minecraft.World\ORBIS_Debug\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render_d.a;Orbis\4JLibs\libs\4j_Input_d.a;Orbis\4JLibs\libs\4J_Storage_d.a;Orbis\4JLibs\libs\4J_Profile_d.a;Orbis\Iggy\lib\libiggy_orbis.a;Orbis\Miles\lib\mssorbis.a;Orbis\Miles\lib\binkaorbis.a;Common\Network\Sony\sceRemoteStorage\ps4\lib\sceRemoteStorage.a;-lSceGnmDriver_stub_weak;-lSceGnmx;-lSceGnm;-lSceGpuAddress;-lSceCes;-lSceVideoOut_stub_weak;-lScePad_stub_weak;-lScePngDec_stub_weak;-lScePngEnc_stub_weak;-lSceFios2_stub_weak;-lSceUlt_stub_weak;-lSceShaderBinary;-lSceUserService_stub_weak;-lSceSysmodule_stub_weak;-lScePerf_stub_weak;-lSceImeDialog_stub_weak;-lScePosix_stub_weak;-lSceAudioOut_stub_weak;-lSceSaveData_stub_weak;-lSceRtc_stub_weak;-lSceSystemService_stub_weak;-lSceNetCtl_stub_weak;-lSceNpCommon_stub_weak;-lSceNpManager_stub_weak;-lSceNpToolkit_rtti;-lSceNpToolkitUtils_rtti;-lSceNpWebApi_stub_weak;-lSceNpAuth_stub_weak;-lSceNpTrophy_stub_weak;-lSceInvitationDialog_stub_weak;-lSceGameCustomDataDialog_stub_weak;-lSceNpCommerce_stub_weak;-lSceNet_stub_weak;-lSceHttp_stub_weak;-lSceSsl_stub_weak;-lSceNpMatching2_stub_weak;-lSceNpTus_stub_weak;-lSceNpUtility_stub_weak;-lSceNpScore_stub_weak;-lSceCommonDialog_stub_weak;-lSceNpSns_stub_weak;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceRemotePlay_stub_weak;-lSceSaveDataDialog_stub_weak;-lSceErrorDialog_stub_weak;-lSceMsgDialog_stub_weak;-lSceGameLiveStreaming_stub_weak - - - false - - - - - - XML - Designer - - - true - true - true - true - true - - - true - true - true - true - true - - - true - true - true - true - true - - - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - Document - - - - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - true - false - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - Designer - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - false - false - false - false - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - false - false - false - false - false - false - false - false - false - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - false - false - false - false - false - false - - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - - - true - true - true - true - true - - - true - true - true - true - true - - - true - true - true - true - true - - - true - true - true - true - true - - - true - true - true - true - true - - - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - true - true - true - false - true - true - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - - - - - - - false - false - false - false - false - false - false - false - false - false - false - false - - - - - - false - false - false - false - false - false - false - false - false - false - false - false - - - false - false - false - false - false - false - false - false - false - false - false - false - - - false - false - false - false - false - false - false - false - false - false - false - false - - - false - false - false - false - false - false - false - false - false - false - false - false - - - - - - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - false - true - true - true - true - true - true - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - false - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - false - false - false - false - false - false - true - false - true - false - true - false - true - false - false - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - false - false - false - false - false - false - false - false - false - false - false - false - - - - - - false - false - false - false - false - false - false - false - false - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - false - false - true - false - false - false - false - false - false - true - true - false - false - false - false - false - false - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - $(ProjectDir)../include/;%(AdditionalIncludeDirectories) - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - false - false - false - false - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - false - false - false - false - false - false - false - false - false - false - false - false - - - - - - true - true - true - true - true - true - true - false - false - false - false - false - false - true - true - false - false - false - false - false - false - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - false - false - false - false - false - false - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - true - false - false - false - false - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - false - - - NotUsing - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - true - true - true - true - true - true - true - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - true - true - true - true - true - true - true - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - true - true - true - true - true - true - true - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - true - true - true - true - true - true - true - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - NotUsing - false - - - true - true - true - true - true - true - true - false - true - false - true - false - true - false - true - false - true - false - false - true - true - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - false - false - false - NotUsing - false - - - - NotUsing - - - - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - true - true - true - false - true - true - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - Use - true - true - true - true - true - true - - - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - true - true - true - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - - - Disabled - Disabled - Disabled - Disabled - false - false - - - - - - - - - - - false - false - false - false - false - false - false - false - false - false - false - false - - - false - false - false - false - false - false - false - false - false - false - false - false - - - - - - - - - - - false - false - false - false - false - false - false - false - false - false - false - false - - - false - false - false - false - false - false - false - false - false - false - false - false - - - false - false - false - false - false - false - false - false - false - false - false - false - - - false - false - false - false - false - false - false - false - false - false - false - false - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - false - false - false - false - false - false - false - false - false - false - false - false - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - false - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - false - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - false - false - false - false - false - false - true - false - true - false - true - false - true - false - false - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - - - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - Create - false - false - false - false - false - false - false - false - false - false - false - false - Create - Create - Create - Create - Create - Create - Create - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(OutDir)$(ProjectName).pch - $(IntDir)%(Filename)$(ObjectExt) - $(IntDir)%(Filename)$(ObjectExt) - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - NotUsing - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - -Xpch_override=1 - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - false - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - false - false - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - - - true - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - - - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - false - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - true - true - true - true - true - - - - - - - Durango\Network\windows.xbox.networking.realtimesession.winmd - true - - - - - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.filters b/Minecraft.Client/Minecraft.Client.vcxproj.filters deleted file mode 100644 index 23b754fa..00000000 --- a/Minecraft.Client/Minecraft.Client.vcxproj.filters +++ /dev/null @@ -1,6319 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {e23474e2-447c-41a9-82be-e32747f5b196} - - - {d7b60dd5-624a-46b3-b81d-f5f74550f613} - - - {68105641-375c-4565-9945-7890df6d82d9} - - - {8be4617d-3699-46a4-8769-28edb23c89f0} - - - {0b94741f-653f-48c2-874f-6aa69e7e9622} - - - {20606602-63d3-460c-b33e-d3e747a3d8db} - - - {4afb96fe-3fcb-4bd1-89a1-adfea86c73fb} - - - {304b5ee1-bfdb-489f-8e24-0a4e61177ca1} - - - {225f9542-472d-45c1-9046-eb2a46ab029c} - - - {14e20ee1-fe3b-481b-acce-7a634ee9c1d6} - - - {486b537f-d140-4a23-8409-fe3bc4184009} - - - {91ef92f9-432b-4b8f-9f16-4efd211003a1} - - - {66656f96-a5da-48c6-a7f9-79ab343dbd2f} - - - {3423fd63-b0d7-4f50-b0ca-549386c6cf57} - - - {d097d6ee-2ae4-48d8-8b5a-9b48882bdb2c} - - - {1d0a6eec-14cd-4e6d-8a0a-f5f8f0ab5240} - - - {269fab49-d870-4358-baef-32ed6ac9eca7} - - - {fef42379-3d37-4ef3-aa73-b19aaa77e3cc} - - - {bce4041a-9336-45e7-bd40-ed057ed96ee8} - - - {9756cb73-3f40-4fcb-9bab-5a3ce3c4d2f6} - - - {bb820acc-a8eb-4e36-8b4e-9517263ed51b} - - - {3c3aca1d-0e3e-43f1-b4cd-f8dfce2d29e7} - - - {9f1bf1ed-5366-4a29-b3f3-296725a7b01c} - - - {3e905494-b5dc-4084-a1fe-cbd91b9af667} - - - {afb98298-0033-42ec-98a5-93f8d347ee0d} - - - {1953b4f7-41ea-430b-ad2d-e3d7c352b647} - - - {39ab4d1f-8199-4ec7-948e-3d42ad8c8573} - - - {73bbdc5b-04f3-42f8-bf3b-769335e19178} - - - {385338b7-fa77-4c46-a7f2-89c82dc6e192} - - - {0f94b57d-88f8-4a20-b4e4-d1fa95d8f439} - - - {abe2942f-f984-4930-9e2d-9c9c2b35ac74} - - - {a2be9911-8785-4f6a-932e-e03321ee466b} - - - {7cb56f76-52cf-4303-8631-e1471fdc09a0} - - - {098e2985-9c15-450f-baa2-78604e7c1f54} - - - {6c286ad1-f871-408a-be6e-db44e7edcd2c} - - - {7c254dd0-f36f-4001-83cc-1634a2c792c2} - - - {2a26afce-4160-4fb0-8d01-e394a669dae6} - - - {9229f78c-152c-47d5-858a-fd054b856a1c} - - - {81ab078c-fc67-460c-befd-616dbe4bc3bc} - - - {db324829-af2c-428d-9710-8ad20ecc3fd0} - - - {758ac0be-6bd7-42c0-9b09-fdd452c0e134} - - - {c2dcdce8-b00f-4094-b0de-dad838d49525} - - - {8fd2f4e7-b93a-4067-93b8-a7ebac6d4a9c} - - - {93a41380-e12e-4f7a-bb7b-459f7169faed} - - - {4eb1ba28-620f-4136-979c-4dc91c44b666} - - - {5ac21685-36c0-4cd1-8861-e6a0e4a37c62} - - - {1b4710ff-c513-4a11-9d34-ff36fe1b4246} - - - {f4877497-fdf4-48a8-ada4-e6042f632e7a} - - - {45f40847-5b95-4dca-82f2-7616d7a35e54} - - - {1a98ef4c-6c9d-4a22-93d7-89f0fc3320fd} - - - {3be02e3c-c628-4315-a507-a9fe7733af01} - - - {c6dffb6d-2cf6-4c3e-89a3-fb05229b98aa} - - - {7d088a48-eeda-4783-94f7-c0d09b06f347} - - - {a466219c-afde-4184-8b84-91df32e5b892} - - - {40d6ff43-3d13-42ab-99ae-ebc9d585110f} - - - {047a3693-2040-404d-a386-2e5795b231d3} - - - {2509ddc5-330c-45da-a6f9-d37b858acd34} - - - {b2935b29-33d3-4d57-a145-753a646e5de4} - - - {26661545-d0a0-438a-a775-31cec1fb7849} - - - {5f5f5678-57b0-4f7f-b7dc-1ddd01ea2774} - - - {a19d2d41-9a2f-4631-941b-c3bfa7c2fdfd} - - - {bcdb8322-b7e6-482b-a3da-eb3f84dac713} - - - {e2959475-d5c8-4874-a782-fb5266e4441c} - - - {794dfcdb-98c6-4939-b04d-86b9657d4ff6} - - - {775f3088-bc52-43a3-b9ec-7f3f58508240} - - - {ebe1835b-76a8-408d-b3ee-70ffa4db7907} - - - {45bddf1c-e6d6-4a78-9b7d-73d7511e070d} - - - {16186163-4c73-4fa8-85c7-57d2b34e3fe9} - - - {b33b6793-e585-487e-8626-0096242f8e04} - - - {1264d92e-fa06-40ef-846c-4ce2a99e8ccc} - - - {b28c2ec8-a257-41ca-aad2-cf2ced04e4fa} - - - {7369fca1-3096-4b7d-a93e-924587f23108} - - - {e0eabf73-2721-46f9-bc46-4e0292bb53d3} - - - {bf450dfd-c9e8-4120-8a4c-3860b606637e} - - - {4412cd12-307d-407c-8d4a-34df3274c892} - - - {91fbb0f7-3d94-4786-aa07-c9c57a6db9a9} - - - {afb9404f-f23d-46b1-b4d5-4b1096d5bf40} - - - {716a30f7-f9dd-43bf-9228-646dff4c58b1} - - - {3531c304-b08e-48ae-860c-773f6702ec4d} - - - {924f367a-618c-429e-9866-f60821f21d4a} - - - {e3e43b8f-e455-4222-a92e-f6567a41e326} - - - {61ac879d-17b0-402b-b29f-88c60a1161c7} - - - {4f5c7e99-5cbc-4db4-99c4-37db45537198} - - - {33341824-5702-4a56-b75c-9dac57e49349} - - - {4dbeff57-70bc-4b4c-b5d0-4c6834968d85} - - - {4be5c8d2-8944-4e8f-9d79-b1abc4b66f8f} - - - {ba24985e-3b16-45af-963e-9f2edca20b1a} - - - {77957a66-a869-4b9b-bbda-e7f43e01096f} - - - {fa09ab64-0a3f-429b-93cb-149ee490767b} - - - {dec59bc5-d9d3-4be5-b449-3df3b430eb39} - - - {0bcca89e-0d2d-407b-b1e4-878465404901} - - - {395a09e4-1ff9-458c-8fb8-a4cb28aa4881} - - - {056ec81c-c93f-4c56-9bcb-697cda24a612} - - - {d3d4cc74-edfa-4bbb-8e66-7252dbbc131b} - - - {1511a94f-13bc-49e0-bf75-7cdf98f1e77f} - - - {f0b2e12a-e042-49bc-a5fa-78d1cf79e5d3} - - - {d2020762-d261-4c89-bbb9-0c7113012882} - - - {88ebd63d-2bbc-438a-a810-9b26fcfdd908} - - - {2cf98618-28c5-46df-9ff7-3d331ee4a275} - - - {3c643f18-092d-4870-a206-8dc906748a64} - - - {11cc2598-d569-47ad-8843-7a8296878be9} - - - {33371180-d4ec-4439-8a95-059babcc1db9} - - - {c6d264ea-d4ac-4f3f-81f7-0d91fdc27713} - - - {bde45e25-7dce-4a39-a2bf-dad234708b07} - - - {9685dbaa-ed65-453c-ba57-ec01e59022ae} - - - {92ead381-f2b8-4c6d-a3ca-c6fbc7753361} - - - {2031e778-56ff-4126-b09d-4ec59453b21c} - - - {98e39923-fe62-42d5-8650-746c2d61efd2} - - - {094cddb4-1ac5-424b-80e3-e3b0e9bb3b05} - - - {914f66a5-b1a7-4615-9adc-287d28158eee} - - - {36ba326b-c3a1-473e-8cb4-054e34c276a8} - - - {f9dae5df-fabf-41f9-9b13-8d32e5b5baa5} - - - {e634a43c-ee4c-4adc-8847-c667fdc73c5f} - - - {71d6ccac-7a6e-4399-987b-06b606056f59} - - - {05765c7e-26d6-4760-b0f6-7aa9f374d163} - - - {02363026-02fd-4efc-a115-6ae3dc652546} - - - {d71c6707-d6ba-4ab5-a505-a916e007e60d} - - - {eb5eb5f3-0ea7-4658-a8fb-634eb289941d} - - - {46d5754b-1818-4685-a16d-f7415f61868c} - - - {541f67ae-2627-40af-8316-d76ee9bb6985} - - - {ccfdb851-7965-4551-88bb-4312ddbf830a} - - - {2b9abc76-798a-4aae-ba50-2dfc8f78ae81} - - - {35491a01-dd6f-4313-b857-5e3eb323b44f} - - - {bcac2142-c160-4a73-96c5-cbdf681a16f0} - - - {290b2f1c-dcd8-4ebc-9d6d-fa6de190117e} - - - {a7ec80a7-ea10-438c-a10f-7eeef759c32d} - - - {9a2c49f6-2f9d-4e9d-a4ea-a0a04ecba75f} - - - {24e96065-3dd4-4150-bde2-128d133fd2c4} - - - {10961b95-cb43-4a00-b999-04b66a1a0b43} - - - {6aaa8af3-3df6-43f4-9346-9adfe45ca3a7} - - - {aba0f713-fcfb-417e-9616-c8474225de71} - - - {94298ae6-25e0-4cc9-8c5a-efd53e156baa} - - - {6ec99327-b465-4e61-b064-023a09bdf907} - - - {2095b7df-1779-4788-b004-3479d5ab59d8} - - - {4c9eb137-a48c-44a4-be08-ef1745834ece} - - - {2bae7445-385f-4b0e-a3ec-11c1c584f930} - - - {7c655cf2-f74e-4e6a-9114-405f5bc28a56} - - - {a392080f-8e8b-42be-832a-a35869dba580} - - - {42dca5dc-e462-4537-9929-847a044eb116} - - - {0da3a534-f8c9-4d0c-a73f-dfeb402b27c1} - - - {2e1858a4-a24b-49d8-b19c-c24b45f75a4f} - - - {096eb9da-ee6c-46ba-a0f4-dd8d1748b6a1} - - - {50dc7509-93df-4e0a-8a9a-cea040e92180} - - - {67544d93-633f-46a8-9cdf-8ae646a745d1} - - - {08da2d2a-3276-4109-b190-05fbc4709398} - - - {cef89641-7631-4c30-855f-603163446077} - - - {a15076ff-0dbe-4fb5-8b58-4ceb4b189c8f} - - - {a36a05f3-bc99-4097-b7a8-f81c37eec6e3} - - - {c9fd57aa-ede6-46f3-b968-0f4a7c64f7f1} - - - {bcd2eaff-60b9-41f4-8e1a-258639b27f99} - - - {ebc154be-8d55-478b-9038-856d445aaf15} - - - {0749340b-e216-450a-a02e-001917097ba5} - - - {6b6c31a6-0b8d-4dc0-8d6e-38ab6de709ff} - - - {d7537fdd-877b-461c-9c86-3235843fcfc0} - - - {61e77fc3-d018-4e08-985c-9871eca81fe2} - - - {2c983999-feb8-40db-885b-abf061e2ab58} - - - {093a811c-5f90-4c0e-b260-4b637079730a} - - - {c2fdb165-80e4-4ce0-9bf1-12e5c58f83a5} - - - {ad68d69a-99d0-4eea-9bb4-58cb7083a7a1} - - - {a04f2d63-3e47-470f-b4ac-c1d5caf8ce56} - - - {a0aa2098-142e-4688-8d73-00ec7e5e9361} - - - {f7fc551a-1d1a-4584-af3b-2eadb712b0f7} - - - {7155e1ba-d9b6-473b-8c59-77dd883b766f} - - - {017984f1-6659-4a44-96fd-7dbb8f9b2654} - - - {5d6f34a3-c647-479d-a1a9-89a9ffca4ab9} - - - {6f049254-6585-4a90-be74-70d3878d864f} - - - {e4051e75-f566-41ce-b86a-46c838872963} - - - {18d3c9bc-132e-4770-a665-fc030eb86394} - - - {8a2156f5-3462-447b-b04d-e555a917fbf2} - - - {e0cb4d67-dd35-43ab-88cc-63173cc31125} - - - {090821e7-2a93-44de-bf5e-d5dbbcb41621} - - - {11f70fef-83b4-4fb9-85ab-51109fbb6a56} - - - {7b594635-988d-40aa-8a00-0d60b1f49a5a} - - - {e7df083d-5b13-46bc-a5b9-610c3ffb33bc} - - - {2ef42e03-cbaa-4077-a7f4-008150037f01} - - - {4d1da71a-dd84-4073-be6d-1e534eca98f3} - - - {acb27adb-45a3-45cf-85f5-3ae00cf3357d} - - - {3a9d8989-ff64-411c-84ad-b7dfb2520d5a} - - - {de5f0642-c9ab-431b-a255-a936076ffed2} - - - {76ac5981-4824-487a-992f-273bfa73fb68} - - - {b1794e73-9397-4e45-8a0d-a4f6dc72c321} - - - {ff6b8d80-d0ed-4225-b56c-1d0a19824e2f} - - - {4d0806f8-ae38-4bac-8469-0a82fc61eecd} - - - {67f51112-db23-4c8a-af1b-f748f7bbce8f} - - - {a47c9da7-bf36-42ae-aedf-c00c071c0582} - - - {017967fb-353e-448b-ae2c-639a182f3ee0} - - - {f4d6c5f9-40d6-4e52-bc03-fef06e9f0221} - - - {122ac1f3-113d-4f91-8676-bbe16e236f4f} - - - {1d28fadf-f748-4616-830b-ec2faa1b5f8e} - - - {bf865c6c-8bf4-4bd6-aaed-ff2a7c92706a} - - - {3eefa342-44e2-493a-9165-40f85bcef557} - - - {f88c0f6a-8051-41e7-9bf6-b9d3c7bb2937} - - - {a6b9803b-8dc2-4552-856e-470f78757533} - - - {21ba77e3-ca31-4dbb-b85d-48ddf892e1da} - - - {06443c48-8447-447b-895f-da725cc13c0c} - - - {ba60dadb-f607-49b7-ab07-0da3a6e06138} - - - {abc41045-2c80-41e8-a8e5-80383e3331b7} - - - {6e66e638-15af-47a6-83de-93bb0cb8ae3d} - - - {b2a3a14e-806c-4ebf-9413-0bbca21b6699} - - - {57a41953-69e1-408c-94ca-5a0fc35bee3d} - - - {afe55d4b-8cbd-4fc0-b4b5-e823d35ac9f6} - - - {ff3c3e8d-02aa-446f-912b-876aad8bb71a} - - - {5ce05bd9-a7f6-47cf-81c3-8c95d3627c5c} - - - {f90e55f2-d904-4421-8284-db37fe80c549} - - - {4c8bf8d5-d6d9-4b6b-96dd-00d64f476027} - - - {90c63e2f-0b47-4aca-a1df-26c436af7c69} - - - {ad3528e0-0c39-42d5-b756-fdf691df5f17} - - - {262a14ae-51b7-4d11-be00-2bf7840dc67d} - - - {40ad6aa5-e972-4aaf-bbb0-c783e72fb341} - - - {d705167f-d99e-49b5-a667-24c0c2fe7bcc} - - - {d52b4de1-b2d7-4c80-afb4-7c6edae1efcb} - - - {61ac299e-6446-4df9-b5cc-9b2c0890b47c} - - - {147837b5-da79-4938-abcf-f8926a72b25c} - - - {34edb787-189e-49c7-8412-f5def16b6f99} - - - {1f029554-0246-45da-8bfd-8d4bc8d4cffc} - - - {15633337-4260-4618-bffa-df945dba2b1a} - - - {81d283e0-15b7-4dcf-a85d-961169a993cd} - - - {dea799c3-4584-461c-a788-9766f61cea56} - - - {619bbb82-dfbc-499e-b078-048ad7e26222} - - - {f5065760-0ad8-4fb3-b6a9-f3ba06be0e51} - - - {360a336e-01e3-4a34-8608-efd2c7c72ef7} - - - {1d9e76bb-7f51-487f-b0b4-de3419fd1925} - - - {177ed754-f97c-4e53-9e75-1f548ae2a0b4} - - - {4b317e13-b7e6-4468-8a2e-bfbbe3bb272b} - - - {acc4e8ae-a1f1-4f2b-9bf2-e12b74fa3a1a} - - - {893769f2-22f7-4c41-ad2b-cb8668fb3b66} - - - {c1441371-f323-4549-90a0-53c6f743b4b1} - - - {b043e348-607a-4ac2-95de-f573db5dd04f} - - - {af98fe8e-ce25-437a-8ab9-efa9d8f0a5b0} - - - {9a61fbe5-f9a2-4c83-b407-5a295808664e} - - - {f55d07b2-80f2-4a01-8fb8-0b09545bf916} - - - {829b148f-b0d9-4a70-87ea-22f57281ac1f} - - - {08832b8f-5370-4c06-95ab-b5b285eb5fc5} - - - {918450ce-de83-4daf-8f25-7aaa8afcb856} - - - {5d807c82-39b9-4651-ab8a-14244deff851} - - - {9dee27ed-5aaf-4fad-b219-faebcebbe450} - - - {22d0b2d5-3279-4144-a23c-8eafb9d90e63} - - - {0061db22-43de-4b54-a161-c43958cdcd7e} - - - {889a84db-3009-4a7c-8234-4bf93d412690} - - - {e5d7fb24-25b8-413c-84ec-974bf0d4a3d1} - - - {d8cdea16-28f5-4993-baf8-26a129e50c84} - - - {70b1f1aa-fe50-4aab-9a6c-14df8cb1f231} - - - - - - Xbox\GameConfig - - - Xbox\GameConfig - - - Xbox\res\audio - - - Xbox\res\audio - - - Xbox\res\audio - - - Xbox\4JLibs\Media - - - Xbox\res - - - Xbox\res - - - Xbox\xexxml - - - Xbox\xexxml - - - Xbox\Source Files\Sentient\Telemetry - - - Xbox\Source Files\Sentient\DynamicConf - - - - Windows64\GameConfig - - - Windows64\GameConfig - - - Durango - - - Durango - - - Durango - - - - Orbis\4JLibs\libs - - - Orbis\4JLibs\libs - - - Orbis\4JLibs\libs - - - Orbis\4JLibs\libs - - - Orbis\Miles Sound System\lib - - - PS3\Miles Sound System\lib - - - PS3\Miles Sound System\lib - - - PS3\Miles Sound System\lib - - - PS3\Miles Sound System\lib\spu - - - PS3\Miles Sound System\lib\spu - - - PS3\Miles Sound System\lib\spu - - - PS3\Miles Sound System\lib\spu - - - PS3\Miles Sound System\lib\spu - - - PS3\Miles Sound System\lib\spu - - - PS3\Miles Sound System\lib\spu - - - PS3\Miles Sound System\lib\spu - - - Windows64\Iggy\gdraw - - - Windows64\Iggy\gdraw - - - Windows64\Iggy\gdraw - - - Windows64\Iggy\gdraw - - - Durango\Iggy\gdraw - - - Durango\Iggy\gdraw - - - Durango\Iggy\gdraw - - - PS3\Iggy\gdraw - - - PS3\Iggy\gdraw - - - Windows64\Iggy\gdraw - - - Orbis\Iggy\gdraw - - - Orbis\Iggy\gdraw - - - Common\Source Files\Network - - - PSVita\GameConfig - - - PSVita\GameConfig - - - Orbis\4JLibs\libs - - - PSVita\Iggy\gdraw - - - PSVita\Iggy\gdraw - - - - - Header Files - - - net\minecraft\client\renderer\culling - - - net\minecraft\client\renderer\culling - - - net\minecraft\client\renderer\culling - - - net\minecraft\client\renderer\culling - - - Header Files - - - net\minecraft\client\renderer\culling - - - net\minecraft\client\renderer\culling - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\player - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer - - - net\minecraft\client\skins - - - net\minecraft\client\skins - - - net\minecraft\client\skins - - - net\minecraft\client\skins - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client - - - net\minecraft\client\player - - - net\minecraft\stats - - - net\minecraft\stats - - - net\minecraft\client\player - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client\level - - - net\minecraft\client - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui\particle - - - net\minecraft\client\gui\particle - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\title - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\achievement - - - net\minecraft\client\gui\achievement - - - net\minecraft\client\gui\achievement - - - Xbox\4JLibs\inc - - - Xbox\4JLibs\inc - - - Xbox\4JLibs\inc - - - Xbox\4JLibs\inc - - - Xbox\GameConfig - - - Xbox\Source Files - - - net\minecraft\server\network - - - net\minecraft\server\network - - - net\minecraft\server\level - - - net\minecraft\server\level - - - net\minecraft\server\level - - - net\minecraft\server\level - - - net\minecraft\server\level - - - net\minecraft\server\level - - - net\minecraft\server\level - - - net\minecraft\server - - - net\minecraft\server - - - net\minecraft\server - - - net\minecraft\server - - - net\minecraft\server - - - net\minecraft\server\level - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens\Help & Options - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Controls - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Credits - - - Xbox\Source Files\XUI\Menu screens\Help & Options\How To Play - - - Xbox\Source Files\XUI\Menu screens\Help & Options\How To Play - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens\Tutorial - - - Xbox\Source Files\XUI\Menu screens\Leaderboards - - - Xbox\Source Files\XUI\Menu screens\Pause - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Menu screens\Social - - - Header Files - - - Header Files - - - Header Files - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\XML - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\SentientLibs\inc - - - Xbox\Source Files\Sentient\Telemetry - - - Xbox\Source Files\Sentient\Telemetry - - - Xbox\Source Files\Sentient\Telemetry - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\Sentient\DynamicConf - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\Font - - - Xbox\Source Files\Font - - - Xbox\Source Files\Font - - - Xbox\Source Files\XUI\Menu screens\Debug - - - net\minecraft\server\network - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI\Controls - - - net\minecraft\client\renderer\tileentity - - - Xbox\Source Files\Sentient - - - Xbox\Source Files\Sentient\Telemetry - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\XML - - - net\minecraft\server\level - - - net\minecraft\server\network - - - net\minecraft\client - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\multiplayer - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\tileentity - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - net\minecraft\client - - - Xbox\Source Files\XUI\Menu screens - - - net\minecraft\server - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\model\geom - - - net\minecraft\client\model\geom - - - net\minecraft\client\model\dragon - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\model\geom - - - net\minecraft\client\particle - - - net\minecraft\client\model\geom - - - net\minecraft\client\model\dragon - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model\geom - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model\geom - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Header Files - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\Social - - - Header Files - - - Windows - - - Windows - - - Durango\4JLibs\inc - - - Durango\4JLibs\inc - - - Durango\4JLibs\inc - - - Durango\4JLibs\inc - - - Common\Source Files\Trial - - - Common\Source Files\Tutorial\Constraints - - - Common\Source Files\Tutorial\Constraints - - - Common\Source Files\Tutorial\Constraints - - - Common\Source Files\Tutorial\Constraints - - - Common\Source Files\Tutorial\Constraints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\GameRules\LevelGeneration\StructureActions - - - Common\Source Files\GameRules\LevelGeneration\StructureActions - - - Common\Source Files\GameRules\LevelGeneration\StructureActions - - - Common\Source Files\GameRules\LevelGeneration\StructureActions - - - Common\Source Files\GameRules\LevelGeneration - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\Tutorial - - - Common\Source Files\Tutorial - - - Common\Source Files\Tutorial - - - Common\Source Files\Tutorial - - - Common\Source Files\Tutorial - - - Common\Source Files\Tutorial - - - Durango\Source Files - - - Common\Source Files\Tutorial\Hints - - - Durango\Source Files\Sentient - - - Durango\Source Files\Sentient - - - Durango\Source Files\Sentient - - - Durango\Source Files\Sentient - - - Durango\Source Files\Sentient - - - Durango\XML - - - Durango\Source Files\Sentient - - - Durango\Source Files\Social - - - Durango - - - Common - - - Common - - - PS3\4JLibs\inc - - - PS3\4JLibs\inc - - - PS3\4JLibs\inc - - - PS3\4JLibs\inc - - - PS3\Source Files\Social - - - PS3\Source Files\Sentient - - - PS3\Source Files\Sentient - - - PS3\Source Files\Sentient - - - PS3\Source Files\Sentient - - - PS3\Source Files\Sentient - - - PS3\Source Files\Sentient - - - PS3\Source Files - - - PS3\PS3Extras - - - PS3\PS3Extras - - - Durango - - - Common\Source Files - - - Common\Source Files - - - Common\Source Files - - - Common\Source Files\GameRules\LevelGeneration - - - Common\Source Files\GameRules\LevelGeneration - - - Common\Source Files\GameRules - - - Common\Source Files\GameRules - - - PS3 - - - Xbox\Source Files\XUI - - - Xbox\Source Files\XUI - - - Xbox\Source Files\XUI - - - Xbox\Source Files\XUI\Base Scene - - - Xbox\Source Files\XUI\Base Scene - - - Xbox\Source Files\XUI\Base Scene - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - net\minecraft\client\skins - - - net\minecraft\client\particle - - - net\minecraft\client\skins - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture\custom - - - net\minecraft\client\renderer\texture\custom - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI - - - PS3\PS3Extras - - - PS3\PS3Extras - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\skins - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Header Files - - - Windows64\4JLibs\inc - - - Windows64\4JLibs\inc - - - Windows64\4JLibs\inc - - - Windows64\4JLibs\inc - - - Windows64\GameConfig - - - Windows64\XML - - - Windows64\Source Files - - - Windows64\Source Files\Social - - - Windows64\Source Files\Sentient - - - Windows64\Source Files\Sentient - - - Windows64\Source Files\Sentient - - - Windows64\Source Files\Sentient - - - Windows64\Source Files\Sentient - - - Windows64\Source Files\Sentient - - - Windows64 - - - Windows64\Source Files - - - Windows64 - - - Durango\Source Files - - - Orbis\OrbisExtras - - - Orbis\4JLibs\inc - - - Orbis\4JLibs\inc - - - Orbis\4JLibs\inc - - - Orbis\4JLibs\inc - - - Orbis\OrbisExtras - - - Orbis\OrbisExtras - - - Xbox\Source Files\XUI\Base Scene - - - Header Files - - - Common\Source Files\DLC - - - Orbis - - - Orbis\OrbisExtras - - - Orbis\Source Files\Sentient - - - Orbis\Source Files\Sentient - - - Orbis\Source Files\Sentient - - - Orbis\Source Files\Sentient - - - Orbis\Source Files\Sentient - - - Orbis\Source Files\Sentient - - - Orbis\Source Files\Social - - - Orbis\XML - - - Orbis\Source Files - - - Orbis\OrbisExtras - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - Common - - - Common - - - Common - - - Common - - - net\minecraft\client\model - - - net\minecraft\client\renderer\entity - - - Windows64\Miles Sound System\Include - - - Windows64\Miles Sound System\Include - - - Orbis\Miles Sound System\include - - - Orbis\Miles Sound System\include - - - Durango\Miles Sound System\include - - - Durango\Miles Sound System\include - - - PS3\Miles Sound System\include - - - PS3\Miles Sound System\include - - - Common\Source Files\Audio - - - Xbox\Source Files\Audio - - - Common\Source Files\Audio - - - PS3\PS3Extras - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\CompressedTile_SPU - - - Common\Source Files\Localisation - - - Common\Source Files\DLC - - - Common\Source Files\GameRules\LevelGeneration - - - Common\Source Files\GameRules\LevelGeneration - - - Common\Source Files\GameRules\LevelGeneration - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\Rules - - - Common\Source Files\GameRules\LevelRules - - - Common\Source Files\DLC - - - PS3 - - - Common\Source Files\GameRules\LevelRules\Rules - - - Common\Source Files\GameRules - - - Common\Source Files\GameRules - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\UI - - - Windows64\Iggy\include - - - Windows64\Iggy\include - - - Windows64\Iggy\include - - - Windows64\Iggy\include - - - Windows64\Iggy\include - - - Windows64\Iggy\gdraw - - - Windows64 - - - Common\Source Files\UI - - - Common\Source Files\UI - - - Common\Source Files\UI - - - Common\Source Files\UI - - - Common\Source Files\GameRules\LevelGeneration - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\model - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Common\Source Files\DLC - - - Common\Source Files\Colours - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Durango\DurangoExtras - - - Durango\Iggy\include - - - Durango\Iggy\include - - - Durango\Iggy\include - - - Durango\Iggy\include - - - Durango\Iggy\include - - - Durango\Iggy\gdraw - - - Durango - - - PS3 - - - PS3\Iggy\gdraw - - - PS3\Iggy\include - - - PS3\Iggy\include - - - PS3\Iggy\include - - - PS3\Iggy\include - - - PS3\Iggy\include - - - PS3\Iggy\include - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Orbis\Iggy\gdraw - - - Orbis\Iggy\include - - - Orbis\Iggy\include - - - Orbis\Iggy\include - - - Orbis\Iggy\include - - - Orbis\Iggy\include - - - Orbis\Iggy\include - - - Common\Source Files\Network - - - Common\Source Files\UI - - - Common\Source Files\UI - - - Common\Source Files\UI\Scenes\Debug - - - Xbox\Source Files - - - Common\Source Files\Network - - - Common\Source Files\Network - - - PS3\PS3Extras - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - PS3\PS3Extras - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\Network - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Scenes\Debug - - - Common\Source Files\UI\Components - - - Xbox\Source Files\Network - - - Common\Source Files\Network - - - Xbox\Source Files\Network - - - Orbis - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Scenes - - - Common\Source Files\BuildVer - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - PS3 - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Scenes - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Scenes - - - Common\Source Files\UI\Controls - - - PS3\Source Files\Network - - - PS3\Source Files\Leaderboards - - - Common\Source Files\Leaderboards - - - Xbox\Source Files\Leaderboards - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Controls - - - Windows64\Source Files\Leaderboards - - - Orbis\Source Files\Leaderboards - - - Durango\Source Files\Leaderboards - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - PS3\PS3Extras - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - PS3\PS3Extras - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Components - - - PS3\4JLibs - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - PS3\Source Files - - - Common\Source Files\UI\Controls - - - Xbox\Source Files\XUI\Menu screens - - - net\minecraft\client\renderer\tileentity - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Durango\Source Files\Achievements - - - Common\Source Files\UI\Scenes\Debug - - - Xbox\Source Files\XUI\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\All Platforms - - - Xbox\Source Files\XUI\Containers - - - net\minecraft\client\model - - - net\minecraft\client\renderer\entity - - - Orbis - - - Orbis\Source Files - - - Orbis\Network - - - net\minecraft\server\commands - - - net\minecraft\server\commands - - - Durango\Network - - - Durango\Network - - - Durango\Network - - - Common\Source Files\Network\Sony - - - Common\Source Files\Network\Sony - - - Orbis\Network - - - PS3\Source Files\Network - - - Common\Source Files\Network\Sony - - - Common\Source Files\Network\Sony - - - Orbis\Network - - - Common\Source Files\Network\Sony - - - Common\Source Files\Network\Sony - - - PS3\Source Files\Network - - - PS3\Source Files\Network - - - Orbis\Network - - - Common\Source Files\GameRules\LevelGeneration - - - Durango\Network - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Xbox\Source Files\XUI\Menu screens - - - Durango\Network - - - PSVita\4JLibs\inc - - - PSVita\4JLibs\inc - - - PSVita\4JLibs\inc - - - PSVita\4JLibs\inc - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita - - - PSVita\Source Files\Sentient - - - PSVita\Source Files\Sentient - - - PSVita\Source Files\Sentient - - - PSVita\Source Files\Sentient - - - PSVita\Source Files\Sentient - - - PSVita\Source Files\Sentient - - - PSVita\Source Files\Social - - - PSVita\XML - - - PSVita - - - PSVita\GameConfig - - - Orbis\Network - - - Common\Source Files\UI\Scenes\Debug - - - Durango\Source Files - - - Durango\Network - - - Durango\Source Files\Leaderboards - - - Common\Source Files\Telemetry - - - Durango\Source Files\Sentient - - - Durango\ServiceConfig - - - Common\Source Files\UI - - - Common\Source Files\Network\Sony - - - Orbis\Network - - - PS3\Source Files\Network - - - Common\Source Files\UI\Components - - - Durango\Network - - - Durango\XML - - - PSVita\Iggy\gdraw - - - PSVita\Iggy\include - - - PSVita\Iggy\include - - - PSVita\Iggy\include - - - PSVita\Iggy\include - - - PSVita\Iggy\include - - - PSVita\Iggy\include - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - Common\Source Files\UI\Controls - - - PSVita\Source Files\Network - - - PSVita\Source Files\Network - - - PSVita\Source Files\Network - - - PSVita\Source Files\Leaderboards - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - PSVita\Miles Sound System\Include - - - PSVita\Miles Sound System\Include - - - Durango\Source Files\Leaderboards - - - PSVita\Source Files\Network - - - PSVita\Source Files\Network - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - Xbox\4JLibs\inc - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - PSVita\Source Files\Network - - - PSVita\Source Files\Network - - - Orbis\Network - - - Xbox\Source Files\Network - - - Common\Source Files\UI\Scenes - - - Common\Source Files\Leaderboards - - - Common\Source Files\Leaderboards - - - net\minecraft\server - - - net\minecraft\server - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\particle - - - net\minecraft\client\resources - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - net\minecraft\client\model - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Controls - - - Common\Source Files\UI\All Platforms - - - Xbox\Source Files\XUI\Containers - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI - - - Common\Source Files\UI\Controls - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\Leaderboards - - - Windows64\Source Files\Network - - - Common\Source Files\Audio - - - Common\Source Files\Audio - - - Header Files - - - - - Source Files - - - net\minecraft\client\renderer\culling - - - net\minecraft\client\renderer\culling - - - net\minecraft\client\renderer\culling - - - net\minecraft\client\renderer\culling - - - net\minecraft\client\renderer\culling - - - Source Files - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer - - - net\minecraft\client\skins - - - net\minecraft\client\skins - - - net\minecraft\client\skins - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client - - - net\minecraft\client\player - - - net\minecraft\client\player - - - net\minecraft\stats - - - net\minecraft\stats - - - net\minecraft\client\player - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client - - - net\minecraft\client\level - - - net\minecraft\client - - - net\minecraft\client\gui - - - net\minecraft\client - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui\particle - - - net\minecraft\client\gui\particle - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\title - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\inventory - - - net\minecraft\client\gui\achievement - - - net\minecraft\client\gui\achievement - - - net\minecraft\client\gui\achievement - - - Source Files - - - Source Files - - - Xbox\Source Files - - - Xbox\Source Files - - - net\minecraft\server\network - - - net\minecraft\server\network - - - net\minecraft\server\network - - - net\minecraft\server - - - net\minecraft\server - - - net\minecraft\server\level - - - net\minecraft\server\level - - - net\minecraft\server\level - - - net\minecraft\server\level - - - net\minecraft\server - - - net\minecraft\server\level - - - net\minecraft\server - - - net\minecraft\server\level - - - net\minecraft\server\level - - - net\minecraft\server\level - - - Xbox\Source Files\XUI\Menu screens - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - net\minecraft\client\multiplayer - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens\Help & Options - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Controls - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Credits - - - Xbox\Source Files\XUI\Menu screens\Help & Options\How To Play - - - Xbox\Source Files\XUI\Menu screens\Help & Options\How To Play - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens\Tutorial - - - Xbox\Source Files\XUI\Menu screens\Leaderboards - - - Xbox\Source Files\XUI\Menu screens\Pause - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Menu screens\Social - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\XML - - - Xbox\Source Files\Sentient\Telemetry - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\Sentient\DynamicConf - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\Font - - - Xbox\Source Files\Font - - - Xbox\Source Files\Font - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Xbox\Source Files\Sentient - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI\Controls - - - net\minecraft\client\renderer\tileentity - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - net\minecraft\server\level - - - net\minecraft\client - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\tileentity - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\XUI\Menu screens - - - net\minecraft\client - - - Xbox\Source Files\XUI\Menu screens - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - net\minecraft\client\model\geom - - - net\minecraft\client\model\geom - - - net\minecraft\client\model\geom - - - net\minecraft\client\model\dragon - - - net\minecraft\client\model\geom - - - net\minecraft\client\model\dragon - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model\geom - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Menu screens - - - Xbox\Source Files\Social - - - Source Files - - - Common\Source Files\Trial - - - Common\Source Files\Tutorial\Constraints - - - Common\Source Files\Tutorial\Constraints - - - Common\Source Files\Tutorial\Constraints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Hints - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\GameRules\LevelGeneration\StructureActions - - - Common\Source Files\GameRules\LevelGeneration\StructureActions - - - Common\Source Files\GameRules\LevelGeneration\StructureActions - - - Common\Source Files\GameRules\LevelGeneration\StructureActions - - - Common\Source Files\GameRules\LevelGeneration - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\Tutorial - - - Common\Source Files\Tutorial - - - Common\Source Files\Tutorial - - - Common\Source Files\Tutorial - - - Common\Source Files\Tutorial - - - Common\Source Files\Tutorial\Hints - - - PS3\Source Files - - - PS3\PS3Extras - - - Durango - - - Durango\Source Files - - - Common\Source Files - - - Common\Source Files - - - Common\Source Files\GameRules\LevelGeneration - - - PS3 - - - Xbox\Source Files\XUI - - - Xbox\Source Files\XUI - - - Xbox\Source Files\XUI\Base Scene - - - Xbox\Source Files\XUI\Base Scene - - - Xbox\Source Files\XUI\Base Scene - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Controls - - - net\minecraft\client\skins - - - net\minecraft\client\particle - - - net\minecraft\client\skins - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture\custom - - - net\minecraft\client\renderer\texture\custom - - - Xbox\Source Files\XUI\Menu screens\Help & Options\Settings - - - PS3\PS3Extras - - - Xbox\Source Files\XUI\Menu screens - - - net\minecraft\client\skins - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\skins - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Windows64\Source Files - - - Windows64\Source Files - - - Windows64\Source Files - - - Windows64 - - - Durango\Source Files - - - Orbis\OrbisExtras - - - Xbox\Source Files\XUI\Base Scene - - - Common\Source Files\DLC - - - Orbis\OrbisExtras - - - Orbis - - - Orbis\Source Files - - - net\minecraft\client\particle - - - net\minecraft\client\particle - - - Common - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\model - - - Xbox\Source Files\Audio - - - Common\Source Files\Audio - - - Common\Source Files\Audio - - - PS3\PS3Extras - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\ChunkRebuild_SPU - - - PS3\CompressedTile_SPU - - - Common\Source Files\Localisation - - - Common\Source Files\DLC - - - Common\Source Files\GameRules\LevelGeneration - - - Common\Source Files\GameRules\LevelGeneration - - - Common\Source Files\GameRules\LevelGeneration - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\Rules - - - Common\Source Files\GameRules\LevelRules - - - Common\Source Files\DLC - - - PS3 - - - Common\Source Files\GameRules - - - Common\Source Files\GameRules - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\GameRules\LevelRules\RuleDefinitions - - - Common\Source Files\UI - - - Windows64\Iggy\gdraw - - - Windows64 - - - Common\Source Files\UI - - - Common\Source Files\UI - - - Common\Source Files\UI - - - Common\Source Files\GameRules\LevelGeneration - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\model - - - Xbox\Source Files\XUI\Menu screens\Debug - - - Common\Source Files\DLC - - - Common\Source Files\Colours - - - Common\Source Files\DLC - - - Common\Source Files\DLC - - - Durango\DurangoExtras - - - Durango\Iggy\gdraw - - - Durango - - - PS3 - - - PS3\Iggy\gdraw - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - Common\Source Files\zlib - - - PS3\Source Files\Audio - - - Common\Source Files\UI - - - Common\Source Files\UI - - - Orbis\Iggy\gdraw - - - Common\Source Files\UI\Scenes\Debug - - - Xbox\Source Files - - - Common\Source Files\Network - - - PS3\PS3Extras - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Scenes\Debug - - - Common\Source Files\UI\Components - - - Xbox\Source Files\Network - - - Common\Source Files\Network - - - Xbox\Source Files\Network - - - Orbis - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Scenes - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Scenes - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Scenes - - - Common\Source Files\UI\Controls - - - PS3\Source Files\Network - - - PS3\Source Files\Leaderboards - - - Common\Source Files\Leaderboards - - - Xbox\Source Files\Leaderboards - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Controls - - - Windows64\Source Files\Leaderboards - - - Orbis\Source Files\Leaderboards - - - Durango\Source Files\Leaderboards - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - PS3\PS3Extras - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - PS3\PS3Extras - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI\Components - - - PS3\4JLibs - - - Common\Source Files\UI\Components - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\Audio - - - PS3\Source Files - - - Common\Source Files\UI\Controls - - - Xbox\Source Files\XUI\Menu screens - - - net\minecraft\client\renderer\tileentity - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Durango\Source Files\Achievements - - - Common\Source Files\UI\Scenes\Debug - - - Xbox\Source Files\XUI\Containers - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Xbox\Source Files\XUI\Containers - - - net\minecraft\client\model - - - net\minecraft\client\renderer\entity - - - Orbis - - - Orbis\Network - - - net\minecraft\server\commands - - - net\minecraft\server\commands - - - Durango\Network - - - Durango\Network - - - Durango\Network - - - Common\Source Files\Network\Sony - - - Common\Source Files\Network\Sony - - - Common\Source Files\Network\Sony - - - PS3\Source Files\Network - - - Orbis\Network - - - Orbis\Network - - - Common\Source Files\Network\Sony - - - PS3\Source Files\Network - - - PS3\Source Files\Network - - - Orbis\Network - - - Common\Source Files\GameRules\LevelGeneration - - - Durango\Network - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - Xbox\Source Files\XUI\Menu screens - - - Durango\Network - - - PSVita - - - PSVita - - - PSVita\Source Files - - - PSVita\PSVitaExtras - - - Orbis\Network - - - Common\Source Files\Network\Sony - - - Common\Source Files\UI\Scenes\Debug - - - Durango\Network - - - Durango\Source Files\Leaderboards - - - Common\Source Files\Telemetry - - - Durango\Source Files\Sentient - - - Common\Source Files\UI - - - Orbis\Network - - - PS3\Source Files\Network - - - Common\Source Files\Network\Sony - - - Orbis - - - Orbis - - - Orbis - - - Common\Source Files\UI\Components - - - Durango\Network - - - Durango\Network - - - Durango\Network - - - Durango\Network - - - Durango\Network - - - Durango\XML - - - PSVita\Iggy\gdraw - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - Common\Source Files\UI\Controls - - - PSVita\Source Files\Network - - - PSVita\Source Files\Network - - - PSVita\Source Files\Network - - - PSVita\Source Files\Leaderboards - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Durango\Source Files\Leaderboards - - - PSVita\Source Files\Network - - - PSVita\Source Files\Network - - - PSVita\PSVitaExtras - - - PSVita\PSVitaExtras - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\In-Game Menu Screens - - - PSVita\Source Files\Network - - - PSVita\Source Files\Network - - - Orbis\Network - - - Common\Source Files\UI\Scenes - - - Common\Source Files\Leaderboards - - - Common\Source Files\Leaderboards - - - Common\Source Files\UI\Scenes\Help & Options - - - Common\Source Files\UI - - - net\minecraft\server - - - net\minecraft\server - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\model - - - net\minecraft\client\particle - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\entity - - - net\minecraft\client\renderer\tileentity - - - net\minecraft\client\renderer\texture - - - net\minecraft\client\renderer - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\All Platforms - - - net\minecraft\client\model - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Controls - - - Xbox\Source Files\XUI\Containers - - - Xbox\Source Files\XUI\Controls - - - Common\Source Files\UI\All Platforms - - - Xbox\Source Files\XUI\Containers - - - Common\Source Files\UI\Controls - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers - - - Common\Source Files\UI\All Platforms - - - Common\Source Files\UI\Controls - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\Tutorial\Tasks - - - Common\Source Files\UI\Scenes\Frontend Menu screens - - - Common\Source Files\Leaderboards - - - Source Files - - - Windows64\Source Files\Network - - - include\lce_filesystem - - - - - Xbox\4JLibs\libs - - - Xbox\4JLibs\libs - - - Durango\4JLibs\libs - - - Xbox\4JLibs\libs - - - Xbox\4JLibs\libs - - - Xbox\4JLibs\libs - - - Xbox\4JLibs\libs - - - Xbox\4JLibs\libs - - - Xbox\4JLibs\libs - - - Xbox\4JLibs\libs - - - Xbox\4JLibs\libs - - - Xbox\4JLibs\libs - - - Durango\4JLibs\libs - - - Durango\4JLibs\libs - - - Durango\4JLibs\libs - - - Windows64\4JLibs\libs - - - Windows64\4JLibs\libs - - - Windows64\4JLibs\libs - - - Windows64\4JLibs\libs - - - Windows64\Iggy\lib - - - Windows64\Iggy\lib - - - Windows64\Iggy\lib - - - Durango\Iggy\lib - - - Durango\Iggy\lib - - - Durango\Iggy\lib - - - Durango\Iggy\lib - - - PS3\Iggy\lib - - - PS3\Iggy\lib - - - PS3\Iggy\lib - - - Orbis\Iggy\lib - - - Orbis\Iggy\lib - - - PS3\4JLibs\libs - - - PS3\4JLibs\libs - - - PS3\4JLibs\libs - - - PS3\4JLibs\libs - - - PS3\4JLibs\libs - - - PS3\4JLibs\libs - - - PS3\4JLibs\libs - - - PS3\4JLibs\libs - - - Durango\Miles Sound System\lib - - - Durango\Miles Sound System\lib - - - PS3\4JLibs\libs - - - PS3\4JLibs\libs - - - PS3\4JLibs\libs - - - PS3\4JLibs\libs - - - Orbis\4JLibs\libs - - - Orbis\4JLibs\libs - - - Orbis\4JLibs\libs - - - Durango\4JLibs\libs - - - Durango\4JLibs\libs - - - Durango\4JLibs\libs - - - Windows64\4JLibs\libs - - - Windows64\4JLibs\libs - - - Durango\4JLibs\libs - - - Durango\4JLibs\libs - - - Orbis\4JLibs\libs - - - Orbis\4JLibs\libs - - - Orbis\4JLibs\libs - - - Durango\4JLibs\libs - - - Durango\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\4JLibs\libs - - - PSVita\Iggy\Lib - - - PSVita\Iggy\Lib - - - Xbox\4JLibs\libs - - - Xbox\4JLibs\libs - - - - - - Xbox\SentientLibs - - - - - Windows - - - Windows - - - Durango - - - - - Windows - - - - - PS3\SPUObjFiles\Release - - - PS3\SPUObjFiles\Release - - - PS3\SPUObjFiles\Release - - - PS3\SPUObjFiles\Release - - - PS3\SPUObjFiles\Release - - - PS3\SPUObjFiles\Release - - - PS3\SPUObjFiles\Release - - - PS3\SPUObjFiles\Release - - - PS3\SPUObjFiles\Release - - - PS3\SPUObjFiles\Debug - - - PS3\SPUObjFiles\Debug - - - PS3\SPUObjFiles\Debug - - - PS3\SPUObjFiles\Debug - - - PS3\SPUObjFiles\Debug - - - PS3\SPUObjFiles\Debug - - - PS3\SPUObjFiles\Debug - - - PS3\SPUObjFiles\Debug - - - PS3\SPUObjFiles\Debug - - - PS3\SPUObjFiles\ContentPackage - - - PS3\SPUObjFiles\ContentPackage - - - PS3\SPUObjFiles\ContentPackage - - - PS3\SPUObjFiles\ContentPackage - - - PS3\SPUObjFiles\ContentPackage - - - PS3\SPUObjFiles\ContentPackage - - - PS3\SPUObjFiles\ContentPackage - - - PS3\SPUObjFiles\ContentPackage - - - PS3\SPUObjFiles\ContentPackage - - - PS3\SPUObjFiles\Release - - - PS3\SPUObjFiles\Debug - - - PS3\SPUObjFiles\ContentPackage - - - - - - - - Source Files - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.vspscc b/Minecraft.Client/Minecraft.Client.vcxproj.vspscc deleted file mode 100644 index 78a55451..00000000 --- a/Minecraft.Client/Minecraft.Client.vcxproj.vspscc +++ /dev/null @@ -1,11 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "1" -"EXCLUDED_FILE0" = "Durango\\Autogenerated.appxmanifest" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/Minecraft.cpp b/Minecraft.Client/Minecraft.cpp index aa8fa1fa..1ba432fd 100644 --- a/Minecraft.Client/Minecraft.cpp +++ b/Minecraft.Client/Minecraft.cpp @@ -1629,7 +1629,7 @@ void Minecraft::run_middle() s_prevXButtons[i] = xCurButtons; } bool startJustPressed = s_startPressLatch[i] > 0; - bool tryJoin = !pause && !ui.IsIgnorePlayerJoinMenuDisplayed(ProfileManager.GetPrimaryPad()) && g_NetworkManager.SessionHasSpace() && xCurButtons != 0; + bool tryJoin = !pause && !ui.IsIgnorePlayerJoinMenuDisplayed(ProfileManager.GetPrimaryPad()) && g_NetworkManager.SessionHasSpace() && xCurButtons != 0 && g_KBMInput.IsWindowFocused(); #else bool tryJoin = !pause && !ui.IsIgnorePlayerJoinMenuDisplayed(ProfileManager.GetPrimaryPad()) && g_NetworkManager.SessionHasSpace() && RenderManager.IsHiDef() && InputManager.ButtonPressed(i); #endif @@ -3706,7 +3706,9 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) app.EnableDebugOverlay(options->renderDebug,iPad); #else // 4J Stu - The xbox uses a completely different way of navigating to this scene - ui.NavigateToScene(0, eUIScene_DebugOverlay, nullptr, eUILayer_Debug); + // Always open in the fullscreen group so the overlay spans the full window + // regardless of split-screen viewport configuration. + ui.NavigateToScene(0, eUIScene_DebugOverlay, nullptr, eUILayer_Debug, eUIGroup_Fullscreen); #endif #endif } @@ -3744,7 +3746,10 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_INVENTORY)) { shared_ptr player = Minecraft::GetInstance()->player; - ui.PlayUISFX(eSFX_Press); + if (!player->isRiding()) + { + ui.PlayUISFX(eSFX_Press); + } if(gameMode->isServerControlledInventory()) { diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/MinecraftServer.cpp index bdcc9f81..1e3ed74e 100644 --- a/Minecraft.Client/MinecraftServer.cpp +++ b/Minecraft.Client/MinecraftServer.cpp @@ -569,6 +569,7 @@ MinecraftServer::MinecraftServer() playerIdleTimeout = 0; m_postUpdateThread = nullptr; forceGameType = false; + m_spawnProtectionRadius = 0; commandDispatcher = new ServerCommandDispatcher(); InitializeCriticalSection(&m_consoleInputCS); @@ -615,6 +616,10 @@ bool MinecraftServer::initServer(int64_t seed, NetworkGameInitData *initData, DW logger.info("Loading properties"); #endif settings = new Settings(new File(L"server.properties")); + // Dedicated-only: spawn-protection radius in blocks; 0 disables protection. + m_spawnProtectionRadius = GetDedicatedServerInt(settings, L"spawn-protection", 0); + if (m_spawnProtectionRadius < 0) m_spawnProtectionRadius = 0; + if (m_spawnProtectionRadius > 256) m_spawnProtectionRadius = 256; app.SetGameHostOption(eGameHostOption_Difficulty, GetDedicatedServerInt(settings, L"difficulty", app.GetGameHostOption(eGameHostOption_Difficulty))); app.SetGameHostOption(eGameHostOption_GameType, GetDedicatedServerInt(settings, L"gamemode", app.GetGameHostOption(eGameHostOption_GameType))); @@ -631,6 +636,7 @@ bool MinecraftServer::initServer(int64_t seed, NetworkGameInitData *initData, DW app.DebugPrintf("ServerSettings: pvp is %s\n",(app.GetGameHostOption(eGameHostOption_PvP)>0)?"on":"off"); app.DebugPrintf("ServerSettings: fire spreads is %s\n",(app.GetGameHostOption(eGameHostOption_FireSpreads)>0)?"on":"off"); app.DebugPrintf("ServerSettings: tnt explodes is %s\n",(app.GetGameHostOption(eGameHostOption_TNT)>0)?"on":"off"); + app.DebugPrintf("ServerSettings: spawn protection radius is %d\n", m_spawnProtectionRadius); app.DebugPrintf("\n"); // TODO 4J Stu - Init a load of settings based on data passed as params @@ -651,7 +657,7 @@ bool MinecraftServer::initServer(int64_t seed, NetworkGameInitData *initData, DW setFlightAllowed(GetDedicatedServerBool(settings, L"allow-flight", true)); // 4J Stu - Enabling flight to stop it kicking us when we use it -#ifdef _DEBUG_MENUS_ENABLED +#if (defined _DEBUG_MENUS_ENABLED && defined _DEBUG) setFlightAllowed(true); #endif @@ -937,7 +943,11 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring storage = shared_ptr(new McRegionLevelStorage(newFormatSave, File(L"."), name, true)); #else - storage = std::make_shared(new ConsoleSaveFileOriginal(L""), File(L"."), name, true); + ConsoleSaveFileOriginal* pSave = new ConsoleSaveFileOriginal(L""); + + pSave->ConvertToLocalPlatform(); + storage = std::make_shared(pSave, File(L"."), name, true); + #endif } @@ -1657,7 +1667,9 @@ Level *MinecraftServer::getCommandSenderWorld() int MinecraftServer::getSpawnProtectionRadius() { - return 16; + // Client-host mode must never apply dedicated-server spawn protection settings. + if (!ShouldUseDedicatedServerProperties()) return 0; + return m_spawnProtectionRadius; } bool MinecraftServer::isUnderSpawnProtection(Level *level, int x, int y, int z, shared_ptr player) @@ -1703,330 +1715,345 @@ void MinecraftServer::setPlayerIdleTimeout(int playerIdleTimeout) extern int c0a, c0b, c1a, c1b, c1c, c2a, c2b; void MinecraftServer::run(int64_t seed, void *lpParameter) { - NetworkGameInitData *initData = nullptr; - DWORD initSettings = 0; - bool findSeed = false; + NetworkGameInitData *initData = nullptr; + DWORD initSettings = 0; + bool findSeed = false; if(lpParameter != nullptr) - { - initData = static_cast(lpParameter); - initSettings = app.GetGameHostOption(eGameHostOption_All); - findSeed = initData->findSeed; - m_texturePackId = initData->texturePackId; - } - // try { // 4J - removed try/catch/finally - bool didInit = false; + { + initData = static_cast(lpParameter); + initSettings = app.GetGameHostOption(eGameHostOption_All); + findSeed = initData->findSeed; + m_texturePackId = initData->texturePackId; + } + // try { // 4J - removed try/catch/finally + bool didInit = false; if (initServer(seed, initData, initSettings,findSeed)) - { - didInit = true; - ServerLevel *levelNormalDimension = levels[0]; - // 4J-PB - Set the Stronghold position in the leveldata if there isn't one in there - Minecraft *pMinecraft = Minecraft::GetInstance(); + { + didInit = true; + ServerLevel *levelNormalDimension = levels[0]; + // 4J-PB - Set the Stronghold position in the leveldata if there isn't one in there + Minecraft *pMinecraft = Minecraft::GetInstance(); LevelData *pLevelData=levelNormalDimension->getLevelData(); if(pLevelData && pLevelData->getHasStronghold()==false) - { + { int x,z; if(app.GetTerrainFeaturePosition(eTerrainFeature_Stronghold,&x,&z)) - { - pLevelData->setXStronghold(x); - pLevelData->setZStronghold(z); - pLevelData->setHasStronghold(); - } - } + { + pLevelData->setXStronghold(x); + pLevelData->setZStronghold(z); + pLevelData->setHasStronghold(); + } + } - int64_t lastTime = getCurrentTimeMillis(); - int64_t unprocessedTime = 0; - while (running && !s_bServerHalted) - { - int64_t now = getCurrentTimeMillis(); + int64_t lastTime = getCurrentTimeMillis(); + int64_t unprocessedTime = 0; + while (running && !s_bServerHalted) + { + int64_t now = getCurrentTimeMillis(); - // 4J Stu - When we pause the server, we don't want to count that as time passed - // 4J Stu - TU-1 hotifx - Remove this line. We want to make sure that we tick connections at the proper rate when paused + // 4J Stu - When we pause the server, we don't want to count that as time passed + // 4J Stu - TU-1 hotifx - Remove this line. We want to make sure that we tick connections at the proper rate when paused //Fix for #13191 - The host of a game can get a message informing them that the connection to the server has been lost //if(m_isServerPaused) lastTime = now; - int64_t passedTime = now - lastTime; - if (passedTime > MS_PER_TICK * 40) - { - // logger.warning("Can't keep up! Did the system time change, or is the server overloaded?"); - passedTime = MS_PER_TICK * 40; - } - if (passedTime < 0) - { - // logger.warning("Time ran backwards! Did the system time change?"); - passedTime = 0; - } - unprocessedTime += passedTime; - lastTime = now; + int64_t passedTime = now - lastTime; + if (passedTime > MS_PER_TICK * 40) + { + // logger.warning("Can't keep up! Did the system time change, or is the server overloaded?"); + passedTime = MS_PER_TICK * 40; + } + if (passedTime < 0) + { + // logger.warning("Time ran backwards! Did the system time change?"); + passedTime = 0; + } + unprocessedTime += passedTime; + lastTime = now; - // 4J Added ability to pause the server + // 4J Added ability to pause the server if( !m_isServerPaused ) - { - bool didTick = false; - if (levels[0]->allPlayersAreSleeping()) - { - tick(); - unprocessedTime = 0; - } - else - { - // int tickcount = 0; - // int64_t beforeall = System::currentTimeMillis(); - while (unprocessedTime > MS_PER_TICK) - { - unprocessedTime -= MS_PER_TICK; - chunkPacketManagement_PreTick(); -// int64_t before = System::currentTimeMillis(); - tick(); -// int64_t after = System::currentTimeMillis(); -// PIXReportCounter(L"Server time",(float)(after-before)); + { + bool didTick = false; + if (levels[0]->allPlayersAreSleeping()) + { + tick(); + unprocessedTime = 0; + } + else + { + // int tickcount = 0; + // int64_t beforeall = System::currentTimeMillis(); + while (unprocessedTime > MS_PER_TICK) + { + unprocessedTime -= MS_PER_TICK; + chunkPacketManagement_PreTick(); + // int64_t before = System::currentTimeMillis(); + tick(); + // int64_t after = System::currentTimeMillis(); + // PIXReportCounter(L"Server time",(float)(after-before)); - chunkPacketManagement_PostTick(); - } -// int64_t afterall = System::currentTimeMillis(); -// PIXReportCounter(L"Server time all",(float)(afterall-beforeall)); -// PIXReportCounter(L"Server ticks",(float)tickcount); - } - } - else - { - // 4J Stu - TU1-hotfix + chunkPacketManagement_PostTick(); + } + // int64_t afterall = System::currentTimeMillis(); + // PIXReportCounter(L"Server time all",(float)(afterall-beforeall)); + // PIXReportCounter(L"Server ticks",(float)tickcount); + } + } + else + { + // 4J Stu - TU1-hotfix //Fix for #13191 - The host of a game can get a message informing them that the connection to the server has been lost - // The connections should tick at the same frequency even when paused - while (unprocessedTime > MS_PER_TICK) - { - unprocessedTime -= MS_PER_TICK; - // Keep ticking the connections to stop them timing out - connection->tick(); - } - } + // The connections should tick at the same frequency even when paused + while (unprocessedTime > MS_PER_TICK) + { + unprocessedTime -= MS_PER_TICK; + // Keep ticking the connections to stop them timing out + connection->tick(); + } + } if(MinecraftServer::setTimeAtEndOfTick) - { - MinecraftServer::setTimeAtEndOfTick = false; - for (unsigned int i = 0; i < levels.length; i++) - { - // if (i == 0 || settings->getBoolean(L"allow-nether", true)) // 4J removed - we always have nether - { - ServerLevel *level = levels[i]; + { + MinecraftServer::setTimeAtEndOfTick = false; + for (unsigned int i = 0; i < levels.length; i++) + { + // if (i == 0 || settings->getBoolean(L"allow-nether", true)) // 4J removed - we always have nether + { + ServerLevel *level = levels[i]; level->setGameTime( MinecraftServer::setTime ); - } - } - } + } + } + } if(MinecraftServer::setTimeOfDayAtEndOfTick) - { - MinecraftServer::setTimeOfDayAtEndOfTick = false; - for (unsigned int i = 0; i < levels.length; i++) - { - if (i == 0 || GetDedicatedServerBool(settings, L"allow-nether", true)) - { - ServerLevel *level = levels[i]; + { + MinecraftServer::setTimeOfDayAtEndOfTick = false; + for (unsigned int i = 0; i < levels.length; i++) + { + if (i == 0 || GetDedicatedServerBool(settings, L"allow-nether", true)) + { + ServerLevel *level = levels[i]; level->setDayTime( MinecraftServer::setTimeOfDay ); - } - } - } + } + } + } - // Process delayed actions - eXuiServerAction eAction; - LPVOID param; + // Process delayed actions + eXuiServerAction eAction; + LPVOID param; for(int i=0;isaveAll(nullptr); - } - - for (unsigned int j = 0; j < levels.length; j++) - { - if( s_bServerHalted ) break; - // 4J Stu - Save the levels in reverse order so we don't overwrite the level.dat - // with the data from the nethers leveldata. - // Fix for #7418 - Functional: Gameplay: Saving after sleeping in a bed will place player at nighttime when restarting. - ServerLevel *level = levels[levels.length - 1 - j]; - PIXBeginNamedEvent(0, "Saving level %d",levels.length - 1 - j); - level->save(false, nullptr, true); - PIXEndNamedEvent(); - } - if( !s_bServerHalted ) - { - PIXBeginNamedEvent(0,"Saving game rules"); - saveGameRules(); - PIXEndNamedEvent(); - - PIXBeginNamedEvent(0,"Save to disc"); - levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, true); - PIXEndNamedEvent(); - } - PIXEndNamedEvent(); - - QueryPerformanceCounter( &qwNewTime ); - qwDeltaTime.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart; - fElapsedTime = fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart)); - app.DebugPrintf("Autosave: Elapsed time %f\n", fElapsedTime); - } - break; + // Save the start time + QueryPerformanceCounter(&qwTime); #endif - case eXuiServerAction_SaveGame: - app.EnterSaveNotificationSection(); - if (players != nullptr) - { - players->saveAll(Minecraft::GetInstance()->progressRenderer); - } - players->broadcastAll(std::make_shared(20)); + if (players != nullptr) + { + players->saveAll(nullptr); + } - for (unsigned int j = 0; j < levels.length; j++) - { + for (unsigned int j = 0; j < levels.length; j++) + { + if( s_bServerHalted ) break; + // 4J Stu - Save the levels in reverse order so we don't overwrite the level.dat + // with the data from the nethers leveldata. + // Fix for #7418 - Functional: Gameplay: Saving after sleeping in a bed will place player at nighttime when restarting. + ServerLevel *level = levels[levels.length - 1 - j]; +#if defined(_XBOX_ONE) || defined(__ORBIS__) + PIXBeginNamedEvent(0, "Saving level %d", levels.length - 1 - j); +#endif + level->save(false, nullptr, true); +#if defined(_XBOX_ONE) || defined(__ORBIS__) + PIXEndNamedEvent(); +#endif + } + if (!s_bServerHalted) + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + PIXBeginNamedEvent(0, "Saving game rules"); +#endif + saveGameRules(); +#if defined(_XBOX_ONE) || defined(__ORBIS__) + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0, "Save to disc"); +#endif + levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, true); +#if defined(_XBOX_ONE) || defined(__ORBIS__) + PIXEndNamedEvent(); +#endif + } + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + PIXEndNamedEvent(); + + QueryPerformanceCounter(&qwNewTime); + qwDeltaTime.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart; + fElapsedTime = fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart)); + app.DebugPrintf("Autosave: Elapsed time %f\n", fElapsedTime); +#endif + } + break; +#endif + case eXuiServerAction_SaveGame: + app.EnterSaveNotificationSection(); + if (players != nullptr) + { + players->saveAll(Minecraft::GetInstance()->progressRenderer); + } + + players->broadcastAll(std::make_shared(20)); + + for (unsigned int j = 0; j < levels.length; j++) + { if( s_bServerHalted ) break; - // 4J Stu - Save the levels in reverse order so we don't overwrite the level.dat - // with the data from the nethers leveldata. - // Fix for #7418 - Functional: Gameplay: Saving after sleeping in a bed will place player at nighttime when restarting. - ServerLevel *level = levels[levels.length - 1 - j]; + // 4J Stu - Save the levels in reverse order so we don't overwrite the level.dat + // with the data from the nethers leveldata. + // Fix for #7418 - Functional: Gameplay: Saving after sleeping in a bed will place player at nighttime when restarting. + ServerLevel *level = levels[levels.length - 1 - j]; level->save(true, Minecraft::GetInstance()->progressRenderer, (eAction==eXuiServerAction_AutoSaveGame)); - players->broadcastAll(std::make_shared(33 + (j * 33))); - } + players->broadcastAll(std::make_shared(33 + (j * 33))); + } if( !s_bServerHalted ) - { - saveGameRules(); + { + saveGameRules(); levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, (eAction==eXuiServerAction_AutoSaveGame)); - } - app.LeaveSaveNotificationSection(); - break; - case eXuiServerAction_DropItem: - // Find the player, and drop the id at their feet - { - shared_ptr player = players->players.at(0); + } + app.LeaveSaveNotificationSection(); + break; + case eXuiServerAction_DropItem: + // Find the player, and drop the id at their feet + { + shared_ptr player = players->players.at(0); size_t id = (size_t) param; - player->drop(std::make_shared(id, 1, 0)); - } - break; - case eXuiServerAction_SpawnMob: - { - shared_ptr player = players->players.at(0); - eINSTANCEOF factory = static_cast((size_t)param); + player->drop(std::make_shared(id, 1, 0)); + } + break; + case eXuiServerAction_SpawnMob: + { + shared_ptr player = players->players.at(0); + eINSTANCEOF factory = static_cast((size_t)param); shared_ptr mob = dynamic_pointer_cast(EntityIO::newByEnumType(factory,player->level )); mob->moveTo(player->x+1, player->y, player->z+1, player->level->random->nextFloat() * 360, 0); mob->setDespawnProtected(); // 4J added, default to being protected against despawning (has to be done after initial position is set) - player->level->addEntity(mob); - } - break; - case eXuiServerAction_PauseServer: + player->level->addEntity(mob); + } + break; + case eXuiServerAction_PauseServer: m_isServerPaused = ( (size_t) param == TRUE ); if( m_isServerPaused ) - { - m_serverPausedEvent->Set(); - } - break; - case eXuiServerAction_ToggleRain: - { - bool isRaining = levels[0]->getLevelData()->isRaining(); - levels[0]->getLevelData()->setRaining(!isRaining); - levels[0]->getLevelData()->setRainTime(levels[0]->random->nextInt(Level::TICKS_PER_DAY * 7) + Level::TICKS_PER_DAY / 2); - } - break; - case eXuiServerAction_ToggleThunder: - { - bool isThundering = levels[0]->getLevelData()->isThundering(); - levels[0]->getLevelData()->setThundering(!isThundering); - levels[0]->getLevelData()->setThunderTime(levels[0]->random->nextInt(Level::TICKS_PER_DAY * 7) + Level::TICKS_PER_DAY / 2); - } - break; - case eXuiServerAction_ServerSettingChanged_Gamertags: - players->broadcastAll(std::make_shared(ServerSettingsChangedPacket::HOST_OPTIONS, app.GetGameHostOption(eGameHostOption_Gamertags))); - break; - case eXuiServerAction_ServerSettingChanged_BedrockFog: - players->broadcastAll(std::make_shared(ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, app.GetGameHostOption(eGameHostOption_All))); - break; + { + m_serverPausedEvent->Set(); + } + break; + case eXuiServerAction_ToggleRain: + { + bool isRaining = levels[0]->getLevelData()->isRaining(); + levels[0]->getLevelData()->setRaining(!isRaining); + levels[0]->getLevelData()->setRainTime(levels[0]->random->nextInt(Level::TICKS_PER_DAY * 7) + Level::TICKS_PER_DAY / 2); + } + break; + case eXuiServerAction_ToggleThunder: + { + bool isThundering = levels[0]->getLevelData()->isThundering(); + levels[0]->getLevelData()->setThundering(!isThundering); + levels[0]->getLevelData()->setThunderTime(levels[0]->random->nextInt(Level::TICKS_PER_DAY * 7) + Level::TICKS_PER_DAY / 2); + } + break; + case eXuiServerAction_ServerSettingChanged_Gamertags: + players->broadcastAll(std::make_shared(ServerSettingsChangedPacket::HOST_OPTIONS, app.GetGameHostOption(eGameHostOption_Gamertags))); + break; + case eXuiServerAction_ServerSettingChanged_BedrockFog: + players->broadcastAll(std::make_shared(ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, app.GetGameHostOption(eGameHostOption_All))); + break; - case eXuiServerAction_ServerSettingChanged_Difficulty: - players->broadcastAll(std::make_shared(ServerSettingsChangedPacket::HOST_DIFFICULTY, Minecraft::GetInstance()->options->difficulty)); - break; - case eXuiServerAction_ExportSchematic: + case eXuiServerAction_ServerSettingChanged_Difficulty: + players->broadcastAll(std::make_shared(ServerSettingsChangedPacket::HOST_DIFFICULTY, Minecraft::GetInstance()->options->difficulty)); + break; + case eXuiServerAction_ExportSchematic: #ifndef _CONTENT_PACKAGE - app.EnterSaveNotificationSection(); + app.EnterSaveNotificationSection(); //players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); if( !s_bServerHalted ) - { - ConsoleSchematicFile::XboxSchematicInitParam *initData = static_cast(param); + { + ConsoleSchematicFile::XboxSchematicInitParam *initData = static_cast(param); #ifdef _XBOX - File targetFileDir(File::pathRoot + File::pathSeparator + L"Schematics"); + File targetFileDir(File::pathRoot + File::pathSeparator + L"Schematics"); #else - File targetFileDir(L"Schematics"); + File targetFileDir(L"Schematics"); #endif if(!targetFileDir.exists()) targetFileDir.mkdir(); - wchar_t filename[128]; + wchar_t filename[128]; swprintf(filename,128,L"%ls%dx%dx%d.sch",initData->name,(initData->endX - initData->startX + 1), (initData->endY - initData->startY + 1), (initData->endZ - initData->startZ + 1)); File dataFile = File( targetFileDir, wstring(filename) ); if(dataFile.exists()) dataFile._delete(); - FileOutputStream fos = FileOutputStream(dataFile); - DataOutputStream dos = DataOutputStream(&fos); - ConsoleSchematicFile::generateSchematicFile(&dos, levels[0], initData->startX, initData->startY, initData->startZ, initData->endX, initData->endY, initData->endZ, initData->bSaveMobs, initData->compressionType); - dos.close(); + FileOutputStream fos = FileOutputStream(dataFile); + DataOutputStream dos = DataOutputStream(&fos); + ConsoleSchematicFile::generateSchematicFile(&dos, levels[0], initData->startX, initData->startY, initData->startZ, initData->endX, initData->endY, initData->endZ, initData->bSaveMobs, initData->compressionType); + dos.close(); - delete initData; - } - app.LeaveSaveNotificationSection(); + delete initData; + } + app.LeaveSaveNotificationSection(); #endif - break; - case eXuiServerAction_SetCameraLocation: + break; + case eXuiServerAction_SetCameraLocation: #ifndef _CONTENT_PACKAGE - { - DebugSetCameraPosition *pos = static_cast(param); + { + DebugSetCameraPosition *pos = static_cast(param); app.DebugPrintf( "DEBUG: Player=%i\n", pos->player ); app.DebugPrintf( "DEBUG: Teleporting to pos=(%f.2, %f.2, %f.2), looking at=(%f.2,%f.2)\n", - pos->m_camX, pos->m_camY, pos->m_camZ, + pos->m_camX, pos->m_camY, pos->m_camZ, pos->m_yRot, pos->m_elev ); - shared_ptr player = players->players.at(pos->player); + shared_ptr player = players->players.at(pos->player); player->debug_setPosition( pos->m_camX, pos->m_camY, pos->m_camZ, pos->m_yRot, pos->m_elev ); - // Doesn't work + // Doesn't work //player->setYHeadRot(pos->m_yRot); //player->absMoveTo(pos->m_camX, pos->m_camY, pos->m_camZ, pos->m_yRot, pos->m_elev); - } + } #endif - break; - } + break; + } app.SetXuiServerAction(i,eXuiServerAction_Idle); - } + } - Sleep(1); - } - } + Sleep(1); + } + } //else - //{ + //{ // while (running) - // { + // { // handleConsoleInputs(); - // Sleep(10); + // Sleep(10); // } //} #if 0 @@ -2053,9 +2080,9 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) } #endif - // 4J Stu - Stop the server when the loops complete, as the finally would do - stopServer(didInit); - stopped = true; + // 4J Stu - Stop the server when the loops complete, as the finally would do + stopServer(didInit); + stopped = true; } void MinecraftServer::broadcastStartSavingPacket() @@ -2363,6 +2390,9 @@ bool MinecraftServer::chunkPacketManagement_CanSendTo(INetworkPlayer *player) { if( player == nullptr ) return false; +#ifdef MINECRAFT_SERVER_BUILD + return true; +#else int time = GetTickCount(); DWORD currentPlayerCount = g_NetworkManager.GetPlayerCount(); if( currentPlayerCount == 0 ) return false; @@ -2374,6 +2404,7 @@ bool MinecraftServer::chunkPacketManagement_CanSendTo(INetworkPlayer *player) } return false; +#endif } void MinecraftServer::chunkPacketManagement_DidSendTo(INetworkPlayer *player) diff --git a/Minecraft.Client/MinecraftServer.h b/Minecraft.Client/MinecraftServer.h index a33888bc..1ed5db9d 100644 --- a/Minecraft.Client/MinecraftServer.h +++ b/Minecraft.Client/MinecraftServer.h @@ -44,6 +44,7 @@ typedef struct _NetworkGameInitData LevelGenerationOptions *levelGen; DWORD texturePackId; bool findSeed; + bool dedicatedNoLocalHostPlayer; unsigned int xzSize; unsigned char hellScale; ESavePlatform savePlatform; @@ -57,6 +58,7 @@ typedef struct _NetworkGameInitData levelGen = nullptr; texturePackId = 0; findSeed = false; + dedicatedNoLocalHostPlayer = false; xzSize = LEVEL_LEGACY_WIDTH; hellScale = HELL_LEVEL_LEGACY_SCALE; savePlatform = SAVE_FILE_PLATFORM_LOCAL; @@ -119,6 +121,7 @@ public: int maxBuildHeight; int playerIdleTimeout; bool forceGameType; + int m_spawnProtectionRadius; private: // 4J Added diff --git a/Minecraft.Client/MultiPlayerLevel.h b/Minecraft.Client/MultiPlayerLevel.h index a552fc2b..b7f1640a 100644 --- a/Minecraft.Client/MultiPlayerLevel.h +++ b/Minecraft.Client/MultiPlayerLevel.h @@ -12,6 +12,7 @@ using namespace std; class MultiPlayerLevel : public Level { + friend class ClientConnection; private: static const int TICKS_BEFORE_RESET = 20 * 4; diff --git a/Minecraft.Client/Options.cpp b/Minecraft.Client/Options.cpp index ebe1295a..60886597 100644 --- a/Minecraft.Client/Options.cpp +++ b/Minecraft.Client/Options.cpp @@ -170,6 +170,7 @@ void Options::init() particles = 0; fov = 0; gamma = 0; + advancedTooltips = false; } Options::Options(Minecraft *minecraft, File workingDirectory) @@ -451,8 +452,9 @@ void Options::load() if (cmds[0] == L"fancyGraphics") fancyGraphics = cmds[1]==L"true"; if (cmds[0] == L"ao") ambientOcclusion = cmds[1]==L"true"; if (cmds[0] == L"clouds") renderClouds = cmds[1]==L"true"; - if (cmds[0] == L"skin") skin = cmds[1]; - if (cmds[0] == L"lastServer") lastMpIp = cmds[1]; + if (cmds[0] == L"advancedTooltips") advancedTooltips = cmds[1]==L"false"; + if (cmds[0] == L"skin") skin = cmds[1]; + if (cmds[0] == L"lastServer") lastMpIp = cmds[1]; for (int i = 0; i < keyMappings_length; i++) { @@ -508,7 +510,8 @@ void Options::save() dos.writeChars(L"fancyGraphics:" + wstring(fancyGraphics ? L"true" : L"false")); dos.writeChars(ambientOcclusion ? L"ao:true" : L"ao:false"); dos.writeChars(renderClouds ? L"clouds:true" : L"clouds:false"); - dos.writeChars(L"skin:" + skin); + dos.writeChars(advancedTooltips ? L"advancedTooltips:true" : L"advancedTooltips:false"); + dos.writeChars(L"skin:" + skin); dos.writeChars(L"lastServer:" + lastMpIp); for (int i = 0; i < keyMappings_length; i++) diff --git a/Minecraft.Client/Options.h b/Minecraft.Client/Options.h index 8be61ac6..29cd83ac 100644 --- a/Minecraft.Client/Options.h +++ b/Minecraft.Client/Options.h @@ -110,6 +110,7 @@ public: int particles; // 0 is all, 1 is decreased and 2 is minimal float fov; float gamma; + bool advancedTooltips; void init(); // 4J added Options(Minecraft *minecraft, File workingDirectory); diff --git a/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/Hook/PS3/HookSample.vcxproj b/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/Hook/PS3/HookSample.vcxproj deleted file mode 100644 index 74c78a6a..00000000 --- a/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/Hook/PS3/HookSample.vcxproj +++ /dev/null @@ -1,72 +0,0 @@ - - - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - {F749F5D0-B972-4E99-8B4B-2B865D4A8BC9} - - - - Application - GCC - - - Application - GCC - - - - - - - - - - - - - $(ProjectDir)$(Platform)_$(Configuration)_VS2010\ - $(Platform)_$(Configuration)_VS2010\ - - - $(ProjectDir)$(Platform)_$(Configuration)_VS2010\ - $(Platform)_$(Configuration)_VS2010\ - - - - _DEBUG;__CELL_ASSERT__;%(PreprocessorDefinitions);;HEAPINSPECTOR_PS3=1 - true - - - "$(SCE_PS3_ROOT)\target\ppu\lib\libm.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libio_stub.a";"..\..\..\Server\PS3\Debug\libHeapInspectorServer.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libpthread.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libnet_stub.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libsysmodule_stub.a";%(AdditionalDependencies) - -Wl,--wrap=malloc,--wrap=free,--wrap=calloc,--wrap=memalign,--wrap=realloc,--wrap=reallocalign,--wrap=_malloc_init %(AdditionalOptions) - - - - - NDEBUG;%(PreprocessorDefinitions);;HEAPINSPECTOR_PS3=1 - Level2 - - - "..\..\..\Server\PS3\Release\libHeapInspectorServer.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libpthread.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libnet_stub.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libsysmodule_stub.a";%(AdditionalDependencies) - -Wl,--wrap=malloc,--wrap=free,--wrap=calloc,--wrap=memalign,--wrap=realloc,--wrap=reallocalign,--wrap=_malloc_init %(AdditionalOptions) - - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/Manual/PS3/ManualSample.vcxproj b/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/Manual/PS3/ManualSample.vcxproj deleted file mode 100644 index 9dd6a130..00000000 --- a/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/Manual/PS3/ManualSample.vcxproj +++ /dev/null @@ -1,70 +0,0 @@ - - - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - {B6B851C9-DC76-4A5B-9AFE-6CF944BFB502} - - - - Application - GCC - - - Application - GCC - - - - - - - - - - - - - $(ProjectDir)$(Platform)_$(Configuration)_VS2010\ - $(Platform)_$(Configuration)_VS2010\ - - - $(ProjectDir)$(Platform)_$(Configuration)_VS2010\ - $(Platform)_$(Configuration)_VS2010\ - - - - _DEBUG;__CELL_ASSERT__;%(PreprocessorDefinitions);;HEAPINSPECTOR_PS3=1 - true - - - "$(SCE_PS3_ROOT)\target\ppu\lib\libm.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libio_stub.a";"..\..\..\Server\PS3\Debug\libHeapInspectorServer.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libpthread.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libnet_stub.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libsysmodule_stub.a";%(AdditionalDependencies) - - - - - NDEBUG;%(PreprocessorDefinitions);;HEAPINSPECTOR_PS3=1 - Level2 - - - "..\..\..\Server\PS3\Release\libHeapInspectorServer.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libpthread.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libnet_stub.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libsysmodule_stub.a";%(AdditionalDependencies) - - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/MultiThreadedHook/PS3/MultiThreadedHookSample.vcxproj b/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/MultiThreadedHook/PS3/MultiThreadedHookSample.vcxproj deleted file mode 100644 index 69d3882c..00000000 --- a/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/MultiThreadedHook/PS3/MultiThreadedHookSample.vcxproj +++ /dev/null @@ -1,76 +0,0 @@ - - - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - - - - {E9BC25AD-CFFD-43B6-ABEC-CA516CADD296} - - - - Application - GCC - - - Application - GCC - - - - - - - - - - - - - $(ProjectDir)$(Platform)_$(Configuration)_VS2010\ - $(Platform)_$(Configuration)_VS2010\ - - - $(ProjectDir)$(Platform)_$(Configuration)_VS2010\ - $(Platform)_$(Configuration)_VS2010\ - - - - _DEBUG;__CELL_ASSERT__;%(PreprocessorDefinitions);;HEAPINSPECTOR_PS3=1 - true - - - "$(SCE_PS3_ROOT)\target\ppu\lib\libm.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libio_stub.a";"..\..\..\Server\PS3\Debug\libHeapInspectorServer.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libpthread.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libnet_stub.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libsysmodule_stub.a";%(AdditionalDependencies) - -Wl,--wrap=malloc,--wrap=free,--wrap=calloc,--wrap=memalign,--wrap=realloc,--wrap=reallocalign,--wrap=_malloc_init %(AdditionalOptions) - - - - - NDEBUG;%(PreprocessorDefinitions);;HEAPINSPECTOR_PS3=1 - Level2 - - - "..\..\..\Server\PS3\Release\libHeapInspectorServer.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libpthread.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libnet_stub.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libsysmodule_stub.a";%(AdditionalDependencies) - -Wl,--wrap=malloc,--wrap=free,--wrap=calloc,--wrap=memalign,--wrap=realloc,--wrap=reallocalign,--wrap=_malloc_init %(AdditionalOptions) - - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/ReplaceNewDelete/PS3/ReplaceNewDeleteSample.vcxproj b/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/ReplaceNewDelete/PS3/ReplaceNewDeleteSample.vcxproj deleted file mode 100644 index 9515f936..00000000 --- a/Minecraft.Client/PS3/PS3Extras/HeapInspector/Samples/ReplaceNewDelete/PS3/ReplaceNewDeleteSample.vcxproj +++ /dev/null @@ -1,70 +0,0 @@ - - - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - {B0416FCD-A32B-4F91-93D1-4EDFF99F740B} - - - - Application - GCC - - - Application - GCC - - - - - - - - - - - - - $(ProjectDir)$(Platform)_$(Configuration)_VS2010\ - $(Platform)_$(Configuration)_VS2010\ - - - $(ProjectDir)$(Platform)_$(Configuration)_VS2010\ - $(Platform)_$(Configuration)_VS2010\ - - - - _DEBUG;__CELL_ASSERT__;%(PreprocessorDefinitions);;HEAPINSPECTOR_PS3=1 - true - - - "$(SCE_PS3_ROOT)\target\ppu\lib\libm.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libio_stub.a";"..\..\..\Server\PS3\Debug\libHeapInspectorServer.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libpthread.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libnet_stub.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libsysmodule_stub.a";%(AdditionalDependencies) - - - - - NDEBUG;%(PreprocessorDefinitions);;HEAPINSPECTOR_PS3=1 - Level2 - - - "..\..\..\Server\PS3\Release\libHeapInspectorServer.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libpthread.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libnet_stub.a";"$(SCE_PS3_ROOT)\target\ppu\lib\libsysmodule_stub.a";%(AdditionalDependencies) - - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj deleted file mode 100644 index 3827cb66..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj +++ /dev/null @@ -1,267 +0,0 @@ - - - - - ContentPackage - PS3 - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {4B7786BE-4F10-4FAA-A75A-631DF39570DD} - ChunkUpdate - SAK - SAK - SAK - SAK - - - - Application - SPU - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_ContentPackage\ - PS3_Release\ - PS3_ContentPackage\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - - false - false - $(ProjectName) - SpursInit - $(ProjectName) - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - Level3 - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Debug\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Release\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - false - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\ContentPackage\$(TargetName).ppu$(ObjectExt) - Hard - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj.filters b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj.filters deleted file mode 100644 index e6e17009..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj.filters +++ /dev/null @@ -1,170 +0,0 @@ - - - - - {881f28ee-ca74-4afc-94a6-2346cb88f86d} - cpp;c;cxx;cc;s;asm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Source Files - - - - - - - - - - - - - - - - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkUpdate.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/CompressedTile.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/CompressedTile.spu.vcxproj deleted file mode 100644 index 6cb491b0..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/CompressedTile.spu.vcxproj +++ /dev/null @@ -1,160 +0,0 @@ - - - - - ContentPackage - PS3 - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - - - - - - - - - - {4B436D43-D35B-4E56-988A-A3543B70C8E5} - CompressedTile - %24/StoriesPark/Minecraft/MinecraftConsoles-dev/Minecraft.Client/PS3/SPU_Tasks/CompressedTile - https://tfs4jstudios.visualstudio.com/defaultcollection - . - {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - - - - Application - SPU - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_ContentPackage\ - PS3_Release\ - PS3_ContentPackage\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - - false - false - $(ProjectName) - SpursInit - $(ProjectName) - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Debug\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Release\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - false - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\ContentPackage\$(TargetName).ppu$(ObjectExt) - Hard - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/CompressedTile.spu.vcxproj.filters b/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/CompressedTile.spu.vcxproj.filters deleted file mode 100644 index 61e540ec..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/CompressedTile.spu.vcxproj.filters +++ /dev/null @@ -1,32 +0,0 @@ - - - - - {881f28ee-ca74-4afc-94a6-2346cb88f86d} - cpp;c;cxx;cc;s;asm - - - - - - - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/CompressedTile.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/CompressedTile.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/CompressedTile/CompressedTile.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_compress/CompressedTileStorage_compress.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_compress/CompressedTileStorage_compress.spu.vcxproj deleted file mode 100644 index 28c9c039..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_compress/CompressedTileStorage_compress.spu.vcxproj +++ /dev/null @@ -1,156 +0,0 @@ - - - - - ContentPackage - PS3 - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - - - - - - {297888B4-8234-461B-9861-214988A95711} - CompressedTileStorage_compress - SAK - SAK - SAK - SAK - - - - Application - SPU - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_ContentPackage\ - PS3_Release\ - PS3_ContentPackage\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - - false - false - $(ProjectName) - SpursInit - $(ProjectName) - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Debug\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Release\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - false - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\ContentPackage\$(TargetName).ppu$(ObjectExt) - Hard - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_compress/CompressedTileStorage_compress.spu.vcxproj.filters b/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_compress/CompressedTileStorage_compress.spu.vcxproj.filters deleted file mode 100644 index e5d287fe..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_compress/CompressedTileStorage_compress.spu.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {881f28ee-ca74-4afc-94a6-2346cb88f86d} - cpp;c;cxx;cc;s;asm - - - - - - - - - Source Files - - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_compress/CompressedTileStorage_compress.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_compress/CompressedTileStorage_compress.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_compress/CompressedTileStorage_compress.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_getData/CompressedTileStorage_getData.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_getData/CompressedTileStorage_getData.spu.vcxproj deleted file mode 100644 index 5deca3c5..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_getData/CompressedTileStorage_getData.spu.vcxproj +++ /dev/null @@ -1,151 +0,0 @@ - - - - - ContentPackage - PS3 - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - - {ED672663-B86E-436B-9530-A6589DE02366} - CompressedTileStorage_getData - SAK - SAK - SAK - SAK - - - - Application - SPU - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_Release\ - PS3_Release\ - PS3_Release\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - - false - false - $(ProjectName) - SpursInit - $(ProjectName) - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Debug\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Release\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\ContentPackage\$(TargetName).ppu$(ObjectExt) - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_getData/CompressedTileStorage_getData.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_getData/CompressedTileStorage_getData.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/CompressedTileStorage_getData/CompressedTileStorage_getData.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/GameRenderer_updateLightTexture/GameRenderer_updateLightTexture.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/GameRenderer_updateLightTexture/GameRenderer_updateLightTexture.spu.vcxproj deleted file mode 100644 index 8cb7966e..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/GameRenderer_updateLightTexture/GameRenderer_updateLightTexture.spu.vcxproj +++ /dev/null @@ -1,105 +0,0 @@ - - - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - {1F6ECBFE-3089-457D-8A11-5CFDC0392439} - GameRenderer_updateLightTexture - - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_Release\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - $(ProjectName) - SpursInit - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\$(TargetName).ppu$(ObjectExt) - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/GameRenderer_updateLightTexture/GameRenderer_updateLightTexture.spu.vcxproj.filters b/Minecraft.Client/PS3/SPU_Tasks/GameRenderer_updateLightTexture/GameRenderer_updateLightTexture.spu.vcxproj.filters deleted file mode 100644 index 4e9f4fee..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/GameRenderer_updateLightTexture/GameRenderer_updateLightTexture.spu.vcxproj.filters +++ /dev/null @@ -1,17 +0,0 @@ - - - - - {881f28ee-ca74-4afc-94a6-2346cb88f86d} - cpp;c;cxx;cc;s;asm - - - - - - - - Source Files - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/GameRenderer_updateLightTexture/GameRenderer_updateLightTexture.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/GameRenderer_updateLightTexture/GameRenderer_updateLightTexture.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/GameRenderer_updateLightTexture/GameRenderer_updateLightTexture.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderChunks/LevelRenderChunks.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderChunks/LevelRenderChunks.spu.vcxproj deleted file mode 100644 index a2c46b29..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderChunks/LevelRenderChunks.spu.vcxproj +++ /dev/null @@ -1,94 +0,0 @@ - - - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - {47EBEE93-F9E1-4AD3-B746-0D7D7ADCB0DA} - task_hello.spu - LevelRenderChunks - SAK - SAK - SAK - SAK - - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(SolutionDir)$(Platform)_$(Configuration)\ - $(Configuration)\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);$(ExtensionsToDeleteOnClean) - $(SolutionDir)$(Platform)_$(Configuration)\ - $(Configuration)\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - $(ProjectName) - $(ProjectName) - - - - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;..;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - Levels - - - -mspurs-task %(AdditionalOptions) - $(SCE_PS3_ROOT)\target\spu\lib\libspurs.a;$(SCE_PS3_ROOT)\target\spu\lib\libdma.a;%(AdditionalDependencies) - false - - - - - - - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;..;%(AdditionalIncludeDirectories) - Levels - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - true - - - -mspurs-task %(AdditionalOptions) - $(SCE_PS3_ROOT)\target\spu\lib\libspurs.a;$(SCE_PS3_ROOT)\target\spu\lib\libdma.a;$(SCE_PS3_ROOT)\target\spu\lib\libgcm_spu.a;%(AdditionalDependencies) - false - - - - - ..\$(TargetName).ppu$(ObjectExt) - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderChunks/LevelRenderChunks.spu.vcxproj.filters b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderChunks/LevelRenderChunks.spu.vcxproj.filters deleted file mode 100644 index 8712fab2..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderChunks/LevelRenderChunks.spu.vcxproj.filters +++ /dev/null @@ -1,17 +0,0 @@ - - - - - {881f28ee-ca74-4afc-94a6-2346cb88f86d} - cpp;c;cxx;cc;s;asm - - - - - Source Files - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderChunks/LevelRenderChunks.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderChunks/LevelRenderChunks.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderChunks/LevelRenderChunks.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.spu.vcxproj deleted file mode 100644 index 4b3aa1d6..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.spu.vcxproj +++ /dev/null @@ -1,153 +0,0 @@ - - - - - ContentPackage - PS3 - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - {E26485AE-71A5-4785-A14D-6456FF7C4FB0} - LevelRenderer_FindNearestChunk - SAK - SAK - SAK - SAK - - - - Application - SPU - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_ContentPackage\ - PS3_Release\ - PS3_ContentPackage\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - - false - false - $(ProjectName) - SpursInit - $(ProjectName) - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Debug\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Release\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - false - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\ContentPackage\$(TargetName).ppu$(ObjectExt) - Hard - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_cull/LevelRenderer_cull.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_cull/LevelRenderer_cull.spu.vcxproj deleted file mode 100644 index 839a0edf..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_cull/LevelRenderer_cull.spu.vcxproj +++ /dev/null @@ -1,153 +0,0 @@ - - - - - ContentPackage - PS3 - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - {0FC6FCFB-7793-4EEE-8356-2C129621C67A} - LevelRenderer_cull - %24/StoriesPark/Minecraft/MinecraftConsoles-dev/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_cull - https://tfs4jstudios.visualstudio.com/defaultcollection - . - {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - - - - Application - SPU - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_ContentPackage\ - PS3_Release\ - PS3_ContentPackage\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - - false - false - $(ProjectName) - SpursInit - $(ProjectName) - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Debug\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Release\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - false - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\ContentPackage\$(TargetName).ppu$(ObjectExt) - Hard - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_cull/LevelRenderer_cull.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_cull/LevelRenderer_cull.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_cull/LevelRenderer_cull.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_zSort/LevelRenderer_zSort.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_zSort/LevelRenderer_zSort.spu.vcxproj deleted file mode 100644 index 8c7e5b0f..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_zSort/LevelRenderer_zSort.spu.vcxproj +++ /dev/null @@ -1,153 +0,0 @@ - - - - - ContentPackage - PS3 - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - {BE7A14B2-1761-4FDF-82C0-B50F8BC9633A} - LevelRenderer_zSort - %24/StoriesPark/Minecraft/MinecraftConsoles-dev/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_zSort - https://tfs4jstudios.visualstudio.com/defaultcollection - . - {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - - - - Application - SPU - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_ContentPackage\ - PS3_Release\ - PS3_ContentPackage\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - - false - false - $(ProjectName) - SpursInit - $(ProjectName) - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Debug\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Release\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - false - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\ContentPackage\$(TargetName).ppu$(ObjectExt) - Hard - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_zSort/LevelRenderer_zSort.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_zSort/LevelRenderer_zSort.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_zSort/LevelRenderer_zSort.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/PerlinNoise/PerlinNoise.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/PerlinNoise/PerlinNoise.spu.vcxproj deleted file mode 100644 index 63498445..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/PerlinNoise/PerlinNoise.spu.vcxproj +++ /dev/null @@ -1,159 +0,0 @@ - - - - - ContentPackage - PS3 - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - - - - - - {4CDF5745-FCF3-474D-941B-ABBEA788E8DA} - PerlinNoise - %24/StoriesPark/Minecraft/MinecraftConsoles-dev/Minecraft.Client/PS3/SPU_Tasks/PerlinNoise - https://tfs4jstudios.visualstudio.com/defaultcollection - . - {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - - - - Application - SPU - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_ContentPackage\ - PS3_Release\ - PS3_ContentPackage\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - - false - false - $(ProjectName) - SpursInit - $(ProjectName) - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - Level3 - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Debug\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Release\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - false - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\ContentPackage\$(TargetName).ppu$(ObjectExt) - Hard - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/PerlinNoise/PerlinNoise.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/PerlinNoise/PerlinNoise.spu.vcxproj.vspscc deleted file mode 100644 index 6cb031bc..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/PerlinNoise/PerlinNoise.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/RLECompress/RLECompress.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/RLECompress/RLECompress.spu.vcxproj.vspscc deleted file mode 100644 index 6cb031bc..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/RLECompress/RLECompress.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/Renderer_TextureUpdate/Renderer_TextureUpdate.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/Renderer_TextureUpdate/Renderer_TextureUpdate.spu.vcxproj deleted file mode 100644 index 77095098..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/Renderer_TextureUpdate/Renderer_TextureUpdate.spu.vcxproj +++ /dev/null @@ -1,153 +0,0 @@ - - - - - ContentPackage - PS3 - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - {AEC81E5C-04B5-4F77-91A0-D94065F885B7} - Renderer_TextureUpdate - SAK - SAK - SAK - SAK - - - - Application - SPU - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_ContentPackage\ - PS3_Release\ - PS3_ContentPackage\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - - false - false - $(ProjectName) - SpursInit - $(ProjectName) - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Debug\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Release\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - false - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\ContentPackage\$(TargetName).ppu$(ObjectExt) - Hard - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/Renderer_TextureUpdate/Renderer_TextureUpdate.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/Renderer_TextureUpdate/Renderer_TextureUpdate.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/Renderer_TextureUpdate/Renderer_TextureUpdate.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PS3/SPU_Tasks/SPU_Tasks.sln b/Minecraft.Client/PS3/SPU_Tasks/SPU_Tasks.sln deleted file mode 100644 index facab14c..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/SPU_Tasks.sln +++ /dev/null @@ -1,74 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChunkUpdate", "ChunkUpdate\ChunkUpdate.spu.vcxproj", "{4B7786BE-4F10-4FAA-A75A-631DF39570DD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CompressedTile", "CompressedTile\CompressedTile.spu.vcxproj", "{4B436D43-D35B-4E56-988A-A3543B70C8E5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CompressedTileStorage_compress", "CompressedTileStorage_compress\CompressedTileStorage_compress.spu.vcxproj", "{297888B4-8234-461B-9861-214988A95711}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LevelRenderer_cull", "LevelRenderer_cull\LevelRenderer_cull.spu.vcxproj", "{0FC6FCFB-7793-4EEE-8356-2C129621C67A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LevelRenderer_FindNearestChunk", "LevelRenderer_FindNearestChunk\LevelRenderer_FindNearestChunk.spu.vcxproj", "{E26485AE-71A5-4785-A14D-6456FF7C4FB0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Texture_blit", "Texture_blit\Texture_blit.spu.vcxproj", "{A71AAA51-6541-4348-9814-E5FE2D36183B}" -EndProject -Global - GlobalSection(TeamFoundationVersionControl) = preSolution - SccNumberOfProjects = 7 - SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - SccTeamFoundationServer = http://tfs_server:8080/tfs/storiespark - SccLocalPath0 = . - SccProjectUniqueName1 = CompressedTile\\CompressedTile.spu.vcxproj - SccProjectName1 = CompressedTile - SccLocalPath1 = CompressedTile - SccProjectUniqueName2 = LevelRenderer_cull\\LevelRenderer_cull.spu.vcxproj - SccProjectName2 = LevelRenderer_cull - SccLocalPath2 = LevelRenderer_cull - SccProjectUniqueName3 = ChunkUpdate\\ChunkUpdate.spu.vcxproj - SccProjectName3 = ChunkUpdate - SccLocalPath3 = ChunkUpdate - SccProjectUniqueName4 = CompressedTileStorage_compress\\CompressedTileStorage_compress.spu.vcxproj - SccProjectName4 = CompressedTileStorage_compress - SccLocalPath4 = CompressedTileStorage_compress - SccProjectUniqueName5 = LevelRenderer_FindNearestChunk\\LevelRenderer_FindNearestChunk.spu.vcxproj - SccProjectName5 = LevelRenderer_FindNearestChunk - SccLocalPath5 = LevelRenderer_FindNearestChunk - SccProjectUniqueName6 = Texture_blit\\Texture_blit.spu.vcxproj - SccProjectName6 = Texture_blit - SccLocalPath6 = Texture_blit - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|PS3 = Debug|PS3 - Release|PS3 = Release|PS3 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4B7786BE-4F10-4FAA-A75A-631DF39570DD}.Debug|PS3.ActiveCfg = Debug|PS3 - {4B7786BE-4F10-4FAA-A75A-631DF39570DD}.Debug|PS3.Build.0 = Debug|PS3 - {4B7786BE-4F10-4FAA-A75A-631DF39570DD}.Release|PS3.ActiveCfg = Release|PS3 - {4B7786BE-4F10-4FAA-A75A-631DF39570DD}.Release|PS3.Build.0 = Release|PS3 - {4B436D43-D35B-4E56-988A-A3543B70C8E5}.Debug|PS3.ActiveCfg = Debug|PS3 - {4B436D43-D35B-4E56-988A-A3543B70C8E5}.Debug|PS3.Build.0 = Debug|PS3 - {4B436D43-D35B-4E56-988A-A3543B70C8E5}.Release|PS3.ActiveCfg = Release|PS3 - {4B436D43-D35B-4E56-988A-A3543B70C8E5}.Release|PS3.Build.0 = Release|PS3 - {297888B4-8234-461B-9861-214988A95711}.Debug|PS3.ActiveCfg = Debug|PS3 - {297888B4-8234-461B-9861-214988A95711}.Debug|PS3.Build.0 = Debug|PS3 - {297888B4-8234-461B-9861-214988A95711}.Release|PS3.ActiveCfg = Release|PS3 - {297888B4-8234-461B-9861-214988A95711}.Release|PS3.Build.0 = Release|PS3 - {0FC6FCFB-7793-4EEE-8356-2C129621C67A}.Debug|PS3.ActiveCfg = Debug|PS3 - {0FC6FCFB-7793-4EEE-8356-2C129621C67A}.Debug|PS3.Build.0 = Debug|PS3 - {0FC6FCFB-7793-4EEE-8356-2C129621C67A}.Release|PS3.ActiveCfg = Release|PS3 - {0FC6FCFB-7793-4EEE-8356-2C129621C67A}.Release|PS3.Build.0 = Release|PS3 - {E26485AE-71A5-4785-A14D-6456FF7C4FB0}.Debug|PS3.ActiveCfg = Debug|PS3 - {E26485AE-71A5-4785-A14D-6456FF7C4FB0}.Debug|PS3.Build.0 = Debug|PS3 - {E26485AE-71A5-4785-A14D-6456FF7C4FB0}.Release|PS3.ActiveCfg = Release|PS3 - {E26485AE-71A5-4785-A14D-6456FF7C4FB0}.Release|PS3.Build.0 = Release|PS3 - {A71AAA51-6541-4348-9814-E5FE2D36183B}.Debug|PS3.ActiveCfg = Debug|PS3 - {A71AAA51-6541-4348-9814-E5FE2D36183B}.Debug|PS3.Build.0 = Debug|PS3 - {A71AAA51-6541-4348-9814-E5FE2D36183B}.Release|PS3.ActiveCfg = Release|PS3 - {A71AAA51-6541-4348-9814-E5FE2D36183B}.Release|PS3.Build.0 = Release|PS3 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Minecraft.Client/PS3/SPU_Tasks/Texture_blit/Texture_blit.spu.vcxproj b/Minecraft.Client/PS3/SPU_Tasks/Texture_blit/Texture_blit.spu.vcxproj deleted file mode 100644 index b12bc8bb..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/Texture_blit/Texture_blit.spu.vcxproj +++ /dev/null @@ -1,153 +0,0 @@ - - - - - ContentPackage - PS3 - - - Debug - PS3 - - - Release - PS3 - - - - - - - - - - {A71AAA51-6541-4348-9814-E5FE2D36183B} - Texture_blit - SAK - SAK - SAK - SAK - - - - Application - SPU - - - Application - SPU - - - Application - SPU - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - PS3_Debug\ - PS3_Debug\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - false - PS3_Release\ - PS3_ContentPackage\ - PS3_Release\ - PS3_ContentPackage\ - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - *.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);undefined;$(ExtensionsToDeleteOnClean) - - - false - false - $(ProjectName) - SpursInit - $(ProjectName) - $(ProjectName) - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Debug\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - true - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\Release\$(TargetName).ppu$(ObjectExt) - - - - - -ffunction-sections -fdata-sections -fstack-check %(AdditionalOptions) - $(SN_PS3_PATH)\spu\include\sn;$(SCE_PS3_ROOT)\target\spu\include;$(SCE_PS3_ROOT)\target\common\include;%(AdditionalIncludeDirectories) - false - Level3 - SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU;_CONTENT_PACKAGE;%(PreprocessorDefinitions) - true - - - true - - - -Wl,--gc-sections -g %(AdditionalOptions) - -ldma;-lspurs_jq;%(AdditionalDependencies) - false - - - - - JobBin2 - ..\ObjFiles\ContentPackage\$(TargetName).ppu$(ObjectExt) - Hard - - - - - - \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/Texture_blit/Texture_blit.spu.vcxproj.vspscc b/Minecraft.Client/PS3/SPU_Tasks/Texture_blit/Texture_blit.spu.vcxproj.vspscc deleted file mode 100644 index b6d32892..00000000 --- a/Minecraft.Client/PS3/SPU_Tasks/Texture_blit/Texture_blit.spu.vcxproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/Minecraft.Client/PendingConnection.cpp b/Minecraft.Client/PendingConnection.cpp index 6d5497f0..f24086c1 100644 --- a/Minecraft.Client/PendingConnection.cpp +++ b/Minecraft.Client/PendingConnection.cpp @@ -14,6 +14,11 @@ #include "..\Minecraft.World\net.minecraft.world.item.h" #include "..\Minecraft.World\SharedConstants.h" #include "Settings.h" +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) +#include "..\Minecraft.Server\ServerLogManager.h" +#include "..\Minecraft.Server\Access\Access.h" +#include "..\Minecraft.World\Socket.h" +#endif // #ifdef __PS3__ // #include "PS3\Network\NetworkPlayerSony.h" // #endif @@ -24,6 +29,24 @@ Random *PendingConnection::random = new Random(); bool g_bRejectDuplicateNames = true; #endif +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) +namespace +{ + static unsigned char GetPendingConnectionSmallId(Connection *connection) + { + if (connection != nullptr) + { + Socket *socket = connection->getSocket(); + if (socket != nullptr) + { + return socket->getSmallId(); + } + } + return 0; + } +} +#endif + PendingConnection::PendingConnection(MinecraftServer *server, Socket *socket, const wstring& id) { // 4J - added initialisers @@ -180,16 +203,55 @@ void PendingConnection::handleLogin(shared_ptr packet) duplicateXuid = true; } + bool bannedXuid = false; + if (loginXuid != INVALID_XUID) + { + bannedXuid = server->getPlayers()->isXuidBanned(loginXuid); + } + if (!bannedXuid && packet->m_onlineXuid != INVALID_XUID && packet->m_onlineXuid != loginXuid) + { + bannedXuid = server->getPlayers()->isXuidBanned(packet->m_onlineXuid); + } + + bool whitelistSatisfied = true; +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + if (ServerRuntime::Access::IsWhitelistEnabled()) + { + whitelistSatisfied = false; + if (loginXuid != INVALID_XUID) + { + whitelistSatisfied = ServerRuntime::Access::IsPlayerWhitelisted(loginXuid); + } + if (!whitelistSatisfied && packet->m_onlineXuid != INVALID_XUID && packet->m_onlineXuid != loginXuid) + { + whitelistSatisfied = ServerRuntime::Access::IsPlayerWhitelisted(packet->m_onlineXuid); + } + } +#endif + if( sentDisconnect ) { // Do nothing } - else if( server->getPlayers()->isXuidBanned( packet->m_onlineXuid ) ) + else if (bannedXuid) { +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + ServerRuntime::ServerLogManager::OnRejectedPlayerLogin(GetPendingConnectionSmallId(connection), name, ServerRuntime::ServerLogManager::eLoginRejectReason_BannedXuid); +#endif + disconnect(DisconnectPacket::eDisconnect_Banned); + } + else if (!whitelistSatisfied) + { +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + ServerRuntime::ServerLogManager::OnRejectedPlayerLogin(GetPendingConnectionSmallId(connection), name, ServerRuntime::ServerLogManager::eLoginRejectReason_NotWhitelisted); +#endif disconnect(DisconnectPacket::eDisconnect_Banned); } else if (duplicateXuid) { +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + ServerRuntime::ServerLogManager::OnRejectedPlayerLogin(GetPendingConnectionSmallId(connection), name, ServerRuntime::ServerLogManager::eLoginRejectReason_DuplicateXuid); +#endif // Reject the incoming connection — a player with this UID is already // on the server. Allowing duplicates causes invisible players and // other undefined behaviour. @@ -211,6 +273,9 @@ void PendingConnection::handleLogin(shared_ptr packet) } if (nameTaken) { +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + ServerRuntime::ServerLogManager::OnRejectedPlayerLogin(GetPendingConnectionSmallId(connection), name, ServerRuntime::ServerLogManager::eLoginRejectReason_DuplicateName); +#endif app.DebugPrintf("Rejecting duplicate name: %ls\n", name.c_str()); disconnect(DisconnectPacket::eDisconnect_Banned); } @@ -268,6 +333,9 @@ void PendingConnection::handleAcceptedLogin(shared_ptr packet) shared_ptr playerEntity = server->getPlayers()->getPlayerForLogin(this, name, playerXuid,packet->m_onlineXuid); if (playerEntity != nullptr) { +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + ServerRuntime::ServerLogManager::OnAcceptedPlayerLogin(GetPendingConnectionSmallId(connection), name); +#endif server->getPlayers()->placeNewPlayer(connection, playerEntity, packet); connection = nullptr; // We've moved responsibility for this over to the new PlayerConnection, nullptr so we don't delete our reference to it here in our dtor } @@ -325,4 +393,4 @@ bool PendingConnection::isServerPacketListener() bool PendingConnection::isDisconnected() { return done; -} \ No newline at end of file +} diff --git a/Minecraft.Client/PlayerConnection.cpp b/Minecraft.Client/PlayerConnection.cpp index d9915cf6..1fb7c398 100644 --- a/Minecraft.Client/PlayerConnection.cpp +++ b/Minecraft.Client/PlayerConnection.cpp @@ -34,9 +34,26 @@ // 4J Added #include "..\Minecraft.World\net.minecraft.world.item.crafting.h" #include "Options.h" +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) +#include "..\Minecraft.Server\ServerLogManager.h" +#endif + +namespace +{ + // Anti-cheat thresholds. Keep server-side checks authoritative even in host mode. + // Base max squared displacement allowed per move packet before speed flags trigger. + const double kMoveBaseAllowanceSq = 100.0; + // Extra squared displacement allowance derived from current server-side velocity. + const double kMoveVelocityAllowanceScale = 100.0; + // Max squared distance for interact/attack when the target is visible (normal reach). + const double kInteractReachSq = 6.0 * 6.0; + // Stricter max squared distance used when LOS is blocked to reduce wall-hit abuse. + const double kInteractBlockedReachSq = 3.0 * 3.0; +} Random PlayerConnection::random; + PlayerConnection::PlayerConnection(MinecraftServer *server, Connection *connection, shared_ptr player) { // 4J - added initialisers @@ -66,6 +83,13 @@ PlayerConnection::PlayerConnection(MinecraftServer *server, Connection *connecti m_offlineXUID = INVALID_XUID; m_onlineXUID = INVALID_XUID; m_bHasClientTickedOnce = false; + m_logSmallId = 0; + + // Cache the first valid transport smallId because disconnect teardown can clear it before the server logger runs. + if (this->connection != NULL && this->connection->getSocket() != NULL) + { + m_logSmallId = this->connection->getSocket()->getSmallId(); + } setShowOnMaps(app.GetGameHostOption(eGameHostOption_Gamertags)!=0?true:false); } @@ -76,6 +100,17 @@ PlayerConnection::~PlayerConnection() DeleteCriticalSection(&done_cs); } +unsigned char PlayerConnection::getLogSmallId() +{ + // Fall back to the live socket only while the cached value is still empty. + if (m_logSmallId == 0 && connection != NULL && connection->getSocket() != NULL) + { + m_logSmallId = connection->getSocket()->getSmallId(); + } + + return m_logSmallId; +} + void PlayerConnection::tick() { if( done ) return; @@ -118,6 +153,13 @@ void PlayerConnection::disconnect(DisconnectPacket::eDisconnectReason reason) return; } +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + ServerRuntime::ServerLogManager::OnPlayerDisconnected( + getLogSmallId(), + (player != NULL) ? player->name : std::wstring(), + reason, + true); +#endif app.DebugPrintf("PlayerConnection disconect reason: %d\n", reason ); player->disconnect(); @@ -271,16 +313,19 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) double dist = xDist * xDist + yDist * yDist + zDist * zDist; - // 4J-PB - removing this one for now - /*if (dist > 100.0f) + // Anti-cheat: reject movement packets that exceed server-authoritative bounds. + double velocitySq = player->xd * player->xd + player->yd * player->yd + player->zd * player->zd; + double maxAllowedSq = kMoveBaseAllowanceSq + (velocitySq * kMoveVelocityAllowanceScale); + if (player->isAllowedToFly() || player->gameMode->isCreative()) { - // logger.warning(player->name + " moved too quickly!"); - disconnect(DisconnectPacket::eDisconnect_MovedTooQuickly); - // System.out.println("Moved too quickly at " + xt + ", " + yt + ", " + zt); - // teleport(player->x, player->y, player->z, player->yRot, player->xRot); - return; + // Creative / flight-allowed players can move farther legitimately per tick. + maxAllowedSq *= 1.5; + } + if (dist > maxAllowedSq) + { + disconnect(DisconnectPacket::eDisconnect_MovedTooQuickly); + return; } - */ float r = 1 / 16.0f; bool oldOk = level->getCubes(player, player->bb->copy()->shrink(r, r, r))->empty(); @@ -308,8 +353,8 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) xDist = xt - player->x; yDist = yt - player->y; - // 4J-PB - line below will always be true! - if (yDist > -0.5 || yDist < 0.5) + // Clamp tiny Y drift noise to reduce false positives. + if (yDist > -0.5 && yDist < 0.5) { yDist = 0; } @@ -430,7 +475,8 @@ void PlayerConnection::handlePlayerAction(shared_ptr packet) if (packet->action == PlayerActionPacket::START_DESTROY_BLOCK) { - if (true) player->gameMode->startDestroyBlock(x, y, z, packet->face); // 4J - condition was !server->isUnderSpawnProtection(level, x, y, z, player) (from Java 1.6.4) but putting back to old behaviour + // Anti-cheat: validate spawn protection on the server for mining start. + if (!server->isUnderSpawnProtection(level, x, y, z, player)) player->gameMode->startDestroyBlock(x, y, z, packet->face); else player->connection->send(std::make_shared(x, y, z, level)); } @@ -458,8 +504,6 @@ void PlayerConnection::handleUseItem(shared_ptr packet) int face = packet->getFace(); player->resetLastActionTime(); - // 4J Stu - We don't have ops, so just use the levels setting - bool canEditSpawn = level->canEditSpawn; // = level->dimension->id != 0 || server->players->isOp(player->name); if (packet->getFace() == 255) { if (item == nullptr) return; @@ -469,7 +513,8 @@ void PlayerConnection::handleUseItem(shared_ptr packet) { if (synched && player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) < 8 * 8) { - if (true) // 4J - condition was !server->isUnderSpawnProtection(level, x, y, z, player) (from java 1.6.4) but putting back to old behaviour + // Anti-cheat: block placement/use must pass server-side spawn protection. + if (!server->isUnderSpawnProtection(level, x, y, z, player)) { player->gameMode->useItemOn(player, level, item, x, y, z, face, packet->getClickX(), packet->getClickY(), packet->getClickZ()); } @@ -538,7 +583,18 @@ void PlayerConnection::handleUseItem(shared_ptr packet) void PlayerConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) { EnterCriticalSection(&done_cs); - if( done ) return; + if( done ) + { + LeaveCriticalSection(&done_cs); + return; + } +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + ServerRuntime::ServerLogManager::OnPlayerDisconnected( + getLogSmallId(), + (player != NULL) ? player->name : std::wstring(), + reason, + false); +#endif // logger.info(player.name + " lost connection: " + reason); // 4J-PB - removed, since it needs to be localised in the language the client is in //server->players->broadcastAll( shared_ptr( new ChatPacket(L"�e" + player->name + L" left the game.") ) ); @@ -742,17 +798,16 @@ void PlayerConnection::handleInteract(shared_ptr packet) // 4J Stu - If the client says that we hit something, then agree with it. The canSee can fail here as it checks // a ray from head->head, but we may actually be looking at a different part of the entity that can be seen // even though the ray is blocked. - if (target != nullptr) // && player->canSee(target) && player->distanceToSqr(target) < 6 * 6) + if (target != nullptr) { - //boole canSee = player->canSee(target); - //double maxDist = 6 * 6; - //if (!canSee) - //{ - // maxDist = 3 * 3; - //} + // Anti-cheat: enforce reach and LOS on the server to reject forged hits. + bool canSeeTarget = player->canSee(target); + double maxDistSq = canSeeTarget ? kInteractReachSq : kInteractBlockedReachSq; + if (player->distanceToSqr(target) > maxDistSq) + { + return; + } - //if (player->distanceToSqr(target) < maxDist) - //{ if (packet->action == InteractPacket::INTERACT) { player->interact(target); @@ -767,7 +822,6 @@ void PlayerConnection::handleInteract(shared_ptr packet) } player->attack(target); } - //} } } @@ -1577,8 +1631,10 @@ bool PlayerConnection::isDisconnected() void PlayerConnection::handleDebugOptions(shared_ptr packet) { - //Player player = dynamic_pointer_cast( player->shared_from_this() ); - player->SetDebugOptions(packet->m_uiVal); +#ifdef _DEBUG + // Player player = dynamic_pointer_cast( player->shared_from_this() ); + player->SetDebugOptions(packet->m_uiVal); +#endif } void PlayerConnection::handleCraftItem(shared_ptr packet) diff --git a/Minecraft.Client/PlayerConnection.h b/Minecraft.Client/PlayerConnection.h index ff6093a3..0284bc6a 100644 --- a/Minecraft.Client/PlayerConnection.h +++ b/Minecraft.Client/PlayerConnection.h @@ -37,6 +37,7 @@ private: int dropSpamTickCount; bool m_bHasClientTickedOnce; + unsigned char m_logSmallId; public: PlayerConnection(MinecraftServer *server, Connection *connection, shared_ptr player); @@ -45,6 +46,10 @@ public: void disconnect(DisconnectPacket::eDisconnectReason reason); private: + /** + * Returns the stable network smallId used by dedicated-server logging and refreshes it from the live socket when possible + */ + unsigned char getLogSmallId(); double xLastOk, yLastOk, zLastOk; bool synched; diff --git a/Minecraft.Client/PlayerList.cpp b/Minecraft.Client/PlayerList.cpp index 645e3fb5..ba82ec6a 100644 --- a/Minecraft.Client/PlayerList.cpp +++ b/Minecraft.Client/PlayerList.cpp @@ -37,6 +37,11 @@ #include "Common\Network\Sony\NetworkPlayerSony.h" #endif +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) +#include "..\Minecraft.Server\Access\Access.h" +extern bool g_Win64DedicatedServer; +#endif + // 4J - this class is fairly substantially altered as there didn't seem any point in porting code for banning, whitelisting, ops etc. PlayerList::PlayerList(MinecraftServer *server) @@ -1674,6 +1679,13 @@ bool PlayerList::isXuidBanned(PlayerUID xuid) } } +#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD) + if (!banned && g_Win64DedicatedServer) + { + banned = ServerRuntime::Access::IsPlayerBanned(xuid); + } +#endif + return banned; } diff --git a/Minecraft.Client/PlayerRenderer.cpp b/Minecraft.Client/PlayerRenderer.cpp index a9b94544..bc4c61a7 100644 --- a/Minecraft.Client/PlayerRenderer.cpp +++ b/Minecraft.Client/PlayerRenderer.cpp @@ -199,11 +199,26 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = mob->isSneaking(); double yp = y - mob->heightOffset; - if (mob->isSneaking() && !mob->instanceof(eTYPE_LOCALPLAYER)) + if (mob->isSneaking()) { yp -= 2 / 16.0f; } + if (mob->getAnimOverrideBitmask() & (1 << HumanoidModel::eAnim_SmallModel)) + { + if (mob->isRiding()) + { + std::shared_ptr ridingEntity = mob->riding; + if (ridingEntity != nullptr) // Safety check; + { + if (ridingEntity->instanceof(eTYPE_BOAT)) + { + yp += 0.25f; // reverts the change in Boat.cpp for smaller models. + } + } + } + } + // Check if an idle animation is needed if(mob->getAnimOverrideBitmask()&(1<arm0->render(1 / 16.0f,true); } + + + //Render custom skin boxes on viewmodel - Botch + vector* additionalModelParts = Minecraft::GetInstance()->player->GetAdditionalModelParts(); + if (!additionalModelParts) return; //If there are no custom boxes, return. This fixes bug where the game will crash if you select a skin with no additional boxes. + vector armchildren = humanoidModel->arm0->children; + std::unordered_set additionalModelPartSet(additionalModelParts->begin(), additionalModelParts->end()); + for (const auto& x : armchildren) { + if (x) { + if (additionalModelPartSet.find(x) != additionalModelPartSet.end()) { //This is to verify box is still actually on current skin - Botch + glPushMatrix(); + //We need to transform to match offset of arm - Botch + glTranslatef(-5 * 0.0625f, 2 * 0.0625f, 0); + glRotatef(0.1 * (180.0f / PI), 0, 0, 1); + x->visible = true; + x->render(1.0f / 16.0f, true); + x->visible = false; + glPopMatrix(); + } + } + } + + } void PlayerRenderer::setupPosition(shared_ptr _mob, double x, double y, double z) @@ -580,4 +618,4 @@ ResourceLocation *PlayerRenderer::getTextureLocation(shared_ptr entity) { shared_ptr player = dynamic_pointer_cast(entity); return new ResourceLocation(static_cast<_TEXTURE_NAME>(player->getTexture())); -} \ No newline at end of file +} diff --git a/Minecraft.Client/Screen.cpp b/Minecraft.Client/Screen.cpp index 041f8175..7966c5c9 100644 --- a/Minecraft.Client/Screen.cpp +++ b/Minecraft.Client/Screen.cpp @@ -204,7 +204,7 @@ void Screen::updateEvents() // Map to Screen::keyPressed int mappedKey = -1; wchar_t ch = 0; - if (vk == VK_ESCAPE) mappedKey = Keyboard::KEY_ESCAPE; + if (vk == VK_ESCAPE) mappedKey = Keyboard::KEY_ESCAPE; else if (vk == VK_RETURN) mappedKey = Keyboard::KEY_RETURN; else if (vk == VK_BACK) mappedKey = Keyboard::KEY_BACK; else if (vk == VK_UP) mappedKey = Keyboard::KEY_UP; diff --git a/Minecraft.Client/ServerLevel.cpp b/Minecraft.Client/ServerLevel.cpp index a2596911..9d5ec908 100644 --- a/Minecraft.Client/ServerLevel.cpp +++ b/Minecraft.Client/ServerLevel.cpp @@ -678,7 +678,7 @@ bool ServerLevel::tickPendingTicks(bool force) } else { - addToTickNextTick(td.x, td.y, td.z, td.tileId, 0); + forceAddTileTick(td.x, td.y, td.z, td.tileId, 0, td.priorityTilt); } } diff --git a/Minecraft.Client/ServerPlayer.cpp b/Minecraft.Client/ServerPlayer.cpp index c7ff4fda..f57e8a3c 100644 --- a/Minecraft.Client/ServerPlayer.cpp +++ b/Minecraft.Client/ServerPlayer.cpp @@ -146,7 +146,8 @@ void ServerPlayer::flagEntitiesToBeRemoved(unsigned int *flags, bool *removedFou if( ( *removedFound ) == false ) { *removedFound = true; - memset(flags, 0, 2048/32); + // before this left 192 bytes uninitialized!!!!! + memset(flags, 0, (2048 / 32) * sizeof(unsigned int)); } for(int index : entitiesToRemove) @@ -376,6 +377,9 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) // connection->done); // } +#ifdef MINECRAFT_SERVER_BUILD + if (dontDelayChunks || (canSendToPlayer && !connection->done)) +#else if( dontDelayChunks || (canSendToPlayer && #ifdef _XBOX_ONE @@ -390,21 +394,22 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) #endif //(tickCount - lastBrupSendTickCount) > (connection->getNetworkPlayer()->GetCurrentRtt()>>4) && !connection->done) ) - { - lastBrupSendTickCount = tickCount; - okToSend = true; - MinecraftServer::chunkPacketManagement_DidSendTo(connection->getNetworkPlayer()); +#endif + { + lastBrupSendTickCount = tickCount; + okToSend = true; + MinecraftServer::chunkPacketManagement_DidSendTo(connection->getNetworkPlayer()); -// static unordered_map mapLastTime; -// int64_t thisTime = System::currentTimeMillis(); -// int64_t lastTime = mapLastTime[connection->getNetworkPlayer()->GetUID().toString()]; -// app.DebugPrintf(" - OK to send (%d ms since last)\n", thisTime - lastTime); -// mapLastTime[connection->getNetworkPlayer()->GetUID().toString()] = thisTime; - } - else - { - // app.DebugPrintf(" - \n"); - } + // static unordered_map mapLastTime; + // int64_t thisTime = System::currentTimeMillis(); + // int64_t lastTime = mapLastTime[connection->getNetworkPlayer()->GetUID().toString()]; + // app.DebugPrintf(" - OK to send (%d ms since last)\n", thisTime - lastTime); + // mapLastTime[connection->getNetworkPlayer()->GetUID().toString()] = thisTime; + } + else + { + // app.DebugPrintf(" - \n"); + } } if (okToSend) diff --git a/Minecraft.Client/ServerPlayerGameMode.cpp b/Minecraft.Client/ServerPlayerGameMode.cpp index d2dcaaf6..041487f5 100644 --- a/Minecraft.Client/ServerPlayerGameMode.cpp +++ b/Minecraft.Client/ServerPlayerGameMode.cpp @@ -176,31 +176,29 @@ void ServerPlayerGameMode::stopDestroyBlock(int x, int y, int z) { if (x == xDestroyBlock && y == yDestroyBlock && z == zDestroyBlock) { - // int ticksSpentDestroying = gameTicks - destroyProgressStart; - int t = level->getTile(x, y, z); if (t != 0) { Tile *tile = Tile::tiles[t]; - - // MGH - removed checking for the destroy progress here, it has already been checked on the client before it sent the packet. - // fixes issues with this failing to destroy because of packets bunching up - // float destroyProgress = tile->getDestroyProgress(player, player->level, x, y, z) * (ticksSpentDestroying + 1); - // if (destroyProgress >= .7f || bIgnoreDestroyProgress) + // Anti-cheat: re-check destroy progress on the server for STOP_DESTROY. + int ticksSpentDestroying = gameTicks - destroyProgressStart; + float destroyProgress = tile->getDestroyProgress(player, player->level, x, y, z) * (ticksSpentDestroying + 1); + if (destroyProgress >= 1.0f) { isDestroyingBlock = false; level->destroyTileProgress(player->entityId, x, y, z, -1); destroyBlock(x, y, z); } - // else if (!hasDelayedDestroy) - // { - // isDestroyingBlock = false; - // hasDelayedDestroy = true; - // delayedDestroyX = x; - // delayedDestroyY = y; - // delayedDestroyZ = z; - // delayedTickStart = destroyProgressStart; - // } + else if (!hasDelayedDestroy) + { + // Keep server-authoritative mining while allowing legit latency to finish via delayed tick progression. + isDestroyingBlock = false; + hasDelayedDestroy = true; + delayedDestroyX = x; + delayedDestroyY = y; + delayedDestroyZ = z; + delayedTickStart = destroyProgressStart; + } } } } @@ -393,4 +391,4 @@ void ServerPlayerGameMode::setGameRules(GameRulesInstance *rules) { if(m_gameRules != nullptr) delete m_gameRules; m_gameRules = rules; -} \ No newline at end of file +} diff --git a/Minecraft.Client/TrackedEntity.cpp b/Minecraft.Client/TrackedEntity.cpp index 3aa33248..3ecd6678 100644 --- a/Minecraft.Client/TrackedEntity.cpp +++ b/Minecraft.Client/TrackedEntity.cpp @@ -653,11 +653,14 @@ shared_ptr TrackedEntity::getAddEntityPacket() PlayerUID xuid = INVALID_XUID; PlayerUID OnlineXuid = INVALID_XUID; + // do not pass xuid/onlinexuid to clients if dedicated server +#ifndef MINECRAFT_SERVER_BUILD if( player != nullptr ) { xuid = player->getXuid(); OnlineXuid = player->getOnlineXuid(); } +#endif // 4J Added yHeadRotp param to fix #102563 - TU12: Content: Gameplay: When one of the Players is idle for a few minutes his head turns 180 degrees. return std::make_shared(player, xuid, OnlineXuid, xp, yp, zp, yRotp, xRotp, yHeadRotp); } diff --git a/Minecraft.Client/Windows64/Iggy/lib/redist64/iggy_w64.dll b/Minecraft.Client/Windows64/Iggy/lib/redist64/iggy_w64.dll index bd2cbd7e..43430508 100644 Binary files a/Minecraft.Client/Windows64/Iggy/lib/redist64/iggy_w64.dll and b/Minecraft.Client/Windows64/Iggy/lib/redist64/iggy_w64.dll differ diff --git a/Minecraft.Client/Windows64/KeyboardMouseInput.cpp b/Minecraft.Client/Windows64/KeyboardMouseInput.cpp index 54191ebc..be6efe90 100644 --- a/Minecraft.Client/Windows64/KeyboardMouseInput.cpp +++ b/Minecraft.Client/Windows64/KeyboardMouseInput.cpp @@ -234,6 +234,13 @@ bool KeyboardMouseInput::IsKeyReleased(int vkCode) const return false; } +int KeyboardMouseInput::GetPressedKey() const +{ + for (int i = 0; i < MAX_KEYS; ++i) + if (m_keyPressed[i]) return i; + return 0; +} + bool KeyboardMouseInput::IsMouseButtonDown(int button) const { if (button >= 0 && button < MAX_MOUSE_BUTTONS) diff --git a/Minecraft.Client/Windows64/KeyboardMouseInput.h b/Minecraft.Client/Windows64/KeyboardMouseInput.h index 0f14dfa1..e8b5f588 100644 --- a/Minecraft.Client/Windows64/KeyboardMouseInput.h +++ b/Minecraft.Client/Windows64/KeyboardMouseInput.h @@ -25,12 +25,20 @@ public: static const int KEY_DROP = 'Q'; static const int KEY_CRAFTING = 'C'; static const int KEY_CRAFTING_ALT = 'R'; + static const int KEY_CHAT = 'T'; static const int KEY_CONFIRM = VK_RETURN; static const int KEY_CANCEL = VK_ESCAPE; static const int KEY_PAUSE = VK_ESCAPE; - static const int KEY_THIRD_PERSON = VK_F5; + static const int KEY_TOGGLE_HUD = VK_F1; static const int KEY_DEBUG_INFO = VK_F3; static const int KEY_DEBUG_MENU = VK_F4; + static const int KEY_THIRD_PERSON = VK_F5; + static const int KEY_DEBUG_CONSOLE = VK_F6; + static const int KEY_HOST_SETTINGS = VK_TAB; + static const int KEY_FULLSCREEN = VK_F11; + + // todo: implement and shi + static const int KEY_SCREENSHOT = VK_F2; void Init(); void Tick(); @@ -48,6 +56,8 @@ public: bool IsKeyPressed(int vkCode) const; bool IsKeyReleased(int vkCode) const; + int GetPressedKey() const; + bool IsMouseButtonDown(int button) const; bool IsMouseButtonPressed(int button) const; bool IsMouseButtonReleased(int button) const; diff --git a/Minecraft.Client/Windows64/Network/WinsockNetLayer.cpp b/Minecraft.Client/Windows64/Network/WinsockNetLayer.cpp index 28d29504..acc043e5 100644 --- a/Minecraft.Client/Windows64/Network/WinsockNetLayer.cpp +++ b/Minecraft.Client/Windows64/Network/WinsockNetLayer.cpp @@ -8,11 +8,20 @@ #include "WinsockNetLayer.h" #include "..\..\Common\Network\PlatformNetworkManagerStub.h" #include "..\..\..\Minecraft.World\Socket.h" +#if defined(MINECRAFT_SERVER_BUILD) +#include "..\..\..\Minecraft.Server\Access\Access.h" +#include "..\..\..\Minecraft.Server\ServerLogManager.h" +#endif #include "..\..\..\Minecraft.World\DisconnectPacket.h" #include "..\..\Minecraft.h" #include "..\4JLibs\inc\4J_Profile.h" +#include + static bool RecvExact(SOCKET sock, BYTE* buf, int len); +#if defined(MINECRAFT_SERVER_BUILD) +static bool TryGetNumericRemoteIp(const sockaddr_in &remoteAddress, std::string *outIp); +#endif SOCKET WinsockNetLayer::s_listenSocket = INVALID_SOCKET; SOCKET WinsockNetLayer::s_hostConnectionSocket = INVALID_SOCKET; @@ -58,6 +67,16 @@ SOCKET WinsockNetLayer::s_splitScreenSocket[XUSER_MAX_COUNT] = { INVALID_SOCKET, BYTE WinsockNetLayer::s_splitScreenSmallId[XUSER_MAX_COUNT] = { 0xFF, 0xFF, 0xFF, 0xFF }; HANDLE WinsockNetLayer::s_splitScreenRecvThread[XUSER_MAX_COUNT] = {nullptr, nullptr, nullptr, nullptr}; +// async stuff +HANDLE WinsockNetLayer::s_joinThread = nullptr; +volatile WinsockNetLayer::eJoinState WinsockNetLayer::s_joinState = WinsockNetLayer::eJoinState_Idle; +volatile int WinsockNetLayer::s_joinAttempt = 0; +volatile bool WinsockNetLayer::s_joinCancel = false; +char WinsockNetLayer::s_joinIP[256] = {}; +int WinsockNetLayer::s_joinPort = 0; +BYTE WinsockNetLayer::s_joinAssignedSmallId = 0; +DisconnectPacket::eDisconnectReason WinsockNetLayer::s_joinRejectReason = DisconnectPacket::eDisconnect_Quitting; + bool g_Win64MultiplayerHost = false; bool g_Win64MultiplayerJoin = false; int g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; @@ -65,6 +84,7 @@ char g_Win64MultiplayerIP[256] = "127.0.0.1"; bool g_Win64DedicatedServer = false; int g_Win64DedicatedServerPort = WIN64_NET_DEFAULT_PORT; char g_Win64DedicatedServerBindIP[256] = ""; +bool g_Win64DedicatedServerLanAdvertise = true; bool WinsockNetLayer::Initialize() { @@ -90,7 +110,11 @@ bool WinsockNetLayer::Initialize() s_initialized = true; - StartDiscovery(); + // Dedicated Server does not use LAN session discovery and therefore does not initiate discovery. + if (!g_Win64DedicatedServer) + { + StartDiscovery(); + } return true; } @@ -100,6 +124,15 @@ void WinsockNetLayer::Shutdown() StopAdvertising(); StopDiscovery(); + s_joinCancel = true; + if (s_joinThread != nullptr) + { + WaitForSingleObject(s_joinThread, 5000); + CloseHandle(s_joinThread); + s_joinThread = nullptr; + } + s_joinState = eJoinState_Idle; + s_active = false; s_connected = false; @@ -392,6 +425,11 @@ bool WinsockNetLayer::JoinGame(const char* ip, int port) } s_localSmallId = assignedSmallId; + // Save the host IP and port so JoinSplitScreen can connect to the same host + // regardless of how the connection was initiated (UI vs command line). + strncpy_s(g_Win64MultiplayerIP, sizeof(g_Win64MultiplayerIP), ip, _TRUNCATE); + g_Win64MultiplayerPort = port; + app.DebugPrintf("Win64 LAN: Connected to %s:%d, assigned smallId=%d\n", ip, port, s_localSmallId); s_active = true; @@ -402,6 +440,215 @@ bool WinsockNetLayer::JoinGame(const char* ip, int port) return true; } +bool WinsockNetLayer::BeginJoinGame(const char* ip, int port) +{ + if (!s_initialized && !Initialize()) return false; + + // if there isnt any cleanup it sometime caused issues. Oops + CancelJoinGame(); + if (s_joinThread != nullptr) + { + WaitForSingleObject(s_joinThread, 5000); + CloseHandle(s_joinThread); + s_joinThread = nullptr; + } + + s_isHost = false; + s_hostSmallId = 0; + s_connected = false; + s_active = false; + + if (s_hostConnectionSocket != INVALID_SOCKET) + { + closesocket(s_hostConnectionSocket); + s_hostConnectionSocket = INVALID_SOCKET; + } + + if (s_clientRecvThread != nullptr) + { + WaitForSingleObject(s_clientRecvThread, 5000); + CloseHandle(s_clientRecvThread); + s_clientRecvThread = nullptr; + } + + strncpy_s(s_joinIP, sizeof(s_joinIP), ip, _TRUNCATE); + s_joinPort = port; + s_joinAttempt = 0; + s_joinCancel = false; + s_joinAssignedSmallId = 0; + s_joinRejectReason = DisconnectPacket::eDisconnect_Quitting; + s_joinState = eJoinState_Connecting; + + s_joinThread = CreateThread(nullptr, 0, JoinThreadProc, nullptr, 0, nullptr); + if (s_joinThread == nullptr) + { + s_joinState = eJoinState_Failed; + return false; + } + return true; +} + +DWORD WINAPI WinsockNetLayer::JoinThreadProc(LPVOID param) +{ + struct addrinfo hints = {}; + struct addrinfo* result = nullptr; + + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + char portStr[16]; + sprintf_s(portStr, "%d", s_joinPort); + + int iResult = getaddrinfo(s_joinIP, portStr, &hints, &result); + if (iResult != 0) + { + app.DebugPrintf("getaddrinfo failed for %s:%d - %d\n", s_joinIP, s_joinPort, iResult); + s_joinState = eJoinState_Failed; + return 0; + } + + bool connected = false; + BYTE assignedSmallId = 0; + SOCKET sock = INVALID_SOCKET; + + for (int attempt = 0; attempt < JOIN_MAX_ATTEMPTS; ++attempt) + { + if (s_joinCancel) + { + freeaddrinfo(result); + s_joinState = eJoinState_Cancelled; + return 0; + } + + s_joinAttempt = attempt + 1; + + sock = socket(result->ai_family, result->ai_socktype, result->ai_protocol); + if (sock == INVALID_SOCKET) + { + app.DebugPrintf("socket() failed: %d\n", WSAGetLastError()); + break; + } + + int noDelay = 1; + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (const char*)&noDelay, sizeof(noDelay)); + + iResult = connect(sock, result->ai_addr, static_cast(result->ai_addrlen)); + if (iResult == SOCKET_ERROR) + { + int err = WSAGetLastError(); + app.DebugPrintf("connect() to %s:%d failed (attempt %d/%d): %d\n", s_joinIP, s_joinPort, attempt + 1, JOIN_MAX_ATTEMPTS, err); + closesocket(sock); + sock = INVALID_SOCKET; + for (int w = 0; w < 4 && !s_joinCancel; w++) + Sleep(50); + continue; + } + + BYTE assignBuf[1]; + int bytesRecv = recv(sock, (char*)assignBuf, 1, 0); + if (bytesRecv != 1) + { + app.DebugPrintf("failed to receive small id assignment from host (attempt %d/%d)\n", attempt + 1, JOIN_MAX_ATTEMPTS); + closesocket(sock); + sock = INVALID_SOCKET; + for (int w = 0; w < 4 && !s_joinCancel; w++) + Sleep(50); + continue; + } + + if (assignBuf[0] == WIN64_SMALLID_REJECT) + { + BYTE rejectBuf[5]; + if (!RecvExact(sock, rejectBuf, 5)) + { + app.DebugPrintf("failed to receive reject reason from host (?)\n"); + closesocket(sock); + sock = INVALID_SOCKET; + for (int w = 0; w < 4 && !s_joinCancel; w++) + Sleep(50); + continue; + } + int reason = ((rejectBuf[1] & 0xff) << 24) | ((rejectBuf[2] & 0xff) << 16) | + ((rejectBuf[3] & 0xff) << 8) | (rejectBuf[4] & 0xff); + s_joinRejectReason = (DisconnectPacket::eDisconnectReason)reason; + closesocket(sock); + freeaddrinfo(result); + s_joinState = eJoinState_Rejected; + return 0; + } + + assignedSmallId = assignBuf[0]; + connected = true; + break; + } + freeaddrinfo(result); + + if (s_joinCancel) + { + if (sock != INVALID_SOCKET) closesocket(sock); + s_joinState = eJoinState_Cancelled; + return 0; + } + + if (!connected) + { + s_joinState = eJoinState_Failed; + return 0; + } + + s_hostConnectionSocket = sock; + s_joinAssignedSmallId = assignedSmallId; + s_joinState = eJoinState_Success; + return 0; +} + +void WinsockNetLayer::CancelJoinGame() +{ + if (s_joinState == eJoinState_Connecting) + { + s_joinCancel = true; + } + else if (s_joinState == eJoinState_Success) + { + // fix a race cond + if (s_hostConnectionSocket != INVALID_SOCKET) + { + closesocket(s_hostConnectionSocket); + s_hostConnectionSocket = INVALID_SOCKET; + } + s_joinState = eJoinState_Cancelled; + } +} + +bool WinsockNetLayer::FinalizeJoin() +{ + if (s_joinState != eJoinState_Success) + return false; + + s_localSmallId = s_joinAssignedSmallId; + + strncpy_s(g_Win64MultiplayerIP, sizeof(g_Win64MultiplayerIP), s_joinIP, _TRUNCATE); + g_Win64MultiplayerPort = s_joinPort; + + app.DebugPrintf("connected to %s:%d, assigned smallId=%d\n", s_joinIP, s_joinPort, s_localSmallId); + + s_active = true; + s_connected = true; + + s_clientRecvThread = CreateThread(nullptr, 0, ClientRecvThreadProc, nullptr, 0, nullptr); + + if (s_joinThread != nullptr) + { + WaitForSingleObject(s_joinThread, 2000); + CloseHandle(s_joinThread); + s_joinThread = nullptr; + } + + s_joinState = eJoinState_Idle; + return true; +} + bool WinsockNetLayer::SendOnSocket(SOCKET sock, const void* data, int dataSize) { if (sock == INVALID_SOCKET || dataSize <= 0 || dataSize > WIN64_NET_MAX_PACKET_SIZE) return false; @@ -507,6 +754,27 @@ static bool RecvExact(SOCKET sock, BYTE* buf, int len) return true; } +#if defined(MINECRAFT_SERVER_BUILD) +static bool TryGetNumericRemoteIp(const sockaddr_in &remoteAddress, std::string *outIp) +{ + if (outIp == nullptr) + { + return false; + } + + outIp->clear(); + char ipBuffer[64] = {}; + const char *ip = inet_ntop(AF_INET, (void *)&remoteAddress.sin_addr, ipBuffer, sizeof(ipBuffer)); + if (ip == nullptr || ip[0] == 0) + { + return false; + } + + *outIp = ip; + return true; +} +#endif + void WinsockNetLayer::HandleDataReceived(BYTE fromSmallId, BYTE toSmallId, unsigned char* data, unsigned int dataSize) { INetworkPlayer* pPlayerFrom = g_NetworkManager.GetPlayerBySmallId(fromSmallId); @@ -541,7 +809,10 @@ DWORD WINAPI WinsockNetLayer::AcceptThreadProc(LPVOID param) { while (s_active) { - SOCKET clientSocket = accept(s_listenSocket, nullptr, nullptr); + sockaddr_in remoteAddress; + ZeroMemory(&remoteAddress, sizeof(remoteAddress)); + int remoteAddressLength = sizeof(remoteAddress); + SOCKET clientSocket = accept(s_listenSocket, (sockaddr*)&remoteAddress, &remoteAddressLength); if (clientSocket == INVALID_SOCKET) { if (s_active) @@ -552,10 +823,36 @@ DWORD WINAPI WinsockNetLayer::AcceptThreadProc(LPVOID param) int noDelay = 1; setsockopt(clientSocket, IPPROTO_TCP, TCP_NODELAY, (const char*)&noDelay, sizeof(noDelay)); +#if defined(MINECRAFT_SERVER_BUILD) + std::string remoteIp; + const bool hasRemoteIp = TryGetNumericRemoteIp(remoteAddress, &remoteIp); + const char *remoteIpForLog = hasRemoteIp ? remoteIp.c_str() : "unknown"; + if (g_Win64DedicatedServer) + { + ServerRuntime::ServerLogManager::OnIncomingTcpConnection(remoteIpForLog); + if (hasRemoteIp && ServerRuntime::Access::IsIpBanned(remoteIp)) + { + ServerRuntime::ServerLogManager::OnRejectedTcpConnection(remoteIpForLog, ServerRuntime::ServerLogManager::eTcpRejectReason_BannedIp); + SendRejectWithReason(clientSocket, DisconnectPacket::eDisconnect_Banned); + closesocket(clientSocket); + continue; + } + } +#endif + extern QNET_STATE _iQNetStubState; if (_iQNetStubState != QNET_STATE_GAME_PLAY) { - app.DebugPrintf("Win64 LAN: Rejecting connection, game not ready\n"); +#if defined(MINECRAFT_SERVER_BUILD) + if (g_Win64DedicatedServer) + { + ServerRuntime::ServerLogManager::OnRejectedTcpConnection(remoteIpForLog, ServerRuntime::ServerLogManager::eTcpRejectReason_GameNotReady); + } + else +#endif + { + app.DebugPrintf("Win64 LAN: Rejecting connection, game not ready\n"); + } closesocket(clientSocket); continue; } @@ -563,7 +860,16 @@ DWORD WINAPI WinsockNetLayer::AcceptThreadProc(LPVOID param) extern CPlatformNetworkManagerStub* g_pPlatformNetworkManager; if (g_pPlatformNetworkManager != nullptr && !g_pPlatformNetworkManager->CanAcceptMoreConnections()) { - app.DebugPrintf("Win64 LAN: Rejecting connection, server at max players\n"); +#if defined(MINECRAFT_SERVER_BUILD) + if (g_Win64DedicatedServer) + { + ServerRuntime::ServerLogManager::OnRejectedTcpConnection(remoteIpForLog, ServerRuntime::ServerLogManager::eTcpRejectReason_ServerFull); + } + else +#endif + { + app.DebugPrintf("Win64 LAN: Rejecting connection, server at max players\n"); + } SendRejectWithReason(clientSocket, DisconnectPacket::eDisconnect_ServerFull); closesocket(clientSocket); continue; @@ -583,7 +889,16 @@ DWORD WINAPI WinsockNetLayer::AcceptThreadProc(LPVOID param) else { LeaveCriticalSection(&s_freeSmallIdLock); - app.DebugPrintf("Win64 LAN: Server full, rejecting connection\n"); +#if defined(MINECRAFT_SERVER_BUILD) + if (g_Win64DedicatedServer) + { + ServerRuntime::ServerLogManager::OnRejectedTcpConnection(remoteIpForLog, ServerRuntime::ServerLogManager::eTcpRejectReason_ServerFull); + } + else +#endif + { + app.DebugPrintf("Win64 LAN: Server full, rejecting connection\n"); + } SendRejectWithReason(clientSocket, DisconnectPacket::eDisconnect_ServerFull); closesocket(clientSocket); continue; @@ -611,7 +926,16 @@ DWORD WINAPI WinsockNetLayer::AcceptThreadProc(LPVOID param) int connIdx = static_cast(s_connections.size()) - 1; LeaveCriticalSection(&s_connectionsLock); - app.DebugPrintf("Win64 LAN: Client connected, assigned smallId=%d\n", assignedSmallId); +#if defined(MINECRAFT_SERVER_BUILD) + if (g_Win64DedicatedServer) + { + ServerRuntime::ServerLogManager::OnAcceptedTcpConnection(assignedSmallId, remoteIpForLog); + } + else +#endif + { + app.DebugPrintf("Win64 LAN: Client connected, assigned smallId=%d\n", assignedSmallId); + } EnterCriticalSection(&s_smallIdToSocketLock); s_smallIdToSocket[assignedSmallId] = clientSocket; @@ -733,6 +1057,11 @@ bool WinsockNetLayer::PopDisconnectedSmallId(BYTE* outSmallId) void WinsockNetLayer::PushFreeSmallId(BYTE smallId) { + // SmallIds 0..(XUSER_MAX_COUNT-1) are permanently reserved for the host's + // local pads and must never be recycled to remote clients. + if (smallId < (BYTE)XUSER_MAX_COUNT) + return; + EnterCriticalSection(&s_freeSmallIdLock); // Guard against double-recycle: the reconnect path (queueSmallIdForRecycle) and // the DoWork disconnect path can both push the same smallId. If we allow duplicates, @@ -1233,4 +1562,25 @@ DWORD WINAPI WinsockNetLayer::DiscoveryThreadProc(LPVOID param) return 0; } +// some lazy helper funcs +WinsockNetLayer::eJoinState WinsockNetLayer::GetJoinState() +{ + return s_joinState; +} + +int WinsockNetLayer::GetJoinAttempt() +{ + return s_joinAttempt; +} + +int WinsockNetLayer::GetJoinMaxAttempts() +{ + return JOIN_MAX_ATTEMPTS; +} + +DisconnectPacket::eDisconnectReason WinsockNetLayer::GetJoinRejectReason() +{ + return s_joinRejectReason; +} + #endif diff --git a/Minecraft.Client/Windows64/Network/WinsockNetLayer.h b/Minecraft.Client/Windows64/Network/WinsockNetLayer.h index c5d68975..8a11e391 100644 --- a/Minecraft.Client/Windows64/Network/WinsockNetLayer.h +++ b/Minecraft.Client/Windows64/Network/WinsockNetLayer.h @@ -21,6 +21,8 @@ class Socket; +#include "..\..\..\Minecraft.World\DisconnectPacket.h" + #pragma pack(push, 1) struct Win64LANBroadcast { @@ -69,6 +71,23 @@ public: static bool HostGame(int port, const char* bindIp = nullptr); static bool JoinGame(const char* ip, int port); + enum eJoinState + { + eJoinState_Idle, + eJoinState_Connecting, + eJoinState_Success, + eJoinState_Failed, + eJoinState_Rejected, + eJoinState_Cancelled + }; + static bool BeginJoinGame(const char* ip, int port); + static void CancelJoinGame(); + static eJoinState GetJoinState(); + static int GetJoinAttempt(); + static int GetJoinMaxAttempts(); + static DisconnectPacket::eDisconnectReason GetJoinRejectReason(); + static bool FinalizeJoin(); + static bool SendToSmallId(BYTE targetSmallId, const void* data, int dataSize); static bool SendOnSocket(SOCKET sock, const void* data, int dataSize); @@ -112,6 +131,17 @@ private: static DWORD WINAPI SplitScreenRecvThreadProc(LPVOID param); static DWORD WINAPI AdvertiseThreadProc(LPVOID param); static DWORD WINAPI DiscoveryThreadProc(LPVOID param); + static DWORD WINAPI JoinThreadProc(LPVOID param); + + static HANDLE s_joinThread; + static volatile eJoinState s_joinState; + static volatile int s_joinAttempt; + static volatile bool s_joinCancel; + static char s_joinIP[256]; + static int s_joinPort; + static BYTE s_joinAssignedSmallId; + static DisconnectPacket::eDisconnectReason s_joinRejectReason; + static const int JOIN_MAX_ATTEMPTS = 4; static SOCKET s_listenSocket; static SOCKET s_hostConnectionSocket; @@ -170,5 +200,6 @@ extern char g_Win64MultiplayerIP[256]; extern bool g_Win64DedicatedServer; extern int g_Win64DedicatedServerPort; extern char g_Win64DedicatedServerBindIP[256]; +extern bool g_Win64DedicatedServerLanAdvertise; #endif diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index 70aeb22b..bee49df0 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -36,6 +36,7 @@ //#include "NetworkManager.h" #include "..\..\Minecraft.Client\Tesselator.h" #include "..\..\Minecraft.Client\Options.h" +#include "..\Gui.h" #include "Sentient\SentientManager.h" #include "..\..\Minecraft.World\IntCache.h" #include "..\Textures.h" @@ -107,6 +108,7 @@ int g_iScreenHeight = 1080; // always matches the current window, even after a resize. int g_rScreenWidth = 1920; int g_rScreenHeight = 1080; +static bool f3ComboUsed = false; float g_iAspectRatio = static_cast(g_iScreenWidth) / g_iScreenHeight; static bool g_bResizeReady = false; @@ -121,7 +123,6 @@ static WINDOWPLACEMENT g_wpPrev = { sizeof(g_wpPrev) }; struct Win64LaunchOptions { int screenMode; - bool serverMode; bool fullscreen; }; @@ -207,13 +208,9 @@ static Win64LaunchOptions ParseLaunchOptions() { Win64LaunchOptions options = {}; options.screenMode = 0; - options.serverMode = false; g_Win64MultiplayerJoin = false; g_Win64MultiplayerPort = WIN64_NET_DEFAULT_PORT; - g_Win64DedicatedServer = false; - g_Win64DedicatedServerPort = WIN64_NET_DEFAULT_PORT; - g_Win64DedicatedServerBindIP[0] = 0; int argc = 0; LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc); @@ -226,17 +223,6 @@ static Win64LaunchOptions ParseLaunchOptions() options.screenMode = argv[1][0] - L'0'; } - for (int i = 1; i < argc; ++i) - { - if (_wcsicmp(argv[i], L"-server") == 0) - { - options.serverMode = true; - break; - } - } - - g_Win64DedicatedServer = options.serverMode; - for (int i = 1; i < argc; ++i) { if (_wcsicmp(argv[i], L"-name") == 0 && (i + 1) < argc) @@ -247,15 +233,8 @@ static Win64LaunchOptions ParseLaunchOptions() { char ipBuf[256]; CopyWideArgToAnsi(argv[++i], ipBuf, sizeof(ipBuf)); - if (options.serverMode) - { - strncpy_s(g_Win64DedicatedServerBindIP, sizeof(g_Win64DedicatedServerBindIP), ipBuf, _TRUNCATE); - } - else - { - strncpy_s(g_Win64MultiplayerIP, sizeof(g_Win64MultiplayerIP), ipBuf, _TRUNCATE); - g_Win64MultiplayerJoin = true; - } + strncpy_s(g_Win64MultiplayerIP, sizeof(g_Win64MultiplayerIP), ipBuf, _TRUNCATE); + g_Win64MultiplayerJoin = true; } else if (_wcsicmp(argv[i], L"-port") == 0 && (i + 1) < argc) { @@ -263,10 +242,7 @@ static Win64LaunchOptions ParseLaunchOptions() const long port = wcstol(argv[++i], &endPtr, 10); if (endPtr != argv[i] && *endPtr == 0 && port > 0 && port <= 65535) { - if (options.serverMode) - g_Win64DedicatedServerPort = static_cast(port); - else - g_Win64MultiplayerPort = static_cast(port); + g_Win64MultiplayerPort = static_cast(port); } } else if (_wcsicmp(argv[i], L"-fullscreen") == 0) @@ -277,36 +253,6 @@ static Win64LaunchOptions ParseLaunchOptions() return options; } -static BOOL WINAPI HeadlessServerCtrlHandler(DWORD ctrlType) -{ - switch (ctrlType) - { - case CTRL_C_EVENT: - case CTRL_BREAK_EVENT: - case CTRL_CLOSE_EVENT: - case CTRL_SHUTDOWN_EVENT: - app.m_bShutdown = true; - MinecraftServer::HaltServer(); - return TRUE; - default: - return FALSE; - } -} - -static void SetupHeadlessServerConsole() -{ - if (AllocConsole()) - { - FILE* stream = nullptr; - freopen_s(&stream, "CONIN$", "r", stdin); - freopen_s(&stream, "CONOUT$", "w", stdout); - freopen_s(&stream, "CONOUT$", "w", stderr); - SetConsoleTitleA("Minecraft Server"); - } - - SetConsoleCtrlHandler(HeadlessServerCtrlHandler, TRUE); -} - void DefineActions(void) { // The app needs to define the actions required, and the possible mappings for these @@ -526,6 +472,8 @@ IDXGISwapChain* g_pSwapChain = nullptr; ID3D11RenderTargetView* g_pRenderTargetView = nullptr; ID3D11DepthStencilView* g_pDepthStencilView = nullptr; ID3D11Texture2D* g_pDepthStencilBuffer = nullptr; +static const float kClearColorWhite[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; +static const float kClearColorBlack[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; // // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) @@ -717,7 +665,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } break; default: - return DefWindowProc(hWnd, message, wParam, lParam); + return DefWindowProcW(hWnd, message, wParam, lParam); } return 0; } @@ -729,23 +677,23 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) // ATOM MyRegisterClass(HINSTANCE hInstance) { - WNDCLASSEX wcex; + WNDCLASSEXW wcex; - wcex.cbSize = sizeof(WNDCLASSEX); + wcex.cbSize = sizeof(WNDCLASSEXW); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; - wcex.hIcon = LoadIcon(hInstance, "Minecraft"); + wcex.hIcon = LoadIconW(hInstance, L"Minecraft"); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); - wcex.lpszMenuName = "Minecraft"; - wcex.lpszClassName = "MinecraftClass"; + wcex.lpszMenuName = L"Minecraft"; + wcex.lpszClassName = L"MinecraftClass"; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_MINECRAFTWINDOWS)); - return RegisterClassEx(&wcex); + return RegisterClassExW(&wcex); } // @@ -765,8 +713,8 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) RECT wr = {0, 0, g_rScreenWidth, g_rScreenHeight}; // set the size, but not the position AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); // adjust the size - g_hWnd = CreateWindow( "MinecraftClass", - "Minecraft", + g_hWnd = CreateWindowW( L"MinecraftClass", + L"Minecraft", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, @@ -1350,161 +1298,6 @@ static Minecraft* InitialiseMinecraftRuntime() return pMinecraft; } -static int HeadlessServerConsoleThreadProc(void* lpParameter) -{ - UNREFERENCED_PARAMETER(lpParameter); - - std::string line; - while (!app.m_bShutdown) - { - if (!std::getline(std::cin, line)) - { - if (std::cin.eof()) - { - break; - } - - std::cin.clear(); - Sleep(50); - continue; - } - - wstring command = trimString(convStringToWstring(line)); - if (command.empty()) - continue; - - MinecraftServer* server = MinecraftServer::getInstance(); - if (server != nullptr) - { - server->handleConsoleInput(command, server); - } - } - - return 0; -} - -static int RunHeadlessServer() -{ - SetupHeadlessServerConsole(); - - Settings serverSettings(new File(L"server.properties")); - const wstring configuredBindIp = serverSettings.getString(L"server-ip", L""); - - const char* bindIp = "*"; - if (g_Win64DedicatedServerBindIP[0] != 0) - { - bindIp = g_Win64DedicatedServerBindIP; - } - else if (!configuredBindIp.empty()) - { - bindIp = wstringtochararray(configuredBindIp); - } - - const int port = g_Win64DedicatedServerPort > 0 ? g_Win64DedicatedServerPort : serverSettings.getInt(L"server-port", WIN64_NET_DEFAULT_PORT); - - printf("Starting headless server on %s:%d\n", bindIp, port); - fflush(stdout); - - const Minecraft* pMinecraft = InitialiseMinecraftRuntime(); - if (pMinecraft == nullptr) - { - fprintf(stderr, "Failed to initialise the Minecraft runtime.\n"); - return 1; - } - - app.SetGameHostOption(eGameHostOption_Difficulty, serverSettings.getInt(L"difficulty", 1)); - app.SetGameHostOption(eGameHostOption_Gamertags, 1); - app.SetGameHostOption(eGameHostOption_GameType, serverSettings.getInt(L"gamemode", 0)); - app.SetGameHostOption(eGameHostOption_LevelType, 0); - app.SetGameHostOption(eGameHostOption_Structures, serverSettings.getBoolean(L"generate-structures", true) ? 1 : 0); - app.SetGameHostOption(eGameHostOption_BonusChest, serverSettings.getBoolean(L"bonus-chest", false) ? 1 : 0); - app.SetGameHostOption(eGameHostOption_PvP, serverSettings.getBoolean(L"pvp", true) ? 1 : 0); - app.SetGameHostOption(eGameHostOption_TrustPlayers, serverSettings.getBoolean(L"trust-players", true) ? 1 : 0); - app.SetGameHostOption(eGameHostOption_FireSpreads, serverSettings.getBoolean(L"fire-spreads", true) ? 1 : 0); - app.SetGameHostOption(eGameHostOption_TNT, serverSettings.getBoolean(L"tnt", true) ? 1 : 0); - app.SetGameHostOption(eGameHostOption_HostCanFly, 1); - app.SetGameHostOption(eGameHostOption_HostCanChangeHunger, 1); - app.SetGameHostOption(eGameHostOption_HostCanBeInvisible, 1); - app.SetGameHostOption(eGameHostOption_MobGriefing, 1); - app.SetGameHostOption(eGameHostOption_KeepInventory, 0); - app.SetGameHostOption(eGameHostOption_DoMobSpawning, 1); - app.SetGameHostOption(eGameHostOption_DoMobLoot, 1); - app.SetGameHostOption(eGameHostOption_DoTileDrops, 1); - app.SetGameHostOption(eGameHostOption_NaturalRegeneration, 1); - app.SetGameHostOption(eGameHostOption_DoDaylightCycle, 1); - - MinecraftServer::resetFlags(); - g_NetworkManager.HostGame(0, false, true, MINECRAFT_NET_MAX_PLAYERS, 0); - - if (!WinsockNetLayer::IsActive()) - { - fprintf(stderr, "Failed to bind the server socket on %s:%d.\n", bindIp, port); - return 1; - } - - g_NetworkManager.FakeLocalPlayerJoined(); - - NetworkGameInitData* param = new NetworkGameInitData(); - param->seed = 0; - param->settings = app.GetGameHostOption(eGameHostOption_All); - - g_NetworkManager.ServerStoppedCreate(true); - g_NetworkManager.ServerReadyCreate(true); - - C4JThread* thread = new C4JThread(&CGameNetworkManager::ServerThreadProc, param, "Server", 256 * 1024); - thread->SetProcessor(CPU_CORE_SERVER); - thread->Run(); - - g_NetworkManager.ServerReadyWait(); - g_NetworkManager.ServerReadyDestroy(); - - if (MinecraftServer::serverHalted()) - { - fprintf(stderr, "The server halted during startup.\n"); - g_NetworkManager.LeaveGame(false); - return 1; - } - - app.SetGameStarted(true); - g_NetworkManager.DoWork(); - - printf("Server ready on %s:%d\n", bindIp, port); - printf("Type 'help' for server commands.\n"); - fflush(stdout); - - C4JThread* consoleThread = new C4JThread(&HeadlessServerConsoleThreadProc, nullptr, "Server console", 128 * 1024); - consoleThread->Run(); - - MSG msg = { 0 }; - while (WM_QUIT != msg.message && !app.m_bShutdown && !MinecraftServer::serverHalted()) - { - if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - continue; - } - - app.UpdateTime(); - ProfileManager.Tick(); - StorageManager.Tick(); - RenderManager.Tick(); - ui.tick(); - g_NetworkManager.DoWork(); - app.HandleXuiActions(); - - Sleep(10); - } - - printf("Stopping server...\n"); - fflush(stdout); - - app.m_bShutdown = true; - MinecraftServer::HaltServer(); - g_NetworkManager.LeaveGame(false); - return 0; -} - int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, @@ -1566,11 +1359,8 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, const Win64LaunchOptions launchOptions = ParseLaunchOptions(); ApplyScreenMode(launchOptions.screenMode); - // Ensure uid.dat exists from startup in client mode (before any multiplayer/login path). - if (!launchOptions.serverMode) - { - Win64Xuid::ResolvePersistentXuid(); - } + // Ensure uid.dat exists from startup (before any multiplayer/login path). + Win64Xuid::ResolvePersistentXuid(); // If no username, let's fall back if (g_Win64Username[0] == 0) @@ -1651,7 +1441,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, MyRegisterClass(hInstance); // Perform application initialization: - if (!InitInstance (hInstance, launchOptions.serverMode ? SW_HIDE : nCmdShow)) + if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } @@ -1670,13 +1460,6 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, ToggleFullscreen(); } - if (launchOptions.serverMode) - { - const int serverResult = RunHeadlessServer(); - CleanupDevice(); - return serverResult; - } - #if 0 // Main message loop MSG msg = {0}; @@ -1783,7 +1566,14 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, continue; } + const float* clearColor = app.GetGameStarted() ? kClearColorBlack : kClearColorWhite; + RenderManager.SetClearColour(clearColor); RenderManager.StartFrame(); + if (!app.GetGameStarted()) + { + RenderManager.SetClearColour(kClearColorWhite); // set intro scene background to white + RenderManager.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } #if 0 if(pMinecraft->soundEngine->isStreamingWavebankReady() && !pMinecraft->soundEngine->isPlayingStreamingGameMusic() && @@ -1986,7 +1776,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, } // F1 toggles the HUD - if (g_KBMInput.IsKeyPressed(VK_F1)) + if (g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_TOGGLE_HUD)) { const int primaryPad = ProfileManager.GetPrimaryPad(); const unsigned char displayHud = app.GetGameSettings(primaryPad, eGameSetting_DisplayHUD); @@ -1995,20 +1785,40 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, } // F3 toggles onscreen debug info - if (g_KBMInput.IsKeyPressed(VK_F3)) + if (g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_DEBUG_INFO)) f3ComboUsed = false; + + // f3 combo + if (g_KBMInput.IsKeyDown(KeyboardMouseInput::KEY_DEBUG_INFO)) { - if (const Minecraft* pMinecraft = Minecraft::GetInstance()) + switch (g_KBMInput.GetPressedKey()) { - if (pMinecraft->options) - { - pMinecraft->options->renderDebug = !pMinecraft->options->renderDebug; - } + // advanced tooltips + case 'H': + if (pMinecraft->options && app.GetGameStarted()) + { + pMinecraft->options->advancedTooltips = !pMinecraft->options->advancedTooltips; + pMinecraft->options->save(); + + const wstring msg = wstring(L"Advanced tooltips: ") + (pMinecraft->options->advancedTooltips ? L"shown" : L"hidden"); + const int primaryPad = ProfileManager.GetPrimaryPad(); + if (pMinecraft->gui) pMinecraft->gui->addMessage(msg, primaryPad); + + f3ComboUsed = true; + } + break; } } + // no combo + if (g_KBMInput.IsKeyReleased(KeyboardMouseInput::KEY_DEBUG_INFO) && !f3ComboUsed) + if (pMinecraft->options) + pMinecraft->options->renderDebug = !pMinecraft->options->renderDebug; + + + #ifdef _DEBUG_MENUS_ENABLED // F6 Open debug console - if (g_KBMInput.IsKeyPressed(VK_F6)) + if (g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_DEBUG_CONSOLE)) { static bool s_debugConsole = false; s_debugConsole = !s_debugConsole; @@ -2016,14 +1826,14 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, } #endif - // F11 Toggle fullscreen - if (g_KBMInput.IsKeyPressed(VK_F11)) + // toggle fullscreen + if (g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_FULLSCREEN)) { ToggleFullscreen(); } // TAB opens game info menu. - Vvis :3 - Updated by detectiveren - if (g_KBMInput.IsKeyPressed(VK_TAB) && !ui.GetMenuDisplayed(0)) + if (g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_HOST_SETTINGS) && !ui.GetMenuDisplayed(0)) { if (Minecraft* pMinecraft = Minecraft::GetInstance()) { @@ -2035,7 +1845,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, } // Open chat - if (g_KBMInput.IsKeyPressed('T') && app.GetGameStarted() && !ui.GetMenuDisplayed(0) && pMinecraft->screen == NULL) + if (g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_CHAT) && app.GetGameStarted() && !ui.GetMenuDisplayed(0) && pMinecraft->screen == NULL) { g_KBMInput.ClearCharBuffer(); pMinecraft->setScreen(new ChatScreen()); diff --git a/Minecraft.Client/Windows64Media/DLC/Candy/Data/media.arc b/Minecraft.Client/Windows64Media/DLC/Candy/Data/media.arc index 3868c79d..13cc0b65 100644 Binary files a/Minecraft.Client/Windows64Media/DLC/Candy/Data/media.arc and b/Minecraft.Client/Windows64Media/DLC/Candy/Data/media.arc differ diff --git a/Minecraft.Client/Windows64Media/DLC/Cartoon/Data/media.arc b/Minecraft.Client/Windows64Media/DLC/Cartoon/Data/media.arc index 41213459..3a9b9eb9 100644 Binary files a/Minecraft.Client/Windows64Media/DLC/Cartoon/Data/media.arc and b/Minecraft.Client/Windows64Media/DLC/Cartoon/Data/media.arc differ diff --git a/Minecraft.Client/Windows64Media/DLC/City/Data/media.arc b/Minecraft.Client/Windows64Media/DLC/City/Data/media.arc index 62dc19e7..1c438169 100644 Binary files a/Minecraft.Client/Windows64Media/DLC/City/Data/media.arc and b/Minecraft.Client/Windows64Media/DLC/City/Data/media.arc differ diff --git a/Minecraft.Client/Windows64Media/DLC/Fantasy/Data/media.arc b/Minecraft.Client/Windows64Media/DLC/Fantasy/Data/media.arc index 2690455e..90443efe 100644 Binary files a/Minecraft.Client/Windows64Media/DLC/Fantasy/Data/media.arc and b/Minecraft.Client/Windows64Media/DLC/Fantasy/Data/media.arc differ diff --git a/Minecraft.Client/Windows64Media/DLC/Halloween/Data/media.arc b/Minecraft.Client/Windows64Media/DLC/Halloween/Data/media.arc index 2bb1aaf2..834d8276 100644 Binary files a/Minecraft.Client/Windows64Media/DLC/Halloween/Data/media.arc and b/Minecraft.Client/Windows64Media/DLC/Halloween/Data/media.arc differ diff --git a/Minecraft.Client/Windows64Media/DLC/LittleBigPlanet/Skins.pck b/Minecraft.Client/Windows64Media/DLC/LittleBigPlanet/Skins.pck new file mode 100644 index 00000000..07df720d Binary files /dev/null and b/Minecraft.Client/Windows64Media/DLC/LittleBigPlanet/Skins.pck differ diff --git a/Minecraft.Client/Windows64Media/DLC/Natural/Data/media.arc b/Minecraft.Client/Windows64Media/DLC/Natural/Data/media.arc index c3935326..f0781664 100644 Binary files a/Minecraft.Client/Windows64Media/DLC/Natural/Data/media.arc and b/Minecraft.Client/Windows64Media/DLC/Natural/Data/media.arc differ diff --git a/Minecraft.Client/Windows64Media/DLC/Natural/Data/x32Data.pck b/Minecraft.Client/Windows64Media/DLC/Natural/Data/x32Data.pck index c5f592c4..5bb3ebfc 100644 Binary files a/Minecraft.Client/Windows64Media/DLC/Natural/Data/x32Data.pck and b/Minecraft.Client/Windows64Media/DLC/Natural/Data/x32Data.pck differ diff --git a/Minecraft.Client/Windows64Media/Media/Logo/1080.png b/Minecraft.Client/Windows64Media/Media/Logo/1080.png new file mode 100644 index 00000000..d49b25d6 Binary files /dev/null and b/Minecraft.Client/Windows64Media/Media/Logo/1080.png differ diff --git a/Minecraft.Client/Windows64Media/Media/Logo/480.png b/Minecraft.Client/Windows64Media/Media/Logo/480.png new file mode 100644 index 00000000..2a094fff Binary files /dev/null and b/Minecraft.Client/Windows64Media/Media/Logo/480.png differ diff --git a/Minecraft.Client/Windows64Media/Media/Logo/720.png b/Minecraft.Client/Windows64Media/Media/Logo/720.png new file mode 100644 index 00000000..0d6de65d Binary files /dev/null and b/Minecraft.Client/Windows64Media/Media/Logo/720.png differ diff --git a/Minecraft.Client/Windows64Media/Media/Logo/Festive1080.png b/Minecraft.Client/Windows64Media/Media/Logo/Festive1080.png new file mode 100644 index 00000000..65f6fb44 Binary files /dev/null and b/Minecraft.Client/Windows64Media/Media/Logo/Festive1080.png differ diff --git a/Minecraft.Client/Windows64Media/Media/Logo/Festive480.png b/Minecraft.Client/Windows64Media/Media/Logo/Festive480.png new file mode 100644 index 00000000..30652dc6 Binary files /dev/null and b/Minecraft.Client/Windows64Media/Media/Logo/Festive480.png differ diff --git a/Minecraft.Client/Windows64Media/Media/Logo/Festive720.png b/Minecraft.Client/Windows64Media/Media/Logo/Festive720.png new file mode 100644 index 00000000..1f3e835f Binary files /dev/null and b/Minecraft.Client/Windows64Media/Media/Logo/Festive720.png differ diff --git a/Minecraft.Client/Windows64Media/Media/Logo/Original.png b/Minecraft.Client/Windows64Media/Media/Logo/Original.png new file mode 100644 index 00000000..eacf7a03 Binary files /dev/null and b/Minecraft.Client/Windows64Media/Media/Logo/Original.png differ diff --git a/Minecraft.Client/Windows64Media/Media/languages.loc b/Minecraft.Client/Windows64Media/Media/languages.loc index e3d9162b..3fb5b1a0 100644 Binary files a/Minecraft.Client/Windows64Media/Media/languages.loc and b/Minecraft.Client/Windows64Media/Media/languages.loc differ diff --git a/Minecraft.Client/Windows64Media/Media/logo-original.png b/Minecraft.Client/Windows64Media/Media/logo-original.png deleted file mode 100644 index 3d1637f8..00000000 Binary files a/Minecraft.Client/Windows64Media/Media/logo-original.png and /dev/null differ diff --git a/Minecraft.Client/Windows64Media/Media/logo-tempscaled.png b/Minecraft.Client/Windows64Media/Media/logo-tempscaled.png deleted file mode 100644 index ad2839b9..00000000 Binary files a/Minecraft.Client/Windows64Media/Media/logo-tempscaled.png and /dev/null differ diff --git a/Minecraft.Client/Windows64Media/Media/skinHDWin.swf b/Minecraft.Client/Windows64Media/Media/skinHDWin.swf index 6d1a79fa..b48dd3c3 100644 Binary files a/Minecraft.Client/Windows64Media/Media/skinHDWin.swf and b/Minecraft.Client/Windows64Media/Media/skinHDWin.swf differ diff --git a/Minecraft.Client/Windows64Media/Media/skinWin.swf b/Minecraft.Client/Windows64Media/Media/skinWin.swf index b3a9edbb..3c05bc01 100644 Binary files a/Minecraft.Client/Windows64Media/Media/skinWin.swf and b/Minecraft.Client/Windows64Media/Media/skinWin.swf differ diff --git a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml index 36b521dd..b5e58a9b 100644 --- a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml +++ b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml @@ -8811,4 +8811,7 @@ All Ender Chests in a world are linked. Items placed into an Ender Chest are acc Cure + + Exit Minecraft + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/strings.h b/Minecraft.Client/Windows64Media/strings.h index 63e3a7f4..19a50eee 100644 --- a/Minecraft.Client/Windows64Media/strings.h +++ b/Minecraft.Client/Windows64Media/strings.h @@ -1,7 +1,7 @@ #pragma once // Auto-generated by StringTable builder — do not edit manually. // Source language: en-US -// Total strings: 2286 +// Total strings: 2287 #define IDS_NULL 0 #define IDS_OK 1 @@ -2165,127 +2165,128 @@ #define IDS_TUTORIAL_TASK_MINECART_PUSHING 2159 #define IDS_CONNECTION_FAILED_NO_SD_SPLITSCREEN 2160 #define IDS_TOOLTIPS_CURE 2161 -#define IDS_LANG_SYSTEM 2162 -#define IDS_LANG_ENGLISH 2163 -#define IDS_LANG_GERMAN 2164 -#define IDS_LANG_SPANISH 2165 -#define IDS_LANG_SPANISH_SPAIN 2166 -#define IDS_LANG_SPANISH_LATIN_AMERICA 2167 -#define IDS_LANG_FRENCH 2168 -#define IDS_LANG_ITALIAN 2169 -#define IDS_LANG_PORTUGUESE 2170 -#define IDS_LANG_PORTUGUESE_PORTUGAL 2171 -#define IDS_LANG_PORTUGUESE_BRAZIL 2172 -#define IDS_LANG_JAPANESE 2173 -#define IDS_LANG_KOREAN 2174 -#define IDS_LANG_CHINESE_TRADITIONAL 2175 -#define IDS_LANG_CHINESE_SIMPLIFIED 2176 -#define IDS_LANG_DANISH 2177 -#define IDS_LANG_FINISH 2178 -#define IDS_LANG_DUTCH 2179 -#define IDS_LANG_POLISH 2180 -#define IDS_LANG_RUSSIAN 2181 -#define IDS_LANG_SWEDISH 2182 -#define IDS_LANG_NORWEGIAN 2183 -#define IDS_LANG_GREEK 2184 -#define IDS_LANG_TURKISH 2185 -#define IDS_LEADERBOARD_KILLS_EASY 2186 -#define IDS_LEADERBOARD_KILLS_NORMAL 2187 -#define IDS_LEADERBOARD_KILLS_HARD 2188 -#define IDS_LEADERBOARD_MINING_BLOCKS_PEACEFUL 2189 -#define IDS_LEADERBOARD_MINING_BLOCKS_EASY 2190 -#define IDS_LEADERBOARD_MINING_BLOCKS_NORMAL 2191 -#define IDS_LEADERBOARD_MINING_BLOCKS_HARD 2192 -#define IDS_LEADERBOARD_FARMING_PEACEFUL 2193 -#define IDS_LEADERBOARD_FARMING_EASY 2194 -#define IDS_LEADERBOARD_FARMING_NORMAL 2195 -#define IDS_LEADERBOARD_FARMING_HARD 2196 -#define IDS_LEADERBOARD_TRAVELLING_PEACEFUL 2197 -#define IDS_LEADERBOARD_TRAVELLING_EASY 2198 -#define IDS_LEADERBOARD_TRAVELLING_NORMAL 2199 -#define IDS_LEADERBOARD_TRAVELLING_HARD 2200 -#define IDS_TIPS_GAMETIP_0 2201 -#define IDS_TIPS_GAMETIP_1 2202 -#define IDS_TIPS_GAMETIP_48 2203 -#define IDS_TIPS_GAMETIP_44 2204 -#define IDS_TIPS_GAMETIP_45 2205 -#define IDS_TIPS_TRIVIA_4 2206 -#define IDS_TIPS_TRIVIA_17 2207 -#define IDS_HOW_TO_PLAY_MULTIPLAYER 2208 -#define IDS_HOW_TO_PLAY_SOCIALMEDIA 2209 -#define IDS_HOW_TO_PLAY_CREATIVE 2210 -#define IDS_TUTORIAL_TASK_FLY 2211 -#define IDS_TOOLTIPS_SELECTDEVICE 2212 -#define IDS_TOOLTIPS_CHANGEDEVICE 2213 -#define IDS_TOOLTIPS_VIEW_GAMERCARD 2214 -#define IDS_TOOLTIPS_VIEW_GAMERPROFILE 2215 -#define IDS_TOOLTIPS_INVITE_PARTY 2216 -#define IDS_CONFIRM_START_CREATIVE 2217 -#define IDS_CONFIRM_START_SAVEDINCREATIVE 2218 -#define IDS_CONFIRM_START_SAVEDINCREATIVE_CONTINUE 2219 -#define IDS_CONFIRM_START_HOST_PRIVILEGES 2220 -#define IDS_CONNECTION_LOST_LIVE 2221 -#define IDS_CONNECTION_LOST_LIVE_NO_EXIT 2222 -#define IDS_AWARD_AVATAR1 2223 -#define IDS_AWARD_AVATAR2 2224 -#define IDS_AWARD_AVATAR3 2225 -#define IDS_AWARD_THEME 2226 -#define IDS_UNLOCK_ACHIEVEMENT_TEXT 2227 -#define IDS_UNLOCK_AVATAR_TEXT 2228 -#define IDS_UNLOCK_GAMERPIC_TEXT 2229 -#define IDS_UNLOCK_THEME_TEXT 2230 -#define IDS_UNLOCK_ACCEPT_INVITE 2231 -#define IDS_UNLOCK_GUEST_TEXT 2232 -#define IDS_LEADERBOARD_GAMERTAG 2233 -#define IDS_GROUPNAME_POTIONS_480 2234 -#define IDS_RETURNEDTOTITLESCREEN_TEXT 2235 -#define IDS_TRIALOVER_TEXT 2236 -#define IDS_FATAL_ERROR_TEXT 2237 -#define IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT 2238 -#define IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT 2239 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL 2240 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL 2241 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE 2242 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE 2243 -#define IDS_SAVE_ICON_MESSAGE 2244 -#define IDS_GAMEOPTION_HOST_PRIVILEGES 2245 -#define IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS 2246 -#define IDS_ACHIEVEMENTS 2247 -#define IDS_LABEL_GAMERTAGS 2248 -#define IDS_IN_GAME_GAMERTAGS 2249 -#define IDS_SOCIAL_DEFAULT_DESCRIPTION 2250 -#define IDS_TITLE_UPDATE_NAME 2251 -#define IDS_PLATFORM_NAME 2252 -#define IDS_BACK_BUTTON 2253 -#define IDS_HOST_OPTION_DISABLES_ACHIEVEMENTS 2254 -#define IDS_KICK_PLAYER_DESCRIPTION 2255 -#define IDS_USING_TRIAL_TEXUREPACK_WARNING 2256 -#define IDS_WORLD_SIZE_TITLE_SMALL 2257 -#define IDS_WORLD_SIZE_TITLE_MEDIUM 2258 -#define IDS_WORLD_SIZE_TITLE_LARGE 2259 -#define IDS_WORLD_SIZE_TITLE_CLASSIC 2260 -#define IDS_WORLD_SIZE 2261 -#define IDS_GAMEOPTION_WORLD_SIZE 2262 -#define IDS_DISABLE_SAVING 2263 -#define IDS_GAMEOPTION_DISABLE_SAVING 2264 -#define IDS_RICHPRESENCE_GAMESTATE 2265 -#define IDS_RICHPRESENCE_IDLE 2266 -#define IDS_RICHPRESENCE_MENUS 2267 -#define IDS_RICHPRESENCE_MULTIPLAYER 2268 -#define IDS_RICHPRESENCE_MULTIPLAYEROFFLINE 2269 -#define IDS_RICHPRESENCE_MULTIPLAYER_1P 2270 -#define IDS_RICHPRESENCE_MULTIPLAYER_1POFFLINE 2271 -#define IDS_RICHPRESENCESTATE_BLANK 2272 -#define IDS_RICHPRESENCESTATE_RIDING_PIG 2273 -#define IDS_RICHPRESENCESTATE_RIDING_MINECART 2274 -#define IDS_RICHPRESENCESTATE_BOATING 2275 -#define IDS_RICHPRESENCESTATE_FISHING 2276 -#define IDS_RICHPRESENCESTATE_CRAFTING 2277 -#define IDS_RICHPRESENCESTATE_FORGING 2278 -#define IDS_RICHPRESENCESTATE_NETHER 2279 -#define IDS_RICHPRESENCESTATE_CD 2280 -#define IDS_RICHPRESENCESTATE_MAP 2281 -#define IDS_RICHPRESENCESTATE_ENCHANTING 2282 -#define IDS_RICHPRESENCESTATE_BREWING 2283 -#define IDS_RICHPRESENCESTATE_ANVIL 2284 -#define IDS_RICHPRESENCESTATE_TRADING 2285 +#define IDS_WINDOWS_EXIT 2162 +#define IDS_LANG_SYSTEM 2163 +#define IDS_LANG_ENGLISH 2164 +#define IDS_LANG_GERMAN 2165 +#define IDS_LANG_SPANISH 2166 +#define IDS_LANG_SPANISH_SPAIN 2167 +#define IDS_LANG_SPANISH_LATIN_AMERICA 2168 +#define IDS_LANG_FRENCH 2169 +#define IDS_LANG_ITALIAN 2170 +#define IDS_LANG_PORTUGUESE 2171 +#define IDS_LANG_PORTUGUESE_PORTUGAL 2172 +#define IDS_LANG_PORTUGUESE_BRAZIL 2173 +#define IDS_LANG_JAPANESE 2174 +#define IDS_LANG_KOREAN 2175 +#define IDS_LANG_CHINESE_TRADITIONAL 2176 +#define IDS_LANG_CHINESE_SIMPLIFIED 2177 +#define IDS_LANG_DANISH 2178 +#define IDS_LANG_FINISH 2179 +#define IDS_LANG_DUTCH 2180 +#define IDS_LANG_POLISH 2181 +#define IDS_LANG_RUSSIAN 2182 +#define IDS_LANG_SWEDISH 2183 +#define IDS_LANG_NORWEGIAN 2184 +#define IDS_LANG_GREEK 2185 +#define IDS_LANG_TURKISH 2186 +#define IDS_LEADERBOARD_KILLS_EASY 2187 +#define IDS_LEADERBOARD_KILLS_NORMAL 2188 +#define IDS_LEADERBOARD_KILLS_HARD 2189 +#define IDS_LEADERBOARD_MINING_BLOCKS_PEACEFUL 2190 +#define IDS_LEADERBOARD_MINING_BLOCKS_EASY 2191 +#define IDS_LEADERBOARD_MINING_BLOCKS_NORMAL 2192 +#define IDS_LEADERBOARD_MINING_BLOCKS_HARD 2193 +#define IDS_LEADERBOARD_FARMING_PEACEFUL 2194 +#define IDS_LEADERBOARD_FARMING_EASY 2195 +#define IDS_LEADERBOARD_FARMING_NORMAL 2196 +#define IDS_LEADERBOARD_FARMING_HARD 2197 +#define IDS_LEADERBOARD_TRAVELLING_PEACEFUL 2198 +#define IDS_LEADERBOARD_TRAVELLING_EASY 2199 +#define IDS_LEADERBOARD_TRAVELLING_NORMAL 2200 +#define IDS_LEADERBOARD_TRAVELLING_HARD 2201 +#define IDS_TIPS_GAMETIP_0 2202 +#define IDS_TIPS_GAMETIP_1 2203 +#define IDS_TIPS_GAMETIP_48 2204 +#define IDS_TIPS_GAMETIP_44 2205 +#define IDS_TIPS_GAMETIP_45 2206 +#define IDS_TIPS_TRIVIA_4 2207 +#define IDS_TIPS_TRIVIA_17 2208 +#define IDS_HOW_TO_PLAY_MULTIPLAYER 2209 +#define IDS_HOW_TO_PLAY_SOCIALMEDIA 2210 +#define IDS_HOW_TO_PLAY_CREATIVE 2211 +#define IDS_TUTORIAL_TASK_FLY 2212 +#define IDS_TOOLTIPS_SELECTDEVICE 2213 +#define IDS_TOOLTIPS_CHANGEDEVICE 2214 +#define IDS_TOOLTIPS_VIEW_GAMERCARD 2215 +#define IDS_TOOLTIPS_VIEW_GAMERPROFILE 2216 +#define IDS_TOOLTIPS_INVITE_PARTY 2217 +#define IDS_CONFIRM_START_CREATIVE 2218 +#define IDS_CONFIRM_START_SAVEDINCREATIVE 2219 +#define IDS_CONFIRM_START_SAVEDINCREATIVE_CONTINUE 2220 +#define IDS_CONFIRM_START_HOST_PRIVILEGES 2221 +#define IDS_CONNECTION_LOST_LIVE 2222 +#define IDS_CONNECTION_LOST_LIVE_NO_EXIT 2223 +#define IDS_AWARD_AVATAR1 2224 +#define IDS_AWARD_AVATAR2 2225 +#define IDS_AWARD_AVATAR3 2226 +#define IDS_AWARD_THEME 2227 +#define IDS_UNLOCK_ACHIEVEMENT_TEXT 2228 +#define IDS_UNLOCK_AVATAR_TEXT 2229 +#define IDS_UNLOCK_GAMERPIC_TEXT 2230 +#define IDS_UNLOCK_THEME_TEXT 2231 +#define IDS_UNLOCK_ACCEPT_INVITE 2232 +#define IDS_UNLOCK_GUEST_TEXT 2233 +#define IDS_LEADERBOARD_GAMERTAG 2234 +#define IDS_GROUPNAME_POTIONS_480 2235 +#define IDS_RETURNEDTOTITLESCREEN_TEXT 2236 +#define IDS_TRIALOVER_TEXT 2237 +#define IDS_FATAL_ERROR_TEXT 2238 +#define IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT 2239 +#define IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT 2240 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL 2241 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL 2242 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE 2243 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE 2244 +#define IDS_SAVE_ICON_MESSAGE 2245 +#define IDS_GAMEOPTION_HOST_PRIVILEGES 2246 +#define IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS 2247 +#define IDS_ACHIEVEMENTS 2248 +#define IDS_LABEL_GAMERTAGS 2249 +#define IDS_IN_GAME_GAMERTAGS 2250 +#define IDS_SOCIAL_DEFAULT_DESCRIPTION 2251 +#define IDS_TITLE_UPDATE_NAME 2252 +#define IDS_PLATFORM_NAME 2253 +#define IDS_BACK_BUTTON 2254 +#define IDS_HOST_OPTION_DISABLES_ACHIEVEMENTS 2255 +#define IDS_KICK_PLAYER_DESCRIPTION 2256 +#define IDS_USING_TRIAL_TEXUREPACK_WARNING 2257 +#define IDS_WORLD_SIZE_TITLE_SMALL 2258 +#define IDS_WORLD_SIZE_TITLE_MEDIUM 2259 +#define IDS_WORLD_SIZE_TITLE_LARGE 2260 +#define IDS_WORLD_SIZE_TITLE_CLASSIC 2261 +#define IDS_WORLD_SIZE 2262 +#define IDS_GAMEOPTION_WORLD_SIZE 2263 +#define IDS_DISABLE_SAVING 2264 +#define IDS_GAMEOPTION_DISABLE_SAVING 2265 +#define IDS_RICHPRESENCE_GAMESTATE 2266 +#define IDS_RICHPRESENCE_IDLE 2267 +#define IDS_RICHPRESENCE_MENUS 2268 +#define IDS_RICHPRESENCE_MULTIPLAYER 2269 +#define IDS_RICHPRESENCE_MULTIPLAYEROFFLINE 2270 +#define IDS_RICHPRESENCE_MULTIPLAYER_1P 2271 +#define IDS_RICHPRESENCE_MULTIPLAYER_1POFFLINE 2272 +#define IDS_RICHPRESENCESTATE_BLANK 2273 +#define IDS_RICHPRESENCESTATE_RIDING_PIG 2274 +#define IDS_RICHPRESENCESTATE_RIDING_MINECART 2275 +#define IDS_RICHPRESENCESTATE_BOATING 2276 +#define IDS_RICHPRESENCESTATE_FISHING 2277 +#define IDS_RICHPRESENCESTATE_CRAFTING 2278 +#define IDS_RICHPRESENCESTATE_FORGING 2279 +#define IDS_RICHPRESENCESTATE_NETHER 2280 +#define IDS_RICHPRESENCESTATE_CD 2281 +#define IDS_RICHPRESENCESTATE_MAP 2282 +#define IDS_RICHPRESENCESTATE_ENCHANTING 2283 +#define IDS_RICHPRESENCESTATE_BREWING 2284 +#define IDS_RICHPRESENCESTATE_ANVIL 2285 +#define IDS_RICHPRESENCESTATE_TRADING 2286 diff --git a/Minecraft.Client/WitherBossRenderer.cpp b/Minecraft.Client/WitherBossRenderer.cpp index e358c6da..dc1d8f92 100644 --- a/Minecraft.Client/WitherBossRenderer.cpp +++ b/Minecraft.Client/WitherBossRenderer.cpp @@ -20,6 +20,10 @@ void WitherBossRenderer::render(shared_ptr entity, double x, double y, d shared_ptr mob = dynamic_pointer_cast(entity); BossMobGuiInfo::setBossHealth(mob, true); + if (!mob->getCustomName().empty()) + { + BossMobGuiInfo::name = mob->getCustomName(); + } int modelVersion = dynamic_cast(model)->modelVersion(); if (modelVersion != this->modelVersion) diff --git a/Minecraft.Client/cmake/sources/Common.cmake b/Minecraft.Client/cmake/sources/Common.cmake new file mode 100644 index 00000000..3936a9c3 --- /dev/null +++ b/Minecraft.Client/cmake/sources/Common.cmake @@ -0,0 +1,1107 @@ +set(BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Common/") + +set(_MINECRAFT_CLIENT_COMMON_ROOT + "${CMAKE_CURRENT_SOURCE_DIR}/ClassDiagram.cd" + "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.txt" +) +source_group("" FILES ${_MINECRAFT_CLIENT_COMMON_ROOT}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON + "${BASE_DIR}/App_Defines.h" + "${BASE_DIR}/App_enums.h" + "${BASE_DIR}/App_structs.h" + "${BASE_DIR}/Consoles_App.cpp" + "${BASE_DIR}/Consoles_App.h" + "${BASE_DIR}/PostProcesser.h" + "${BASE_DIR}/Potion_Macros.h" + "${BASE_DIR}/ConsoleGameMode.cpp" + "${BASE_DIR}/ConsoleGameMode.h" + "${BASE_DIR}/Console_Awards_enum.h" + "${BASE_DIR}/Console_Debug_enum.h" + "${BASE_DIR}/Console_Utils.cpp" +) +source_group("Common" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_AUDIO + "${BASE_DIR}/Audio/Consoles_SoundEngine.cpp" + "${BASE_DIR}/Audio/Consoles_SoundEngine.h" + "${BASE_DIR}/Audio/SoundEngine.h" + "${BASE_DIR}/Audio/SoundNames.cpp" + "${BASE_DIR}/Audio/miniaudio.h" + "${BASE_DIR}/Audio/stb_vorbis.h" +) +source_group("Common/Audio" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_AUDIO}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_COLOURS + "${BASE_DIR}/Colours/ColourTable.cpp" + "${BASE_DIR}/Colours/ColourTable.h" +) +source_group("Common/Colours" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_COLOURS}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_DLC + "${BASE_DIR}/DLC/DLCAudioFile.cpp" + "${BASE_DIR}/DLC/DLCAudioFile.h" + "${BASE_DIR}/DLC/DLCCapeFile.cpp" + "${BASE_DIR}/DLC/DLCCapeFile.h" + "${BASE_DIR}/DLC/DLCColourTableFile.cpp" + "${BASE_DIR}/DLC/DLCColourTableFile.h" + "${BASE_DIR}/DLC/DLCFile.cpp" + "${BASE_DIR}/DLC/DLCFile.h" + "${BASE_DIR}/DLC/DLCGameRules.h" + "${BASE_DIR}/DLC/DLCGameRulesFile.cpp" + "${BASE_DIR}/DLC/DLCGameRulesFile.h" + "${BASE_DIR}/DLC/DLCGameRulesHeader.cpp" + "${BASE_DIR}/DLC/DLCGameRulesHeader.h" + "${BASE_DIR}/DLC/DLCLocalisationFile.cpp" + "${BASE_DIR}/DLC/DLCLocalisationFile.h" + "${BASE_DIR}/DLC/DLCManager.cpp" + "${BASE_DIR}/DLC/DLCManager.h" + "${BASE_DIR}/DLC/DLCPack.cpp" + "${BASE_DIR}/DLC/DLCPack.h" + "${BASE_DIR}/DLC/DLCSkinFile.cpp" + "${BASE_DIR}/DLC/DLCSkinFile.h" + "${BASE_DIR}/DLC/DLCTextureFile.cpp" + "${BASE_DIR}/DLC/DLCTextureFile.h" + "${BASE_DIR}/DLC/DLCUIDataFile.cpp" + "${BASE_DIR}/DLC/DLCUIDataFile.h" +) +source_group("Common/DLC" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_DLC}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES + "${BASE_DIR}/GameRules/ConsoleGameRules.h" + "${BASE_DIR}/GameRules/ConsoleGameRulesConstants.h" + "${BASE_DIR}/GameRules/GameRuleManager.cpp" + "${BASE_DIR}/GameRules/GameRuleManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/WstringLookup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WstringLookup.h" +) +source_group("Common/GameRules" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELGENERATION + "${BASE_DIR}/GameRules/ApplySchematicRuleDefinition.cpp" + "${BASE_DIR}/GameRules/ApplySchematicRuleDefinition.h" + "${BASE_DIR}/GameRules/BiomeOverride.cpp" + "${BASE_DIR}/GameRules/BiomeOverride.h" + "${BASE_DIR}/GameRules/ConsoleGenerateStructure.cpp" + "${BASE_DIR}/GameRules/ConsoleGenerateStructure.h" + "${BASE_DIR}/GameRules/ConsoleGenerateStructureAction.h" + "${BASE_DIR}/GameRules/ConsoleSchematicFile.cpp" + "${BASE_DIR}/GameRules/ConsoleSchematicFile.h" + "${BASE_DIR}/GameRules/LevelGenerationOptions.cpp" + "${BASE_DIR}/GameRules/LevelGenerationOptions.h" + "${BASE_DIR}/GameRules/LevelGenerators.cpp" + "${BASE_DIR}/GameRules/LevelGenerators.h" + "${BASE_DIR}/GameRules/StartFeature.cpp" + "${BASE_DIR}/GameRules/StartFeature.h" +) +source_group("Common/GameRules/LevelGeneration" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELGENERATION}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELGENERATION_STRUCTUREACTIONS + "${BASE_DIR}/GameRules/XboxStructureActionGenerateBox.cpp" + "${BASE_DIR}/GameRules/XboxStructureActionGenerateBox.h" + "${BASE_DIR}/GameRules/XboxStructureActionPlaceBlock.cpp" + "${BASE_DIR}/GameRules/XboxStructureActionPlaceBlock.h" + "${BASE_DIR}/GameRules/XboxStructureActionPlaceContainer.cpp" + "${BASE_DIR}/GameRules/XboxStructureActionPlaceContainer.h" + "${BASE_DIR}/GameRules/XboxStructureActionPlaceSpawner.cpp" + "${BASE_DIR}/GameRules/XboxStructureActionPlaceSpawner.h" +) +source_group("Common/GameRules/LevelGeneration/StructureActions" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELGENERATION_STRUCTUREACTIONS}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELRULES + "${BASE_DIR}/GameRules/LevelRules.cpp" + "${BASE_DIR}/GameRules/LevelRules.h" +) +source_group("Common/GameRules/LevelRules" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELRULES}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELRULES_RULEDEFINITIONS + "${BASE_DIR}/GameRules/AddEnchantmentRuleDefinition.cpp" + "${BASE_DIR}/GameRules/AddEnchantmentRuleDefinition.h" + "${BASE_DIR}/GameRules/AddItemRuleDefinition.cpp" + "${BASE_DIR}/GameRules/AddItemRuleDefinition.h" + "${BASE_DIR}/GameRules/CollectItemRuleDefinition.cpp" + "${BASE_DIR}/GameRules/CollectItemRuleDefinition.h" + "${BASE_DIR}/GameRules/CompleteAllRuleDefinition.cpp" + "${BASE_DIR}/GameRules/CompleteAllRuleDefinition.h" + "${BASE_DIR}/GameRules/CompoundGameRuleDefinition.cpp" + "${BASE_DIR}/GameRules/CompoundGameRuleDefinition.h" + "${BASE_DIR}/GameRules/GameRuleDefinition.cpp" + "${BASE_DIR}/GameRules/GameRuleDefinition.h" + "${BASE_DIR}/GameRules/LevelRuleset.cpp" + "${BASE_DIR}/GameRules/LevelRuleset.h" + "${BASE_DIR}/GameRules/NamedAreaRuleDefinition.cpp" + "${BASE_DIR}/GameRules/NamedAreaRuleDefinition.h" + "${BASE_DIR}/GameRules/UpdatePlayerRuleDefinition.cpp" + "${BASE_DIR}/GameRules/UpdatePlayerRuleDefinition.h" + "${BASE_DIR}/GameRules/UseTileRuleDefinition.cpp" + "${BASE_DIR}/GameRules/UseTileRuleDefinition.h" +) +source_group("Common/GameRules/LevelRules/RuleDefinitions" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELRULES_RULEDEFINITIONS}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELRULES_RULES + "${BASE_DIR}/GameRules/GameRule.cpp" + "${BASE_DIR}/GameRules/GameRule.h" + "${BASE_DIR}/GameRules/GameRulesInstance.h" +) +source_group("Common/GameRules/LevelRules/Rules" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELRULES_RULES}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_LEADERBOARDS + "${BASE_DIR}/Leaderboards/LeaderboardInterface.cpp" + "${BASE_DIR}/Leaderboards/LeaderboardInterface.h" + "${BASE_DIR}/Leaderboards/LeaderboardManager.cpp" + "${BASE_DIR}/Leaderboards/LeaderboardManager.h" +) +source_group("Common/Leaderboards" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_LOCALISATION + "${CMAKE_CURRENT_SOURCE_DIR}/StringTable.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/StringTable.h" +) +source_group("Common/Localisation" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_LOCALISATION}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_NETWORK + "${BASE_DIR}/Network/GameNetworkManager.cpp" + "${BASE_DIR}/Network/GameNetworkManager.h" + "${BASE_DIR}/Network/NetworkPlayerInterface.h" + "${BASE_DIR}/Network/PlatformNetworkManagerInterface.h" + "${BASE_DIR}/Network/SessionInfo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Network Implementation Notes.txt" +) +source_group("Common/Network" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_NETWORK}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_TELEMETRY + "${BASE_DIR}/Telemetry/TelemetryManager.cpp" + "${BASE_DIR}/Telemetry/TelemetryManager.h" +) +source_group("Common/Telemetry" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_TELEMETRY}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_TRIAL + "${BASE_DIR}/Trial/TrialMode.cpp" + "${BASE_DIR}/Trial/TrialMode.h" +) +source_group("Common/Trial" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_TRIAL}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL + "${BASE_DIR}/Tutorial/FullTutorial.cpp" + "${BASE_DIR}/Tutorial/FullTutorial.h" + "${BASE_DIR}/Tutorial/FullTutorialMode.cpp" + "${BASE_DIR}/Tutorial/FullTutorialMode.h" + "${BASE_DIR}/Tutorial/Tutorial.cpp" + "${BASE_DIR}/Tutorial/Tutorial.h" + "${BASE_DIR}/Tutorial/TutorialEnum.h" + "${BASE_DIR}/Tutorial/TutorialMessage.cpp" + "${BASE_DIR}/Tutorial/TutorialMessage.h" + "${BASE_DIR}/Tutorial/TutorialMode.cpp" + "${BASE_DIR}/Tutorial/TutorialMode.h" +) +source_group("Common/Tutorial" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL_CONSTRAINTS + "${BASE_DIR}/Tutorial/AreaConstraint.cpp" + "${BASE_DIR}/Tutorial/AreaConstraint.h" + "${BASE_DIR}/Tutorial/ChangeStateConstraint.cpp" + "${BASE_DIR}/Tutorial/ChangeStateConstraint.h" + "${BASE_DIR}/Tutorial/InputConstraint.cpp" + "${BASE_DIR}/Tutorial/InputConstraint.h" + "${BASE_DIR}/Tutorial/TutorialConstraint.h" + "${BASE_DIR}/Tutorial/TutorialConstraints.h" +) +source_group("Common/Tutorial/Constraints" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL_CONSTRAINTS}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL_HINTS + "${BASE_DIR}/Tutorial/AreaHint.cpp" + "${BASE_DIR}/Tutorial/AreaHint.h" + "${BASE_DIR}/Tutorial/DiggerItemHint.cpp" + "${BASE_DIR}/Tutorial/DiggerItemHint.h" + "${BASE_DIR}/Tutorial/LookAtEntityHint.cpp" + "${BASE_DIR}/Tutorial/LookAtEntityHint.h" + "${BASE_DIR}/Tutorial/LookAtTileHint.cpp" + "${BASE_DIR}/Tutorial/LookAtTileHint.h" + "${BASE_DIR}/Tutorial/TakeItemHint.cpp" + "${BASE_DIR}/Tutorial/TakeItemHint.h" + "${BASE_DIR}/Tutorial/TutorialHint.cpp" + "${BASE_DIR}/Tutorial/TutorialHint.h" + "${BASE_DIR}/Tutorial/TutorialHints.h" +) +source_group("Common/Tutorial/Hints" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL_HINTS}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL_TASKS + "${BASE_DIR}/Tutorial/AreaTask.cpp" + "${BASE_DIR}/Tutorial/AreaTask.h" + "${BASE_DIR}/Tutorial/ChoiceTask.cpp" + "${BASE_DIR}/Tutorial/ChoiceTask.h" + "${BASE_DIR}/Tutorial/CompleteUsingItemTask.cpp" + "${BASE_DIR}/Tutorial/CompleteUsingItemTask.h" + "${BASE_DIR}/Tutorial/ControllerTask.cpp" + "${BASE_DIR}/Tutorial/ControllerTask.h" + "${BASE_DIR}/Tutorial/CraftTask.cpp" + "${BASE_DIR}/Tutorial/CraftTask.h" + "${BASE_DIR}/Tutorial/EffectChangedTask.cpp" + "${BASE_DIR}/Tutorial/EffectChangedTask.h" + "${BASE_DIR}/Tutorial/FullTutorialActiveTask.cpp" + "${BASE_DIR}/Tutorial/FullTutorialActiveTask.h" + "${BASE_DIR}/Tutorial/HorseChoiceTask.cpp" + "${BASE_DIR}/Tutorial/HorseChoiceTask.h" + "${BASE_DIR}/Tutorial/InfoTask.cpp" + "${BASE_DIR}/Tutorial/InfoTask.h" + "${BASE_DIR}/Tutorial/PickupTask.cpp" + "${BASE_DIR}/Tutorial/PickupTask.h" + "${BASE_DIR}/Tutorial/ProcedureCompoundTask.cpp" + "${BASE_DIR}/Tutorial/ProcedureCompoundTask.h" + "${BASE_DIR}/Tutorial/ProgressFlagTask.cpp" + "${BASE_DIR}/Tutorial/ProgressFlagTask.h" + "${BASE_DIR}/Tutorial/RideEntityTask.cpp" + "${BASE_DIR}/Tutorial/RideEntityTask.h" + "${BASE_DIR}/Tutorial/StatTask.cpp" + "${BASE_DIR}/Tutorial/StatTask.h" + "${BASE_DIR}/Tutorial/StateChangeTask.h" + "${BASE_DIR}/Tutorial/TutorialTask.cpp" + "${BASE_DIR}/Tutorial/TutorialTask.h" + "${BASE_DIR}/Tutorial/TutorialTasks.h" + "${BASE_DIR}/Tutorial/UseItemTask.cpp" + "${BASE_DIR}/Tutorial/UseItemTask.h" + "${BASE_DIR}/Tutorial/UseTileTask.cpp" + "${BASE_DIR}/Tutorial/UseTileTask.h" + "${BASE_DIR}/Tutorial/XuiCraftingTask.cpp" + "${BASE_DIR}/Tutorial/XuiCraftingTask.h" +) +source_group("Common/Tutorial/Tasks" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL_TASKS}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_UI + "${BASE_DIR}/UI/UIFontData.cpp" + "${BASE_DIR}/UI/UIFontData.h" + "${BASE_DIR}/UI/UIString.cpp" + "${BASE_DIR}/UI/UIString.h" +) +source_group("Common/UI" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_UI}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_UI_ALL_PLATFORMS + "${CMAKE_CURRENT_SOURCE_DIR}/ArchiveFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ArchiveFile.h" + "${BASE_DIR}/UI/IUIController.h" + "${BASE_DIR}/UI/IUIScene_AbstractContainerMenu.cpp" + "${BASE_DIR}/UI/IUIScene_AbstractContainerMenu.h" + "${BASE_DIR}/UI/IUIScene_AnvilMenu.cpp" + "${BASE_DIR}/UI/IUIScene_AnvilMenu.h" + "${BASE_DIR}/UI/IUIScene_BeaconMenu.cpp" + "${BASE_DIR}/UI/IUIScene_BeaconMenu.h" + "${BASE_DIR}/UI/IUIScene_BrewingMenu.cpp" + "${BASE_DIR}/UI/IUIScene_BrewingMenu.h" + "${BASE_DIR}/UI/IUIScene_CommandBlockMenu.cpp" + "${BASE_DIR}/UI/IUIScene_CommandBlockMenu.h" + "${BASE_DIR}/UI/IUIScene_ContainerMenu.cpp" + "${BASE_DIR}/UI/IUIScene_ContainerMenu.h" + "${BASE_DIR}/UI/IUIScene_CraftingMenu.cpp" + "${BASE_DIR}/UI/IUIScene_CraftingMenu.h" + "${BASE_DIR}/UI/IUIScene_CreativeMenu.cpp" + "${BASE_DIR}/UI/IUIScene_CreativeMenu.h" + "${BASE_DIR}/UI/IUIScene_DispenserMenu.cpp" + "${BASE_DIR}/UI/IUIScene_DispenserMenu.h" + "${BASE_DIR}/UI/IUIScene_EnchantingMenu.cpp" + "${BASE_DIR}/UI/IUIScene_EnchantingMenu.h" + "${BASE_DIR}/UI/IUIScene_FireworksMenu.cpp" + "${BASE_DIR}/UI/IUIScene_FireworksMenu.h" + "${BASE_DIR}/UI/IUIScene_FurnaceMenu.cpp" + "${BASE_DIR}/UI/IUIScene_FurnaceMenu.h" + "${BASE_DIR}/UI/IUIScene_HUD.cpp" + "${BASE_DIR}/UI/IUIScene_HUD.h" + "${BASE_DIR}/UI/IUIScene_HopperMenu.cpp" + "${BASE_DIR}/UI/IUIScene_HopperMenu.h" + "${BASE_DIR}/UI/IUIScene_HorseInventoryMenu.cpp" + "${BASE_DIR}/UI/IUIScene_HorseInventoryMenu.h" + "${BASE_DIR}/UI/IUIScene_InventoryMenu.cpp" + "${BASE_DIR}/UI/IUIScene_InventoryMenu.h" + "${BASE_DIR}/UI/IUIScene_PauseMenu.cpp" + "${BASE_DIR}/UI/IUIScene_PauseMenu.h" + "${BASE_DIR}/UI/IUIScene_TradingMenu.cpp" + "${BASE_DIR}/UI/IUIScene_TradingMenu.h" + "${BASE_DIR}/UI/UIEnums.h" + "${BASE_DIR}/UI/UIStructs.h" +) +source_group("Common/UI/All Platforms" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_UI_ALL_PLATFORMS}) + +set(_MINECRAFT_CLIENT_COMMON_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS + "${BASE_DIR}/UI/IUIScene_StartGame.h" +) +source_group("Common/UI/Scenes/Frontend Menu screens" FILES ${_MINECRAFT_CLIENT_COMMON_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_COMMON_DURANGO_ROOT + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/PresenceIds.h" +) +source_group("Durango" FILES ${_MINECRAFT_CLIENT_COMMON_DURANGO_ROOT}) + +set(_MINECRAFT_CLIENT_COMMON_DURANGO_SERVICECONFIG + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/ServiceConfig/Events-XBLA.8-149E11AEEvents.h" +) +source_group("Durango/ServiceConfig" FILES ${_MINECRAFT_CLIENT_COMMON_DURANGO_SERVICECONFIG}) + +set(_MINECRAFT_CLIENT_COMMON_DURANGO_ACHIEVEMENTS + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Achievements/AchievementManager.h" +) +source_group("Durango/Achievements" FILES ${_MINECRAFT_CLIENT_COMMON_DURANGO_ACHIEVEMENTS}) + +set(_MINECRAFT_CLIENT_COMMON_HEADER_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/BufferedImage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MemTexture.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MemTextureProcessor.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MobSkinMemTextureProcessor.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SkinBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/extraX64client.h" + "${CMAKE_CURRENT_SOURCE_DIR}/stdafx.h" + "${CMAKE_CURRENT_SOURCE_DIR}/stubs.h" +) +source_group("Header Files" FILES ${_MINECRAFT_CLIENT_COMMON_HEADER_FILES}) + +set(_MINECRAFT_CLIENT_COMMON_ORBIS_4JLIBS_INC + "${CMAKE_CURRENT_SOURCE_DIR}/Orbis/4JLibs/inc/4J_Input.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Orbis/4JLibs/inc/4J_Profile.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Orbis/4JLibs/inc/4J_Render.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Orbis/4JLibs/inc/4J_Storage.h" +) +source_group("Orbis/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_COMMON_ORBIS_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_COMMON_PSVITA + "${CMAKE_CURRENT_SOURCE_DIR}/PSVita/PSVita_App.h" +) +source_group("PSVita" FILES ${_MINECRAFT_CLIENT_COMMON_PSVITA}) + +set(_MINECRAFT_CLIENT_COMMON_PSVITA_GAMECONFIG + "${CMAKE_CURRENT_SOURCE_DIR}/PSVita/GameConfig/Minecraft.gameconfig" + "${CMAKE_CURRENT_SOURCE_DIR}/PSVita/GameConfig/Minecraft.spa" + "${CMAKE_CURRENT_SOURCE_DIR}/PSVita/GameConfig/Minecraft.spa.h" +) +source_group("PSVita/GameConfig" FILES ${_MINECRAFT_CLIENT_COMMON_PSVITA_GAMECONFIG}) + +set(_MINECRAFT_CLIENT_COMMON_PSVITA_MILES_SOUND_SYSTEM_INCLUDE + # "${CMAKE_CURRENT_SOURCE_DIR}/PSVita/Miles/include/mss.h" + # "${CMAKE_CURRENT_SOURCE_DIR}/PSVita/Miles/include/rrCore.h" +) +source_group("PSVita/Miles Sound System/Include" FILES ${_MINECRAFT_CLIENT_COMMON_PSVITA_MILES_SOUND_SYSTEM_INCLUDE}) + +set(_MINECRAFT_CLIENT_COMMON_PSVITA_SOCIAL + "${CMAKE_CURRENT_SOURCE_DIR}/PSVita/Social/SocialManager.h" +) +source_group("PSVita/Social" FILES ${_MINECRAFT_CLIENT_COMMON_PSVITA_SOCIAL}) + +set(_MINECRAFT_CLIENT_COMMON_PSVITA_XML + "${CMAKE_CURRENT_SOURCE_DIR}/PSVita/XML/ATGXmlParser.h" +) +source_group("PSVita/XML" FILES ${_MINECRAFT_CLIENT_COMMON_PSVITA_XML}) + +set(_MINECRAFT_CLIENT_COMMON_SOURCE_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/BufferedImage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/compat_shims.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/glWrapper.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/iob_shim.asm" + "${CMAKE_CURRENT_SOURCE_DIR}/stdafx.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/stubs.cpp" +) +source_group("Source Files" FILES ${_MINECRAFT_CLIENT_COMMON_SOURCE_FILES}) + +set(_MINECRAFT_CLIENT_COMMON_WINDOWS64_IGGY_GDRAW + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Iggy/gdraw/gdraw_d3d10_shaders.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Iggy/gdraw/gdraw_d3d1x_shared.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Iggy/gdraw/gdraw_gl_shaders.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Iggy/gdraw/gdraw_gl_shared.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Iggy/gdraw/gdraw_shared.inl" +) +source_group("Windows64/Iggy/gdraw" FILES ${_MINECRAFT_CLIENT_COMMON_WINDOWS64_IGGY_GDRAW}) + +set(_MINECRAFT_CLIENT_COMMON_WINDOWS64_NETWORK + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Network/WinsockNetLayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Network/WinsockNetLayer.h" +) +source_group("Windows64/Network" FILES ${_MINECRAFT_CLIENT_COMMON_WINDOWS64_NETWORK}) + +set(_MINECRAFT_CLIENT_COMMON_XBOX_4JLIBS_INC + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/4JLibs/inc/4J_xtms.h" +) +source_group("Xbox/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_COMMON_XBOX_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_COMMON_XBOX_AUDIO + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Audio/SoundEngine.h" +) +source_group("Xbox/Audio" FILES ${_MINECRAFT_CLIENT_COMMON_XBOX_AUDIO}) + +set(_MINECRAFT_CLIENT_COMMON_XBOX_NETWORK + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Network/extra.h" +) +source_group("Xbox/Network" FILES ${_MINECRAFT_CLIENT_COMMON_XBOX_NETWORK}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT + "${CMAKE_CURRENT_SOURCE_DIR}/Camera.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Camera.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ClientConstants.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ClientConstants.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DemoUser.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DemoUser.h" + "${CMAKE_CURRENT_SOURCE_DIR}/GuiMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/GuiMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/KeyMapping.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/KeyMapping.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Lighting.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Lighting.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MemoryTracker.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MemoryTracker.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Options.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Options.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ProgressRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ProgressRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Timer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Timer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/User.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/User.h" +) +source_group("net/minecraft/client" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_GUI + "${CMAKE_CURRENT_SOURCE_DIR}/Button.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Button.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ChatScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ChatScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ConfirmScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ConfirmScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ControlsScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ControlsScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/CreateWorldScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/CreateWorldScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DeathScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DeathScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EditBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EditBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ErrorScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ErrorScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Font.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Font.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Gui.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Gui.h" + "${CMAKE_CURRENT_SOURCE_DIR}/GuiComponent.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/GuiComponent.h" + "${CMAKE_CURRENT_SOURCE_DIR}/InBedChatScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/InBedChatScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/JoinMultiplayerScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/JoinMultiplayerScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Minimap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Minimap.h" + "${CMAKE_CURRENT_SOURCE_DIR}/NameEntryScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/NameEntryScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/OptionsScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/OptionsScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PauseScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PauseScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/RenameWorldScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/RenameWorldScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Screen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Screen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ScreenSizeCalculator.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ScreenSizeCalculator.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ScrolledSelectionList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ScrolledSelectionList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SelectWorldScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SelectWorldScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SlideButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SlideButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SmallButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SmallButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/VideoSettingsScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/VideoSettingsScreen.h" +) +source_group("net/minecraft/client/gui" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_GUI}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_GUI_ACHIEVEMENT + "${CMAKE_CURRENT_SOURCE_DIR}/AchievementPopup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/AchievementPopup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/AchievementScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/AchievementScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/StatsScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/StatsScreen.h" +) +source_group("net/minecraft/client/gui/achievement" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_GUI_ACHIEVEMENT}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_GUI_PARTICLE + "${CMAKE_CURRENT_SOURCE_DIR}/GuiParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/GuiParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/GuiParticles.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/GuiParticles.h" +) +source_group("net/minecraft/client/gui/particle" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_GUI_PARTICLE}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_LEVEL + "${CMAKE_CURRENT_SOURCE_DIR}/DemoLevel.h" +) +source_group("net/minecraft/client/level" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_LEVEL}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MODEL + "${CMAKE_CURRENT_SOURCE_DIR}/BatModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BatModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/BlazeModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BlazeModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/BoatModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BoatModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/BookModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BookModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ChestModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ChestModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ChickenModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ChickenModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/CowModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/CowModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/CreeperModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/CreeperModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EndermanModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EndermanModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/GhastModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/GhastModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/HumanoidModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/HumanoidModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/LargeChestModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/LargeChestModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/LavaSlimeModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/LavaSlimeModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/LeashKnotModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/LeashKnotModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MinecartModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MinecartModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ModelHorse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ModelHorse.h" + "${CMAKE_CURRENT_SOURCE_DIR}/OcelotModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/OcelotModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PigModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PigModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Polygon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Polygon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/QuadrupedModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/QuadrupedModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SheepFurModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SheepFurModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SheepModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SheepModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SignModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SignModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SilverfishModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SilverfishModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SkeletonHeadModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SkeletonHeadModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SkeletonModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SkeletonModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SkiModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SkiModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SlimeModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SlimeModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SnowManModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SnowManModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SpiderModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SpiderModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SquidModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SquidModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Vertex.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Vertex.h" + "${CMAKE_CURRENT_SOURCE_DIR}/VillagerGolemModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/VillagerGolemModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/VillagerModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/VillagerModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/VillagerZombieModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/VillagerZombieModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/WitchModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WitchModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/WitherBossModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WitherBossModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/WolfModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WolfModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ZombieModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ZombieModel.h" +) +source_group("net/minecraft/client/model" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MODEL}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MODEL_DRAGON + "${CMAKE_CURRENT_SOURCE_DIR}/DragonModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DragonModel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EnderCrystalModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EnderCrystalModel.h" +) +source_group("net/minecraft/client/model/dragon" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MODEL_DRAGON}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MODEL_GEOM + "${CMAKE_CURRENT_SOURCE_DIR}/Cube.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Cube.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Model.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Model.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ModelPart.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ModelPart.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TexOffs.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TexOffs.h" +) +source_group("net/minecraft/client/model/geom" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MODEL_GEOM}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MULTIPLAYER + "${CMAKE_CURRENT_SOURCE_DIR}/ClientConnection.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ClientConnection.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MultiPlayerChunkCache.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MultiPlayerChunkCache.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MultiPlayerGameMode.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MultiPlayerGameMode.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MultiPlayerLevel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MultiPlayerLevel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MultiPlayerLocalPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MultiPlayerLocalPlayer.h" +) +source_group("net/minecraft/client/multiplayer" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MULTIPLAYER}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_PARTICLE + "${CMAKE_CURRENT_SOURCE_DIR}/BreakingItemParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BreakingItemParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/BubbleParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BubbleParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/CritParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/CritParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/CritParticle2.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/CritParticle2.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DragonBreathParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DragonBreathParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DripParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DripParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EchantmentTableParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EchantmentTableParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EnderParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EnderParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ExplodeParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ExplodeParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/FireworksParticles.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/FireworksParticles.h" + "${CMAKE_CURRENT_SOURCE_DIR}/FlameParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/FlameParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/FootstepParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/FootstepParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/HeartParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/HeartParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/HugeExplosionParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/HugeExplosionParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/HugeExplosionSeedParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/HugeExplosionSeedParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/LavaParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/LavaParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/NetherPortalParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/NetherPortalParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/NoteParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/NoteParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Particle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Particle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ParticleEngine.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ParticleEngine.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerCloudParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerCloudParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/RedDustParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/RedDustParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SmokeParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SmokeParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SnowShovelParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SnowShovelParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SpellParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SpellParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SplashParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SplashParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SuspendedParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SuspendedParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SuspendedTownParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SuspendedTownParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TakeAnimationParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TakeAnimationParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TerrainParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TerrainParticle.h" + "${CMAKE_CURRENT_SOURCE_DIR}/WaterDropParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WaterDropParticle.h" +) +source_group("net/minecraft/client/particle" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_PARTICLE}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_PLAYER + "${CMAKE_CURRENT_SOURCE_DIR}/Input.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Input.h" + "${CMAKE_CURRENT_SOURCE_DIR}/LocalPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/LocalPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/RemotePlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/RemotePlayer.h" +) +source_group("net/minecraft/client/player" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_PLAYER}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER + "${CMAKE_CURRENT_SOURCE_DIR}/BossMobGuiInfo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BossMobGuiInfo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Chunk.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Chunk.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DirtyChunkSorter.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DirtyChunkSorter.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DistanceChunkSorter.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DistanceChunkSorter.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EntityTileRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EntityTileRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/GameRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/GameRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/HttpTexture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/HttpTexture.h" + "${CMAKE_CURRENT_SOURCE_DIR}/HttpTextureProcessor.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ItemInHandRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ItemInHandRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/LevelRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/LevelRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MemTexture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MobSkinMemTextureProcessor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MobSkinTextureProcessor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MobSkinTextureProcessor.h" + "${CMAKE_CURRENT_SOURCE_DIR}/OffsettedRenderList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/OffsettedRenderList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Rect2i.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Rect2i.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Tesselator.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Tesselator.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Textures.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Textures.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TileRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TileRenderer.h" +) +source_group("net/minecraft/client/renderer" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_CULLING + "${CMAKE_CURRENT_SOURCE_DIR}/AllowAllCuller.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/AllowAllCuller.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Culler.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Frustum.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Frustum.h" + "${CMAKE_CURRENT_SOURCE_DIR}/FrustumCuller.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/FrustumCuller.h" + "${CMAKE_CURRENT_SOURCE_DIR}/FrustumData.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/FrustumData.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ViewportCuller.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ViewportCuller.h" +) +source_group("net/minecraft/client/renderer/culling" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_CULLING}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_ENTITY + "${CMAKE_CURRENT_SOURCE_DIR}/ArrowRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ArrowRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/BatRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BatRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/BlazeRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BlazeRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/BoatRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BoatRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/CaveSpiderRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/CaveSpiderRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ChickenRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ChickenRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/CowRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/CowRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/CreeperRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/CreeperRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DefaultRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DefaultRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EnderCrystalRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EnderCrystalRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EnderDragonRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EnderDragonRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EndermanRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EndermanRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EntityRenderDispatcher.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EntityRenderDispatcher.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EntityRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EntityRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ExperienceOrbRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ExperienceOrbRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/FallingTileRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/FallingTileRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/FireballRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/FireballRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/FishingHookRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/FishingHookRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/GhastRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/GhastRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/GiantMobRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/GiantMobRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/HorseRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/HorseRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/HumanoidMobRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/HumanoidMobRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ItemFrameRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ItemFrameRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ItemRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ItemRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ItemSpriteRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ItemSpriteRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/LavaSlimeRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/LavaSlimeRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/LeashKnotRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/LeashKnotRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/LightningBoltRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/LightningBoltRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/LivingEntityRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/LivingEntityRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MinecartRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MinecartRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MinecartSpawnerRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MinecartSpawnerRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MobRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MobRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MushroomCowRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MushroomCowRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/OcelotRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/OcelotRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PaintingRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PaintingRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PigRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PigRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SheepRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SheepRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SilverfishRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SilverfishRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SkeletonRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SkeletonRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SlimeRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SlimeRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SnowManRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SnowManRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SpiderRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SpiderRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SquidRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SquidRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TntMinecartRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TntMinecartRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TntRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TntRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/VillagerGolemRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/VillagerGolemRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/VillagerRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/VillagerRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/WitchRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WitchRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/WitherBossRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WitherBossRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/WitherSkullRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WitherSkullRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/WolfRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WolfRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ZombieRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ZombieRenderer.h" +) +source_group("net/minecraft/client/renderer/entity" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_ENTITY}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_TEXTURE + "${CMAKE_CURRENT_SOURCE_DIR}/PreStitchedTextureMap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PreStitchedTextureMap.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SimpleIcon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SimpleIcon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/StitchSlot.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/StitchSlot.h" + "${CMAKE_CURRENT_SOURCE_DIR}/StitchedTexture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/StitchedTexture.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Stitcher.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Stitcher.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Texture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Texture.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TextureAtlas.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TextureAtlas.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TextureHolder.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TextureHolder.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TextureManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TextureManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TextureMap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TextureMap.h" +) +source_group("net/minecraft/client/renderer/texture" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_TEXTURE}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_TEXTURE_CUSTOM + "${CMAKE_CURRENT_SOURCE_DIR}/ClockTexture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ClockTexture.h" + "${CMAKE_CURRENT_SOURCE_DIR}/CompassTexture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/CompassTexture.h" +) +source_group("net/minecraft/client/renderer/texture/custom" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_TEXTURE_CUSTOM}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_TILEENTITY + "${CMAKE_CURRENT_SOURCE_DIR}/BeaconRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/BeaconRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ChestRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ChestRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EnchantTableRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EnchantTableRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EnderChestRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EnderChestRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MobSpawnerRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MobSpawnerRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PistonPieceRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PistonPieceRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SignRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SignRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/SkullTileRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/SkullTileRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TheEndPortalRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TheEndPortalRenderer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TileEntityRenderDispatcher.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TileEntityRenderDispatcher.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TileEntityRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TileEntityRenderer.h" +) +source_group("net/minecraft/client/renderer/tileentity" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_TILEENTITY}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RESOURCES + "${CMAKE_CURRENT_SOURCE_DIR}/ResourceLocation.h" +) +source_group("net/minecraft/client/resources" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RESOURCES}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_SKINS + "${CMAKE_CURRENT_SOURCE_DIR}/AbstractTexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/AbstractTexturePack.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DLCTexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DLCTexturePack.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DefaultTexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DefaultTexturePack.h" + "${CMAKE_CURRENT_SOURCE_DIR}/FileTexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/FileTexturePack.h" + "${CMAKE_CURRENT_SOURCE_DIR}/FolderTexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/FolderTexturePack.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TexturePack.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TexturePackRepository.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TexturePackRepository.h" +) +source_group("net/minecraft/client/skins" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_SKINS}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_TITLE + "${CMAKE_CURRENT_SOURCE_DIR}/TitleScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TitleScreen.h" +) +source_group("net/minecraft/client/title" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_TITLE}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER + "${CMAKE_CURRENT_SOURCE_DIR}/ConsoleInput.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ConsoleInput.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ConsoleInputSource.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DispenserBootstrap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DispenserBootstrap.h" + "${CMAKE_CURRENT_SOURCE_DIR}/MinecraftServer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/MinecraftServer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerInterface.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerScoreboard.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerScoreboard.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Settings.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Settings.h" +) +source_group("net/minecraft/server" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER_COMMANDS + "${CMAKE_CURRENT_SOURCE_DIR}/ServerCommandDispatcher.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerCommandDispatcher.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TeleportCommand.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TeleportCommand.h" +) +source_group("net/minecraft/server/commands" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER_COMMANDS}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER_LEVEL + "${CMAKE_CURRENT_SOURCE_DIR}/DerivedServerLevel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DerivedServerLevel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/EntityTracker.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/EntityTracker.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerChunkMap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerChunkMap.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerChunkCache.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerChunkCache.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerLevel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerLevel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerLevelListener.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerLevelListener.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerPlayerGameMode.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerPlayerGameMode.h" + "${CMAKE_CURRENT_SOURCE_DIR}/TrackedEntity.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/TrackedEntity.h" +) +source_group("net/minecraft/server/level" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER_LEVEL}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER_NETWORK + "${CMAKE_CURRENT_SOURCE_DIR}/PendingConnection.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PendingConnection.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerConnection.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerConnection.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerConnection.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerConnection.h" +) +source_group("net/minecraft/server/network" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER_NETWORK}) + +set(_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_STATS + "${CMAKE_CURRENT_SOURCE_DIR}/StatsCounter.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/StatsSyncher.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/StatsSyncher.h" +) +source_group("net/minecraft/stats" FILES ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_STATS}) + +set(MINECRAFT_CLIENT_COMMON + ${_MINECRAFT_CLIENT_COMMON_ROOT} + ${_MINECRAFT_CLIENT_COMMON_COMMON} + ${_MINECRAFT_CLIENT_COMMON_COMMON_AUDIO} + ${_MINECRAFT_CLIENT_COMMON_COMMON_COLOURS} + ${_MINECRAFT_CLIENT_COMMON_COMMON_DLC} + ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES} + ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELGENERATION} + ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELGENERATION_STRUCTUREACTIONS} + ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELRULES} + ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELRULES_RULEDEFINITIONS} + ${_MINECRAFT_CLIENT_COMMON_COMMON_GAMERULES_LEVELRULES_RULES} + ${_MINECRAFT_CLIENT_COMMON_COMMON_LEADERBOARDS} + ${_MINECRAFT_CLIENT_COMMON_COMMON_LOCALISATION} + ${_MINECRAFT_CLIENT_COMMON_COMMON_NETWORK} + ${_MINECRAFT_CLIENT_COMMON_COMMON_TELEMETRY} + ${_MINECRAFT_CLIENT_COMMON_COMMON_TRIAL} + ${_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL} + ${_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL_CONSTRAINTS} + ${_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL_HINTS} + ${_MINECRAFT_CLIENT_COMMON_COMMON_TUTORIAL_TASKS} + ${_MINECRAFT_CLIENT_COMMON_COMMON_UI} + ${_MINECRAFT_CLIENT_COMMON_COMMON_UI_ALL_PLATFORMS} + ${_MINECRAFT_CLIENT_COMMON_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS} + ${_MINECRAFT_CLIENT_COMMON_DURANGO_ROOT} + ${_MINECRAFT_CLIENT_COMMON_DURANGO_SERVICECONFIG} + ${_MINECRAFT_CLIENT_COMMON_DURANGO_ACHIEVEMENTS} + ${_MINECRAFT_CLIENT_COMMON_HEADER_FILES} + ${_MINECRAFT_CLIENT_COMMON_ORBIS_4JLIBS_INC} + ${_MINECRAFT_CLIENT_COMMON_PSVITA} + ${_MINECRAFT_CLIENT_COMMON_PSVITA_GAMECONFIG} + ${_MINECRAFT_CLIENT_COMMON_PSVITA_MILES_SOUND_SYSTEM_INCLUDE} + ${_MINECRAFT_CLIENT_COMMON_PSVITA_SOCIAL} + ${_MINECRAFT_CLIENT_COMMON_PSVITA_XML} + ${_MINECRAFT_CLIENT_COMMON_SOURCE_FILES} + ${_MINECRAFT_CLIENT_COMMON_WINDOWS64_IGGY_GDRAW} + ${_MINECRAFT_CLIENT_COMMON_WINDOWS64_NETWORK} + ${_MINECRAFT_CLIENT_COMMON_XBOX_4JLIBS_INC} + ${_MINECRAFT_CLIENT_COMMON_XBOX_AUDIO} + ${_MINECRAFT_CLIENT_COMMON_XBOX_NETWORK} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_GUI} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_GUI_ACHIEVEMENT} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_GUI_PARTICLE} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_LEVEL} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MODEL} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MODEL_DRAGON} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MODEL_GEOM} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_MULTIPLAYER} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_PARTICLE} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_PLAYER} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_CULLING} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_ENTITY} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_TEXTURE} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_TEXTURE_CUSTOM} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RENDERER_TILEENTITY} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_RESOURCES} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_SKINS} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_CLIENT_TITLE} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER_COMMANDS} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER_LEVEL} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_SERVER_NETWORK} + ${_MINECRAFT_CLIENT_COMMON_NET_MINECRAFT_STATS} +) diff --git a/Minecraft.Client/cmake/sources/Durango.cmake b/Minecraft.Client/cmake/sources/Durango.cmake new file mode 100644 index 00000000..e757316b --- /dev/null +++ b/Minecraft.Client/cmake/sources/Durango.cmake @@ -0,0 +1,503 @@ +set(BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Durango/") + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_RES_AUDIO + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/minecraft.xsb" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/resident.xwb" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/streamed.xwb" +) +source_group("Common/res/audio" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_RES_AUDIO}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_AUDIO + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Audio/SoundEngine.cpp" +) +source_group("Common/Audio" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_AUDIO}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_UI + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UI.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIBitmapFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIBitmapFont.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIController.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIController.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIGroup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIGroup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UILayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UILayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UITTFFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UITTFFont.h" +) +source_group("Common/UI" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_UI_COMPONENTS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Chat.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Chat.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIConsole.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIConsole.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIMarketingGuide.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIMarketingGuide.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Logo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Logo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_MenuBackground.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_MenuBackground.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Panorama.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Panorama.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_PressStartToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_PressStartToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Tooltips.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Tooltips.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_TutorialPopup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_TutorialPopup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HUD.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HUD.h" +) +source_group("Common/UI/Components" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_COMPONENTS}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_UI_CONTROLS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Base.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Base.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BeaconEffectButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BeaconEffectButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BitmapIcon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BitmapIcon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Button.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Button.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_ButtonList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_ButtonList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_CheckBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_CheckBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Cursor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Cursor.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DLCList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DLCList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DynamicLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DynamicLabel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentBook.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentBook.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_HTMLLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_HTMLLabel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Label.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Label.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_LeaderboardList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_LeaderboardList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftHorse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftHorse.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerSkinPreview.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerSkinPreview.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Progress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Progress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SaveList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SaveList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Slider.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Slider.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SlotList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SlotList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SpaceIndicatorBar.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SpaceIndicatorBar.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TextInput.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TextInput.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TexturePackList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TexturePackList.h" +) +source_group("Common/UI/Controls" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_CONTROLS}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ConnectingProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ConnectingProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FullscreenProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FullscreenProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Keyboard.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Keyboard.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_QuadrantSignin.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_QuadrantSignin.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Timer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Timer.h" +) +source_group("Common/UI/Scenes" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_DEBUG + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugCreateSchematic.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugCreateSchematic.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOptions.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOverlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOverlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugSetCamera.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugSetCamera.h" +) +source_group("Common/UI/Scenes/Debug" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_DEBUG}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/IUIScene_StartGame.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreateWorldMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreateWorldMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCMainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCMainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCOffersMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCOffersMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EULA.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EULA.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Intro.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Intro.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_JoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_JoinMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LaunchMoreOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LeaderboardsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LeaderboardsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadOrJoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadOrJoinMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_NewUpdateMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_NewUpdateMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SaveMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SaveMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TrialExitUpsell.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TrialExitUpsell.h" +) +source_group("Common/UI/Scenes/Frontend Menu screens" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_HELP__OPTIONS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ControlsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ControlsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Credits.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Credits.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlayMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlayMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LanguageSelector.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LanguageSelector.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ReinstallMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ReinstallMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsAudioMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsAudioMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsControlMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsControlMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsGraphicsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsGraphicsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsUIMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsUIMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.h" +) +source_group("Common/UI/Scenes/Help & Options" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_HELP__OPTIONS}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_INGAME_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameHostOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameHostOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameInfoMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameInfoMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGamePlayerOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameSaveManagementMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameSaveManagementMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SignEntryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SignEntryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TeleportMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TeleportMenu.h" +) +source_group("Common/UI/Scenes/In-Game Menu Screens" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_INGAME_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AbstractContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AbstractContainerMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AnvilMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AnvilMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BeaconMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BeaconMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BrewingStandMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BrewingStandMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ContainerMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreativeMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreativeMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DispenserMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DispenserMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EnchantingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EnchantingMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FireworksMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FireworksMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FurnaceMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FurnaceMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HopperMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HopperMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HorseInventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HorseInventoryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InventoryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TradingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TradingMenu.h" +) +source_group("Common/UI/Scenes/In-Game Menu Screens/Containers" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS}) + +set(_MINECRAFT_CLIENT_DURANGO_COMMON_ZLIB + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/adler32.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/compress.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/crc32.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/crc32.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/deflate.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/deflate.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzclose.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzguts.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzlib.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzread.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzwrite.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/infback.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffast.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffast.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffixed.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inflate.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inflate.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inftrees.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inftrees.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/trees.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/trees.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/uncompr.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zconf.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zlib.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zutil.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zutil.h" +) +source_group("Common/zlib" FILES ${_MINECRAFT_CLIENT_DURANGO_COMMON_ZLIB}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO + "${BASE_DIR}/Durango_App.cpp" + "${BASE_DIR}/Durango_App.h" + "${BASE_DIR}/Durango_UIController.cpp" + "${BASE_DIR}/Durango_UIController.h" + "${BASE_DIR}/Resource.h" + "${BASE_DIR}/SmallLogo.png" + "${BASE_DIR}/SplashScreen.png" + "${BASE_DIR}/StoreLogo.png" + "${BASE_DIR}/ApplicationView.cpp" + "${BASE_DIR}/ApplicationView.h" + "${BASE_DIR}/Durango_Minecraft.cpp" + "${BASE_DIR}/Minecraft_Macros.h" +) +source_group("Durango" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_4JLIBS_INC + "${BASE_DIR}/4JLibs/inc/4J_Input.h" + "${BASE_DIR}/4JLibs/inc/4J_Profile.h" + "${BASE_DIR}/4JLibs/inc/4J_Render.h" + "${BASE_DIR}/4JLibs/inc/4J_Storage.h" +) +source_group("Durango/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_DURANGOEXTRAS + "${BASE_DIR}/DurangoExtras/DurangoStubs.cpp" + "${BASE_DIR}/DurangoExtras/DurangoStubs.h" +) +source_group("Durango/DurangoExtras" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_DURANGOEXTRAS}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_IGGY_GDRAW + "${BASE_DIR}/Iggy/gdraw/gdraw_d3d10_shaders.inl" + "${BASE_DIR}/Iggy/gdraw/gdraw_d3d11.cpp" + "${BASE_DIR}/Iggy/gdraw/gdraw_d3d11.h" + "${BASE_DIR}/Iggy/gdraw/gdraw_d3d1x_shared.inl" + "${BASE_DIR}/Iggy/gdraw/gdraw_shared.inl" +) +source_group("Durango/Iggy/gdraw" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_IGGY_GDRAW}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_IGGY_INCLUDE + "${BASE_DIR}/Iggy/include/gdraw.h" + "${BASE_DIR}/Iggy/include/iggy.h" + "${BASE_DIR}/Iggy/include/iggyexpruntime.h" + "${BASE_DIR}/Iggy/include/iggyperfmon.h" + "${BASE_DIR}/Iggy/include/rrCore.h" +) +source_group("Durango/Iggy/include" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_MILES_SOUND_SYSTEM_INCLUDE + "${BASE_DIR}/Miles/include/mss.h" + "${BASE_DIR}/Miles/include/rrCore.h" +) +source_group("Durango/Miles Sound System/include" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_MILES_SOUND_SYSTEM_INCLUDE}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_NETWORK + "${BASE_DIR}/Network/ChatIntegrationLayer.cpp" + "${BASE_DIR}/Network/ChatIntegrationLayer.h" + "${BASE_DIR}/Network/DQRNetworkManager.cpp" + "${BASE_DIR}/Network/DQRNetworkManager.h" + "${BASE_DIR}/Network/DQRNetworkManager_FriendSessions.cpp" + "${BASE_DIR}/Network/DQRNetworkManager_Log.cpp" + "${BASE_DIR}/Network/DQRNetworkManager_SendReceive.cpp" + "${BASE_DIR}/Network/DQRNetworkManager_XRNSEvent.cpp" + "${BASE_DIR}/Network/DQRNetworkPlayer.cpp" + "${BASE_DIR}/Network/DQRNetworkPlayer.h" + "${BASE_DIR}/Network/NetworkPlayerDurango.cpp" + "${BASE_DIR}/Network/NetworkPlayerDurango.h" + "${BASE_DIR}/Network/PartyController.cpp" + "${BASE_DIR}/Network/PartyController.h" + "${BASE_DIR}/Network/PlatformNetworkManagerDurango.cpp" + "${BASE_DIR}/Network/PlatformNetworkManagerDurango.h" + "${BASE_DIR}/Network/base64.cpp" + "${BASE_DIR}/Network/base64.h" +) +source_group("Durango/Network" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_NETWORK}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_ACHIEVEMENTS + "${BASE_DIR}/Achievements/AchievementManager.cpp" +) +source_group("Durango/Achievements" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_ACHIEVEMENTS}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_LEADERBOARDS + "${BASE_DIR}/Leaderboards/DurangoLeaderboardManager.cpp" + "${BASE_DIR}/Leaderboards/DurangoLeaderboardManager.h" + "${BASE_DIR}/Leaderboards/DurangoStatsDebugger.cpp" + "${BASE_DIR}/Leaderboards/DurangoStatsDebugger.h" + "${BASE_DIR}/Leaderboards/GameProgress.cpp" + "${BASE_DIR}/Leaderboards/GameProgress.h" +) +source_group("Durango/Leaderboards" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_SENTIENT + "${BASE_DIR}/Sentient/DurangoTelemetry.cpp" + "${BASE_DIR}/Sentient/DurangoTelemetry.h" + "${BASE_DIR}/Sentient/DynamicConfigurations.h" + "${BASE_DIR}/Sentient/MinecraftTelemetry.h" + "${BASE_DIR}/Sentient/SentientManager.h" + "${BASE_DIR}/Sentient/SentientStats.h" + "${BASE_DIR}/Sentient/SentientTelemetryCommon.h" + "${BASE_DIR}/Sentient/TelemetryEnum.h" +) +source_group("Durango/Sentient" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_SENTIENT}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_SOCIAL + "${BASE_DIR}/Social/SocialManager.h" +) +source_group("Durango/Social" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_SOCIAL}) + +set(_MINECRAFT_CLIENT_DURANGO_DURANGO_XML + "${BASE_DIR}/XML/ATGXmlParser.cpp" + "${BASE_DIR}/XML/ATGXmlParser.h" + "${BASE_DIR}/XML/xmlFilesCallback.h" +) +source_group("Durango/XML" FILES ${_MINECRAFT_CLIENT_DURANGO_DURANGO_XML}) + +set(_MINECRAFT_CLIENT_DURANGO_PS3 + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Passphrase/ps3__np_conf.h" +) +source_group("PS3" FILES ${_MINECRAFT_CLIENT_DURANGO_PS3}) + +set(_MINECRAFT_CLIENT_DURANGO_PS3_IGGY_INCLUDE + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/gdraw.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggy.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyexpruntime.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyperfmon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyperfmon_ps3.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/rrCore.h" +) +source_group("PS3/Iggy/include" FILES ${_MINECRAFT_CLIENT_DURANGO_PS3_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_DURANGO_PS3_PS3EXTRAS + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/ShutdownManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/ShutdownManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/winerror.h" +) +source_group("PS3/PS3Extras" FILES ${_MINECRAFT_CLIENT_DURANGO_PS3_PS3EXTRAS}) + +set(_MINECRAFT_CLIENT_DURANGO_SOURCE_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/Extrax64Stubs.cpp" +) +source_group("Source Files" FILES ${_MINECRAFT_CLIENT_DURANGO_SOURCE_FILES}) + +set(_MINECRAFT_CLIENT_DURANGO_XBOX_SENTIENTLIBS_INC + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientAvatar.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientBoxArt.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientConfig.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCore.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCulture.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenBoxArt.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenClientUGC.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenCore.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenNews.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenSuperstars.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientDynamicConfig.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientFame.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientFile.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientHelp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientMain.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientMarkers.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientNews.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientPackage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientRawData.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientResource.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientStats.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientSuperstars.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientSys.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientTypes.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUGC.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUGCLeaderboards.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUGCTypes.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUser.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUtil.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientXML.h" +) +source_group("Xbox/SentientLibs/inc" FILES ${_MINECRAFT_CLIENT_DURANGO_XBOX_SENTIENTLIBS_INC}) + +set(_MINECRAFT_CLIENT_DURANGO_XBOX_SENTIENT_DYNAMICCONF + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/trialConfigv1.bin" +) +source_group("Xbox/Sentient/DynamicConf" FILES ${_MINECRAFT_CLIENT_DURANGO_XBOX_SENTIENT_DYNAMICCONF}) + +set(MINECRAFT_CLIENT_DURANGO + ${_MINECRAFT_CLIENT_DURANGO_COMMON_RES_AUDIO} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_AUDIO} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_COMPONENTS} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_CONTROLS} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_DEBUG} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_HELP__OPTIONS} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_INGAME_MENU_SCREENS} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS} + ${_MINECRAFT_CLIENT_DURANGO_COMMON_ZLIB} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_4JLIBS_INC} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_DURANGOEXTRAS} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_IGGY_GDRAW} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_MILES_SOUND_SYSTEM_INCLUDE} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_NETWORK} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_ACHIEVEMENTS} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_LEADERBOARDS} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_SENTIENT} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_SOCIAL} + ${_MINECRAFT_CLIENT_DURANGO_DURANGO_XML} + ${_MINECRAFT_CLIENT_DURANGO_PS3} + ${_MINECRAFT_CLIENT_DURANGO_PS3_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_DURANGO_PS3_PS3EXTRAS} + ${_MINECRAFT_CLIENT_DURANGO_SOURCE_FILES} + ${_MINECRAFT_CLIENT_DURANGO_XBOX_SENTIENTLIBS_INC} + ${_MINECRAFT_CLIENT_DURANGO_XBOX_SENTIENT_DYNAMICCONF} +) diff --git a/Minecraft.Client/cmake/sources/ORBIS.cmake b/Minecraft.Client/cmake/sources/ORBIS.cmake new file mode 100644 index 00000000..2ab11c7b --- /dev/null +++ b/Minecraft.Client/cmake/sources/ORBIS.cmake @@ -0,0 +1,570 @@ +set(BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Orbis/") + +set(_MINECRAFT_CLIENT_ORBIS_ROOT + "${BASE_DIR}/GameConfig/Minecraft.spa" +) +source_group("" FILES ${_MINECRAFT_CLIENT_ORBIS_ROOT}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_RES_AUDIO + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/minecraft.xsb" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/resident.xwb" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/streamed.xwb" +) +source_group("Common/res/audio" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_RES_AUDIO}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_AUDIO + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Audio/SoundEngine.cpp" +) +source_group("Common/Audio" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_AUDIO}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_LEADERBOARDS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/SonyLeaderboardManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/SonyLeaderboardManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/base64.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/base64.h" +) +source_group("Common/Leaderboards" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_NETWORK_SONY + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/NetworkPlayerSony.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/NetworkPlayerSony.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/PlatformNetworkManagerSony.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/PlatformNetworkManagerSony.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyCommerce.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyHttp.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyHttp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyRemoteStorage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyRemoteStorage.h" +) +source_group("Common/Network/Sony" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_NETWORK_SONY}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_UI + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UI.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIBitmapFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIBitmapFont.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIController.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIController.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIGroup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIGroup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UILayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UILayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UITTFFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UITTFFont.h" +) +source_group("Common/UI" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_UI_COMPONENTS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Chat.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Chat.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIConsole.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIConsole.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIMarketingGuide.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIMarketingGuide.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Logo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Logo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_MenuBackground.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_MenuBackground.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Panorama.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Panorama.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_PressStartToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_PressStartToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Tooltips.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Tooltips.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_TutorialPopup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_TutorialPopup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HUD.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HUD.h" +) +source_group("Common/UI/Components" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_COMPONENTS}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_UI_CONTROLS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Base.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Base.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BeaconEffectButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BeaconEffectButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BitmapIcon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BitmapIcon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Button.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Button.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_ButtonList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_ButtonList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_CheckBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_CheckBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Cursor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Cursor.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DLCList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DLCList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DynamicLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DynamicLabel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentBook.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentBook.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_HTMLLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_HTMLLabel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Label.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Label.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_LeaderboardList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_LeaderboardList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftHorse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftHorse.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerSkinPreview.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerSkinPreview.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Progress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Progress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SaveList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SaveList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Slider.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Slider.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SlotList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SlotList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SpaceIndicatorBar.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SpaceIndicatorBar.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TextInput.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TextInput.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TexturePackList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TexturePackList.h" +) +source_group("Common/UI/Controls" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_CONTROLS}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ConnectingProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ConnectingProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FullscreenProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FullscreenProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Keyboard.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Keyboard.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_QuadrantSignin.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_QuadrantSignin.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Timer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Timer.h" +) +source_group("Common/UI/Scenes" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_DEBUG + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugCreateSchematic.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugCreateSchematic.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOptions.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOverlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOverlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugSetCamera.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugSetCamera.h" +) +source_group("Common/UI/Scenes/Debug" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_DEBUG}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/IUIScene_StartGame.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreateWorldMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreateWorldMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCMainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCMainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCOffersMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCOffersMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EULA.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EULA.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Intro.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Intro.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_JoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_JoinMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LaunchMoreOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LeaderboardsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LeaderboardsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadOrJoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadOrJoinMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_NewUpdateMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_NewUpdateMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SaveMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SaveMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TrialExitUpsell.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TrialExitUpsell.h" +) +source_group("Common/UI/Scenes/Frontend Menu screens" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_HELP__OPTIONS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ControlsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ControlsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Credits.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Credits.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlayMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlayMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LanguageSelector.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LanguageSelector.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ReinstallMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ReinstallMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsAudioMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsAudioMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsControlMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsControlMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsGraphicsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsGraphicsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsUIMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsUIMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.h" +) +source_group("Common/UI/Scenes/Help & Options" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_HELP__OPTIONS}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_INGAME_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameHostOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameHostOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameInfoMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameInfoMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGamePlayerOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameSaveManagementMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameSaveManagementMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SignEntryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SignEntryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TeleportMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TeleportMenu.h" +) +source_group("Common/UI/Scenes/In-Game Menu Screens" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_INGAME_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AbstractContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AbstractContainerMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AnvilMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AnvilMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BeaconMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BeaconMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BrewingStandMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BrewingStandMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ContainerMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreativeMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreativeMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DispenserMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DispenserMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EnchantingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EnchantingMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FireworksMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FireworksMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FurnaceMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FurnaceMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HopperMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HopperMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HorseInventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HorseInventoryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InventoryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TradingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TradingMenu.h" +) +source_group("Common/UI/Scenes/In-Game Menu Screens/Containers" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS}) + +set(_MINECRAFT_CLIENT_ORBIS_COMMON_ZLIB + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/adler32.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/compress.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/crc32.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/crc32.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/deflate.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/deflate.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/infback.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffast.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffast.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffixed.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inflate.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inflate.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inftrees.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inftrees.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/trees.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/trees.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/uncompr.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zconf.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zlib.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zutil.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zutil.h" +) +source_group("Common/zlib" FILES ${_MINECRAFT_CLIENT_ORBIS_COMMON_ZLIB}) + +set(_MINECRAFT_CLIENT_ORBIS_DURANGO_XML + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/XML/ATGXmlParser.h" +) +source_group("Durango/XML" FILES ${_MINECRAFT_CLIENT_ORBIS_DURANGO_XML}) + +set(_MINECRAFT_CLIENT_ORBIS_HEADER_FILES + "${BASE_DIR}/GameConfig/Minecraft.spa.h" +) +source_group("Header Files" FILES ${_MINECRAFT_CLIENT_ORBIS_HEADER_FILES}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS + "${BASE_DIR}/Orbis_App.cpp" + "${BASE_DIR}/Orbis_App.h" + "${BASE_DIR}/Orbis_PlayerUID.cpp" + "${BASE_DIR}/Orbis_PlayerUID.h" + "${BASE_DIR}/Orbis_UIController.cpp" + "${BASE_DIR}/Orbis_UIController.h" + "${BASE_DIR}/user_malloc.cpp" + "${BASE_DIR}/user_malloc_for_tls.cpp" + "${BASE_DIR}/user_new.cpp" + "${BASE_DIR}/Minecraft_Macros.h" + "${BASE_DIR}/Orbis_Minecraft.cpp" + "${BASE_DIR}/ps4__np_conf.h" +) +source_group("Orbis" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS_IGGY_GDRAW + "${BASE_DIR}/Iggy/gdraw/gdraw_orbis.cpp" + "${BASE_DIR}/Iggy/gdraw/gdraw_orbis.h" + "${BASE_DIR}/Iggy/gdraw/gdraw_orbis_shaders.inl" + "${BASE_DIR}/Iggy/gdraw/gdraw_shared.inl" +) +source_group("Orbis/Iggy/gdraw" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS_IGGY_GDRAW}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS_IGGY_INCLUDE + "${BASE_DIR}/Iggy/include/gdraw.h" + "${BASE_DIR}/Iggy/include/iggy.h" + "${BASE_DIR}/Iggy/include/iggyexpruntime.h" + "${BASE_DIR}/Iggy/include/iggyperfmon.h" + "${BASE_DIR}/Iggy/include/iggyperfmon_orbis.h" + "${BASE_DIR}/Iggy/include/rrCore.h" +) +source_group("Orbis/Iggy/include" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS_MILES_SOUND_SYSTEM_INCLUDE + "${BASE_DIR}/Miles/include/mss.h" + "${BASE_DIR}/Miles/include/rrCore.h" +) +source_group("Orbis/Miles Sound System/include" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS_MILES_SOUND_SYSTEM_INCLUDE}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS_MILES_SOUND_SYSTEM_LIB + "${BASE_DIR}/Miles/lib/mssorbis.a" +) +source_group("Orbis/Miles Sound System/lib" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS_MILES_SOUND_SYSTEM_LIB}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS_NETWORK + "${BASE_DIR}/Network/Orbis_NPToolkit.cpp" + "${BASE_DIR}/Network/Orbis_NPToolkit.h" + "${BASE_DIR}/Network/PsPlusUpsellWrapper_Orbis.cpp" + "${BASE_DIR}/Network/PsPlusUpsellWrapper_Orbis.h" + "${BASE_DIR}/Network/SQRNetworkManager_Orbis.cpp" + "${BASE_DIR}/Network/SQRNetworkManager_Orbis.h" + "${BASE_DIR}/Network/SonyCommerce_Orbis.cpp" + "${BASE_DIR}/Network/SonyCommerce_Orbis.h" + "${BASE_DIR}/Network/SonyHttp_Orbis.cpp" + "${BASE_DIR}/Network/SonyHttp_Orbis.h" + "${BASE_DIR}/Network/SonyRemoteStorage_Orbis.cpp" + "${BASE_DIR}/Network/SonyRemoteStorage_Orbis.h" + "${BASE_DIR}/Network/SonyVoiceChat_Orbis.cpp" + "${BASE_DIR}/Network/SonyVoiceChat_Orbis.h" +) +source_group("Orbis/Network" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS_NETWORK}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS_ORBISEXTRAS + "${BASE_DIR}/OrbisExtras/OrbisMaths.h" + "${BASE_DIR}/OrbisExtras/OrbisStubs.cpp" + "${BASE_DIR}/OrbisExtras/OrbisStubs.h" + "${BASE_DIR}/OrbisExtras/OrbisTypes.h" + "${BASE_DIR}/OrbisExtras/TLSStorage.cpp" + "${BASE_DIR}/OrbisExtras/TLSStorage.h" + "${BASE_DIR}/OrbisExtras/winerror.h" +) +source_group("Orbis/OrbisExtras" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS_ORBISEXTRAS}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS_LEADERBOARDS + "${BASE_DIR}/Leaderboards/OrbisLeaderboardManager.cpp" + "${BASE_DIR}/Leaderboards/OrbisLeaderboardManager.h" +) +source_group("Orbis/Leaderboards" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS_SENTIENT + "${BASE_DIR}/Sentient/DynamicConfigurations.h" + "${BASE_DIR}/Sentient/MinecraftTelemetry.h" + "${BASE_DIR}/Sentient/SentientManager.h" + "${BASE_DIR}/Sentient/SentientStats.h" + "${BASE_DIR}/Sentient/SentientTelemetryCommon.h" + "${BASE_DIR}/Sentient/TelemetryEnum.h" +) +source_group("Orbis/Sentient" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS_SENTIENT}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS_SOCIAL + "${BASE_DIR}/Social/SocialManager.h" +) +source_group("Orbis/Social" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS_SOCIAL}) + +set(_MINECRAFT_CLIENT_ORBIS_ORBIS_XML + "${BASE_DIR}/XML/ATGXmlParser.h" +) +source_group("Orbis/XML" FILES ${_MINECRAFT_CLIENT_ORBIS_ORBIS_XML}) + +set(_MINECRAFT_CLIENT_ORBIS_PS3 + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Passphrase/ps3__np_conf.h" +) +source_group("PS3" FILES ${_MINECRAFT_CLIENT_ORBIS_PS3}) + +set(_MINECRAFT_CLIENT_ORBIS_PS3_4JLIBS_INC + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/4JLibs/inc/4J_Input.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/4JLibs/inc/4J_Profile.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/4JLibs/inc/4J_Render.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/4JLibs/inc/4J_Storage.h" +) +source_group("PS3/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_ORBIS_PS3_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_ORBIS_PS3_IGGY_INCLUDE + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/gdraw.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggy.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyexpruntime.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyperfmon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyperfmon_ps3.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/rrCore.h" +) +source_group("PS3/Iggy/include" FILES ${_MINECRAFT_CLIENT_ORBIS_PS3_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_ORBIS_PS3_PS3EXTRAS + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/ShutdownManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/ShutdownManager.h" +) +source_group("PS3/PS3Extras" FILES ${_MINECRAFT_CLIENT_ORBIS_PS3_PS3EXTRAS}) + +set(_MINECRAFT_CLIENT_ORBIS_PS3_SENTIENT + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Sentient/MinecraftTelemetry.h" +) +source_group("PS3/Sentient" FILES ${_MINECRAFT_CLIENT_ORBIS_PS3_SENTIENT}) + +set(_MINECRAFT_CLIENT_ORBIS_SOURCE_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/Extrax64Stubs.cpp" +) +source_group("Source Files" FILES ${_MINECRAFT_CLIENT_ORBIS_SOURCE_FILES}) + +set(_MINECRAFT_CLIENT_ORBIS_WINDOWS + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/MinecraftWindows.rc" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Resource.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/targetver.h" +) +source_group("Windows" FILES ${_MINECRAFT_CLIENT_ORBIS_WINDOWS}) + +set(_MINECRAFT_CLIENT_ORBIS_WINDOWS64_4JLIBS_INC + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Input.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Profile.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Render.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Storage.h" +) +source_group("Windows64/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_ORBIS_WINDOWS64_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_ORBIS_XBOX_SENTIENTLIBS_INC + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientAvatar.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientBoxArt.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientConfig.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCore.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCulture.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenBoxArt.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenClientUGC.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenCore.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenNews.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenSuperstars.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientDynamicConfig.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientFame.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientFile.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientHelp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientMain.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientMarkers.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientNews.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientPackage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientRawData.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientResource.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientStats.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientSuperstars.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientSys.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientTypes.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUGC.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUGCLeaderboards.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUGCTypes.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUser.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUtil.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientXML.h" +) +source_group("Xbox/SentientLibs/inc" FILES ${_MINECRAFT_CLIENT_ORBIS_XBOX_SENTIENTLIBS_INC}) + +set(_MINECRAFT_CLIENT_ORBIS_NET_MINECRAFT_CLIENT_MULTIPLAYER + "${CMAKE_CURRENT_SOURCE_DIR}/ConnectScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ConnectScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DisconnectedScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DisconnectedScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerInfo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ReceivingLevelScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ReceivingLevelScreen.h" +) +source_group("net/minecraft/client/multiplayer" FILES ${_MINECRAFT_CLIENT_ORBIS_NET_MINECRAFT_CLIENT_MULTIPLAYER}) + +set(_MINECRAFT_CLIENT_ORBIS_NET_MINECRAFT_STATS + "${CMAKE_CURRENT_SOURCE_DIR}/StatsCounter.h" +) +source_group("net/minecraft/stats" FILES ${_MINECRAFT_CLIENT_ORBIS_NET_MINECRAFT_STATS}) + +set(MINECRAFT_CLIENT_ORBIS + ${_MINECRAFT_CLIENT_ORBIS_ROOT} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_RES_AUDIO} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_AUDIO} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_LEADERBOARDS} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_NETWORK_SONY} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_COMPONENTS} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_CONTROLS} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_DEBUG} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_HELP__OPTIONS} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_INGAME_MENU_SCREENS} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS} + ${_MINECRAFT_CLIENT_ORBIS_COMMON_ZLIB} + ${_MINECRAFT_CLIENT_ORBIS_DURANGO_XML} + ${_MINECRAFT_CLIENT_ORBIS_HEADER_FILES} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS_IGGY_GDRAW} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS_MILES_SOUND_SYSTEM_INCLUDE} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS_MILES_SOUND_SYSTEM_LIB} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS_NETWORK} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS_ORBISEXTRAS} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS_LEADERBOARDS} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS_SENTIENT} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS_SOCIAL} + ${_MINECRAFT_CLIENT_ORBIS_ORBIS_XML} + ${_MINECRAFT_CLIENT_ORBIS_PS3} + ${_MINECRAFT_CLIENT_ORBIS_PS3_4JLIBS_INC} + ${_MINECRAFT_CLIENT_ORBIS_PS3_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_ORBIS_PS3_PS3EXTRAS} + ${_MINECRAFT_CLIENT_ORBIS_PS3_SENTIENT} + ${_MINECRAFT_CLIENT_ORBIS_SOURCE_FILES} + ${_MINECRAFT_CLIENT_ORBIS_WINDOWS} + ${_MINECRAFT_CLIENT_ORBIS_WINDOWS64_4JLIBS_INC} + ${_MINECRAFT_CLIENT_ORBIS_XBOX_SENTIENTLIBS_INC} + ${_MINECRAFT_CLIENT_ORBIS_NET_MINECRAFT_CLIENT_MULTIPLAYER} + ${_MINECRAFT_CLIENT_ORBIS_NET_MINECRAFT_STATS} +) diff --git a/Minecraft.Client/cmake/sources/PS3.cmake b/Minecraft.Client/cmake/sources/PS3.cmake new file mode 100644 index 00000000..8fd40f5e --- /dev/null +++ b/Minecraft.Client/cmake/sources/PS3.cmake @@ -0,0 +1,663 @@ +set(BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/PS3/") + +set(_MINECRAFT_CLIENT_PS3_COMMON_AUDIO + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Audio/SoundEngine.cpp" +) +source_group("Common/Audio" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_AUDIO}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_LEADERBOARDS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/SonyLeaderboardManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/SonyLeaderboardManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/base64.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/base64.h" +) +source_group("Common/Leaderboards" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_NETWORK_SONY + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/NetworkPlayerSony.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/NetworkPlayerSony.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/PlatformNetworkManagerSony.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/PlatformNetworkManagerSony.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyCommerce.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyHttp.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyHttp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyRemoteStorage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyRemoteStorage.h" +) +source_group("Common/Network/Sony" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_NETWORK_SONY}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_UI + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UI.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIBitmapFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIBitmapFont.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIController.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIController.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIGroup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIGroup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UILayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UILayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UITTFFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UITTFFont.h" +) +source_group("Common/UI" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_UI}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_UI_COMPONENTS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Chat.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Chat.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIConsole.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIConsole.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIMarketingGuide.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIMarketingGuide.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Logo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Logo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_MenuBackground.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_MenuBackground.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Panorama.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Panorama.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_PressStartToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_PressStartToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Tooltips.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Tooltips.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_TutorialPopup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_TutorialPopup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HUD.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HUD.h" +) +source_group("Common/UI/Components" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_UI_COMPONENTS}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_UI_CONTROLS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Base.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Base.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BeaconEffectButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BeaconEffectButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BitmapIcon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BitmapIcon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Button.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Button.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_ButtonList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_ButtonList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_CheckBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_CheckBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Cursor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Cursor.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DLCList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DLCList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DynamicLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DynamicLabel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentBook.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentBook.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_HTMLLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_HTMLLabel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Label.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Label.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_LeaderboardList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_LeaderboardList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftHorse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftHorse.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerSkinPreview.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerSkinPreview.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Progress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Progress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SaveList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SaveList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Slider.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Slider.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SlotList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SlotList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SpaceIndicatorBar.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SpaceIndicatorBar.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TextInput.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TextInput.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TexturePackList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TexturePackList.h" +) +source_group("Common/UI/Controls" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_UI_CONTROLS}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ConnectingProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ConnectingProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FullscreenProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FullscreenProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Keyboard.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Keyboard.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_QuadrantSignin.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_QuadrantSignin.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Timer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Timer.h" +) +source_group("Common/UI/Scenes" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_DEBUG + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugCreateSchematic.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugCreateSchematic.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOptions.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOverlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOverlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugSetCamera.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugSetCamera.h" +) +source_group("Common/UI/Scenes/Debug" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_DEBUG}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/IUIScene_StartGame.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreateWorldMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreateWorldMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCMainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCMainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCOffersMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCOffersMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EULA.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EULA.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Intro.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Intro.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_JoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_JoinMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LaunchMoreOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LeaderboardsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LeaderboardsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadOrJoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadOrJoinMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_NewUpdateMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_NewUpdateMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SaveMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SaveMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TrialExitUpsell.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TrialExitUpsell.h" +) +source_group("Common/UI/Scenes/Frontend Menu screens" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_HELP__OPTIONS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ControlsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ControlsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Credits.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Credits.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlayMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlayMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LanguageSelector.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LanguageSelector.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ReinstallMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ReinstallMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsAudioMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsAudioMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsControlMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsControlMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsGraphicsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsGraphicsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsUIMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsUIMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.h" +) +source_group("Common/UI/Scenes/Help & Options" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_HELP__OPTIONS}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_INGAME_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameHostOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameHostOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameInfoMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameInfoMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGamePlayerOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SignEntryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SignEntryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TeleportMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TeleportMenu.h" +) +source_group("Common/UI/Scenes/In-Game Menu Screens" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_INGAME_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AbstractContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AbstractContainerMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AnvilMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AnvilMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BeaconMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BeaconMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BrewingStandMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BrewingStandMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ContainerMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreativeMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreativeMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DispenserMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DispenserMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EnchantingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EnchantingMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FireworksMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FireworksMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FurnaceMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FurnaceMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HopperMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HopperMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HorseInventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HorseInventoryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InventoryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TradingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TradingMenu.h" +) +source_group("Common/UI/Scenes/In-Game Menu Screens/Containers" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS}) + +set(_MINECRAFT_CLIENT_PS3_COMMON_ZLIB + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/adler32.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/compress.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/crc32.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/crc32.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/deflate.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/deflate.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzclose.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzguts.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzlib.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzread.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzwrite.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/infback.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffast.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffast.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffixed.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inflate.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inflate.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inftrees.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inftrees.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/trees.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/trees.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/uncompr.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zconf.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zlib.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zutil.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zutil.h" +) +source_group("Common/zlib" FILES ${_MINECRAFT_CLIENT_PS3_COMMON_ZLIB}) + +set(_MINECRAFT_CLIENT_PS3_DURANGO + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Durango_UIController.h" +) +source_group("Durango" FILES ${_MINECRAFT_CLIENT_PS3_DURANGO}) + +set(_MINECRAFT_CLIENT_PS3_DURANGO_IGGY_GDRAW + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d10_shaders.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d11.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d1x_shared.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_shared.inl" +) +source_group("Durango/Iggy/gdraw" FILES ${_MINECRAFT_CLIENT_PS3_DURANGO_IGGY_GDRAW}) + +set(_MINECRAFT_CLIENT_PS3_DURANGO_IGGY_INCLUDE + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/gdraw.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggy.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggyexpruntime.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggyperfmon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/rrCore.h" +) +source_group("Durango/Iggy/include" FILES ${_MINECRAFT_CLIENT_PS3_DURANGO_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_PS3_PS3 + "${BASE_DIR}/PS3Extras/C4JSpursJob.cpp" + "${BASE_DIR}/PS3Extras/C4JSpursJob.h" + "${BASE_DIR}/PS3_App.cpp" + "${BASE_DIR}/PS3_App.h" + "${BASE_DIR}/PS3_UIController.cpp" + "${BASE_DIR}/PS3_UIController.h" + "${BASE_DIR}/Passphrase/ps3__np_conf.h" + "${BASE_DIR}/Minecraft_Macros.h" + "${BASE_DIR}/PS3_Minecraft.cpp" + "${BASE_DIR}/PS3_PlayerUID.cpp" + "${BASE_DIR}/PS3_PlayerUID.h" +) +source_group("PS3" FILES ${_MINECRAFT_CLIENT_PS3_PS3}) + +set(_MINECRAFT_CLIENT_PS3_PS3_4JLIBS + "${BASE_DIR}/4JLibs/STO_TitleSmallStorage.cpp" + "${BASE_DIR}/4JLibs/STO_TitleSmallStorage.h" +) +source_group("PS3/4JLibs" FILES ${_MINECRAFT_CLIENT_PS3_PS3_4JLIBS}) + +set(_MINECRAFT_CLIENT_PS3_PS3_4JLIBS_INC + "${BASE_DIR}/4JLibs/inc/4J_Input.h" + "${BASE_DIR}/4JLibs/inc/4J_Profile.h" + "${BASE_DIR}/4JLibs/inc/4J_Render.h" + "${BASE_DIR}/4JLibs/inc/4J_Storage.h" +) +source_group("PS3/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_PS3_PS3_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_PS3_PS3_CHUNKREBUILD_SPU + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/BedTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/BookshelfTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/BrewingStandTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Bush_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/ButtonTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/CactusTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/CakeTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/CauldronTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/ChestTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/ChunkRebuildData.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/ChunkRebuildData.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/CocoaTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/CropTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/DetectorRailTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/DiodeTile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/DiodeTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Direction_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/DirectionalTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/DirtTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/DispenserTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/DoorTile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/DoorTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/EggTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/EnchantmentTableTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/EntityTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Facing_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Facing_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/FarmTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/FenceGateTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/FenceTile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/FenceTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/FireTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/FurnaceTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/GlassTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/GrassTile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/GrassTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/HalfSlabTile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/HalfSlabTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/HalfTransparentTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/HugeMushroomTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/IceTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Icon_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Icon_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/LadderTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/LeafTile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/LeafTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/LeverTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/LiquidTile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/LiquidTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Material_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/MelonTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Mushroom_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/MycelTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/NetherStalkTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/PistonBaseTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/PistonExtensionTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/PistonMovingPiece_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/PortalTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/PressurePlateTile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/PressurePlateTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/PumpkinTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/RailTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/RecordPlayerTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/RedStoneDustTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/RedlightTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/ReedTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/SandStoneTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Sapling_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/SignTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/SmoothStoneBrickTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/StairTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/StemTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/StoneMonsterTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TallGrass_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TallGrass_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Tesselator_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Tesselator_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TheEndPortalFrameTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TheEndPortal_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/ThinFenceTile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/ThinFenceTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TileRenderer_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TileRenderer_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/Tile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TntTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TopSnowTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TorchTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TrapDoorTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/TreeTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/VineTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/WaterLilyTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/WebTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/WoodTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/WorkbenchTile_SPU.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/stdafx.h" + "${BASE_DIR}/SPU_Tasks/ChunkUpdate/stubs_SPU.h" +) +source_group("PS3/ChunkRebuild_SPU" FILES ${_MINECRAFT_CLIENT_PS3_PS3_CHUNKREBUILD_SPU}) + +set(_MINECRAFT_CLIENT_PS3_PS3_COMPRESSEDTILE_SPU + "${BASE_DIR}/SPU_Tasks/CompressedTile/CompressedTileStorage_SPU.cpp" + "${BASE_DIR}/SPU_Tasks/CompressedTile/CompressedTileStorage_SPU.h" +) +source_group("PS3/CompressedTile_SPU" FILES ${_MINECRAFT_CLIENT_PS3_PS3_COMPRESSEDTILE_SPU}) + +set(_MINECRAFT_CLIENT_PS3_PS3_IGGY_GDRAW + "${BASE_DIR}/Iggy/gdraw/gdraw_ps3gcm.cpp" + "${BASE_DIR}/Iggy/gdraw/gdraw_ps3gcm.h" + "${BASE_DIR}/Iggy/gdraw/gdraw_ps3gcm_shaders.inl" + "${BASE_DIR}/Iggy/gdraw/gdraw_shared.inl" +) +source_group("PS3/Iggy/gdraw" FILES ${_MINECRAFT_CLIENT_PS3_PS3_IGGY_GDRAW}) + +set(_MINECRAFT_CLIENT_PS3_PS3_IGGY_INCLUDE + "${BASE_DIR}/Iggy/include/gdraw.h" + "${BASE_DIR}/Iggy/include/iggy.h" + "${BASE_DIR}/Iggy/include/iggyexpruntime.h" + "${BASE_DIR}/Iggy/include/iggyperfmon.h" + "${BASE_DIR}/Iggy/include/iggyperfmon_ps3.h" + "${BASE_DIR}/Iggy/include/rrCore.h" +) +source_group("PS3/Iggy/include" FILES ${_MINECRAFT_CLIENT_PS3_PS3_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_PS3_PS3_MILES_SOUND_SYSTEM_INCLUDE + "${BASE_DIR}/Miles/include/mss.h" + "${BASE_DIR}/Miles/include/rrCore.h" +) +source_group("PS3/Miles Sound System/include" FILES ${_MINECRAFT_CLIENT_PS3_PS3_MILES_SOUND_SYSTEM_INCLUDE}) + +set(_MINECRAFT_CLIENT_PS3_PS3_MILES_SOUND_SYSTEM_LIB + "${BASE_DIR}/Miles/lib/audps3.a" + "${BASE_DIR}/Miles/lib/fltps3.a" + "${BASE_DIR}/Miles/lib/mssps3.a" +) +source_group("PS3/Miles Sound System/lib" FILES ${_MINECRAFT_CLIENT_PS3_PS3_MILES_SOUND_SYSTEM_LIB}) + +set(_MINECRAFT_CLIENT_PS3_PS3_MILES_SOUND_SYSTEM_LIB_SPU + "${BASE_DIR}/Miles/lib/spu/binkaspu.a" + "${BASE_DIR}/Miles/lib/spu/mssppu_raw.a" + "${BASE_DIR}/Miles/lib/spu/mssppu_spurs.a" + "${BASE_DIR}/Miles/lib/spu/mssppu_sputhreads.a" + "${BASE_DIR}/Miles/lib/spu/mssspu.a" + "${BASE_DIR}/Miles/lib/spu/mssspu_raw.a" + "${BASE_DIR}/Miles/lib/spu/mssspu_spurs.a" + "${BASE_DIR}/Miles/lib/spu/mssspu_sputhreads.a" +) +source_group("PS3/Miles Sound System/lib/spu" FILES ${_MINECRAFT_CLIENT_PS3_PS3_MILES_SOUND_SYSTEM_LIB_SPU}) + +set(_MINECRAFT_CLIENT_PS3_PS3_PS3EXTRAS + "${BASE_DIR}/PS3Extras/C4JThread_SPU.cpp" + "${BASE_DIR}/PS3Extras/C4JThread_SPU.h" + "${BASE_DIR}/PS3Extras/EdgeZLib.cpp" + "${BASE_DIR}/PS3Extras/EdgeZLib.h" + "${BASE_DIR}/PS3Extras/PS3Maths.h" + "${BASE_DIR}/PS3Extras/PS3Strings.cpp" + "${BASE_DIR}/PS3Extras/PS3Strings.h" + "${BASE_DIR}/PS3Extras/Ps3Stubs.cpp" + "${BASE_DIR}/PS3Extras/Ps3Stubs.h" + "${BASE_DIR}/PS3Extras/Ps3Types.h" + "${BASE_DIR}/PS3Extras/ShutdownManager.cpp" + "${BASE_DIR}/PS3Extras/ShutdownManager.h" + "${BASE_DIR}/PS3Extras/TLSStorage.cpp" + "${BASE_DIR}/PS3Extras/TLSStorage.h" + "${BASE_DIR}/PS3Extras/winerror.h" +) +source_group("PS3/PS3Extras" FILES ${_MINECRAFT_CLIENT_PS3_PS3_PS3EXTRAS}) + +set(_MINECRAFT_CLIENT_PS3_PS3_AUDIO + "${BASE_DIR}/Audio/PS3_SoundEngine.cpp" +) +source_group("PS3/Audio" FILES ${_MINECRAFT_CLIENT_PS3_PS3_AUDIO}) + +set(_MINECRAFT_CLIENT_PS3_PS3_LEADERBOARDS + "${BASE_DIR}/Leaderboards/PS3LeaderboardManager.cpp" + "${BASE_DIR}/Leaderboards/PS3LeaderboardManager.h" +) +source_group("PS3/Leaderboards" FILES ${_MINECRAFT_CLIENT_PS3_PS3_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_PS3_PS3_NETWORK + "${BASE_DIR}/Network/SQRNetworkManager_PS3.cpp" + "${BASE_DIR}/Network/SQRNetworkManager_PS3.h" + "${BASE_DIR}/Network/SonyCommerce_PS3.cpp" + "${BASE_DIR}/Network/SonyCommerce_PS3.h" + "${BASE_DIR}/Network/SonyHttp_PS3.cpp" + "${BASE_DIR}/Network/SonyHttp_PS3.h" + "${BASE_DIR}/Network/SonyRemoteStorage_PS3.cpp" + "${BASE_DIR}/Network/SonyRemoteStorage_PS3.h" + "${BASE_DIR}/Network/SonyVoiceChat.cpp" + "${BASE_DIR}/Network/SonyVoiceChat.h" +) +source_group("PS3/Network" FILES ${_MINECRAFT_CLIENT_PS3_PS3_NETWORK}) + +set(_MINECRAFT_CLIENT_PS3_PS3_SENTIENT + "${BASE_DIR}/Sentient/DynamicConfigurations.h" + "${BASE_DIR}/Sentient/MinecraftTelemetry.h" + "${BASE_DIR}/Sentient/SentientManager.h" + "${BASE_DIR}/Sentient/SentientStats.h" + "${BASE_DIR}/Sentient/SentientTelemetryCommon.h" + "${BASE_DIR}/Sentient/TelemetryEnum.h" +) +source_group("PS3/Sentient" FILES ${_MINECRAFT_CLIENT_PS3_PS3_SENTIENT}) + +set(_MINECRAFT_CLIENT_PS3_PS3_SOCIAL + "${BASE_DIR}/Social/SocialManager.h" +) +source_group("PS3/Social" FILES ${_MINECRAFT_CLIENT_PS3_PS3_SOCIAL}) + +set(_MINECRAFT_CLIENT_PS3_SOURCE_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/Extrax64Stubs.cpp" +) +source_group("Source Files" FILES ${_MINECRAFT_CLIENT_PS3_SOURCE_FILES}) + +set(_MINECRAFT_CLIENT_PS3_WINDOWS + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/MinecraftWindows.rc" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Resource.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/targetver.h" +) +source_group("Windows" FILES ${_MINECRAFT_CLIENT_PS3_WINDOWS}) + +set(_MINECRAFT_CLIENT_PS3_WINDOWS64 + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Resource.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Windows64_App.h" +) +source_group("Windows64" FILES ${_MINECRAFT_CLIENT_PS3_WINDOWS64}) + +set(_MINECRAFT_CLIENT_PS3_WINDOWS64_4JLIBS_INC + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Input.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Profile.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Render.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Storage.h" +) +source_group("Windows64/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_PS3_WINDOWS64_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_PS3_WINDOWS64_GAMECONFIG + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/GameConfig/Minecraft.gameconfig" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/GameConfig/Minecraft.spa" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/GameConfig/Minecraft.spa.h" +) +source_group("Windows64/GameConfig" FILES ${_MINECRAFT_CLIENT_PS3_WINDOWS64_GAMECONFIG}) + +set(_MINECRAFT_CLIENT_PS3_WINDOWS64_XML + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/XML/ATGXmlParser.h" +) +source_group("Windows64/XML" FILES ${_MINECRAFT_CLIENT_PS3_WINDOWS64_XML}) + +set(_MINECRAFT_CLIENT_PS3_NET_MINECRAFT_CLIENT_MULTIPLAYER + "${CMAKE_CURRENT_SOURCE_DIR}/ConnectScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ConnectScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DisconnectedScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DisconnectedScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerInfo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ReceivingLevelScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ReceivingLevelScreen.h" +) +source_group("net/minecraft/client/multiplayer" FILES ${_MINECRAFT_CLIENT_PS3_NET_MINECRAFT_CLIENT_MULTIPLAYER}) + +set(_MINECRAFT_CLIENT_PS3_NET_MINECRAFT_STATS + "${CMAKE_CURRENT_SOURCE_DIR}/StatsCounter.h" +) +source_group("net/minecraft/stats" FILES ${_MINECRAFT_CLIENT_PS3_NET_MINECRAFT_STATS}) + +set(MINECRAFT_CLIENT_PS3 + ${_MINECRAFT_CLIENT_PS3_COMMON_AUDIO} + ${_MINECRAFT_CLIENT_PS3_COMMON_LEADERBOARDS} + ${_MINECRAFT_CLIENT_PS3_COMMON_NETWORK_SONY} + ${_MINECRAFT_CLIENT_PS3_COMMON_UI} + ${_MINECRAFT_CLIENT_PS3_COMMON_UI_COMPONENTS} + ${_MINECRAFT_CLIENT_PS3_COMMON_UI_CONTROLS} + ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES} + ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_DEBUG} + ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS} + ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_HELP__OPTIONS} + ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_INGAME_MENU_SCREENS} + ${_MINECRAFT_CLIENT_PS3_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS} + ${_MINECRAFT_CLIENT_PS3_COMMON_ZLIB} + ${_MINECRAFT_CLIENT_PS3_DURANGO} + ${_MINECRAFT_CLIENT_PS3_DURANGO_IGGY_GDRAW} + ${_MINECRAFT_CLIENT_PS3_DURANGO_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_PS3_PS3} + ${_MINECRAFT_CLIENT_PS3_PS3_4JLIBS} + ${_MINECRAFT_CLIENT_PS3_PS3_4JLIBS_INC} + ${_MINECRAFT_CLIENT_PS3_PS3_CHUNKREBUILD_SPU} + ${_MINECRAFT_CLIENT_PS3_PS3_COMPRESSEDTILE_SPU} + ${_MINECRAFT_CLIENT_PS3_PS3_IGGY_GDRAW} + ${_MINECRAFT_CLIENT_PS3_PS3_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_PS3_PS3_MILES_SOUND_SYSTEM_INCLUDE} + ${_MINECRAFT_CLIENT_PS3_PS3_MILES_SOUND_SYSTEM_LIB} + ${_MINECRAFT_CLIENT_PS3_PS3_MILES_SOUND_SYSTEM_LIB_SPU} + ${_MINECRAFT_CLIENT_PS3_PS3_PS3EXTRAS} + ${_MINECRAFT_CLIENT_PS3_PS3_AUDIO} + ${_MINECRAFT_CLIENT_PS3_PS3_LEADERBOARDS} + ${_MINECRAFT_CLIENT_PS3_PS3_NETWORK} + ${_MINECRAFT_CLIENT_PS3_PS3_SENTIENT} + ${_MINECRAFT_CLIENT_PS3_PS3_SOCIAL} + ${_MINECRAFT_CLIENT_PS3_SOURCE_FILES} + ${_MINECRAFT_CLIENT_PS3_WINDOWS} + ${_MINECRAFT_CLIENT_PS3_WINDOWS64} + ${_MINECRAFT_CLIENT_PS3_WINDOWS64_4JLIBS_INC} + ${_MINECRAFT_CLIENT_PS3_WINDOWS64_GAMECONFIG} + ${_MINECRAFT_CLIENT_PS3_WINDOWS64_XML} + ${_MINECRAFT_CLIENT_PS3_NET_MINECRAFT_CLIENT_MULTIPLAYER} + ${_MINECRAFT_CLIENT_PS3_NET_MINECRAFT_STATS} +) diff --git a/Minecraft.Client/cmake/sources/PSVita.cmake b/Minecraft.Client/cmake/sources/PSVita.cmake new file mode 100644 index 00000000..3a7c68c5 --- /dev/null +++ b/Minecraft.Client/cmake/sources/PSVita.cmake @@ -0,0 +1,489 @@ +set(BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/PSVita/") + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_AUDIO + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Audio/SoundEngine.cpp" +) +source_group("Common/Audio" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_AUDIO}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_LEADERBOARDS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/SonyLeaderboardManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/SonyLeaderboardManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/base64.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Leaderboards/base64.h" +) +source_group("Common/Leaderboards" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_NETWORK_SONY + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/NetworkPlayerSony.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/NetworkPlayerSony.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/PlatformNetworkManagerSony.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/PlatformNetworkManagerSony.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SQRNetworkPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyCommerce.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyHttp.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyHttp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyRemoteStorage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/Sony/SonyRemoteStorage.h" +) +source_group("Common/Network/Sony" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_NETWORK_SONY}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_UI + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UI.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIBitmapFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIBitmapFont.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIController.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIController.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIGroup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIGroup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UILayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UILayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UITTFFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UITTFFont.h" +) +source_group("Common/UI" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_UI_COMPONENTS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Chat.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Chat.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIConsole.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIConsole.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIMarketingGuide.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIMarketingGuide.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Logo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Logo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_MenuBackground.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_MenuBackground.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Panorama.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Panorama.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_PressStartToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_PressStartToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Tooltips.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Tooltips.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_TutorialPopup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_TutorialPopup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HUD.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HUD.h" +) +source_group("Common/UI/Components" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_COMPONENTS}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_UI_CONTROLS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Base.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Base.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BeaconEffectButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BeaconEffectButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BitmapIcon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BitmapIcon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Button.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Button.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_ButtonList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_ButtonList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_CheckBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_CheckBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Cursor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Cursor.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DLCList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DLCList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DynamicLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DynamicLabel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentBook.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentBook.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_HTMLLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_HTMLLabel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Label.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Label.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_LeaderboardList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_LeaderboardList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftHorse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftHorse.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerSkinPreview.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerSkinPreview.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Progress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Progress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SaveList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SaveList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Slider.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Slider.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SlotList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SlotList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SpaceIndicatorBar.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SpaceIndicatorBar.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TextInput.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TextInput.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TexturePackList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TexturePackList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Touch.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Touch.h" +) +source_group("Common/UI/Controls" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_CONTROLS}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ConnectingProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ConnectingProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FullscreenProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FullscreenProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Keyboard.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Keyboard.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_QuadrantSignin.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_QuadrantSignin.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Timer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Timer.h" +) +source_group("Common/UI/Scenes" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_DEBUG + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugCreateSchematic.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugCreateSchematic.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOptions.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOverlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOverlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugSetCamera.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugSetCamera.h" +) +source_group("Common/UI/Scenes/Debug" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_DEBUG}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/IUIScene_StartGame.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreateWorldMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreateWorldMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCMainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCMainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCOffersMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCOffersMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EULA.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EULA.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Intro.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Intro.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_JoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_JoinMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LaunchMoreOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LeaderboardsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LeaderboardsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadOrJoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadOrJoinMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_NewUpdateMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_NewUpdateMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SaveMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SaveMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TrialExitUpsell.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TrialExitUpsell.h" +) +source_group("Common/UI/Scenes/Frontend Menu screens" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_HELP__OPTIONS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ControlsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ControlsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Credits.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Credits.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlayMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlayMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LanguageSelector.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LanguageSelector.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ReinstallMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ReinstallMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsAudioMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsAudioMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsControlMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsControlMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsGraphicsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsGraphicsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsUIMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsUIMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.h" +) +source_group("Common/UI/Scenes/Help & Options" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_HELP__OPTIONS}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_INGAME_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameHostOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameHostOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameInfoMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameInfoMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGamePlayerOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SignEntryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SignEntryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TeleportMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TeleportMenu.h" +) +source_group("Common/UI/Scenes/In-Game Menu Screens" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_INGAME_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AbstractContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AbstractContainerMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AnvilMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AnvilMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BeaconMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BeaconMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BrewingStandMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BrewingStandMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ContainerMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreativeMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreativeMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DispenserMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DispenserMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EnchantingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EnchantingMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FireworksMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FireworksMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FurnaceMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FurnaceMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HopperMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HopperMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HorseInventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HorseInventoryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InventoryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TradingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TradingMenu.h" +) +source_group("Common/UI/Scenes/In-Game Menu Screens/Containers" FILES ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS}) + +set(_MINECRAFT_CLIENT_PSVITA_DURANGO + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Durango_UIController.h" +) +source_group("Durango" FILES ${_MINECRAFT_CLIENT_PSVITA_DURANGO}) + +set(_MINECRAFT_CLIENT_PSVITA_DURANGO_IGGY_GDRAW + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d10_shaders.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d11.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d1x_shared.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_shared.inl" +) +source_group("Durango/Iggy/gdraw" FILES ${_MINECRAFT_CLIENT_PSVITA_DURANGO_IGGY_GDRAW}) + +set(_MINECRAFT_CLIENT_PSVITA_DURANGO_IGGY_INCLUDE + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/gdraw.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggy.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggyexpruntime.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggyperfmon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/rrCore.h" +) +source_group("Durango/Iggy/include" FILES ${_MINECRAFT_CLIENT_PSVITA_DURANGO_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_PSVITA_PS3_4JLIBS_INC + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/4JLibs/inc/4J_Input.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/4JLibs/inc/4J_Profile.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/4JLibs/inc/4J_Render.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/4JLibs/inc/4J_Storage.h" +) +source_group("PS3/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_PSVITA_PS3_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_PSVITA_PSVITA + "${BASE_DIR}/PSVita_App.cpp" + "${BASE_DIR}/PSVita_UIController.cpp" + "${BASE_DIR}/PSVita_UIController.h" + "${BASE_DIR}/PSVita_Minecraft.cpp" +) +source_group("PSVita" FILES ${_MINECRAFT_CLIENT_PSVITA_PSVITA}) + +set(_MINECRAFT_CLIENT_PSVITA_PSVITA_4JLIBS_INC + "${BASE_DIR}/4JLibs/inc/4J_Input.h" + "${BASE_DIR}/4JLibs/inc/4J_Profile.h" + "${BASE_DIR}/4JLibs/inc/4J_Render.h" + "${BASE_DIR}/4JLibs/inc/4J_Storage.h" +) +source_group("PSVita/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_PSVITA_PSVITA_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_PSVITA_PSVITA_IGGY_GDRAW + "${BASE_DIR}/Iggy/gdraw/gdraw_psp2.cpp" + "${BASE_DIR}/Iggy/gdraw/gdraw_psp2.h" + "${BASE_DIR}/Iggy/gdraw/gdraw_psp2_shaders.inl" + "${BASE_DIR}/Iggy/gdraw/gdraw_shared.inl" +) +source_group("PSVita/Iggy/gdraw" FILES ${_MINECRAFT_CLIENT_PSVITA_PSVITA_IGGY_GDRAW}) + +set(_MINECRAFT_CLIENT_PSVITA_PSVITA_IGGY_INCLUDE + "${BASE_DIR}/Iggy/include/gdraw.h" + "${BASE_DIR}/Iggy/include/iggy.h" + "${BASE_DIR}/Iggy/include/iggyexpruntime.h" + "${BASE_DIR}/Iggy/include/iggyperfmon.h" + "${BASE_DIR}/Iggy/include/iggyperfmon_psp2.h" + "${BASE_DIR}/Iggy/include/rrCore.h" +) +source_group("PSVita/Iggy/include" FILES ${_MINECRAFT_CLIENT_PSVITA_PSVITA_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_PSVITA_PSVITA_PSVITAEXTRAS + "${BASE_DIR}/PSVitaExtras/Conf.h" + "${BASE_DIR}/PSVitaExtras/CustomMap.cpp" + "${BASE_DIR}/PSVitaExtras/CustomMap.h" + "${BASE_DIR}/PSVitaExtras/CustomSet.cpp" + "${BASE_DIR}/PSVitaExtras/CustomSet.h" + "${BASE_DIR}/PSVitaExtras/PSVitaMaths.h" + "${BASE_DIR}/PSVitaExtras/PSVitaStrings.cpp" + "${BASE_DIR}/PSVitaExtras/PSVitaStrings.h" + "${BASE_DIR}/PSVitaExtras/PSVitaStubs.h" + "${BASE_DIR}/PSVitaExtras/PSVitaTLSStorage.cpp" + "${BASE_DIR}/PSVitaExtras/PSVitaTLSStorage.h" + "${BASE_DIR}/PSVitaExtras/PSVitaTypes.h" + "${BASE_DIR}/PSVitaExtras/PsVitaStubs.cpp" + "${BASE_DIR}/PSVitaExtras/ShutdownManager.cpp" + "${BASE_DIR}/PSVitaExtras/ShutdownManager.h" + "${BASE_DIR}/PSVitaExtras/libdivide.h" + "${BASE_DIR}/PSVitaExtras/user_malloc.c" + "${BASE_DIR}/PSVitaExtras/user_malloc_for_tls.c" + "${BASE_DIR}/PSVitaExtras/user_new.cpp" + "${BASE_DIR}/PSVitaExtras/zconf.h" + "${BASE_DIR}/PSVitaExtras/zlib.h" +) +source_group("PSVita/PSVitaExtras" FILES ${_MINECRAFT_CLIENT_PSVITA_PSVITA_PSVITAEXTRAS}) + +set(_MINECRAFT_CLIENT_PSVITA_PSVITA_LEADERBOARDS + "${BASE_DIR}/Leaderboards/PSVitaLeaderboardManager.cpp" + "${BASE_DIR}/Leaderboards/PSVitaLeaderboardManager.h" +) +source_group("PSVita/Leaderboards" FILES ${_MINECRAFT_CLIENT_PSVITA_PSVITA_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_PSVITA_PSVITA_NETWORK + "${BASE_DIR}/Network/PSVita_NPToolkit.cpp" + "${BASE_DIR}/Network/PSVita_NPToolkit.h" + "${BASE_DIR}/Network/SQRNetworkManager_AdHoc_Vita.cpp" + "${BASE_DIR}/Network/SQRNetworkManager_AdHoc_Vita.h" + "${BASE_DIR}/Network/SQRNetworkManager_Vita.cpp" + "${BASE_DIR}/Network/SQRNetworkManager_Vita.h" + "${BASE_DIR}/Network/SonyCommerce_Vita.cpp" + "${BASE_DIR}/Network/SonyCommerce_Vita.h" + "${BASE_DIR}/Network/SonyHttp_Vita.cpp" + "${BASE_DIR}/Network/SonyHttp_Vita.h" + "${BASE_DIR}/Network/SonyRemoteStorage_Vita.cpp" + "${BASE_DIR}/Network/SonyRemoteStorage_Vita.h" + "${BASE_DIR}/Network/SonyVoiceChat_Vita.cpp" + "${BASE_DIR}/Network/SonyVoiceChat_Vita.h" +) +source_group("PSVita/Network" FILES ${_MINECRAFT_CLIENT_PSVITA_PSVITA_NETWORK}) + +set(_MINECRAFT_CLIENT_PSVITA_PSVITA_SENTIENT + "${BASE_DIR}/Sentient/DynamicConfigurations.h" + "${BASE_DIR}/Sentient/MinecraftTelemetry.h" + "${BASE_DIR}/Sentient/SentientManager.h" + "${BASE_DIR}/Sentient/SentientStats.h" + "${BASE_DIR}/Sentient/SentientTelemetryCommon.h" + "${BASE_DIR}/Sentient/TelemetryEnum.h" +) +source_group("PSVita/Sentient" FILES ${_MINECRAFT_CLIENT_PSVITA_PSVITA_SENTIENT}) + +set(_MINECRAFT_CLIENT_PSVITA_SOURCE_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/Extrax64Stubs.cpp" +) +source_group("Source Files" FILES ${_MINECRAFT_CLIENT_PSVITA_SOURCE_FILES}) + +set(_MINECRAFT_CLIENT_PSVITA_WINDOWS + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/MinecraftWindows.rc" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Resource.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/targetver.h" +) +source_group("Windows" FILES ${_MINECRAFT_CLIENT_PSVITA_WINDOWS}) + +set(_MINECRAFT_CLIENT_PSVITA_WINDOWS64 + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Resource.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/Windows64_App.h" +) +source_group("Windows64" FILES ${_MINECRAFT_CLIENT_PSVITA_WINDOWS64}) + +set(_MINECRAFT_CLIENT_PSVITA_WINDOWS64_4JLIBS_INC + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Input.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Profile.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Render.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/4JLibs/inc/4J_Storage.h" +) +source_group("Windows64/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_PSVITA_WINDOWS64_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_PSVITA_WINDOWS64_GAMECONFIG + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/GameConfig/Minecraft.gameconfig" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/GameConfig/Minecraft.spa" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/GameConfig/Minecraft.spa.h" +) +source_group("Windows64/GameConfig" FILES ${_MINECRAFT_CLIENT_PSVITA_WINDOWS64_GAMECONFIG}) + +set(_MINECRAFT_CLIENT_PSVITA_WINDOWS64_XML + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/XML/ATGXmlParser.h" +) +source_group("Windows64/XML" FILES ${_MINECRAFT_CLIENT_PSVITA_WINDOWS64_XML}) + +set(_MINECRAFT_CLIENT_PSVITA_NET_MINECRAFT_CLIENT_MULTIPLAYER + "${CMAKE_CURRENT_SOURCE_DIR}/ConnectScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ConnectScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DisconnectedScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DisconnectedScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerInfo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ReceivingLevelScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ReceivingLevelScreen.h" +) +source_group("net/minecraft/client/multiplayer" FILES ${_MINECRAFT_CLIENT_PSVITA_NET_MINECRAFT_CLIENT_MULTIPLAYER}) + +set(_MINECRAFT_CLIENT_PSVITA_NET_MINECRAFT_STATS + "${CMAKE_CURRENT_SOURCE_DIR}/StatsCounter.h" +) +source_group("net/minecraft/stats" FILES ${_MINECRAFT_CLIENT_PSVITA_NET_MINECRAFT_STATS}) + +set(MINECRAFT_CLIENT_PSVITA + ${_MINECRAFT_CLIENT_PSVITA_COMMON_AUDIO} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_LEADERBOARDS} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_NETWORK_SONY} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_COMPONENTS} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_CONTROLS} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_DEBUG} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_HELP__OPTIONS} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_INGAME_MENU_SCREENS} + ${_MINECRAFT_CLIENT_PSVITA_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS} + ${_MINECRAFT_CLIENT_PSVITA_DURANGO} + ${_MINECRAFT_CLIENT_PSVITA_DURANGO_IGGY_GDRAW} + ${_MINECRAFT_CLIENT_PSVITA_DURANGO_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_PSVITA_PS3_4JLIBS_INC} + ${_MINECRAFT_CLIENT_PSVITA_PSVITA} + ${_MINECRAFT_CLIENT_PSVITA_PSVITA_4JLIBS_INC} + ${_MINECRAFT_CLIENT_PSVITA_PSVITA_IGGY_GDRAW} + ${_MINECRAFT_CLIENT_PSVITA_PSVITA_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_PSVITA_PSVITA_PSVITAEXTRAS} + ${_MINECRAFT_CLIENT_PSVITA_PSVITA_LEADERBOARDS} + ${_MINECRAFT_CLIENT_PSVITA_PSVITA_NETWORK} + ${_MINECRAFT_CLIENT_PSVITA_PSVITA_SENTIENT} + ${_MINECRAFT_CLIENT_PSVITA_SOURCE_FILES} + ${_MINECRAFT_CLIENT_PSVITA_WINDOWS} + ${_MINECRAFT_CLIENT_PSVITA_WINDOWS64} + ${_MINECRAFT_CLIENT_PSVITA_WINDOWS64_4JLIBS_INC} + ${_MINECRAFT_CLIENT_PSVITA_WINDOWS64_GAMECONFIG} + ${_MINECRAFT_CLIENT_PSVITA_WINDOWS64_XML} + ${_MINECRAFT_CLIENT_PSVITA_NET_MINECRAFT_CLIENT_MULTIPLAYER} + ${_MINECRAFT_CLIENT_PSVITA_NET_MINECRAFT_STATS} +) diff --git a/Minecraft.Client/cmake/sources/Windows.cmake b/Minecraft.Client/cmake/sources/Windows.cmake new file mode 100644 index 00000000..7fc07abd --- /dev/null +++ b/Minecraft.Client/cmake/sources/Windows.cmake @@ -0,0 +1,507 @@ +set(BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/") + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_RES_AUDIO + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/minecraft.xsb" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/resident.xwb" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/streamed.xwb" +) +source_group("Common/res/audio" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_RES_AUDIO}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_AUDIO + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Audio/SoundEngine.cpp" +) +source_group("Common/Audio" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_AUDIO}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_NETWORK + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/PlatformNetworkManagerStub.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/Network/PlatformNetworkManagerStub.h" +) +source_group("Common/Network" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_NETWORK}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UI.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIBitmapFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIBitmapFont.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIController.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIController.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIGroup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIGroup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UILayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UILayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UITTFFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UITTFFont.h" +) +source_group("Common/UI" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_COMPONENTS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Chat.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Chat.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIConsole.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIConsole.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIMarketingGuide.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_DebugUIMarketingGuide.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Logo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Logo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_MenuBackground.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_MenuBackground.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Panorama.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Panorama.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_PressStartToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_PressStartToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Tooltips.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_Tooltips.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_TutorialPopup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIComponent_TutorialPopup.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HUD.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HUD.h" +) +source_group("Common/UI/Components" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_COMPONENTS}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_CONTROLS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Base.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Base.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BeaconEffectButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BeaconEffectButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BitmapIcon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_BitmapIcon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Button.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Button.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_ButtonList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_ButtonList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_CheckBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_CheckBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Cursor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Cursor.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DLCList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DLCList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DynamicLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_DynamicLabel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentBook.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentBook.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_EnchantmentButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_HTMLLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_HTMLLabel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Label.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Label.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_LeaderboardList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_LeaderboardList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftHorse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftHorse.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_MinecraftPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerSkinPreview.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_PlayerSkinPreview.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Progress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Progress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SaveList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SaveList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Slider.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_Slider.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SlotList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SlotList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SpaceIndicatorBar.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_SpaceIndicatorBar.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TextInput.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TextInput.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TexturePackList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIControl_TexturePackList.h" +) +source_group("Common/UI/Controls" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_CONTROLS}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ConnectingProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ConnectingProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FullscreenProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FullscreenProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Keyboard.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Keyboard.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MessageBox.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_QuadrantSignin.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_QuadrantSignin.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Timer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Timer.h" +) +source_group("Common/UI/Scenes" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_DEBUG + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugCreateSchematic.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugCreateSchematic.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOptions.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOverlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugOverlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugSetCamera.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DebugSetCamera.h" +) +source_group("Common/UI/Scenes/Debug" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_DEBUG}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/IUIScene_StartGame.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreateWorldMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreateWorldMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCMainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCMainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCOffersMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DLCOffersMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EULA.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EULA.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Intro.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Intro.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_JoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_JoinMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LaunchMoreOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LeaderboardsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LeaderboardsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadOrJoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LoadOrJoinMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_MainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_NewUpdateMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_NewUpdateMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SaveMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SaveMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TrialExitUpsell.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TrialExitUpsell.h" +) +source_group("Common/UI/Scenes/Frontend Menu screens" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_HELP__OPTIONS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ControlsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ControlsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Credits.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_Credits.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HelpAndOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlayMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HowToPlayMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LanguageSelector.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_LanguageSelector.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ReinstallMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ReinstallMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsAudioMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsAudioMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsControlMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsControlMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsGraphicsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsGraphicsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsUIMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SettingsUIMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SkinSelectMenu.h" +) +source_group("Common/UI/Scenes/Help & Options" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_HELP__OPTIONS}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_INGAME_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameHostOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameHostOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameInfoMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGameInfoMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InGamePlayerOptionsMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_PauseMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SignEntryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_SignEntryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TeleportMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TeleportMenu.h" +) +source_group("Common/UI/Scenes/In-Game Menu Screens" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_INGAME_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AbstractContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AbstractContainerMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AnvilMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_AnvilMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BeaconMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BeaconMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BrewingStandMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_BrewingStandMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ContainerMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreativeMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CreativeMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DispenserMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DispenserMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EnchantingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EnchantingMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FireworksMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FireworksMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FurnaceMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_FurnaceMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HopperMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HopperMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HorseInventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_HorseInventoryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_InventoryMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TradingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_TradingMenu.h" +) +source_group("Common/UI/Scenes/In-Game Menu Screens/Containers" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS}) + +set(_MINECRAFT_CLIENT_WINDOWS_COMMON_ZLIB + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/adler32.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/compress.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/crc32.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/crc32.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/deflate.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/deflate.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzclose.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzguts.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzlib.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzread.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/gzwrite.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/infback.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffast.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffast.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inffixed.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inflate.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inflate.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inftrees.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/inftrees.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/trees.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/trees.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/uncompr.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zconf.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zlib.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zutil.c" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/zlib/zutil.h" +) +source_group("Common/zlib" FILES ${_MINECRAFT_CLIENT_WINDOWS_COMMON_ZLIB}) + +set(_MINECRAFT_CLIENT_WINDOWS_DURANGO + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Durango_UIController.h" +) +source_group("Durango" FILES ${_MINECRAFT_CLIENT_WINDOWS_DURANGO}) + +set(_MINECRAFT_CLIENT_WINDOWS_DURANGO_IGGY_GDRAW + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d10_shaders.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d11.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d1x_shared.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_shared.inl" +) +source_group("Durango/Iggy/gdraw" FILES ${_MINECRAFT_CLIENT_WINDOWS_DURANGO_IGGY_GDRAW}) + +set(_MINECRAFT_CLIENT_WINDOWS_DURANGO_IGGY_INCLUDE + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/gdraw.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggy.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggyexpruntime.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggyperfmon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/rrCore.h" +) +source_group("Durango/Iggy/include" FILES ${_MINECRAFT_CLIENT_WINDOWS_DURANGO_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_WINDOWS_PS3_IGGY_INCLUDE + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/gdraw.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggy.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyexpruntime.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyperfmon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyperfmon_ps3.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/rrCore.h" +) +source_group("PS3/Iggy/include" FILES ${_MINECRAFT_CLIENT_WINDOWS_PS3_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_WINDOWS_PS3_PS3EXTRAS + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/ShutdownManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/ShutdownManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/winerror.h" +) +source_group("PS3/PS3Extras" FILES ${_MINECRAFT_CLIENT_WINDOWS_PS3_PS3EXTRAS}) + +set(_MINECRAFT_CLIENT_WINDOWS_SOURCE_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/Extrax64Stubs.cpp" +) +source_group("Source Files" FILES ${_MINECRAFT_CLIENT_WINDOWS_SOURCE_FILES}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/MinecraftWindows.rc" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Resource.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/targetver.h" +) +source_group("Windows" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64 + "${BASE_DIR}/Resource.h" + "${BASE_DIR}/Windows64_App.cpp" + "${BASE_DIR}/Windows64_App.h" + "${BASE_DIR}/Windows64_UIController.cpp" + "${BASE_DIR}/Windows64_UIController.h" + "${BASE_DIR}/KeyboardMouseInput.cpp" + "${BASE_DIR}/KeyboardMouseInput.h" + "${BASE_DIR}/Minecraft_Macros.h" + "${BASE_DIR}/PostProcesser.cpp" + "${BASE_DIR}/Windows64_Minecraft.cpp" +) +source_group("Windows64" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_4JLIBS_INC + "${BASE_DIR}/4JLibs/inc/4J_Input.h" + "${BASE_DIR}/4JLibs/inc/4J_Profile.h" + "${BASE_DIR}/4JLibs/inc/4J_Render.h" + "${BASE_DIR}/4JLibs/inc/4J_Storage.h" +) +source_group("Windows64/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_GAMECONFIG + "${BASE_DIR}/GameConfig/Minecraft.gameconfig" + "${BASE_DIR}/GameConfig/Minecraft.spa" + "${BASE_DIR}/GameConfig/Minecraft.spa.h" +) +source_group("Windows64/GameConfig" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_GAMECONFIG}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_IGGY_GDRAW + "${BASE_DIR}/Iggy/gdraw/gdraw_d3d11.cpp" + "${BASE_DIR}/Iggy/gdraw/gdraw_d3d11.h" +) +source_group("Windows64/Iggy/gdraw" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_IGGY_GDRAW}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_IGGY_INCLUDE + "${BASE_DIR}/Iggy/include/gdraw.h" + "${BASE_DIR}/Iggy/include/iggy.h" + "${BASE_DIR}/Iggy/include/iggyexpruntime.h" + "${BASE_DIR}/Iggy/include/iggyperfmon.h" + "${BASE_DIR}/Iggy/include/rrCore.h" +) +source_group("Windows64/Iggy/include" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_MILES_SOUND_SYSTEM_INCLUDE + # "${BASE_DIR}/Miles/include/mss.h" + # "${BASE_DIR}/Miles/include/rrcore.h" +) +source_group("Windows64/Miles Sound System/Include" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_MILES_SOUND_SYSTEM_INCLUDE}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_LEADERBOARDS + "${BASE_DIR}/Leaderboards/WindowsLeaderboardManager.cpp" + "${BASE_DIR}/Leaderboards/WindowsLeaderboardManager.h" +) +source_group("Windows64/Leaderboards" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_SENTIENT + "${BASE_DIR}/Sentient/DynamicConfigurations.h" + "${BASE_DIR}/Sentient/MinecraftTelemetry.h" + "${BASE_DIR}/Sentient/SentientManager.h" + "${BASE_DIR}/Sentient/SentientStats.h" + "${BASE_DIR}/Sentient/SentientTelemetryCommon.h" + "${BASE_DIR}/Sentient/TelemetryEnum.h" +) +source_group("Windows64/Sentient" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_SENTIENT}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_SOCIAL + "${BASE_DIR}/Social/SocialManager.h" +) +source_group("Windows64/Social" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_SOCIAL}) + +set(_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_XML + "${BASE_DIR}/XML/ATGXmlParser.h" +) +source_group("Windows64/XML" FILES ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_XML}) + +set(_MINECRAFT_CLIENT_WINDOWS_XBOX_SENTIENTLIBS_INC + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientAvatar.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientBoxArt.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientConfig.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCore.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCulture.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenBoxArt.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenClientUGC.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenCore.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenNews.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientCultureBackCompat_SenSuperstars.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientDynamicConfig.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientFame.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientFile.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientHelp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientMain.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientMarkers.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientNews.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientPackage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientRawData.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientResource.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientStats.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientSuperstars.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientSys.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientTypes.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUGC.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUGCLeaderboards.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUGCTypes.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUser.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientUtil.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/Include/SenClientXML.h" +) +source_group("Xbox/SentientLibs/inc" FILES ${_MINECRAFT_CLIENT_WINDOWS_XBOX_SENTIENTLIBS_INC}) + +set(_MINECRAFT_CLIENT_WINDOWS_XBOX_NETWORK + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Network/NetworkPlayerXbox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Network/NetworkPlayerXbox.h" +) +source_group("Xbox/Network" FILES ${_MINECRAFT_CLIENT_WINDOWS_XBOX_NETWORK}) + +set(_MINECRAFT_CLIENT_WINDOWS_XBOX_SENTIENT_DYNAMICCONF + "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/Sentient/trialConfigv1.bin" +) +source_group("Xbox/Sentient/DynamicConf" FILES ${_MINECRAFT_CLIENT_WINDOWS_XBOX_SENTIENT_DYNAMICCONF}) + +set(_MINECRAFT_CLIENT_WINDOWS_NET_MINECRAFT_STATS + "${CMAKE_CURRENT_SOURCE_DIR}/StatsCounter.h" +) +source_group("net/minecraft/stats" FILES ${_MINECRAFT_CLIENT_WINDOWS_NET_MINECRAFT_STATS}) + +set(MINECRAFT_CLIENT_WINDOWS + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_RES_AUDIO} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_AUDIO} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_NETWORK} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_COMPONENTS} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_CONTROLS} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_DEBUG} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_FRONTEND_MENU_SCREENS} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_HELP__OPTIONS} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_INGAME_MENU_SCREENS} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_INGAME_MENU_SCREENS_CONTAINERS} + ${_MINECRAFT_CLIENT_WINDOWS_COMMON_ZLIB} + ${_MINECRAFT_CLIENT_WINDOWS_DURANGO} + ${_MINECRAFT_CLIENT_WINDOWS_DURANGO_IGGY_GDRAW} + ${_MINECRAFT_CLIENT_WINDOWS_DURANGO_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_WINDOWS_PS3_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_WINDOWS_PS3_PS3EXTRAS} + ${_MINECRAFT_CLIENT_WINDOWS_SOURCE_FILES} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_4JLIBS_INC} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_GAMECONFIG} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_IGGY_GDRAW} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_MILES_SOUND_SYSTEM_INCLUDE} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_LEADERBOARDS} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_SENTIENT} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_SOCIAL} + ${_MINECRAFT_CLIENT_WINDOWS_WINDOWS64_XML} + ${_MINECRAFT_CLIENT_WINDOWS_XBOX_SENTIENTLIBS_INC} + ${_MINECRAFT_CLIENT_WINDOWS_XBOX_NETWORK} + ${_MINECRAFT_CLIENT_WINDOWS_XBOX_SENTIENT_DYNAMICCONF} + ${_MINECRAFT_CLIENT_WINDOWS_NET_MINECRAFT_STATS} +) diff --git a/Minecraft.Client/cmake/sources/Xbox360.cmake b/Minecraft.Client/cmake/sources/Xbox360.cmake new file mode 100644 index 00000000..8541602c --- /dev/null +++ b/Minecraft.Client/cmake/sources/Xbox360.cmake @@ -0,0 +1,511 @@ +set(BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Xbox/") + +set(_MINECRAFT_CLIENT_XBOX360_COMMON_RES_AUDIO + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/minecraft.xsb" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/resident.xwb" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/res/audio/streamed.xwb" +) +source_group("Common/res/audio" FILES ${_MINECRAFT_CLIENT_XBOX360_COMMON_RES_AUDIO}) + +set(_MINECRAFT_CLIENT_XBOX360_DURANGO + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Durango_UIController.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Resource.h" +) +source_group("Durango" FILES ${_MINECRAFT_CLIENT_XBOX360_DURANGO}) + +set(_MINECRAFT_CLIENT_XBOX360_DURANGO_IGGY_GDRAW + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d10_shaders.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d11.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_d3d1x_shared.inl" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/gdraw/gdraw_shared.inl" +) +source_group("Durango/Iggy/gdraw" FILES ${_MINECRAFT_CLIENT_XBOX360_DURANGO_IGGY_GDRAW}) + +set(_MINECRAFT_CLIENT_XBOX360_DURANGO_IGGY_INCLUDE + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/gdraw.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggy.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggyexpruntime.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/iggyperfmon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Iggy/include/rrCore.h" +) +source_group("Durango/Iggy/include" FILES ${_MINECRAFT_CLIENT_XBOX360_DURANGO_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_XBOX360_DURANGO_SENTIENT + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Sentient/DynamicConfigurations.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Sentient/MinecraftTelemetry.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Sentient/SentientManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Sentient/SentientStats.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Sentient/SentientTelemetryCommon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Sentient/TelemetryEnum.h" +) +source_group("Durango/Sentient" FILES ${_MINECRAFT_CLIENT_XBOX360_DURANGO_SENTIENT}) + +set(_MINECRAFT_CLIENT_XBOX360_DURANGO_SOCIAL + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/Social/SocialManager.h" +) +source_group("Durango/Social" FILES ${_MINECRAFT_CLIENT_XBOX360_DURANGO_SOCIAL}) + +set(_MINECRAFT_CLIENT_XBOX360_DURANGO_XML + "${CMAKE_CURRENT_SOURCE_DIR}/Durango/XML/ATGXmlParser.h" +) +source_group("Durango/XML" FILES ${_MINECRAFT_CLIENT_XBOX360_DURANGO_XML}) + +set(_MINECRAFT_CLIENT_XBOX360_PS3 + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Passphrase/ps3__np_conf.h" +) +source_group("PS3" FILES ${_MINECRAFT_CLIENT_XBOX360_PS3}) + +set(_MINECRAFT_CLIENT_XBOX360_PS3_IGGY_INCLUDE + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/gdraw.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggy.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyexpruntime.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyperfmon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/iggyperfmon_ps3.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/Iggy/include/rrCore.h" +) +source_group("PS3/Iggy/include" FILES ${_MINECRAFT_CLIENT_XBOX360_PS3_IGGY_INCLUDE}) + +set(_MINECRAFT_CLIENT_XBOX360_PS3_PS3EXTRAS + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/ShutdownManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/ShutdownManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PS3/PS3Extras/winerror.h" +) +source_group("PS3/PS3Extras" FILES ${_MINECRAFT_CLIENT_XBOX360_PS3_PS3EXTRAS}) + +set(_MINECRAFT_CLIENT_XBOX360_WINDOWS + "${BASE_DIR}/Resource.h" +) +source_group("Windows" FILES ${_MINECRAFT_CLIENT_XBOX360_WINDOWS}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_SOURCE_FILES + "${BASE_DIR}/Xbox_App.cpp" + "${BASE_DIR}/Xbox_App.h" + "${BASE_DIR}/Xbox_Minecraft.cpp" + "${BASE_DIR}/Xbox_UIController.cpp" + "${BASE_DIR}/Xbox_UIController.h" +) +source_group("Xbox" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_4JLIBS_INC + "${BASE_DIR}/4JLibs/inc/4J_Input.h" + "${BASE_DIR}/4JLibs/inc/4J_Profile.h" + "${BASE_DIR}/4JLibs/inc/4J_Render.h" + "${BASE_DIR}/4JLibs/inc/4J_Storage.h" +) +source_group("Xbox/4JLibs/inc" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_4JLIBS_INC}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_GAMECONFIG + "${BASE_DIR}/GameConfig/Minecraft.gameconfig" + "${BASE_DIR}/GameConfig/Minecraft.spa" + "${BASE_DIR}/GameConfig/Minecraft.spa.h" +) +source_group("Xbox/GameConfig" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_GAMECONFIG}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENTLIBS_INC + "${BASE_DIR}/Sentient/Include/SenClientAvatar.h" + "${BASE_DIR}/Sentient/Include/SenClientBoxArt.h" + "${BASE_DIR}/Sentient/Include/SenClientConfig.h" + "${BASE_DIR}/Sentient/Include/SenClientCore.h" + "${BASE_DIR}/Sentient/Include/SenClientCulture.h" + "${BASE_DIR}/Sentient/Include/SenClientCultureBackCompat_SenBoxArt.h" + "${BASE_DIR}/Sentient/Include/SenClientCultureBackCompat_SenClientUGC.h" + "${BASE_DIR}/Sentient/Include/SenClientCultureBackCompat_SenCore.h" + "${BASE_DIR}/Sentient/Include/SenClientCultureBackCompat_SenNews.h" + "${BASE_DIR}/Sentient/Include/SenClientCultureBackCompat_SenSuperstars.h" + "${BASE_DIR}/Sentient/Include/SenClientDynamicConfig.h" + "${BASE_DIR}/Sentient/Include/SenClientFame.h" + "${BASE_DIR}/Sentient/Include/SenClientFile.h" + "${BASE_DIR}/Sentient/Include/SenClientHelp.h" + "${BASE_DIR}/Sentient/Include/SenClientMain.h" + "${BASE_DIR}/Sentient/Include/SenClientMarkers.h" + "${BASE_DIR}/Sentient/Include/SenClientNews.h" + "${BASE_DIR}/Sentient/Include/SenClientPackage.h" + "${BASE_DIR}/Sentient/Include/SenClientRawData.h" + "${BASE_DIR}/Sentient/Include/SenClientResource.h" + "${BASE_DIR}/Sentient/Include/SenClientStats.h" + "${BASE_DIR}/Sentient/Include/SenClientSuperstars.h" + "${BASE_DIR}/Sentient/Include/SenClientSys.h" + "${BASE_DIR}/Sentient/Include/SenClientTypes.h" + "${BASE_DIR}/Sentient/Include/SenClientUGC.h" + "${BASE_DIR}/Sentient/Include/SenClientUGCLeaderboards.h" + "${BASE_DIR}/Sentient/Include/SenClientUGCTypes.h" + "${BASE_DIR}/Sentient/Include/SenClientUser.h" + "${BASE_DIR}/Sentient/Include/SenClientUtil.h" + "${BASE_DIR}/Sentient/Include/SenClientXML.h" +) +source_group("Xbox/SentientLibs/inc" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENTLIBS_INC}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_AUDIO + "${BASE_DIR}/Audio/SoundEngine.cpp" +) +source_group("Xbox/Audio" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_AUDIO}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_FONT + "${BASE_DIR}/Font/XUI_Font.cpp" + "${BASE_DIR}/Font/XUI_Font.h" + "${BASE_DIR}/Font/XUI_FontData.cpp" + "${BASE_DIR}/Font/XUI_FontData.h" + "${BASE_DIR}/Font/XUI_FontRenderer.cpp" + "${BASE_DIR}/Font/XUI_FontRenderer.h" +) +source_group("Xbox/Font" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_FONT}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_LEADERBOARDS + "${BASE_DIR}/Leaderboards/XboxLeaderboardManager.cpp" + "${BASE_DIR}/Leaderboards/XboxLeaderboardManager.h" +) +source_group("Xbox/Leaderboards" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_NETWORK + "${BASE_DIR}/Network/NetworkPlayerXbox.cpp" + "${BASE_DIR}/Network/NetworkPlayerXbox.h" + "${BASE_DIR}/Network/PlatformNetworkManagerXbox.cpp" + "${BASE_DIR}/Network/PlatformNetworkManagerXbox.h" +) +source_group("Xbox/Network" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_NETWORK}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENT + "${BASE_DIR}/Sentient/SentientManager.cpp" + "${BASE_DIR}/Sentient/SentientManager.h" +) +source_group("Xbox/Sentient" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENT}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENT_DYNAMICCONF + "${BASE_DIR}/Sentient/DynamicConfigurations.cpp" + "${BASE_DIR}/Sentient/DynamicConfigurations.h" + "${BASE_DIR}/Sentient/trialConfigv1.bin" +) +source_group("Xbox/Sentient/DynamicConf" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENT_DYNAMICCONF}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENT_TELEMETRY + "${BASE_DIR}/Sentient/MinecraftTelemetry.h" + "${BASE_DIR}/Sentient/MinecraftTelemetry.xml" + "${BASE_DIR}/Sentient/SentientStats.cpp" + "${BASE_DIR}/Sentient/SentientStats.h" + "${BASE_DIR}/Sentient/SentientTelemetryCommon.h" + "${BASE_DIR}/Sentient/TelemetryEnum.h" +) +source_group("Xbox/Sentient/Telemetry" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENT_TELEMETRY}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_SOCIAL + "${BASE_DIR}/Social/SocialManager.cpp" + "${BASE_DIR}/Social/SocialManager.h" +) +source_group("Xbox/Social" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_SOCIAL}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_CustomMessages.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Reinstall.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Reinstall.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_TextEntry.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_TextEntry.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_XZP_Icons.h" +) +source_group("Xbox/XUI" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_BASE_SCENE + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_BasePlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_BasePlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Chat.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Chat.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HUD.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HUD.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Base.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Base.h" +) +source_group("Xbox/XUI/Base Scene" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_BASE_SCENE}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_CONTAINERS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_AbstractContainer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_AbstractContainer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Anvil.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Anvil.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Beacon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Beacon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_BrewingStand.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_BrewingStand.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Container.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Container.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_CraftingPanel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_CraftingPanel.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Enchant.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Enchant.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Fireworks.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Fireworks.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Furnace.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Furnace.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Hopper.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Hopper.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_HorseInventory.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_HorseInventory.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Inventory.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Inventory.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Inventory_Creative.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Inventory_Creative.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Trading.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Trading.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Trap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Trap.h" +) +source_group("Xbox/XUI/Containers" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_CONTAINERS}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_CONTROLS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Controls.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_4JEdit.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_4JEdit.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_4JIcon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_4JIcon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_4JList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_4JList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_BeaconButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_BeaconButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_BrewProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_BrewProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_BubblesProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_BubblesProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_BurnProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_BurnProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_CraftIngredientSlot.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_EnchantButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_EnchantButton.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_EnchantmentBook.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_EnchantmentBook.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_EnchantmentButtonText.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_EnchantmentButtonText.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_FireProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_FireProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_LoadingProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_LoadingProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_MinecraftHorse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_MinecraftHorse.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_MinecraftPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_MinecraftPlayer.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_MinecraftSlot.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_MinecraftSlot.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_MobEffect.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_MobEffect.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_PassThroughList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_PassthroughList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_ProgressCtrlBase.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_ProgressCtrlBase.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_SliderWrapper.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_SliderWrapper.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_SlotItem.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_SlotItemListItem.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_SlotList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_SlotList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_SplashPulser.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Ctrl_SplashPulser.h" +) +source_group("Xbox/XUI/Controls" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_CONTROLS}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_ConnectingProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_ConnectingProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DLCOffers.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DLCOffers.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Death.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Death.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_FullscreenProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_FullscreenProgress.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Helper.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_InGameHostOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_InGameHostOptions.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_InGameInfo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_InGameInfo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_InGamePlayerOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_InGamePlayerOptions.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Intro.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Intro.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_LoadSettings.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_LoadSettings.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_MainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_MainMenu.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_MultiGameCreate.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_MultiGameCreate.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_MultiGameInfo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_MultiGameInfo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_MultiGameJoinLoad.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_MultiGameJoinLoad.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_MultiGameLaunchMoreOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_MultiGameLaunchMoreOptions.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_NewUpdateMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_NewUpdateMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_PartnernetPassword.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_PartnernetPassword.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SaveMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SaveMessage.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Win.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Scene_Win.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SignEntry.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SignEntry.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Teleport.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Teleport.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_TransferToXboxOne.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_TrialExitUpsell.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_TrialExitUpsell.h" +) +source_group("Xbox/XUI/Menu screens" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_DEBUG + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Debug.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DebugItemEditor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DebugItemEditor.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DebugOverlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DebugOverlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DebugSchematicCreator.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DebugSchematicCreator.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DebugSetCamera.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DebugSetCamera.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DebugTips.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_DebugTips.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_debug.cpp" +) +source_group("Xbox/XUI/Menu screens/Debug" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_DEBUG}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HelpAndOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HelpAndOptions.h" +) +source_group("Xbox/XUI/Menu screens/Help & Options" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_CONTROLS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HelpControls.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HelpControls.h" +) +source_group("Xbox/XUI/Menu screens/Help & Options/Controls" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_CONTROLS}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_CREDITS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HelpCredits.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HelpCredits.h" +) +source_group("Xbox/XUI/Menu screens/Help & Options/Credits" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_CREDITS}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_HOW_TO_PLAY + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HelpHowToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HelpHowToPlay.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HowToPlayMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_HowToPlayMenu.h" +) +source_group("Xbox/XUI/Menu screens/Help & Options/How To Play" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_HOW_TO_PLAY}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_SETTINGS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsAll.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsAll.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsAudio.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsAudio.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsControl.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsControl.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsGraphics.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsGraphics.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsOptions.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsUI.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SettingsUI.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SkinSelect.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SkinSelect.h" +) +source_group("Xbox/XUI/Menu screens/Help & Options/Settings" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_SETTINGS}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_LEADERBOARDS + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Leaderboards.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_Leaderboards.h" +) +source_group("Xbox/XUI/Menu screens/Leaderboards" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_LEADERBOARDS}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_PAUSE + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_PauseMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_PauseMenu.h" +) +source_group("Xbox/XUI/Menu screens/Pause" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_PAUSE}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_SOCIAL + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SocialPost.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_SocialPost.h" +) +source_group("Xbox/XUI/Menu screens/Social" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_SOCIAL}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_TUTORIAL + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_TutorialPopup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/XUI/XUI_TutorialPopup.h" +) +source_group("Xbox/XUI/Menu screens/Tutorial" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_TUTORIAL}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XML + "${BASE_DIR}/XML/ATGXmlParser.cpp" + "${BASE_DIR}/XML/ATGXmlParser.h" + "${BASE_DIR}/XML/xmlFilesCallback.h" +) +source_group("Xbox/XML" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XML}) + +set(_MINECRAFT_CLIENT_XBOX360_XBOX_XEXXML + "${BASE_DIR}/xex-dev.xml" + "${BASE_DIR}/xex.xml" +) +source_group("Xbox/xexxml" FILES ${_MINECRAFT_CLIENT_XBOX360_XBOX_XEXXML}) + +set(_MINECRAFT_CLIENT_XBOX360_NET_MINECRAFT_CLIENT_MULTIPLAYER + "${CMAKE_CURRENT_SOURCE_DIR}/ConnectScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ConnectScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/DisconnectedScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/DisconnectedScreen.h" + "${CMAKE_CURRENT_SOURCE_DIR}/PlayerInfo.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ReceivingLevelScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ReceivingLevelScreen.h" +) +source_group("net/minecraft/client/multiplayer" FILES ${_MINECRAFT_CLIENT_XBOX360_NET_MINECRAFT_CLIENT_MULTIPLAYER}) + +set(_MINECRAFT_CLIENT_XBOX360_NET_MINECRAFT_STATS + "${CMAKE_CURRENT_SOURCE_DIR}/StatsCounter.h" +) +source_group("net/minecraft/stats" FILES ${_MINECRAFT_CLIENT_XBOX360_NET_MINECRAFT_STATS}) + +set(MINECRAFT_CLIENT_XBOX360 + ${_MINECRAFT_CLIENT_XBOX360_COMMON_RES_AUDIO} + ${_MINECRAFT_CLIENT_XBOX360_DURANGO} + ${_MINECRAFT_CLIENT_XBOX360_DURANGO_IGGY_GDRAW} + ${_MINECRAFT_CLIENT_XBOX360_DURANGO_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_XBOX360_DURANGO_SENTIENT} + ${_MINECRAFT_CLIENT_XBOX360_DURANGO_SOCIAL} + ${_MINECRAFT_CLIENT_XBOX360_DURANGO_XML} + ${_MINECRAFT_CLIENT_XBOX360_PS3} + ${_MINECRAFT_CLIENT_XBOX360_PS3_IGGY_INCLUDE} + ${_MINECRAFT_CLIENT_XBOX360_PS3_PS3EXTRAS} + ${_MINECRAFT_CLIENT_XBOX360_WINDOWS} + ${_MINECRAFT_CLIENT_XBOX360_XBOX} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_4JLIBS_INC} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_GAMECONFIG} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENTLIBS_INC} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_AUDIO} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_FONT} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_LEADERBOARDS} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_NETWORK} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENT} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENT_DYNAMICCONF} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_SENTIENT_TELEMETRY} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_SOCIAL} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_BASE_SCENE} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_CONTAINERS} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_CONTROLS} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_DEBUG} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_CONTROLS} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_CREDITS} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_HOW_TO_PLAY} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_HELP__OPTIONS_SETTINGS} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_LEADERBOARDS} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_PAUSE} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_SOCIAL} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XUI_MENU_SCREENS_TUTORIAL} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XML} + ${_MINECRAFT_CLIENT_XBOX360_XBOX_XEXXML} + ${_MINECRAFT_CLIENT_XBOX360_NET_MINECRAFT_CLIENT_MULTIPLAYER} + ${_MINECRAFT_CLIENT_XBOX360_NET_MINECRAFT_STATS} +) diff --git a/Minecraft.Client/compile_flags.txt b/Minecraft.Client/compile_flags.txt deleted file mode 100644 index 5aa08a43..00000000 --- a/Minecraft.Client/compile_flags.txt +++ /dev/null @@ -1,22 +0,0 @@ --xc++ --m64 --std=c++14 --Wno-unused-includes --Wno-unsafe-buffer-usage-in-libc-call --Wno-unsafe-buffer-usage --Wno-unused-macros --Wno-c++98-compat --Wno-c++98-compat-pedantic --Wno-pre-c++14-compat --D_LARGE_WORLDS --D_DEBUG_MENUS_ENABLED --D_LIB --D_CRT_NON_CONFORMING_SWPRINTFS --D_CRT_SECURE_NO_WARNINGS --D_WINDOWS64 --I -./Xbox/Sentient/Include --I -../Minecraft.World/x64headers --I -./ diff --git a/Minecraft.Client/postbuild.ps1 b/Minecraft.Client/postbuild.ps1 deleted file mode 100644 index 8ffc9b98..00000000 --- a/Minecraft.Client/postbuild.ps1 +++ /dev/null @@ -1,43 +0,0 @@ -param( - [string]$OutDir, - [string]$ProjectDir -) - -Write-Host "Post-build script started. Output Directory: $OutDir, Project Directory: $ProjectDir" - -$directories = @( - "music", - "Windows64\GameHDD", - "Common\Media", - "Common\res", - "Common\Trial", - "Common\Tutorial", - "Windows64Media" -) - -foreach ($dir in $directories) { - New-Item -ItemType Directory -Path (Join-Path $OutDir $dir) -Force | Out-Null -} - -$copies = @( - @{ Source = "music"; Dest = "music" }, - @{ Source = "Common\Media"; Dest = "Common\Media" }, - @{ Source = "Common\res"; Dest = "Common\res" }, - @{ Source = "Common\Trial"; Dest = "Common\Trial" }, - @{ Source = "Common\Tutorial"; Dest = "Common\Tutorial" }, - @{ Source = "Windows64\GameHDD"; Dest = "Windows64\GameHDD" }, - @{ Source = "Windows64\Sound"; Dest = "Windows64\Sound" }, - @{ Source = "Windows64Media"; Dest = "Windows64Media" } -) - -foreach ($copy in $copies) { - $src = Join-Path $ProjectDir $copy.Source - $dst = Join-Path $OutDir $copy.Dest - - if (Test-Path $src) { - # Copy the files using xcopy, forcing overwrite and suppressing errors, and only copying if the source is newer than the destination - xcopy /q /y /i /s /e /d "$src" "$dst" 2>$null - } -} - -git restore "**/BuildVer.h" \ No newline at end of file diff --git a/Minecraft.Client/prebuild.ps1 b/Minecraft.Client/prebuild.ps1 deleted file mode 100644 index 0acbf023..00000000 --- a/Minecraft.Client/prebuild.ps1 +++ /dev/null @@ -1,38 +0,0 @@ -$sha = (git rev-parse --short=7 HEAD) - -if ($env:GITHUB_REPOSITORY) { - $ref = "$env:GITHUB_REPOSITORY/$(git symbolic-ref --short HEAD)" -} else { - $remoteUrl = (git remote get-url origin) - # handle github urls only, can't predict other origins behavior - if ($remoteUrl -match '(?:github\.com[:/])([^/:]+/[^/]+?)(?:\.git)?$') { - $ref = "$($matches[1])/$(git symbolic-ref --short HEAD)" - }else{ - # fallback to just symbolic ref in case remote isnt what we expect - $ref = "UNKNOWN/$(git symbolic-ref --short HEAD)" - } -} - -$build = 560 # Note: Build/network has to stay static for now, as without it builds wont be able to play together. We can change it later when we have a better versioning scheme in place. -$suffix = "" - -# TODO Re-enable -# If we are running in GitHub Actions, use the run number as the build number -# if ($env:GITHUB_RUN_NUMBER) { -# $build = $env:GITHUB_RUN_NUMBER -# } - -# If we have uncommitted changes, add a suffix to the version string -if (git status --porcelain) { - $suffix = "-dev" -} - -@" -#pragma once - -#define VER_PRODUCTBUILD $build -#define VER_PRODUCTVERSION_STR_W L"$sha$suffix" -#define VER_FILEVERSION_STR_W VER_PRODUCTVERSION_STR_W -#define VER_BRANCHVERSION_STR_W L"$ref" -#define VER_NETWORK VER_PRODUCTBUILD -"@ | Set-Content "Common/BuildVer.h" diff --git a/Minecraft.Client/redist64/binkawin64.asi b/Minecraft.Client/redist64/binkawin64.asi deleted file mode 100644 index f0574d9d..00000000 Binary files a/Minecraft.Client/redist64/binkawin64.asi and /dev/null differ diff --git a/Minecraft.Client/redist64/mss64dolby.flt b/Minecraft.Client/redist64/mss64dolby.flt deleted file mode 100644 index 1842df34..00000000 Binary files a/Minecraft.Client/redist64/mss64dolby.flt and /dev/null differ diff --git a/Minecraft.Client/redist64/mss64ds3d.flt b/Minecraft.Client/redist64/mss64ds3d.flt deleted file mode 100644 index 77a0f8aa..00000000 Binary files a/Minecraft.Client/redist64/mss64ds3d.flt and /dev/null differ diff --git a/Minecraft.Client/redist64/mss64dsp.flt b/Minecraft.Client/redist64/mss64dsp.flt deleted file mode 100644 index 5b47b314..00000000 Binary files a/Minecraft.Client/redist64/mss64dsp.flt and /dev/null differ diff --git a/Minecraft.Client/redist64/mss64eax.flt b/Minecraft.Client/redist64/mss64eax.flt deleted file mode 100644 index 18d0033d..00000000 Binary files a/Minecraft.Client/redist64/mss64eax.flt and /dev/null differ diff --git a/Minecraft.Client/redist64/mss64srs.flt b/Minecraft.Client/redist64/mss64srs.flt deleted file mode 100644 index 9412318a..00000000 Binary files a/Minecraft.Client/redist64/mss64srs.flt and /dev/null differ diff --git a/Minecraft.Server/Access/Access.cpp b/Minecraft.Server/Access/Access.cpp new file mode 100644 index 00000000..5767a955 --- /dev/null +++ b/Minecraft.Server/Access/Access.cpp @@ -0,0 +1,460 @@ +#include "stdafx.h" + +#include "Access.h" + +#include "..\Common\StringUtils.h" +#include "..\ServerLogger.h" + +#include +#include + +namespace ServerRuntime +{ + namespace Access + { + namespace + { + /** + * **Access State** + * + * These features are used extensively from various parts of the code, so safe read/write handling is implemented + * Stores the published BAN manager snapshot plus a writer gate for clone-and-publish updates + * 公開中のBanManagerスナップショットと更新直列化用ロックを保持する + */ + struct AccessState + { + std::mutex stateLock; + std::mutex writeLock; + std::shared_ptr banManager; + std::shared_ptr whitelistManager; + bool whitelistEnabled = false; + }; + + AccessState g_accessState; + + /** + * Copies the currently published manager pointer so readers can work without holding the publish mutex + * 公開中のBanManager共有ポインタを複製取得する + */ + static std::shared_ptr GetBanManagerSnapshot() + { + std::lock_guard stateLock(g_accessState.stateLock); + return g_accessState.banManager; + } + + /** + * Replaces the shared manager pointer with a fully prepared snapshot in one short critical section + * 準備完了したBanManagerスナップショットを短いロックで公開する + */ + static void PublishBanManagerSnapshot(const std::shared_ptr &banManager) + { + std::lock_guard stateLock(g_accessState.stateLock); + g_accessState.banManager = banManager; + } + + static std::shared_ptr GetWhitelistManagerSnapshot() + { + std::lock_guard stateLock(g_accessState.stateLock); + return g_accessState.whitelistManager; + } + + static void PublishWhitelistManagerSnapshot(const std::shared_ptr &whitelistManager) + { + std::lock_guard stateLock(g_accessState.stateLock); + g_accessState.whitelistManager = whitelistManager; + } + } + + std::string FormatXuid(PlayerUID xuid) + { + if (xuid == INVALID_XUID) + { + return ""; + } + + char buffer[32] = {}; + sprintf_s(buffer, sizeof(buffer), "0x%016llx", (unsigned long long)xuid); + return buffer; + } + + bool TryParseXuid(const std::string &text, PlayerUID *outXuid) + { + if (outXuid == nullptr) + { + return false; + } + + unsigned long long parsed = 0; + if (!StringUtils::TryParseUnsignedLongLong(text, &parsed) || parsed == 0ULL) + { + return false; + } + + *outXuid = (PlayerUID)parsed; + return true; + } + + bool Initialize(const std::string &baseDirectory, bool whitelistEnabled) + { + std::lock_guard writeLock(g_accessState.writeLock); + + // Build the replacement manager privately so readers keep using the last published snapshot during disk I/O. + std::shared_ptr banManager = std::make_shared(baseDirectory); + std::shared_ptr whitelistManager = std::make_shared(baseDirectory); + if (!banManager->EnsureBanFilesExist()) + { + LogError("access", "failed to ensure dedicated server ban files exist"); + return false; + } + if (!whitelistManager->EnsureWhitelistFileExists()) + { + LogError("access", "failed to ensure dedicated server whitelist file exists"); + return false; + } + + if (!banManager->Reload()) + { + LogError("access", "failed to load dedicated server ban files"); + return false; + } + if (!whitelistManager->Reload()) + { + LogError("access", "failed to load dedicated server whitelist file"); + return false; + } + + std::vector playerEntries; + std::vector ipEntries; + std::vector whitelistEntries; + banManager->SnapshotBannedPlayers(&playerEntries); + banManager->SnapshotBannedIps(&ipEntries); + whitelistManager->SnapshotWhitelistedPlayers(&whitelistEntries); + PublishBanManagerSnapshot(banManager); + PublishWhitelistManagerSnapshot(whitelistManager); + { + std::lock_guard stateLock(g_accessState.stateLock); + g_accessState.whitelistEnabled = whitelistEnabled; + } + + LogInfof( + "access", + "loaded %u player bans, %u ip bans, and %u whitelist entries (whitelist=%s)", + (unsigned)playerEntries.size(), + (unsigned)ipEntries.size(), + (unsigned)whitelistEntries.size(), + whitelistEnabled ? "enabled" : "disabled"); + return true; + } + + void Shutdown() + { + std::lock_guard writeLock(g_accessState.writeLock); + PublishBanManagerSnapshot(std::shared_ptr{}); + PublishWhitelistManagerSnapshot(std::shared_ptr{}); + std::lock_guard stateLock(g_accessState.stateLock); + g_accessState.whitelistEnabled = false; + } + + bool Reload() + { + std::lock_guard writeLock(g_accessState.writeLock); + std::shared_ptr current = GetBanManagerSnapshot(); + std::shared_ptr currentWhitelist = GetWhitelistManagerSnapshot(); + if (current == nullptr || currentWhitelist == nullptr) + { + return false; + } + + std::shared_ptr banManager = std::make_shared(*current); + std::shared_ptr whitelistManager = std::make_shared(*currentWhitelist); + if (!banManager->EnsureBanFilesExist()) + { + return false; + } + if (!whitelistManager->EnsureWhitelistFileExists()) + { + return false; + } + if (!banManager->Reload()) + { + return false; + } + if (!whitelistManager->Reload()) + { + return false; + } + + PublishBanManagerSnapshot(banManager); + PublishWhitelistManagerSnapshot(whitelistManager); + return true; + } + + bool ReloadWhitelist() + { + std::lock_guard writeLock(g_accessState.writeLock); + const auto current = GetWhitelistManagerSnapshot(); + if (current == nullptr) + { + return false; + } + + auto whitelistManager = std::make_shared(*current); + if (!whitelistManager->EnsureWhitelistFileExists()) + { + return false; + } + if (!whitelistManager->Reload()) + { + return false; + } + + PublishWhitelistManagerSnapshot(whitelistManager); + return true; + } + + bool IsInitialized() + { + return GetBanManagerSnapshot() != nullptr && GetWhitelistManagerSnapshot() != nullptr; + } + + bool IsWhitelistEnabled() + { + std::lock_guard stateLock(g_accessState.stateLock); + return g_accessState.whitelistEnabled; + } + + void SetWhitelistEnabled(bool enabled) + { + std::lock_guard writeLock(g_accessState.writeLock); + std::lock_guard stateLock(g_accessState.stateLock); + g_accessState.whitelistEnabled = enabled; + } + + bool IsPlayerBanned(PlayerUID xuid) + { + const std::string formatted = FormatXuid(xuid); + if (formatted.empty()) + { + return false; + } + + std::shared_ptr banManager = GetBanManagerSnapshot(); + return (banManager != nullptr) ? banManager->IsPlayerBannedByXuid(formatted) : false; + } + + bool IsIpBanned(const std::string &ip) + { + std::shared_ptr banManager = GetBanManagerSnapshot(); + return (banManager != nullptr) ? banManager->IsIpBanned(ip) : false; + } + + bool IsPlayerWhitelisted(PlayerUID xuid) + { + const std::string formatted = FormatXuid(xuid); + if (formatted.empty()) + { + return false; + } + + std::shared_ptr whitelistManager = GetWhitelistManagerSnapshot(); + return (whitelistManager != nullptr) ? whitelistManager->IsPlayerWhitelistedByXuid(formatted) : false; + } + + bool AddPlayerBan(PlayerUID xuid, const std::string &name, const BanMetadata &metadata) + { + const std::string formatted = FormatXuid(xuid); + if (formatted.empty()) + { + return false; + } + + std::lock_guard writeLock(g_accessState.writeLock); + std::shared_ptr current = GetBanManagerSnapshot(); + if (current == nullptr) + { + return false; + } + + std::shared_ptr banManager = std::make_shared(*current); + BannedPlayerEntry entry; + entry.xuid = formatted; + entry.name = name; + entry.metadata = metadata; + if (!banManager->AddPlayerBan(entry)) + { + return false; + } + + PublishBanManagerSnapshot(banManager); + return true; + } + + bool AddIpBan(const std::string &ip, const BanMetadata &metadata) + { + std::lock_guard writeLock(g_accessState.writeLock); + std::shared_ptr current = GetBanManagerSnapshot(); + if (current == nullptr) + { + return false; + } + + std::shared_ptr banManager = std::make_shared(*current); + BannedIpEntry entry; + entry.ip = ip; + entry.metadata = metadata; + if (!banManager->AddIpBan(entry)) + { + return false; + } + + PublishBanManagerSnapshot(banManager); + return true; + } + + bool RemovePlayerBan(PlayerUID xuid) + { + const std::string formatted = FormatXuid(xuid); + if (formatted.empty()) + { + return false; + } + + std::lock_guard writeLock(g_accessState.writeLock); + std::shared_ptr current = GetBanManagerSnapshot(); + if (current == nullptr) + { + return false; + } + + std::shared_ptr banManager = std::make_shared(*current); + if (!banManager->RemovePlayerBanByXuid(formatted)) + { + return false; + } + + PublishBanManagerSnapshot(banManager); + return true; + } + + bool RemoveIpBan(const std::string &ip) + { + std::lock_guard writeLock(g_accessState.writeLock); + std::shared_ptr current = GetBanManagerSnapshot(); + if (current == nullptr) + { + return false; + } + + std::shared_ptr banManager = std::make_shared(*current); + if (!banManager->RemoveIpBan(ip)) + { + return false; + } + + PublishBanManagerSnapshot(banManager); + return true; + } + + bool AddWhitelistedPlayer(PlayerUID xuid, const std::string &name, const WhitelistMetadata &metadata) + { + const auto formatted = FormatXuid(xuid); + if (formatted.empty()) + { + return false; + } + + std::lock_guard writeLock(g_accessState.writeLock); + const auto current = GetWhitelistManagerSnapshot(); + if (current == nullptr) + { + return false; + } + + auto whitelistManager = std::make_shared(*current); + const WhitelistedPlayerEntry entry = { formatted, name, metadata }; + if (!whitelistManager->AddPlayer(entry)) + { + return false; + } + + PublishWhitelistManagerSnapshot(whitelistManager); + return true; + } + + bool RemoveWhitelistedPlayer(PlayerUID xuid) + { + const auto formatted = FormatXuid(xuid); + if (formatted.empty()) + { + return false; + } + + std::lock_guard writeLock(g_accessState.writeLock); + const auto current = GetWhitelistManagerSnapshot(); + if (current == nullptr) + { + return false; + } + + auto whitelistManager = std::make_shared(*current); + if (!whitelistManager->RemovePlayerByXuid(formatted)) + { + return false; + } + + PublishWhitelistManagerSnapshot(whitelistManager); + return true; + } + + bool SnapshotBannedPlayers(std::vector *outEntries) + { + if (outEntries == nullptr) + { + return false; + } + + std::shared_ptr banManager = GetBanManagerSnapshot(); + if (banManager == nullptr) + { + outEntries->clear(); + return false; + } + + return banManager->SnapshotBannedPlayers(outEntries); + } + + bool SnapshotBannedIps(std::vector *outEntries) + { + if (outEntries == nullptr) + { + return false; + } + + std::shared_ptr banManager = GetBanManagerSnapshot(); + if (banManager == nullptr) + { + outEntries->clear(); + return false; + } + + return banManager->SnapshotBannedIps(outEntries); + } + + bool SnapshotWhitelistedPlayers(std::vector *outEntries) + { + if (outEntries == nullptr) + { + return false; + } + + const auto whitelistManager = GetWhitelistManagerSnapshot(); + if (whitelistManager == nullptr) + { + outEntries->clear(); + return false; + } + + return whitelistManager->SnapshotWhitelistedPlayers(outEntries); + } + } +} diff --git a/Minecraft.Server/Access/Access.h b/Minecraft.Server/Access/Access.h new file mode 100644 index 00000000..80e61e55 --- /dev/null +++ b/Minecraft.Server/Access/Access.h @@ -0,0 +1,47 @@ +#pragma once + +#include "BanManager.h" +#include "WhitelistManager.h" + +namespace ServerRuntime +{ + /** + * A frontend that will be general-purpose, assuming the implementation of whitelists and ops in the future. + */ + namespace Access + { + bool Initialize(const std::string &baseDirectory = ".", bool whitelistEnabled = false); + void Shutdown(); + bool Reload(); + bool ReloadWhitelist(); + bool IsInitialized(); + bool IsWhitelistEnabled(); + void SetWhitelistEnabled(bool enabled); + + bool IsPlayerBanned(PlayerUID xuid); + bool IsIpBanned(const std::string &ip); + bool IsPlayerWhitelisted(PlayerUID xuid); + + bool AddPlayerBan(PlayerUID xuid, const std::string &name, const BanMetadata &metadata); + bool AddIpBan(const std::string &ip, const BanMetadata &metadata); + bool RemovePlayerBan(PlayerUID xuid); + bool RemoveIpBan(const std::string &ip); + bool AddWhitelistedPlayer(PlayerUID xuid, const std::string &name, const WhitelistMetadata &metadata); + bool RemoveWhitelistedPlayer(PlayerUID xuid); + + /** + * Copies the current cached player bans for inspection or command output + * 現在のプレイヤーBAN一覧を複製取得 + */ + bool SnapshotBannedPlayers(std::vector *outEntries); + /** + * Copies the current cached IP bans for inspection or command output + * 現在のIP BAN一覧を複製取得 + */ + bool SnapshotBannedIps(std::vector *outEntries); + bool SnapshotWhitelistedPlayers(std::vector *outEntries); + + std::string FormatXuid(PlayerUID xuid); + bool TryParseXuid(const std::string &text, PlayerUID *outXuid); + } +} diff --git a/Minecraft.Server/Access/BanManager.cpp b/Minecraft.Server/Access/BanManager.cpp new file mode 100644 index 00000000..59f5bccc --- /dev/null +++ b/Minecraft.Server/Access/BanManager.cpp @@ -0,0 +1,631 @@ +#include "stdafx.h" + +#include "BanManager.h" + +#include "..\Common\AccessStorageUtils.h" +#include "..\Common\FileUtils.h" +#include "..\Common\NetworkUtils.h" +#include "..\Common\StringUtils.h" +#include "..\ServerLogger.h" +#include "..\vendor\nlohmann\json.hpp" + +#include +#include + +namespace ServerRuntime +{ + namespace Access + { + using OrderedJson = nlohmann::ordered_json; + + namespace + { + static const char *kBannedPlayersFileName = "banned-players.json"; + static const char *kBannedIpsFileName = "banned-ips.json"; + + static bool TryParseUtcTimestamp(const std::string &text, unsigned long long *outFileTime) + { + if (outFileTime == nullptr) + { + return false; + } + + std::string trimmed = StringUtils::TrimAscii(text); + if (trimmed.empty()) + { + return false; + } + + unsigned year = 0; + unsigned month = 0; + unsigned day = 0; + unsigned hour = 0; + unsigned minute = 0; + unsigned second = 0; + if (sscanf_s(trimmed.c_str(), "%4u-%2u-%2uT%2u:%2u:%2uZ", &year, &month, &day, &hour, &minute, &second) != 6) + { + return false; + } + + SYSTEMTIME utc = {}; + utc.wYear = (WORD)year; + utc.wMonth = (WORD)month; + utc.wDay = (WORD)day; + utc.wHour = (WORD)hour; + utc.wMinute = (WORD)minute; + utc.wSecond = (WORD)second; + + FILETIME fileTime = {}; + if (!SystemTimeToFileTime(&utc, &fileTime)) + { + return false; + } + + ULARGE_INTEGER value = {}; + value.LowPart = fileTime.dwLowDateTime; + value.HighPart = fileTime.dwHighDateTime; + *outFileTime = value.QuadPart; + return true; + } + + static bool IsMetadataExpired(const BanMetadata &metadata, unsigned long long nowFileTime) + { + if (metadata.expires.empty()) + { + return false; + } + + unsigned long long expiresFileTime = 0; + if (!TryParseUtcTimestamp(metadata.expires, &expiresFileTime)) + { + // Keep malformed metadata active instead of silently unbanning a player or address. + return false; + } + + return expiresFileTime <= nowFileTime; + } + } + BanManager::BanManager(const std::string &baseDirectory) + : m_baseDirectory(baseDirectory.empty() ? "." : baseDirectory) + { + } + + bool BanManager::EnsureBanFilesExist() const + { + const std::string playersPath = GetBannedPlayersFilePath(); + const std::string ipsPath = GetBannedIpsFilePath(); + + const bool playersOk = AccessStorageUtils::EnsureJsonListFileExists(playersPath); + const bool ipsOk = AccessStorageUtils::EnsureJsonListFileExists(ipsPath); + if (!playersOk) + { + LogErrorf("access", "failed to create %s", playersPath.c_str()); + } + if (!ipsOk) + { + LogErrorf("access", "failed to create %s", ipsPath.c_str()); + } + return playersOk && ipsOk; + } + + bool BanManager::Reload() + { + std::vector players; + std::vector ips; + + if (!LoadPlayers(&players)) + { + return false; + } + if (!LoadIps(&ips)) + { + return false; + } + + m_bannedPlayers.swap(players); + m_bannedIps.swap(ips); + return true; + } + + bool BanManager::Save() const + { + std::vector players; + std::vector ips; + return SnapshotBannedPlayers(&players) && + SnapshotBannedIps(&ips) && + SavePlayers(players) && + SaveIps(ips); + } + bool BanManager::LoadPlayers(std::vector *outEntries) const + { + if (outEntries == nullptr) + { + return false; + } + outEntries->clear(); + + std::string text; + const std::string path = GetBannedPlayersFilePath(); + if (!FileUtils::ReadTextFile(path, &text)) + { + LogErrorf("access", "failed to read %s", path.c_str()); + return false; + } + if (text.empty()) + { + text = "[]"; + } + + OrderedJson root; + try + { + // Strip an optional UTF-8 BOM because some editors prepend it when rewriting JSON files. + root = OrderedJson::parse(StringUtils::StripUtf8Bom(text)); + } + catch (const nlohmann::json::exception &e) + { + LogErrorf("access", "failed to parse %s: %s", path.c_str(), e.what()); + return false; + } + + if (!root.is_array()) + { + LogErrorf("access", "failed to parse %s: root json value is not an array", path.c_str()); + return false; + } + + const unsigned long long nowFileTime = FileUtils::GetCurrentUtcFileTime(); + for (const auto &object : root) + { + if (!object.is_object()) + { + LogWarnf("access", "skipping banned player entry that is not an object in %s", path.c_str()); + continue; + } + + std::string rawXuid; + if (!AccessStorageUtils::TryGetStringField(object, "xuid", &rawXuid)) + { + LogWarnf("access", "skipping banned player entry without xuid in %s", path.c_str()); + continue; + } + + BannedPlayerEntry entry; + entry.xuid = AccessStorageUtils::NormalizeXuid(rawXuid); + if (entry.xuid.empty()) + { + LogWarnf("access", "skipping banned player entry with empty xuid in %s", path.c_str()); + continue; + } + + AccessStorageUtils::TryGetStringField(object, "name", &entry.name); + AccessStorageUtils::TryGetStringField(object, "created", &entry.metadata.created); + AccessStorageUtils::TryGetStringField(object, "source", &entry.metadata.source); + AccessStorageUtils::TryGetStringField(object, "expires", &entry.metadata.expires); + AccessStorageUtils::TryGetStringField(object, "reason", &entry.metadata.reason); + NormalizeMetadata(&entry.metadata); + + // Ignore entries that already expired before reload so the in-memory cache starts from the active set. + if (IsMetadataExpired(entry.metadata, nowFileTime)) + { + continue; + } + + outEntries->push_back(entry); + } + + return true; + } + bool BanManager::LoadIps(std::vector *outEntries) const + { + if (outEntries == nullptr) + { + return false; + } + outEntries->clear(); + + std::string text; + const std::string path = GetBannedIpsFilePath(); + if (!FileUtils::ReadTextFile(path, &text)) + { + LogErrorf("access", "failed to read %s", path.c_str()); + return false; + } + if (text.empty()) + { + text = "[]"; + } + + OrderedJson root; + try + { + // Strip an optional UTF-8 BOM because some editors prepend it when rewriting JSON files. + root = OrderedJson::parse(StringUtils::StripUtf8Bom(text)); + } + catch (const nlohmann::json::exception &e) + { + LogErrorf("access", "failed to parse %s: %s", path.c_str(), e.what()); + return false; + } + + if (!root.is_array()) + { + LogErrorf("access", "failed to parse %s: root json value is not an array", path.c_str()); + return false; + } + + const unsigned long long nowFileTime = FileUtils::GetCurrentUtcFileTime(); + for (const auto &object : root) + { + if (!object.is_object()) + { + LogWarnf("access", "skipping banned ip entry that is not an object in %s", path.c_str()); + continue; + } + + std::string rawIp; + if (!AccessStorageUtils::TryGetStringField(object, "ip", &rawIp)) + { + LogWarnf("access", "skipping banned ip entry without ip in %s", path.c_str()); + continue; + } + + BannedIpEntry entry; + entry.ip = NetworkUtils::NormalizeIpToken(rawIp); + if (entry.ip.empty()) + { + LogWarnf("access", "skipping banned ip entry with empty ip in %s", path.c_str()); + continue; + } + + AccessStorageUtils::TryGetStringField(object, "created", &entry.metadata.created); + AccessStorageUtils::TryGetStringField(object, "source", &entry.metadata.source); + AccessStorageUtils::TryGetStringField(object, "expires", &entry.metadata.expires); + AccessStorageUtils::TryGetStringField(object, "reason", &entry.metadata.reason); + NormalizeMetadata(&entry.metadata); + + // Ignore entries that already expired before reload so the in-memory cache starts from the active set. + if (IsMetadataExpired(entry.metadata, nowFileTime)) + { + continue; + } + + outEntries->push_back(entry); + } + + return true; + } + bool BanManager::SavePlayers(const std::vector &entries) const + { + OrderedJson root = OrderedJson::array(); + for (const auto &entry : entries) + { + OrderedJson object = OrderedJson::object(); + object["xuid"] = AccessStorageUtils::NormalizeXuid(entry.xuid); + object["name"] = entry.name; + object["created"] = entry.metadata.created; + object["source"] = entry.metadata.source; + object["expires"] = entry.metadata.expires; + object["reason"] = entry.metadata.reason; + root.push_back(object); + } + + const std::string path = GetBannedPlayersFilePath(); + const std::string json = root.empty() ? std::string("[]\n") : (root.dump(2) + "\n"); + if (!FileUtils::WriteTextFileAtomic(path, json)) + { + LogErrorf("access", "failed to write %s", path.c_str()); + return false; + } + return true; + } + + bool BanManager::SaveIps(const std::vector &entries) const + { + OrderedJson root = OrderedJson::array(); + for (const auto &entry : entries) + { + OrderedJson object = OrderedJson::object(); + object["ip"] = NetworkUtils::NormalizeIpToken(entry.ip); + object["created"] = entry.metadata.created; + object["source"] = entry.metadata.source; + object["expires"] = entry.metadata.expires; + object["reason"] = entry.metadata.reason; + root.push_back(object); + } + + const std::string path = GetBannedIpsFilePath(); + const std::string json = root.empty() ? std::string("[]\n") : (root.dump(2) + "\n"); + if (!FileUtils::WriteTextFileAtomic(path, json)) + { + LogErrorf("access", "failed to write %s", path.c_str()); + return false; + } + return true; + } + + const std::vector &BanManager::GetBannedPlayers() const + { + return m_bannedPlayers; + } + + const std::vector &BanManager::GetBannedIps() const + { + return m_bannedIps; + } + + bool BanManager::SnapshotBannedPlayers(std::vector *outEntries) const + { + if (outEntries == nullptr) + { + return false; + } + + outEntries->clear(); + outEntries->reserve(m_bannedPlayers.size()); + + const unsigned long long nowFileTime = FileUtils::GetCurrentUtcFileTime(); + for (const auto &entry : m_bannedPlayers) + { + if (!IsMetadataExpired(entry.metadata, nowFileTime)) + { + outEntries->push_back(entry); + } + } + return true; + } + + bool BanManager::SnapshotBannedIps(std::vector *outEntries) const + { + if (outEntries == nullptr) + { + return false; + } + + outEntries->clear(); + outEntries->reserve(m_bannedIps.size()); + + const unsigned long long nowFileTime = FileUtils::GetCurrentUtcFileTime(); + for (const auto &entry : m_bannedIps) + { + if (!IsMetadataExpired(entry.metadata, nowFileTime)) + { + outEntries->push_back(entry); + } + } + return true; + } + bool BanManager::IsPlayerBannedByXuid(const std::string &xuid) const + { + const std::string normalized = AccessStorageUtils::NormalizeXuid(xuid); + if (normalized.empty()) + { + return false; + } + + const unsigned long long nowFileTime = FileUtils::GetCurrentUtcFileTime(); + return std::any_of( + m_bannedPlayers.begin(), + m_bannedPlayers.end(), + [&normalized, nowFileTime](const BannedPlayerEntry &entry) + { + return entry.xuid == normalized && !IsMetadataExpired(entry.metadata, nowFileTime); + }); + } + + bool BanManager::IsIpBanned(const std::string &ip) const + { + const std::string normalized = NetworkUtils::NormalizeIpToken(ip); + if (normalized.empty()) + { + return false; + } + + const unsigned long long nowFileTime = FileUtils::GetCurrentUtcFileTime(); + return std::any_of( + m_bannedIps.begin(), + m_bannedIps.end(), + [&normalized, nowFileTime](const BannedIpEntry &entry) + { + return entry.ip == normalized && !IsMetadataExpired(entry.metadata, nowFileTime); + }); + } + + bool BanManager::AddPlayerBan(const BannedPlayerEntry &entry) + { + std::vector updatedEntries; + if (!SnapshotBannedPlayers(&updatedEntries)) + { + return false; + } + + BannedPlayerEntry normalized = entry; + normalized.xuid = AccessStorageUtils::NormalizeXuid(normalized.xuid); + NormalizeMetadata(&normalized.metadata); + if (normalized.xuid.empty()) + { + return false; + } + + const auto existing = std::find_if( + updatedEntries.begin(), + updatedEntries.end(), + [&normalized](const BannedPlayerEntry &candidate) + { + return candidate.xuid == normalized.xuid; + }); + if (existing != updatedEntries.end()) + { + // Update the existing entry in place so the stored list remains unique by canonical XUID. + *existing = normalized; + if (!SavePlayers(updatedEntries)) + { + return false; + } + m_bannedPlayers.swap(updatedEntries); + return true; + } + + updatedEntries.push_back(normalized); + if (!SavePlayers(updatedEntries)) + { + return false; + } + m_bannedPlayers.swap(updatedEntries); + return true; + } + + bool BanManager::AddIpBan(const BannedIpEntry &entry) + { + std::vector updatedEntries; + if (!SnapshotBannedIps(&updatedEntries)) + { + return false; + } + + BannedIpEntry normalized = entry; + normalized.ip = NetworkUtils::NormalizeIpToken(normalized.ip); + NormalizeMetadata(&normalized.metadata); + if (normalized.ip.empty()) + { + return false; + } + + const auto existing = std::find_if( + updatedEntries.begin(), + updatedEntries.end(), + [&normalized](const BannedIpEntry &candidate) + { + return candidate.ip == normalized.ip; + }); + if (existing != updatedEntries.end()) + { + // Update the existing entry in place so the stored list remains unique by normalized IP. + *existing = normalized; + if (!SaveIps(updatedEntries)) + { + return false; + } + m_bannedIps.swap(updatedEntries); + return true; + } + + updatedEntries.push_back(normalized); + if (!SaveIps(updatedEntries)) + { + return false; + } + m_bannedIps.swap(updatedEntries); + return true; + } + + bool BanManager::RemovePlayerBanByXuid(const std::string &xuid) + { + const std::string normalized = AccessStorageUtils::NormalizeXuid(xuid); + if (normalized.empty()) + { + return false; + } + + std::vector updatedEntries; + if (!SnapshotBannedPlayers(&updatedEntries)) + { + return false; + } + + size_t oldSize = updatedEntries.size(); + updatedEntries.erase( + std::remove_if( + updatedEntries.begin(), + updatedEntries.end(), + [&normalized](const BannedPlayerEntry &entry) { return entry.xuid == normalized; }), + updatedEntries.end()); + + if (updatedEntries.size() == oldSize) + { + return false; + } + if (!SavePlayers(updatedEntries)) + { + return false; + } + m_bannedPlayers.swap(updatedEntries); + return true; + } + + + bool BanManager::RemoveIpBan(const std::string &ip) + { + const std::string normalized = NetworkUtils::NormalizeIpToken(ip); + if (normalized.empty()) + { + return false; + } + + std::vector updatedEntries; + if (!SnapshotBannedIps(&updatedEntries)) + { + return false; + } + + size_t oldSize = updatedEntries.size(); + updatedEntries.erase( + std::remove_if( + updatedEntries.begin(), + updatedEntries.end(), + [&normalized](const BannedIpEntry &entry) { return entry.ip == normalized; }), + updatedEntries.end()); + + if (updatedEntries.size() == oldSize) + { + return false; + } + if (!SaveIps(updatedEntries)) + { + return false; + } + m_bannedIps.swap(updatedEntries); + return true; + } + std::string BanManager::GetBannedPlayersFilePath() const + { + return BuildPath(kBannedPlayersFileName); + } + + std::string BanManager::GetBannedIpsFilePath() const + { + return BuildPath(kBannedIpsFileName); + } + + + BanMetadata BanManager::BuildDefaultMetadata(const char *source) + { + BanMetadata metadata; + metadata.created = StringUtils::GetCurrentUtcTimestampIso8601(); + metadata.source = (source != nullptr) ? source : "Server"; + metadata.expires = ""; + metadata.reason = ""; + return metadata; + } + + + void BanManager::NormalizeMetadata(BanMetadata *metadata) + { + if (metadata == nullptr) + { + return; + } + + metadata->created = StringUtils::TrimAscii(metadata->created); + metadata->source = StringUtils::TrimAscii(metadata->source); + metadata->expires = StringUtils::TrimAscii(metadata->expires); + metadata->reason = StringUtils::TrimAscii(metadata->reason); + } + + + std::string BanManager::BuildPath(const char *fileName) const + { + return AccessStorageUtils::BuildPathFromBaseDirectory(m_baseDirectory, fileName); + } + } +} diff --git a/Minecraft.Server/Access/BanManager.h b/Minecraft.Server/Access/BanManager.h new file mode 100644 index 00000000..59103bec --- /dev/null +++ b/Minecraft.Server/Access/BanManager.h @@ -0,0 +1,106 @@ +#pragma once + +#include +#include + +namespace ServerRuntime +{ + namespace Access + { + /** + * Information shared with player bans and IP bans + * プレイヤーBANとIP BANで共有する情報 + */ + struct BanMetadata + { + std::string created; + std::string source; + std::string expires; + std::string reason; + }; + + struct BannedPlayerEntry + { + std::string xuid; + std::string name; + BanMetadata metadata; + }; + + struct BannedIpEntry + { + std::string ip; + BanMetadata metadata; + }; + + /** + * Dedicated server BAN file manager. + * + * Files: + * - banned-players.json + * - banned-ips.json + * + * This class only handles storage/caching. + * Connection-time hooks are wired separately. + */ + class BanManager + { + public: + /** + * **Create Ban Manager** + * + * Binds the manager to the directory that stores the dedicated-server access files + * Dedicated Server のアクセスファイル配置先を設定する + */ + explicit BanManager(const std::string &baseDirectory = "."); + + /** + * Creates empty JSON array files when the dedicated server starts without persisted access data + * BANファイルが無い初回起動時に空JSONを用意する + */ + bool EnsureBanFilesExist() const; + bool Reload(); + bool Save() const; + + bool LoadPlayers(std::vector *outEntries) const; + bool LoadIps(std::vector *outEntries) const; + bool SavePlayers(const std::vector &entries) const; + bool SaveIps(const std::vector &entries) const; + + const std::vector &GetBannedPlayers() const; + const std::vector &GetBannedIps() const; + /** + * Copies only currently active player BAN entries so expired metadata does not leak into command output + * 期限切れを除いた有効なプレイヤーBAN一覧を複製取得する + */ + bool SnapshotBannedPlayers(std::vector *outEntries) const; + /** + * Copies only currently active IP BAN entries so expired metadata does not leak into command output + * 期限切れを除いた有効なIP BAN一覧を複製取得する + */ + bool SnapshotBannedIps(std::vector *outEntries) const; + + bool IsPlayerBannedByXuid(const std::string &xuid) const; + bool IsIpBanned(const std::string &ip) const; + + bool AddPlayerBan(const BannedPlayerEntry &entry); + bool AddIpBan(const BannedIpEntry &entry); + bool RemovePlayerBanByXuid(const std::string &xuid); + bool RemoveIpBan(const std::string &ip); + + std::string GetBannedPlayersFilePath() const; + std::string GetBannedIpsFilePath() const; + + static BanMetadata BuildDefaultMetadata(const char *source = "Server"); + + private: + static void NormalizeMetadata(BanMetadata *metadata); + + std::string BuildPath(const char *fileName) const; + + private: + std::string m_baseDirectory; + std::vector m_bannedPlayers; + std::vector m_bannedIps; + }; + } +} diff --git a/Minecraft.Server/Access/WhitelistManager.cpp b/Minecraft.Server/Access/WhitelistManager.cpp new file mode 100644 index 00000000..33ea7e46 --- /dev/null +++ b/Minecraft.Server/Access/WhitelistManager.cpp @@ -0,0 +1,297 @@ +#include "stdafx.h" + +#include "WhitelistManager.h" + +#include "..\Common\AccessStorageUtils.h" +#include "..\Common\FileUtils.h" +#include "..\Common\StringUtils.h" +#include "..\ServerLogger.h" +#include "..\vendor\nlohmann\json.hpp" + +#include + +namespace ServerRuntime +{ + namespace Access + { + using OrderedJson = nlohmann::ordered_json; + + namespace + { + static const char *kWhitelistFileName = "whitelist.json"; + } + + WhitelistManager::WhitelistManager(const std::string &baseDirectory) + : m_baseDirectory(baseDirectory.empty() ? "." : baseDirectory) + { + } + + bool WhitelistManager::EnsureWhitelistFileExists() const + { + const std::string path = GetWhitelistFilePath(); + if (!AccessStorageUtils::EnsureJsonListFileExists(path)) + { + LogErrorf("access", "failed to create %s", path.c_str()); + return false; + } + return true; + } + + bool WhitelistManager::Reload() + { + std::vector players; + if (!LoadPlayers(&players)) + { + return false; + } + + m_whitelistedPlayers.swap(players); + return true; + } + + bool WhitelistManager::Save() const + { + std::vector players; + return SnapshotWhitelistedPlayers(&players) && SavePlayers(players); + } + + bool WhitelistManager::LoadPlayers(std::vector *outEntries) const + { + if (outEntries == nullptr) + { + return false; + } + outEntries->clear(); + + std::string text; + const std::string path = GetWhitelistFilePath(); + if (!FileUtils::ReadTextFile(path, &text)) + { + LogErrorf("access", "failed to read %s", path.c_str()); + return false; + } + + if (text.empty()) + { + text = "[]"; + } + + OrderedJson root; + try + { + root = OrderedJson::parse(StringUtils::StripUtf8Bom(text)); + } + catch (const nlohmann::json::exception &e) + { + LogErrorf("access", "failed to parse %s: %s", path.c_str(), e.what()); + return false; + } + + if (!root.is_array()) + { + LogErrorf("access", "failed to parse %s: root json value is not an array", path.c_str()); + return false; + } + + for (const auto &object : root) + { + if (!object.is_object()) + { + LogWarnf("access", "skipping whitelist entry that is not an object in %s", path.c_str()); + continue; + } + + std::string rawXuid; + if (!AccessStorageUtils::TryGetStringField(object, "xuid", &rawXuid)) + { + LogWarnf("access", "skipping whitelist entry without xuid in %s", path.c_str()); + continue; + } + + WhitelistedPlayerEntry entry; + entry.xuid = AccessStorageUtils::NormalizeXuid(rawXuid); + if (entry.xuid.empty()) + { + LogWarnf("access", "skipping whitelist entry with empty xuid in %s", path.c_str()); + continue; + } + + AccessStorageUtils::TryGetStringField(object, "name", &entry.name); + AccessStorageUtils::TryGetStringField(object, "created", &entry.metadata.created); + AccessStorageUtils::TryGetStringField(object, "source", &entry.metadata.source); + NormalizeMetadata(&entry.metadata); + + outEntries->push_back(entry); + } + + return true; + } + + bool WhitelistManager::SavePlayers(const std::vector &entries) const + { + OrderedJson root = OrderedJson::array(); + for (const auto &entry : entries) + { + OrderedJson object = OrderedJson::object(); + object["xuid"] = AccessStorageUtils::NormalizeXuid(entry.xuid); + object["name"] = entry.name; + object["created"] = entry.metadata.created; + object["source"] = entry.metadata.source; + root.push_back(object); + } + + const std::string path = GetWhitelistFilePath(); + const std::string json = root.empty() ? std::string("[]\n") : (root.dump(2) + "\n"); + if (!FileUtils::WriteTextFileAtomic(path, json)) + { + LogErrorf("access", "failed to write %s", path.c_str()); + return false; + } + return true; + } + + const std::vector &WhitelistManager::GetWhitelistedPlayers() const + { + return m_whitelistedPlayers; + } + + bool WhitelistManager::SnapshotWhitelistedPlayers(std::vector *outEntries) const + { + if (outEntries == nullptr) + { + return false; + } + + *outEntries = m_whitelistedPlayers; + return true; + } + + bool WhitelistManager::IsPlayerWhitelistedByXuid(const std::string &xuid) const + { + const auto normalized = AccessStorageUtils::NormalizeXuid(xuid); + if (normalized.empty()) + { + return false; + } + + return std::any_of( + m_whitelistedPlayers.begin(), + m_whitelistedPlayers.end(), + [&normalized](const WhitelistedPlayerEntry &entry) + { + return entry.xuid == normalized; + }); + } + + bool WhitelistManager::AddPlayer(const WhitelistedPlayerEntry &entry) + { + std::vector updatedEntries; + if (!SnapshotWhitelistedPlayers(&updatedEntries)) + { + return false; + } + + auto normalized = entry; + normalized.xuid = AccessStorageUtils::NormalizeXuid(normalized.xuid); + NormalizeMetadata(&normalized.metadata); + if (normalized.xuid.empty()) + { + return false; + } + + const auto existing = std::find_if( + updatedEntries.begin(), + updatedEntries.end(), + [&normalized](const WhitelistedPlayerEntry &candidate) + { + return candidate.xuid == normalized.xuid; + }); + + if (existing != updatedEntries.end()) + { + *existing = normalized; + if (!SavePlayers(updatedEntries)) + { + return false; + } + + m_whitelistedPlayers.swap(updatedEntries); + return true; + } + + updatedEntries.push_back(normalized); + if (!SavePlayers(updatedEntries)) + { + return false; + } + + m_whitelistedPlayers.swap(updatedEntries); + return true; + } + + bool WhitelistManager::RemovePlayerByXuid(const std::string &xuid) + { + const auto normalized = AccessStorageUtils::NormalizeXuid(xuid); + if (normalized.empty()) + { + return false; + } + + std::vector updatedEntries; + if (!SnapshotWhitelistedPlayers(&updatedEntries)) + { + return false; + } + + const auto oldSize = updatedEntries.size(); + updatedEntries.erase( + std::remove_if( + updatedEntries.begin(), + updatedEntries.end(), + [&normalized](const WhitelistedPlayerEntry &entry) { return entry.xuid == normalized; }), + updatedEntries.end()); + + if (updatedEntries.size() == oldSize) + { + return false; + } + + if (!SavePlayers(updatedEntries)) + { + return false; + } + + m_whitelistedPlayers.swap(updatedEntries); + return true; + } + + std::string WhitelistManager::GetWhitelistFilePath() const + { + return BuildPath(kWhitelistFileName); + } + + WhitelistMetadata WhitelistManager::BuildDefaultMetadata(const char *source) + { + WhitelistMetadata metadata; + metadata.created = StringUtils::GetCurrentUtcTimestampIso8601(); + metadata.source = (source != nullptr) ? source : "Server"; + return metadata; + } + + void WhitelistManager::NormalizeMetadata(WhitelistMetadata *metadata) + { + if (metadata == nullptr) + { + return; + } + + metadata->created = StringUtils::TrimAscii(metadata->created); + metadata->source = StringUtils::TrimAscii(metadata->source); + } + + std::string WhitelistManager::BuildPath(const char *fileName) const + { + return AccessStorageUtils::BuildPathFromBaseDirectory(m_baseDirectory, fileName); + } + } +} diff --git a/Minecraft.Server/Access/WhitelistManager.h b/Minecraft.Server/Access/WhitelistManager.h new file mode 100644 index 00000000..1c2c5a0b --- /dev/null +++ b/Minecraft.Server/Access/WhitelistManager.h @@ -0,0 +1,64 @@ +#pragma once + +#include +#include + +namespace ServerRuntime +{ + namespace Access + { + struct WhitelistMetadata + { + std::string created; + std::string source; + }; + + struct WhitelistedPlayerEntry + { + std::string xuid; + std::string name; + WhitelistMetadata metadata; + }; + + /** + * whitelist manager + * + * Files: + * - whitelist.json + * + * Stores and normalizes XUID-based allow entries. + */ + class WhitelistManager + { + public: + explicit WhitelistManager(const std::string &baseDirectory = "."); + + bool EnsureWhitelistFileExists() const; + bool Reload(); + bool Save() const; + + bool LoadPlayers(std::vector *outEntries) const; + bool SavePlayers(const std::vector &entries) const; + + const std::vector &GetWhitelistedPlayers() const; + bool SnapshotWhitelistedPlayers(std::vector *outEntries) const; + + bool IsPlayerWhitelistedByXuid(const std::string &xuid) const; + bool AddPlayer(const WhitelistedPlayerEntry &entry); + bool RemovePlayerByXuid(const std::string &xuid); + + std::string GetWhitelistFilePath() const; + + static WhitelistMetadata BuildDefaultMetadata(const char *source = "Server"); + + private: + static void NormalizeMetadata(WhitelistMetadata *metadata); + + std::string BuildPath(const char *fileName) const; + + private: + std::string m_baseDirectory; + std::vector m_whitelistedPlayers; + }; + } +} diff --git a/Minecraft.Server/CMakeLists.txt b/Minecraft.Server/CMakeLists.txt new file mode 100644 index 00000000..52e5826e --- /dev/null +++ b/Minecraft.Server/CMakeLists.txt @@ -0,0 +1,85 @@ +# Note: A lot of this file is the same as the client due to the shared code + +include("${CMAKE_CURRENT_LIST_DIR}/cmake/sources/Common.cmake") + +include("${CMAKE_SOURCE_DIR}/cmake/CommonSources.cmake") + +# Combine all source files into a single variable for the target +# We cant use CMAKE_CONFIGURE_PRESET here as VS doesn't set it, so just rely on the folder +set(MINECRAFT_SERVER_SOURCES + ${MINECRAFT_SERVER_COMMON} + ${SOURCES_COMMON} +) + +add_executable(Minecraft.Server ${MINECRAFT_SERVER_SOURCES}) + +target_include_directories(Minecraft.Server PRIVATE + "${CMAKE_BINARY_DIR}/generated/" # This is for the generated BuildVer.h + "${CMAKE_SOURCE_DIR}/Minecraft.Client/" + "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/Iggy/include" + "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_SOURCE_DIR}/include/" +) +target_compile_definitions(Minecraft.Server PRIVATE + ${MINECRAFT_SHARED_DEFINES} + MINECRAFT_SERVER_BUILD +) +target_precompile_headers(Minecraft.Server PRIVATE "$<$:stdafx.h>") +set_source_files_properties("${CMAKE_SOURCE_DIR}/Minecraft.Client/compat_shims.cpp" PROPERTIES SKIP_PRECOMPILE_HEADERS ON) # This redefines internal MSVC CRT symbols which will cause an issue with PCH + +configure_compiler_target(Minecraft.Server) + +set_target_properties(Minecraft.Server PROPERTIES + OUTPUT_NAME "Minecraft.Server" + VS_DEBUGGER_WORKING_DIRECTORY "$" + VS_DEBUGGER_COMMAND_ARGUMENTS "-port 25565 -bind 0.0.0.0 -name DedicatedServer" +) + +target_link_libraries(Minecraft.Server PRIVATE + Minecraft.World + d3d11 + d3dcompiler + XInput9_1_0 + wsock32 + legacy_stdio_definitions + $<$: # Debug 4J libraries + "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/4JLibs/libs/4J_Input_d.lib" + "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/4JLibs/libs/4J_Storage_d.lib" + "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/4JLibs/libs/4J_Render_PC_d.lib" + > + $<$>: # Release 4J libraries + "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/4JLibs/libs/4J_Input.lib" + "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/4JLibs/libs/4J_Storage.lib" + "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/4JLibs/libs/4J_Render_PC.lib" + > +) + +# Iggy libs +foreach(lib IN LISTS IGGY_LIBS) + target_link_libraries(Minecraft.Server PRIVATE "${CMAKE_SOURCE_DIR}/Minecraft.Client/${PLATFORM_NAME}/Iggy/lib/${lib}") +endforeach() + +# --- +# Asset / redist copy +# --- +include("${CMAKE_SOURCE_DIR}/cmake/CopyAssets.cmake") + +# Copy res +set(ASSET_FOLDER_PAIRS + "${CMAKE_SOURCE_DIR}/Minecraft.Client/Common/res" "Common/res" +) +setup_asset_folder_copy(Minecraft.Server "${ASSET_FOLDER_PAIRS}") + +# Copy arc media +set(ASSET_FILES_PAIRS + "${CMAKE_SOURCE_DIR}/Minecraft.Client/Common/Media/MediaWindows64.arc" "Common/Media/" +) +setup_asset_file_copy(Minecraft.Server "${ASSET_FILES_PAIRS}") + +# Copy redist files +add_copyredist_target(Minecraft.Server) + +# Make sure GameHDD exists on Windows +if(PLATFORM_NAME STREQUAL "Windows64") + add_gamehdd_target(Minecraft.Server) +endif() diff --git a/Minecraft.Server/Common/AccessStorageUtils.h b/Minecraft.Server/Common/AccessStorageUtils.h new file mode 100644 index 00000000..c5d3477c --- /dev/null +++ b/Minecraft.Server/Common/AccessStorageUtils.h @@ -0,0 +1,105 @@ +#pragma once + +#include "FileUtils.h" +#include "StringUtils.h" + +#include "..\vendor\nlohmann\json.hpp" + +#include + +namespace ServerRuntime +{ + namespace AccessStorageUtils + { + inline bool IsRegularFile(const std::string &path) + { + const std::wstring widePath = StringUtils::Utf8ToWide(path); + if (widePath.empty()) + { + return false; + } + + const DWORD attributes = GetFileAttributesW(widePath.c_str()); + return (attributes != INVALID_FILE_ATTRIBUTES) && ((attributes & FILE_ATTRIBUTE_DIRECTORY) == 0); + } + + inline bool EnsureJsonListFileExists(const std::string &path) + { + return IsRegularFile(path) || FileUtils::WriteTextFileAtomic(path, "[]\n"); + } + + inline bool TryGetStringField(const nlohmann::ordered_json &object, const char *key, std::string *outValue) + { + if (key == nullptr || outValue == nullptr || !object.is_object()) + { + return false; + } + + const auto it = object.find(key); + if (it == object.end() || !it->is_string()) + { + return false; + } + + *outValue = it->get(); + return true; + } + + inline std::string NormalizeXuid(const std::string &xuid) + { + const std::string trimmed = StringUtils::TrimAscii(xuid); + if (trimmed.empty()) + { + return ""; + } + + unsigned long long numericXuid = 0; + if (StringUtils::TryParseUnsignedLongLong(trimmed, &numericXuid)) + { + if (numericXuid == 0ULL) + { + return ""; + } + + char buffer[32] = {}; + sprintf_s(buffer, sizeof(buffer), "0x%016llx", numericXuid); + return buffer; + } + + return StringUtils::ToLowerAscii(trimmed); + } + + inline std::string BuildPathFromBaseDirectory(const std::string &baseDirectory, const char *fileName) + { + if (fileName == nullptr || fileName[0] == 0) + { + return ""; + } + + const std::wstring wideFileName = StringUtils::Utf8ToWide(fileName); + if (wideFileName.empty()) + { + return ""; + } + + if (baseDirectory.empty() || baseDirectory == ".") + { + return StringUtils::WideToUtf8(wideFileName); + } + + const std::wstring wideBaseDirectory = StringUtils::Utf8ToWide(baseDirectory); + if (wideBaseDirectory.empty()) + { + return StringUtils::WideToUtf8(wideFileName); + } + + const wchar_t last = wideBaseDirectory[wideBaseDirectory.size() - 1]; + if (last == L'\\' || last == L'/') + { + return StringUtils::WideToUtf8(wideBaseDirectory + wideFileName); + } + + return StringUtils::WideToUtf8(wideBaseDirectory + L"\\" + wideFileName); + } + } +} diff --git a/Minecraft.Server/Common/FileUtils.cpp b/Minecraft.Server/Common/FileUtils.cpp new file mode 100644 index 00000000..50eeeb72 --- /dev/null +++ b/Minecraft.Server/Common/FileUtils.cpp @@ -0,0 +1,146 @@ +#include "stdafx.h" + +#include "FileUtils.h" + +#include "StringUtils.h" + +#include +#include + +namespace ServerRuntime +{ + namespace FileUtils + { + namespace + { + static std::wstring ToWidePath(const std::string &filePath) + { + return StringUtils::Utf8ToWide(filePath); + } + } + + unsigned long long GetCurrentUtcFileTime() + { + FILETIME now = {}; + GetSystemTimeAsFileTime(&now); + + ULARGE_INTEGER value = {}; + value.LowPart = now.dwLowDateTime; + value.HighPart = now.dwHighDateTime; + return value.QuadPart; + } + + bool ReadTextFile(const std::string &filePath, std::string *outText) + { + if (outText == nullptr) + { + return false; + } + + outText->clear(); + + const std::wstring widePath = ToWidePath(filePath); + if (widePath.empty()) + { + return false; + } + + FILE *inFile = nullptr; + if (_wfopen_s(&inFile, widePath.c_str(), L"rb") != 0 || inFile == nullptr) + { + return false; + } + + if (fseek(inFile, 0, SEEK_END) != 0) + { + fclose(inFile); + return false; + } + + long fileSize = ftell(inFile); + if (fileSize < 0) + { + fclose(inFile); + return false; + } + + if (fseek(inFile, 0, SEEK_SET) != 0) + { + fclose(inFile); + return false; + } + + if (fileSize == 0) + { + fclose(inFile); + return true; + } + + outText->resize((size_t)fileSize); + size_t bytesRead = fread(&(*outText)[0], 1, (size_t)fileSize, inFile); + fclose(inFile); + + if (bytesRead != (size_t)fileSize) + { + outText->clear(); + return false; + } + + return true; + } + + bool WriteTextFileAtomic(const std::string &filePath, const std::string &text) + { + const std::wstring widePath = ToWidePath(filePath); + if (widePath.empty()) + { + return false; + } + + const std::wstring tmpPath = widePath + L".tmp"; + + FILE *outFile = nullptr; + if (_wfopen_s(&outFile, tmpPath.c_str(), L"wb") != 0 || outFile == nullptr) + { + return false; + } + + if (!text.empty()) + { + size_t bytesWritten = fwrite(text.data(), 1, text.size(), outFile); + if (bytesWritten != text.size()) + { + fclose(outFile); + DeleteFileW(tmpPath.c_str()); + return false; + } + } + + if (fflush(outFile) != 0 || _commit(_fileno(outFile)) != 0) + { + fclose(outFile); + DeleteFileW(tmpPath.c_str()); + return false; + } + fclose(outFile); + + DWORD attrs = GetFileAttributesW(widePath.c_str()); + if (attrs != INVALID_FILE_ATTRIBUTES && ((attrs & FILE_ATTRIBUTE_DIRECTORY) == 0)) + { + // Replace the destination without deleting the last known-good file first. + if (ReplaceFileW(widePath.c_str(), tmpPath.c_str(), nullptr, REPLACEFILE_IGNORE_MERGE_ERRORS, nullptr, nullptr)) + { + return true; + } + } + + if (MoveFileExW(tmpPath.c_str(), widePath.c_str(), MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH)) + { + return true; + } + + // Keep the temp file on failure so the original file remains recoverable and the caller can inspect the write result. + return false; + } + } +} \ No newline at end of file diff --git a/Minecraft.Server/Common/FileUtils.h b/Minecraft.Server/Common/FileUtils.h new file mode 100644 index 00000000..96e398cc --- /dev/null +++ b/Minecraft.Server/Common/FileUtils.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +namespace ServerRuntime +{ + namespace FileUtils + { + /** + * Reads the full UTF-8 path target into memory without interpreting JSON or line endings + * UTF-8パスのテキストファイル全体をそのまま読み込む + */ + bool ReadTextFile(const std::string &filePath, std::string *outText); + /** + * Writes text through a same-directory temporary file and publishes it with a single replacement step + * 同一ディレクトリの一時ファイル経由で安全に書き換える + */ + bool WriteTextFileAtomic(const std::string &filePath, const std::string &text); + /** + * Returns the current UTC timestamp encoded in Windows FILETIME units for expiry comparisons + * 期限判定用に現在UTC時刻をWindows FILETIME単位で返す + */ + unsigned long long GetCurrentUtcFileTime(); + } +} \ No newline at end of file diff --git a/Minecraft.Server/Common/NetworkUtils.h b/Minecraft.Server/Common/NetworkUtils.h new file mode 100644 index 00000000..c77d4506 --- /dev/null +++ b/Minecraft.Server/Common/NetworkUtils.h @@ -0,0 +1,29 @@ +#pragma once + +#include "StringUtils.h" + +#include + +namespace ServerRuntime +{ + namespace NetworkUtils + { + inline std::string NormalizeIpToken(const std::string &ip) + { + return StringUtils::ToLowerAscii(StringUtils::TrimAscii(ip)); + } + + inline bool IsIpLiteral(const std::string &text) + { + const std::string trimmed = StringUtils::TrimAscii(text); + if (trimmed.empty()) + { + return false; + } + + IN_ADDR ipv4 = {}; + IN6_ADDR ipv6 = {}; + return InetPtonA(AF_INET, trimmed.c_str(), &ipv4) == 1 || InetPtonA(AF_INET6, trimmed.c_str(), &ipv6) == 1; + } + } +} diff --git a/Minecraft.Server/Common/StringUtils.cpp b/Minecraft.Server/Common/StringUtils.cpp new file mode 100644 index 00000000..40881ae7 --- /dev/null +++ b/Minecraft.Server/Common/StringUtils.cpp @@ -0,0 +1,212 @@ +#include "stdafx.h" + +#include "StringUtils.h" + +#include +#include +#include +#include + +namespace ServerRuntime +{ + namespace StringUtils + { + std::string WideToUtf8(const std::wstring &value) + { + if (value.empty()) + { + return std::string(); + } + + int charCount = WideCharToMultiByte(CP_UTF8, 0, value.c_str(), (int)value.length(), NULL, 0, NULL, NULL); + if (charCount <= 0) + { + return std::string(); + } + + std::string utf8; + utf8.resize(charCount); + WideCharToMultiByte(CP_UTF8, 0, value.c_str(), (int)value.length(), &utf8[0], charCount, NULL, NULL); + return utf8; + } + + std::wstring Utf8ToWide(const char *value) + { + if (value == NULL || value[0] == 0) + { + return std::wstring(); + } + + int wideCount = MultiByteToWideChar(CP_UTF8, 0, value, -1, NULL, 0); + if (wideCount <= 0) + { + // Fall back to the current ANSI code page so legacy non-UTF-8 inputs remain readable. + wideCount = MultiByteToWideChar(CP_ACP, 0, value, -1, NULL, 0); + if (wideCount <= 0) + { + return std::wstring(); + } + + std::wstring wide; + wide.resize(wideCount - 1); + MultiByteToWideChar(CP_ACP, 0, value, -1, &wide[0], wideCount); + return wide; + } + + std::wstring wide; + wide.resize(wideCount - 1); + MultiByteToWideChar(CP_UTF8, 0, value, -1, &wide[0], wideCount); + return wide; + } + + std::wstring Utf8ToWide(const std::string &value) + { + return Utf8ToWide(value.c_str()); + } + + std::string StripUtf8Bom(const std::string &value) + { + if (value.size() >= 3 && + (unsigned char)value[0] == 0xEF && + (unsigned char)value[1] == 0xBB && + (unsigned char)value[2] == 0xBF) + { + return value.substr(3); + } + + return value; + } + + std::string TrimAscii(const std::string &value) + { + size_t start = 0; + while (start < value.length() && std::isspace((unsigned char)value[start])) + { + ++start; + } + + size_t end = value.length(); + while (end > start && std::isspace((unsigned char)value[end - 1])) + { + --end; + } + + return value.substr(start, end - start); + } + + std::string ToLowerAscii(const std::string &value) + { + std::string lowered = value; + for (size_t i = 0; i < lowered.length(); ++i) + { + lowered[i] = (char)std::tolower((unsigned char)lowered[i]); + } + return lowered; + } + + std::string JoinTokens(const std::vector &tokens, size_t startIndex, const char *separator) + { + if (startIndex >= tokens.size()) + { + return std::string(); + } + + const auto joinSeparator = std::string((separator != nullptr) ? separator : " "); + size_t totalLength = 0; + for (size_t i = startIndex; i < tokens.size(); ++i) + { + totalLength += tokens[i].size(); + } + + totalLength += (tokens.size() - startIndex - 1) * joinSeparator.size(); + std::string joined; + joined.reserve(totalLength); + for (size_t i = startIndex; i < tokens.size(); ++i) + { + if (!joined.empty()) + { + joined += joinSeparator; + } + + joined += tokens[i]; + } + + return joined; + } + + bool StartsWithIgnoreCase(const std::string &value, const std::string &prefix) + { + if (prefix.size() > value.size()) + { + return false; + } + + for (size_t i = 0; i < prefix.size(); ++i) + { + unsigned char a = (unsigned char)value[i]; + unsigned char b = (unsigned char)prefix[i]; + if (std::tolower(a) != std::tolower(b)) + { + return false; + } + } + + return true; + } + + bool TryParseUnsignedLongLong(const std::string &value, unsigned long long *outValue) + { + if (outValue == nullptr) + { + return false; + } + + const std::string trimmed = TrimAscii(value); + if (trimmed.empty()) + { + return false; + } + + errno = 0; + char *end = nullptr; + const unsigned long long parsed = _strtoui64(trimmed.c_str(), &end, 0); + if (end == trimmed.c_str() || errno != 0) + { + return false; + } + + while (*end == ' ' || *end == '\t' || *end == '\r' || *end == '\n') + { + ++end; + } + + if (*end != 0) + { + return false; + } + + *outValue = parsed; + return true; + } + + std::string GetCurrentUtcTimestampIso8601() + { + SYSTEMTIME utc = {}; + GetSystemTime(&utc); + + char created[64] = {}; + sprintf_s( + created, + sizeof(created), + "%04u-%02u-%02uT%02u:%02u:%02uZ", + (unsigned)utc.wYear, + (unsigned)utc.wMonth, + (unsigned)utc.wDay, + (unsigned)utc.wHour, + (unsigned)utc.wMinute, + (unsigned)utc.wSecond); + return created; + } + } +} + diff --git a/Minecraft.Server/Common/StringUtils.h b/Minecraft.Server/Common/StringUtils.h new file mode 100644 index 00000000..68f818e1 --- /dev/null +++ b/Minecraft.Server/Common/StringUtils.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include + +namespace ServerRuntime +{ + namespace StringUtils + { + std::string WideToUtf8(const std::wstring &value); + std::wstring Utf8ToWide(const char *value); + std::wstring Utf8ToWide(const std::string &value); + std::string StripUtf8Bom(const std::string &value); + + std::string TrimAscii(const std::string &value); + std::string ToLowerAscii(const std::string &value); + std::string JoinTokens(const std::vector &tokens, size_t startIndex = 0, const char *separator = " "); + bool StartsWithIgnoreCase(const std::string &value, const std::string &prefix); + bool TryParseUnsignedLongLong(const std::string &value, unsigned long long *outValue); + std::string GetCurrentUtcTimestampIso8601(); + } +} + diff --git a/Minecraft.Server/Console/ServerCli.cpp b/Minecraft.Server/Console/ServerCli.cpp new file mode 100644 index 00000000..b633effd --- /dev/null +++ b/Minecraft.Server/Console/ServerCli.cpp @@ -0,0 +1,44 @@ +#include "stdafx.h" + +#include "ServerCli.h" + +#include "ServerCliEngine.h" +#include "ServerCliInput.h" + +namespace ServerRuntime +{ + ServerCli::ServerCli() + : m_engine(new ServerCliEngine()) + , m_input(new ServerCliInput()) + { + } + + ServerCli::~ServerCli() + { + Stop(); + } + + void ServerCli::Start() + { + if (m_input && m_engine) + { + m_input->Start(m_engine.get()); + } + } + + void ServerCli::Stop() + { + if (m_input) + { + m_input->Stop(); + } + } + + void ServerCli::Poll() + { + if (m_engine) + { + m_engine->Poll(); + } + } +} diff --git a/Minecraft.Server/Console/ServerCli.h b/Minecraft.Server/Console/ServerCli.h new file mode 100644 index 00000000..f544450b --- /dev/null +++ b/Minecraft.Server/Console/ServerCli.h @@ -0,0 +1,50 @@ +#pragma once + +#include + +namespace ServerRuntime +{ + class ServerCliEngine; + class ServerCliInput; + + /** + * **Server CLI facade** + * + * Owns the command engine and input component, and exposes a small lifecycle API. + * CLI 全体の開始・停止・更新をまとめる窓口クラス + */ + class ServerCli + { + public: + ServerCli(); + ~ServerCli(); + + /** + * **Start console input processing** + * + * Connects input to the engine and starts background reading. + * 入力処理を開始してエンジンに接続 + */ + void Start(); + + /** + * **Stop console input processing** + * + * Stops background input safely and detaches from the engine. + * 入力処理を安全に停止 + */ + void Stop(); + + /** + * **Process queued command lines** + * + * Drains commands collected by input and executes them in the main loop. + * 入力キューのコマンドを実行 + */ + void Poll(); + + private: + std::unique_ptr m_engine; + std::unique_ptr m_input; + }; +} diff --git a/Minecraft.Server/Console/ServerCliEngine.cpp b/Minecraft.Server/Console/ServerCliEngine.cpp new file mode 100644 index 00000000..82bbdcc8 --- /dev/null +++ b/Minecraft.Server/Console/ServerCliEngine.cpp @@ -0,0 +1,395 @@ +#include "stdafx.h" + +#include "ServerCliEngine.h" + +#include "ServerCliParser.h" +#include "ServerCliRegistry.h" +#include "commands\IServerCliCommand.h" +#include "commands\ban\CliCommandBan.h" +#include "commands\ban-ip\CliCommandBanIp.h" +#include "commands\ban-list\CliCommandBanList.h" +#include "commands\defaultgamemode\CliCommandDefaultGamemode.h" +#include "commands\enchant\CliCommandEnchant.h" +#include "commands\experience\CliCommandExperience.h" +#include "commands\gamemode\CliCommandGamemode.h" +#include "commands\give\CliCommandGive.h" +#include "commands\help\CliCommandHelp.h" +#include "commands\kill\CliCommandKill.h" +#include "commands\list\CliCommandList.h" +#include "commands\pardon\CliCommandPardon.h" +#include "commands\pardon-ip\CliCommandPardonIp.h" +#include "commands\stop\CliCommandStop.h" +#include "commands\time\CliCommandTime.h" +#include "commands\tp\CliCommandTp.h" +#include "commands\weather\CliCommandWeather.h" +#include "commands\whitelist\CliCommandWhitelist.h" +#include "..\Common\StringUtils.h" +#include "..\ServerShutdown.h" +#include "..\ServerLogger.h" +#include "..\..\Minecraft.Client\MinecraftServer.h" +#include "..\..\Minecraft.Client\PlayerList.h" +#include "..\..\Minecraft.Client\ServerPlayer.h" +#include "..\..\Minecraft.World\CommandDispatcher.h" +#include "..\..\Minecraft.World\CommandSender.h" +#include "..\..\Minecraft.World\LevelSettings.h" +#include "..\..\Minecraft.World\StringHelpers.h" + +#include +#include + +namespace ServerRuntime +{ + + /** + * Create an authorized Sender to make the CLI appear as a user. + * The return value can also be used to display logs. + */ + namespace + { + class ServerCliConsoleCommandSender : public CommandSender + { + public: + explicit ServerCliConsoleCommandSender(const ServerCliEngine *engine) + : m_engine(engine) + { + } + + void sendMessage(const wstring &message, ChatPacket::EChatPacketMessage type, int customData, const wstring &additionalMessage) override + { + (void)type; + (void)customData; + (void)additionalMessage; + if (m_engine == nullptr) + { + return; + } + + m_engine->LogInfo(StringUtils::WideToUtf8(message)); + } + + bool hasPermission(EGameCommand command) override + { + (void)command; + return true; + } + + private: + const ServerCliEngine *m_engine; + }; + } + + ServerCliEngine::ServerCliEngine() + : m_registry(new ServerCliRegistry()) + , m_consoleSender(std::make_shared(this)) + { + RegisterDefaultCommands(); + } + + ServerCliEngine::~ServerCliEngine() + { + } + + void ServerCliEngine::RegisterDefaultCommands() + { + m_registry->Register(std::unique_ptr(new CliCommandHelp())); + m_registry->Register(std::unique_ptr(new CliCommandStop())); + m_registry->Register(std::unique_ptr(new CliCommandList())); + m_registry->Register(std::unique_ptr(new CliCommandBan())); + m_registry->Register(std::unique_ptr(new CliCommandBanIp())); + m_registry->Register(std::unique_ptr(new CliCommandPardon())); + m_registry->Register(std::unique_ptr(new CliCommandPardonIp())); + m_registry->Register(std::unique_ptr(new CliCommandBanList())); + m_registry->Register(std::unique_ptr(new CliCommandWhitelist())); + m_registry->Register(std::unique_ptr(new CliCommandTp())); + m_registry->Register(std::unique_ptr(new CliCommandTime())); + m_registry->Register(std::unique_ptr(new CliCommandWeather())); + m_registry->Register(std::unique_ptr(new CliCommandGive())); + m_registry->Register(std::unique_ptr(new CliCommandEnchant())); + m_registry->Register(std::unique_ptr(new CliCommandKill())); + m_registry->Register(std::unique_ptr(new CliCommandGamemode())); + m_registry->Register(std::unique_ptr(new CliCommandDefaultGamemode())); + m_registry->Register(std::unique_ptr(new CliCommandExperience())); + } + + void ServerCliEngine::EnqueueCommandLine(const std::string &line) + { + std::lock_guard lock(m_queueMutex); + m_pendingLines.push(line); + } + + void ServerCliEngine::Poll() + { + for (;;) + { + std::string line; + { + // Keep the lock scope minimal: dequeue only, execute outside. + std::lock_guard lock(m_queueMutex); + if (m_pendingLines.empty()) + { + break; + } + line = m_pendingLines.front(); + m_pendingLines.pop(); + } + + ExecuteCommandLine(line); + } + } + + bool ServerCliEngine::ExecuteCommandLine(const std::string &line) + { + // Normalize user input before parsing (trim + optional leading slash). + std::wstring wide = trimString(StringUtils::Utf8ToWide(line)); + if (wide.empty()) + { + return true; + } + + std::string normalizedLine = StringUtils::WideToUtf8(wide); + if (!normalizedLine.empty() && normalizedLine[0] == '/') + { + normalizedLine = normalizedLine.substr(1); + } + + ServerCliParsedLine parsed = ServerCliParser::Parse(normalizedLine); + if (parsed.tokens.empty()) + { + return true; + } + + IServerCliCommand *command = m_registry->FindMutable(parsed.tokens[0]); + if (command == NULL) + { + LogWarn("Unknown command: " + parsed.tokens[0]); + return false; + } + + return command->Execute(parsed, this); + } + + void ServerCliEngine::BuildCompletions(const std::string &line, std::vector *out) const + { + if (out == NULL) + { + return; + } + + out->clear(); + ServerCliCompletionContext context = ServerCliParser::BuildCompletionContext(line); + bool slashPrefixedCommand = false; + std::string commandToken; + if (!context.parsed.tokens.empty()) + { + // Completion accepts both "tp" and "/tp" style command heads. + commandToken = context.parsed.tokens[0]; + if (!commandToken.empty() && commandToken[0] == '/') + { + commandToken = commandToken.substr(1); + slashPrefixedCommand = true; + } + } + + if (context.currentTokenIndex == 0) + { + std::string prefix = context.prefix; + if (!prefix.empty() && prefix[0] == '/') + { + prefix = prefix.substr(1); + slashPrefixedCommand = true; + } + + std::string linePrefix = context.linePrefix; + if (slashPrefixedCommand && linePrefix.empty()) + { + // Preserve leading slash when user started with "/". + linePrefix = "/"; + } + + m_registry->SuggestCommandNames(prefix, linePrefix, out); + } + else + { + const IServerCliCommand *command = m_registry->Find(commandToken); + if (command != NULL) + { + command->Complete(context, this, out); + } + } + + std::unordered_set seen; + std::vector unique; + for (size_t i = 0; i < out->size(); ++i) + { + // Remove duplicates while keeping first-seen ordering. + if (seen.insert((*out)[i]).second) + { + unique.push_back((*out)[i]); + } + } + out->swap(unique); + } + + void ServerCliEngine::LogInfo(const std::string &message) const + { + LogInfof("console", "%s", message.c_str()); + } + + void ServerCliEngine::LogWarn(const std::string &message) const + { + LogWarnf("console", "%s", message.c_str()); + } + + void ServerCliEngine::LogError(const std::string &message) const + { + LogErrorf("console", "%s", message.c_str()); + } + + void ServerCliEngine::RequestShutdown() const + { + RequestDedicatedServerShutdown(); + } + + std::vector ServerCliEngine::GetOnlinePlayerNamesUtf8() const + { + std::vector result; + MinecraftServer *server = MinecraftServer::getInstance(); + if (server == NULL) + { + return result; + } + + PlayerList *players = server->getPlayers(); + if (players == NULL) + { + return result; + } + + for (size_t i = 0; i < players->players.size(); ++i) + { + std::shared_ptr player = players->players[i]; + if (player != NULL) + { + result.push_back(StringUtils::WideToUtf8(player->getName())); + } + } + + return result; + } + + std::shared_ptr ServerCliEngine::FindPlayerByNameUtf8(const std::string &name) const + { + MinecraftServer *server = MinecraftServer::getInstance(); + if (server == NULL) + { + return nullptr; + } + + PlayerList *players = server->getPlayers(); + if (players == NULL) + { + return nullptr; + } + + std::wstring target = StringUtils::Utf8ToWide(name); + for (size_t i = 0; i < players->players.size(); ++i) + { + std::shared_ptr player = players->players[i]; + if (player != NULL && equalsIgnoreCase(player->getName(), target)) + { + return player; + } + } + + return nullptr; + } + + void ServerCliEngine::SuggestPlayers(const std::string &prefix, const std::string &linePrefix, std::vector *out) const + { + std::vector players = GetOnlinePlayerNamesUtf8(); + std::string loweredPrefix = StringUtils::ToLowerAscii(prefix); + for (size_t i = 0; i < players.size(); ++i) + { + std::string loweredName = StringUtils::ToLowerAscii(players[i]); + if (loweredName.compare(0, loweredPrefix.size(), loweredPrefix) == 0) + { + out->push_back(linePrefix + players[i]); + } + } + } + + void ServerCliEngine::SuggestGamemodes(const std::string &prefix, const std::string &linePrefix, std::vector *out) const + { + static const char *kModes[] = { "survival", "creative", "s", "c", "0", "1" }; + std::string loweredPrefix = StringUtils::ToLowerAscii(prefix); + for (size_t i = 0; i < sizeof(kModes) / sizeof(kModes[0]); ++i) + { + std::string candidate = kModes[i]; + std::string loweredCandidate = StringUtils::ToLowerAscii(candidate); + if (loweredCandidate.compare(0, loweredPrefix.size(), loweredPrefix) == 0) + { + out->push_back(linePrefix + candidate); + } + } + } + + GameType *ServerCliEngine::ParseGamemode(const std::string &token) const + { + std::string lowered = StringUtils::ToLowerAscii(token); + if (lowered == "survival" || lowered == "s" || lowered == "0") + { + return GameType::SURVIVAL; + } + if (lowered == "creative" || lowered == "c" || lowered == "1") + { + return GameType::CREATIVE; + } + + char *end = NULL; + long id = strtol(lowered.c_str(), &end, 10); + if (end != NULL && *end == 0) + { + // Numeric fallback supports extended ids handled by level settings. + return LevelSettings::validateGameType((int)id); + } + + return NULL; + } + + bool ServerCliEngine::DispatchWorldCommand(EGameCommand command, byteArray commandData, const std::shared_ptr &sender) const + { + MinecraftServer *server = MinecraftServer::getInstance(); + if (server == NULL) + { + LogWarn("MinecraftServer instance is not available."); + return false; + } + + CommandDispatcher *dispatcher = server->getCommandDispatcher(); + if (dispatcher == NULL) + { + LogWarn("Command dispatcher is not available."); + return false; + } + + std::shared_ptr commandSender = sender; + if (commandSender == nullptr) + { + // fall back to console sender if caller did not provide one + commandSender = m_consoleSender; + } + if (commandSender == nullptr) + { + LogWarn("No command sender is available."); + return false; + } + + dispatcher->performCommand(commandSender, command, commandData); + return true; + } + + const ServerCliRegistry &ServerCliEngine::Registry() const + { + return *m_registry; + } +} diff --git a/Minecraft.Server/Console/ServerCliEngine.h b/Minecraft.Server/Console/ServerCliEngine.h new file mode 100644 index 00000000..b2d72bac --- /dev/null +++ b/Minecraft.Server/Console/ServerCliEngine.h @@ -0,0 +1,127 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "..\..\Minecraft.World\ArrayWithLength.h" +#include "..\..\Minecraft.World\CommandsEnum.h" + +class GameType; +class ServerPlayer; +class CommandSender; + +namespace ServerRuntime +{ + class ServerCliRegistry; + + /** + * **CLI execution engine** + * + * Handles parsing, command dispatch, completion suggestions, and server-side helpers. + * 解析・実行・補完エンジン + */ + class ServerCliEngine + { + public: + ServerCliEngine(); + ~ServerCliEngine(); + + /** + * **Queue one raw command line** + * + * Called by input thread; execution is deferred to `Poll()`. + * 入力行を実行キューに追加 + */ + void EnqueueCommandLine(const std::string &line); + + /** + * **Execute queued commands** + * + * Drains pending lines and dispatches them in order. + * キュー済みコマンドを順番に実行 + */ + void Poll(); + + /** + * **Execute one command line immediately** + * + * Parses and dispatches a normalized line to a registered command. + * 1行を直接パースしてコマンド実行 + */ + bool ExecuteCommandLine(const std::string &line); + + /** + * **Build completion candidates for current line** + * + * Produces command or argument suggestions based on parser context. + * 現在入力に対する補完候補を作成 + */ + void BuildCompletions(const std::string &line, std::vector *out) const; + + void LogInfo(const std::string &message) const; + void LogWarn(const std::string &message) const; + void LogError(const std::string &message) const; + void RequestShutdown() const; + + /** + * **List connected players as UTF-8 names** + * + * ここら辺は分けてもいいかも + */ + std::vector GetOnlinePlayerNamesUtf8() const; + + /** + * **Find a player by UTF-8 name** + */ + std::shared_ptr FindPlayerByNameUtf8(const std::string &name) const; + + /** + * **Suggest player-name arguments** + * + * Appends matching player candidates using the given completion prefix. + * プレイヤー名の補完候補 + */ + void SuggestPlayers(const std::string &prefix, const std::string &linePrefix, std::vector *out) const; + + /** + * **Suggest gamemode arguments** + * + * Appends standard gamemode aliases (survival/creative/0/1). + * ゲームモードの補完候補 + */ + void SuggestGamemodes(const std::string &prefix, const std::string &linePrefix, std::vector *out) const; + + /** + * **Parse gamemode token** + * + * Supports names, short aliases, and numeric ids. + * 文字列からゲームモードを解決 + */ + GameType *ParseGamemode(const std::string &token) const; + + /** + * **Dispatch one Minecraft.World game command** + * + * Uses `Minecraft.World::CommandDispatcher` for actual execution. + * When `sender` is null, an internal console command sender is used. + * + * Minecraft.Worldのコマンドを実行するためのディスパッチャーのラッパー + * 内部でsenderがnullの場合はコンソールコマンド送信者を使用 + */ + bool DispatchWorldCommand(EGameCommand command, byteArray commandData, const std::shared_ptr &sender = nullptr) const; + + const ServerCliRegistry &Registry() const; + + private: + void RegisterDefaultCommands(); + + private: + mutable std::mutex m_queueMutex; + std::queue m_pendingLines; + std::unique_ptr m_registry; + std::shared_ptr m_consoleSender; + }; +} diff --git a/Minecraft.Server/Console/ServerCliInput.cpp b/Minecraft.Server/Console/ServerCliInput.cpp new file mode 100644 index 00000000..d873980a --- /dev/null +++ b/Minecraft.Server/Console/ServerCliInput.cpp @@ -0,0 +1,285 @@ +#include "stdafx.h" + +#include "ServerCliInput.h" + +#include "ServerCliEngine.h" +#include "..\ServerLogger.h" +#include "..\vendor\linenoise\linenoise.h" + +#include +#include + +namespace +{ + bool UseStreamInputMode() + { + const char *mode = getenv("SERVER_CLI_INPUT_MODE"); + if (mode != NULL) + { + return _stricmp(mode, "stream") == 0 + || _stricmp(mode, "stdin") == 0; + } + + return false; + } + + int WaitForStdinReadable(HANDLE stdinHandle, DWORD waitMs) + { + if (stdinHandle == NULL || stdinHandle == INVALID_HANDLE_VALUE) + { + return -1; + } + + DWORD fileType = GetFileType(stdinHandle); + if (fileType == FILE_TYPE_PIPE) + { + DWORD available = 0; + if (!PeekNamedPipe(stdinHandle, NULL, 0, NULL, &available, NULL)) + { + return -1; + } + return available > 0 ? 1 : 0; + } + + if (fileType == FILE_TYPE_CHAR) + { + // console/pty char handles are often not waitable across Wine+Docker. + return 1; + } + + DWORD waitResult = WaitForSingleObject(stdinHandle, waitMs); + if (waitResult == WAIT_OBJECT_0) + { + return 1; + } + if (waitResult == WAIT_TIMEOUT) + { + return 0; + } + + return -1; + } +} + +namespace ServerRuntime +{ + // C-style completion callback bridge requires a static instance pointer. + ServerCliInput *ServerCliInput::s_instance = NULL; + + ServerCliInput::ServerCliInput() + : m_running(false) + , m_engine(NULL) + { + } + + ServerCliInput::~ServerCliInput() + { + Stop(); + } + + void ServerCliInput::Start(ServerCliEngine *engine) + { + if (engine == NULL || m_running.exchange(true)) + { + return; + } + + m_engine = engine; + s_instance = this; + linenoiseResetStop(); + linenoiseHistorySetMaxLen(128); + linenoiseSetCompletionCallback(&ServerCliInput::CompletionThunk); + m_inputThread = std::thread(&ServerCliInput::RunInputLoop, this); + LogInfo("console", "CLI input thread started."); + } + + void ServerCliInput::Stop() + { + if (!m_running.exchange(false)) + { + return; + } + + // Ask linenoise to break out first, then join thread safely. + linenoiseRequestStop(); + if (m_inputThread.joinable()) + { + CancelSynchronousIo((HANDLE)m_inputThread.native_handle()); + m_inputThread.join(); + } + linenoiseSetCompletionCallback(NULL); + + if (s_instance == this) + { + s_instance = NULL; + } + + m_engine = NULL; + LogInfo("console", "CLI input thread stopped."); + } + + bool ServerCliInput::IsRunning() const + { + return m_running.load(); + } + + void ServerCliInput::RunInputLoop() + { + if (UseStreamInputMode()) + { + LogInfo("console", "CLI input mode: stream(file stdin)"); + RunStreamInputLoop(); + return; + } + + RunLinenoiseLoop(); + } + + /** + * use linenoise for interactive console input, with line editing and history support + */ + void ServerCliInput::RunLinenoiseLoop() + { + while (m_running) + { + char *line = linenoise("server> "); + if (line == NULL) + { + // NULL is expected on stop request (or Ctrl+C inside linenoise). + if (!m_running) + { + break; + } + Sleep(10); + continue; + } + + EnqueueLine(line); + + linenoiseFree(line); + } + } + + /** + * use file-based stdin reading instead of linenoise when requested or when stdin is not a console/pty (e.g. piped input or non-interactive docker) + */ + void ServerCliInput::RunStreamInputLoop() + { + HANDLE stdinHandle = GetStdHandle(STD_INPUT_HANDLE); + if (stdinHandle == NULL || stdinHandle == INVALID_HANDLE_VALUE) + { + LogWarn("console", "stream input mode requested but STDIN handle is unavailable; falling back to linenoise."); + RunLinenoiseLoop(); + return; + } + + std::string line; + bool skipNextLf = false; + + printf("server> "); + fflush(stdout); + + while (m_running) + { + int readable = WaitForStdinReadable(stdinHandle, 50); + if (readable <= 0) + { + Sleep(10); + continue; + } + + char ch = 0; + DWORD bytesRead = 0; + if (!ReadFile(stdinHandle, &ch, 1, &bytesRead, NULL) || bytesRead == 0) + { + Sleep(10); + continue; + } + + if (skipNextLf && ch == '\n') + { + skipNextLf = false; + continue; + } + + if (ch == '\r' || ch == '\n') + { + if (ch == '\r') + { + skipNextLf = true; + } + else + { + skipNextLf = false; + } + + if (!line.empty()) + { + EnqueueLine(line.c_str()); + line.clear(); + } + + printf("server> "); + fflush(stdout); + continue; + } + + skipNextLf = false; + + if ((unsigned char)ch == 3) + { + continue; + } + + if ((unsigned char)ch == 8 || (unsigned char)ch == 127) + { + if (!line.empty()) + { + line.resize(line.size() - 1); + } + continue; + } + + if (isprint((unsigned char)ch) && line.size() < 4096) + { + line.push_back(ch); + } + } + } + + void ServerCliInput::EnqueueLine(const char *line) + { + if (line == NULL || line[0] == 0 || m_engine == NULL) + { + return; + } + + // Keep local history and forward command for main-thread execution. + linenoiseHistoryAdd(line); + m_engine->EnqueueCommandLine(line); + } + + void ServerCliInput::CompletionThunk(const char *line, linenoiseCompletions *completions) + { + // Static thunk forwards callback into instance state. + if (s_instance != NULL) + { + s_instance->BuildCompletions(line, completions); + } + } + + void ServerCliInput::BuildCompletions(const char *line, linenoiseCompletions *completions) + { + if (line == NULL || completions == NULL || m_engine == NULL) + { + return; + } + + std::vector suggestions; + m_engine->BuildCompletions(line, &suggestions); + for (size_t i = 0; i < suggestions.size(); ++i) + { + linenoiseAddCompletion(completions, suggestions[i].c_str()); + } + } +} diff --git a/Minecraft.Server/Console/ServerCliInput.h b/Minecraft.Server/Console/ServerCliInput.h new file mode 100644 index 00000000..83221a2c --- /dev/null +++ b/Minecraft.Server/Console/ServerCliInput.h @@ -0,0 +1,63 @@ +#pragma once + +#include +#include + +struct linenoiseCompletions; + +namespace ServerRuntime +{ + class ServerCliEngine; + + /** + * **CLI input worker** + * + * Owns the interactive input thread and bridges linenoise callbacks to the engine. + * 入力スレッドと補完コールバックを管理するクラス + */ + class ServerCliInput + { + public: + ServerCliInput(); + ~ServerCliInput(); + + /** + * **Start input loop** + * + * Binds to an engine and starts reading user input from the console. + * エンジンに接続して入力ループを開始 + */ + void Start(ServerCliEngine *engine); + + /** + * **Stop input loop** + * + * Requests stop and joins the input thread. + * 停止要求を出して入力スレッドを終了 + */ + void Stop(); + + /** + * **Check running state** + * + * Returns true while the input thread is active. + * 入力処理が動作中かどうか + */ + bool IsRunning() const; + + private: + void RunInputLoop(); + void RunLinenoiseLoop(); + void RunStreamInputLoop(); + void EnqueueLine(const char *line); + static void CompletionThunk(const char *line, linenoiseCompletions *completions); + void BuildCompletions(const char *line, linenoiseCompletions *completions); + + private: + std::atomic m_running; + std::thread m_inputThread; + ServerCliEngine *m_engine; + + static ServerCliInput *s_instance; + }; +} diff --git a/Minecraft.Server/Console/ServerCliParser.cpp b/Minecraft.Server/Console/ServerCliParser.cpp new file mode 100644 index 00000000..5888153f --- /dev/null +++ b/Minecraft.Server/Console/ServerCliParser.cpp @@ -0,0 +1,116 @@ +#include "stdafx.h" + +#include "ServerCliParser.h" + +namespace ServerRuntime +{ + static void TokenizeLine(const std::string &line, std::vector *tokens, bool *trailingSpace) + { + std::string current; + bool inQuotes = false; + bool escaped = false; + + tokens->clear(); + *trailingSpace = false; + + for (size_t i = 0; i < line.size(); ++i) + { + char ch = line[i]; + if (escaped) + { + // Keep escaped character literally (e.g. \" or \ ). + current.push_back(ch); + escaped = false; + continue; + } + + if (ch == '\\') + { + escaped = true; + continue; + } + + if (ch == '"') + { + // Double quotes group spaces into one token. + inQuotes = !inQuotes; + continue; + } + + if (!inQuotes && (ch == ' ' || ch == '\t')) + { + if (!current.empty()) + { + tokens->push_back(current); + current.clear(); + } + continue; + } + + current.push_back(ch); + } + + if (!current.empty()) + { + tokens->push_back(current); + } + + if (!line.empty()) + { + char tail = line[line.size() - 1]; + // Trailing space means completion targets the next token slot. + *trailingSpace = (!inQuotes && (tail == ' ' || tail == '\t')); + } + } + + ServerCliParsedLine ServerCliParser::Parse(const std::string &line) + { + ServerCliParsedLine parsed; + parsed.raw = line; + TokenizeLine(line, &parsed.tokens, &parsed.trailingSpace); + return parsed; + } + + ServerCliCompletionContext ServerCliParser::BuildCompletionContext(const std::string &line) + { + ServerCliCompletionContext context; + context.parsed = Parse(line); + + if (context.parsed.tokens.empty()) + { + context.currentTokenIndex = 0; + context.prefix.clear(); + context.linePrefix.clear(); + return context; + } + + if (context.parsed.trailingSpace) + { + // Cursor is after a separator, so complete a new token. + context.currentTokenIndex = context.parsed.tokens.size(); + context.prefix.clear(); + } + else + { + // Cursor is inside current token, so complete by its prefix. + context.currentTokenIndex = context.parsed.tokens.size() - 1; + context.prefix = context.parsed.tokens.back(); + } + + for (size_t i = 0; i < context.currentTokenIndex; ++i) + { + // linePrefix is the immutable left side reused by completion output. + if (!context.linePrefix.empty()) + { + context.linePrefix.push_back(' '); + } + context.linePrefix += context.parsed.tokens[i]; + } + if (!context.linePrefix.empty()) + { + context.linePrefix.push_back(' '); + } + + return context; + } +} diff --git a/Minecraft.Server/Console/ServerCliParser.h b/Minecraft.Server/Console/ServerCliParser.h new file mode 100644 index 00000000..a84d179b --- /dev/null +++ b/Minecraft.Server/Console/ServerCliParser.h @@ -0,0 +1,63 @@ +#pragma once + +#include +#include + +namespace ServerRuntime +{ + /** + * **Parsed command line** + */ + struct ServerCliParsedLine + { + std::string raw; + std::vector tokens; + bool trailingSpace; + + ServerCliParsedLine() + : trailingSpace(false) + { + } + }; + + /** + * **Completion context for one input line** + * + * Indicates current token index, token prefix, and the fixed line prefix. + */ + struct ServerCliCompletionContext + { + ServerCliParsedLine parsed; + size_t currentTokenIndex; + std::string prefix; + std::string linePrefix; + + ServerCliCompletionContext() + : currentTokenIndex(0) + { + } + }; + + /** + * **CLI parser helpers** + * + * Converts raw input text into tokenized data used by execution and completion. + */ + class ServerCliParser + { + public: + /** + * **Tokenize one command line** + * + * Supports quoted segments and escaped characters. + */ + static ServerCliParsedLine Parse(const std::string &line); + + /** + * **Build completion metadata** + * + * Determines active token position and reusable prefix parts. + */ + static ServerCliCompletionContext BuildCompletionContext(const std::string &line); + }; +} diff --git a/Minecraft.Server/Console/ServerCliRegistry.cpp b/Minecraft.Server/Console/ServerCliRegistry.cpp new file mode 100644 index 00000000..432907b2 --- /dev/null +++ b/Minecraft.Server/Console/ServerCliRegistry.cpp @@ -0,0 +1,99 @@ +#include "stdafx.h" + +#include "ServerCliRegistry.h" + +#include "commands\IServerCliCommand.h" +#include "..\Common\StringUtils.h" + +namespace ServerRuntime +{ + bool ServerCliRegistry::Register(std::unique_ptr command) + { + if (!command) + { + return false; + } + + IServerCliCommand *raw = command.get(); + std::string baseName = StringUtils::ToLowerAscii(raw->Name()); + // Reject empty/duplicate primary command names. + if (baseName.empty() || m_lookup.find(baseName) != m_lookup.end()) + { + return false; + } + std::vector aliases = raw->Aliases(); + std::vector normalizedAliases; + normalizedAliases.reserve(aliases.size()); + for (size_t i = 0; i < aliases.size(); ++i) + { + std::string alias = StringUtils::ToLowerAscii(aliases[i]); + // Alias must also be unique across all names and aliases. + if (alias.empty() || m_lookup.find(alias) != m_lookup.end()) + { + return false; + } + normalizedAliases.push_back(alias); + } + + m_lookup[baseName] = raw; + for (size_t i = 0; i < normalizedAliases.size(); ++i) + { + m_lookup[normalizedAliases[i]] = raw; + } + + // Command objects are owned here; lookup stores non-owning pointers. + m_commands.push_back(std::move(command)); + return true; + } + + const IServerCliCommand *ServerCliRegistry::Find(const std::string &name) const + { + std::string key = StringUtils::ToLowerAscii(name); + auto it = m_lookup.find(key); + if (it == m_lookup.end()) + { + return NULL; + } + return it->second; + } + + IServerCliCommand *ServerCliRegistry::FindMutable(const std::string &name) + { + std::string key = StringUtils::ToLowerAscii(name); + auto it = m_lookup.find(key); + if (it == m_lookup.end()) + { + return NULL; + } + return it->second; + } + + void ServerCliRegistry::SuggestCommandNames(const std::string &prefix, const std::string &linePrefix, std::vector *out) const + { + for (size_t i = 0; i < m_commands.size(); ++i) + { + const IServerCliCommand *command = m_commands[i].get(); + std::string name = command->Name(); + if (StringUtils::StartsWithIgnoreCase(name, prefix)) + { + out->push_back(linePrefix + name); + } + + // Include aliases so users can discover shorthand commands. + std::vector aliases = command->Aliases(); + for (size_t aliasIndex = 0; aliasIndex < aliases.size(); ++aliasIndex) + { + if (StringUtils::StartsWithIgnoreCase(aliases[aliasIndex], prefix)) + { + out->push_back(linePrefix + aliases[aliasIndex]); + } + } + } + } + + const std::vector> &ServerCliRegistry::Commands() const + { + return m_commands; + } +} + diff --git a/Minecraft.Server/Console/ServerCliRegistry.h b/Minecraft.Server/Console/ServerCliRegistry.h new file mode 100644 index 00000000..5104b534 --- /dev/null +++ b/Minecraft.Server/Console/ServerCliRegistry.h @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include +#include + +namespace ServerRuntime +{ + class IServerCliCommand; + + /** + * **CLI command registry** + */ + class ServerCliRegistry + { + public: + /** + * **Register a command object** + * + * Validates name/aliases and adds lookup entries. + * コマンドの追加 + */ + bool Register(std::unique_ptr command); + + /** + * **Find command by name or alias (const)** + * + * Returns null when no match exists. + */ + const IServerCliCommand *Find(const std::string &name) const; + + /** + * **Find mutable command by name or alias** + * + * Used by runtime dispatch path. + */ + IServerCliCommand *FindMutable(const std::string &name); + + /** + * **Suggest top-level command names** + * + * Adds matching command names and aliases to the output list. + */ + void SuggestCommandNames(const std::string &prefix, const std::string &linePrefix, std::vector *out) const; + + /** + * **Get registered command list** + * + * Intended for help output and inspection. + */ + const std::vector> &Commands() const; + + private: + std::vector> m_commands; + std::unordered_map m_lookup; + }; +} diff --git a/Minecraft.Server/Console/commands/CommandParsing.h b/Minecraft.Server/Console/commands/CommandParsing.h new file mode 100644 index 00000000..edef68d0 --- /dev/null +++ b/Minecraft.Server/Console/commands/CommandParsing.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include +#include +#include + +namespace ServerRuntime +{ + namespace CommandParsing + { + inline bool TryParseInt(const std::string &text, int *outValue) + { + if (outValue == nullptr || text.empty()) + { + return false; + } + + char *end = nullptr; + errno = 0; + const long parsedValue = std::strtol(text.c_str(), &end, 10); + if (end == text.c_str() || *end != '\0') + { + return false; + } + if (errno == ERANGE) + { + return false; + } + if (parsedValue < (std::numeric_limits::min)() || parsedValue > (std::numeric_limits::max)()) + { + return false; + } + + *outValue = static_cast(parsedValue); + return true; + } + } +} diff --git a/Minecraft.Server/Console/commands/IServerCliCommand.h b/Minecraft.Server/Console/commands/IServerCliCommand.h new file mode 100644 index 00000000..9cf5ef0e --- /dev/null +++ b/Minecraft.Server/Console/commands/IServerCliCommand.h @@ -0,0 +1,50 @@ +#pragma once + +#include +#include + +namespace ServerRuntime +{ + class ServerCliEngine; + struct ServerCliParsedLine; + struct ServerCliCompletionContext; + + /** + * **Command interface for server CLI** + * + * Implement this contract to add new commands without changing engine internals. + */ + class IServerCliCommand + { + public: + virtual ~IServerCliCommand() = default; + + /** Primary command name */ + virtual const char *Name() const = 0; + /** Optional aliases */ + virtual std::vector Aliases() const { return {}; } + /** Usage text for help */ + virtual const char *Usage() const = 0; + /** Short command description*/ + virtual const char *Description() const = 0; + + /** + * **Execute command logic** + * + * Called after tokenization and command lookup. + */ + virtual bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) = 0; + + /** + * **Provide argument completion candidates** + * + * Override when command-specific completion is needed. + */ + virtual void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + (void)context; + (void)engine; + (void)out; + } + }; +} diff --git a/Minecraft.Server/Console/commands/ban-ip/CliCommandBanIp.cpp b/Minecraft.Server/Console/commands/ban-ip/CliCommandBanIp.cpp new file mode 100644 index 00000000..99c1455e --- /dev/null +++ b/Minecraft.Server/Console/commands/ban-ip/CliCommandBanIp.cpp @@ -0,0 +1,171 @@ +#include "stdafx.h" + +#include "CliCommandBanIp.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\Access\Access.h" +#include "..\..\..\Common\NetworkUtils.h" +#include "..\..\..\Common\StringUtils.h" +#include "..\..\..\ServerLogManager.h" +#include "..\..\..\..\Minecraft.Client\MinecraftServer.h" +#include "..\..\..\..\Minecraft.Client\PlayerConnection.h" +#include "..\..\..\..\Minecraft.Client\PlayerList.h" +#include "..\..\..\..\Minecraft.Client\ServerPlayer.h" +#include "..\..\..\..\Minecraft.World\Connection.h" +#include "..\..\..\..\Minecraft.World\DisconnectPacket.h" + +namespace ServerRuntime +{ + namespace + { + // The dedicated server keeps the accepted remote IP in ServerLogManager, keyed by connection smallId. + // It's a bit strange from a responsibility standpoint, so we'll need to implement it separately. + static bool TryGetPlayerRemoteIp(const std::shared_ptr &player, std::string *outIp) + { + if (outIp == nullptr || player == nullptr || player->connection == nullptr || player->connection->connection == nullptr || player->connection->connection->getSocket() == nullptr) + { + return false; + } + + const unsigned char smallId = player->connection->connection->getSocket()->getSmallId(); + if (smallId == 0) + { + return false; + } + + return ServerRuntime::ServerLogManager::TryGetConnectionRemoteIp(smallId, outIp); + } + + // After persisting the ban, walk a snapshot of current players so every matching session is removed. + static int DisconnectPlayersByRemoteIp(const std::string &ip) + { + auto *server = MinecraftServer::getInstance(); + if (server == nullptr || server->getPlayers() == nullptr) + { + return 0; + } + + const std::string normalizedIp = NetworkUtils::NormalizeIpToken(ip); + const std::vector> playerSnapshot = server->getPlayers()->players; + int disconnectedCount = 0; + for (const auto &player : playerSnapshot) + { + std::string playerIp; + if (!TryGetPlayerRemoteIp(player, &playerIp)) + { + continue; + } + + if (NetworkUtils::NormalizeIpToken(playerIp) == normalizedIp) + { + if (player != nullptr && player->connection != nullptr) + { + player->connection->disconnect(DisconnectPacket::eDisconnect_Banned); + ++disconnectedCount; + } + } + } + + return disconnectedCount; + } + } + + const char *CliCommandBanIp::Name() const + { + return "ban-ip"; + } + + const char *CliCommandBanIp::Usage() const + { + return "ban-ip [reason ...]"; + } + + const char *CliCommandBanIp::Description() const + { + return "Ban an IP address or a player's current IP."; + } + + /** + * Resolves either a literal IP or an online player's current IP, persists the ban, and disconnects every matching connection + * IPまたは接続中プレイヤーの現在IPをBANし一致する接続を切断する + */ + bool CliCommandBanIp::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() < 2) + { + engine->LogWarn("Usage: ban-ip [reason ...]"); + return false; + } + if (!ServerRuntime::Access::IsInitialized()) + { + engine->LogWarn("Access manager is not initialized."); + return false; + } + + const std::string targetToken = line.tokens[1]; + std::string remoteIp; + // Match Java Edition behavior by accepting either a literal IP or an online player name. + const auto targetPlayer = engine->FindPlayerByNameUtf8(targetToken); + if (targetPlayer != nullptr) + { + if (!TryGetPlayerRemoteIp(targetPlayer, &remoteIp)) + { + engine->LogWarn("Cannot ban that player's IP because no current remote IP is available."); + return false; + } + } + else if (NetworkUtils::IsIpLiteral(targetToken)) + { + remoteIp = StringUtils::TrimAscii(targetToken); + } + else + { + engine->LogWarn("Unknown player or invalid IP address: " + targetToken); + return false; + } + + // Refuse duplicate bans so operators get immediate feedback instead of rewriting the same entry. + if (ServerRuntime::Access::IsIpBanned(remoteIp)) + { + engine->LogWarn("That IP address is already banned."); + return false; + } + + ServerRuntime::Access::BanMetadata metadata = ServerRuntime::Access::BanManager::BuildDefaultMetadata("Console"); + metadata.reason = StringUtils::JoinTokens(line.tokens, 2); + if (metadata.reason.empty()) + { + metadata.reason = "Banned by an operator."; + } + + // Publish the ban before disconnecting players so reconnect attempts are rejected immediately. + if (!ServerRuntime::Access::AddIpBan(remoteIp, metadata)) + { + engine->LogError("Failed to write IP ban."); + return false; + } + + const int disconnectedCount = DisconnectPlayersByRemoteIp(remoteIp); + // Report the resolved IP rather than the original token so player-name targets are explicit in the console. + engine->LogInfo("Banned IP address " + remoteIp + "."); + if (disconnectedCount > 0) + { + engine->LogInfo("Disconnected " + std::to_string(disconnectedCount) + " player(s) with that IP."); + } + return true; + } + + /** + * Suggests online player names for the player-target form of the Java Edition command + * プレイヤー名指定時の補完候補を返す + */ + void CliCommandBanIp::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + if (context.currentTokenIndex == 1) + { + engine->SuggestPlayers(context.prefix, context.linePrefix, out); + } + } +} + diff --git a/Minecraft.Server/Console/commands/ban-ip/CliCommandBanIp.h b/Minecraft.Server/Console/commands/ban-ip/CliCommandBanIp.h new file mode 100644 index 00000000..1c116fa6 --- /dev/null +++ b/Minecraft.Server/Console/commands/ban-ip/CliCommandBanIp.h @@ -0,0 +1,19 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + /** + * Applies a dedicated-server IP ban using Java Edition style syntax and Access-backed persistence + */ + class CliCommandBanIp : public IServerCliCommand + { + public: + virtual const char *Name() const; + virtual const char *Usage() const; + virtual const char *Description() const; + virtual bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine); + virtual void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const; + }; +} diff --git a/Minecraft.Server/Console/commands/ban-list/CliCommandBanList.cpp b/Minecraft.Server/Console/commands/ban-list/CliCommandBanList.cpp new file mode 100644 index 00000000..14641617 --- /dev/null +++ b/Minecraft.Server/Console/commands/ban-list/CliCommandBanList.cpp @@ -0,0 +1,136 @@ +#include "stdafx.h" + +#include "CliCommandBanList.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\Access\Access.h" +#include "..\..\..\Common\StringUtils.h" + +#include + +namespace ServerRuntime +{ + namespace + { + static void AppendUniqueText(const std::string &text, std::vector *out) + { + if (out == nullptr || text.empty()) + { + return; + } + + if (std::find(out->begin(), out->end(), text) == out->end()) + { + out->push_back(text); + } + } + + static bool CompareLowerAscii(const std::string &left, const std::string &right) + { + return StringUtils::ToLowerAscii(left) < StringUtils::ToLowerAscii(right); + } + + static bool LogBannedPlayers(ServerCliEngine *engine) + { + std::vector entries; + if (!ServerRuntime::Access::SnapshotBannedPlayers(&entries)) + { + engine->LogError("Failed to read banned players."); + return false; + } + + std::vector names; + for (const auto &entry : entries) + { + AppendUniqueText(entry.name, &names); + } + std::sort(names.begin(), names.end(), CompareLowerAscii); + + engine->LogInfo("There are " + std::to_string(names.size()) + " banned player(s)."); + for (const auto &name : names) + { + engine->LogInfo(" " + name); + } + return true; + } + + static bool LogBannedIps(ServerCliEngine *engine) + { + std::vector entries; + if (!ServerRuntime::Access::SnapshotBannedIps(&entries)) + { + engine->LogError("Failed to read banned IPs."); + return false; + } + + std::vector ips; + for (const auto &entry : entries) + { + AppendUniqueText(entry.ip, &ips); + } + std::sort(ips.begin(), ips.end(), CompareLowerAscii); + + engine->LogInfo("There are " + std::to_string(ips.size()) + " banned IP(s)."); + for (const auto &ip : ips) + { + engine->LogInfo(" " + ip); + } + return true; + } + + static bool LogAllBans(ServerCliEngine *engine) + { + if (!LogBannedPlayers(engine)) + { + return false; + } + + // Always print the IP snapshot as well so ban-ip entries are visible from the same command output. + return LogBannedIps(engine); + } + } + + const char *CliCommandBanList::Name() const + { + return "banlist"; + } + + const char *CliCommandBanList::Usage() const + { + return "banlist"; + } + + const char *CliCommandBanList::Description() const + { + return "List all banned players and IPs."; + } + + /** + * Reads the current Access snapshots and always prints both banned players and banned IPs + * Access の一覧を読みプレイヤーBANとIP BANをまとめて表示する + */ + bool CliCommandBanList::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() > 1) + { + engine->LogWarn("Usage: banlist"); + return false; + } + if (!ServerRuntime::Access::IsInitialized()) + { + engine->LogWarn("Access manager is not initialized."); + return false; + } + + return LogAllBans(engine); + } + + void CliCommandBanList::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + (void)context; + (void)engine; + (void)out; + } +} + diff --git a/Minecraft.Server/Console/commands/ban-list/CliCommandBanList.h b/Minecraft.Server/Console/commands/ban-list/CliCommandBanList.h new file mode 100644 index 00000000..1db32bc1 --- /dev/null +++ b/Minecraft.Server/Console/commands/ban-list/CliCommandBanList.h @@ -0,0 +1,23 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + /** + * **Ban List Command** + * + * Lists dedicated-server player bans and IP bans in a single command output + * 専用サーバーのプレイヤーBANとIP BANをまとめて表示する + */ + class CliCommandBanList : public IServerCliCommand + { + public: + virtual const char *Name() const; + virtual const char *Usage() const; + virtual const char *Description() const; + virtual bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine); + virtual void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const; + }; +} + diff --git a/Minecraft.Server/Console/commands/ban/CliCommandBan.cpp b/Minecraft.Server/Console/commands/ban/CliCommandBan.cpp new file mode 100644 index 00000000..f9855c0c --- /dev/null +++ b/Minecraft.Server/Console/commands/ban/CliCommandBan.cpp @@ -0,0 +1,145 @@ +#include "stdafx.h" + +#include "CliCommandBan.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\Access\Access.h" +#include "..\..\..\Common\StringUtils.h" +#include "..\..\..\..\Minecraft.Client\PlayerConnection.h" +#include "..\..\..\..\Minecraft.Client\ServerPlayer.h" +#include "..\..\..\..\Minecraft.World\DisconnectPacket.h" + +#include + +namespace ServerRuntime +{ + namespace + { + static void AppendUniqueXuid(PlayerUID xuid, std::vector *out) + { + if (out == nullptr || xuid == INVALID_XUID) + { + return; + } + + if (std::find(out->begin(), out->end(), xuid) == out->end()) + { + out->push_back(xuid); + } + } + + static void CollectPlayerBanXuids(const std::shared_ptr &player, std::vector *out) + { + if (player == nullptr || out == nullptr) + { + return; + } + + // Keep both identity variants because the dedicated server checks login and online XUIDs separately. + AppendUniqueXuid(player->getXuid(), out); + AppendUniqueXuid(player->getOnlineXuid(), out); + } + } + + const char *CliCommandBan::Name() const + { + return "ban"; + } + + const char *CliCommandBan::Usage() const + { + return "ban [reason ...]"; + } + + const char *CliCommandBan::Description() const + { + return "Ban an online player."; + } + + /** + * Resolves the live player, writes one or more Access ban entries, and disconnects the target with the banned reason + * 対象プレイヤーを解決してBANを保存し切断する + */ + bool CliCommandBan::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() < 2) + { + engine->LogWarn("Usage: ban [reason ...]"); + return false; + } + if (!ServerRuntime::Access::IsInitialized()) + { + engine->LogWarn("Access manager is not initialized."); + return false; + } + + const auto target = engine->FindPlayerByNameUtf8(line.tokens[1]); + if (target == nullptr) + { + engine->LogWarn("Unknown player: " + line.tokens[1] + " (this server build can only ban players that are currently online)."); + return false; + } + + std::vector xuids; + CollectPlayerBanXuids(target, &xuids); + if (xuids.empty()) + { + engine->LogWarn("Cannot ban that player because no valid XUID is available."); + return false; + } + + const bool hasUnbannedIdentity = std::any_of( + xuids.begin(), + xuids.end(), + [](PlayerUID xuid) { return !ServerRuntime::Access::IsPlayerBanned(xuid); }); + if (!hasUnbannedIdentity) + { + engine->LogWarn("That player is already banned."); + return false; + } + + ServerRuntime::Access::BanMetadata metadata = ServerRuntime::Access::BanManager::BuildDefaultMetadata("Console"); + metadata.reason = StringUtils::JoinTokens(line.tokens, 2); + if (metadata.reason.empty()) + { + metadata.reason = "Banned by an operator."; + } + + const std::string playerName = StringUtils::WideToUtf8(target->getName()); + for (const auto xuid : xuids) + { + if (ServerRuntime::Access::IsPlayerBanned(xuid)) + { + continue; + } + + if (!ServerRuntime::Access::AddPlayerBan(xuid, playerName, metadata)) + { + engine->LogError("Failed to write player ban."); + return false; + } + } + + if (target->connection != nullptr) + { + target->connection->disconnect(DisconnectPacket::eDisconnect_Banned); + } + + engine->LogInfo("Banned player " + playerName + "."); + return true; + } + + /** + * Suggests currently connected player names for the Java-style player argument + * プレイヤー引数の補完候補を返す + */ + void CliCommandBan::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + if (context.currentTokenIndex == 1) + { + engine->SuggestPlayers(context.prefix, context.linePrefix, out); + } + } +} + diff --git a/Minecraft.Server/Console/commands/ban/CliCommandBan.h b/Minecraft.Server/Console/commands/ban/CliCommandBan.h new file mode 100644 index 00000000..8605474c --- /dev/null +++ b/Minecraft.Server/Console/commands/ban/CliCommandBan.h @@ -0,0 +1,20 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + /** + * Applies a dedicated-server player ban using Java Edition style syntax and Access-backed persistence + * Java Edition 風の ban コマンドで永続プレイヤーBANを行う + */ + class CliCommandBan : public IServerCliCommand + { + public: + virtual const char *Name() const; + virtual const char *Usage() const; + virtual const char *Description() const; + virtual bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine); + virtual void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const; + }; +} diff --git a/Minecraft.Server/Console/commands/defaultgamemode/CliCommandDefaultGamemode.cpp b/Minecraft.Server/Console/commands/defaultgamemode/CliCommandDefaultGamemode.cpp new file mode 100644 index 00000000..ee0e35a2 --- /dev/null +++ b/Minecraft.Server/Console/commands/defaultgamemode/CliCommandDefaultGamemode.cpp @@ -0,0 +1,117 @@ +#include "stdafx.h" + +#include "CliCommandDefaultGamemode.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\..\Minecraft.Client\MinecraftServer.h" +#include "..\..\..\..\Minecraft.Client\PlayerList.h" +#include "..\..\..\..\Minecraft.Client\ServerLevel.h" +#include "..\..\..\..\Minecraft.Client\ServerPlayer.h" +#include "..\..\..\..\Minecraft.World\net.minecraft.world.level.storage.h" + +namespace ServerRuntime +{ + namespace + { + constexpr const char *kDefaultGamemodeUsage = "defaultgamemode "; + + static std::string ModeLabel(GameType *mode) + { + if (mode == GameType::SURVIVAL) + { + return "survival"; + } + if (mode == GameType::CREATIVE) + { + return "creative"; + } + if (mode == GameType::ADVENTURE) + { + return "adventure"; + } + + return std::to_string(mode != nullptr ? mode->getId() : -1); + } + } + + const char *CliCommandDefaultGamemode::Name() const + { + return "defaultgamemode"; + } + + const char *CliCommandDefaultGamemode::Usage() const + { + return kDefaultGamemodeUsage; + } + + const char *CliCommandDefaultGamemode::Description() const + { + return "Set the default game mode (server-side implementation)."; + } + + bool CliCommandDefaultGamemode::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() != 2) + { + engine->LogWarn(std::string("Usage: ") + kDefaultGamemodeUsage); + return false; + } + + GameType *mode = engine->ParseGamemode(line.tokens[1]); + if (mode == nullptr) + { + engine->LogWarn("Unknown gamemode: " + line.tokens[1]); + return false; + } + + MinecraftServer *server = MinecraftServer::getInstance(); + if (server == nullptr) + { + engine->LogWarn("MinecraftServer instance is not available."); + return false; + } + + PlayerList *players = server->getPlayers(); + if (players == nullptr) + { + engine->LogWarn("Player list is not available."); + return false; + } + + players->setOverrideGameMode(mode); + + for (unsigned int i = 0; i < server->levels.length; ++i) + { + ServerLevel *level = server->levels[i]; + if (level != nullptr && level->getLevelData() != nullptr) + { + level->getLevelData()->setGameType(mode); + } + } + + if (server->getForceGameType()) + { + for (size_t i = 0; i < players->players.size(); ++i) + { + std::shared_ptr player = players->players[i]; + if (player != nullptr) + { + player->setGameMode(mode); + player->fallDistance = 0.0f; + } + } + } + + engine->LogInfo("Default gamemode set to " + ModeLabel(mode) + "."); + return true; + } + + void CliCommandDefaultGamemode::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + if (context.currentTokenIndex == 1) + { + engine->SuggestGamemodes(context.prefix, context.linePrefix, out); + } + } +} diff --git a/Minecraft.Server/Console/commands/defaultgamemode/CliCommandDefaultGamemode.h b/Minecraft.Server/Console/commands/defaultgamemode/CliCommandDefaultGamemode.h new file mode 100644 index 00000000..5cc17b34 --- /dev/null +++ b/Minecraft.Server/Console/commands/defaultgamemode/CliCommandDefaultGamemode.h @@ -0,0 +1,16 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandDefaultGamemode : public IServerCliCommand + { + public: + const char *Name() const override; + const char *Usage() const override; + const char *Description() const override; + bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) override; + void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const override; + }; +} diff --git a/Minecraft.Server/Console/commands/enchant/CliCommandEnchant.cpp b/Minecraft.Server/Console/commands/enchant/CliCommandEnchant.cpp new file mode 100644 index 00000000..70d4d7d6 --- /dev/null +++ b/Minecraft.Server/Console/commands/enchant/CliCommandEnchant.cpp @@ -0,0 +1,87 @@ +#include "stdafx.h" + +#include "CliCommandEnchant.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\CommandParsing.h" +#include "..\..\..\..\Minecraft.World\GameCommandPacket.h" +#include "..\..\..\..\Minecraft.World\EnchantItemCommand.h" +#include "..\..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\..\..\Minecraft.Client\ServerPlayer.h" + +namespace ServerRuntime +{ + namespace + { + constexpr const char *kEnchantUsage = "enchant [level]"; + } + + const char *CliCommandEnchant::Name() const + { + return "enchant"; + } + + const char *CliCommandEnchant::Usage() const + { + return kEnchantUsage; + } + + const char *CliCommandEnchant::Description() const + { + return "Enchant held item via Minecraft.World command dispatcher."; + } + + bool CliCommandEnchant::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() < 3 || line.tokens.size() > 4) + { + engine->LogWarn(std::string("Usage: ") + kEnchantUsage); + return false; + } + + std::shared_ptr target = engine->FindPlayerByNameUtf8(line.tokens[1]); + if (target == nullptr) + { + engine->LogWarn("Unknown player: " + line.tokens[1]); + return false; + } + + int enchantmentId = 0; + int enchantmentLevel = 1; + if (!CommandParsing::TryParseInt(line.tokens[2], &enchantmentId)) + { + engine->LogWarn("Invalid enchantment id: " + line.tokens[2]); + return false; + } + if (line.tokens.size() >= 4 && !CommandParsing::TryParseInt(line.tokens[3], &enchantmentLevel)) + { + engine->LogWarn("Invalid enchantment level: " + line.tokens[3]); + return false; + } + + std::shared_ptr player = std::dynamic_pointer_cast(target); + if (player == nullptr) + { + engine->LogWarn("Cannot resolve target player entity."); + return false; + } + + std::shared_ptr packet = EnchantItemCommand::preparePacket(player, enchantmentId, enchantmentLevel); + if (packet == nullptr) + { + engine->LogError("Failed to build enchant command packet."); + return false; + } + + return engine->DispatchWorldCommand(packet->command, packet->data); + } + + void CliCommandEnchant::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + if (context.currentTokenIndex == 1) + { + engine->SuggestPlayers(context.prefix, context.linePrefix, out); + } + } +} diff --git a/Minecraft.Server/Console/commands/enchant/CliCommandEnchant.h b/Minecraft.Server/Console/commands/enchant/CliCommandEnchant.h new file mode 100644 index 00000000..66e330bd --- /dev/null +++ b/Minecraft.Server/Console/commands/enchant/CliCommandEnchant.h @@ -0,0 +1,16 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandEnchant : public IServerCliCommand + { + public: + const char *Name() const override; + const char *Usage() const override; + const char *Description() const override; + bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) override; + void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const override; + }; +} diff --git a/Minecraft.Server/Console/commands/experience/CliCommandExperience.cpp b/Minecraft.Server/Console/commands/experience/CliCommandExperience.cpp new file mode 100644 index 00000000..77df99ae --- /dev/null +++ b/Minecraft.Server/Console/commands/experience/CliCommandExperience.cpp @@ -0,0 +1,184 @@ +#include "stdafx.h" + +#include "CliCommandExperience.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\CommandParsing.h" +#include "..\..\..\Common\StringUtils.h" +#include "..\..\..\..\Minecraft.Client\MinecraftServer.h" +#include "..\..\..\..\Minecraft.Client\PlayerList.h" +#include "..\..\..\..\Minecraft.Client\ServerPlayer.h" + +#include + +namespace ServerRuntime +{ + namespace + { + constexpr const char *kExperienceUsage = "xp [L] [player]"; + constexpr const char *kExperienceUsageWithPlayer = "xp [L] "; + + struct ExperienceAmount + { + int amount = 0; + bool levels = false; + bool take = false; + }; + + static bool TryParseExperienceAmount(const std::string &token, ExperienceAmount *outValue) + { + if (outValue == nullptr || token.empty()) + { + return false; + } + + ExperienceAmount parsed; + std::string numericToken = token; + const char suffix = token[token.size() - 1]; + if (suffix == 'l' || suffix == 'L') + { + parsed.levels = true; + numericToken = token.substr(0, token.size() - 1); + if (numericToken.empty()) + { + return false; + } + } + + int signedAmount = 0; + if (!CommandParsing::TryParseInt(numericToken, &signedAmount)) + { + return false; + } + if (signedAmount == (std::numeric_limits::min)()) + { + return false; + } + + parsed.take = signedAmount < 0; + parsed.amount = parsed.take ? -signedAmount : signedAmount; + *outValue = parsed; + return true; + } + + static std::shared_ptr ResolveTargetPlayer(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() >= 3) + { + return engine->FindPlayerByNameUtf8(line.tokens[2]); + } + + MinecraftServer *server = MinecraftServer::getInstance(); + if (server == nullptr || server->getPlayers() == nullptr) + { + return nullptr; + } + + PlayerList *players = server->getPlayers(); + if (players->players.size() == 1 && players->players[0] != nullptr) + { + return players->players[0]; + } + + return nullptr; + } + } + + const char *CliCommandExperience::Name() const + { + return "xp"; + } + + std::vector CliCommandExperience::Aliases() const + { + return { "experience" }; + } + + const char *CliCommandExperience::Usage() const + { + return kExperienceUsage; + } + + const char *CliCommandExperience::Description() const + { + return "Grant or remove experience (server-side implementation)."; + } + + bool CliCommandExperience::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() < 2 || line.tokens.size() > 3) + { + engine->LogWarn(std::string("Usage: ") + kExperienceUsage); + return false; + } + + ExperienceAmount amount; + if (!TryParseExperienceAmount(line.tokens[1], &amount)) + { + engine->LogWarn(std::string("Usage: ") + kExperienceUsage); + return false; + } + + std::shared_ptr target = ResolveTargetPlayer(line, engine); + if (target == nullptr) + { + if (line.tokens.size() >= 3) + { + engine->LogWarn("Unknown player: " + line.tokens[2]); + } + else + { + engine->LogWarn(std::string("Usage: ") + kExperienceUsageWithPlayer); + } + return false; + } + + if (amount.levels) + { + target->giveExperienceLevels(amount.take ? -amount.amount : amount.amount); + if (amount.take) + { + engine->LogInfo("Removed " + std::to_string(amount.amount) + " level(s) from " + StringUtils::WideToUtf8(target->getName()) + "."); + } + else + { + engine->LogInfo("Added " + std::to_string(amount.amount) + " level(s) to " + StringUtils::WideToUtf8(target->getName()) + "."); + } + return true; + } + + if (amount.take) + { + engine->LogWarn("Removing raw experience points is not supported. Use negative levels (example: xp -5L )."); + return false; + } + + target->increaseXp(amount.amount); + engine->LogInfo("Added " + std::to_string(amount.amount) + " experience points to " + StringUtils::WideToUtf8(target->getName()) + "."); + return true; + } + + void CliCommandExperience::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + if (context.currentTokenIndex == 1) + { + if (StringUtils::StartsWithIgnoreCase("10", context.prefix)) + { + out->push_back(context.linePrefix + "10"); + } + if (StringUtils::StartsWithIgnoreCase("10L", context.prefix)) + { + out->push_back(context.linePrefix + "10L"); + } + if (StringUtils::StartsWithIgnoreCase("-5L", context.prefix)) + { + out->push_back(context.linePrefix + "-5L"); + } + } + else if (context.currentTokenIndex == 2) + { + engine->SuggestPlayers(context.prefix, context.linePrefix, out); + } + } +} diff --git a/Minecraft.Server/Console/commands/experience/CliCommandExperience.h b/Minecraft.Server/Console/commands/experience/CliCommandExperience.h new file mode 100644 index 00000000..3fddb218 --- /dev/null +++ b/Minecraft.Server/Console/commands/experience/CliCommandExperience.h @@ -0,0 +1,17 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandExperience : public IServerCliCommand + { + public: + const char *Name() const override; + std::vector Aliases() const override; + const char *Usage() const override; + const char *Description() const override; + bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) override; + void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const override; + }; +} diff --git a/Minecraft.Server/Console/commands/gamemode/CliCommandGamemode.cpp b/Minecraft.Server/Console/commands/gamemode/CliCommandGamemode.cpp new file mode 100644 index 00000000..f41660e6 --- /dev/null +++ b/Minecraft.Server/Console/commands/gamemode/CliCommandGamemode.cpp @@ -0,0 +1,109 @@ +#include "stdafx.h" + +#include "CliCommandGamemode.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\..\Minecraft.Client\MinecraftServer.h" +#include "..\..\..\..\Minecraft.Client\PlayerList.h" +#include "..\..\..\..\Minecraft.Client\ServerPlayer.h" + +namespace ServerRuntime +{ + namespace + { + constexpr const char *kGamemodeUsage = "gamemode [player]"; + constexpr const char *kGamemodeUsageWithPlayer = "gamemode "; + } + + const char *CliCommandGamemode::Name() const + { + return "gamemode"; + } + + std::vector CliCommandGamemode::Aliases() const + { + return { "gm" }; + } + + const char *CliCommandGamemode::Usage() const + { + return kGamemodeUsage; + } + + const char *CliCommandGamemode::Description() const + { + return "Set a player's game mode."; + } + + bool CliCommandGamemode::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() < 2 || line.tokens.size() > 3) + { + engine->LogWarn(std::string("Usage: ") + kGamemodeUsage); + return false; + } + + GameType *mode = engine->ParseGamemode(line.tokens[1]); + if (mode == nullptr) + { + engine->LogWarn("Unknown gamemode: " + line.tokens[1]); + return false; + } + + std::shared_ptr target = nullptr; + if (line.tokens.size() >= 3) + { + target = engine->FindPlayerByNameUtf8(line.tokens[2]); + if (target == nullptr) + { + engine->LogWarn("Unknown player: " + line.tokens[2]); + return false; + } + } + else + { + MinecraftServer *server = MinecraftServer::getInstance(); + if (server == nullptr || server->getPlayers() == nullptr) + { + engine->LogWarn("Player list is not available."); + return false; + } + + PlayerList *players = server->getPlayers(); + if (players->players.size() != 1 || players->players[0] == nullptr) + { + engine->LogWarn(std::string("Usage: ") + kGamemodeUsageWithPlayer); + return false; + } + target = players->players[0]; + } + + target->setGameMode(mode); + target->fallDistance = 0.0f; + + if (line.tokens.size() >= 3) + { + engine->LogInfo("Set " + line.tokens[2] + " gamemode to " + line.tokens[1] + "."); + } + else + { + engine->LogInfo("Set gamemode to " + line.tokens[1] + "."); + } + return true; + } + + void CliCommandGamemode::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + if (context.currentTokenIndex == 1) + { + engine->SuggestGamemodes(context.prefix, context.linePrefix, out); + } + else if (context.currentTokenIndex == 2) + { + engine->SuggestPlayers(context.prefix, context.linePrefix, out); + } + } +} + + diff --git a/Minecraft.Server/Console/commands/gamemode/CliCommandGamemode.h b/Minecraft.Server/Console/commands/gamemode/CliCommandGamemode.h new file mode 100644 index 00000000..527bb1f9 --- /dev/null +++ b/Minecraft.Server/Console/commands/gamemode/CliCommandGamemode.h @@ -0,0 +1,18 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandGamemode : public IServerCliCommand + { + public: + const char *Name() const override; + std::vector Aliases() const override; + const char *Usage() const override; + const char *Description() const override; + bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) override; + void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const override; + }; +} + diff --git a/Minecraft.Server/Console/commands/give/CliCommandGive.cpp b/Minecraft.Server/Console/commands/give/CliCommandGive.cpp new file mode 100644 index 00000000..20c09497 --- /dev/null +++ b/Minecraft.Server/Console/commands/give/CliCommandGive.cpp @@ -0,0 +1,103 @@ +#include "stdafx.h" + +#include "CliCommandGive.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\CommandParsing.h" +#include "..\..\..\..\Minecraft.World\GameCommandPacket.h" +#include "..\..\..\..\Minecraft.World\GiveItemCommand.h" +#include "..\..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\..\..\Minecraft.Client\ServerPlayer.h" + +namespace ServerRuntime +{ + namespace + { + constexpr const char *kGiveUsage = "give [amount] [aux]"; + } + + const char *CliCommandGive::Name() const + { + return "give"; + } + + const char *CliCommandGive::Usage() const + { + return kGiveUsage; + } + + const char *CliCommandGive::Description() const + { + return "Give an item via Minecraft.World command dispatcher."; + } + + bool CliCommandGive::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() < 3 || line.tokens.size() > 5) + { + engine->LogWarn(std::string("Usage: ") + kGiveUsage); + return false; + } + + std::shared_ptr target = engine->FindPlayerByNameUtf8(line.tokens[1]); + if (target == nullptr) + { + engine->LogWarn("Unknown player: " + line.tokens[1]); + return false; + } + + int itemId = 0; + int amount = 1; + int aux = 0; + if (!CommandParsing::TryParseInt(line.tokens[2], &itemId)) + { + engine->LogWarn("Invalid item id: " + line.tokens[2]); + return false; + } + if (itemId <= 0) + { + engine->LogWarn("Item id must be greater than 0."); + return false; + } + if (line.tokens.size() >= 4 && !CommandParsing::TryParseInt(line.tokens[3], &amount)) + { + engine->LogWarn("Invalid amount: " + line.tokens[3]); + return false; + } + if (line.tokens.size() >= 5 && !CommandParsing::TryParseInt(line.tokens[4], &aux)) + { + engine->LogWarn("Invalid aux value: " + line.tokens[4]); + return false; + } + if (amount <= 0) + { + engine->LogWarn("Amount must be greater than 0."); + return false; + } + + std::shared_ptr player = std::dynamic_pointer_cast(target); + if (player == nullptr) + { + engine->LogWarn("Cannot resolve target player entity."); + return false; + } + + std::shared_ptr packet = GiveItemCommand::preparePacket(player, itemId, amount, aux); + if (packet == nullptr) + { + engine->LogError("Failed to build give command packet."); + return false; + } + + return engine->DispatchWorldCommand(packet->command, packet->data); + } + + void CliCommandGive::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + if (context.currentTokenIndex == 1) + { + engine->SuggestPlayers(context.prefix, context.linePrefix, out); + } + } +} diff --git a/Minecraft.Server/Console/commands/give/CliCommandGive.h b/Minecraft.Server/Console/commands/give/CliCommandGive.h new file mode 100644 index 00000000..7c21d997 --- /dev/null +++ b/Minecraft.Server/Console/commands/give/CliCommandGive.h @@ -0,0 +1,16 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandGive : public IServerCliCommand + { + public: + const char *Name() const override; + const char *Usage() const override; + const char *Description() const override; + bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) override; + void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const override; + }; +} diff --git a/Minecraft.Server/Console/commands/help/CliCommandHelp.cpp b/Minecraft.Server/Console/commands/help/CliCommandHelp.cpp new file mode 100644 index 00000000..d4106a9c --- /dev/null +++ b/Minecraft.Server/Console/commands/help/CliCommandHelp.cpp @@ -0,0 +1,46 @@ +#include "stdafx.h" + +#include "CliCommandHelp.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliRegistry.h" + +namespace ServerRuntime +{ + const char *CliCommandHelp::Name() const + { + return "help"; + } + + std::vector CliCommandHelp::Aliases() const + { + return { "?" }; + } + + const char *CliCommandHelp::Usage() const + { + return "help"; + } + + const char *CliCommandHelp::Description() const + { + return "Show available server console commands."; + } + + bool CliCommandHelp::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + (void)line; + const std::vector> &commands = engine->Registry().Commands(); + engine->LogInfo("Available commands:"); + for (size_t i = 0; i < commands.size(); ++i) + { + std::string row = " "; + row += commands[i]->Usage(); + row += " - "; + row += commands[i]->Description(); + engine->LogInfo(row); + } + return true; + } +} + diff --git a/Minecraft.Server/Console/commands/help/CliCommandHelp.h b/Minecraft.Server/Console/commands/help/CliCommandHelp.h new file mode 100644 index 00000000..3612442f --- /dev/null +++ b/Minecraft.Server/Console/commands/help/CliCommandHelp.h @@ -0,0 +1,17 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandHelp : public IServerCliCommand + { + public: + virtual const char *Name() const; + virtual std::vector Aliases() const; + virtual const char *Usage() const; + virtual const char *Description() const; + virtual bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine); + }; +} + diff --git a/Minecraft.Server/Console/commands/kill/CliCommandKill.cpp b/Minecraft.Server/Console/commands/kill/CliCommandKill.cpp new file mode 100644 index 00000000..04b2c419 --- /dev/null +++ b/Minecraft.Server/Console/commands/kill/CliCommandKill.cpp @@ -0,0 +1,64 @@ +#include "stdafx.h" + +#include "CliCommandKill.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\..\Minecraft.World\CommandSender.h" +#include "..\..\..\..\Minecraft.Client\ServerPlayer.h" + +namespace ServerRuntime +{ + namespace + { + constexpr const char *kKillUsage = "kill "; + } + + const char *CliCommandKill::Name() const + { + return "kill"; + } + + const char *CliCommandKill::Usage() const + { + return kKillUsage; + } + + const char *CliCommandKill::Description() const + { + return "Kill a player via Minecraft.World command dispatcher."; + } + + bool CliCommandKill::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() != 2) + { + engine->LogWarn(std::string("Usage: ") + kKillUsage); + return false; + } + + std::shared_ptr target = engine->FindPlayerByNameUtf8(line.tokens[1]); + if (target == nullptr) + { + engine->LogWarn("Unknown player: " + line.tokens[1]); + return false; + } + + std::shared_ptr sender = std::dynamic_pointer_cast(target); + if (sender == nullptr) + { + engine->LogWarn("Cannot resolve target command sender."); + return false; + } + + return engine->DispatchWorldCommand(eGameCommand_Kill, byteArray(), sender); + } + + void CliCommandKill::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + if (context.currentTokenIndex == 1) + { + engine->SuggestPlayers(context.prefix, context.linePrefix, out); + } + } +} diff --git a/Minecraft.Server/Console/commands/kill/CliCommandKill.h b/Minecraft.Server/Console/commands/kill/CliCommandKill.h new file mode 100644 index 00000000..e558fac0 --- /dev/null +++ b/Minecraft.Server/Console/commands/kill/CliCommandKill.h @@ -0,0 +1,16 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandKill : public IServerCliCommand + { + public: + const char *Name() const override; + const char *Usage() const override; + const char *Description() const override; + bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) override; + void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const override; + }; +} diff --git a/Minecraft.Server/Console/commands/list/CliCommandList.cpp b/Minecraft.Server/Console/commands/list/CliCommandList.cpp new file mode 100644 index 00000000..a9c5a212 --- /dev/null +++ b/Minecraft.Server/Console/commands/list/CliCommandList.cpp @@ -0,0 +1,49 @@ +#include "stdafx.h" + +#include "CliCommandList.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\..\Common\StringUtils.h" +#include "..\..\..\..\Minecraft.Client\MinecraftServer.h" +#include "..\..\..\..\Minecraft.Client\PlayerList.h" + +namespace ServerRuntime +{ + const char *CliCommandList::Name() const + { + return "list"; + } + + const char *CliCommandList::Usage() const + { + return "list"; + } + + const char *CliCommandList::Description() const + { + return "List connected players."; + } + + bool CliCommandList::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + (void)line; + MinecraftServer *server = MinecraftServer::getInstance(); + if (server == NULL || server->getPlayers() == NULL) + { + engine->LogWarn("Player list is not available."); + return false; + } + + PlayerList *players = server->getPlayers(); + std::string names = StringUtils::WideToUtf8(players->getPlayerNames()); + if (names.empty()) + { + names = "(none)"; + } + + engine->LogInfo("Players (" + std::to_string(players->getPlayerCount()) + "): " + names); + return true; + } +} + + diff --git a/Minecraft.Server/Console/commands/list/CliCommandList.h b/Minecraft.Server/Console/commands/list/CliCommandList.h new file mode 100644 index 00000000..ad26dcbc --- /dev/null +++ b/Minecraft.Server/Console/commands/list/CliCommandList.h @@ -0,0 +1,16 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandList : public IServerCliCommand + { + public: + virtual const char *Name() const; + virtual const char *Usage() const; + virtual const char *Description() const; + virtual bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine); + }; +} + diff --git a/Minecraft.Server/Console/commands/pardon-ip/CliCommandPardonIp.cpp b/Minecraft.Server/Console/commands/pardon-ip/CliCommandPardonIp.cpp new file mode 100644 index 00000000..3517dbd8 --- /dev/null +++ b/Minecraft.Server/Console/commands/pardon-ip/CliCommandPardonIp.cpp @@ -0,0 +1,98 @@ +#include "stdafx.h" + +#include "CliCommandPardonIp.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\Access\Access.h" +#include "..\..\..\Common\NetworkUtils.h" +#include "..\..\..\Common\StringUtils.h" + +namespace ServerRuntime +{ + const char *CliCommandPardonIp::Name() const + { + return "pardon-ip"; + } + + const char *CliCommandPardonIp::Usage() const + { + return "pardon-ip
"; + } + + const char *CliCommandPardonIp::Description() const + { + return "Remove an IP ban."; + } + + /** + * Validates the literal IP argument and removes the matching Access IP ban entry + * リテラルIPを検証して一致するIP BANを解除する + */ + bool CliCommandPardonIp::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() != 2) + { + engine->LogWarn("Usage: pardon-ip
"); + return false; + } + if (!ServerRuntime::Access::IsInitialized()) + { + engine->LogWarn("Access manager is not initialized."); + return false; + } + + // Java Edition pardon-ip only operates on a literal address, so do not resolve player names here. + const std::string ip = StringUtils::TrimAscii(line.tokens[1]); + if (!NetworkUtils::IsIpLiteral(ip)) + { + engine->LogWarn("Invalid IP address: " + line.tokens[1]); + return false; + } + // Distinguish invalid input from a valid but currently unbanned address for clearer operator feedback. + if (!ServerRuntime::Access::IsIpBanned(ip)) + { + engine->LogWarn("That IP address is not banned."); + return false; + } + if (!ServerRuntime::Access::RemoveIpBan(ip)) + { + engine->LogError("Failed to remove IP ban."); + return false; + } + + engine->LogInfo("Unbanned IP address " + ip + "."); + return true; + } + + /** + * Suggests currently banned IP addresses for the Java Edition literal-IP argument + * BAN済みIPの補完候補を返す + */ + void CliCommandPardonIp::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + (void)engine; + // Complete from the persisted IP-ban snapshot because this command only accepts already-banned literals. + if (context.currentTokenIndex != 1 || out == nullptr) + { + return; + } + + std::vector entries; + if (!ServerRuntime::Access::SnapshotBannedIps(&entries)) + { + return; + } + + // Reuse the normalized prefix match used by other commands so completion stays case-insensitive. + for (const auto &entry : entries) + { + const std::string &candidate = entry.ip; + if (StringUtils::StartsWithIgnoreCase(candidate, context.prefix)) + { + out->push_back(context.linePrefix + candidate); + } + } + } +} + diff --git a/Minecraft.Server/Console/commands/pardon-ip/CliCommandPardonIp.h b/Minecraft.Server/Console/commands/pardon-ip/CliCommandPardonIp.h new file mode 100644 index 00000000..96f4c7fc --- /dev/null +++ b/Minecraft.Server/Console/commands/pardon-ip/CliCommandPardonIp.h @@ -0,0 +1,19 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + /** + * Removes a dedicated-server IP ban using Java Edition style syntax and Access-backed persistence + */ + class CliCommandPardonIp : public IServerCliCommand + { + public: + virtual const char *Name() const; + virtual const char *Usage() const; + virtual const char *Description() const; + virtual bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine); + virtual void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const; + }; +} diff --git a/Minecraft.Server/Console/commands/pardon/CliCommandPardon.cpp b/Minecraft.Server/Console/commands/pardon/CliCommandPardon.cpp new file mode 100644 index 00000000..d1e995e9 --- /dev/null +++ b/Minecraft.Server/Console/commands/pardon/CliCommandPardon.cpp @@ -0,0 +1,173 @@ +#include "stdafx.h" + +#include "CliCommandPardon.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\Access\Access.h" +#include "..\..\..\Common\StringUtils.h" +#include "..\..\..\..\Minecraft.Client\ServerPlayer.h" + +#include + +namespace ServerRuntime +{ + namespace + { + static void AppendUniqueText(const std::string &text, std::vector *out) + { + if (out == nullptr || text.empty()) + { + return; + } + + if (std::find(out->begin(), out->end(), text) == out->end()) + { + out->push_back(text); + } + } + + static void AppendUniqueXuid(PlayerUID xuid, std::vector *out) + { + if (out == nullptr || xuid == INVALID_XUID) + { + return; + } + + if (std::find(out->begin(), out->end(), xuid) == out->end()) + { + out->push_back(xuid); + } + } + } + + const char *CliCommandPardon::Name() const + { + return "pardon"; + } + + const char *CliCommandPardon::Usage() const + { + return "pardon "; + } + + const char *CliCommandPardon::Description() const + { + return "Remove a player ban."; + } + + /** + * Removes every Access ban entry that matches the requested player name so dual-XUID entries are cleared together + * 名前に一致するBANをまとめて解除する + */ + bool CliCommandPardon::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() != 2) + { + engine->LogWarn("Usage: pardon "); + return false; + } + if (!ServerRuntime::Access::IsInitialized()) + { + engine->LogWarn("Access manager is not initialized."); + return false; + } + + std::vector xuidsToRemove; + std::vector matchedNames; + std::shared_ptr onlineTarget = engine->FindPlayerByNameUtf8(line.tokens[1]); + if (onlineTarget != nullptr) + { + if (ServerRuntime::Access::IsPlayerBanned(onlineTarget->getXuid())) + { + AppendUniqueXuid(onlineTarget->getXuid(), &xuidsToRemove); + } + if (ServerRuntime::Access::IsPlayerBanned(onlineTarget->getOnlineXuid())) + { + AppendUniqueXuid(onlineTarget->getOnlineXuid(), &xuidsToRemove); + } + } + + std::vector entries; + if (!ServerRuntime::Access::SnapshotBannedPlayers(&entries)) + { + engine->LogError("Failed to read banned players."); + return false; + } + + const std::string loweredTarget = StringUtils::ToLowerAscii(line.tokens[1]); + for (const auto &entry : entries) + { + if (StringUtils::ToLowerAscii(entry.name) == loweredTarget) + { + PlayerUID parsedXuid = INVALID_XUID; + if (ServerRuntime::Access::TryParseXuid(entry.xuid, &parsedXuid)) + { + AppendUniqueXuid(parsedXuid, &xuidsToRemove); + } + AppendUniqueText(entry.name, &matchedNames); + } + } + + if (xuidsToRemove.empty()) + { + engine->LogWarn("That player is not banned."); + return false; + } + + for (const auto xuid : xuidsToRemove) + { + if (!ServerRuntime::Access::RemovePlayerBan(xuid)) + { + engine->LogError("Failed to remove player ban."); + return false; + } + } + + std::string playerName = line.tokens[1]; + if (!matchedNames.empty()) + { + playerName = matchedNames[0]; + } + else if (onlineTarget != nullptr) + { + playerName = StringUtils::WideToUtf8(onlineTarget->getName()); + } + + engine->LogInfo("Unbanned player " + playerName + "."); + return true; + } + + /** + * Suggests currently banned player names first and then online names for convenience + * BAN済み名とオンライン名を補完候補に出す + */ + void CliCommandPardon::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + if (context.currentTokenIndex != 1 || out == nullptr) + { + return; + } + + std::vector entries; + if (ServerRuntime::Access::SnapshotBannedPlayers(&entries)) + { + std::vector names; + for (const auto &entry : entries) + { + AppendUniqueText(entry.name, &names); + } + + for (const auto &name : names) + { + if (StringUtils::StartsWithIgnoreCase(name, context.prefix)) + { + out->push_back(context.linePrefix + name); + } + } + } + + engine->SuggestPlayers(context.prefix, context.linePrefix, out); + } +} + diff --git a/Minecraft.Server/Console/commands/pardon/CliCommandPardon.h b/Minecraft.Server/Console/commands/pardon/CliCommandPardon.h new file mode 100644 index 00000000..a171d428 --- /dev/null +++ b/Minecraft.Server/Console/commands/pardon/CliCommandPardon.h @@ -0,0 +1,19 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + /** + * Removes dedicated-server player bans using Java Edition style syntax and Access-backed persistence + */ + class CliCommandPardon : public IServerCliCommand + { + public: + virtual const char *Name() const; + virtual const char *Usage() const; + virtual const char *Description() const; + virtual bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine); + virtual void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const; + }; +} diff --git a/Minecraft.Server/Console/commands/stop/CliCommandStop.cpp b/Minecraft.Server/Console/commands/stop/CliCommandStop.cpp new file mode 100644 index 00000000..29e42cd9 --- /dev/null +++ b/Minecraft.Server/Console/commands/stop/CliCommandStop.cpp @@ -0,0 +1,32 @@ +#include "stdafx.h" + +#include "CliCommandStop.h" + +#include "..\..\ServerCliEngine.h" + +namespace ServerRuntime +{ + const char *CliCommandStop::Name() const + { + return "stop"; + } + + const char *CliCommandStop::Usage() const + { + return "stop"; + } + + const char *CliCommandStop::Description() const + { + return "Stop the dedicated server."; + } + + bool CliCommandStop::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + (void)line; + engine->LogInfo("Stopping server..."); + engine->RequestShutdown(); + return true; + } +} + diff --git a/Minecraft.Server/Console/commands/stop/CliCommandStop.h b/Minecraft.Server/Console/commands/stop/CliCommandStop.h new file mode 100644 index 00000000..2297c673 --- /dev/null +++ b/Minecraft.Server/Console/commands/stop/CliCommandStop.h @@ -0,0 +1,16 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandStop : public IServerCliCommand + { + public: + virtual const char *Name() const; + virtual const char *Usage() const; + virtual const char *Description() const; + virtual bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine); + }; +} + diff --git a/Minecraft.Server/Console/commands/time/CliCommandTime.cpp b/Minecraft.Server/Console/commands/time/CliCommandTime.cpp new file mode 100644 index 00000000..d274993c --- /dev/null +++ b/Minecraft.Server/Console/commands/time/CliCommandTime.cpp @@ -0,0 +1,118 @@ +#include "stdafx.h" + +#include "CliCommandTime.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\Common\StringUtils.h" +#include "..\..\..\..\Minecraft.World\GameCommandPacket.h" +#include "..\..\..\..\Minecraft.World\TimeCommand.h" + +namespace ServerRuntime +{ + namespace + { + constexpr const char *kTimeUsage = "time "; + + static bool TryResolveNightFlag(const std::vector &tokens, bool *outNight) + { + if (outNight == nullptr) + { + return false; + } + + std::string value; + if (tokens.size() == 2) + { + value = StringUtils::ToLowerAscii(tokens[1]); + } + else if (tokens.size() == 3 && StringUtils::ToLowerAscii(tokens[1]) == "set") + { + value = StringUtils::ToLowerAscii(tokens[2]); + } + else + { + return false; + } + + if (value == "day") + { + *outNight = false; + return true; + } + if (value == "night") + { + *outNight = true; + return true; + } + + return false; + } + + static void SuggestLiteral(const char *candidate, const ServerCliCompletionContext &context, std::vector *out) + { + if (candidate == nullptr || out == nullptr) + { + return; + } + + const std::string text(candidate); + if (StringUtils::StartsWithIgnoreCase(text, context.prefix)) + { + out->push_back(context.linePrefix + text); + } + } + } + + const char *CliCommandTime::Name() const + { + return "time"; + } + + const char *CliCommandTime::Usage() const + { + return kTimeUsage; + } + + const char *CliCommandTime::Description() const + { + return "Set day or night via Minecraft.World command dispatcher."; + } + + bool CliCommandTime::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + bool night = false; + if (!TryResolveNightFlag(line.tokens, &night)) + { + engine->LogWarn(std::string("Usage: ") + kTimeUsage); + return false; + } + + std::shared_ptr packet = TimeCommand::preparePacket(night); + if (packet == nullptr) + { + engine->LogError("Failed to build time command packet."); + return false; + } + + return engine->DispatchWorldCommand(packet->command, packet->data); + } + + void CliCommandTime::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + (void)engine; + if (context.currentTokenIndex == 1) + { + SuggestLiteral("day", context, out); + SuggestLiteral("night", context, out); + SuggestLiteral("set", context, out); + } + else if (context.currentTokenIndex == 2 && + context.parsed.tokens.size() >= 2 && + StringUtils::ToLowerAscii(context.parsed.tokens[1]) == "set") + { + SuggestLiteral("day", context, out); + SuggestLiteral("night", context, out); + } + } +} diff --git a/Minecraft.Server/Console/commands/time/CliCommandTime.h b/Minecraft.Server/Console/commands/time/CliCommandTime.h new file mode 100644 index 00000000..28cf5e5a --- /dev/null +++ b/Minecraft.Server/Console/commands/time/CliCommandTime.h @@ -0,0 +1,16 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandTime : public IServerCliCommand + { + public: + const char *Name() const override; + const char *Usage() const override; + const char *Description() const override; + bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) override; + void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const override; + }; +} diff --git a/Minecraft.Server/Console/commands/tp/CliCommandTp.cpp b/Minecraft.Server/Console/commands/tp/CliCommandTp.cpp new file mode 100644 index 00000000..45dbb284 --- /dev/null +++ b/Minecraft.Server/Console/commands/tp/CliCommandTp.cpp @@ -0,0 +1,82 @@ +#include "stdafx.h" + +#include "CliCommandTp.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\..\Minecraft.Client\PlayerConnection.h" +#include "..\..\..\..\Minecraft.Client\TeleportCommand.h" +#include "..\..\..\..\Minecraft.Client\ServerPlayer.h" +#include "..\..\..\..\Minecraft.World\GameCommandPacket.h" + +namespace ServerRuntime +{ + namespace + { + constexpr const char *kTpUsage = "tp "; + } + + const char *CliCommandTp::Name() const + { + return "tp"; + } + + std::vector CliCommandTp::Aliases() const + { + return { "teleport" }; + } + + const char *CliCommandTp::Usage() const + { + return kTpUsage; + } + + const char *CliCommandTp::Description() const + { + return "Teleport one player to another via Minecraft.World command dispatcher."; + } + + bool CliCommandTp::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() != 3) + { + engine->LogWarn(std::string("Usage: ") + kTpUsage); + return false; + } + + std::shared_ptr subject = engine->FindPlayerByNameUtf8(line.tokens[1]); + std::shared_ptr destination = engine->FindPlayerByNameUtf8(line.tokens[2]); + if (subject == nullptr) + { + engine->LogWarn("Unknown player: " + line.tokens[1]); + return false; + } + if (destination == nullptr) + { + engine->LogWarn("Unknown player: " + line.tokens[2]); + return false; + } + if (subject->connection == nullptr) + { + engine->LogWarn("Cannot teleport because source player connection is inactive."); + return false; + } + std::shared_ptr packet = TeleportCommand::preparePacket(subject->getXuid(), destination->getXuid()); + if (packet == nullptr) + { + engine->LogError("Failed to build teleport command packet."); + return false; + } + + return engine->DispatchWorldCommand(packet->command, packet->data); + } + + void CliCommandTp::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + if (context.currentTokenIndex == 1 || context.currentTokenIndex == 2) + { + engine->SuggestPlayers(context.prefix, context.linePrefix, out); + } + } +} + diff --git a/Minecraft.Server/Console/commands/tp/CliCommandTp.h b/Minecraft.Server/Console/commands/tp/CliCommandTp.h new file mode 100644 index 00000000..6e9ffdd7 --- /dev/null +++ b/Minecraft.Server/Console/commands/tp/CliCommandTp.h @@ -0,0 +1,18 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandTp : public IServerCliCommand + { + public: + const char *Name() const override; + std::vector Aliases() const override; + const char *Usage() const override; + const char *Description() const override; + bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) override; + void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const override; + }; +} + diff --git a/Minecraft.Server/Console/commands/weather/CliCommandWeather.cpp b/Minecraft.Server/Console/commands/weather/CliCommandWeather.cpp new file mode 100644 index 00000000..e7f01954 --- /dev/null +++ b/Minecraft.Server/Console/commands/weather/CliCommandWeather.cpp @@ -0,0 +1,49 @@ +#include "stdafx.h" + +#include "CliCommandWeather.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\..\Minecraft.World\GameCommandPacket.h" +#include "..\..\..\..\Minecraft.World\ToggleDownfallCommand.h" + +namespace ServerRuntime +{ + namespace + { + constexpr const char *kWeatherUsage = "weather"; + } + + const char *CliCommandWeather::Name() const + { + return "weather"; + } + + const char *CliCommandWeather::Usage() const + { + return kWeatherUsage; + } + + const char *CliCommandWeather::Description() const + { + return "Toggle weather via Minecraft.World command dispatcher."; + } + + bool CliCommandWeather::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() != 1) + { + engine->LogWarn(std::string("Usage: ") + kWeatherUsage); + return false; + } + + std::shared_ptr packet = ToggleDownfallCommand::preparePacket(); + if (packet == nullptr) + { + engine->LogError("Failed to build weather command packet."); + return false; + } + + return engine->DispatchWorldCommand(packet->command, packet->data); + } +} diff --git a/Minecraft.Server/Console/commands/weather/CliCommandWeather.h b/Minecraft.Server/Console/commands/weather/CliCommandWeather.h new file mode 100644 index 00000000..03498b47 --- /dev/null +++ b/Minecraft.Server/Console/commands/weather/CliCommandWeather.h @@ -0,0 +1,15 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandWeather : public IServerCliCommand + { + public: + const char *Name() const override; + const char *Usage() const override; + const char *Description() const override; + bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) override; + }; +} diff --git a/Minecraft.Server/Console/commands/whitelist/CliCommandWhitelist.cpp b/Minecraft.Server/Console/commands/whitelist/CliCommandWhitelist.cpp new file mode 100644 index 00000000..03724278 --- /dev/null +++ b/Minecraft.Server/Console/commands/whitelist/CliCommandWhitelist.cpp @@ -0,0 +1,285 @@ +#include "stdafx.h" + +#include "CliCommandWhitelist.h" + +#include "..\..\ServerCliEngine.h" +#include "..\..\ServerCliParser.h" +#include "..\..\..\Access\Access.h" +#include "..\..\..\Common\StringUtils.h" +#include "..\..\..\ServerProperties.h" + +#include +#include + +namespace ServerRuntime +{ + namespace + { + static const char *kWhitelistUsage = "whitelist [...]"; + + static bool CompareWhitelistEntries(const ServerRuntime::Access::WhitelistedPlayerEntry &left, const ServerRuntime::Access::WhitelistedPlayerEntry &right) + { + const auto leftName = StringUtils::ToLowerAscii(left.name); + const auto rightName = StringUtils::ToLowerAscii(right.name); + if (leftName != rightName) + { + return leftName < rightName; + } + + return StringUtils::ToLowerAscii(left.xuid) < StringUtils::ToLowerAscii(right.xuid); + } + + static bool PersistWhitelistToggle(bool enabled) + { + auto config = LoadServerPropertiesConfig(); + config.whiteListEnabled = enabled; + return SaveServerPropertiesConfig(config); + } + + static std::string BuildWhitelistEntryRow(const ServerRuntime::Access::WhitelistedPlayerEntry &entry) + { + std::string row = " "; + row += entry.xuid; + if (!entry.name.empty()) + { + row += " - "; + row += entry.name; + } + return row; + } + + static void LogWhitelistMode(ServerCliEngine *engine) + { + engine->LogInfo(std::string("Whitelist is ") + (ServerRuntime::Access::IsWhitelistEnabled() ? "enabled." : "disabled.")); + } + + static bool LogWhitelistEntries(ServerCliEngine *engine) + { + std::vector entries; + if (!ServerRuntime::Access::SnapshotWhitelistedPlayers(&entries)) + { + engine->LogError("Failed to read whitelist entries."); + return false; + } + + std::sort(entries.begin(), entries.end(), CompareWhitelistEntries); + LogWhitelistMode(engine); + engine->LogInfo("There are " + std::to_string(entries.size()) + " whitelisted player(s)."); + for (const auto &entry : entries) + { + engine->LogInfo(BuildWhitelistEntryRow(entry)); + } + return true; + } + + static bool TryParseWhitelistXuid(const std::string &text, ServerCliEngine *engine, PlayerUID *outXuid) + { + if (ServerRuntime::Access::TryParseXuid(text, outXuid)) + { + return true; + } + + engine->LogWarn("Invalid XUID: " + text); + return false; + } + + static void SuggestLiteral(const std::string &candidate, const ServerCliCompletionContext &context, std::vector *out) + { + if (out == nullptr) + { + return; + } + + if (StringUtils::StartsWithIgnoreCase(candidate, context.prefix)) + { + out->push_back(context.linePrefix + candidate); + } + } + } + + const char *CliCommandWhitelist::Name() const + { + return "whitelist"; + } + + const char *CliCommandWhitelist::Usage() const + { + return kWhitelistUsage; + } + + const char *CliCommandWhitelist::Description() const + { + return "Manage the dedicated-server XUID whitelist."; + } + + bool CliCommandWhitelist::Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) + { + if (line.tokens.size() < 2) + { + engine->LogWarn(std::string("Usage: ") + kWhitelistUsage); + return false; + } + if (!ServerRuntime::Access::IsInitialized()) + { + engine->LogWarn("Access manager is not initialized."); + return false; + } + + const auto subcommand = StringUtils::ToLowerAscii(line.tokens[1]); + if (subcommand == "on" || subcommand == "off") + { + if (line.tokens.size() != 2) + { + engine->LogWarn("Usage: whitelist "); + return false; + } + + const bool enabled = (subcommand == "on"); + if (!PersistWhitelistToggle(enabled)) + { + engine->LogError("Failed to persist whitelist mode to server.properties."); + return false; + } + + ServerRuntime::Access::SetWhitelistEnabled(enabled); + engine->LogInfo(std::string("Whitelist ") + (enabled ? "enabled." : "disabled.")); + return true; + } + + if (subcommand == "list") + { + if (line.tokens.size() != 2) + { + engine->LogWarn("Usage: whitelist list"); + return false; + } + + return LogWhitelistEntries(engine); + } + + if (subcommand == "reload") + { + if (line.tokens.size() != 2) + { + engine->LogWarn("Usage: whitelist reload"); + return false; + } + if (!ServerRuntime::Access::ReloadWhitelist()) + { + engine->LogError("Failed to reload whitelist."); + return false; + } + + const auto config = LoadServerPropertiesConfig(); + ServerRuntime::Access::SetWhitelistEnabled(config.whiteListEnabled); + engine->LogInfo("Reloaded whitelist from disk."); + LogWhitelistMode(engine); + return true; + } + + if (subcommand == "add") + { + if (line.tokens.size() < 3) + { + engine->LogWarn("Usage: whitelist add [name ...]"); + return false; + } + + PlayerUID xuid = INVALID_XUID; + if (!TryParseWhitelistXuid(line.tokens[2], engine, &xuid)) + { + return false; + } + + if (ServerRuntime::Access::IsPlayerWhitelisted(xuid)) + { + engine->LogWarn("That XUID is already whitelisted."); + return false; + } + + const auto metadata = ServerRuntime::Access::WhitelistManager::BuildDefaultMetadata("Console"); + const auto name = StringUtils::JoinTokens(line.tokens, 3); + if (!ServerRuntime::Access::AddWhitelistedPlayer(xuid, name, metadata)) + { + engine->LogError("Failed to write whitelist entry."); + return false; + } + + std::string message = "Whitelisted XUID " + ServerRuntime::Access::FormatXuid(xuid) + "."; + if (!name.empty()) + { + message += " Name: " + name; + } + engine->LogInfo(message); + return true; + } + + if (subcommand == "remove") + { + if (line.tokens.size() != 3) + { + engine->LogWarn("Usage: whitelist remove "); + return false; + } + + PlayerUID xuid = INVALID_XUID; + if (!TryParseWhitelistXuid(line.tokens[2], engine, &xuid)) + { + return false; + } + + if (!ServerRuntime::Access::IsPlayerWhitelisted(xuid)) + { + engine->LogWarn("That XUID is not whitelisted."); + return false; + } + + if (!ServerRuntime::Access::RemoveWhitelistedPlayer(xuid)) + { + engine->LogError("Failed to remove whitelist entry."); + return false; + } + + engine->LogInfo("Removed XUID " + ServerRuntime::Access::FormatXuid(xuid) + " from the whitelist."); + return true; + } + + engine->LogWarn(std::string("Usage: ") + kWhitelistUsage); + return false; + } + + void CliCommandWhitelist::Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const + { + (void)engine; + if (out == nullptr) + { + return; + } + + if (context.currentTokenIndex == 1) + { + SuggestLiteral("on", context, out); + SuggestLiteral("off", context, out); + SuggestLiteral("list", context, out); + SuggestLiteral("add", context, out); + SuggestLiteral("remove", context, out); + SuggestLiteral("reload", context, out); + return; + } + + if (context.currentTokenIndex == 2 && context.parsed.tokens.size() >= 2 && StringUtils::ToLowerAscii(context.parsed.tokens[1]) == "remove") + { + std::vector entries; + if (!ServerRuntime::Access::SnapshotWhitelistedPlayers(&entries)) + { + return; + } + + for (const auto &entry : entries) + { + SuggestLiteral(entry.xuid, context, out); + } + } + } +} + diff --git a/Minecraft.Server/Console/commands/whitelist/CliCommandWhitelist.h b/Minecraft.Server/Console/commands/whitelist/CliCommandWhitelist.h new file mode 100644 index 00000000..45e21a5e --- /dev/null +++ b/Minecraft.Server/Console/commands/whitelist/CliCommandWhitelist.h @@ -0,0 +1,17 @@ +#pragma once + +#include "..\IServerCliCommand.h" + +namespace ServerRuntime +{ + class CliCommandWhitelist : public IServerCliCommand + { + public: + const char *Name() const override; + const char *Usage() const override; + const char *Description() const override; + bool Execute(const ServerCliParsedLine &line, ServerCliEngine *engine) override; + void Complete(const ServerCliCompletionContext &context, const ServerCliEngine *engine, std::vector *out) const override; + }; +} + diff --git a/Minecraft.Server/ServerLogManager.cpp b/Minecraft.Server/ServerLogManager.cpp new file mode 100644 index 00000000..84805f7e --- /dev/null +++ b/Minecraft.Server/ServerLogManager.cpp @@ -0,0 +1,402 @@ +#include "stdafx.h" + +#include "ServerLogManager.h" + +#include "Common\StringUtils.h" +#include "ServerLogger.h" + +#include +#include + +extern bool g_Win64DedicatedServer; + +namespace ServerRuntime +{ + namespace ServerLogManager + { + namespace + { + /** + * **!! This information is managed solely for logging purposes, but it is questionable from a liability perspective, so it will eventually need to be separated !!** + * + * Tracks the remote IP and accepted player name associated with one `smallId` + * 1つのsmallIdに紐づく接続IPとプレイヤー名を保持する + */ + struct ConnectionLogEntry + { + std::string remoteIp; + std::string playerName; + }; + + /** + * Owns the shared connection cache used by hook points running on different threads + * 複数スレッドのhookから共有される接続キャッシュを保持する + */ + struct ServerLogState + { + std::mutex stateLock; + std::array entries; + }; + + ServerLogState g_serverLogState; + + static bool IsDedicatedServerLoggingEnabled() + { + return g_Win64DedicatedServer; + } + + static void ResetConnectionLogEntry(ConnectionLogEntry *entry) + { + if (entry == NULL) + { + return; + } + + entry->remoteIp.clear(); + entry->playerName.clear(); + } + + static std::string NormalizeRemoteIp(const char *ip) + { + if (ip == NULL || ip[0] == 0) + { + return std::string("unknown"); + } + + return std::string(ip); + } + + static std::string NormalizePlayerName(const std::wstring &playerName) + { + std::string playerNameUtf8 = StringUtils::WideToUtf8(playerName); + if (playerNameUtf8.empty()) + { + playerNameUtf8 = ""; + } + + return playerNameUtf8; + } + + // Default to the main app channel when the caller does not provide a source tag. + static const char *NormalizeClientLogSource(const char *source) + { + if (source == NULL || source[0] == 0) + { + return "app"; + } + + return source; + } + + static void EmitClientDebugLogLine(const char *source, const std::string &line) + { + if (line.empty()) + { + return; + } + + LogDebugf("client", "[%s] %s", NormalizeClientLogSource(source), line.c_str()); + } + + // Split one debug payload into individual lines so each line becomes a prompt-safe server log entry. + static void ForwardClientDebugMessage(const char *source, const char *message) + { + if (message == NULL || message[0] == 0) + { + return; + } + + const char *cursor = message; + while (*cursor != 0) + { + const char *lineStart = cursor; + while (*cursor != 0 && *cursor != '\r' && *cursor != '\n') + { + ++cursor; + } + + // Split multi-line client debug output into prompt-safe server log entries. + if (cursor > lineStart) + { + EmitClientDebugLogLine(source, std::string(lineStart, (size_t)(cursor - lineStart))); + } + + while (*cursor == '\r' || *cursor == '\n') + { + ++cursor; + } + } + } + + // Share the same formatting path for app, user, and legacy debug-spew forwards. + static void ForwardFormattedClientDebugLogV(const char *source, const char *format, va_list args) + { + if (!IsDedicatedServerLoggingEnabled() || format == NULL || format[0] == 0) + { + return; + } + + char messageBuffer[2048] = {}; + vsnprintf_s(messageBuffer, sizeof(messageBuffer), _TRUNCATE, format, args); + ForwardClientDebugMessage(source, messageBuffer); + } + + static const char *TcpRejectReasonToString(ETcpRejectReason reason) + { + switch (reason) + { + case eTcpRejectReason_BannedIp: return "banned-ip"; + case eTcpRejectReason_GameNotReady: return "game-not-ready"; + case eTcpRejectReason_ServerFull: return "server-full"; + default: return "unknown"; + } + } + + static const char *LoginRejectReasonToString(ELoginRejectReason reason) + { + switch (reason) + { + case eLoginRejectReason_BannedXuid: return "banned-xuid"; + case eLoginRejectReason_NotWhitelisted: return "not-whitelisted"; + case eLoginRejectReason_DuplicateXuid: return "duplicate-xuid"; + case eLoginRejectReason_DuplicateName: return "duplicate-name"; + default: return "unknown"; + } + } + + static const char *DisconnectReasonToString(DisconnectPacket::eDisconnectReason reason) + { + switch (reason) + { + case DisconnectPacket::eDisconnect_None: return "none"; + case DisconnectPacket::eDisconnect_Quitting: return "quitting"; + case DisconnectPacket::eDisconnect_Closed: return "closed"; + case DisconnectPacket::eDisconnect_LoginTooLong: return "login-too-long"; + case DisconnectPacket::eDisconnect_IllegalStance: return "illegal-stance"; + case DisconnectPacket::eDisconnect_IllegalPosition: return "illegal-position"; + case DisconnectPacket::eDisconnect_MovedTooQuickly: return "moved-too-quickly"; + case DisconnectPacket::eDisconnect_NoFlying: return "no-flying"; + case DisconnectPacket::eDisconnect_Kicked: return "kicked"; + case DisconnectPacket::eDisconnect_TimeOut: return "timeout"; + case DisconnectPacket::eDisconnect_Overflow: return "overflow"; + case DisconnectPacket::eDisconnect_EndOfStream: return "end-of-stream"; + case DisconnectPacket::eDisconnect_ServerFull: return "server-full"; + case DisconnectPacket::eDisconnect_OutdatedServer: return "outdated-server"; + case DisconnectPacket::eDisconnect_OutdatedClient: return "outdated-client"; + case DisconnectPacket::eDisconnect_UnexpectedPacket: return "unexpected-packet"; + case DisconnectPacket::eDisconnect_ConnectionCreationFailed: return "connection-creation-failed"; + case DisconnectPacket::eDisconnect_NoMultiplayerPrivilegesHost: return "no-multiplayer-privileges-host"; + case DisconnectPacket::eDisconnect_NoMultiplayerPrivilegesJoin: return "no-multiplayer-privileges-join"; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: return "no-ugc-all-local"; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: return "no-ugc-single-local"; + case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal: return "content-restricted-all-local"; + case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local: return "content-restricted-single-local"; + case DisconnectPacket::eDisconnect_NoUGC_Remote: return "no-ugc-remote"; + case DisconnectPacket::eDisconnect_NoFriendsInGame: return "no-friends-in-game"; + case DisconnectPacket::eDisconnect_Banned: return "banned"; + case DisconnectPacket::eDisconnect_NotFriendsWithHost: return "not-friends-with-host"; + case DisconnectPacket::eDisconnect_NATMismatch: return "nat-mismatch"; + default: return "unknown"; + } + } + } + + // Only forward client-side debug output while the process is running as the dedicated server. + bool ShouldForwardClientDebugLogs() + { + return IsDedicatedServerLoggingEnabled(); + } + + void ForwardClientAppDebugLogV(const char *format, va_list args) + { + ForwardFormattedClientDebugLogV("app", format, args); + } + + void ForwardClientUserDebugLogV(int user, const char *format, va_list args) + { + char source[32] = {}; + _snprintf_s(source, sizeof(source), _TRUNCATE, "app:user=%d", user); + ForwardFormattedClientDebugLogV(source, format, args); + } + + void ForwardClientDebugSpewLogV(const char *format, va_list args) + { + ForwardFormattedClientDebugLogV("debug-spew", format, args); + } + + // Clear every cached connection slot during startup so stale metadata never leaks into future logs. + void Initialize() + { + std::lock_guard stateLock(g_serverLogState.stateLock); + for (size_t index = 0; index < g_serverLogState.entries.size(); ++index) + { + ResetConnectionLogEntry(&g_serverLogState.entries[index]); + } + } + + // Reuse Initialize as the shutdown cleanup path because both operations wipe the cache. + void Shutdown() + { + Initialize(); + } + + // Log the raw socket arrival before a smallId is assigned so early rejects still have an IP in the logs. + void OnIncomingTcpConnection(const char *ip) + { + if (!IsDedicatedServerLoggingEnabled()) + { + return; + } + + const std::string remoteIp = NormalizeRemoteIp(ip); + LogInfof("network", "incoming tcp connection from %s", remoteIp.c_str()); + } + + // TCP rejects happen before connection state is cached, so log directly from the supplied remote IP. + void OnRejectedTcpConnection(const char *ip, ETcpRejectReason reason) + { + if (!IsDedicatedServerLoggingEnabled()) + { + return; + } + + const std::string remoteIp = NormalizeRemoteIp(ip); + LogWarnf("network", "rejected tcp connection from %s: reason=%s", remoteIp.c_str(), TcpRejectReasonToString(reason)); + } + + // Cache the accepted remote IP immediately so later login and disconnect logs can reuse it. + void OnAcceptedTcpConnection(unsigned char smallId, const char *ip) + { + if (!IsDedicatedServerLoggingEnabled()) + { + return; + } + + const std::string remoteIp = NormalizeRemoteIp(ip); + { + std::lock_guard stateLock(g_serverLogState.stateLock); + ConnectionLogEntry &entry = g_serverLogState.entries[smallId]; + ResetConnectionLogEntry(&entry); + entry.remoteIp = remoteIp; + } + + LogInfof("network", "accepted tcp connection from %s as smallId=%u", remoteIp.c_str(), (unsigned)smallId); + } + + // Once login succeeds, bind the resolved player name onto the cached transport entry. + void OnAcceptedPlayerLogin(unsigned char smallId, const std::wstring &playerName) + { + if (!IsDedicatedServerLoggingEnabled()) + { + return; + } + + const std::string playerNameUtf8 = NormalizePlayerName(playerName); + std::string remoteIp("unknown"); + { + std::lock_guard stateLock(g_serverLogState.stateLock); + ConnectionLogEntry &entry = g_serverLogState.entries[smallId]; + entry.playerName = playerNameUtf8; + if (!entry.remoteIp.empty()) + { + remoteIp = entry.remoteIp; + } + } + + LogInfof("network", "accepted player login: name=\"%s\" ip=%s smallId=%u", playerNameUtf8.c_str(), remoteIp.c_str(), (unsigned)smallId); + } + + // Read the cached IP for the rejection log, then clear the slot because the player never fully joined. + void OnRejectedPlayerLogin(unsigned char smallId, const std::wstring &playerName, ELoginRejectReason reason) + { + if (!IsDedicatedServerLoggingEnabled()) + { + return; + } + + const std::string playerNameUtf8 = NormalizePlayerName(playerName); + std::string remoteIp("unknown"); + { + std::lock_guard stateLock(g_serverLogState.stateLock); + ConnectionLogEntry &entry = g_serverLogState.entries[smallId]; + if (!entry.remoteIp.empty()) + { + remoteIp = entry.remoteIp; + } + ResetConnectionLogEntry(&entry); + } + + LogWarnf("network", "rejected login from %s: name=\"%s\" reason=%s", remoteIp.c_str(), playerNameUtf8.c_str(), LoginRejectReasonToString(reason)); + } + + // Disconnect logging is the final consumer of cached metadata, so it also clears the slot afterward. + void OnPlayerDisconnected( + unsigned char smallId, + const std::wstring &playerName, + DisconnectPacket::eDisconnectReason reason, + bool initiatedByServer) + { + if (!IsDedicatedServerLoggingEnabled()) + { + return; + } + + std::string playerNameUtf8 = NormalizePlayerName(playerName); + std::string remoteIp("unknown"); + { + // Copy state under lock and emit the log after unlocking so CLI output never blocks connection bookkeeping. + std::lock_guard stateLock(g_serverLogState.stateLock); + ConnectionLogEntry &entry = g_serverLogState.entries[smallId]; + if (!entry.remoteIp.empty()) + { + remoteIp = entry.remoteIp; + } + if (playerNameUtf8 == "" && !entry.playerName.empty()) + { + playerNameUtf8 = entry.playerName; + } + ResetConnectionLogEntry(&entry); + } + + LogInfof( + "network", + "%s: name=\"%s\" ip=%s smallId=%u reason=%s", + initiatedByServer ? "disconnecting player" : "player disconnected", + playerNameUtf8.c_str(), + remoteIp.c_str(), + (unsigned)smallId, + DisconnectReasonToString(reason)); + } + + /** + * For logging purposes, the responsibility is technically misplaced, but the IP is cached in `LogManager`. + * Those cached values are then used to retrieve the player's IP. + * + * Eventually, this should be implemented in a separate class or on the `Minecraft.Client` side instead. + */ + bool TryGetConnectionRemoteIp(unsigned char smallId, std::string *outIp) + { + if (!IsDedicatedServerLoggingEnabled() || outIp == NULL) + { + return false; + } + + std::lock_guard stateLock(g_serverLogState.stateLock); + const ConnectionLogEntry &entry = g_serverLogState.entries[smallId]; + if (entry.remoteIp.empty() || entry.remoteIp == "unknown") + { + return false; + } + + *outIp = entry.remoteIp; + return true; + } + + // Provide explicit cache cleanup for paths that terminate without going through disconnect logging. + void ClearConnection(unsigned char smallId) + { + std::lock_guard stateLock(g_serverLogState.stateLock); + ResetConnectionLogEntry(&g_serverLogState.entries[smallId]); + } + } +} diff --git a/Minecraft.Server/ServerLogManager.h b/Minecraft.Server/ServerLogManager.h new file mode 100644 index 00000000..1d4abfb5 --- /dev/null +++ b/Minecraft.Server/ServerLogManager.h @@ -0,0 +1,127 @@ +#pragma once + +#include +#include + +#include "..\Minecraft.World\DisconnectPacket.h" + +namespace ServerRuntime +{ + namespace ServerLogManager + { + /** + * Identifies why the dedicated server rejected a TCP connection before login completed + * ログイン完了前にTCP接続を拒否した理由 + */ + enum ETcpRejectReason + { + eTcpRejectReason_BannedIp = 0, + eTcpRejectReason_GameNotReady, + eTcpRejectReason_ServerFull + }; + + /** + * Identifies why the dedicated server rejected a player during login validation + * ログイン検証中にプレイヤーを拒否した理由 + */ + enum ELoginRejectReason + { + eLoginRejectReason_BannedXuid = 0, + eLoginRejectReason_NotWhitelisted, + eLoginRejectReason_DuplicateXuid, + eLoginRejectReason_DuplicateName + }; + + /** + * Returns `true` when client-side debug logs should be redirected into the dedicated server logger + * dedicated server時にclient側デバッグログを転送すかどうか + */ + bool ShouldForwardClientDebugLogs(); + + /** + * Formats and forwards `CMinecraftApp::DebugPrintf` output through the dedicated server logger + * CMinecraftApp::DebugPrintf の出力を専用サーバーロガーへ転送 + */ + void ForwardClientAppDebugLogV(const char *format, va_list args); + + /** + * Formats and forwards `CMinecraftApp::DebugPrintf(int user, ...)` output through the dedicated server logger + * CMinecraftApp::DebugPrintf(int user, ...) の出力を専用サーバーロガーへ転送 + */ + void ForwardClientUserDebugLogV(int user, const char *format, va_list args); + + /** + * Formats and forwards legacy `DebugSpew` output through the dedicated server logger + * 従来の DebugSpew 出力を専用サーバーロガーへ転送 + */ + void ForwardClientDebugSpewLogV(const char *format, va_list args); + + /** + * Clears cached connection metadata before the dedicated server starts accepting players + * 接続ログ管理用のキャッシュを初期化 + */ + void Initialize(); + + /** + * Releases cached connection metadata after the dedicated server stops + * 接続ログ管理用のキャッシュを停止時に破棄 + */ + void Shutdown(); + + /** + * **Log Incoming TCP Connection** + * + * Emits a named log for a raw TCP accept before smallId assignment finishes + * smallId割り当て前のTCP接続を記録 + */ + void OnIncomingTcpConnection(const char *ip); + + /** + * Emits a named log for a TCP connection rejected before login starts + * ログイン開始前に拒否したTCP接続を記録 + */ + void OnRejectedTcpConnection(const char *ip, ETcpRejectReason reason); + + /** + * Stores the remote IP for the assigned smallId and logs the accepted transport connection + * 割り当て済みsmallIdに対接続IPを保存して記録 + */ + void OnAcceptedTcpConnection(unsigned char smallId, const char *ip); + + /** + * Associates a player name with the connection and emits the accepted login log + * 接続にプレイヤー名を関連付けてログイン成功を記録 + */ + void OnAcceptedPlayerLogin(unsigned char smallId, const std::wstring &playerName); + + /** + * Emits a named login rejection log and clears cached metadata for that smallId + * ログイン拒否を記録し対象smallIdのキャッシュを破棄 + */ + void OnRejectedPlayerLogin(unsigned char smallId, const std::wstring &playerName, ELoginRejectReason reason); + + /** + * Emits a named disconnect log using cached connection metadata and then clears that entry + * 接続キャッシュを使って切断ログを出しその後で破棄 + */ + void OnPlayerDisconnected( + unsigned char smallId, + const std::wstring &playerName, + DisconnectPacket::eDisconnectReason reason, + bool initiatedByServer); + + /** + * Reads the cached remote IP for a live smallId without consuming the entry + * Eventually, this should be implemented in a separate class or on the `Minecraft.Client` side instead. + * + * 指定smallIdの接続IPをキャッシュから参照する + */ + bool TryGetConnectionRemoteIp(unsigned char smallId, std::string *outIp); + + /** + * Removes any remembered IP or player name for the specified smallId + * 指定smallIdに紐づく接続キャッシュを消去 + */ + void ClearConnection(unsigned char smallId); + } +} diff --git a/Minecraft.Server/ServerLogger.cpp b/Minecraft.Server/ServerLogger.cpp new file mode 100644 index 00000000..0c7c567f --- /dev/null +++ b/Minecraft.Server/ServerLogger.cpp @@ -0,0 +1,258 @@ +#include "stdafx.h" + +#include "ServerLogger.h" +#include "Common\\StringUtils.h" +#include "vendor\\linenoise\\linenoise.h" + +#include +#include +#include + +namespace ServerRuntime +{ +static volatile LONG g_minLogLevel = (LONG)eServerLogLevel_Info; + +static const char *NormalizeCategory(const char *category) +{ + if (category == NULL || category[0] == 0) + { + return "server"; + } + return category; +} + +static const char *LogLevelToString(EServerLogLevel level) +{ + switch (level) + { + case eServerLogLevel_Debug: + return "DEBUG"; + case eServerLogLevel_Info: + return "INFO"; + case eServerLogLevel_Warn: + return "WARN"; + case eServerLogLevel_Error: + return "ERROR"; + default: + return "INFO"; + } +} + +static WORD LogLevelToColor(EServerLogLevel level) +{ + switch (level) + { + case eServerLogLevel_Debug: + return FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY; + case eServerLogLevel_Warn: + return FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY; + case eServerLogLevel_Error: + return FOREGROUND_RED | FOREGROUND_INTENSITY; + case eServerLogLevel_Info: + default: + return FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY; + } +} + +static void BuildTimestamp(char *buffer, size_t bufferSize) +{ + if (buffer == NULL || bufferSize == 0) + { + return; + } + + SYSTEMTIME localTime; + GetLocalTime(&localTime); + sprintf_s( + buffer, + bufferSize, + "%04u-%02u-%02u %02u:%02u:%02u.%03u", + (unsigned)localTime.wYear, + (unsigned)localTime.wMonth, + (unsigned)localTime.wDay, + (unsigned)localTime.wHour, + (unsigned)localTime.wMinute, + (unsigned)localTime.wSecond, + (unsigned)localTime.wMilliseconds); +} + +static bool ShouldLog(EServerLogLevel level) +{ + return ((LONG)level >= g_minLogLevel); +} + +static void WriteLogLine(EServerLogLevel level, const char *category, const char *message) +{ + if (!ShouldLog(level)) + { + return; + } + + linenoiseExternalWriteBegin(); + + const char *safeCategory = NormalizeCategory(category); + const char *safeMessage = (message != NULL) ? message : ""; + + char timestamp[32] = {}; + BuildTimestamp(timestamp, sizeof(timestamp)); + + HANDLE stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO originalInfo; + bool hasColorConsole = false; + if (stdoutHandle != INVALID_HANDLE_VALUE && stdoutHandle != NULL) + { + if (GetConsoleScreenBufferInfo(stdoutHandle, &originalInfo)) + { + hasColorConsole = true; + SetConsoleTextAttribute(stdoutHandle, LogLevelToColor(level)); + } + } + + printf( + "[%s][%s][%s] %s\n", + timestamp, + LogLevelToString(level), + safeCategory, + safeMessage); + fflush(stdout); + + if (hasColorConsole) + { + SetConsoleTextAttribute(stdoutHandle, originalInfo.wAttributes); + } + + linenoiseExternalWriteEnd(); +} + +static void WriteLogLineV(EServerLogLevel level, const char *category, const char *format, va_list args) +{ + char messageBuffer[2048] = {}; + if (format == NULL) + { + WriteLogLine(level, category, ""); + return; + } + + vsnprintf_s(messageBuffer, sizeof(messageBuffer), _TRUNCATE, format, args); + WriteLogLine(level, category, messageBuffer); +} + +bool TryParseServerLogLevel(const char *value, EServerLogLevel *outLevel) +{ + if (value == NULL || outLevel == NULL) + { + return false; + } + + if (_stricmp(value, "debug") == 0) + { + *outLevel = eServerLogLevel_Debug; + return true; + } + if (_stricmp(value, "info") == 0) + { + *outLevel = eServerLogLevel_Info; + return true; + } + if (_stricmp(value, "warn") == 0 || _stricmp(value, "warning") == 0) + { + *outLevel = eServerLogLevel_Warn; + return true; + } + if (_stricmp(value, "error") == 0) + { + *outLevel = eServerLogLevel_Error; + return true; + } + + return false; +} + +void SetServerLogLevel(EServerLogLevel level) +{ + if (level < eServerLogLevel_Debug) + { + level = eServerLogLevel_Debug; + } + else if (level > eServerLogLevel_Error) + { + level = eServerLogLevel_Error; + } + + g_minLogLevel = (LONG)level; +} + +EServerLogLevel GetServerLogLevel() +{ + return (EServerLogLevel)g_minLogLevel; +} + +void LogDebug(const char *category, const char *message) +{ + WriteLogLine(eServerLogLevel_Debug, category, message); +} + +void LogInfo(const char *category, const char *message) +{ + WriteLogLine(eServerLogLevel_Info, category, message); +} + +void LogWarn(const char *category, const char *message) +{ + WriteLogLine(eServerLogLevel_Warn, category, message); +} + +void LogError(const char *category, const char *message) +{ + WriteLogLine(eServerLogLevel_Error, category, message); +} + +void LogDebugf(const char *category, const char *format, ...) +{ + va_list args; + va_start(args, format); + WriteLogLineV(eServerLogLevel_Debug, category, format, args); + va_end(args); +} + +void LogInfof(const char *category, const char *format, ...) +{ + va_list args; + va_start(args, format); + WriteLogLineV(eServerLogLevel_Info, category, format, args); + va_end(args); +} + +void LogWarnf(const char *category, const char *format, ...) +{ + va_list args; + va_start(args, format); + WriteLogLineV(eServerLogLevel_Warn, category, format, args); + va_end(args); +} + +void LogErrorf(const char *category, const char *format, ...) +{ + va_list args; + va_start(args, format); + WriteLogLineV(eServerLogLevel_Error, category, format, args); + va_end(args); +} + +void LogStartupStep(const char *message) +{ + LogInfo("startup", message); +} + +void LogWorldIO(const char *message) +{ + LogInfo("world-io", message); +} + +void LogWorldName(const char *prefix, const std::wstring &name) +{ + std::string utf8 = StringUtils::WideToUtf8(name); + LogInfof("world-io", "%s: %s", (prefix != NULL) ? prefix : "name", utf8.c_str()); +} +} + diff --git a/Minecraft.Server/ServerLogger.h b/Minecraft.Server/ServerLogger.h new file mode 100644 index 00000000..89b820e6 --- /dev/null +++ b/Minecraft.Server/ServerLogger.h @@ -0,0 +1,44 @@ +#pragma once + +#include + +namespace ServerRuntime +{ + enum EServerLogLevel + { + eServerLogLevel_Debug = 0, + eServerLogLevel_Info = 1, + eServerLogLevel_Warn = 2, + eServerLogLevel_Error = 3 + }; + + /** + * **Parse Log Level String** + * + * Converts a string value into log level (`debug`/`info`/`warn`/`error`) + * ログレベル文字列の変換処理 + * + * @param value Source string + * @param outLevel Output location for parsed level + * @return `true` when conversion succeeds + */ + bool TryParseServerLogLevel(const char *value, EServerLogLevel *outLevel); + + void SetServerLogLevel(EServerLogLevel level); + EServerLogLevel GetServerLogLevel(); + + void LogDebug(const char *category, const char *message); + void LogInfo(const char *category, const char *message); + void LogWarn(const char *category, const char *message); + void LogError(const char *category, const char *message); + + /** Emit formatted log output with the specified level and category */ + void LogDebugf(const char *category, const char *format, ...); + void LogInfof(const char *category, const char *format, ...); + void LogWarnf(const char *category, const char *format, ...); + void LogErrorf(const char *category, const char *format, ...); + + void LogStartupStep(const char *message); + void LogWorldIO(const char *message); + void LogWorldName(const char *prefix, const std::wstring &name); +} diff --git a/Minecraft.Server/ServerProperties.cpp b/Minecraft.Server/ServerProperties.cpp new file mode 100644 index 00000000..d6ba64e7 --- /dev/null +++ b/Minecraft.Server/ServerProperties.cpp @@ -0,0 +1,930 @@ +#include "stdafx.h" + +#include "ServerProperties.h" + +#include "ServerLogger.h" +#include "Common\\StringUtils.h" +#include "Common\\FileUtils.h" +#include "..\\Minecraft.World\\ChunkSource.h" + +#include +#include +#include +#include +#include + +namespace ServerRuntime +{ +using StringUtils::ToLowerAscii; +using StringUtils::TrimAscii; +using StringUtils::StripUtf8Bom; +using StringUtils::Utf8ToWide; +using StringUtils::WideToUtf8; + +struct ServerPropertyDefault +{ + const char *key; + const char *value; +}; + +static const char *kServerPropertiesPath = "server.properties"; +static const size_t kMaxSaveIdLength = 31; + +static const int kDefaultServerPort = 25565; +static const int kDefaultMaxPlayers = 16; +static const int kMaxDedicatedPlayers = 256; +static const int kDefaultAutosaveIntervalSeconds = 60; +static const char *kLanAdvertisePropertyKey = "lan-advertise"; + +static const ServerPropertyDefault kServerPropertyDefaults[] = +{ + { "allow-flight", "true" }, + { "allow-nether", "true" }, + { "autosave-interval", "60" }, + { "bedrock-fog", "true" }, + { "bonus-chest", "false" }, + { "difficulty", "1" }, + { "disable-saving", "false" }, + { "do-daylight-cycle", "true" }, + { "do-mob-loot", "true" }, + { "do-mob-spawning", "true" }, + { "do-tile-drops", "true" }, + { "fire-spreads", "true" }, + { "friends-of-friends", "false" }, + { "gamemode", "0" }, + { "gamertags", "true" }, + { "generate-structures", "true" }, + { "host-can-be-invisible", "true" }, + { "host-can-change-hunger", "true" }, + { "host-can-fly", "true" }, + { "keep-inventory", "false" }, + { "level-id", "world" }, + { "level-name", "world" }, + { "level-seed", "" }, + { "level-type", "default" }, + { "world-size", "classic" }, + { "spawn-protection", "0" }, + { "log-level", "info" }, + { "max-build-height", "256" }, + { "max-players", "16" }, + { "mob-griefing", "true" }, + { "motd", "A Minecraft Server" }, + { "natural-regeneration", "true" }, + { "pvp", "true" }, + { "server-ip", "0.0.0.0" }, + { "server-name", "DedicatedServer" }, + { "server-port", "25565" }, + { "white-list", "false" }, + { "lan-advertise", "false" }, + { "spawn-animals", "true" }, + { "spawn-monsters", "true" }, + { "spawn-npcs", "true" }, + { "tnt", "true" }, + { "trust-players", "true" } +}; + +static std::string BoolToString(bool value) +{ + return value ? "true" : "false"; +} + +static std::string IntToString(int value) +{ + char buffer[32] = {}; + sprintf_s(buffer, sizeof(buffer), "%d", value); + return std::string(buffer); +} + +static std::string Int64ToString(__int64 value) +{ + char buffer[64] = {}; + _i64toa_s(value, buffer, sizeof(buffer), 10); + return std::string(buffer); +} + +static int ClampInt(int value, int minValue, int maxValue) +{ + if (value < minValue) + { + return minValue; + } + if (value > maxValue) + { + return maxValue; + } + return value; +} + +static bool TryParseBool(const std::string &value, bool *outValue) +{ + if (outValue == NULL) + { + return false; + } + + std::string lowered = ToLowerAscii(TrimAscii(value)); + if (lowered == "true" || lowered == "1" || lowered == "yes" || lowered == "on") + { + *outValue = true; + return true; + } + if (lowered == "false" || lowered == "0" || lowered == "no" || lowered == "off") + { + *outValue = false; + return true; + } + return false; +} + +static bool TryParseInt(const std::string &value, int *outValue) +{ + if (outValue == NULL) + { + return false; + } + + std::string trimmed = TrimAscii(value); + if (trimmed.empty()) + { + return false; + } + + char *end = NULL; + long parsed = strtol(trimmed.c_str(), &end, 10); + if (end == trimmed.c_str() || *end != 0) + { + return false; + } + + *outValue = (int)parsed; + return true; +} + +static bool TryParseInt64(const std::string &value, __int64 *outValue) +{ + if (outValue == NULL) + { + return false; + } + + std::string trimmed = TrimAscii(value); + if (trimmed.empty()) + { + return false; + } + + char *end = NULL; + __int64 parsed = _strtoi64(trimmed.c_str(), &end, 10); + if (end == trimmed.c_str() || *end != 0) + { + return false; + } + + *outValue = parsed; + return true; +} + +static std::string LogLevelToPropertyValue(EServerLogLevel level) +{ + switch (level) + { + case eServerLogLevel_Debug: + return "debug"; + case eServerLogLevel_Warn: + return "warn"; + case eServerLogLevel_Error: + return "error"; + case eServerLogLevel_Info: + default: + return "info"; + } +} + +/** + * **Normalize Save ID** + * + * Normalizes an arbitrary string into a safe save destination ID + * Conversion rules: + * - Lowercase alphabetic characters + * - Keep only `[a-z0-9_.-]` + * - Replace spaces and unsupported characters with `_` + * - Fallback to `world` when empty + * - Enforce max length to match storage constraints + * 保存先IDの正規化処理 + */ +static std::string NormalizeSaveId(const std::string &source) +{ + std::string out; + out.reserve(source.length()); + + // Normalize into a character set that is safe for storage save IDs + // Replace invalid characters with '_' and fold letter case to reduce collisions + for (size_t i = 0; i < source.length(); ++i) + { + unsigned char ch = (unsigned char)source[i]; + if (ch >= 'A' && ch <= 'Z') + { + ch = (unsigned char)(ch - 'A' + 'a'); + } + + const bool alnum = (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9'); + const bool passthrough = (ch == '_') || (ch == '-') || (ch == '.'); + if (alnum || passthrough) + { + out.push_back((char)ch); + } + else if (std::isspace(ch)) + { + out.push_back('_'); + } + else if (ch < 0x80) + { + out.push_back('_'); + } + } + + if (out.empty()) + { + out = "world"; + } + + // Add a prefix when needed to avoid awkward leading characters + if (!((out[0] >= 'a' && out[0] <= 'z') || (out[0] >= '0' && out[0] <= '9'))) + { + out = std::string("w_") + out; + } + + // Clamp length to the 4J-side filename buffer constraint + if (out.length() > kMaxSaveIdLength) + { + out.resize(kMaxSaveIdLength); + } + + return out; +} + +static void ApplyDefaultServerProperties(std::unordered_map *properties) +{ + if (properties == NULL) + { + return; + } + + const size_t defaultCount = sizeof(kServerPropertyDefaults) / sizeof(kServerPropertyDefaults[0]); + for (size_t i = 0; i < defaultCount; ++i) + { + (*properties)[kServerPropertyDefaults[i].key] = kServerPropertyDefaults[i].value; + } +} + +/** + * **Parse server.properties Text** + * + * Extracts key/value pairs from `server.properties` format text + * - Ignores lines starting with `#` or `!` as comments + * - Accepts `=` or `:` as separators + * - Skips invalid lines and continues + * server.propertiesのパース処理 + */ +static bool ReadServerPropertiesFile(const char *filePath, std::unordered_map *properties, int *outParsedCount) +{ + if (properties == NULL) + { + return false; + } + + std::string text; + if (filePath == NULL || !FileUtils::ReadTextFile(filePath, &text)) + { + return false; + } + + text = StripUtf8Bom(text); + + int parsedCount = 0; + for (size_t start = 0; start <= text.length();) + { + size_t end = text.find_first_of("\r\n", start); + size_t nextStart = text.length() + 1; + if (end != std::string::npos) + { + nextStart = end + 1; + if (text[end] == '\r' && nextStart < text.length() && text[nextStart] == '\n') + { + ++nextStart; + } + } + + std::string line; + if (end == std::string::npos) + { + line = text.substr(start); + } + else + { + line = text.substr(start, end - start); + } + + std::string trimmedLine = TrimAscii(line); + if (trimmedLine.empty()) + { + start = nextStart; + continue; + } + + if (trimmedLine[0] == '#' || trimmedLine[0] == '!') + { + start = nextStart; + continue; + } + + size_t eqPos = trimmedLine.find('='); + size_t colonPos = trimmedLine.find(':'); + size_t sepPos = std::string::npos; + if (eqPos == std::string::npos) + { + sepPos = colonPos; + } + else if (colonPos == std::string::npos) + { + sepPos = eqPos; + } + else + { + sepPos = (eqPos < colonPos) ? eqPos : colonPos; + } + + if (sepPos == std::string::npos) + { + start = nextStart; + continue; + } + + std::string key = TrimAscii(trimmedLine.substr(0, sepPos)); + if (key.empty()) + { + start = nextStart; + continue; + } + + std::string value = TrimAscii(trimmedLine.substr(sepPos + 1)); + (*properties)[key] = value; + ++parsedCount; + start = nextStart; + } + + if (outParsedCount != NULL) + { + *outParsedCount = parsedCount; + } + + return true; +} + +/** + * **Write server.properties Text** + * + * Writes key/value data back as `server.properties` + * Sorts keys before writing to keep output order stable + * server.propertiesの書き戻し処理 + */ +static bool WriteServerPropertiesFile(const char *filePath, const std::unordered_map &properties) +{ + if (filePath == NULL) + { + return false; + } + + std::string text; + text += "# Minecraft server properties\n"; + text += "# Auto-generated and normalized when missing\n"; + + std::map sortedProperties(properties.begin(), properties.end()); + for (std::map::const_iterator it = sortedProperties.begin(); it != sortedProperties.end(); ++it) + { + text += it->first; + text += "="; + text += it->second; + text += "\n"; + } + + return FileUtils::WriteTextFileAtomic(filePath, text); +} + +static bool ReadNormalizedBoolProperty( + std::unordered_map *properties, + const char *key, + bool defaultValue, + bool *shouldWrite) +{ + std::string raw = TrimAscii((*properties)[key]); + bool value = defaultValue; + if (!TryParseBool(raw, &value)) + { + value = defaultValue; + } + + std::string normalized = BoolToString(value); + if (raw != normalized) + { + (*properties)[key] = normalized; + if (shouldWrite != NULL) + { + *shouldWrite = true; + } + } + + return value; +} + +static int ReadNormalizedIntProperty( + std::unordered_map *properties, + const char *key, + int defaultValue, + int minValue, + int maxValue, + bool *shouldWrite) +{ + std::string raw = TrimAscii((*properties)[key]); + int value = defaultValue; + if (!TryParseInt(raw, &value)) + { + value = defaultValue; + } + value = ClampInt(value, minValue, maxValue); + + std::string normalized = IntToString(value); + if (raw != normalized) + { + (*properties)[key] = normalized; + if (shouldWrite != NULL) + { + *shouldWrite = true; + } + } + + return value; +} + +static std::string ReadNormalizedStringProperty( + std::unordered_map *properties, + const char *key, + const std::string &defaultValue, + size_t maxLength, + bool *shouldWrite) +{ + std::string value = TrimAscii((*properties)[key]); + if (value.empty()) + { + value = defaultValue; + } + if (maxLength > 0 && value.length() > maxLength) + { + value.resize(maxLength); + } + + if (value != (*properties)[key]) + { + (*properties)[key] = value; + if (shouldWrite != NULL) + { + *shouldWrite = true; + } + } + + return value; +} + +static bool ReadNormalizedOptionalInt64Property( + std::unordered_map *properties, + const char *key, + __int64 *outValue, + bool *shouldWrite) +{ + std::string raw = TrimAscii((*properties)[key]); + if (raw.empty()) + { + if ((*properties)[key] != "") + { + (*properties)[key] = ""; + if (shouldWrite != NULL) + { + *shouldWrite = true; + } + } + return false; + } + + __int64 parsed = 0; + if (!TryParseInt64(raw, &parsed)) + { + (*properties)[key] = ""; + if (shouldWrite != NULL) + { + *shouldWrite = true; + } + return false; + } + + std::string normalized = Int64ToString(parsed); + if (raw != normalized) + { + (*properties)[key] = normalized; + if (shouldWrite != NULL) + { + *shouldWrite = true; + } + } + + if (outValue != NULL) + { + *outValue = parsed; + } + return true; +} + +static EServerLogLevel ReadNormalizedLogLevelProperty( + std::unordered_map *properties, + const char *key, + EServerLogLevel defaultValue, + bool *shouldWrite) +{ + std::string raw = TrimAscii((*properties)[key]); + EServerLogLevel value = defaultValue; + if (!TryParseServerLogLevel(raw.c_str(), &value)) + { + value = defaultValue; + } + + std::string normalized = LogLevelToPropertyValue(value); + if (raw != normalized) + { + (*properties)[key] = normalized; + if (shouldWrite != NULL) + { + *shouldWrite = true; + } + } + + return value; +} + +static std::string ReadNormalizedLevelTypeProperty( + std::unordered_map *properties, + const char *key, + bool *outIsFlat, + bool *shouldWrite) +{ + std::string raw = TrimAscii((*properties)[key]); + std::string lowered = ToLowerAscii(raw); + + bool isFlat = false; + std::string normalized = "default"; + if (lowered == "flat" || lowered == "superflat" || lowered == "1") + { + isFlat = true; + normalized = "flat"; + } + else if (lowered == "default" || lowered == "normal" || lowered == "0") + { + isFlat = false; + normalized = "default"; + } + + if (raw != normalized) + { + (*properties)[key] = normalized; + if (shouldWrite != NULL) + { + *shouldWrite = true; + } + } + + if (outIsFlat != NULL) + { + *outIsFlat = isFlat; + } + + return normalized; +} + +static std::string WorldSizeToPropertyValue(int worldSize) +{ + switch (worldSize) + { + case e_worldSize_Small: + return "small"; + case e_worldSize_Medium: + return "medium"; + case e_worldSize_Large: + return "large"; + case e_worldSize_Classic: + default: + return "classic"; + } +} + +static int WorldSizeToXzChunks(int worldSize) +{ + switch (worldSize) + { + case e_worldSize_Small: + return LEVEL_WIDTH_SMALL; + case e_worldSize_Medium: + return LEVEL_WIDTH_MEDIUM; + case e_worldSize_Large: + return LEVEL_WIDTH_LARGE; + case e_worldSize_Classic: + default: + return LEVEL_WIDTH_CLASSIC; + } +} + +static int WorldSizeToHellScale(int worldSize) +{ + switch (worldSize) + { + case e_worldSize_Small: + return HELL_LEVEL_SCALE_SMALL; + case e_worldSize_Medium: + return HELL_LEVEL_SCALE_MEDIUM; + case e_worldSize_Large: + return HELL_LEVEL_SCALE_LARGE; + case e_worldSize_Classic: + default: + return HELL_LEVEL_SCALE_CLASSIC; + } +} + +static bool TryParseWorldSize(const std::string &lowered, int *outWorldSize) +{ + if (outWorldSize == NULL) + { + return false; + } + + if (lowered == "classic" || lowered == "54" || lowered == "1") + { + *outWorldSize = e_worldSize_Classic; + return true; + } + if (lowered == "small" || lowered == "64" || lowered == "2") + { + *outWorldSize = e_worldSize_Small; + return true; + } + if (lowered == "medium" || lowered == "192" || lowered == "3") + { + *outWorldSize = e_worldSize_Medium; + return true; + } + if (lowered == "large" || lowered == "320" || lowered == "4") + { + *outWorldSize = e_worldSize_Large; + return true; + } + + return false; +} + +static int ReadNormalizedWorldSizeProperty( + std::unordered_map *properties, + const char *key, + int defaultWorldSize, + int *outXzChunks, + int *outHellScale, + bool *shouldWrite) +{ + std::string raw = TrimAscii((*properties)[key]); + std::string lowered = ToLowerAscii(raw); + + int worldSize = defaultWorldSize; + if (!raw.empty()) + { + int parsedWorldSize = defaultWorldSize; + if (TryParseWorldSize(lowered, &parsedWorldSize)) + { + worldSize = parsedWorldSize; + } + } + + std::string normalized = WorldSizeToPropertyValue(worldSize); + if (raw != normalized) + { + (*properties)[key] = normalized; + if (shouldWrite != NULL) + { + *shouldWrite = true; + } + } + + if (outXzChunks != NULL) + { + *outXzChunks = WorldSizeToXzChunks(worldSize); + } + if (outHellScale != NULL) + { + *outHellScale = WorldSizeToHellScale(worldSize); + } + + return worldSize; +} + +/** + * **Load Effective Server Properties Config** + * + * Loads effective world settings, repairs missing or invalid values, and returns normalized config + * - Creates defaults when file is missing + * - Fills required keys when absent + * - Normalizes `level-id` to a safe format + * - Auto-saves when any fix is applied + * 実効設定の読み込みと補正処理 + */ +ServerPropertiesConfig LoadServerPropertiesConfig() +{ + ServerPropertiesConfig config; + + std::unordered_map defaults; + std::unordered_map loaded; + ApplyDefaultServerProperties(&defaults); + + int parsedCount = 0; + bool readSuccess = ReadServerPropertiesFile(kServerPropertiesPath, &loaded, &parsedCount); + std::unordered_map merged = defaults; + bool shouldWrite = false; + + if (!readSuccess) + { + LogWorldIO("server.properties not found or unreadable; creating defaults"); + shouldWrite = true; + } + else + { + if (parsedCount == 0) + { + LogWorldIO("server.properties has no properties; applying defaults"); + shouldWrite = true; + } + + const size_t defaultCount = sizeof(kServerPropertyDefaults) / sizeof(kServerPropertyDefaults[0]); + for (size_t i = 0; i < defaultCount; ++i) + { + if (loaded.find(kServerPropertyDefaults[i].key) == loaded.end()) + { + shouldWrite = true; + break; + } + } + } + + for (std::unordered_map::const_iterator it = loaded.begin(); it != loaded.end(); ++it) + { + // Merge loaded values over defaults and keep unknown keys whenever possible + merged[it->first] = it->second; + } + + std::string worldName = TrimAscii(merged["level-name"]); + if (worldName.empty()) + { + worldName = "world"; + shouldWrite = true; + } + + std::string worldSaveId = TrimAscii(merged["level-id"]); + if (worldSaveId.empty()) + { + // If level-id is missing, derive it from level-name to lock save destination + worldSaveId = NormalizeSaveId(worldName); + shouldWrite = true; + } + else + { + // Normalize existing level-id as well to avoid future inconsistencies + std::string normalized = NormalizeSaveId(worldSaveId); + if (normalized != worldSaveId) + { + worldSaveId = normalized; + shouldWrite = true; + } + } + + merged["level-name"] = worldName; + merged["level-id"] = worldSaveId; + + config.worldName = Utf8ToWide(worldName.c_str()); + config.worldSaveId = worldSaveId; + + config.serverPort = ReadNormalizedIntProperty(&merged, "server-port", kDefaultServerPort, 1, 65535, &shouldWrite); + config.serverIp = ReadNormalizedStringProperty(&merged, "server-ip", "0.0.0.0", 255, &shouldWrite); + config.lanAdvertise = ReadNormalizedBoolProperty(&merged, kLanAdvertisePropertyKey, false, &shouldWrite); + config.whiteListEnabled = ReadNormalizedBoolProperty(&merged, "white-list", false, &shouldWrite); + config.serverName = ReadNormalizedStringProperty(&merged, "server-name", "DedicatedServer", 16, &shouldWrite); + config.maxPlayers = ReadNormalizedIntProperty(&merged, "max-players", kDefaultMaxPlayers, 1, kMaxDedicatedPlayers, &shouldWrite); + config.seed = 0; + config.hasSeed = ReadNormalizedOptionalInt64Property(&merged, "level-seed", &config.seed, &shouldWrite); + config.logLevel = ReadNormalizedLogLevelProperty(&merged, "log-level", eServerLogLevel_Info, &shouldWrite); + config.autosaveIntervalSeconds = ReadNormalizedIntProperty(&merged, "autosave-interval", kDefaultAutosaveIntervalSeconds, 5, 3600, &shouldWrite); + + config.difficulty = ReadNormalizedIntProperty(&merged, "difficulty", 1, 0, 3, &shouldWrite); + config.gameMode = ReadNormalizedIntProperty(&merged, "gamemode", 0, 0, 1, &shouldWrite); + config.worldSize = ReadNormalizedWorldSizeProperty( + &merged, + "world-size", + e_worldSize_Classic, + &config.worldSizeChunks, + &config.worldHellScale, + &shouldWrite); + config.levelType = ReadNormalizedLevelTypeProperty(&merged, "level-type", &config.levelTypeFlat, &shouldWrite); + config.spawnProtectionRadius = ReadNormalizedIntProperty(&merged, "spawn-protection", 0, 0, 256, &shouldWrite); + config.generateStructures = ReadNormalizedBoolProperty(&merged, "generate-structures", true, &shouldWrite); + config.bonusChest = ReadNormalizedBoolProperty(&merged, "bonus-chest", false, &shouldWrite); + config.pvp = ReadNormalizedBoolProperty(&merged, "pvp", true, &shouldWrite); + config.trustPlayers = ReadNormalizedBoolProperty(&merged, "trust-players", true, &shouldWrite); + config.fireSpreads = ReadNormalizedBoolProperty(&merged, "fire-spreads", true, &shouldWrite); + config.tnt = ReadNormalizedBoolProperty(&merged, "tnt", true, &shouldWrite); + config.spawnAnimals = ReadNormalizedBoolProperty(&merged, "spawn-animals", true, &shouldWrite); + config.spawnNpcs = ReadNormalizedBoolProperty(&merged, "spawn-npcs", true, &shouldWrite); + config.spawnMonsters = ReadNormalizedBoolProperty(&merged, "spawn-monsters", true, &shouldWrite); + config.allowFlight = ReadNormalizedBoolProperty(&merged, "allow-flight", true, &shouldWrite); + config.allowNether = ReadNormalizedBoolProperty(&merged, "allow-nether", true, &shouldWrite); + config.friendsOfFriends = ReadNormalizedBoolProperty(&merged, "friends-of-friends", false, &shouldWrite); + config.gamertags = ReadNormalizedBoolProperty(&merged, "gamertags", true, &shouldWrite); + config.bedrockFog = ReadNormalizedBoolProperty(&merged, "bedrock-fog", true, &shouldWrite); + config.hostCanFly = ReadNormalizedBoolProperty(&merged, "host-can-fly", true, &shouldWrite); + config.hostCanChangeHunger = ReadNormalizedBoolProperty(&merged, "host-can-change-hunger", true, &shouldWrite); + config.hostCanBeInvisible = ReadNormalizedBoolProperty(&merged, "host-can-be-invisible", true, &shouldWrite); + config.disableSaving = ReadNormalizedBoolProperty(&merged, "disable-saving", false, &shouldWrite); + config.mobGriefing = ReadNormalizedBoolProperty(&merged, "mob-griefing", true, &shouldWrite); + config.keepInventory = ReadNormalizedBoolProperty(&merged, "keep-inventory", false, &shouldWrite); + config.doMobSpawning = ReadNormalizedBoolProperty(&merged, "do-mob-spawning", true, &shouldWrite); + config.doMobLoot = ReadNormalizedBoolProperty(&merged, "do-mob-loot", true, &shouldWrite); + config.doTileDrops = ReadNormalizedBoolProperty(&merged, "do-tile-drops", true, &shouldWrite); + config.naturalRegeneration = ReadNormalizedBoolProperty(&merged, "natural-regeneration", true, &shouldWrite); + config.doDaylightCycle = ReadNormalizedBoolProperty(&merged, "do-daylight-cycle", true, &shouldWrite); + + config.maxBuildHeight = ReadNormalizedIntProperty(&merged, "max-build-height", 256, 64, 256, &shouldWrite); + config.motd = ReadNormalizedStringProperty(&merged, "motd", "A Minecraft Server", 255, &shouldWrite); + + if (shouldWrite) + { + if (WriteServerPropertiesFile(kServerPropertiesPath, merged)) + { + LogWorldIO("wrote server.properties"); + } + else + { + LogWorldIO("failed to write server.properties"); + } + } + + return config; +} + +/** + * **Save World Identity While Preserving Other Keys** + * + * Saves world identity fields while preserving as many other settings as possible + * - Reads existing file and merges including unknown keys + * - Updates `level-name`, `level-id`, and `white-list` before writing back + * ワールド識別情報の保存処理 + */ +bool SaveServerPropertiesConfig(const ServerPropertiesConfig &config) +{ + std::unordered_map merged; + ApplyDefaultServerProperties(&merged); + + std::unordered_map loaded; + int parsedCount = 0; + if (ReadServerPropertiesFile(kServerPropertiesPath, &loaded, &parsedCount)) + { + for (std::unordered_map::const_iterator it = loaded.begin(); it != loaded.end(); ++it) + { + // Keep existing content so keys untouched by caller are not dropped + merged[it->first] = it->second; + } + } + + std::string worldName = TrimAscii(WideToUtf8(config.worldName)); + if (worldName.empty()) + { + worldName = "world"; // Default world name + } + + std::string worldSaveId = TrimAscii(config.worldSaveId); + if (worldSaveId.empty()) + { + worldSaveId = NormalizeSaveId(worldName); + } + else + { + worldSaveId = NormalizeSaveId(worldSaveId); + } + + merged["level-name"] = worldName; + merged["level-id"] = worldSaveId; + merged["white-list"] = BoolToString(config.whiteListEnabled); + + return WriteServerPropertiesFile(kServerPropertiesPath, merged); +} +} + diff --git a/Minecraft.Server/ServerProperties.h b/Minecraft.Server/ServerProperties.h new file mode 100644 index 00000000..3bb5aca8 --- /dev/null +++ b/Minecraft.Server/ServerProperties.h @@ -0,0 +1,105 @@ +#pragma once + +#include +#include "ServerLogger.h" + +namespace ServerRuntime +{ + /** + * `server.properties` + */ + struct ServerPropertiesConfig + { + /** world name `level-name` */ + std::wstring worldName; + /** world save id `level-id` */ + std::string worldSaveId; + + /** `server-port` */ + int serverPort; + /** `server-ip` */ + std::string serverIp; + /** `lan-advertise` */ + bool lanAdvertise; + /** `white-list` */ + bool whiteListEnabled; + /** `server-name` (max 16 chars at runtime) */ + std::string serverName; + /** `max-players` */ + int maxPlayers; + /** `level-seed` is explicitly set */ + bool hasSeed; + /** `level-seed` */ + __int64 seed; + /** `log-level` */ + EServerLogLevel logLevel; + /** `autosave-interval` (seconds) */ + int autosaveIntervalSeconds; + + /** host options / game settings */ + int difficulty; + int gameMode; + /** `world-size` preset (`classic` / `small` / `medium` / `large`) */ + int worldSize; + /** Overworld chunk width derived from `world-size` */ + int worldSizeChunks; + /** Nether scale derived from `world-size` */ + int worldHellScale; + bool levelTypeFlat; + /** `spawn-protection` radius in blocks (0 disables protection) */ + int spawnProtectionRadius; + bool generateStructures; + bool bonusChest; + bool pvp; + bool trustPlayers; + bool fireSpreads; + bool tnt; + bool spawnAnimals; + bool spawnNpcs; + bool spawnMonsters; + bool allowFlight; + bool allowNether; + bool friendsOfFriends; + bool gamertags; + bool bedrockFog; + bool hostCanFly; + bool hostCanChangeHunger; + bool hostCanBeInvisible; + bool disableSaving; + bool mobGriefing; + bool keepInventory; + bool doMobSpawning; + bool doMobLoot; + bool doTileDrops; + bool naturalRegeneration; + bool doDaylightCycle; + + /** other MinecraftServer runtime settings */ + int maxBuildHeight; + std::string levelType; + std::string motd; + }; + + /** + * server.properties loader + * + * - ファイル欠損時はデフォルト値で新規作成 + * - 必須キー不足時は補完して再保存 + * - `level-id` は保存先として安全な形式へ正規化 + * + * @return `WorldManager` が利用するワールド設定 + */ + ServerPropertiesConfig LoadServerPropertiesConfig(); + + /** + * server.properties saver + * + * - `level-name` と `level-id` を更新 + * - `white-list` を更新 + * - それ以外の既存キーは極力保持 + * + * @param config 保存するワールド識別情報と永続化対象設定 + * @return 書き込み成功時 `true` + */ + bool SaveServerPropertiesConfig(const ServerPropertiesConfig &config); +} diff --git a/Minecraft.Server/ServerShutdown.h b/Minecraft.Server/ServerShutdown.h new file mode 100644 index 00000000..302b1a55 --- /dev/null +++ b/Minecraft.Server/ServerShutdown.h @@ -0,0 +1,6 @@ +#pragma once + +namespace ServerRuntime +{ + void RequestDedicatedServerShutdown(); +} diff --git a/Minecraft.Server/Windows64/ServerMain.cpp b/Minecraft.Server/Windows64/ServerMain.cpp new file mode 100644 index 00000000..811334af --- /dev/null +++ b/Minecraft.Server/Windows64/ServerMain.cpp @@ -0,0 +1,733 @@ +#include "stdafx.h" + +#include "Common/App_Defines.h" +#include "Common/Network/GameNetworkManager.h" +#include "Input.h" +#include "Minecraft.h" +#include "MinecraftServer.h" +#include "..\Access\Access.h" +#include "..\Common\StringUtils.h" +#include "..\ServerLogger.h" +#include "..\ServerLogManager.h" +#include "..\ServerProperties.h" +#include "..\ServerShutdown.h" +#include "..\WorldManager.h" +#include "..\Console\ServerCli.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 "Common/UI/UI.h" + +#include "../../Minecraft.World/AABB.h" +#include "../../Minecraft.World/Vec3.h" +#include "../../Minecraft.World/IntCache.h" +#include "../../Minecraft.World/ChunkSource.h" +#include "../../Minecraft.World/TilePos.h" +#include "../../Minecraft.World/compression.h" +#include "../../Minecraft.World/OldChunkStorage.h" +#include "../../Minecraft.World/ConsoleSaveFileOriginal.h" +#include "../../Minecraft.World/net.minecraft.world.level.tile.h" +#include "../../Minecraft.World/Random.h" + +#include +#include +#include + +#include + +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; + int worldSize; + int worldSizeChunks; + int worldHellScale; + __int64 seed; + ServerRuntime::EServerLogLevel logLevel; + bool hasSeed; + bool showHelp; +}; + +static std::atomic g_shutdownRequested(false); +static const DWORD kDefaultAutosaveIntervalMs = 60 * 1000; +static const int kServerActionPad = 0; + +static bool IsShutdownRequested() +{ + return g_shutdownRequested.load(); +} + +namespace ServerRuntime +{ + void RequestDedicatedServerShutdown() + { + g_shutdownRequested.store(true); + } +} + +/** + * Calls Access::Shutdown automatically once dedicated access control was initialized successfully + * アクセス制御初期化後のShutdownを自動化する + */ +class AccessShutdownGuard +{ +public: + AccessShutdownGuard() + : m_active(false) + { + } + + void Activate() + { + m_active = true; + } + + ~AccessShutdownGuard() + { + if (m_active) + { + ServerRuntime::Access::Shutdown(); + } + } + +private: + bool m_active; +}; +static BOOL WINAPI ConsoleCtrlHandlerProc(DWORD ctrlType) +{ + switch (ctrlType) + { + case CTRL_C_EVENT: + case CTRL_BREAK_EVENT: + case CTRL_CLOSE_EVENT: + case CTRL_SHUTDOWN_EVENT: + ServerRuntime::RequestDedicatedServerShutdown(); + return TRUE; + default: + return FALSE; + } +} + +/** + * **Wait For Server Stopped Signal** + * + * Thread entry used during shutdown to wait until the network layer reports server stop completion + * 停止通知待機用の終了スレッド処理 + */ +static int WaitForServerStoppedThreadProc(void *) +{ + if (g_NetworkManager.ServerStoppedValid()) + { + g_NetworkManager.ServerStoppedWait(); + } + return 0; +} + +static void PrintUsage() +{ + ServerRuntime::LogInfo("usage", "Minecraft.Server.exe [options]"); + ServerRuntime::LogInfo("usage", " -port <1-65535> Listen TCP port (default: server.properties:server-port)"); + ServerRuntime::LogInfo("usage", " -ip Bind address (default: server.properties:server-ip)"); + ServerRuntime::LogInfo("usage", " -bind Alias of -ip"); + ServerRuntime::LogInfo("usage", " -name Host display name (max 16 chars, default: server.properties:server-name)"); + ServerRuntime::LogInfo("usage", " -maxplayers <1-8> Public slots (default: server.properties:max-players)"); + ServerRuntime::LogInfo("usage", " -seed World seed (overrides server.properties:level-seed)"); + ServerRuntime::LogInfo("usage", " -loglevel debug|info|warn|error (default: server.properties:log-level)"); + ServerRuntime::LogInfo("usage", " -help Show this help"); +} + +using ServerRuntime::LoadServerPropertiesConfig; +using ServerRuntime::LogError; +using ServerRuntime::LogErrorf; +using ServerRuntime::LogInfof; +using ServerRuntime::LogDebugf; +using ServerRuntime::LogStartupStep; +using ServerRuntime::LogWarn; +using ServerRuntime::LogWorldIO; +using ServerRuntime::SaveServerPropertiesConfig; +using ServerRuntime::SetServerLogLevel; +using ServerRuntime::ServerPropertiesConfig; +using ServerRuntime::TryParseServerLogLevel; +using ServerRuntime::StringUtils::WideToUtf8; +using ServerRuntime::BootstrapWorldForServer; +using ServerRuntime::eWorldBootstrap_CreatedNew; +using ServerRuntime::eWorldBootstrap_Failed; +using ServerRuntime::eWorldBootstrap_Loaded; +using ServerRuntime::WaitForWorldActionIdle; +using ServerRuntime::WorldBootstrapResult; + +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) + { + LogError("startup", "Invalid -port value."); + 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) + { + LogError("startup", "Invalid -maxplayers value."); + return false; + } + config->maxPlayers = maxPlayers; + } + else if ((_stricmp(arg, "-seed") == 0) && (i + 1 < argc)) + { + if (!ParseInt64Arg(argv[++i], &config->seed)) + { + LogError("startup", "Invalid -seed value."); + return false; + } + config->hasSeed = true; + } + else if ((_stricmp(arg, "-loglevel") == 0) && (i + 1 < argc)) + { + if (!TryParseServerLogLevel(argv[++i], &config->logLevel)) + { + LogError("startup", "Invalid -loglevel value. Use debug/info/warn/error."); + return false; + } + } + else + { + LogErrorf("startup", "Unknown or incomplete argument: %s", 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); + } +} + +static void ApplyServerPropertiesToDedicatedConfig(const ServerPropertiesConfig &serverProperties, DedicatedServerConfig *config) +{ + if (config == NULL) + { + return; + } + + config->port = serverProperties.serverPort; + strncpy_s( + config->bindIP, + sizeof(config->bindIP), + serverProperties.serverIp.empty() ? "0.0.0.0" : serverProperties.serverIp.c_str(), + _TRUNCATE); + strncpy_s( + config->name, + sizeof(config->name), + serverProperties.serverName.empty() ? "DedicatedServer" : serverProperties.serverName.c_str(), + _TRUNCATE); + config->maxPlayers = serverProperties.maxPlayers; + config->worldSize = serverProperties.worldSize; + config->worldSizeChunks = serverProperties.worldSizeChunks; + config->worldHellScale = serverProperties.worldHellScale; + config->logLevel = serverProperties.logLevel; + config->hasSeed = serverProperties.hasSeed; + config->seed = serverProperties.seed; +} + +/** + * **Tick Core Async Subsystems** + * + * Advances core subsystems for one frame to keep async processing alive + * Call continuously even inside wait loops to avoid stalling storage/profile/network work + * 非同期進行維持のためのティック処理 + */ +static void TickCoreSystems() +{ + g_NetworkManager.DoWork(); + ProfileManager.Tick(); + StorageManager.Tick(); + ConsoleSaveFileOriginal::flushPendingBackgroundSave(); +} + +/** + * **Handle Queued XUI Server Action Once** + * + * Processes queued XUI/server action once + * XUIアクションの単発処理 + */ +static void HandleXuiActions() +{ + app.HandleXuiActions(); +} + +/** + * Dedicated Server Entory Point + * + * 主な責務: + * - プロセス/描画/ネットワークの初期化 + * - `WorldManager` によるワールドロードまたは新規作成 + * - メインループと定期オートセーブ実行 + * - 終了時の最終保存と各サブシステムの安全停止 + */ +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.worldSize = e_worldSize_Classic; + config.worldSizeChunks = LEVEL_WIDTH_CLASSIC; + config.worldHellScale = HELL_LEVEL_SCALE_CLASSIC; + config.seed = 0; + config.logLevel = ServerRuntime::eServerLogLevel_Info; + config.hasSeed = false; + config.showHelp = false; + + SetConsoleCtrlHandler(ConsoleCtrlHandlerProc, TRUE); + SetExeWorkingDirectory(); + + // Load base settings from server.properties, then override with CLI values when provided + ServerPropertiesConfig serverProperties = LoadServerPropertiesConfig(); + ApplyServerPropertiesToDedicatedConfig(serverProperties, &config); + + if (!ParseCommandLine(argc, argv, &config)) + { + PrintUsage(); + return 1; + } + if (config.showHelp) + { + PrintUsage(); + return 0; + } + + SetServerLogLevel(config.logLevel); + LogStartupStep("initializing process state"); + AccessShutdownGuard accessShutdownGuard; + + 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); + g_Win64DedicatedServer = true; + g_Win64DedicatedServerPort = config.port; + strncpy_s(g_Win64DedicatedServerBindIP, sizeof(g_Win64DedicatedServerBindIP), config.bindIP, _TRUNCATE); + g_Win64DedicatedServerLanAdvertise = serverProperties.lanAdvertise; + LogStartupStep("initializing server log manager"); + ServerRuntime::ServerLogManager::Initialize(); + LogStartupStep("initializing dedicated access control"); + if (!ServerRuntime::Access::Initialize(".", serverProperties.whiteListEnabled)) + { + LogError("startup", "Failed to initialize dedicated server access control."); + return 2; + } + accessShutdownGuard.Activate(); + LogInfof("startup", "LAN advertise: %s", serverProperties.lanAdvertise ? "enabled" : "disabled"); + LogInfof("startup", "Whitelist: %s", serverProperties.whiteListEnabled ? "enabled" : "disabled"); + LogInfof("startup", "Spawn protection radius: %d", serverProperties.spawnProtectionRadius); +#ifdef _LARGE_WORLDS + LogInfof( + "startup", + "World size preset: %d (xz=%d, hell-scale=%d)", + config.worldSize, + config.worldSizeChunks, + config.worldHellScale); +#endif + + LogStartupStep("registering hidden window class"); + HINSTANCE hInstance = GetModuleHandle(NULL); + MyRegisterClass(hInstance); + + LogStartupStep("creating hidden window"); + if (!InitInstance(hInstance, SW_HIDE)) + { + LogError("startup", "Failed to create window instance."); + + return 2; + } + ShowWindow(g_hWnd, SW_HIDE); + + LogStartupStep("initializing graphics device wrappers"); + if (FAILED(InitDevice())) + { + LogError("startup", "Failed to initialize D3D device."); + 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); + g_KBMInput.Init(); + 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) + { + LogError("startup", "Minecraft initialization failed."); + CleanupDevice(); + + return 3; + } + + app.InitGameSettings(); + + MinecraftServer::resetFlags(); + app.SetTutorialMode(false); + app.SetCorruptSaveDeleted(false); + app.SetGameHostOption(eGameHostOption_Difficulty, serverProperties.difficulty); + app.SetGameHostOption(eGameHostOption_FriendsOfFriends, serverProperties.friendsOfFriends ? 1 : 0); + app.SetGameHostOption(eGameHostOption_Gamertags, serverProperties.gamertags ? 1 : 0); + app.SetGameHostOption(eGameHostOption_BedrockFog, serverProperties.bedrockFog ? 1 : 0); + app.SetGameHostOption(eGameHostOption_GameType, serverProperties.gameMode); + app.SetGameHostOption(eGameHostOption_LevelType, serverProperties.levelTypeFlat ? 1 : 0); + app.SetGameHostOption(eGameHostOption_Structures, serverProperties.generateStructures ? 1 : 0); + app.SetGameHostOption(eGameHostOption_BonusChest, serverProperties.bonusChest ? 1 : 0); + app.SetGameHostOption(eGameHostOption_PvP, serverProperties.pvp ? 1 : 0); + app.SetGameHostOption(eGameHostOption_TrustPlayers, serverProperties.trustPlayers ? 1 : 0); + app.SetGameHostOption(eGameHostOption_FireSpreads, serverProperties.fireSpreads ? 1 : 0); + app.SetGameHostOption(eGameHostOption_TNT, serverProperties.tnt ? 1 : 0); + app.SetGameHostOption( + eGameHostOption_CheatsEnabled, + (serverProperties.hostCanFly || serverProperties.hostCanChangeHunger || serverProperties.hostCanBeInvisible) ? 1 : 0); + app.SetGameHostOption(eGameHostOption_HostCanFly, serverProperties.hostCanFly ? 1 : 0); + app.SetGameHostOption(eGameHostOption_HostCanChangeHunger, serverProperties.hostCanChangeHunger ? 1 : 0); + app.SetGameHostOption(eGameHostOption_HostCanBeInvisible, serverProperties.hostCanBeInvisible ? 1 : 0); + app.SetGameHostOption(eGameHostOption_DisableSaving, serverProperties.disableSaving ? 1 : 0); + app.SetGameHostOption(eGameHostOption_MobGriefing, serverProperties.mobGriefing ? 1 : 0); + app.SetGameHostOption(eGameHostOption_KeepInventory, serverProperties.keepInventory ? 1 : 0); + app.SetGameHostOption(eGameHostOption_DoMobSpawning, serverProperties.doMobSpawning ? 1 : 0); + app.SetGameHostOption(eGameHostOption_DoMobLoot, serverProperties.doMobLoot ? 1 : 0); + app.SetGameHostOption(eGameHostOption_DoTileDrops, serverProperties.doTileDrops ? 1 : 0); + app.SetGameHostOption(eGameHostOption_NaturalRegeneration, serverProperties.naturalRegeneration ? 1 : 0); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle, serverProperties.doDaylightCycle ? 1 : 0); +#ifdef _LARGE_WORLDS + app.SetGameHostOption(eGameHostOption_WorldSize, serverProperties.worldSize); + // Apply desired target size for loading existing worlds. + // Expansion happens only when target size is larger than current level size. + app.SetGameNewWorldSize(serverProperties.worldSizeChunks, true); + app.SetGameNewHellScale(serverProperties.worldHellScale); +#endif + + StorageManager.SetSaveDisabled(serverProperties.disableSaving); + // Read world name and fixed save-id from server.properties + // Delegate load-vs-create decision to WorldManager + std::wstring targetWorldName = serverProperties.worldName; + if (targetWorldName.empty()) + { + targetWorldName = L"world"; // Default world name + } + WorldBootstrapResult worldBootstrap = BootstrapWorldForServer(serverProperties, kServerActionPad, &TickCoreSystems); + if (worldBootstrap.status == eWorldBootstrap_Loaded) + { + const std::string &loadedSaveFilename = worldBootstrap.resolvedSaveId; + if (!loadedSaveFilename.empty() && _stricmp(loadedSaveFilename.c_str(), serverProperties.worldSaveId.c_str()) != 0) + { + // Persist the actually loaded save-id back to config + // Keep lookup keys aligned for next startup + LogWorldIO("updating level-id to loaded save filename"); + serverProperties.worldSaveId = loadedSaveFilename; + if (!SaveServerPropertiesConfig(serverProperties)) + { + LogWorldIO("failed to persist updated level-id"); + } + } + } + else if (worldBootstrap.status == eWorldBootstrap_Failed) + { + LogErrorf("world-io", "Failed to load configured world \"%s\".", WideToUtf8(targetWorldName).c_str()); + WinsockNetLayer::Shutdown(); + g_NetworkManager.Terminate(); + CleanupDevice(); + + return 4; + } + + NetworkGameInitData *param = new NetworkGameInitData(); + if (config.hasSeed) + { + param->seed = config.seed; + } + else + { + param->seed = (new Random())->nextLong(); + } +#ifdef _LARGE_WORLDS + param->xzSize = (unsigned int)config.worldSizeChunks; + param->hellScale = (unsigned char)config.worldHellScale; +#endif + param->saveData = worldBootstrap.saveData; + 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() && !IsShutdownRequested()) + { + TickCoreSystems(); + Sleep(10); + } + + startThread->WaitForCompletion(INFINITE); + int startupResult = startThread->GetExitCode(); + delete startThread; + + if (startupResult != 0) + { + LogErrorf("startup", "Failed to start dedicated server (code %d).", startupResult); + WinsockNetLayer::Shutdown(); + g_NetworkManager.Terminate(); + CleanupDevice(); + + return 4; + } + + LogStartupStep("server startup complete"); + LogInfof("startup", "Dedicated server listening on %s:%d", g_Win64MultiplayerIP, g_Win64MultiplayerPort); + if (worldBootstrap.status == eWorldBootstrap_CreatedNew && !IsShutdownRequested() && !app.m_bShutdown) + { + // Windows64 suppresses saveToDisc right after new world creation + // Dedicated Server explicitly runs the initial save here + LogWorldIO("requesting initial save for newly created world"); + WaitForWorldActionIdle(kServerActionPad, 5000, &TickCoreSystems, &HandleXuiActions); + app.SetXuiServerAction(kServerActionPad, eXuiServerAction_AutoSaveGame); + if (!WaitForWorldActionIdle(kServerActionPad, 30000, &TickCoreSystems, &HandleXuiActions)) + { + LogWorldIO("initial save timed out"); + LogWarn("world-io", "Timed out waiting for initial save action to finish."); + } + else + { + LogWorldIO("initial save completed"); + } + } + DWORD autosaveIntervalMs = kDefaultAutosaveIntervalMs; + if (serverProperties.autosaveIntervalSeconds > 0) + { + autosaveIntervalMs = (DWORD)(serverProperties.autosaveIntervalSeconds * 1000); + } + DWORD nextAutosaveTick = GetTickCount() + autosaveIntervalMs; + bool autosaveRequested = false; + ServerRuntime::ServerCli serverCli; + serverCli.Start(); + + while (!IsShutdownRequested() && !app.m_bShutdown) + { + TickCoreSystems(); + HandleXuiActions(); + serverCli.Poll(); + + if (IsShutdownRequested() || app.m_bShutdown) + { + break; + } + + if (autosaveRequested && app.GetXuiServerAction(kServerActionPad) == eXuiServerAction_Idle && !ConsoleSaveFileOriginal::hasPendingBackgroundSave()) + { + LogWorldIO("autosave completed"); + autosaveRequested = false; + } + + if (MinecraftServer::serverHalted()) + { + break; + } + + DWORD now = GetTickCount(); + if ((LONG)(now - nextAutosaveTick) >= 0) + { + if (app.GetXuiServerAction(kServerActionPad) == eXuiServerAction_Idle && !ConsoleSaveFileOriginal::hasPendingBackgroundSave()) + { + LogWorldIO("requesting autosave"); + app.SetXuiServerAction(kServerActionPad, eXuiServerAction_AutoSaveGame); + autosaveRequested = true; + } + nextAutosaveTick = now + autosaveIntervalMs; + } + + Sleep(10); + } + serverCli.Stop(); + app.m_bShutdown = true; + + LogInfof("shutdown", "Dedicated server stopped"); + MinecraftServer *server = MinecraftServer::getInstance(); + if (server != NULL && !ConsoleSaveFileOriginal::hasPendingBackgroundSave()) + { + server->setSaveOnExit(true); + LogWorldIO("requesting save before shutdown"); + LogWorldIO("using saveOnExit for shutdown"); + } + + if (ConsoleSaveFileOriginal::hasPendingBackgroundSave()) + { + LogWorldIO("Waiting for autosave to complete..."); + } + + MinecraftServer::HaltServer(); + + if (g_NetworkManager.ServerStoppedValid()) + { + C4JThread waitThread(&WaitForServerStoppedThreadProc, NULL, "WaitServerStopped"); + waitThread.Run(); + while (waitThread.isRunning()) + { + TickCoreSystems(); + Sleep(10); + } + waitThread.WaitForCompletion(INFINITE); + } + + while (ConsoleSaveFileOriginal::hasPendingBackgroundSave()) + { + TickCoreSystems(); + Sleep(10); + } + + LogInfof("shutdown", "Cleaning up and exiting."); + WinsockNetLayer::Shutdown(); + LogDebugf("shutdown", "Network layer shutdown complete."); + g_NetworkManager.Terminate(); + LogDebugf("shutdown", "Network manager terminated."); + ServerRuntime::ServerLogManager::Shutdown(); + CleanupDevice(); + + + return 0; +} + diff --git a/Minecraft.Server/WorldManager.cpp b/Minecraft.Server/WorldManager.cpp new file mode 100644 index 00000000..b9ec3dd9 --- /dev/null +++ b/Minecraft.Server/WorldManager.cpp @@ -0,0 +1,641 @@ +#include "stdafx.h" + +#include "WorldManager.h" + +#include "Minecraft.h" +#include "MinecraftServer.h" +#include "ServerLogger.h" +#include "Common\\StringUtils.h" + +#include +#include + +namespace ServerRuntime +{ +using StringUtils::Utf8ToWide; +using StringUtils::WideToUtf8; + +enum EWorldSaveLoadResult +{ + eWorldSaveLoad_Loaded, + eWorldSaveLoad_NotFound, + eWorldSaveLoad_Failed +}; + +struct SaveInfoQueryContext +{ + bool done; + bool success; + SAVE_DETAILS *details; + + SaveInfoQueryContext() + : done(false) + , success(false) + , details(NULL) + { + } +}; + +struct SaveDataLoadContext +{ + bool done; + bool isCorrupt; + bool isOwner; + + SaveDataLoadContext() + : done(false) + , isCorrupt(true) + , isOwner(false) + { + } +}; + +/** + * **Apply Save ID To StorageManager** + * + * Applies the configured save destination ID (`level-id`) to `StorageManager` + * - Re-applies the same ID at startup and before save to avoid destination drift + * - Ignores empty values as invalid + * - For some reason, a date-based world file occasionally appears after a debug build, but the cause is unknown. + * 保存先IDの適用処理 + * + * @param saveFilename Normalized save destination ID + */ +static void SetStorageSaveUniqueFilename(const std::string &saveFilename) +{ + if (saveFilename.empty()) + { + return; + } + + char filenameBuffer[64] = {}; + strncpy_s(filenameBuffer, sizeof(filenameBuffer), saveFilename.c_str(), _TRUNCATE); + StorageManager.SetSaveUniqueFilename(filenameBuffer); +} + +static void LogSaveFilename(const char *prefix, const std::string &saveFilename) +{ + LogInfof("world-io", "%s: %s", (prefix != NULL) ? prefix : "save-filename", saveFilename.c_str()); +} + +/** + * Verifies a directory exists and creates it when missing + * - Treats an existing non-directory path as failure + * - Returns whether the directory had to be created + * ディレクトリ存在保証の補助処理 + */ +static bool EnsureDirectoryExists(const std::wstring &directoryPath, bool *outCreated) +{ + if (outCreated != NULL) + { + *outCreated = false; + } + if (directoryPath.empty()) + { + return false; + } + + DWORD attrs = GetFileAttributesW(directoryPath.c_str()); + if (attrs != INVALID_FILE_ATTRIBUTES) + { + if ((attrs & FILE_ATTRIBUTE_DIRECTORY) != 0) + { + return true; + } + + LogErrorf("world-io", "path exists but is not a directory: %s", WideToUtf8(directoryPath).c_str()); + return false; + } + + if (CreateDirectoryW(directoryPath.c_str(), NULL)) + { + if (outCreated != NULL) + { + *outCreated = true; + } + return true; + } + + DWORD error = GetLastError(); + if (error == ERROR_ALREADY_EXISTS) + { + attrs = GetFileAttributesW(directoryPath.c_str()); + if (attrs != INVALID_FILE_ATTRIBUTES && ((attrs & FILE_ATTRIBUTE_DIRECTORY) != 0)) + { + return true; + } + } + + LogErrorf( + "world-io", + "failed to create directory %s (error=%lu)", + WideToUtf8(directoryPath).c_str(), + (unsigned long)error); + return false; +} + +/** + * Prepares the save root used by the Windows64 storage layout + * - Creates `Windows64` first because `CreateDirectoryW` is not recursive + * - Creates `Windows64\\GameHDD` when missing before world bootstrap starts + * Windows64用保存先ディレクトリの存在保証 + */ +static bool EnsureGameHddRootExists() +{ + bool windows64Created = false; + if (!EnsureDirectoryExists(L"Windows64", &windows64Created)) + { + return false; + } + + bool gameHddCreated = false; + if (!EnsureDirectoryExists(L"Windows64\\GameHDD", &gameHddCreated)) + { + return false; + } + + if (windows64Created || gameHddCreated) + { + LogWorldIO("created missing Windows64\\GameHDD storage directories"); + } + + return true; +} + +static void LogEnumeratedSaveInfo(int index, const SAVE_INFO &saveInfo) +{ + std::wstring title = Utf8ToWide(saveInfo.UTF8SaveTitle); + std::wstring filename = Utf8ToWide(saveInfo.UTF8SaveFilename); + std::string titleUtf8 = WideToUtf8(title); + std::string filenameUtf8 = WideToUtf8(filename); + + char logLine[512] = {}; + sprintf_s( + logLine, + sizeof(logLine), + "save[%d] title=\"%s\" filename=\"%s\"", + index, + titleUtf8.c_str(), + filenameUtf8.c_str()); + LogDebug("world-io", logLine); +} + +/** + * **Save List Callback** + * + * Captures async save-list results into `SaveInfoQueryContext` and marks completion for the waiter + * セーブ一覧取得の完了通知 + */ +static int GetSavesInfoCallbackProc(LPVOID lpParam, SAVE_DETAILS *pSaveDetails, const bool bRes) +{ + SaveInfoQueryContext *context = (SaveInfoQueryContext *)lpParam; + if (context != NULL) + { + context->details = pSaveDetails; + context->success = bRes; + context->done = true; + } + return 0; +} + +/** + * **Save Data Load Callback** + * + * Writes load results such as corruption status into `SaveDataLoadContext` + * セーブ読み込み結果の反映 + */ +static int LoadSaveDataCallbackProc(LPVOID lpParam, const bool bIsCorrupt, const bool bIsOwner) +{ + SaveDataLoadContext *context = (SaveDataLoadContext *)lpParam; + if (context != NULL) + { + context->isCorrupt = bIsCorrupt; + context->isOwner = bIsOwner; + context->done = true; + } + return 0; +} + +/** + * **Wait For Save List Completion** + * + * Waits until save-list retrieval completes + * - Prefers callback completion as the primary signal + * - Also falls back to polling because some environments populate `ReturnSavesInfo()` before callback + * セーブ一覧待機の補助処理 + * + * @return `true` when completion is detected + */ +static bool WaitForSaveInfoResult(SaveInfoQueryContext *context, DWORD timeoutMs, WorldManagerTickProc tickProc) +{ + DWORD start = GetTickCount(); + while ((GetTickCount() - start) < timeoutMs) + { + if (context->done) + { + return true; + } + + if (context->details == NULL) + { + // Some implementations fill ReturnSavesInfo before the callback + // Keep polling as a fallback instead of relying only on callback completion + SAVE_DETAILS *details = StorageManager.ReturnSavesInfo(); + if (details != NULL) + { + context->details = details; + context->success = true; + context->done = true; + return true; + } + } + + if (tickProc != NULL) + { + tickProc(); + } + Sleep(10); + } + + return context->done; +} + +/** + * **Wait For Save Data Load Completion** + * + * Waits for the save-data load callback to complete + * セーブ本体の読み込み待機 + * + * @return `true` when callback is reached, `false` on timeout + */ +static bool WaitForSaveLoadResult(SaveDataLoadContext *context, DWORD timeoutMs, WorldManagerTickProc tickProc) +{ + DWORD start = GetTickCount(); + while ((GetTickCount() - start) < timeoutMs) + { + if (context->done) + { + return true; + } + + if (tickProc != NULL) + { + tickProc(); + } + Sleep(10); + } + + return context->done; +} + +/** + * **Match SAVE_INFO By World Name** + * + * Compares both save title and save filename against the target world name + * ワールド名一致判定 + */ +static bool SaveInfoMatchesWorldName(const SAVE_INFO &saveInfo, const std::wstring &targetWorldName) +{ + if (targetWorldName.empty()) + { + return false; + } + + std::wstring saveTitle = Utf8ToWide(saveInfo.UTF8SaveTitle); + std::wstring saveFilename = Utf8ToWide(saveInfo.UTF8SaveFilename); + + if (!saveTitle.empty() && (_wcsicmp(saveTitle.c_str(), targetWorldName.c_str()) == 0)) + { + return true; + } + if (!saveFilename.empty() && (_wcsicmp(saveFilename.c_str(), targetWorldName.c_str()) == 0)) + { + return true; + } + + return false; +} + +/** + * **Match SAVE_INFO By Save Filename** + * + * Checks whether `SAVE_INFO` matches by save destination ID (`UTF8SaveFilename`) + * 保存先ID一致判定 + */ +static bool SaveInfoMatchesSaveFilename(const SAVE_INFO &saveInfo, const std::string &targetSaveFilename) +{ + if (targetSaveFilename.empty() || saveInfo.UTF8SaveFilename[0] == 0) + { + return false; + } + + return (_stricmp(saveInfo.UTF8SaveFilename, targetSaveFilename.c_str()) == 0); +} + +/** + * **Apply World Identity To Storage** + * + * Applies world identity (`level-name` + `level-id`) to storage + * - Always sets both display name and ID to avoid partial configuration + * - Helps prevent unintended new save destinations across environment differences + * 保存先と表示名の同期処理 + */ +static void ApplyWorldStorageTarget(const std::wstring &worldName, const std::string &saveId) +{ + // Set both title (display name) and save ID (actual folder name) explicitly + // Setting only one side can create unexpected new save targets in some environments + StorageManager.SetSaveTitle(worldName.c_str()); + SetStorageSaveUniqueFilename(saveId); +} + +/** + * **Prepare World Save Data For Startup** + * + * Searches for a save matching the target world and extracts startup payload when found + * Match priority: + * 1. Exact match by `level-id` (`UTF8SaveFilename`) + * 2. Fallback match by `level-name` against title or filename + * ワールド一致セーブの探索処理 + * + * @return + * - `eWorldSaveLoad_Loaded`: Existing save loaded successfully + * - `eWorldSaveLoad_NotFound`: No matching save found + * - `eWorldSaveLoad_Failed`: API failure, corruption, or invalid data + */ +static EWorldSaveLoadResult PrepareWorldSaveData( + const std::wstring &targetWorldName, + const std::string &targetSaveFilename, + int actionPad, + WorldManagerTickProc tickProc, + LoadSaveDataThreadParam **outSaveData, + std::string *outResolvedSaveFilename) +{ + if (outSaveData == NULL) + { + return eWorldSaveLoad_Failed; + } + *outSaveData = NULL; + if (outResolvedSaveFilename != NULL) + { + outResolvedSaveFilename->clear(); + } + + LogWorldIO("enumerating saves for configured world"); + StorageManager.ClearSavesInfo(); + + SaveInfoQueryContext infoContext; + int infoState = StorageManager.GetSavesInfo(actionPad, &GetSavesInfoCallbackProc, &infoContext, "save"); + if (infoState == C4JStorage::ESaveGame_Idle) + { + infoContext.done = true; + infoContext.success = true; + infoContext.details = StorageManager.ReturnSavesInfo(); + } + else if (infoState != C4JStorage::ESaveGame_GetSavesInfo) + { + LogWorldIO("GetSavesInfo failed to start"); + return eWorldSaveLoad_Failed; + } + + if (!WaitForSaveInfoResult(&infoContext, 10000, tickProc)) + { + LogWorldIO("timed out waiting for save list"); + return eWorldSaveLoad_Failed; + } + + if (infoContext.details == NULL) + { + infoContext.details = StorageManager.ReturnSavesInfo(); + } + if (infoContext.details == NULL) + { + LogWorldIO("failed to retrieve save list"); + return eWorldSaveLoad_Failed; + } + + int matchedIndex = -1; + if (!targetSaveFilename.empty()) + { + // 1) If save ID is provided, search by it first + // This is the most stable way to reuse the same world target + for (int i = 0; i < infoContext.details->iSaveC; ++i) + { + LogEnumeratedSaveInfo(i, infoContext.details->SaveInfoA[i]); + if (SaveInfoMatchesSaveFilename(infoContext.details->SaveInfoA[i], targetSaveFilename)) + { + matchedIndex = i; + break; + } + } + } + + if (matchedIndex < 0 && targetSaveFilename.empty()) + { + for (int i = 0; i < infoContext.details->iSaveC; ++i) + { + LogEnumeratedSaveInfo(i, infoContext.details->SaveInfoA[i]); + } + } + + for (int i = 0; i < infoContext.details->iSaveC; ++i) + { + // 2) If no save matched by ID, try compatibility fallback + // Match worldName against save title or save filename + if (matchedIndex >= 0) + { + break; + } + if (SaveInfoMatchesWorldName(infoContext.details->SaveInfoA[i], targetWorldName)) + { + matchedIndex = i; + break; + } + } + + if (matchedIndex < 0) + { + LogWorldIO("no save matched configured world name"); + return eWorldSaveLoad_NotFound; + } + + std::wstring matchedTitle = Utf8ToWide(infoContext.details->SaveInfoA[matchedIndex].UTF8SaveTitle); + if (matchedTitle.empty()) + { + matchedTitle = targetWorldName; + } + LogWorldName("matched save title", matchedTitle); + SAVE_INFO *matchedSaveInfo = &infoContext.details->SaveInfoA[matchedIndex]; + std::wstring matchedFilename = Utf8ToWide(matchedSaveInfo->UTF8SaveFilename); + if (!matchedFilename.empty()) + { + LogWorldName("matched save filename", matchedFilename); + } + + ApplyWorldStorageTarget(targetWorldName, targetSaveFilename); + + std::string resolvedSaveFilename; + if (matchedSaveInfo->UTF8SaveFilename[0] != 0) + { + // Prefer the save ID that was actually matched, then keep using it for future saves + resolvedSaveFilename = matchedSaveInfo->UTF8SaveFilename; + SetStorageSaveUniqueFilename(resolvedSaveFilename); + } + else if (!targetSaveFilename.empty()) + { + resolvedSaveFilename = targetSaveFilename; + } + + if (outResolvedSaveFilename != NULL) + { + *outResolvedSaveFilename = resolvedSaveFilename; + } + + SaveDataLoadContext loadContext; + int loadState = StorageManager.LoadSaveData(matchedSaveInfo, &LoadSaveDataCallbackProc, &loadContext); + if (loadState != C4JStorage::ESaveGame_Load && loadState != C4JStorage::ESaveGame_Idle) + { + LogWorldIO("LoadSaveData failed to start"); + return eWorldSaveLoad_Failed; + } + + if (loadState == C4JStorage::ESaveGame_Load) + { + if (!WaitForSaveLoadResult(&loadContext, 15000, tickProc)) + { + LogWorldIO("timed out waiting for save data load"); + return eWorldSaveLoad_Failed; + } + if (loadContext.isCorrupt) + { + LogWorldIO("target save is corrupt; aborting load"); + return eWorldSaveLoad_Failed; + } + } + + unsigned int saveSize = StorageManager.GetSaveSize(); + if (saveSize == 0) + { + // Treat zero-byte payload as failure even when load API reports success + LogWorldIO("loaded save has zero size"); + return eWorldSaveLoad_Failed; + } + + byteArray loadedSaveData(saveSize, false); + unsigned int loadedSize = saveSize; + StorageManager.GetSaveData(loadedSaveData.data, &loadedSize); + if (loadedSize == 0) + { + LogWorldIO("failed to copy loaded save data from storage manager"); + return eWorldSaveLoad_Failed; + } + + *outSaveData = new LoadSaveDataThreadParam(loadedSaveData.data, loadedSize, matchedTitle); + LogWorldIO("prepared save data payload for server startup"); + return eWorldSaveLoad_Loaded; +} + +/** + * **Bootstrap World State For Server Startup** + * + * Determines final world startup state + * - Returns loaded save data when an existing save is found + * - Prepares a new world context when not found + * - Returns `Failed` when startup should be aborted + * サーバー起動時のワールド確定処理 + */ +WorldBootstrapResult BootstrapWorldForServer( + const ServerPropertiesConfig &config, + int actionPad, + WorldManagerTickProc tickProc) +{ + WorldBootstrapResult result; + if (!EnsureGameHddRootExists()) + { + LogWorldIO("failed to prepare Windows64\\GameHDD storage root"); + return result; + } + + std::wstring targetWorldName = config.worldName; + std::string targetSaveFilename = config.worldSaveId; + if (targetWorldName.empty()) + { + targetWorldName = L"world"; + } + + LogWorldName("configured level-name", targetWorldName); + if (!targetSaveFilename.empty()) + { + LogSaveFilename("configured level-id", targetSaveFilename); + } + + ApplyWorldStorageTarget(targetWorldName, targetSaveFilename); + + std::string loadedSaveFilename; + EWorldSaveLoadResult worldLoadResult = PrepareWorldSaveData( + targetWorldName, + targetSaveFilename, + actionPad, + tickProc, + &result.saveData, + &loadedSaveFilename); + if (worldLoadResult == eWorldSaveLoad_Loaded) + { + result.status = eWorldBootstrap_Loaded; + result.resolvedSaveId = loadedSaveFilename; + LogStartupStep("loading configured world from save data"); + } + else if (worldLoadResult == eWorldSaveLoad_NotFound) + { + // Create a new context only when no matching save exists + // Fix saveId here so the next startup writes to the same location + result.status = eWorldBootstrap_CreatedNew; + result.resolvedSaveId = targetSaveFilename; + LogStartupStep("configured world not found; creating new world"); + LogWorldIO("creating new world save context"); + StorageManager.ResetSaveData(); + ApplyWorldStorageTarget(targetWorldName, targetSaveFilename); + } + else + { + result.status = eWorldBootstrap_Failed; + } + + return result; +} + +/** + * **Wait Until Server XUI Action Is Idle** + * + * Keeps tick/handle running during save action so async processing does not stall + * XUIアクション待機中の進行維持処理 + */ +bool WaitForWorldActionIdle( + int actionPad, + DWORD timeoutMs, + WorldManagerTickProc tickProc, + WorldManagerHandleActionsProc handleActionsProc) +{ + DWORD start = GetTickCount(); + while (app.GetXuiServerAction(actionPad) != eXuiServerAction_Idle && !MinecraftServer::serverHalted()) + { + // Keep network and storage progressing while waiting + // If this stops, save action itself may stall and time out + if (tickProc != NULL) + { + tickProc(); + } + if (handleActionsProc != NULL) + { + handleActionsProc(); + } + if ((GetTickCount() - start) >= timeoutMs) + { + return false; + } + Sleep(10); + } + + return (app.GetXuiServerAction(actionPad) == eXuiServerAction_Idle); +} +} + diff --git a/Minecraft.Server/WorldManager.h b/Minecraft.Server/WorldManager.h new file mode 100644 index 00000000..a4a8e77b --- /dev/null +++ b/Minecraft.Server/WorldManager.h @@ -0,0 +1,92 @@ +#pragma once + +#include +#include + +#include "ServerProperties.h" + +struct _LoadSaveDataThreadParam; +typedef struct _LoadSaveDataThreadParam LoadSaveDataThreadParam; + +namespace ServerRuntime +{ + /** Tick callback used while waiting on async storage/network work */ + typedef void (*WorldManagerTickProc)(); + /** Optional action handler used while waiting for server actions */ + typedef void (*WorldManagerHandleActionsProc)(); + + /** + * **World Bootstrap Status** + * + * Result type for world startup preparation, either loading an existing world or creating a new one + * ワールド起動準備の結果種別 + */ + enum EWorldBootstrapStatus + { + /** Found and loaded an existing world */ + eWorldBootstrap_Loaded, + /** No matching save was found, created a new world context */ + eWorldBootstrap_CreatedNew, + /** Bootstrap failed and server startup should be aborted */ + eWorldBootstrap_Failed + }; + + /** + * **World Bootstrap Result** + * + * Output payload returned by world startup preparation + * ワールド起動準備の出力データ + */ + struct WorldBootstrapResult + { + /** Bootstrap status */ + EWorldBootstrapStatus status; + /** Save data used for server initialization, `NULL` when creating a new world */ + LoadSaveDataThreadParam *saveData; + /** Save ID that was actually selected */ + std::string resolvedSaveId; + + WorldBootstrapResult() + : status(eWorldBootstrap_Failed) + , saveData(NULL) + { + } + }; + + /** + * **Bootstrap Target World For Server Startup** + * + * Resolves whether the target world should be loaded from an existing save or created as new + * - Applies `level-name` and `level-id` from `server.properties` + * - Loads when a matching save exists + * - Creates a new world context only when no save matches + * サーバー起動時のロードか新規作成かを確定する + * + * @param config Normalized `server.properties` values + * @param actionPad padId used by async storage APIs + * @param tickProc Tick callback run while waiting for async completion + * @return Bootstrap result including whether save data was loaded + */ + WorldBootstrapResult BootstrapWorldForServer( + const ServerPropertiesConfig &config, + int actionPad, + WorldManagerTickProc tickProc); + + /** + * **Wait Until Server Action Returns To Idle** + * + * Waits until server action state reaches `Idle` + * サーバーアクションの待機処理 + * + * @param actionPad padId to monitor + * @param timeoutMs Timeout in milliseconds + * @param tickProc Tick callback run inside the wait loop + * @param handleActionsProc Optional action handler callback + * @return `true` when `Idle` is reached before timeout + */ + bool WaitForWorldActionIdle( + int actionPad, + DWORD timeoutMs, + WorldManagerTickProc tickProc, + WorldManagerHandleActionsProc handleActionsProc); +} diff --git a/Minecraft.Server/cmake/sources/Common.cmake b/Minecraft.Server/cmake/sources/Common.cmake new file mode 100644 index 00000000..1eaceee1 --- /dev/null +++ b/Minecraft.Server/cmake/sources/Common.cmake @@ -0,0 +1,606 @@ +set(_MINECRAFT_SERVER_COMMON_ROOT + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/AbstractTexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/AchievementPopup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/AchievementScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/AllowAllCuller.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ArchiveFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ArrowRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BatModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BatRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BeaconRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BlazeModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BlazeRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BoatModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BoatRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BookModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BossMobGuiInfo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BreakingItemParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BubbleParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/BufferedImage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Button.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Camera.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/CaveSpiderRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ChatScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ChestModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ChestRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ChickenModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ChickenRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Chunk.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ClientConnection.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ClientConstants.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ClockTexture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Audio/SoundEngine.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Audio/SoundNames.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Colours/ColourTable.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/ConsoleGameMode.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Console_Utils.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Consoles_App.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCAudioFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCCapeFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCColourTableFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCGameRulesFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCGameRulesHeader.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCLocalisationFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCPack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCSkinFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCTextureFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/DLC/DLCUIDataFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/BiomeOverride.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/GameRule.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/GameRuleDefinition.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/GameRuleManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/LevelGenerators.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/LevelRules.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/LevelRuleset.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/StartFeature.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/UseTileRuleDefinition.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Leaderboards/LeaderboardManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Network/GameNetworkManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Telemetry/TelemetryManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Trial/TrialMode.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/AreaConstraint.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/AreaHint.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/AreaTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/ChoiceTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/ControllerTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/CraftTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/EffectChangedTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/FullTutorial.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/FullTutorialMode.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/InfoTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/InputConstraint.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/LookAtEntityHint.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/PickupTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/ProgressFlagTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/RideEntityTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/StatTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/TakeItemHint.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/Tutorial.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/TutorialHint.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/TutorialMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/TutorialMode.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/TutorialTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/UseItemTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/UseTileTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/Tutorial/XuiCraftingTask.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_BeaconMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_BrewingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_ContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_DispenserMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_FireworksMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_HUD.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_HopperMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_InventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_StartGame.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIBitmapFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIComponent_Chat.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIComponent_Logo.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIComponent_MenuBackground.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIComponent_Panorama.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_Base.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_BitmapIcon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_Button.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_ButtonList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_CheckBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_Cursor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_DLCList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_DynamicLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_HTMLLabel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_Label.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_LeaderboardList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_MinecraftHorse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_PlayerList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_Progress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_SaveList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_Slider.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_SlotList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_TextInput.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIControl_TexturePackList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIController.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIFontData.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIGroup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UILayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_BeaconMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_Credits.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_DebugCreateSchematic.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_DebugOptions.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_DebugOverlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_DebugSetCamera.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_DispenserMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_EULA.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_EnchantingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_EndPoem.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_FireworksMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_HUD.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_HopperMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_HorseInventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_Intro.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_Keyboard.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_LanguageSelector.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_MainMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_MessageBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_ReinstallMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_Timer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UIString.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/UI/UITTFFont.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/adler32.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/compress.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/crc32.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/deflate.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/gzclose.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/gzlib.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/gzread.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/gzwrite.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/infback.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/inffast.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/inflate.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/inftrees.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/trees.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/uncompr.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Common/zlib/zutil.c" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/CompassTexture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ConfirmScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ConsoleInput.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ControlsScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/CowModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/CowRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/CreateWorldScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/CreeperModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/CreeperRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/CritParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/CritParticle2.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Cube.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DLCTexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DeathScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DefaultRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DefaultTexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DemoUser.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DerivedServerLevel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DirtyChunkSorter.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DispenserBootstrap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DistanceChunkSorter.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DragonBreathParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DragonModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/DripParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EchantmentTableParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EditBox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EnchantTableRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EnderChestRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EnderCrystalModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EnderCrystalRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EnderDragonRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EnderParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EndermanModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EndermanRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EntityRenderDispatcher.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EntityRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EntityTileRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/EntityTracker.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ErrorScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ExperienceOrbRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ExplodeParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Extrax64Stubs.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/FallingTileRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/FileTexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/FireballRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/FireworksParticles.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/FishingHookRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/FlameParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/FolderTexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Font.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/FootstepParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Frustum.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/FrustumCuller.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/FrustumData.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/GameRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/GhastModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/GhastRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/GiantMobRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Gui.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/GuiComponent.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/GuiMessage.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/GuiParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/GuiParticles.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/HeartParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/HorseRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/HttpTexture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/HugeExplosionParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/HugeExplosionSeedParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/HumanoidMobRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/HumanoidModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/InBedChatScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Input.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ItemFrameRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ItemInHandRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ItemRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ItemSpriteRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/JoinMultiplayerScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/KeyMapping.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/LargeChestModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/LavaParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/LavaSlimeModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/LavaSlimeRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/LeashKnotModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/LeashKnotRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/LevelRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Lighting.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/LightningBoltRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/LivingEntityRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/LocalPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MemTexture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MemoryTracker.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MinecartModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MinecartRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MinecartSpawnerRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Minecraft.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MinecraftServer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Minimap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MobRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MobSkinMemTextureProcessor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MobSkinTextureProcessor.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MobSpawnerRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Model.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ModelHorse.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ModelPart.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MultiPlayerChunkCache.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MultiPlayerGameMode.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MultiPlayerLevel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MultiPlayerLocalPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/MushroomCowRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/NameEntryScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/NetherPortalParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/NoteParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/OcelotModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/OcelotRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/OffsettedRenderList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Options.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/OptionsScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PS3/PS3Extras/ShutdownManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PaintingRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Particle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ParticleEngine.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PauseScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PendingConnection.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PigModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PigRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PistonPieceRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PlayerChunkMap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PlayerCloudParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PlayerConnection.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PlayerList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PlayerRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Polygon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/PreStitchedTextureMap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ProgressRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/QuadrupedModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Rect2i.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/RedDustParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/RemotePlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/RenameWorldScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Screen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ScreenSizeCalculator.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ScrolledSelectionList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SelectWorldScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ServerChunkCache.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ServerCommandDispatcher.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ServerConnection.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ServerLevel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ServerLevelListener.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ServerPlayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ServerPlayerGameMode.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ServerScoreboard.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Settings.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SheepFurModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SheepModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SheepRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SignModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SignRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SilverfishModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SilverfishRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SimpleIcon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SkeletonHeadModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SkeletonModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SkeletonRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SkiModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SkullTileRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SlideButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SlimeModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SlimeRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SmallButton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SmokeParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SnowManModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SnowManRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SnowShovelParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SpellParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SpiderModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SpiderRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SplashParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SquidModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SquidRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/StatsCounter.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/StatsScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/StatsSyncher.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/StitchSlot.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/StitchedTexture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Stitcher.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/StringTable.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SuspendedParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/SuspendedTownParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TakeAnimationParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TeleportCommand.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TerrainParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Tesselator.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TexOffs.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Texture.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TextureAtlas.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TextureHolder.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TextureManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TextureMap.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TexturePack.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TexturePackRepository.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Textures.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TheEndPortalRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TileEntityRenderDispatcher.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TileEntityRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TileRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Timer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TitleScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TntMinecartRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TntRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/TrackedEntity.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/User.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Vertex.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/VideoSettingsScreen.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ViewportCuller.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/VillagerGolemModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/VillagerGolemRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/VillagerModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/VillagerRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/VillagerZombieModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/WaterDropParticle.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Iggy/gdraw/gdraw_d3d11.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/KeyboardMouseInput.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Leaderboards/WindowsLeaderboardManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Network/WinsockNetLayer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/PostProcesser.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Windows64_App.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Windows64_Minecraft.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Windows64/Windows64_UIController.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/WitchModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/WitchRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/WitherBossModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/WitherBossRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/WitherSkullRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/WolfModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/WolfRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/WstringLookup.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Xbox/MinecraftWindows.rc" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/Xbox/Network/NetworkPlayerXbox.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ZombieModel.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ZombieRenderer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/compat_shims.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/glWrapper.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/iob_shim.asm" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/stdafx.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/stubs.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.World/ConsoleSaveFileOriginal.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.World/ConsoleSaveFileOriginal.h" + "${CMAKE_CURRENT_SOURCE_DIR}/../include/lce_filesystem/lce_filesystem.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/ServerCliInput.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/ServerCliInput.h" +) +source_group("" FILES ${_MINECRAFT_SERVER_COMMON_ROOT}) + +set(_MINECRAFT_SERVER_COMMON_SERVER + "${CMAKE_CURRENT_SOURCE_DIR}/ServerLogManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerLogManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerLogger.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerLogger.h" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerProperties.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ServerProperties.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Windows64/ServerMain.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WorldManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/WorldManager.h" +) +source_group("Server" FILES ${_MINECRAFT_SERVER_COMMON_SERVER}) + +set(_MINECRAFT_SERVER_COMMON_SERVER_ACCESS + "${CMAKE_CURRENT_SOURCE_DIR}/Access/Access.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Access/Access.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Access/BanManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Access/BanManager.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Access/WhitelistManager.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Access/WhitelistManager.h" +) +source_group("Server/Access" FILES ${_MINECRAFT_SERVER_COMMON_SERVER_ACCESS}) + +set(_MINECRAFT_SERVER_COMMON_SERVER_COMMON + "${CMAKE_CURRENT_SOURCE_DIR}/Common/AccessStorageUtils.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/FileUtils.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/FileUtils.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/NetworkUtils.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/StringUtils.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Common/StringUtils.h" +) +source_group("Server/Common" FILES ${_MINECRAFT_SERVER_COMMON_SERVER_COMMON}) + +set(_MINECRAFT_SERVER_COMMON_SERVER_CONSOLE + "${CMAKE_CURRENT_SOURCE_DIR}/Console/ServerCli.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/ServerCli.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/ServerCliEngine.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/ServerCliEngine.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/ServerCliParser.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/ServerCliParser.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/ServerCliRegistry.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/ServerCliRegistry.h" +) +source_group("Server/Console" FILES ${_MINECRAFT_SERVER_COMMON_SERVER_CONSOLE}) + +set(_MINECRAFT_SERVER_COMMON_SERVER_CONSOLE_COMMANDS + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/CommandParsing.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/IServerCliCommand.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/ban-ip/CliCommandBanIp.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/ban-ip/CliCommandBanIp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/ban-list/CliCommandBanList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/ban-list/CliCommandBanList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/ban/CliCommandBan.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/ban/CliCommandBan.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/defaultgamemode/CliCommandDefaultGamemode.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/defaultgamemode/CliCommandDefaultGamemode.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/enchant/CliCommandEnchant.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/enchant/CliCommandEnchant.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/experience/CliCommandExperience.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/experience/CliCommandExperience.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/gamemode/CliCommandGamemode.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/gamemode/CliCommandGamemode.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/give/CliCommandGive.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/give/CliCommandGive.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/help/CliCommandHelp.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/help/CliCommandHelp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/kill/CliCommandKill.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/kill/CliCommandKill.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/list/CliCommandList.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/list/CliCommandList.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/pardon-ip/CliCommandPardonIp.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/pardon-ip/CliCommandPardonIp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/pardon/CliCommandPardon.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/pardon/CliCommandPardon.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/stop/CliCommandStop.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/stop/CliCommandStop.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/time/CliCommandTime.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/time/CliCommandTime.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/tp/CliCommandTp.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/tp/CliCommandTp.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/weather/CliCommandWeather.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/weather/CliCommandWeather.h" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/whitelist/CliCommandWhitelist.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/Console/commands/whitelist/CliCommandWhitelist.h" +) +source_group("Server/Console/Commands" FILES ${_MINECRAFT_SERVER_COMMON_SERVER_CONSOLE_COMMANDS}) + +set(_MINECRAFT_SERVER_COMMON_SERVER_VENDOR + "${CMAKE_CURRENT_SOURCE_DIR}/vendor/linenoise/linenoise.c" + "${CMAKE_CURRENT_SOURCE_DIR}/vendor/linenoise/linenoise.h" +) +source_group("Server/Vendor" FILES ${_MINECRAFT_SERVER_COMMON_SERVER_VENDOR}) + +set(MINECRAFT_SERVER_COMMON + ${_MINECRAFT_SERVER_COMMON_ROOT} + ${_MINECRAFT_SERVER_COMMON_SERVER} + ${_MINECRAFT_SERVER_COMMON_SERVER_ACCESS} + ${_MINECRAFT_SERVER_COMMON_SERVER_COMMON} + ${_MINECRAFT_SERVER_COMMON_SERVER_CONSOLE} + ${_MINECRAFT_SERVER_COMMON_SERVER_CONSOLE_COMMANDS} + ${_MINECRAFT_SERVER_COMMON_SERVER_VENDOR} +) diff --git a/Minecraft.Server/docs/DEVELOPMENT.en.md b/Minecraft.Server/docs/DEVELOPMENT.en.md new file mode 100644 index 00000000..5348f020 --- /dev/null +++ b/Minecraft.Server/docs/DEVELOPMENT.en.md @@ -0,0 +1,284 @@ +# Minecraft.Server Developer Guide (English) + +This document is for contributors who are new to `Minecraft.Server` and need a practical map for adding or modifying features safely. + +## 1. What This Server Does + +`Minecraft.Server` is the dedicated-server executable entry for this codebase. + +Core responsibilities: +- Switch the process working directory to the executable folder before relative file I/O +- Load, normalize, and repair `server.properties` +- Initialize dedicated runtime systems, connection logging, and access control +- Load or create the target world and keep `level-id` aligned with the actual save destination +- Run the dedicated main loop (network tick, XUI actions, autosave, CLI input) +- Maintain operator-facing access files such as `banned-players.json` and `banned-ips.json` +- Perform an initial save for newly created worlds and then shut down safely + +## 2. Important Files + +### Startup and Runtime +- `Windows64/ServerMain.cpp` + - `PrintUsage()` and `ParseCommandLine()` + - `SetExeWorkingDirectory()` + - Runtime setup and shutdown flow + - Initial save path for newly created worlds + - Main loop, autosave scheduler, and CLI polling + +### World Selection and Save Load +- `WorldManager.h` +- `WorldManager.cpp` + - Finds matching save by `level-id` first, then world-name fallback + - Applies storage title + save ID consistently + - Wait helpers for async storage/server action completion + +### Server Properties +- `ServerProperties.h` +- `ServerProperties.cpp` + - Default values and normalization ranges + - Parse/repair/write `server.properties` + - Exposes `ServerPropertiesConfig` + - `SaveServerPropertiesConfig()` rewrites `level-name`, `level-id`, and `white-list` + +### Access Control, Ban, and Whitelist Storage +- `Access/Access.h` +- `Access/Access.cpp` + - Process-wide access-control facade + - Published snapshot model used by console commands and login checks +- `Access/BanManager.h` +- `Access/BanManager.cpp` + - Reads/writes `banned-players.json` and `banned-ips.json` + - Normalizes identifiers and filters expired entries from snapshots +- `Access/WhitelistManager.h` +- `Access/WhitelistManager.cpp` + - Reads/writes `whitelist.json` + - Normalizes XUID-based whitelist entries used by login validation and CLI commands + +### Logging and Connection Audit +- `ServerLogger.h` +- `ServerLogger.cpp` + - Log level parsing + - Colored/timestamped console logs + - General categories such as `startup`, `world-io`, `console`, `access`, `network`, and `shutdown` +- `ServerLogManager.h` +- `ServerLogManager.cpp` + - Accepted/rejected TCP connection logs + - Login/disconnect audit logs + - Remote-IP cache used by `ban-ip ` + +### Console Command System +- `Console/ServerCli.cpp` (facade) +- `Console/ServerCliInput.cpp` (linenoise input thread + completion bridge) +- `Console/ServerCliParser.cpp` (tokenization, quoted args, completion context) +- `Console/ServerCliEngine.cpp` (dispatch, completion, helpers) +- `Console/ServerCliRegistry.cpp` (command registration + lookup) +- `Console/commands/*` (individual commands) + +## 3. End-to-End Startup Flow + +Main flow in `Windows64/ServerMain.cpp`: +1. `SetExeWorkingDirectory()` switches the current directory to the executable folder. +2. Load and normalize `server.properties` via `LoadServerPropertiesConfig()`. +3. Copy config into `DedicatedServerConfig`, then apply CLI overrides (`-port`, `-ip`/`-bind`, `-name`, `-maxplayers`, `-seed`, `-loglevel`, `-help`/`--help`/`-h`). +4. Initialize process state, `ServerLogManager`, and `Access::Initialize(".")`. +5. Initialize window/device/profile/network/thread-local systems. +6. Set host/game options from `ServerPropertiesConfig`. +7. Bootstrap world with `BootstrapWorldForServer(...)`. +8. If world bootstrap resolves a different normalized save ID, persist it with `SaveServerPropertiesConfig()`. +9. Start hosted game thread (`RunNetworkGameThreadProc`). +10. If a brand-new world was created, explicitly request one initial save. +11. Enter the main loop: + - `TickCoreSystems()` + - `HandleXuiActions()` + - `serverCli.Poll()` + - autosave scheduling +12. On shutdown: + - stop CLI input + - request save-on-exit / halt server + - wait for network shutdown completion + - terminate log, access, network, and device systems + +## 4. Current Operator Surface + +### 4.1 Launch Arguments +- `-port <1-65535>` +- `-ip ` or `-bind ` +- `-name ` (runtime max 16 chars) +- `-maxplayers <1-8>` +- `-seed ` +- `-loglevel ` +- `-help`, `--help`, `-h` + +Notes: +- CLI overrides affect only the current process. +- The only values currently written back by the server are `level-name` and `level-id`, and that happens when world bootstrap resolves identity changes. + +### 4.2 Built-in Console Commands +- `help` / `?` +- `stop` +- `list` +- `ban [reason ...]` + - currently requires the target player to be online +- `ban-ip [reason ...]` + - accepts a literal IPv4/IPv6 address or an online player's current remote IP +- `pardon ` +- `pardon-ip
` + - only accepts a literal address +- `banlist` +- `tp ` / `teleport` +- `gamemode [player]` / `gm` + +CLI behavior notes: +- Command parsing accepts both `cmd` and `/cmd`. +- Quoted arguments are supported by `ServerCliParser`. +- Completion is implemented per command via `Complete(...)`. + +### 4.3 Files Written Next to the Executable +- `server.properties` +- `banned-players.json` +- `banned-ips.json` + +This follows from `SetExeWorkingDirectory()`, so these files are resolved relative to `Minecraft.Server.exe`, not the shell directory you launched from. + +## 5. Common Development Tasks + +### 5.1 Add a New CLI Command + +Use this pattern when adding commands like `/kick`, `/time`, etc. + +1. Add files under `Console/commands/` + - `CliCommandYourCommand.h` + - `CliCommandYourCommand.cpp` +2. Implement `IServerCliCommand` + - `Name()`, `Usage()`, `Description()`, `Execute(...)` + - optional: `Aliases()` and `Complete(...)` +3. Register the command in `ServerCliEngine::RegisterDefaultCommands()`. +4. Add source/header to build definitions: + - `CMakeLists.txt` (`MINECRAFT_SERVER_SOURCES`) + - `Minecraft.Server/Minecraft.Server.vcxproj` (`` / ``) +5. Manual verify: + - command appears in `help` + - command executes correctly + - completion works for both `cmd` and `/cmd` + - quoted arguments behave as expected + +Implementation references: +- `CliCommandHelp.cpp` for a simple no-arg command +- `CliCommandTp.cpp` for multi-arg + completion + runtime checks +- `CliCommandGamemode.cpp` for argument parsing and aliases +- `CliCommandBanIp.cpp` for access-backed behavior with connection metadata + +### 5.2 Add or Change a `server.properties` Key + +1. Add/update the field in `ServerPropertiesConfig` (`ServerProperties.h`). +2. Add a default entry to `kServerPropertyDefaults` (`ServerProperties.cpp`). +3. Load and normalize the value in `LoadServerPropertiesConfig()`. + - Use existing helpers for bool/int/string/int64/log level/level type. +4. If this value should be written back, update `SaveServerPropertiesConfig()`. + - Note: today that function intentionally only persists world identity. +5. Apply it to runtime where needed: + - `ApplyServerPropertiesToDedicatedConfig(...)` + - host options in `ServerMain.cpp` (`app.SetGameHostOption(...)`) + - `PrintUsage()` / `ParseCommandLine()` if the key also gets a CLI override +6. Manual verify: + - missing key regeneration + - invalid value normalization + - clamped ranges still make sense + - runtime behavior reflects the new value + +Normalization details worth remembering: +- `level-id` is normalized to a safe save ID and length-limited. +- `server-name` is capped to 16 runtime chars. +- `max-players` is clamped to `1..8`. +- `autosave-interval` is clamped to `5..3600`. +- `level-type` normalizes to `default` or `flat`. + +### 5.3 Change Ban / Access Behavior + +Primary code lives in `Access/Access.cpp`, `Access/BanManager.cpp`, and `ServerLogManager.cpp`. + +When changing this area: +- Keep `BanManager` responsible for storage/caching, not live-network policy. +- Keep the clone-and-publish snapshot pattern in `Access.cpp` so readers never block on disk I/O. +- Remember that `ban-ip ` depends on `ServerLogManager::TryGetConnectionRemoteIp(...)`. +- Keep expired entries out of `SnapshotBannedPlayers()` / `SnapshotBannedIps()` output. +- Verify: + - clean boot creates empty ban files when missing + - `ban`, `ban-ip`, `pardon`, `pardon-ip`, and `banlist` still work + - online bans disconnect live targets immediately + - manual edits still reload safely if you later add or extend reload paths + +### 5.4 Change World Load/Create Behavior + +Primary code is in `WorldManager.cpp`. + +Current matching policy: +1. Match by `level-id` (`UTF8SaveFilename`) first. +2. Fall back to world-name match on title/file name. + +When changing this logic: +- Keep `ApplyWorldStorageTarget(...)` usage consistent (title + save ID together). +- Preserve periodic ticking in wait loops (`tickProc`) to avoid async deadlocks. +- Keep timeout/error logs specific enough for diagnosis. +- Verify: + - existing world is reused correctly + - no accidental new save directory creation + - shutdown save still succeeds + - newly created worlds still get the explicit initial save from `ServerMain.cpp` + +### 5.5 Add Logging for New Feature Work + +Use `ServerLogger` helpers: +- `LogDebug`, `LogInfo`, `LogWarn`, `LogError` +- formatted variants `LogDebugf`, `LogInfof`, etc. + +Use `ServerLogManager` when the event is specifically part of the transport/login/disconnect lifecycle. + +Recommended categories: +- `startup` for init/shutdown lifecycle +- `world-io` for save/world operations +- `console` for CLI command handling +- `access` for ban/access control state +- `network` for connection/login audit + +## 6. Build and Run + +From repository root: + +```powershell +cmake -S . -B build -G "Visual Studio 17 2022" -A x64 +cmake --build build --config Debug --target MinecraftServer +cd .\build\Debug +.\Minecraft.Server.exe -port 25565 -bind 0.0.0.0 -maxplayers 8 -name DedicatedServer +``` + +Notes: +- The process switches its working directory to the executable directory at startup. +- `server.properties`, `banned-players.json`, and `banned-ips.json` are therefore read/written next to the executable. +- For Visual Studio workflow, see root `COMPILE.md`. + +## 7. Safety Checklist Before Commit + +- the server starts without crash when `server.properties` is missing or sparse +- missing access files are recreated on a clean boot +- existing world loads by expected `level-id` +- new world creation still performs the explicit initial save +- CLI input and completion remain responsive +- `banlist` output stays sane after adding/removing bans +- no busy-wait path removed from async wait loops +- both CMake and `.vcxproj` include newly added source files + +## 8. Quick Troubleshooting + +- Unknown command: + - check `RegisterDefaultCommands()` and build-file entries +- `server.properties` or ban files seem to load from the wrong folder: + - remember `SetExeWorkingDirectory()` moves the working directory to the executable folder +- Autosave or shutdown save timing out: + - confirm wait loops still call `TickCoreSystems()` and `HandleXuiActions()` where required +- World not reused on restart: + - inspect `level-id` normalization and matching logic in `WorldManager.cpp` +- `ban-ip ` cannot resolve an address: + - confirm the player is currently online and `ServerLogManager` has a cached remote IP for that connection +- Settings not applied: + - confirm the value is loaded into `ServerPropertiesConfig`, optionally copied into `DedicatedServerConfig`, and then applied in `ServerMain.cpp` diff --git a/Minecraft.Server/docs/DEVELOPMENT.ja.md b/Minecraft.Server/docs/DEVELOPMENT.ja.md new file mode 100644 index 00000000..70d05aaa --- /dev/null +++ b/Minecraft.Server/docs/DEVELOPMENT.ja.md @@ -0,0 +1,286 @@ +# Minecraft.Server 開発ガイド (日本語) + +この文書は、`Minecraft.Server` に新しく入る開発者が、安全に機能追加や改修を行うための実践的な地図として使うことを想定しています + +## 1. このサーバーが担うこと + +`Minecraft.Server` は、このコードベースにおける専用サーバー実行ファイルのエントリーポイントです + +主な責務: +- 相対パスのファイル I/O を行う前に、カレントディレクトリを実行ファイルのあるフォルダへ切り替える +- `server.properties` を読み込み、正規化し、不足や不正値を補完する +- 専用サーバー向けランタイム、接続ログ、アクセス制御を初期化する +- 対象ワールドをロードまたは新規作成し、実際のセーブ先と `level-id` を整合させる +- 専用サーバーのメインループを回す (network tick, XUI actions, autosave, CLI input) +- `banned-players.json` や `banned-ips.json` など運用向けファイルを維持する +- 新規ワールドの初回保存を実行し、その後安全にシャットダウンする + +## 2. 重要ファイル + +### 起動とランタイム +- `Windows64/ServerMain.cpp` + - `PrintUsage()` と `ParseCommandLine()` + - `SetExeWorkingDirectory()` + - 起動/終了フロー + - 新規ワールド初回保存の経路 + - メインループ、オートセーブ、CLI ポーリング + +### ワールド選択とセーブ読込 +- `WorldManager.h` +- `WorldManager.cpp` + - `level-id` 優先、その後 world 名フォールバックでセーブ探索 + - storage title と save ID を常にセットで適用 + - 非同期 storage/server action 完了待ちの helper を提供 + +### サーバー設定 +- `ServerProperties.h` +- `ServerProperties.cpp` + - 既定値と正規化レンジ + - `server.properties` の読込/補修/書込 + - `ServerPropertiesConfig` の提供 + - `SaveServerPropertiesConfig()` は `level-name` / `level-id` / `white-list` を書き換える + +### アクセス制御と BAN / Whitelist 永続化 +- `Access/Access.h` +- `Access/Access.cpp` + - プロセス全体で使うアクセス制御 facade + - コンソールコマンドとログイン判定から参照される公開スナップショット管理 +- `Access/BanManager.h` +- `Access/BanManager.cpp` + - `banned-players.json` と `banned-ips.json` の読込/書込 + - 識別子の正規化と、期限切れエントリを除いた snapshot 出力 +- `Access/WhitelistManager.h` +- `Access/WhitelistManager.cpp` + - `whitelist.json` の読込/書込 + - ログイン判定と CLI で使う XUID whitelist の正規化管理 + +### ログと接続監査 +- `ServerLogger.h` +- `ServerLogger.cpp` + - ログレベル解釈 + - 色付き/タイムスタンプ付きコンソールログ + - `startup`, `world-io`, `console`, `access`, `network`, `shutdown` などのカテゴリ +- `ServerLogManager.h` +- `ServerLogManager.cpp` + - TCP 接続 accept/reject ログ + - ログイン/切断の監査ログ + - `ban-ip ` が使う remote IP キャッシュ + +### コンソールコマンドシステム +- `Console/ServerCli.cpp` (facade) +- `Console/ServerCliInput.cpp` (linenoise 入力スレッド + completion bridge) +- `Console/ServerCliParser.cpp` (トークン分解、クォート、補完コンテキスト) +- `Console/ServerCliEngine.cpp` (実行ディスパッチ、補完、共通ヘルパー) +- `Console/ServerCliRegistry.cpp` (登録と名前解決) +- `Console/commands/*` (各コマンド実装) + +## 3. 起動フロー全体 + +`Windows64/ServerMain.cpp` の主な流れ: +1. `SetExeWorkingDirectory()` でカレントディレクトリを実行ファイルのフォルダへ切り替える +2. `LoadServerPropertiesConfig()` で `server.properties` を読み込み、正規化する +3. `DedicatedServerConfig` へ反映したあと、CLI 引数で上書きする (`-port`, `-ip`/`-bind`, `-name`, `-maxplayers`, `-seed`, `-loglevel`, `-help`/`--help`/`-h`) +4. プロセス状態、`ServerLogManager`、`Access::Initialize(".")` を初期化する +5. window/device/profile/network/thread-local 系を初期化する +6. `ServerPropertiesConfig` をゲームホスト設定へ反映する +7. `BootstrapWorldForServer(...)` でワールドを決定する +8. 読み込まれたセーブ ID が正規化後に変わった場合は、`SaveServerPropertiesConfig()` で書き戻す +9. `RunNetworkGameThreadProc` でホストゲームスレッドを起動する +10. 新規ワールドが作成された場合は、専用サーバー側で明示的に初回保存を要求する +11. メインループに入る: + - `TickCoreSystems()` + - `HandleXuiActions()` + - `serverCli.Poll()` + - オートセーブスケジュール +12. 終了時: + - CLI 入力を停止 + - save-on-exit を要求してサーバー停止 + - ネットワーク停止完了を待機 + - ログ/アクセス制御/ネットワーク/デバイスを終了 + +## 4. 現在の運用インターフェース + +### 4.1 起動引数 +- `-port <1-65535>` +- `-ip ` または `-bind ` +- `-name ` (実行時上限 16 文字) +- `-maxplayers <1-8>` +- `-seed ` +- `-loglevel ` +- `-help`, `--help`, `-h` + +補足: +- CLI による上書きは、その起動中のプロセスにだけ効きます +- 現在サーバーが書き戻す値は `level-name` と `level-id` だけで、ワールド解決時に識別情報が変わった場合に限られます + +### 4.2 組み込みコンソールコマンド +- `help` / `?` +- `stop` +- `list` +- `ban [reason ...]` + - 現状では対象プレイヤーがオンラインである必要があります +- `ban-ip [reason ...]` + - リテラル IPv4/IPv6 か、オンラインプレイヤーの現在 IP を対象にできます +- `pardon ` +- `pardon-ip
` + - リテラルアドレスのみ受け付けます +- `banlist` +- `tp ` / `teleport` +- `gamemode [player]` / `gm` + +CLI 挙動の補足: +- `cmd` と `/cmd` の両方を受け付けます +- `ServerCliParser` により引用符付き引数を扱えます +- 補完は各コマンドの `Complete(...)` で実装します + +### 4.3 実行ファイル横に書かれるファイル +- `server.properties` +- `banned-players.json` +- `banned-ips.json` + +これは `SetExeWorkingDirectory()` による挙動ですつまり、これらのファイルはシェル上の起動場所ではなく `Minecraft.Server.exe` 基準で解決されます + +## 5. よくある開発作業 + +### 5.1 CLI コマンドを追加する + +`/kick` や `/time` のようなコマンド追加時の基本手順: + +1. `Console/commands/` にファイルを追加 + - `CliCommandYourCommand.h` + - `CliCommandYourCommand.cpp` +2. `IServerCliCommand` を実装 + - `Name()`, `Usage()`, `Description()`, `Execute(...)` + - 必要なら `Aliases()` と `Complete(...)` +3. `ServerCliEngine::RegisterDefaultCommands()` に登録する +4. ビルド定義に追加する + - `CMakeLists.txt` (`MINECRAFT_SERVER_SOURCES`) + - `Minecraft.Server/Minecraft.Server.vcxproj` (`` / ``) +5. 手動確認 + - `help` に表示される + - 実行結果が期待通り + - 補完が `cmd` と `/cmd` の両方で動く + - 引用符付き引数が期待通り処理される + +参考実装: +- `CliCommandHelp.cpp` (単純コマンド) +- `CliCommandTp.cpp` (複数引数 + 補完 + 実行時チェック) +- `CliCommandGamemode.cpp` (引数解釈 + エイリアス) +- `CliCommandBanIp.cpp` (接続メタデータを使うアクセス制御系コマンド) + +### 5.2 `server.properties` キーを追加/変更する + +1. `ServerProperties.h` の `ServerPropertiesConfig` にフィールドを追加/更新する +2. `ServerProperties.cpp` の `kServerPropertyDefaults` に既定値を追加する +3. `LoadServerPropertiesConfig()` で読み込みと正規化を実装する + - bool/int/string/int64/log level/level type 用の既存 helper を使う +4. 書き戻し対象にしたいなら `SaveServerPropertiesConfig()` を更新する + - ただし現状この関数は、意図的にワールド識別情報だけを永続化します +5. 実行時反映箇所を更新する: + - `ApplyServerPropertiesToDedicatedConfig(...)` + - `ServerMain.cpp` の `app.SetGameHostOption(...)` + - CLI 上書きも持たせるなら `PrintUsage()` / `ParseCommandLine()` +6. 手動確認: + - 欠損キーの自動補完 + - 不正値の正規化 + - clamp 範囲が妥当か + - 実行時挙動に反映されるか + +> 覚えておくと良い正規化ポイント +- `level-id` は安全な save ID に正規化され、長さ制限も掛かる +- `server-name` は実行時 16 文字まで +- `max-players` は `1..8` に clamp される(あとで増やす必要あり) +- `autosave-interval` は `5..3600` に clamp される +- `level-type` は `default` または `flat` に正規化される + +### 5.3 BAN / アクセス制御挙動を変更する + +主な実装は `Access/Access.cpp`, `Access/BanManager.cpp`, `ServerLogManager.cpp` にあります + +変更時の注意: +- `BanManager` は storage/caching に責務を寄せ、 live-network policy を持ち込みすぎない +- `Access.cpp` の clone-and-publish スナップショット方式を保ち、読取側がディスク I/O で止まらないようにする +- `ban-ip ` は `ServerLogManager::TryGetConnectionRemoteIp(...)` に依存することを忘れない +- `SnapshotBannedPlayers()` / `SnapshotBannedIps()` には期限切れエントリを混ぜない +- 確認項目: + - 欠損時に空の BAN ファイルが初回起動で生成される + - `ban`, `ban-ip`, `pardon`, `pardon-ip`, `banlist` が動く + - オンライン対象の BAN が即時切断まで到達する + - 将来 reload 経路を増やしても手動編集が安全に再読込できる + +### 5.4 ワールドロード/新規作成ロジックを変更する + +主な実装は `WorldManager.cpp` にあります + +現在の探索ポリシー: +1. `level-id` (`UTF8SaveFilename`) 完全一致を優先 +2. 失敗時に world 名一致へフォールバック + +変更時の注意: +- `ApplyWorldStorageTarget(...)` で title と save ID を常にセットで扱う +- 待機ループで `tickProc` を回し続ける + - これを止めると非同期進行が止まり、タイムアウトしやすくなる +- タイムアウトや失敗ログは具体的に残す +- 確認項目 + - 既存ワールドを正しく再利用できるか + - 意図しない新規セーブ先が増えていないか + - 終了時保存が成功するか + - 新規ワールド時の明示的初回保存が `ServerMain.cpp` から維持されているか + +### 5.5 ログを追加する + +`ServerLogger` の API を利用: +- `LogDebug`, `LogInfo`, `LogWarn`, `LogError` +- フォーマット付きは `LogDebugf`, `LogInfof` など + +transport/login/disconnect ライフサイクルに属するイベントなら `ServerLogManager` 側を使います + +推奨カテゴリ: +- `startup`: 起動ライフサイクル +- `shutdown`: 停止ライフサイクル +- `world-io`: ワールド/保存処理 +- `console`: CLI コマンド処理 +- `access`: BAN/アクセス制御状態 +- `network`: 接続/ログイン監査 + +## 6. ビルドと実行 + +リポジトリルートで実行: + +```powershell +cmake -S . -B build -G "Visual Studio 17 2022" -A x64 +cmake --build build --config Debug --target MinecraftServer +cd .\build\Debug +.\Minecraft.Server.exe -port 25565 -bind 0.0.0.0 -name DedicatedServer +``` + +補足: +- プロセスは起動時にカレントディレクトリを実行ファイルの場所へ切り替えます +- `server.properties`, `banned-players.json`, `banned-ips.json` はそのため実行ファイル横に読み書きされます +- Visual Studio ワークフローはルートの `COMPILE.md` を参照してください + +## 7. 変更前チェックリスト + +- `server.properties` が欠損または疎でもクラッシュせず起動できる +- 欠損したアクセス制御ファイルがクリーンブート時に再生成される +- 既存ワールドが期待した `level-id` でロードされる +- 新規ワールド作成時の明示的初回保存が維持される +- CLI 入力と補完が引き続き応答する +- `banlist` 出力が BAN 追加/解除後も破綻しない +- 非同期待機ループから `TickCoreSystems()` など busy-wait 防止用ティックを消していない +- 新規追加したソースが CMake と `.vcxproj` の両方に入っている + +## 8. クイックトラブルシュート + +- コマンドが認識されない: + - `RegisterDefaultCommands()` とビルド定義を確認する +- `server.properties` や BAN ファイルの読込先が想定と違う: + - `SetExeWorkingDirectory()` により実行ファイルのフォルダへ移動していることを確認する +- オートセーブ/終了時保存がタイムアウトする: + - 待機ループ内で `TickCoreSystems()` と `HandleXuiActions()` を回しているか確認する +- 再起動時に同じワールドを使わない: + - `level-id` の正規化と `WorldManager.cpp` の一致判定を確認する +- `ban-ip ` で IP を解決できない: + - 対象プレイヤーがオンラインで、`ServerLogManager` に接続 IP がキャッシュされているか確認する +- 設定変更が効かない: + - 値が `ServerPropertiesConfig` にロードされ、必要なら `DedicatedServerConfig` にコピーされ、その後 `ServerMain.cpp` で反映されているか確認する diff --git a/Minecraft.Server/vendor/linenoise/LICENSE b/Minecraft.Server/vendor/linenoise/LICENSE new file mode 100644 index 00000000..d7391566 --- /dev/null +++ b/Minecraft.Server/vendor/linenoise/LICENSE @@ -0,0 +1,25 @@ +This vendored component is based on the linenoise project idea/API. + +Copyright (c) 2010-2014, Salvatore Sanfilippo +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Minecraft.Server/vendor/linenoise/linenoise.c b/Minecraft.Server/vendor/linenoise/linenoise.c new file mode 100644 index 00000000..a5b8ac5f --- /dev/null +++ b/Minecraft.Server/vendor/linenoise/linenoise.c @@ -0,0 +1,649 @@ +#include "linenoise.h" + +#include +#include +#include +#include +#include +#include + +#define LINENOISE_MAX_LINE 4096 +#define LINENOISE_MAX_PROMPT 128 + +typedef struct linenoiseHistory { + char **items; + int len; + int cap; + int maxLen; +} linenoiseHistory; + +static linenoiseCompletionCallback *g_completionCallback = NULL; +static volatile LONG g_stopRequested = 0; +static linenoiseHistory g_history = { NULL, 0, 0, 128 }; +/* Guards redraw/log interleaving so prompt and log lines do not overlap. */ +static CRITICAL_SECTION g_ioLock; +static volatile LONG g_ioLockState = 0; /* 0=not init, 1=init in progress, 2=ready */ +/* Snapshot of current editor line used to restore prompt after external output. */ +static volatile LONG g_editorActive = 0; +static char g_editorPrompt[LINENOISE_MAX_PROMPT] = { 0 }; +static char g_editorBuf[LINENOISE_MAX_LINE] = { 0 }; +static int g_editorLen = 0; +static int g_editorPos = 0; +static int g_editorPrevLen = 0; + +/** + * Lazily initialize the console I/O critical section. + * This avoids static init order issues and keeps startup cost minimal. + */ +static void linenoiseEnsureIoLockInit(void) +{ + LONG state = InterlockedCompareExchange(&g_ioLockState, 0, 0); + if (state == 2) + return; + + if (state == 0 && InterlockedCompareExchange(&g_ioLockState, 1, 0) == 0) + { + InitializeCriticalSection(&g_ioLock); + InterlockedExchange(&g_ioLockState, 2); + return; + } + + while (InterlockedCompareExchange(&g_ioLockState, 0, 0) != 2) + { + Sleep(0); + } +} + +static void linenoiseLockIo(void) +{ + linenoiseEnsureIoLockInit(); + EnterCriticalSection(&g_ioLock); +} + +static void linenoiseUnlockIo(void) +{ + LeaveCriticalSection(&g_ioLock); +} + +/** + * Save current prompt/buffer/cursor state for later redraw. + * Called after each redraw while editor is active. + */ +static void linenoiseUpdateEditorState(const char *prompt, const char *buf, int len, int pos, int prevLen) +{ + if (prompt == NULL) + prompt = ""; + if (buf == NULL) + buf = ""; + + strncpy_s(g_editorPrompt, sizeof(g_editorPrompt), prompt, _TRUNCATE); + strncpy_s(g_editorBuf, sizeof(g_editorBuf), buf, _TRUNCATE); + g_editorLen = len; + g_editorPos = pos; + g_editorPrevLen = prevLen; + InterlockedExchange(&g_editorActive, 1); +} + +static void linenoiseDeactivateEditorState(void) +{ + InterlockedExchange(&g_editorActive, 0); + g_editorPrompt[0] = 0; + g_editorBuf[0] = 0; + g_editorLen = 0; + g_editorPos = 0; + g_editorPrevLen = 0; +} + +static char *linenoiseStrdup(const char *src) +{ + size_t n = strlen(src) + 1; + char *out = (char *)malloc(n); + if (out == NULL) + return NULL; + memcpy(out, src, n); + return out; +} + +static void linenoiseEnsureHistoryCapacity(int wanted) +{ + if (wanted <= g_history.cap) + return; + + int newCap = g_history.cap == 0 ? 32 : g_history.cap; + while (newCap < wanted) + newCap *= 2; + + char **newItems = (char **)realloc(g_history.items, sizeof(char *) * (size_t)newCap); + if (newItems == NULL) + return; + + g_history.items = newItems; + g_history.cap = newCap; +} + +static void linenoiseClearCompletions(linenoiseCompletions *lc) +{ + size_t i = 0; + for (i = 0; i < lc->len; ++i) + { + free(lc->cvec[i]); + } + free(lc->cvec); + lc->cvec = NULL; + lc->len = 0; +} + +void linenoiseAddCompletion(linenoiseCompletions *lc, const char *str) +{ + char **newVec = (char **)realloc(lc->cvec, sizeof(char *) * (lc->len + 1)); + if (newVec == NULL) + return; + + lc->cvec = newVec; + lc->cvec[lc->len] = linenoiseStrdup(str); + if (lc->cvec[lc->len] == NULL) + return; + + lc->len += 1; +} + +void linenoiseSetCompletionCallback(linenoiseCompletionCallback *fn) +{ + g_completionCallback = fn; +} + +void linenoiseFree(void *ptr) +{ + free(ptr); +} + +int linenoiseHistorySetMaxLen(int len) +{ + if (len <= 0) + return 0; + + g_history.maxLen = len; + while (g_history.len > g_history.maxLen) + { + free(g_history.items[0]); + memmove(g_history.items, g_history.items + 1, sizeof(char *) * (size_t)(g_history.len - 1)); + g_history.len -= 1; + } + + return 1; +} + +int linenoiseHistoryAdd(const char *line) +{ + if (line == NULL || line[0] == 0) + return 0; + + if (g_history.len > 0) + { + const char *last = g_history.items[g_history.len - 1]; + if (last != NULL && strcmp(last, line) == 0) + return 1; + } + + linenoiseEnsureHistoryCapacity(g_history.len + 1); + if (g_history.cap <= g_history.len) + return 0; + + g_history.items[g_history.len] = linenoiseStrdup(line); + if (g_history.items[g_history.len] == NULL) + return 0; + + g_history.len += 1; + + while (g_history.len > g_history.maxLen) + { + free(g_history.items[0]); + memmove(g_history.items, g_history.items + 1, sizeof(char *) * (size_t)(g_history.len - 1)); + g_history.len -= 1; + } + + return 1; +} + +void linenoiseRequestStop(void) +{ + InterlockedExchange(&g_stopRequested, 1); +} + +void linenoiseResetStop(void) +{ + InterlockedExchange(&g_stopRequested, 0); +} + +static int linenoiseIsStopRequested(void) +{ + return InterlockedCompareExchange(&g_stopRequested, 0, 0) != 0; +} + +static void linenoiseWriteHint(const char *hint, size_t hintLen) +{ + HANDLE stdoutHandle; + CONSOLE_SCREEN_BUFFER_INFO originalInfo; + int hasColorConsole = 0; + + if (hint == NULL || hintLen == 0) + { + return; + } + + stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); + if (stdoutHandle != INVALID_HANDLE_VALUE && stdoutHandle != NULL) + { + if (GetConsoleScreenBufferInfo(stdoutHandle, &originalInfo)) + { + hasColorConsole = 1; + /* Draw predictive tail in dim gray, then restore original console colors. */ + SetConsoleTextAttribute(stdoutHandle, FOREGROUND_INTENSITY); + } + } + + fwrite(hint, 1, hintLen, stdout); + + if (hasColorConsole) + { + SetConsoleTextAttribute(stdoutHandle, originalInfo.wAttributes); + } +} + +static int linenoiseStartsWithIgnoreCase(const char *full, const char *prefix) +{ + while (*prefix != 0) + { + if (tolower((unsigned char)*full) != tolower((unsigned char)*prefix)) + { + return 0; + } + ++full; + ++prefix; + } + return 1; +} + +static size_t linenoiseBuildHint(const char *buf, char *hint, size_t hintSize) +{ + linenoiseCompletions lc; + size_t inputLen = 0; + size_t i = 0; + + if (hint == NULL || hintSize == 0) + { + return 0; + } + hint[0] = 0; + + if (buf == NULL || buf[0] == 0 || g_completionCallback == NULL) + { + return 0; + } + + lc.len = 0; + lc.cvec = NULL; + /* Reuse the completion callback and derive a "ghost text" suffix from the first extending match. */ + g_completionCallback(buf, &lc); + + inputLen = strlen(buf); + for (i = 0; i < lc.len; ++i) + { + const char *candidate = lc.cvec[i]; + if (candidate == NULL) + { + continue; + } + if (strlen(candidate) <= inputLen) + { + continue; + } + if (!linenoiseStartsWithIgnoreCase(candidate, buf)) + { + continue; + } + + /* Keep only the part not yet typed by the user (rendered as hint text). */ + strncpy_s(hint, hintSize, candidate + inputLen, _TRUNCATE); + break; + } + + linenoiseClearCompletions(&lc); + return strlen(hint); +} + +static void linenoiseRedrawUnsafe(const char *prompt, const char *buf, int len, int pos, int *prevLen) +{ + int i; + char hint[LINENOISE_MAX_LINE] = {0}; + int renderedLen = len; + /* Hint length contributes to the rendered width so stale tail characters can be cleared correctly. */ + int hintLen = (int)linenoiseBuildHint(buf, hint, sizeof(hint)); + if (hintLen > 0) + { + renderedLen += hintLen; + } + + fputc('\r', stdout); + fputs(prompt, stdout); + if (len > 0) + { + fwrite(buf, 1, (size_t)len, stdout); + } + if (hintLen > 0) + { + linenoiseWriteHint(hint, (size_t)hintLen); + } + + if (*prevLen > renderedLen) + { + for (i = renderedLen; i < *prevLen; ++i) + { + fputc(' ', stdout); + } + } + + fputc('\r', stdout); + fputs(prompt, stdout); + if (pos > 0) + { + /* Cursor positioning reflects only real user input, not the ghost hint suffix. */ + fwrite(buf, 1, (size_t)pos, stdout); + } + + fflush(stdout); + *prevLen = renderedLen; + linenoiseUpdateEditorState(prompt, buf, len, pos, *prevLen); +} + +static void linenoiseRedraw(const char *prompt, const char *buf, int len, int pos, int *prevLen) +{ + linenoiseLockIo(); + linenoiseRedrawUnsafe(prompt, buf, len, pos, prevLen); + linenoiseUnlockIo(); +} + +static int linenoiseStartsWith(const char *full, const char *prefix) +{ + while (*prefix != 0) + { + if (*full != *prefix) + return 0; + ++full; + ++prefix; + } + return 1; +} + +static int linenoiseComputeCommonPrefix(const linenoiseCompletions *lc, const char *seed, char *out, size_t outSize) +{ + size_t commonLen = 0; + size_t i; + + if (lc->len == 0 || outSize == 0) + return 0; + + strncpy_s(out, outSize, lc->cvec[0], _TRUNCATE); + commonLen = strlen(out); + + for (i = 1; i < lc->len; ++i) + { + const char *candidate = lc->cvec[i]; + size_t j = 0; + + while (j < commonLen && out[j] != 0 && candidate[j] != 0 && out[j] == candidate[j]) + ++j; + + commonLen = j; + out[commonLen] = 0; + + if (commonLen == 0) + break; + } + + if (strlen(out) <= strlen(seed)) + return 0; + + return linenoiseStartsWith(out, seed); +} + +static void linenoiseApplyCompletion(const char *prompt, char *buf, int *len, int *pos, int *prevLen) +{ + linenoiseCompletions lc; + int i; + + if (g_completionCallback == NULL) + { + Beep(750, 15); + return; + } + + lc.len = 0; + lc.cvec = NULL; + g_completionCallback(buf, &lc); + + if (lc.len == 0) + { + Beep(750, 15); + linenoiseClearCompletions(&lc); + return; + } + + if (lc.len == 1) + { + strncpy_s(buf, LINENOISE_MAX_LINE, lc.cvec[0], _TRUNCATE); + *len = (int)strlen(buf); + *pos = *len; + linenoiseRedraw(prompt, buf, *len, *pos, prevLen); + linenoiseClearCompletions(&lc); + return; + } + + { + char common[LINENOISE_MAX_LINE] = { 0 }; + if (linenoiseComputeCommonPrefix(&lc, buf, common, sizeof(common))) + { + strncpy_s(buf, LINENOISE_MAX_LINE, common, _TRUNCATE); + *len = (int)strlen(buf); + *pos = *len; + linenoiseRedraw(prompt, buf, *len, *pos, prevLen); + } + } + + linenoiseLockIo(); + fputc('\n', stdout); + for (i = 0; i < (int)lc.len; ++i) + { + fputs(lc.cvec[i], stdout); + fputs(" ", stdout); + } + fputc('\n', stdout); + linenoiseRedrawUnsafe(prompt, buf, *len, *pos, prevLen); + linenoiseUnlockIo(); + linenoiseClearCompletions(&lc); +} + +char *linenoise(const char *prompt) +{ + char buf[LINENOISE_MAX_LINE]; + int len = 0; + int pos = 0; + int prevLen = 0; + int historyIndex = g_history.len; + + if (prompt == NULL) + prompt = ""; + + buf[0] = 0; + linenoiseLockIo(); + linenoiseUpdateEditorState(prompt, buf, len, pos, prevLen); + fputs(prompt, stdout); + fflush(stdout); + linenoiseUnlockIo(); + + while (!linenoiseIsStopRequested()) + { + if (!_kbhit()) + { + Sleep(10); + continue; + } + + { + int c = _getwch(); + + if (c == 0 || c == 224) + { + int ext = _getwch(); + if (ext == 72) + { + if (g_history.len > 0 && historyIndex > 0) + { + historyIndex -= 1; + strncpy_s(buf, sizeof(buf), g_history.items[historyIndex], _TRUNCATE); + len = (int)strlen(buf); + pos = len; + linenoiseRedraw(prompt, buf, len, pos, &prevLen); + } + } + else if (ext == 80) + { + if (g_history.len > 0 && historyIndex < g_history.len) + { + historyIndex += 1; + if (historyIndex == g_history.len) + buf[0] = 0; + else + strncpy_s(buf, sizeof(buf), g_history.items[historyIndex], _TRUNCATE); + + len = (int)strlen(buf); + pos = len; + linenoiseRedraw(prompt, buf, len, pos, &prevLen); + } + } + else if (ext == 75) + { + if (pos > 0) + { + pos -= 1; + linenoiseRedraw(prompt, buf, len, pos, &prevLen); + } + } + else if (ext == 77) + { + if (pos < len) + { + pos += 1; + linenoiseRedraw(prompt, buf, len, pos, &prevLen); + } + } + continue; + } + + if (c == 3) + { + linenoiseLockIo(); + linenoiseDeactivateEditorState(); + fputc('\n', stdout); + fflush(stdout); + linenoiseUnlockIo(); + return NULL; + } + + if (c == '\r' || c == '\n') + { + char *out; + linenoiseLockIo(); + linenoiseDeactivateEditorState(); + fputc('\n', stdout); + fflush(stdout); + linenoiseUnlockIo(); + + out = linenoiseStrdup(buf); + return out; + } + + if (c == '\t') + { + linenoiseApplyCompletion(prompt, buf, &len, &pos, &prevLen); + continue; + } + + if (c == 8) + { + if (pos > 0 && len > 0) + { + memmove(buf + pos - 1, buf + pos, (size_t)(len - pos + 1)); + pos -= 1; + len -= 1; + linenoiseRedraw(prompt, buf, len, pos, &prevLen); + } + continue; + } + + if (isprint((unsigned char)c) && len < LINENOISE_MAX_LINE - 1) + { + if (pos == len) + { + buf[pos++] = (char)c; + len += 1; + buf[len] = 0; + } + else + { + memmove(buf + pos + 1, buf + pos, (size_t)(len - pos + 1)); + buf[pos] = (char)c; + pos += 1; + len += 1; + } + linenoiseRedraw(prompt, buf, len, pos, &prevLen); + } + } + } + + linenoiseLockIo(); + linenoiseDeactivateEditorState(); + fputc('\n', stdout); + fflush(stdout); + linenoiseUnlockIo(); + return NULL; +} + +void linenoiseExternalWriteBegin(void) +{ + int i; + int totalChars = 0; + + /* Lock shared console state and clear current prompt area before external output. */ + linenoiseLockIo(); + if (InterlockedCompareExchange(&g_editorActive, 0, 0) == 0) + { + return; + } + + totalChars = (int)strlen(g_editorPrompt) + g_editorPrevLen; + if (totalChars < 0) + { + totalChars = 0; + } + + fputc('\r', stdout); + for (i = 0; i < totalChars; ++i) + { + fputc(' ', stdout); + } + fputc('\r', stdout); + fflush(stdout); +} + +void linenoiseExternalWriteEnd(void) +{ + /* Restore prompt line after external output has been printed. */ + if (InterlockedCompareExchange(&g_editorActive, 0, 0) != 0) + { + int prevLen = g_editorPrevLen; + linenoiseRedrawUnsafe(g_editorPrompt, g_editorBuf, g_editorLen, g_editorPos, &prevLen); + g_editorPrevLen = prevLen; + } + linenoiseUnlockIo(); +} diff --git a/Minecraft.Server/vendor/linenoise/linenoise.h b/Minecraft.Server/vendor/linenoise/linenoise.h new file mode 100644 index 00000000..6f7a0d2b --- /dev/null +++ b/Minecraft.Server/vendor/linenoise/linenoise.h @@ -0,0 +1,37 @@ +#ifndef VENDORED_LINENOISE_H +#define VENDORED_LINENOISE_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct linenoiseCompletions { + size_t len; + char **cvec; +} linenoiseCompletions; + +typedef void(linenoiseCompletionCallback)(const char *buf, linenoiseCompletions *lc); + +char *linenoise(const char *prompt); +void linenoiseFree(void *ptr); + +void linenoiseSetCompletionCallback(linenoiseCompletionCallback *fn); +void linenoiseAddCompletion(linenoiseCompletions *lc, const char *str); + +int linenoiseHistoryAdd(const char *line); +int linenoiseHistorySetMaxLen(int len); + +void linenoiseRequestStop(void); +void linenoiseResetStop(void); + +/* Wrap external stdout/stderr writes so active prompt can be cleared/restored safely. */ +void linenoiseExternalWriteBegin(void); +void linenoiseExternalWriteEnd(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Minecraft.Server/vendor/nlohmann/LICENSE.MIT b/Minecraft.Server/vendor/nlohmann/LICENSE.MIT new file mode 100644 index 00000000..a1dacc8d --- /dev/null +++ b/Minecraft.Server/vendor/nlohmann/LICENSE.MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013-2025 Niels Lohmann + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Minecraft.Server/vendor/nlohmann/json.hpp b/Minecraft.Server/vendor/nlohmann/json.hpp new file mode 100644 index 00000000..82d69f7c --- /dev/null +++ b/Minecraft.Server/vendor/nlohmann/json.hpp @@ -0,0 +1,25526 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file docs/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#include // all_of, find, for_each +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#ifndef JSON_NO_IO + #include // istream, ostream +#endif // JSON_NO_IO +#include // random_access_iterator_tag +#include // unique_ptr +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// This file contains all macro definitions affecting or depending on the ABI + +#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK + #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) + #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 12 || NLOHMANN_JSON_VERSION_PATCH != 0 + #warning "Already included a different version of the library!" + #endif + #endif +#endif + +#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_MINOR 12 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_PATCH 0 // NOLINT(modernize-macro-to-enum) + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + +#ifndef JSON_DIAGNOSTIC_POSITIONS + #define JSON_DIAGNOSTIC_POSITIONS 0 +#endif + +#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 +#endif + +#if JSON_DIAGNOSTICS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS +#endif + +#if JSON_DIAGNOSTIC_POSITIONS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS _dp +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS +#endif + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp +#else + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION + #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 +#endif + +// Construct the namespace ABI tags component +#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) json_abi ## a ## b ## c +#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b, c) \ + NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) + +#define NLOHMANN_JSON_ABI_TAGS \ + NLOHMANN_JSON_ABI_TAGS_CONCAT( \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ + NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON, \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS) + +// Construct the namespace version component +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ + _v ## major ## _ ## minor ## _ ## patch +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) + +#if NLOHMANN_JSON_NAMESPACE_NO_VERSION +#define NLOHMANN_JSON_NAMESPACE_VERSION +#else +#define NLOHMANN_JSON_NAMESPACE_VERSION \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ + NLOHMANN_JSON_VERSION_MINOR, \ + NLOHMANN_JSON_VERSION_PATCH) +#endif + +// Combine namespace components +#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b +#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ + NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) + +#ifndef NLOHMANN_JSON_NAMESPACE +#define NLOHMANN_JSON_NAMESPACE \ + nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN +#define NLOHMANN_JSON_NAMESPACE_BEGIN \ + namespace nlohmann \ + { \ + inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) \ + { +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_END +#define NLOHMANN_JSON_NAMESPACE_END \ + } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ + } // namespace nlohmann +#endif + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#ifdef JSON_HAS_CPP_17 + #include // optional +#endif +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // nullptr_t +#include // exception +#if JSON_DIAGNOSTICS + #include // accumulate +#endif +#include // runtime_error +#include // to_string +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // uint8_t +#include // string + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // declval, pair +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// https://en.cppreference.com/w/cpp/experimental/is_detected +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + + +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-FileCopyrightText: 2016 - 2021 Evan Nemerson +// SPDX-License-Identifier: MIT + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + + +// This file contains all internal macro definitions (except those affecting ABI) +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// #include + + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_23) && !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus > 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG > 202002L) + #define JSON_HAS_CPP_23 + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG > 201703L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201402L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201103L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#ifdef __has_include + #if __has_include() + #include + #endif +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1914 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_THREE_WAY_COMPARISON + #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ + && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L + #define JSON_HAS_THREE_WAY_COMPARISON 1 + #else + #define JSON_HAS_THREE_WAY_COMPARISON 0 + #endif +#endif + +#ifndef JSON_HAS_RANGES + // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error + #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 + #define JSON_HAS_RANGES 0 + #elif defined(__cpp_lib_ranges) + #define JSON_HAS_RANGES 1 + #else + #define JSON_HAS_RANGES 0 + #endif +#endif + +#ifndef JSON_HAS_STATIC_RTTI + #if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0 + #define JSON_HAS_STATIC_RTTI 1 + #else + #define JSON_HAS_STATIC_RTTI 0 + #endif +#endif + +#ifdef JSON_HAS_CPP_17 + #define JSON_INLINE_VARIABLE inline +#else + #define JSON_INLINE_VARIABLE +#endif + +#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) + #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] +#else + #define JSON_NO_UNIQUE_ADDRESS +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */ \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on */ \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */ \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on */ \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType, \ + class CustomBaseClass> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); +#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = !nlohmann_json_j.is_null() ? nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1) : nlohmann_json_default_obj.v1; + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT +@since version 3.11.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE +@since version 3.11.3 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT +@since version 3.11.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE +@since version 3.11.3 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +// inspired from https://stackoverflow.com/a/26745591 +// allows calling any std function as if (e.g., with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DISABLE_ENUM_SERIALIZATION + #define JSON_DISABLE_ENUM_SERIALIZATION 0 +#endif + +#ifndef JSON_USE_GLOBAL_UDLS + #define JSON_USE_GLOBAL_UDLS 1 +#endif + +#if JSON_HAS_THREE_WAY_COMPARISON + #include // partial_ordering +#endif + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +#if JSON_HAS_THREE_WAY_COMPARISON + inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD* +#else + inline bool operator<(const value_t lhs, const value_t rhs) noexcept +#endif +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); +#if JSON_HAS_THREE_WAY_COMPARISON + if (l_index < order.size() && r_index < order.size()) + { + return order[l_index] <=> order[r_index]; // *NOPAD* + } + return std::partial_ordering::unordered; +#else + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +#endif +} + +// GCC selects the built-in operator< over an operator rewritten from +// a user-defined spaceship operator +// Clang, MSVC, and ICC select the rewritten candidate +// (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200) +#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__) +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + return std::is_lt(lhs <=> rhs); // *NOPAD* +} +#endif + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +template +inline void replace_substring(StringType& s, const StringType& f, + const StringType& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != StringType::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +template +inline StringType escape(StringType s) +{ + replace_substring(s, StringType{"~"}, StringType{"~0"}); + replace_substring(s, StringType{"/"}, StringType{"~1"}); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +template +static void unescape(StringType& s) +{ + replace_substring(s, StringType{"~1"}, StringType{"/"}); + replace_substring(s, StringType{"~0"}, StringType{"~"}); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // size_t + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-FileCopyrightText: 2018 The Abseil Authors +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static JSON_INLINE_VARIABLE constexpr T value{}; +}; + +#ifndef JSON_HAS_CPP_17 + template + constexpr T static_const::value; +#endif + +template +constexpr std::array make_array(Args&& ... args) +{ + return std::array {{static_cast(std::forward(args))...}}; +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // numeric_limits +#include // char_traits +#include // tuple +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // random_access_iterator_tag + +// #include + +// #include + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); + +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); + +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ + #define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + #include // int64_t, uint64_t + #include // map + #include // allocator + #include // string + #include // vector + + // #include + + + /*! + @brief namespace for Niels Lohmann + @see https://github.com/nlohmann + @since version 1.0.0 + */ + NLOHMANN_JSON_NAMESPACE_BEGIN + + /*! + @brief default JSONSerializer template argument + + This serializer ignores the template arguments and uses ADL + ([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) + for serialization. + */ + template + struct adl_serializer; + + /// a class to store JSON values + /// @sa https://json.nlohmann.me/api/basic_json/ + template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector, // cppcheck-suppress syntaxError + class CustomBaseClass = void> + class basic_json; + + /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document + /// @sa https://json.nlohmann.me/api/json_pointer/ + template + class json_pointer; + + /*! + @brief default specialization + @sa https://json.nlohmann.me/api/json/ + */ + using json = basic_json<>; + + /// @brief a minimal map-like container that preserves insertion order + /// @sa https://json.nlohmann.me/api/ordered_map/ + template + struct ordered_map; + + /// @brief specialization that maintains the insertion order of object keys + /// @sa https://json.nlohmann.me/api/ordered_json/ + using ordered_json = basic_json; + + NLOHMANN_JSON_NAMESPACE_END + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +NLOHMANN_JSON_NAMESPACE_BEGIN +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ + +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +// used by exceptions create() member functions +// true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t +// false_type otherwise +template +struct is_basic_json_context : + std::integral_constant < bool, + is_basic_json::type>::type>::value + || std::is_same::value > +{}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +template +using detect_key_compare = typename T::key_compare; + +template +struct has_key_compare : std::integral_constant::value> {}; + +// obtains the actual object key comparator +template +struct actual_object_comparator +{ + using object_t = typename BasicJsonType::object_t; + using object_comparator_t = typename BasicJsonType::default_object_comparator_t; + using type = typename std::conditional < has_key_compare::value, + typename object_t::key_compare, object_comparator_t>::type; +}; + +template +using actual_object_comparator_t = typename actual_object_comparator::type; + +///////////////// +// char_traits // +///////////////// + +// Primary template of char_traits calls std char_traits +template +struct char_traits : std::char_traits +{}; + +// Explicitly define char traits for unsigned char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = unsigned char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(std::char_traits::eof()); + } +}; + +// Explicitly define char traits for signed char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = signed char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(std::char_traits::eof()); + } +}; + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B { }; +template +struct conjunction +: std::conditional(B::value), conjunction, B>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + // launder type through decltype() to fix compilation failure on ICPC +#ifdef __INTEL_COMPILER + using laundered_type = decltype(std::declval()); +#else + using laundered_type = ConstructibleStringType; +#endif + + static constexpr auto value = + conjunction < + is_constructible, + is_detected_exact>::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& +is_complete_type < +detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +template +struct is_json_iterator_of : std::false_type {}; + +template +struct is_json_iterator_of : std::true_type {}; + +template +struct is_json_iterator_of : std::true_type +{}; + +// checks if a given type T is a template specialization of Primary +template