Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 84b791c3b1 |
@@ -1,3 +0,0 @@
|
||||
.github/workflows/docker-nightly.yml merge=ours
|
||||
.github/workflows/nightly.yml merge=ours
|
||||
docker-compose.dedicated-server.ghcr.yml merge=ours
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: ❗NEW❗ MinecraftConsoles Community Discord
|
||||
url: https://discord.gg/dH8AZWGcau
|
||||
- name: MinecraftConsoles Community Discord
|
||||
url: https://discord.gg/jrum7HhegA
|
||||
about: If you need help, please ask for it in our Discord! You will get assistance much faster there, including help getting the project to compile.
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 496 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 646 KiB After Width: | Height: | Size: 1.1 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 41 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 778 KiB |
@@ -0,0 +1,31 @@
|
||||
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 }}
|
||||
@@ -0,0 +1,32 @@
|
||||
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"
|
||||
@@ -0,0 +1,160 @@
|
||||
name: Docker Nightly Dedicated Server
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- "main"
|
||||
- 'feature/dedicated-server'
|
||||
paths-ignore:
|
||||
- ".gitignore"
|
||||
- "*.md"
|
||||
- ".github/*.md"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
concurrency:
|
||||
group: docker-nightly-dedicated-server
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build-runtime:
|
||||
name: Build Dedicated Server Runtime
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup msbuild
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
|
||||
- name: Build Dedicated Server Runtime Only
|
||||
shell: pwsh
|
||||
run: |
|
||||
MSBuild.exe Minecraft.World\Minecraft.World.vcxproj /p:Configuration=Release /p:Platform=x64 /m
|
||||
MSBuild.exe Minecraft.Server\Minecraft.Server.vcxproj /p:Configuration=Release /p:Platform=x64 /m
|
||||
|
||||
- name: Stage dedicated server runtime
|
||||
shell: pwsh
|
||||
run: |
|
||||
$serverOut = "Minecraft.Server/x64/Minecraft.Server/Release"
|
||||
$stage = ".artifacts/dedicated-server-runtime"
|
||||
|
||||
if (Test-Path $stage) {
|
||||
Remove-Item -Path $stage -Recurse -Force
|
||||
}
|
||||
|
||||
New-Item -ItemType Directory -Path (Join-Path $stage "Windows64") -Force | Out-Null
|
||||
|
||||
# Minimum required runtime files
|
||||
$required = @(
|
||||
"Minecraft.Server.exe",
|
||||
"iggy_w64.dll",
|
||||
"Common"
|
||||
)
|
||||
|
||||
foreach ($entry in $required) {
|
||||
$src = Join-Path $serverOut $entry
|
||||
if (-not (Test-Path $src)) {
|
||||
throw "Missing required runtime path: $src"
|
||||
}
|
||||
}
|
||||
|
||||
# Copy required files
|
||||
Copy-Item -Path (Join-Path $serverOut "Minecraft.Server.exe") -Destination (Join-Path $stage "Minecraft.Server.exe") -Force
|
||||
Copy-Item -Path (Join-Path $serverOut "iggy_w64.dll") -Destination (Join-Path $stage "iggy_w64.dll") -Force
|
||||
Copy-Item -Path (Join-Path $serverOut "Common") -Destination (Join-Path $stage "Common") -Recurse -Force
|
||||
if (Test-Path (Join-Path $serverOut "Windows64")) {
|
||||
Copy-Item -Path (Join-Path $serverOut "Windows64/*") -Destination (Join-Path $stage "Windows64") -Recurse -Force
|
||||
} else {
|
||||
Write-Host "Windows64 directory is not present in build output; staging without it."
|
||||
}
|
||||
|
||||
Get-ChildItem -Path $stage -Recurse -File | Select-Object -First 20 | ForEach-Object {
|
||||
Write-Host "Staged: $($_.FullName)"
|
||||
}
|
||||
|
||||
- name: Upload dedicated server runtime to artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: dedicated-server-runtime
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
.artifacts/dedicated-server-runtime/**
|
||||
|
||||
docker-publish:
|
||||
name: Build and Push Docker Image
|
||||
runs-on: ubuntu-latest
|
||||
needs: build-runtime
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download dedicated server runtime from artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: dedicated-server-runtime
|
||||
path: .artifacts/runtime
|
||||
|
||||
- name: Prepare Docker runtime directory
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
rm -rf runtime
|
||||
mkdir -p runtime
|
||||
cp .artifacts/runtime/Minecraft.Server.exe runtime/Minecraft.Server.exe
|
||||
cp .artifacts/runtime/iggy_w64.dll runtime/iggy_w64.dll
|
||||
cp -R .artifacts/runtime/Common runtime/Common
|
||||
mkdir -p runtime/Windows64
|
||||
if [[ -d ".artifacts/runtime/Windows64" ]]; then
|
||||
cp -R .artifacts/runtime/Windows64/. runtime/Windows64/
|
||||
fi
|
||||
|
||||
test -f runtime/Minecraft.Server.exe
|
||||
test -f runtime/iggy_w64.dll
|
||||
test -d runtime/Common
|
||||
test -d runtime/Windows64
|
||||
|
||||
- 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
|
||||
+45
-345
@@ -1,369 +1,69 @@
|
||||
name: Nightly Release
|
||||
name: Nightly Releases
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
- 'feature/dedicated-server'
|
||||
paths-ignore:
|
||||
- '.gitignore'
|
||||
- '*.md'
|
||||
- '.github/*.md'
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
id-token: write
|
||||
attestations: write
|
||||
|
||||
concurrency:
|
||||
group: nightly
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build-client:
|
||||
name: Build Client
|
||||
build:
|
||||
name: Build Windows64
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup MSVC
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: Setup msbuild
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
|
||||
- name: Setup CMake
|
||||
uses: lukka/get-cmake@latest
|
||||
|
||||
- name: Run CMake
|
||||
uses: lukka/run-cmake@v10
|
||||
env:
|
||||
VCPKG_ROOT: ""
|
||||
with:
|
||||
configurePreset: windows64
|
||||
buildPreset: windows64-release
|
||||
buildPresetAdditionalArgs: "['--target', 'Minecraft.Client']"
|
||||
- name: Build
|
||||
run: MSBuild.exe MinecraftConsoles.sln /p:Configuration=Release /p:Platform="Windows64"
|
||||
|
||||
- name: Zip Build
|
||||
shell: pwsh
|
||||
run: |
|
||||
$source = "./build/windows64/Minecraft.Client/Release"
|
||||
$zip = "LCE-Revelations-Client-Win64.zip"
|
||||
$topLevel = "LCE-Revelations-Client-Win64"
|
||||
run: 7z a -r LCEWindows64.zip ./x64/Release/*
|
||||
|
||||
# Collect files, excluding unwanted extensions
|
||||
$files = Get-ChildItem -Path $source -Recurse -File |
|
||||
Where-Object { $_.Extension -notin '.pch', '.pdb', '.zip', '.ipdb', '.iobj', '.exp', '.lib' }
|
||||
- name: Zip Dedicated Server Build
|
||||
run: 7z a -r LCEServerWindows64.zip ./x64/Minecraft.Server/Release/*
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
$basePath = (Resolve-Path $source).Path
|
||||
$fs = [System.IO.File]::Open($zip, [System.IO.FileMode]::Create)
|
||||
try {
|
||||
$archive = New-Object System.IO.Compression.ZipArchive($fs, [System.IO.Compression.ZipArchiveMode]::Create)
|
||||
try {
|
||||
# Add directories
|
||||
Get-ChildItem -Path $basePath -Recurse -Directory | ForEach-Object {
|
||||
$rel = $_.FullName.Substring($basePath.Length).TrimStart('\', '/')
|
||||
$archive.CreateEntry("$topLevel/$($rel -replace '\\','/')/") | Out-Null
|
||||
}
|
||||
# Add files
|
||||
foreach ($file in $files) {
|
||||
$rel = $file.FullName.Substring($basePath.Length).TrimStart('\', '/')
|
||||
$entryName = "$topLevel/$($rel -replace '\\','/')"
|
||||
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile(
|
||||
$archive, $file.FullName, $entryName,
|
||||
[System.IO.Compression.CompressionLevel]::Optimal
|
||||
) | Out-Null
|
||||
}
|
||||
} finally { $archive.Dispose() }
|
||||
} finally { $fs.Dispose() }
|
||||
|
||||
Write-Host "Created $zip"
|
||||
|
||||
- name: Stage artifacts
|
||||
shell: pwsh
|
||||
run: |
|
||||
New-Item -ItemType Directory -Force -Path staging
|
||||
Copy-Item LCE-Revelations-Client-Win64.zip staging/
|
||||
Copy-Item ./build/windows64/Minecraft.Client/Release/Minecraft.Client.exe staging/
|
||||
Copy-Item ./build/windows64/Minecraft.Client/Release/Minecraft.Client.pdb staging/
|
||||
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: client-build
|
||||
path: staging/*
|
||||
|
||||
build-server:
|
||||
name: Build Server
|
||||
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: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
global-json-file: global.json
|
||||
|
||||
- name: Run CMake
|
||||
uses: lukka/run-cmake@v10
|
||||
- name: Update Client release
|
||||
uses: andelf/nightly-release@main
|
||||
env:
|
||||
VCPKG_ROOT: ""
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
configurePreset: windows64
|
||||
buildPreset: windows64-release
|
||||
buildPresetAdditionalArgs: "['--target', 'Minecraft.Server', '--target', 'Minecraft.Server.FourKit']"
|
||||
tag_name: nightly
|
||||
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`.
|
||||
|
||||
# 🚨 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
|
||||
|
||||
- name: Zip Build (vanilla)
|
||||
shell: pwsh
|
||||
run: |
|
||||
$source = "./build/windows64/Minecraft.Server/Release"
|
||||
$zip = "LCE-Revelations-Server-Win64.zip"
|
||||
$topLevel = "LCE-Revelations-Server-Win64"
|
||||
|
||||
$files = Get-ChildItem -Path $source -Recurse -File |
|
||||
Where-Object { $_.Extension -notin '.pch', '.zip', '.ipdb', '.iobj', '.exp', '.lib' }
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
$basePath = (Resolve-Path $source).Path
|
||||
$fs = [System.IO.File]::Open($zip, [System.IO.FileMode]::Create)
|
||||
try {
|
||||
$archive = New-Object System.IO.Compression.ZipArchive($fs, [System.IO.Compression.ZipArchiveMode]::Create)
|
||||
try {
|
||||
Get-ChildItem -Path $basePath -Recurse -Directory | ForEach-Object {
|
||||
$rel = $_.FullName.Substring($basePath.Length).TrimStart('\', '/')
|
||||
$archive.CreateEntry("$topLevel/$($rel -replace '\\','/')/") | Out-Null
|
||||
}
|
||||
foreach ($file in $files) {
|
||||
$rel = $file.FullName.Substring($basePath.Length).TrimStart('\', '/')
|
||||
$entryName = "$topLevel/$($rel -replace '\\','/')"
|
||||
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile(
|
||||
$archive, $file.FullName, $entryName,
|
||||
[System.IO.Compression.CompressionLevel]::Optimal
|
||||
) | Out-Null
|
||||
}
|
||||
} finally { $archive.Dispose() }
|
||||
} finally { $fs.Dispose() }
|
||||
|
||||
Write-Host "Created $zip"
|
||||
|
||||
- name: Zip Build (FourKit)
|
||||
shell: pwsh
|
||||
run: |
|
||||
$source = "./build/windows64/Minecraft.Server.FourKit/Release"
|
||||
$zip = "LCE-Revelations-Server-Win64-FourKit.zip"
|
||||
$topLevel = "LCE-Revelations-Server-Win64-FourKit"
|
||||
|
||||
$files = Get-ChildItem -Path $source -Recurse -File |
|
||||
Where-Object { $_.Extension -notin '.pch', '.zip', '.ipdb', '.iobj', '.exp', '.lib' }
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
$basePath = (Resolve-Path $source).Path
|
||||
$fs = [System.IO.File]::Open($zip, [System.IO.FileMode]::Create)
|
||||
try {
|
||||
$archive = New-Object System.IO.Compression.ZipArchive($fs, [System.IO.Compression.ZipArchiveMode]::Create)
|
||||
try {
|
||||
Get-ChildItem -Path $basePath -Recurse -Directory | ForEach-Object {
|
||||
$rel = $_.FullName.Substring($basePath.Length).TrimStart('\', '/')
|
||||
$archive.CreateEntry("$topLevel/$($rel -replace '\\','/')/") | Out-Null
|
||||
}
|
||||
foreach ($file in $files) {
|
||||
$rel = $file.FullName.Substring($basePath.Length).TrimStart('\', '/')
|
||||
$entryName = "$topLevel/$($rel -replace '\\','/')"
|
||||
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile(
|
||||
$archive, $file.FullName, $entryName,
|
||||
[System.IO.Compression.CompressionLevel]::Optimal
|
||||
) | Out-Null
|
||||
}
|
||||
} finally { $archive.Dispose() }
|
||||
} finally { $fs.Dispose() }
|
||||
|
||||
Write-Host "Created $zip"
|
||||
|
||||
- name: Stage artifacts
|
||||
shell: pwsh
|
||||
run: |
|
||||
New-Item -ItemType Directory -Force -Path staging
|
||||
Copy-Item LCE-Revelations-Server-Win64.zip staging/
|
||||
Copy-Item LCE-Revelations-Server-Win64-FourKit.zip staging/
|
||||
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: server-build
|
||||
path: staging/*
|
||||
|
||||
release-server:
|
||||
name: Release Server
|
||||
needs: build-server
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download server artifacts
|
||||
uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: server-build
|
||||
path: artifacts
|
||||
|
||||
- name: Attest artifacts
|
||||
uses: actions/attest-build-provenance@v2
|
||||
with:
|
||||
subject-path: |
|
||||
artifacts/LCE-Revelations-Server-Win64.zip
|
||||
artifacts/LCE-Revelations-Server-Win64-FourKit.zip
|
||||
|
||||
- name: Get short SHA
|
||||
id: sha
|
||||
run: echo "short=$(echo '${{ github.sha }}' | cut -c1-7)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Delete old release
|
||||
- name: Update Dedicated Server release
|
||||
uses: andelf/nightly-release@main
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: gh release delete Nightly-Dedicated-Server --yes || true
|
||||
|
||||
- name: Delete old tag
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: gh api repos/${{ github.repository }}/git/refs/tags/Nightly-Dedicated-Server --method DELETE || true
|
||||
|
||||
- name: Import GPG key
|
||||
uses: crazy-max/ghaction-import-gpg@v6
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||
git_user_signingkey: true
|
||||
git_tag_gpgsign: true
|
||||
tag_name: nightly-dedicated-server
|
||||
name: Nightly Dedicated Server Release
|
||||
body: |
|
||||
Dedicated Server runtime for Windows64.
|
||||
|
||||
- name: Create signed tag
|
||||
run: |
|
||||
git tag -s -f Nightly-Dedicated-Server -m "Nightly server release ${{ steps.sha.outputs.short }}"
|
||||
git push origin Nightly-Dedicated-Server --force
|
||||
|
||||
- name: Create release
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
gh release create Nightly-Dedicated-Server artifacts/* \
|
||||
--title "Server: ${{ steps.sha.outputs.short }}" \
|
||||
--notes "Dedicated Server runtime for Windows64.
|
||||
|
||||
Two flavours are attached:
|
||||
- \`LCE-Revelations-Server-Win64.zip\`: vanilla server, no plugin support, smallest download.
|
||||
- \`LCE-Revelations-Server-Win64-FourKit.zip\`: server with the FourKit plugin host, bundled .NET 10 runtime, and an empty \`plugins/\` folder ready for plugin authors to drop DLLs into.
|
||||
|
||||
Pick the flavour you want and extract it to a folder where you'd like to keep the server runtime." \
|
||||
--latest=false
|
||||
|
||||
release-client:
|
||||
name: Release Client
|
||||
needs: [build-client, release-server]
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download client artifacts
|
||||
uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: client-build
|
||||
path: artifacts
|
||||
|
||||
- name: Attest artifacts
|
||||
uses: actions/attest-build-provenance@v2
|
||||
with:
|
||||
subject-path: |
|
||||
artifacts/LCE-Revelations-Client-Win64.zip
|
||||
artifacts/Minecraft.Client.exe
|
||||
artifacts/Minecraft.Client.pdb
|
||||
|
||||
- name: Get short SHA
|
||||
id: sha
|
||||
run: echo "short=$(echo '${{ github.sha }}' | cut -c1-7)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Delete old release
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: gh release delete Nightly --yes || true
|
||||
|
||||
- name: Delete old tag
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: gh api repos/${{ github.repository }}/git/refs/tags/Nightly --method DELETE || true
|
||||
|
||||
- name: Import GPG key
|
||||
uses: crazy-max/ghaction-import-gpg@v6
|
||||
with:
|
||||
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||
git_user_signingkey: true
|
||||
git_tag_gpgsign: true
|
||||
|
||||
- name: Create signed tag
|
||||
run: |
|
||||
git tag -s -f Nightly -m "Nightly release ${{ steps.sha.outputs.short }}"
|
||||
git push origin Nightly --force
|
||||
|
||||
- name: Write release notes
|
||||
run: |
|
||||
cat > notes.md <<'NOTES'
|
||||
# Instructions:
|
||||
**Newcomers:**
|
||||
- If this is your first time, download `LCE-Revelations-Client-Win64.zip` and extract it wherever you would like to keep it.
|
||||
- I would recommend to set your username prior to launch (create a file called `username.txt`, put your desired username into the file, and save).
|
||||
- To play, simply run `Minecraft.Client.exe`.
|
||||
|
||||
**For those that wish to update their existing installation with the latest build:**
|
||||
- Download `Minecraft.Client.exe` and copy it over to your existing LCE-Revelations-Client-Win64 build (overwrite your old version of Minecraft.Client.exe).
|
||||
|
||||
**For developers:**
|
||||
- `Minecraft.Client.pdb` contains debug symbols for crash analysis and development. Place it next to `Minecraft.Client.exe` for stack traces to show function names and line numbers.
|
||||
|
||||
**Steam Deck & Linux:**
|
||||
- Y'all know the drill. Download the `LCE-Revelations-Client-Win64.zip`, extract it, add the `Minecraft.Client.exe` as a "Non-Steam Game" within the Steam library, turn on compatibility mode with Proton Experimental, and then run it!
|
||||
|
||||
# Multiplayer instructions:
|
||||
LAN games are natively supported, and any LAN games will appear automatically on the right. However, if you'd like to play with your friends online (and if you don't want to require them to setup a vpn, and/or if you don't want to port forward), I would recommend the following setup. Please keep in mind, you do NOT need to do this to enjoy the game. This is just how I have it setup for me so my friends can join without any hassle:
|
||||
|
||||
Prerequisites:
|
||||
- Premium playit.gg account, costs about $3 USD per month. This is for setting up the tunnel.
|
||||
- playit.gg agent installed on host PC.
|
||||
|
||||
How-to:
|
||||
- Ensure your playit.gg agent is connected to your playit.gg account
|
||||
- On the playit.gg website, setup a new tunnel (choose TCP). Ensure the configurable settings are set to the below values, assuming your agent is installed on the same computer as your online LCE Revelations game is hosted from.
|
||||
- Configurable settings:
|
||||
- Local IP: `127.0.0.1`
|
||||
- Local Port: `25565`
|
||||
- Proxy Protocol: `None`
|
||||
- After creating your tunnel, navigate to the "Tunnels" main page. You'll see the IP address and port for your tunnel. This is what your friends will input when adding your server in order to join your online game!
|
||||
NOTES
|
||||
|
||||
- name: Create release
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
gh release create Nightly artifacts/* \
|
||||
--title "Client: ${{ steps.sha.outputs.short }}" \
|
||||
--notes-file notes.md
|
||||
|
||||
cleanup:
|
||||
needs: [release-client, release-server]
|
||||
if: always()
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Cleanup artifacts
|
||||
uses: geekyeggo/delete-artifact@v5
|
||||
with:
|
||||
name: |
|
||||
client-build
|
||||
server-build
|
||||
Download `LCEServerWindows64.zip` and extract it to a folder where you'd like to keep the server runtime.
|
||||
files: |
|
||||
LCEServerWindows64.zip
|
||||
./x64/Minecraft.Server/Release/Minecraft.Server.exe
|
||||
./x64/Minecraft.Server/Release/Minecraft.Server.pdb
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
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: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
global-json-file: global.json
|
||||
|
||||
- name: Run CMake
|
||||
uses: lukka/run-cmake@v10
|
||||
env:
|
||||
VCPKG_ROOT: "" # Disable vcpkg for CI builds
|
||||
with:
|
||||
configurePreset: windows64
|
||||
buildPreset: windows64-debug
|
||||
+32
-21
@@ -26,7 +26,6 @@ mono_crash.*
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x64_*/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
@@ -408,27 +407,39 @@ enc_temp_folder/
|
||||
Minecraft.Client/Schematics/
|
||||
Minecraft.Client/Windows64/GameHDD/
|
||||
|
||||
# CMake build output
|
||||
build/
|
||||
# Intermediate build files (per-project)
|
||||
Minecraft.Client/x64/
|
||||
Minecraft.Client/Debug/
|
||||
Minecraft.Client/x64_Debug/
|
||||
Minecraft.Client/Release/
|
||||
Minecraft.Client/x64_Release/
|
||||
|
||||
Minecraft.World/x64/
|
||||
Minecraft.World/Debug/
|
||||
Minecraft.World/x64_Debug/
|
||||
Minecraft.World/Release/
|
||||
Minecraft.World/x64_Release/
|
||||
|
||||
Minecraft.Server/x64/
|
||||
Minecraft.Server/Debug/
|
||||
Minecraft.Server/x64_Debug/
|
||||
Minecraft.Server/Release/
|
||||
Minecraft.Server/x64_Release/
|
||||
|
||||
build/*
|
||||
|
||||
# Existing build output files
|
||||
!x64/**/Effects.msscmp
|
||||
!x64/**/iggy_w64.dll
|
||||
!x64/**/mss64.dll
|
||||
!x64/**/redist64/
|
||||
|
||||
# Local saves
|
||||
Minecraft.Client/Saves/
|
||||
|
||||
# Server data
|
||||
tmp*/
|
||||
_server_asset_probe/
|
||||
server-data/
|
||||
|
||||
# Tools build artifacts and intermediates
|
||||
tools/*.class
|
||||
tools/*.swf
|
||||
tools/staging/
|
||||
tools/server-monitor/
|
||||
|
||||
|
||||
# Nix
|
||||
result
|
||||
result-*
|
||||
.direnv/
|
||||
.xwin-cache/
|
||||
.xwin/
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
# Visual Studio Per-User Config
|
||||
*.user
|
||||
/out
|
||||
|
||||
+219
-94
@@ -1,119 +1,244 @@
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
project(LCE-Revelations LANGUAGES C CXX RC ASM_MASM)
|
||||
project(MinecraftConsoles LANGUAGES C CXX RC ASM_MASM)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
if(NOT WIN32 AND NOT CMAKE_CROSSCOMPILING)
|
||||
message(FATAL_ERROR "This CMake build currently supports Windows only. For cross-compilation from Linux, use the clang-cl toolchain.")
|
||||
if(NOT WIN32)
|
||||
message(FATAL_ERROR "This CMake build currently supports Windows only.")
|
||||
endif()
|
||||
|
||||
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$<$<CONFIG:Debug>:Debug>")
|
||||
|
||||
function(configure_compiler_target target)
|
||||
# MSVC and compatible compilers (like Clang-cl)
|
||||
if (MSVC)
|
||||
target_compile_options(${target} PRIVATE
|
||||
$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:C,CXX>>:/W3>
|
||||
$<$<AND:$<CONFIG:Release>,$<COMPILE_LANGUAGE:C,CXX>>:/W0>
|
||||
$<$<COMPILE_LANGUAGE:C,CXX>:/MP>
|
||||
$<$<COMPILE_LANGUAGE:C,CXX>:/FS>
|
||||
$<$<COMPILE_LANGUAGE:C,CXX>:/GS>
|
||||
$<$<COMPILE_LANGUAGE:CXX>:/EHsc>
|
||||
$<$<COMPILE_LANGUAGE:CXX>:/GR>
|
||||
$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:C,CXX>>:/Od>
|
||||
$<$<AND:$<CONFIG:Release>,$<COMPILE_LANGUAGE:C,CXX>>:/O2 /Oi /GT /GF>
|
||||
)
|
||||
endif()
|
||||
|
||||
# MSVC
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
target_compile_options(${target} PRIVATE
|
||||
$<$<AND:$<CONFIG:Release>,$<COMPILE_LANGUAGE:C,CXX>>:/GL /Zi>
|
||||
)
|
||||
target_link_options(${target} PRIVATE
|
||||
$<$<CONFIG:Release>:/LTCG:incremental /DEBUG /OPT:REF /OPT:ICF>
|
||||
)
|
||||
endif()
|
||||
|
||||
# Clang
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
target_compile_options(${target} PRIVATE
|
||||
$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANGUAGE:C,CXX>>:-O0 -Wall>
|
||||
$<$<AND:$<CONFIG:Release>,$<COMPILE_LANGUAGE:C,CXX>>:-O2 -w -flto>
|
||||
)
|
||||
target_link_options(${target} PRIVATE
|
||||
$<$<CONFIG:Release>:-flto>
|
||||
)
|
||||
endif()
|
||||
function(configure_msvc_target target)
|
||||
target_compile_options(${target} PRIVATE
|
||||
$<$<AND:$<NOT:$<CONFIG:Release>>,$<COMPILE_LANGUAGE:C,CXX>>:/W3>
|
||||
$<$<AND:$<CONFIG:Release>,$<COMPILE_LANGUAGE:C,CXX>>:/W0>
|
||||
$<$<COMPILE_LANGUAGE:C,CXX>:/MP>
|
||||
$<$<COMPILE_LANGUAGE:C,CXX>:/FS>
|
||||
$<$<COMPILE_LANGUAGE:CXX>:/EHsc>
|
||||
$<$<AND:$<CONFIG:Release>,$<COMPILE_LANGUAGE:C,CXX>>:/GL /O2 /Oi /GT /GF>
|
||||
)
|
||||
endfunction()
|
||||
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/WorldSources.cmake")
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/ClientSources.cmake")
|
||||
|
||||
# ---
|
||||
# Configuration
|
||||
# ---
|
||||
set(MINECRAFT_SHARED_DEFINES
|
||||
_LARGE_WORLDS
|
||||
_DEBUG_MENUS_ENABLED
|
||||
$<$<CONFIG:Debug>:_DEBUG>
|
||||
_CRT_NON_CONFORMING_SWPRINTFS
|
||||
_CRT_SECURE_NO_WARNINGS
|
||||
_HAS_STD_BYTE=0
|
||||
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"
|
||||
)
|
||||
|
||||
# Add platform-specific defines
|
||||
if(PLATFORM_NAME STREQUAL "Windows64")
|
||||
list(APPEND MINECRAFT_SHARED_DEFINES _WINDOWS64)
|
||||
set(IGGY_LIBS iggy_w64.lib)
|
||||
endif()
|
||||
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.FourKit)
|
||||
add_subdirectory(Minecraft.Server)
|
||||
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
|
||||
$<$<CONFIG:Debug>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64>
|
||||
$<$<NOT:$<CONFIG:Debug>>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64>
|
||||
)
|
||||
if(MSVC)
|
||||
configure_msvc_target(MinecraftWorld)
|
||||
endif()
|
||||
|
||||
# ---
|
||||
# Build versioning
|
||||
# ---
|
||||
set(BUILDVER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateBuildVer.cmake")
|
||||
set(BUILDVER_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/generated/Common/BuildVer.h")
|
||||
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/"
|
||||
)
|
||||
target_compile_definitions(MinecraftClient PRIVATE
|
||||
$<$<CONFIG:Debug>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64>
|
||||
$<$<NOT:$<CONFIG:Debug>>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64>
|
||||
)
|
||||
if(MSVC)
|
||||
configure_msvc_target(MinecraftClient)
|
||||
target_link_options(MinecraftClient PRIVATE
|
||||
$<$<CONFIG:Release>:/LTCG /INCREMENTAL:NO>
|
||||
)
|
||||
endif()
|
||||
|
||||
add_custom_target(GenerateBuildVer
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
"-DOUTPUT_FILE=${BUILDVER_OUTPUT}"
|
||||
-P "${BUILDVER_SCRIPT}"
|
||||
COMMENT "Generating BuildVer.h..."
|
||||
set_target_properties(MinecraftClient PROPERTIES
|
||||
VS_DEBUGGER_WORKING_DIRECTORY "$<TARGET_FILE_DIR:MinecraftClient>"
|
||||
)
|
||||
|
||||
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"
|
||||
$<$<CONFIG:Debug>:
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input_d.lib"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage_d.lib"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Render_PC_d.lib"
|
||||
>
|
||||
$<$<NOT:$<CONFIG:Debug>>:
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input.lib"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage.lib"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Render_PC.lib"
|
||||
>
|
||||
)
|
||||
|
||||
set(MINECRAFT_SERVER_SOURCES ${MINECRAFT_CLIENT_SOURCES})
|
||||
list(APPEND MINECRAFT_SERVER_SOURCES
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Windows64/ServerMain.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Access/Access.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Access/BanManager.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Access/WhitelistManager.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/ServerCli.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/ServerCliInput.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/ServerCliParser.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/ServerCliEngine.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/ServerCliRegistry.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/ban/CliCommandBan.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/ban-ip/CliCommandBanIp.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/ban-list/CliCommandBanList.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/help/CliCommandHelp.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/pardon/CliCommandPardon.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/pardon-ip/CliCommandPardonIp.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/stop/CliCommandStop.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/list/CliCommandList.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/tp/CliCommandTp.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/whitelist/CliCommandWhitelist.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/gamemode/CliCommandGamemode.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/time/CliCommandTime.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/weather/CliCommandWeather.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/give/CliCommandGive.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/enchant/CliCommandEnchant.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/kill/CliCommandKill.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/defaultgamemode/CliCommandDefaultGamemode.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Console/commands/experience/CliCommandExperience.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Common/FileUtils.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Common/StringUtils.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/ServerLogger.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/ServerLogManager.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/ServerProperties.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/vendor/linenoise/linenoise.c"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/WorldManager.cpp"
|
||||
)
|
||||
|
||||
add_executable(MinecraftServer ${MINECRAFT_SERVER_SOURCES})
|
||||
target_include_directories(MinecraftServer PRIVATE
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/include"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Xbox/Sentient/Include"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.World/x64headers"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Server/Windows64"
|
||||
)
|
||||
target_compile_definitions(MinecraftServer PRIVATE
|
||||
$<$<CONFIG:Debug>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;MINECRAFT_SERVER_BUILD>
|
||||
$<$<NOT:$<CONFIG:Debug>>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;MINECRAFT_SERVER_BUILD>
|
||||
)
|
||||
if(MSVC)
|
||||
configure_msvc_target(MinecraftServer)
|
||||
target_link_options(MinecraftServer PRIVATE
|
||||
$<$<CONFIG:Release>:/LTCG /INCREMENTAL:NO>
|
||||
)
|
||||
endif()
|
||||
|
||||
set_target_properties(MinecraftServer PROPERTIES
|
||||
OUTPUT_NAME "Minecraft.Server"
|
||||
VS_DEBUGGER_WORKING_DIRECTORY "$<TARGET_FILE_DIR:MinecraftServer>"
|
||||
VS_DEBUGGER_COMMAND_ARGUMENTS "-port 25565 -bind 0.0.0.0 -name DedicatedServer"
|
||||
)
|
||||
|
||||
target_link_libraries(MinecraftServer PRIVATE
|
||||
MinecraftWorld
|
||||
d3d11
|
||||
XInput9_1_0
|
||||
wsock32
|
||||
legacy_stdio_definitions
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggy_w64.lib"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggyperfmon_w64.lib"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggyexpruntime_w64.lib"
|
||||
$<$<CONFIG:Debug>:
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input_d.lib"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage_d.lib"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Render_PC_d.lib"
|
||||
>
|
||||
$<$<NOT:$<CONFIG:Debug>>:
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input.lib"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage.lib"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Render_PC.lib"
|
||||
>
|
||||
)
|
||||
|
||||
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()
|
||||
|
||||
add_custom_command(TARGET MinecraftServer POST_BUILD
|
||||
COMMAND "${CMAKE_COMMAND}"
|
||||
-DPROJECT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
-DOUTPUT_DIR="$<TARGET_FILE_DIR:MinecraftServer>"
|
||||
-DCONFIGURATION=$<CONFIG>
|
||||
-P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyServerAssets.cmake"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
add_dependencies(Minecraft.World GenerateBuildVer)
|
||||
add_dependencies(Minecraft.Client GenerateBuildVer)
|
||||
if(PLATFORM_NAME STREQUAL "Windows64")
|
||||
add_dependencies(Minecraft.Server GenerateBuildVer)
|
||||
endif()
|
||||
|
||||
# ---
|
||||
# Project organisation
|
||||
# ---
|
||||
# Set the startup project for Visual Studio
|
||||
set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT Minecraft.Client)
|
||||
|
||||
# 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")
|
||||
set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT MinecraftServer)
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
{
|
||||
"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" }
|
||||
]
|
||||
}
|
||||
+28
-138
@@ -1,55 +1,26 @@
|
||||
# Compile Instructions
|
||||
|
||||
## Prerequisites
|
||||
## Visual Studio (`.sln`)
|
||||
|
||||
- **Visual Studio 2022** with the **Desktop development with C++** workload (this includes the CMake tools, MSVC toolchain, and Windows 10 SDK).
|
||||
- **.NET 10 SDK**, required to build the FourKit plugin host (`Minecraft.Server.FourKit`).
|
||||
- Download: https://dotnet.microsoft.com/download/dotnet/10.0 (pick the **x64 SDK** installer)
|
||||
- The exact SDK version is pinned in `global.json` at the repo root.
|
||||
- CMake will fail configure with a clear error message if .NET 10 is not installed, so you find out immediately rather than partway through a build.
|
||||
- The build invokes `dotnet publish ... --runtime win-x64 --self-contained true`, so the published output bundles a complete .NET 10 runtime alongside the FourKit assembly. End users running the produced server do **not** need to install .NET themselves.
|
||||
- All FourKit runtime files (DLL + .NET runtime + `hostfxr.dll`) land in a `runtime/` subfolder next to `Minecraft.Server.exe`. An empty `plugins/` folder is also created. Both are produced automatically by the build.
|
||||
|
||||
## Visual Studio 2022 quick start (recommended)
|
||||
|
||||
VS 2022 has built-in CMake support, so there is no need to generate a `.sln` file by hand.
|
||||
|
||||
1. Install the prerequisites above.
|
||||
2. Clone the repo.
|
||||
3. In Visual Studio: `File > Open > Folder...` and select the **repo root** (the folder that contains `CMakeLists.txt`).
|
||||
4. Wait for CMake to configure (~5 seconds on a warm cache, a few minutes on the first run while assets copy).
|
||||
5. Pick a build configuration in the dropdown, for example `windows64-release`.
|
||||
6. `Build > Build All` (or `F7`). Targets of interest:
|
||||
- `Minecraft.Client`: the game client.
|
||||
- `Minecraft.Server`: the **vanilla** dedicated server. Standalone C++ binary, no plugin host, no .NET dependency at runtime, smallest distribution.
|
||||
- `Minecraft.Server.FourKit`: the **FourKit-enabled** dedicated server. Bundles the .NET 10 plugin host alongside the exe (in `runtime/`) and creates an empty `plugins/` folder for end users to drop plugin DLLs into. Building this target also triggers the `Minecraft.Server.FourKit.Managed` target which publishes the C# project.
|
||||
7. Use the debug target dropdown to pick `Minecraft.Client.exe` or whichever server flavour you want, then `F5` to launch.
|
||||
|
||||
### Server flavours
|
||||
|
||||
Both server targets compile from the same source tree and produce a binary literally named `Minecraft.Server.exe`. The variant identity lives in the build directory:
|
||||
|
||||
```
|
||||
build/<preset>/Minecraft.Server/Release/
|
||||
Minecraft.Server.exe (vanilla, no plugin support)
|
||||
Common/, Windows64/, ...
|
||||
|
||||
build/<preset>/Minecraft.Server.FourKit/Release/
|
||||
Minecraft.Server.exe (FourKit-enabled, same exe name on purpose)
|
||||
runtime/ (self-contained .NET 10 + Minecraft.Server.FourKit.dll)
|
||||
plugins/ (empty drop point)
|
||||
Common/, Windows64/, ...
|
||||
```
|
||||
|
||||
The FourKit target gets the `MINECRAFT_SERVER_FOURKIT_BUILD` preprocessor define. Inside `FourKitBridge.h`, the real plugin entry points are conditional on that define; the vanilla target sees inline no-op stubs instead, so gameplay code can call `FourKitBridge::Fire*` unconditionally and produce the right behaviour for each flavour without per-call-site `#ifdef`s.
|
||||
1. Open `MinecraftConsoles.sln` in Visual Studio 2022.
|
||||
2. Set Startup Project:
|
||||
- Client: `Minecraft.Client`
|
||||
- Dedicated server: `Minecraft.Server`
|
||||
3. Select configuration:
|
||||
- `Debug` (recommended), or
|
||||
- `Release`
|
||||
4. Select platform: `Windows64`.
|
||||
5. Build and run:
|
||||
- `Build > Build Solution` (or `Ctrl+Shift+B`)
|
||||
- Start debugging with `F5`.
|
||||
|
||||
### Dedicated server debug arguments
|
||||
|
||||
- Default debugger arguments for both `Minecraft.Server` and `Minecraft.Server.FourKit`:
|
||||
- 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`
|
||||
- Both server targets post-build copy the dedicated-server asset set:
|
||||
- `Minecraft.Server` post-build copies only the dedicated-server asset set:
|
||||
- `Common/Media/MediaWindows64.arc`
|
||||
- `Common/res`
|
||||
- `Windows64/GameHDD`
|
||||
@@ -58,131 +29,50 @@ The FourKit target gets the `MINECRAFT_SERVER_FOURKIT_BUILD` preprocessor define
|
||||
|
||||
Configure (use your VS Community instance explicitly):
|
||||
|
||||
Open `Developer PowerShell for VS` and run:
|
||||
|
||||
```powershell
|
||||
cmake --preset windows64
|
||||
cmake -S . -B build -G "Visual Studio 17 2022" -A x64 -DCMAKE_GENERATOR_INSTANCE="C:/Program Files/Microsoft Visual Studio/2022/Community"
|
||||
```
|
||||
|
||||
Build Debug:
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows64-debug --target Minecraft.Client
|
||||
cmake --build build --config Debug --target MinecraftClient
|
||||
```
|
||||
|
||||
Build Release:
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows64-release --target Minecraft.Client
|
||||
cmake --build build --config Release --target MinecraftClient
|
||||
```
|
||||
|
||||
Build vanilla Dedicated Server (Debug):
|
||||
Build Dedicated Server (Debug):
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows64-debug --target Minecraft.Server
|
||||
cmake --build build --config Debug --target MinecraftServer
|
||||
```
|
||||
|
||||
Build vanilla Dedicated Server (Release):
|
||||
Build Dedicated Server (Release):
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows64-release --target Minecraft.Server
|
||||
```
|
||||
|
||||
Build FourKit Dedicated Server (Debug):
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows64-debug --target Minecraft.Server.FourKit
|
||||
```
|
||||
|
||||
Build FourKit Dedicated Server (Release):
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows64-release --target Minecraft.Server.FourKit
|
||||
```
|
||||
|
||||
Build everything (client + both server flavours):
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows64-release
|
||||
cmake --build build --config Release --target MinecraftServer
|
||||
```
|
||||
|
||||
Run executable:
|
||||
|
||||
```powershell
|
||||
cd .\build\windows64\Minecraft.Client\Debug
|
||||
.\Minecraft.Client.exe
|
||||
cd .\build\Debug
|
||||
.\MinecraftClient.exe
|
||||
```
|
||||
|
||||
Run vanilla dedicated server:
|
||||
Run dedicated server:
|
||||
|
||||
```powershell
|
||||
cd .\build\windows64\Minecraft.Server\Debug
|
||||
.\Minecraft.Server.exe -port 25565 -bind 0.0.0.0 -name DedicatedServer
|
||||
```
|
||||
|
||||
Run FourKit dedicated server:
|
||||
|
||||
```powershell
|
||||
cd .\build\windows64\Minecraft.Server.FourKit\Debug
|
||||
cd .\build\Debug
|
||||
.\Minecraft.Server.exe -port 25565 -bind 0.0.0.0 -name DedicatedServer
|
||||
```
|
||||
|
||||
Notes:
|
||||
- Post-build asset copy is automatic for `Minecraft.Client` in CMake (Debug and Release variants).
|
||||
- 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).
|
||||
- The game relies on relative paths (for example `Common\Media\...`), so launching from the output directory is required.
|
||||
|
||||
## CMake (Linux x64 Cross-Compile with Clang)
|
||||
|
||||
Cross-compile Windows x64 binaries on Linux using LLVM/Clang and the Windows SDK obtained via xwin.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
Install the following packages (example for Ubuntu):
|
||||
|
||||
```bash
|
||||
sudo apt install clang lld llvm cmake ninja-build rsync cargo
|
||||
```
|
||||
|
||||
Install xwin for downloading the Windows SDK:
|
||||
|
||||
```bash
|
||||
cargo install xwin
|
||||
```
|
||||
|
||||
### Compile
|
||||
|
||||
Run this (Release):
|
||||
```bash
|
||||
./build-linux.sh
|
||||
```
|
||||
|
||||
Or, for debug:
|
||||
```bash
|
||||
./build-linux.sh . Debug
|
||||
```
|
||||
|
||||
|
||||
### NixOS / Nix
|
||||
|
||||
For NixOS or systems with Nix installed, use the provided flake:
|
||||
|
||||
```bash
|
||||
nix build .#client
|
||||
nix build .#server
|
||||
```
|
||||
|
||||
Or enter the development shell with all dependencies:
|
||||
|
||||
```bash
|
||||
nix develop
|
||||
```
|
||||
|
||||
Notes:
|
||||
- Requires LLVM 15+ with clang-cl, lld-link, llvm-rc, and llvm-mt.
|
||||
- Wine is required to run the compiled Windows executables on Linux.
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
- **`'vswhere.exe' is not recognized`**: harmless warning. This appears if you ran `vcvars64.bat` from a plain command prompt instead of `Developer PowerShell for VS`. The Visual Studio Installer's `vswhere.exe` lives at `C:\Program Files (x86)\Microsoft Visual Studio\Installer\` and is not on the default `PATH`. Use the Developer PowerShell shortcut, or open the repo folder directly in VS (which handles the dev env for you).
|
||||
- **`.NET 10 SDK not found` at configure time**: install the x64 SDK from https://dotnet.microsoft.com/download/dotnet/10.0 and re-run CMake configure (`Project > Configure Cache` in VS, or `cmake --preset windows64` from a shell).
|
||||
- **Server starts but logs `hostfxr_initialize_for_dotnet_command_line failed`**: the `runtime/` folder next to `Minecraft.Server.exe` is missing or stale. Rebuild the `Minecraft.Server.FourKit` target (which re-stages `runtime/`), or do a clean rebuild of `Minecraft.Server`.
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#include "stdafx.h"
|
||||
#include "AbstractContainerScreen.h"
|
||||
#include "ItemRenderer.h"
|
||||
#include "MultiPlayerLocalPlayer.h"
|
||||
#include "MultiplayerLocalPlayer.h"
|
||||
#include "Lighting.h"
|
||||
#include "GameMode.h"
|
||||
#include "KeyMapping.h"
|
||||
#include "Options.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.inventory.h"
|
||||
#include "../Minecraft.World/net.minecraft.locale.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.item.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.inventory.h"
|
||||
#include "..\Minecraft.World\net.minecraft.locale.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.item.h"
|
||||
|
||||
ItemRenderer *AbstractContainerScreen::itemRenderer = new ItemRenderer();
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#include "stdafx.h"
|
||||
#include "../Minecraft.World/net.minecraft.core.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.projectile.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "..\Minecraft.World\net.minecraft.core.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "AbstractProjectileDispenseBehavior.h"
|
||||
|
||||
shared_ptr<ItemInstance> AbstractProjectileDispenseBehavior::execute(BlockSource *source, shared_ptr<ItemInstance> dispensed)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "../Minecraft.World/DefaultDispenseItemBehavior.h"
|
||||
#include "..\Minecraft.World\DefaultDispenseItemBehavior.h"
|
||||
|
||||
class Projectile;
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#include "stdafx.h"
|
||||
#include "Textures.h"
|
||||
#include "AbstractTexturePack.h"
|
||||
#include "../Minecraft.World/InputOutputStream.h"
|
||||
#include "../Minecraft.World/StringHelpers.h"
|
||||
#include "..\Minecraft.World\InputOutputStream.h"
|
||||
#include "..\Minecraft.World\StringHelpers.h"
|
||||
#include "Common/UI/UI.h"
|
||||
|
||||
AbstractTexturePack::AbstractTexturePack(DWORD id, File *file, const wstring &name, TexturePack *fallback) : id(id), name(name)
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
#include "Font.h"
|
||||
#include "Textures.h"
|
||||
#include "Lighting.h"
|
||||
#include "../Minecraft.World/System.h"
|
||||
#include "../Minecraft.World/net.minecraft.locale.h"
|
||||
#include "../Minecraft.World/net.minecraft.stats.h"
|
||||
#include "../Minecraft.World/SharedConstants.h"
|
||||
#include "..\Minecraft.World\System.h"
|
||||
#include "..\Minecraft.World\net.minecraft.locale.h"
|
||||
#include "..\Minecraft.World\net.minecraft.stats.h"
|
||||
#include "..\Minecraft.World\SharedConstants.h"
|
||||
|
||||
AchievementPopup::AchievementPopup(Minecraft *mc)
|
||||
{
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
#include "Textures.h"
|
||||
#include "StatsCounter.h"
|
||||
#include "ItemRenderer.h"
|
||||
#include "../Minecraft.World/System.h"
|
||||
#include "../Minecraft.World/net.minecraft.locale.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.h"
|
||||
#include "../Minecraft.World/JavaMath.h"
|
||||
#include "..\Minecraft.World\System.h"
|
||||
#include "..\Minecraft.World\net.minecraft.locale.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.h"
|
||||
#include "..\Minecraft.World\JavaMath.h"
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
#include "Screen.h"
|
||||
#include "../Minecraft.World/net.minecraft.stats.h"
|
||||
#include "..\Minecraft.World\net.minecraft.stats.h"
|
||||
class StatsCounter;
|
||||
|
||||
class AchievementScreen : public Screen
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
#include "../Minecraft.World/StringHelpers.h"
|
||||
#include "../Minecraft.World/compression.h"
|
||||
#include "..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\Minecraft.World\compression.h"
|
||||
|
||||
#include "ArchiveFile.h"
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "../Minecraft.World/File.h"
|
||||
#include "../Minecraft.World/ArrayWithLength.h"
|
||||
#include "..\Minecraft.World\File.h"
|
||||
#include "..\Minecraft.World\ArrayWithLength.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "ArrowRenderer.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.projectile.h"
|
||||
#include "../Minecraft.World/Mth.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h"
|
||||
#include "..\Minecraft.World\Mth.h"
|
||||
|
||||
ResourceLocation ArrowRenderer::ARROW_LOCATION = ResourceLocation(TN_ITEM_ARROWS);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "stdafx.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.ambient.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.ambient.h"
|
||||
#include "BatModel.h"
|
||||
#include "ModelPart.h"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "stdafx.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.ambient.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.ambient.h"
|
||||
#include "BatRenderer.h"
|
||||
#include "BatModel.h"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "stdafx.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.entity.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "BeaconRenderer.h"
|
||||
#include "Tesselator.h"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "stdafx.h"
|
||||
#include "../Minecraft.World/Mth.h"
|
||||
#include "..\Minecraft.World\Mth.h"
|
||||
#include "BlazeModel.h"
|
||||
#include "ModelPart.h"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "stdafx.h"
|
||||
#include "BlazeModel.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.monster.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.monster.h"
|
||||
#include "BlazeRenderer.h"
|
||||
|
||||
ResourceLocation BlazeRenderer::BLAZE_LOCATION = ResourceLocation(TN_MOB_BLAZE);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#include "stdafx.h"
|
||||
#include "BoatRenderer.h"
|
||||
#include "BoatModel.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.item.h"
|
||||
#include "../Minecraft.World/Mth.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.item.h"
|
||||
#include "..\Minecraft.World\Mth.h"
|
||||
|
||||
ResourceLocation BoatRenderer::BOAT_LOCATION = ResourceLocation(TN_ITEM_BOAT);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "stdafx.h"
|
||||
#include "../Minecraft.World/Mth.h"
|
||||
#include "..\Minecraft.World\Mth.h"
|
||||
#include "BookModel.h"
|
||||
#include "ModelPart.h"
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "stdafx.h"
|
||||
#include "BreakingItemParticle.h"
|
||||
#include "Tesselator.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.item.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.item.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.h"
|
||||
|
||||
void BreakingItemParticle::_init(Item *item, Textures *textures, int data)
|
||||
{
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "stdafx.h"
|
||||
#include "BubbleParticle.h"
|
||||
#include "../Minecraft.World/Random.h"
|
||||
#include "../Minecraft.World/Mth.h"
|
||||
#include "../Minecraft.World/JavaMath.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.material.h"
|
||||
#include "..\Minecraft.World\Random.h"
|
||||
#include "..\Minecraft.World\Mth.h"
|
||||
#include "..\Minecraft.World\JavaMath.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.material.h"
|
||||
|
||||
BubbleParticle::BubbleParticle(Level *level, double x, double y, double z, double xa, double ya, double za) : Particle(level, x, y, z, xa, ya, za)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "../Minecraft.World/StringHelpers.h"
|
||||
#include "..\Minecraft.World\StringHelpers.h"
|
||||
#include "Textures.h"
|
||||
#include "../Minecraft.World/ArrayWithLength.h"
|
||||
#include "..\Minecraft.World\ArrayWithLength.h"
|
||||
#include "BufferedImage.h"
|
||||
|
||||
#ifdef _XBOX
|
||||
|
||||
@@ -1,95 +0,0 @@
|
||||
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}
|
||||
$<$<STREQUAL:${PLATFORM_NAME},Durango>:${MINECRAFT_CLIENT_DURANGO}>
|
||||
$<$<STREQUAL:${PLATFORM_NAME},Orbis>:${MINECRAFT_CLIENT_ORBIS}>
|
||||
$<$<STREQUAL:${PLATFORM_NAME},PS3>:${MINECRAFT_CLIENT_PS3}>
|
||||
$<$<STREQUAL:${PLATFORM_NAME},PSVita>:${MINECRAFT_CLIENT_PSVITA}>
|
||||
$<$<STREQUAL:${PLATFORM_NAME},Windows64>:${MINECRAFT_CLIENT_WINDOWS}>
|
||||
$<$<STREQUAL:${PLATFORM_NAME},Xbox>:${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 "$<$<COMPILE_LANGUAGE:CXX>: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_FILE_DIR:Minecraft.Client>"
|
||||
)
|
||||
|
||||
target_link_libraries(Minecraft.Client PRIVATE
|
||||
Minecraft.World
|
||||
d3d11
|
||||
dxgi
|
||||
d3dcompiler
|
||||
XInput9_1_0
|
||||
wsock32
|
||||
legacy_stdio_definitions
|
||||
$<$<CONFIG:Debug>: # 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"
|
||||
>
|
||||
$<$<NOT:$<CONFIG:Debug>>: # 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}/${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()
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "stdafx.h"
|
||||
#include "Camera.h"
|
||||
#include "MemoryTracker.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.player.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.h"
|
||||
#include "../Minecraft.World/TilePos.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.player.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.h"
|
||||
#include "..\Minecraft.World\TilePos.h"
|
||||
|
||||
float Camera::xPlayerOffs = 0.0f;
|
||||
float Camera::yPlayerOffs = 0.0f;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
#include "../Minecraft.World/FloatBuffer.h"
|
||||
#include "../Minecraft.World/IntBuffer.h"
|
||||
#include "..\Minecraft.World\FloatBuffer.h"
|
||||
#include "..\Minecraft.World\IntBuffer.h"
|
||||
|
||||
|
||||
class TilePos;
|
||||
|
||||
@@ -2,26 +2,19 @@
|
||||
#include "ChatScreen.h"
|
||||
#include "ClientConnection.h"
|
||||
#include "Font.h"
|
||||
#include "MultiPlayerLocalPlayer.h"
|
||||
#include "../Minecraft.World/SharedConstants.h"
|
||||
#include "../Minecraft.World/StringHelpers.h"
|
||||
#include "../Minecraft.World/ChatPacket.h"
|
||||
#include "../Minecraft.World/ArabicShaping.h"
|
||||
#include "MultiplayerLocalPlayer.h"
|
||||
#include "..\Minecraft.World\SharedConstants.h"
|
||||
#include "..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\Minecraft.World\ChatPacket.h"
|
||||
|
||||
const wstring ChatScreen::allowedChars = SharedConstants::acceptableLetters;
|
||||
vector<wstring> ChatScreen::s_chatHistory;
|
||||
int ChatScreen::s_historyIndex = -1;
|
||||
wstring ChatScreen::s_historyDraft;
|
||||
int ChatScreen::s_chatIndex = 0;
|
||||
|
||||
bool ChatScreen::isAllowedChatChar(wchar_t c)
|
||||
{
|
||||
if (c < 0x20) return false;
|
||||
// Block Unicode bidirectional override characters that can be used to
|
||||
// spoof chat messages or impersonate players.
|
||||
if (c >= 0x202A && c <= 0x202E) return false; // LRE, RLE, PDF, LRO, RLO
|
||||
if (c >= 0x2066 && c <= 0x2069) return false; // LRI, RLI, FSI, PDI
|
||||
return true;
|
||||
return c >= 0x20 && (c == L'\u00A7' || allowedChars.empty() || allowedChars.find(c) != wstring::npos);
|
||||
}
|
||||
|
||||
ChatScreen::ChatScreen()
|
||||
@@ -29,8 +22,6 @@ ChatScreen::ChatScreen()
|
||||
frame = 0;
|
||||
cursorIndex = 0;
|
||||
s_historyIndex = -1;
|
||||
|
||||
ChatScreen::s_chatIndex = 0;
|
||||
}
|
||||
|
||||
void ChatScreen::init()
|
||||
@@ -92,20 +83,6 @@ void ChatScreen::handleHistoryDown()
|
||||
applyHistoryMessage();
|
||||
}
|
||||
|
||||
int ChatScreen::getChatIndex()
|
||||
{
|
||||
return ChatScreen::s_chatIndex;
|
||||
}
|
||||
|
||||
void ChatScreen::correctChatIndex(int newChatIndex) {
|
||||
ChatScreen::s_chatIndex = newChatIndex;
|
||||
}
|
||||
|
||||
void ChatScreen::setWheelValue(int wheel) {
|
||||
ChatScreen::s_chatIndex += wheel;
|
||||
if (ChatScreen::s_chatIndex < 0) ChatScreen::s_chatIndex = 0;
|
||||
}
|
||||
|
||||
void ChatScreen::keyPressed(wchar_t ch, int eventKey)
|
||||
{
|
||||
if (eventKey == Keyboard::KEY_ESCAPE)
|
||||
@@ -116,9 +93,6 @@ void ChatScreen::keyPressed(wchar_t ch, int eventKey)
|
||||
if (eventKey == Keyboard::KEY_RETURN)
|
||||
{
|
||||
wstring trim = trimString(message);
|
||||
{ char buf[64]; sprintf_s(buf, "[CHAT] Sending (%d chars): ", (int)trim.length()); OutputDebugStringA(buf); }
|
||||
OutputDebugStringW(trim.c_str());
|
||||
OutputDebugStringA("\n");
|
||||
if (trim.length() > 0)
|
||||
{
|
||||
if (!minecraft->handleClientSideCommand(trim))
|
||||
@@ -157,11 +131,10 @@ void ChatScreen::keyPressed(wchar_t ch, int eventKey)
|
||||
cursorIndex--;
|
||||
return;
|
||||
}
|
||||
if (isAllowedChatChar(ch) && static_cast<int>(message.length()) < SharedConstants::maxVisibleLength)
|
||||
if (isAllowedChatChar(ch) && static_cast<int>(message.length()) < SharedConstants::maxChatLength)
|
||||
{
|
||||
message.insert(cursorIndex, 1, ch);
|
||||
cursorIndex++;
|
||||
{ char buf[64]; sprintf_s(buf, "[CHAT] Char U+%04X accepted (%d chars)\n", (unsigned)ch, (int)message.length()); OutputDebugStringA(buf); }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,21 +145,14 @@ void ChatScreen::render(int xm, int ym, float a)
|
||||
int x = 4;
|
||||
drawString(font, prefix, x, height - 12, 0xe0e0e0);
|
||||
x += font->width(prefix);
|
||||
|
||||
// Shape the full message as one unit so letter connections and word order
|
||||
// are correct. Track where the logical cursor maps in the visual string.
|
||||
int visualCursorPos = 0;
|
||||
wstring shaped = shapeArabicText(message, cursorIndex, &visualCursorPos);
|
||||
|
||||
// Render the full shaped message without re-shaping it
|
||||
drawStringPreshaped(font, shaped, x, height - 12, 0xe0e0e0);
|
||||
|
||||
// Place the cursor at the correct visual position
|
||||
wstring beforeCursorVisual = shaped.substr(0, visualCursorPos);
|
||||
int cursorX = x + font->widthPreshaped(beforeCursorVisual);
|
||||
wstring beforeCursor = message.substr(0, cursorIndex);
|
||||
wstring afterCursor = message.substr(cursorIndex);
|
||||
drawStringLiteral(font, beforeCursor, x, height - 12, 0xe0e0e0);
|
||||
x += font->widthLiteral(beforeCursor);
|
||||
if (frame / 6 % 2 == 0)
|
||||
drawString(font, L"_", cursorX, height - 12, 0xe0e0e0);
|
||||
|
||||
drawString(font, L"_", x, height - 12, 0xe0e0e0);
|
||||
x += font->width(L"_");
|
||||
drawStringLiteral(font, afterCursor, x, height - 12, 0xe0e0e0);
|
||||
Screen::render(xm, ym, a);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@ private:
|
||||
static std::vector<wstring> s_chatHistory;
|
||||
static int s_historyIndex;
|
||||
static wstring s_historyDraft;
|
||||
static int s_chatIndex;
|
||||
static const wstring allowedChars;
|
||||
static bool isAllowedChatChar(wchar_t c);
|
||||
|
||||
@@ -29,9 +28,6 @@ public:
|
||||
virtual void handleHistoryUp();
|
||||
virtual void handleHistoryDown();
|
||||
|
||||
static int getChatIndex();
|
||||
static void correctChatIndex(int newChatIndex);
|
||||
static void setWheelValue(int wheel);
|
||||
protected:
|
||||
void keyPressed(wchar_t ch, int eventKey);
|
||||
public:
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
#include "ChestModel.h"
|
||||
#include "LargeChestModel.h"
|
||||
#include "ModelPart.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.entity.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.h"
|
||||
#include "../Minecraft.World/Calendar.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.h"
|
||||
#include "..\Minecraft.World\Calendar.h"
|
||||
|
||||
ResourceLocation ChestRenderer::CHEST_LARGE_TRAP_LOCATION = ResourceLocation(TN_TILE_LARGE_TRAP_CHEST);
|
||||
//ResourceLocation ChestRenderer::CHEST_LARGE_XMAS_LOCATION = ResourceLocation(TN_TILE_LARGE_XMAS_CHEST);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "stdafx.h"
|
||||
#include "../Minecraft.World/Mth.h"
|
||||
#include "..\Minecraft.World\Mth.h"
|
||||
#include "ChickenModel.h"
|
||||
#include "ModelPart.h"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "../Minecraft.World/Mth.h"
|
||||
#include "..\Minecraft.World\Mth.h"
|
||||
#include "ChickenRenderer.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.animal.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.animal.h"
|
||||
|
||||
ResourceLocation ChickenRenderer::CHICKEN_LOCATION = ResourceLocation(TN_MOB_CHICKEN);
|
||||
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
#include "Chunk.h"
|
||||
#include "TileRenderer.h"
|
||||
#include "TileEntityRenderDispatcher.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.chunk.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.entity.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.chunk.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h"
|
||||
#include "LevelRenderer.h"
|
||||
|
||||
#ifdef __PS3__
|
||||
#include "PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.h"
|
||||
#include "PS3/SPU_Tasks/ChunkUpdate/TileRenderer_SPU.h"
|
||||
#include "PS3/SPU_Tasks/CompressedTile/CompressedTileStorage_SPU.h"
|
||||
#include "PS3\SPU_Tasks\ChunkUpdate\ChunkRebuildData.h"
|
||||
#include "PS3\SPU_Tasks\ChunkUpdate\TileRenderer_SPU.h"
|
||||
#include "PS3\SPU_Tasks\CompressedTile\CompressedTileStorage_SPU.h"
|
||||
|
||||
#include "C4JThread_SPU.h"
|
||||
#include "C4JSpursJob.h"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
#include "AllowAllCuller.h"
|
||||
#include "Tesselator.h"
|
||||
#include "../Minecraft.World/ArrayWithLength.h"
|
||||
#include "..\Minecraft.World\ArrayWithLength.h"
|
||||
#include "LevelRenderer.h"
|
||||
|
||||
class Level;
|
||||
|
||||
@@ -9,46 +9,46 @@
|
||||
#include "TakeAnimationParticle.h"
|
||||
#include "CritParticle.h"
|
||||
#include "User.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.storage.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.chunk.h"
|
||||
#include "../Minecraft.World/net.minecraft.stats.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.ai.attributes.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.player.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.animal.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.npc.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.item.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.projectile.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.global.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.boss.enderdragon.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.entity.monster.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.entity.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.item.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.item.trading.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.tile.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.inventory.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.saveddata.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.dimension.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.effect.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.food.h"
|
||||
#include "../Minecraft.World/SharedConstants.h"
|
||||
#include "../Minecraft.World/AABB.h"
|
||||
#include "../Minecraft.World/Pos.h"
|
||||
#include "../Minecraft.World/Socket.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.storage.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.chunk.h"
|
||||
#include "..\Minecraft.World\net.minecraft.stats.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.ai.attributes.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.player.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.animal.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.npc.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.item.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.global.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.entity.monster.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.item.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.item.trading.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.tile.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.inventory.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.saveddata.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.dimension.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.effect.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.food.h"
|
||||
#include "..\Minecraft.World\SharedConstants.h"
|
||||
#include "..\Minecraft.World\AABB.h"
|
||||
#include "..\Minecraft.World\Pos.h"
|
||||
#include "..\Minecraft.World\Socket.h"
|
||||
#include "Minecraft.h"
|
||||
#include "ProgressRenderer.h"
|
||||
#include "LevelRenderer.h"
|
||||
#include "Options.h"
|
||||
#include "MinecraftServer.h"
|
||||
#include "ClientConstants.h"
|
||||
#include "../Minecraft.World/SoundTypes.h"
|
||||
#include "../Minecraft.World/BasicTypeContainers.h"
|
||||
#include "..\Minecraft.World\SoundTypes.h"
|
||||
#include "..\Minecraft.World\BasicTypeContainers.h"
|
||||
#include "TexturePackRepository.h"
|
||||
#ifdef _XBOX
|
||||
#include "Common/XUI/XUI_Scene_Trading.h"
|
||||
#include "Common\XUI\XUI_Scene_Trading.h"
|
||||
#else
|
||||
#include "Common/UI/UI.h"
|
||||
#include "Common\UI\UI.h"
|
||||
#endif
|
||||
#ifdef __PS3__
|
||||
#include "PS3/Network/SonyVoiceChat.h"
|
||||
@@ -56,41 +56,16 @@
|
||||
#include "DLCTexturePack.h"
|
||||
|
||||
#ifdef _WINDOWS64
|
||||
#include "Xbox/Network/NetworkPlayerXbox.h"
|
||||
#include "Common/Network/PlatformNetworkManagerStub.h"
|
||||
#include "Windows64/Network/WinsockNetLayer.h"
|
||||
#include "Xbox\Network\NetworkPlayerXbox.h"
|
||||
#include "Common\Network\PlatformNetworkManagerStub.h"
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef _DURANGO
|
||||
#include "../Minecraft.World/DurangoStats.h"
|
||||
#include "../Minecraft.World/GenericStats.h"
|
||||
#include "..\Minecraft.World\DurangoStats.h"
|
||||
#include "..\Minecraft.World\GenericStats.h"
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
char mapIconToFrame(char iconSlot)
|
||||
{
|
||||
if (iconSlot >= 8) return iconSlot - 4;
|
||||
return iconSlot;
|
||||
}
|
||||
|
||||
// Same hash as getRandomPlayerMapIcon in MapItemSavedData.cpp, returning
|
||||
// the Iggy/SWF frame index (0-7) instead of the raw icon slot.
|
||||
char computePlayerMapFrame(int entityId, int playerIndex)
|
||||
{
|
||||
static const char PLAYER_MAP_ICON_SLOTS[] = { 0, 1, 2, 3, 8, 9, 10, 11 };
|
||||
unsigned int seed = static_cast<unsigned int>(entityId);
|
||||
seed ^= static_cast<unsigned int>(playerIndex * 0x9E3779B9u);
|
||||
seed ^= (seed >> 16);
|
||||
seed *= 0x7FEB352Du;
|
||||
seed ^= (seed >> 15);
|
||||
seed *= 0x846CA68Bu;
|
||||
seed ^= (seed >> 16);
|
||||
return mapIconToFrame(PLAYER_MAP_ICON_SLOTS[seed % 8]);
|
||||
}
|
||||
}
|
||||
|
||||
ClientConnection::ClientConnection(Minecraft *minecraft, const wstring& ip, int port)
|
||||
{
|
||||
// 4J Stu - No longer used as we use the socket version below.
|
||||
@@ -135,7 +110,6 @@ ClientConnection::ClientConnection(Minecraft *minecraft, Socket *socket, int iUs
|
||||
started = false;
|
||||
savedDataStorage = new SavedDataStorage(nullptr);
|
||||
maxPlayers = 20;
|
||||
m_isForkServer = false;
|
||||
|
||||
this->minecraft = minecraft;
|
||||
|
||||
@@ -368,7 +342,7 @@ void ClientConnection::handleLogin(shared_ptr<LoginPacket> packet)
|
||||
Level *dimensionLevel = minecraft->getLevel( packet->dimension );
|
||||
if( dimensionLevel == nullptr )
|
||||
{
|
||||
level = new MultiPlayerLevel(this, new LevelSettings(packet->seed, GameType::byId(packet->gameType), false, packet->m_isHardcore, packet->m_newSeaLevel, packet->m_pLevelType, packet->m_xzSize, packet->m_hellScale), packet->dimension, packet->difficulty);
|
||||
level = new MultiPlayerLevel(this, new LevelSettings(packet->seed, GameType::byId(packet->gameType), false, false, packet->m_newSeaLevel, packet->m_pLevelType, packet->m_xzSize, packet->m_hellScale), packet->dimension, packet->difficulty);
|
||||
|
||||
// 4J Stu - We want to share the SavedDataStorage between levels
|
||||
int otherDimensionId = packet->dimension == 0 ? -1 : 0;
|
||||
@@ -403,7 +377,6 @@ void ClientConnection::handleLogin(shared_ptr<LoginPacket> packet)
|
||||
|
||||
BYTE networkSmallId = getSocket()->getSmallId();
|
||||
app.UpdatePlayerInfo(networkSmallId, packet->m_playerIndex, packet->m_uiGamePrivileges);
|
||||
app.SetPlayerMapIcon(minecraft->player->getName().c_str(), computePlayerMapFrame(packet->clientVersion, packet->m_playerIndex));
|
||||
minecraft->player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_uiGamePrivileges);
|
||||
|
||||
// Assume all privileges are on, so that the first message we see only indicates things that have been turned off
|
||||
@@ -438,7 +411,7 @@ void ClientConnection::handleLogin(shared_ptr<LoginPacket> packet)
|
||||
activeLevel = minecraft->getLevel(otherDimensionId);
|
||||
}
|
||||
|
||||
MultiPlayerLevel *dimensionLevel = new MultiPlayerLevel(this, new LevelSettings(packet->seed, GameType::byId(packet->gameType), false, packet->m_isHardcore, packet->m_newSeaLevel, packet->m_pLevelType, packet->m_xzSize, packet->m_hellScale), packet->dimension, packet->difficulty);
|
||||
MultiPlayerLevel *dimensionLevel = new MultiPlayerLevel(this, new LevelSettings(packet->seed, GameType::byId(packet->gameType), false, false, packet->m_newSeaLevel, packet->m_pLevelType, packet->m_xzSize, packet->m_hellScale), packet->dimension, packet->difficulty);
|
||||
|
||||
dimensionLevel->savedDataStorage = activeLevel->savedDataStorage;
|
||||
|
||||
@@ -474,7 +447,6 @@ void ClientConnection::handleLogin(shared_ptr<LoginPacket> packet)
|
||||
|
||||
BYTE networkSmallId = getSocket()->getSmallId();
|
||||
app.UpdatePlayerInfo(networkSmallId, packet->m_playerIndex, packet->m_uiGamePrivileges);
|
||||
app.SetPlayerMapIcon(player->getName().c_str(), computePlayerMapFrame(packet->clientVersion, packet->m_playerIndex));
|
||||
player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_uiGamePrivileges);
|
||||
|
||||
// Assume all privileges are on, so that the first message we see only indicates things that have been turned off
|
||||
@@ -945,36 +917,6 @@ void ClientConnection::handleAddPlayer(shared_ptr<AddPlayerPacket> packet)
|
||||
}
|
||||
}
|
||||
|
||||
// Client-side registration: if we still have no IQNet entry for this remote
|
||||
// player, create one so they appear in the Tab player list.
|
||||
// Find the first available IQNet slot (customData == 0, skip slot 0 which
|
||||
// is the host). We can't use packet->m_playerIndex directly because on
|
||||
// dedicated servers the game-level player index starts at 0 for real
|
||||
// players, conflicting with the IQNet host slot.
|
||||
if (matchedQNetPlayer == nullptr)
|
||||
{
|
||||
for (int s = 1; s < MINECRAFT_NET_MAX_PLAYERS; ++s)
|
||||
{
|
||||
IQNetPlayer* qp = &IQNet::m_player[s];
|
||||
if (qp->GetCustomDataValue() == 0 && qp->m_gamertag[0] == 0)
|
||||
{
|
||||
BYTE smallId = static_cast<BYTE>(s);
|
||||
qp->m_smallId = smallId;
|
||||
qp->m_isRemote = true;
|
||||
qp->m_isHostPlayer = false;
|
||||
qp->m_resolvedXuid = pktXuid;
|
||||
wcsncpy_s(qp->m_gamertag, 32, packet->name.c_str(), _TRUNCATE);
|
||||
if (smallId >= IQNet::s_playerCount)
|
||||
IQNet::s_playerCount = smallId + 1;
|
||||
|
||||
extern CPlatformNetworkManagerStub* g_pPlatformNetworkManager;
|
||||
g_pPlatformNetworkManager->NotifyPlayerJoined(qp);
|
||||
matchedQNetPlayer = qp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (matchedQNetPlayer != nullptr)
|
||||
{
|
||||
// Store packet-authoritative XUID on this network slot so later lookups by XUID
|
||||
@@ -1004,7 +946,6 @@ void ClientConnection::handleAddPlayer(shared_ptr<AddPlayerPacket> packet)
|
||||
player->setPlayerIndex( packet->m_playerIndex );
|
||||
player->setCustomSkin( packet->m_skinId );
|
||||
player->setCustomCape( packet->m_capeId );
|
||||
app.SetPlayerMapIcon(packet->name.c_str(), computePlayerMapFrame(packet->id, packet->m_playerIndex));
|
||||
player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_uiGamePrivileges);
|
||||
|
||||
if (!player->customTextureUrl.empty() && player->customTextureUrl.substr(0, 3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(player->customTextureUrl))
|
||||
@@ -1142,35 +1083,33 @@ void ClientConnection::handleMoveEntitySmall(shared_ptr<MoveEntityPacketSmall> p
|
||||
void ClientConnection::handleRemoveEntity(shared_ptr<RemoveEntitiesPacket> packet)
|
||||
{
|
||||
#ifdef _WINDOWS64
|
||||
// On fork servers, IQNet cleanup is handled by the MC|ForkPLeave custom
|
||||
// payload so players stay in Tab regardless of render distance. On
|
||||
// upstream servers (no MC|ForkHello received), fall back to the old
|
||||
// behaviour of cleaning up IQNet here.
|
||||
if (!m_isForkServer && !g_NetworkManager.IsHost())
|
||||
if (!g_NetworkManager.IsHost())
|
||||
{
|
||||
for (int i = 0; i < packet->ids.length; i++)
|
||||
{
|
||||
shared_ptr<Entity> entity = getEntity(packet->ids[i]);
|
||||
if (entity != nullptr)
|
||||
if (entity != nullptr && entity->GetType() == eTYPE_PLAYER)
|
||||
{
|
||||
shared_ptr<Player> player = dynamic_pointer_cast<Player>(entity);
|
||||
if (player != nullptr)
|
||||
{
|
||||
for (int s = 1; s < MINECRAFT_NET_MAX_PLAYERS; ++s)
|
||||
PlayerUID xuid = player->getXuid();
|
||||
INetworkPlayer* np = g_NetworkManager.GetPlayerByXuid(xuid);
|
||||
if (np != nullptr)
|
||||
{
|
||||
IQNetPlayer* qp = &IQNet::m_player[s];
|
||||
if (qp->GetCustomDataValue() != 0 &&
|
||||
_wcsicmp(qp->m_gamertag, player->getName().c_str()) == 0)
|
||||
NetworkPlayerXbox* npx = (NetworkPlayerXbox*)np;
|
||||
IQNetPlayer* qp = npx->GetQNetPlayer();
|
||||
if (qp != nullptr)
|
||||
{
|
||||
extern CPlatformNetworkManagerStub* g_pPlatformNetworkManager;
|
||||
g_pPlatformNetworkManager->NotifyPlayerLeaving(qp);
|
||||
qp->m_smallId = 0;
|
||||
qp->m_isRemote = false;
|
||||
qp->m_isHostPlayer = false;
|
||||
// Clear resolved id to avoid stale XUID -> player matches after disconnect.
|
||||
qp->m_resolvedXuid = INVALID_XUID;
|
||||
qp->m_gamertag[0] = 0;
|
||||
qp->SetCustomDataValue(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1607,28 +1546,17 @@ void ClientConnection::handleChat(shared_ptr<ChatPacket> packet)
|
||||
bool replaceEntitySource = false;
|
||||
bool replaceItem = false;
|
||||
|
||||
int stringArgsSize = packet->m_stringArgs.size();
|
||||
|
||||
wstring playerDisplayName = L"";
|
||||
wstring sourceDisplayName = L"";
|
||||
|
||||
// On platforms other than Xbox One this just sets display name to gamertag
|
||||
if (stringArgsSize >= 1) playerDisplayName = GetDisplayNameByGamertag(packet->m_stringArgs[0]);
|
||||
if (stringArgsSize >= 2) sourceDisplayName = GetDisplayNameByGamertag(packet->m_stringArgs[1]);
|
||||
if (packet->m_stringArgs.size() >= 1) playerDisplayName = GetDisplayNameByGamertag(packet->m_stringArgs[0]);
|
||||
if (packet->m_stringArgs.size() >= 2) sourceDisplayName = GetDisplayNameByGamertag(packet->m_stringArgs[1]);
|
||||
|
||||
switch(packet->m_messageType)
|
||||
{
|
||||
case ChatPacket::e_ChatCustom:
|
||||
case ChatPacket::e_ChatActionBar:
|
||||
if (stringArgsSize >= 1) {
|
||||
message = packet->m_stringArgs[0];
|
||||
|
||||
message = app.EscapeHTMLString(message); //do this to enforce escaped string
|
||||
message = app.FormatChatMessage(message); //this needs to be last cause it converts colors to html colors that would have been escaped
|
||||
} else {
|
||||
message = L"";
|
||||
}
|
||||
displayOnGui = (packet->m_messageType == ChatPacket::e_ChatCustom);
|
||||
message = (packet->m_stringArgs.size() >= 1) ? packet->m_stringArgs[0] : L"";
|
||||
break;
|
||||
case ChatPacket::e_ChatBedOccupied:
|
||||
message = app.GetString(IDS_TILE_BED_OCCUPIED);
|
||||
@@ -1978,7 +1906,7 @@ void ClientConnection::handleChat(shared_ptr<ChatPacket> packet)
|
||||
|
||||
if(replacePlayer)
|
||||
{
|
||||
message = replaceAll(message,L"{*PLAYER*}", playerDisplayName);
|
||||
message = replaceAll(message,L"{*PLAYER*}",playerDisplayName);
|
||||
}
|
||||
|
||||
if(replaceEntitySource)
|
||||
@@ -2013,9 +1941,7 @@ void ClientConnection::handleChat(shared_ptr<ChatPacket> packet)
|
||||
// flag that a message is a death message
|
||||
bool bIsDeathMessage = (packet->m_messageType>=ChatPacket::e_ChatDeathInFire) && (packet->m_messageType<=ChatPacket::e_ChatDeathIndirectMagicItem);
|
||||
|
||||
if( displayOnGui ) minecraft->gui->addMessage(message, m_userIndex, bIsDeathMessage);
|
||||
|
||||
if (!displayOnGui && !message.empty()) minecraft->gui->setActionBarMessage(message);
|
||||
if( displayOnGui ) minecraft->gui->addMessage(message,m_userIndex, bIsDeathMessage);
|
||||
}
|
||||
|
||||
void ClientConnection::handleAnimate(shared_ptr<AnimatePacket> packet)
|
||||
@@ -2944,7 +2870,7 @@ void ClientConnection::handleRespawn(shared_ptr<RespawnPacket> packet)
|
||||
MultiPlayerLevel *dimensionLevel = (MultiPlayerLevel *)minecraft->getLevel( packet->dimension );
|
||||
if( dimensionLevel == nullptr )
|
||||
{
|
||||
dimensionLevel = new MultiPlayerLevel(this, new LevelSettings(packet->mapSeed, packet->playerGameType, false, packet->m_isHardcore, packet->m_newSeaLevel, packet->m_pLevelType, packet->m_xzSize, packet->m_hellScale), packet->dimension, packet->difficulty);
|
||||
dimensionLevel = new MultiPlayerLevel(this, new LevelSettings(packet->mapSeed, packet->playerGameType, false, minecraft->level->getLevelData()->isHardcore(), packet->m_newSeaLevel, packet->m_pLevelType, packet->m_xzSize, packet->m_hellScale), packet->dimension, packet->difficulty);
|
||||
|
||||
// 4J Stu - We want to shared the savedDataStorage between both levels
|
||||
//if( dimensionLevel->savedDataStorage != nullptr )
|
||||
@@ -3389,9 +3315,7 @@ void ClientConnection::handleTileEditorOpen(shared_ptr<TileEditorOpenPacket> pac
|
||||
|
||||
void ClientConnection::handleSignUpdate(shared_ptr<SignUpdatePacket> packet)
|
||||
{
|
||||
app.DebugPrintf("[SIGN] handleSignUpdate at (%d, %d, %d):\n", packet->x, packet->y, packet->z);
|
||||
for (int i = 0; i < MAX_SIGN_LINES; i++)
|
||||
app.DebugPrintf("[SIGN] Line%d: \"%ls\"\n", i+1, packet->lines[i].c_str());
|
||||
app.DebugPrintf("ClientConnection::handleSignUpdate - ");
|
||||
if (minecraft->level->hasChunkAt(packet->x, packet->y, packet->z))
|
||||
{
|
||||
shared_ptr<TileEntity> te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z);
|
||||
@@ -3405,7 +3329,7 @@ void ClientConnection::handleSignUpdate(shared_ptr<SignUpdatePacket> packet)
|
||||
ste->SetMessage(i,packet->lines[i]);
|
||||
}
|
||||
|
||||
app.DebugPrintf("[SIGN] verified=%d censored=%d\n", packet->m_bVerified, packet->m_bCensored);
|
||||
app.DebugPrintf("verified = %d\tCensored = %d\n",packet->m_bVerified,packet->m_bCensored);
|
||||
ste->SetVerified(packet->m_bVerified);
|
||||
ste->SetCensored(packet->m_bCensored);
|
||||
|
||||
@@ -3413,12 +3337,12 @@ void ClientConnection::handleSignUpdate(shared_ptr<SignUpdatePacket> packet)
|
||||
}
|
||||
else
|
||||
{
|
||||
app.DebugPrintf("[SIGN] ERROR: tile entity is not a SignTileEntity\n");
|
||||
app.DebugPrintf("dynamic_pointer_cast<SignTileEntity>(te) == nullptr\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
app.DebugPrintf("[SIGN] ERROR: chunk not loaded at position\n");
|
||||
app.DebugPrintf("hasChunkAt failed\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3805,158 +3729,6 @@ void ClientConnection::handleSoundEvent(shared_ptr<LevelSoundPacket> packet)
|
||||
|
||||
void ClientConnection::handleCustomPayload(shared_ptr<CustomPayloadPacket> customPayloadPacket)
|
||||
{
|
||||
#ifdef _WINDOWS64
|
||||
// Build a server-specific identity token file path next to the executable.
|
||||
// Each server gets its own token file based on a hash of the server address,
|
||||
// so connecting to multiple secured servers doesn't overwrite tokens.
|
||||
auto buildIdentityTokenPath = []() -> std::string {
|
||||
char exePath[MAX_PATH] = {};
|
||||
DWORD len = GetModuleFileNameA(NULL, exePath, MAX_PATH);
|
||||
if (len == 0 || len >= MAX_PATH) return std::string();
|
||||
char *lastSlash = strrchr(exePath, '\\');
|
||||
if (lastSlash != NULL) *(lastSlash + 1) = 0;
|
||||
|
||||
// Hash the server IP:port to create a unique filename per server
|
||||
char serverAddr[300] = {};
|
||||
sprintf_s(serverAddr, sizeof(serverAddr), "%s:%d", g_Win64MultiplayerIP, g_Win64MultiplayerPort);
|
||||
unsigned int hash = 5381;
|
||||
for (const char *p = serverAddr; *p; ++p)
|
||||
hash = ((hash << 5) + hash) + static_cast<unsigned char>(*p);
|
||||
|
||||
char filename[64] = {};
|
||||
sprintf_s(filename, sizeof(filename), "identity-token-%08x.dat", hash);
|
||||
return std::string(exePath) + filename;
|
||||
};
|
||||
|
||||
// Identity token: server issued us a new token - store it locally
|
||||
if (CustomPayloadPacket::IDENTITY_TOKEN_ISSUE.compare(customPayloadPacket->identifier) == 0)
|
||||
{
|
||||
if (customPayloadPacket->data.data != nullptr && customPayloadPacket->length == 32)
|
||||
{
|
||||
std::string tokenPath = buildIdentityTokenPath();
|
||||
if (!tokenPath.empty())
|
||||
{
|
||||
FILE *f = nullptr;
|
||||
fopen_s(&f, tokenPath.c_str(), "wb");
|
||||
if (f != nullptr)
|
||||
{
|
||||
size_t written = fwrite(customPayloadPacket->data.data, 1, 32, f);
|
||||
fclose(f);
|
||||
if (written == 32)
|
||||
{
|
||||
app.DebugPrintf("Client: Stored identity token to %s\n", tokenPath.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
app.DebugPrintf("Client: Failed to write full identity token (wrote %zu/32)\n", written);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
app.DebugPrintf("Client: Failed to open %s for writing\n", tokenPath.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Identity token: server is challenging us to present our stored token
|
||||
if (CustomPayloadPacket::IDENTITY_TOKEN_CHALLENGE.compare(customPayloadPacket->identifier) == 0)
|
||||
{
|
||||
std::string tokenPath = buildIdentityTokenPath();
|
||||
FILE *f = nullptr;
|
||||
if (!tokenPath.empty())
|
||||
fopen_s(&f, tokenPath.c_str(), "rb");
|
||||
if (f != nullptr)
|
||||
{
|
||||
uint8_t token[32] = {};
|
||||
size_t bytesRead = fread(token, 1, 32, f);
|
||||
fclose(f);
|
||||
if (bytesRead == 32)
|
||||
{
|
||||
byteArray tokenData(32);
|
||||
memcpy(tokenData.data, token, 32);
|
||||
connection->send(std::make_shared<CustomPayloadPacket>(
|
||||
CustomPayloadPacket::IDENTITY_TOKEN_RESPONSE, tokenData));
|
||||
app.DebugPrintf("Client: Sent identity token response\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
app.DebugPrintf("Client: identity-token.dat is invalid (%zu bytes)\n", bytesRead);
|
||||
connection->send(std::make_shared<CustomPayloadPacket>(
|
||||
CustomPayloadPacket::IDENTITY_TOKEN_RESPONSE, byteArray()));
|
||||
}
|
||||
SecureZeroMemory(token, sizeof(token));
|
||||
}
|
||||
else
|
||||
{
|
||||
app.DebugPrintf("Client: No identity-token.dat found, sending empty response\n");
|
||||
connection->send(std::make_shared<CustomPayloadPacket>(
|
||||
CustomPayloadPacket::IDENTITY_TOKEN_RESPONSE, byteArray()));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Stream cipher handshake: server sent us a key
|
||||
if (CustomPayloadPacket::CIPHER_KEY_CHANNEL.compare(customPayloadPacket->identifier) == 0)
|
||||
{
|
||||
if (customPayloadPacket->length == ServerRuntime::Security::StreamCipher::KEY_SIZE &&
|
||||
customPayloadPacket->data.data != nullptr)
|
||||
{
|
||||
app.DebugPrintf("Client: Received MC|CKey from server (%d bytes)\n", customPayloadPacket->length);
|
||||
// Store key and send ack+activate atomically to prevent ResetClientCipher race
|
||||
WinsockNetLayer::StoreClientCipherKey(customPayloadPacket->data.data);
|
||||
if (!WinsockNetLayer::SendAckAndActivateClientSendCipher())
|
||||
{
|
||||
app.DebugPrintf("Client: Failed to send cipher ack, connection will be closed\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
app.DebugPrintf("Client: Received malformed MC|CKey (length=%d)\n", customPayloadPacket->length);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Fork server identification: enables render-distance-independent player list
|
||||
if (CustomPayloadPacket::FORK_HELLO_CHANNEL.compare(customPayloadPacket->identifier) == 0)
|
||||
{
|
||||
m_isForkServer = true;
|
||||
app.DebugPrintf("Client: Connected to fork server\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Fork server player leave: clean up IQNet slot so player leaves Tab list
|
||||
if (CustomPayloadPacket::FORK_PLAYER_LEAVE_CHANNEL.compare(customPayloadPacket->identifier) == 0)
|
||||
{
|
||||
if (customPayloadPacket->data.data != nullptr && customPayloadPacket->length > 0)
|
||||
{
|
||||
int nameLen = customPayloadPacket->length / static_cast<int>(sizeof(wchar_t));
|
||||
wstring leavingName(reinterpret_cast<const wchar_t*>(customPayloadPacket->data.data), nameLen);
|
||||
|
||||
for (int s = 1; s < MINECRAFT_NET_MAX_PLAYERS; ++s)
|
||||
{
|
||||
IQNetPlayer* qp = &IQNet::m_player[s];
|
||||
if (qp->GetCustomDataValue() != 0 &&
|
||||
_wcsicmp(qp->m_gamertag, leavingName.c_str()) == 0)
|
||||
{
|
||||
extern CPlatformNetworkManagerStub* g_pPlatformNetworkManager;
|
||||
g_pPlatformNetworkManager->NotifyPlayerLeaving(qp);
|
||||
qp->m_smallId = 0;
|
||||
qp->m_isRemote = false;
|
||||
qp->m_isHostPlayer = false;
|
||||
qp->m_resolvedXuid = INVALID_XUID;
|
||||
qp->m_gamertag[0] = 0;
|
||||
qp->SetCustomDataValue(0);
|
||||
app.DebugPrintf("Client: Player \"%ls\" left fork server, cleared IQNet slot %d\n", leavingName.c_str(), s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (CustomPayloadPacket::TRADER_LIST_PACKET.compare(customPayloadPacket->identifier) == 0)
|
||||
{
|
||||
ByteArrayInputStream bais(customPayloadPacket->data);
|
||||
@@ -4264,9 +4036,6 @@ void ClientConnection::handleSetPlayerTeamPacket(shared_ptr<SetPlayerTeamPacket>
|
||||
|
||||
void ClientConnection::handleParticleEvent(shared_ptr<LevelParticlesPacket> packet)
|
||||
{
|
||||
wstring particleName = packet->getName();
|
||||
ePARTICLE_TYPE particleId = (ePARTICLE_TYPE)Integer::parseInt(particleName);
|
||||
|
||||
for (int i = 0; i < packet->getCount(); i++)
|
||||
{
|
||||
double xVarience = random->nextGaussian() * packet->getXDist();
|
||||
@@ -4276,6 +4045,10 @@ void ClientConnection::handleParticleEvent(shared_ptr<LevelParticlesPacket> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
#include <unordered_set>
|
||||
#include "../Minecraft.World/net.minecraft.network.h"
|
||||
#include "..\Minecraft.World\net.minecraft.network.h"
|
||||
class Minecraft;
|
||||
class MultiPlayerLevel;
|
||||
class SavedDataStorage;
|
||||
@@ -48,7 +48,6 @@ private:
|
||||
|
||||
std::unordered_set<int> m_trackedEntityIds;
|
||||
std::unordered_set<int64_t> m_visibleChunks;
|
||||
bool m_isForkServer; // true when connected to a fork server (received MC|ForkHello)
|
||||
|
||||
static int64_t chunkKey(int x, int z) { return ((int64_t)x << 32) | ((int64_t)z & 0xFFFFFFFF); }
|
||||
|
||||
|
||||
@@ -1,13 +1,5 @@
|
||||
#include "stdafx.h"
|
||||
#include "ClientConstants.h"
|
||||
#include "Common/BuildVer.h"
|
||||
|
||||
const wstring ClientConstants::VERSION_STRING = wstring(L"Minecraft LCE ") + VER_FILEVERSION_STR_W;//+ SharedConstants::VERSION_STRING;
|
||||
const wstring ClientConstants::BRANCH_STRING = VER_BRANCHVERSION_STR_W;
|
||||
|
||||
// Default value for the toggle. If BuildVer defines VER_SHOW_VERSION_WATERMARK, use that.
|
||||
#ifdef VER_SHOW_VERSION_WATERMARK
|
||||
const bool ClientConstants::SHOW_VERSION_WATERMARK = (VER_SHOW_VERSION_WATERMARK != 0);
|
||||
#else
|
||||
const bool ClientConstants::SHOW_VERSION_WATERMARK = false;
|
||||
#endif
|
||||
|
||||
@@ -15,8 +15,5 @@ public:
|
||||
static const wstring VERSION_STRING;
|
||||
static const wstring BRANCH_STRING;
|
||||
|
||||
// Toggle to show/hide the version/branch watermark in the debug overlay
|
||||
static const bool SHOW_VERSION_WATERMARK;
|
||||
|
||||
static const bool DEADMAU5_CAMERA_CHEATS = false;
|
||||
};
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "stdafx.h"
|
||||
#include "Minecraft.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "../Minecraft.World/net.minecraft.world.level.dimension.h"
|
||||
#include "MultiPlayerLocalPlayer.h"
|
||||
#include "../Minecraft.World/JavaMath.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.dimension.h"
|
||||
#include "MultiplayerLocalPlayer.h"
|
||||
#include "..\Minecraft.World\JavaMath.h"
|
||||
#include "Texture.h"
|
||||
#include "ClockTexture.h"
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
#define GAME_HOST_OPTION_BITMASK_DOTILEDROPS 0x08000000
|
||||
#define GAME_HOST_OPTION_BITMASK_NATURALREGEN 0x10000000
|
||||
#define GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE 0x20000000
|
||||
#define GAME_HOST_OPTION_BITMASK_HARDCORE 0x40000000 // 4J Added - for hardcore mode
|
||||
#define GAME_HOST_OPTION_BITMASK_ALL 0xFFFFFFFF
|
||||
|
||||
#define GAME_HOST_OPTION_BITMASK_WORLDSIZE_BITSHIFT 20
|
||||
@@ -105,8 +104,6 @@ enum EGameHostOptionWorldSize
|
||||
#define GAMESETTING_ANIMATEDCHARACTER 0x00008000
|
||||
#define GAMESETTING_PS3EULAREAD 0x00010000
|
||||
#define GAMESETTING_PSVITANETWORKMODEADHOC 0x00020000
|
||||
#define GAMESETTING_VSYNC 0x01000000
|
||||
#define GAMESETTING_EXCLUSIVEFULLSCREEN 0x02000000
|
||||
|
||||
|
||||
// defines for languages
|
||||
|
||||
@@ -178,9 +178,6 @@ enum eGameSetting
|
||||
// PSVita
|
||||
eGameSetting_PSVita_NetworkModeAdhoc,
|
||||
|
||||
// PC
|
||||
eGameSetting_VSync,
|
||||
eGameSetting_ExclusiveFullscreen,
|
||||
|
||||
};
|
||||
|
||||
@@ -651,7 +648,6 @@ enum eGameHostOption
|
||||
eGameHostOption_DoTileDrops,
|
||||
eGameHostOption_NaturalRegeneration,
|
||||
eGameHostOption_DoDaylightCycle,
|
||||
eGameHostOption_Hardcore, // 4J Added - for hardcore mode
|
||||
};
|
||||
|
||||
// 4J-PB - If any new DLC items are added to the TMSFiles, this array needs updated
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
#pragma once
|
||||
|
||||
#include "../../../Minecraft.World/SoundTypes.h"
|
||||
#include "..\..\..\Minecraft.World\SoundTypes.h"
|
||||
|
||||
#ifdef _XBOX
|
||||
|
||||
#elif defined (__PS3__)
|
||||
#undef __in
|
||||
#undef __out
|
||||
#include "../../PS3/Miles/include/mss.h"
|
||||
#include "..\..\PS3\Miles\include\mss.h"
|
||||
#elif defined (__PSVITA__)
|
||||
#include "../../PSVITA/Miles/include/mss.h"
|
||||
#include "..\..\PSVITA\Miles\include\mss.h"
|
||||
#elif defined _DURANGO
|
||||
// 4J Stu - Temp define to get Miles to link, can likely be removed when we get a new version of Miles
|
||||
#define _SEKRIT
|
||||
#include "../../Durango/Miles/include/mss.h"
|
||||
#include "..\..\Durango\Miles\include\mss.h"
|
||||
#elif defined _WINDOWS64
|
||||
#else // PS4
|
||||
// 4J Stu - Temp define to get Miles to link, can likely be removed when we get a new version of Miles
|
||||
#define _SEKRIT2
|
||||
#include "../../Orbis/Miles/include/mss.h"
|
||||
#include "..\..\Orbis\Miles\include\mss.h"
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
|
||||
@@ -1,22 +1,20 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
#include "SoundEngine.h"
|
||||
#include "../Consoles_App.h"
|
||||
#include "../../MultiPlayerLocalPlayer.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "../../Minecraft.World/LevelData.h"
|
||||
#include "../../Minecraft.World/Mth.h"
|
||||
#include "../../TexturePackRepository.h"
|
||||
#include "../../DLCTexturePack.h"
|
||||
#include "../../MultiPlayerGameMode.h"
|
||||
#include "../../Minecraft.World/LevelSettings.h"
|
||||
#include "Common/DLC/DLCAudioFile.h"
|
||||
#include "..\Consoles_App.h"
|
||||
#include "..\..\MultiplayerLocalPlayer.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "..\..\Minecraft.World\leveldata.h"
|
||||
#include "..\..\Minecraft.World\mth.h"
|
||||
#include "..\..\TexturePackRepository.h"
|
||||
#include "..\..\DLCTexturePack.h"
|
||||
#include "Common\DLC\DLCAudioFile.h"
|
||||
|
||||
#ifdef __PSVITA__
|
||||
#include <audioout.h>
|
||||
#endif
|
||||
|
||||
#include "../../Minecraft.Client/Windows64/Windows64_App.h"
|
||||
#include "..\..\Minecraft.Client\Windows64\Windows64_App.h"
|
||||
|
||||
#include "stb_vorbis.h"
|
||||
|
||||
@@ -27,7 +25,7 @@
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <lce_filesystem/lce_filesystem.h>
|
||||
#include <lce_filesystem\lce_filesystem.h>
|
||||
|
||||
#ifdef __ORBIS__
|
||||
#include <audioout.h>
|
||||
@@ -116,9 +114,6 @@ const char *SoundEngine::m_szStreamFileA[eStream_Max]=
|
||||
"hal4",
|
||||
"nuance1",
|
||||
"nuance2",
|
||||
"piano1",
|
||||
"piano2",
|
||||
"piano3",
|
||||
|
||||
#ifndef _XBOX
|
||||
"creative1",
|
||||
@@ -133,6 +128,10 @@ const char *SoundEngine::m_szStreamFileA[eStream_Max]=
|
||||
"menu4",
|
||||
#endif
|
||||
|
||||
"piano1",
|
||||
"piano2",
|
||||
"piano3",
|
||||
|
||||
// Nether
|
||||
"nether1",
|
||||
"nether2",
|
||||
@@ -410,13 +409,6 @@ SoundEngine::SoundEngine()
|
||||
eStream_end_dragon,eStream_end_end,
|
||||
eStream_CD_1);
|
||||
|
||||
#ifndef _XBOX
|
||||
m_iStream_Creative_Min = eStream_Overworld_Creative1;
|
||||
m_iStream_Creative_Max = eStream_Overworld_Creative6;
|
||||
m_iStream_Menu_Min = eStream_Overworld_Menu1;
|
||||
m_iStream_Menu_Max = eStream_Overworld_Menu4;
|
||||
#endif
|
||||
|
||||
m_musicID=getMusicID(LevelData::DIMENSION_OVERWORLD);
|
||||
|
||||
m_StreamingAudioInfo.bIs3D=false;
|
||||
@@ -476,69 +468,65 @@ void SoundEngine::play(int iSound, float x, float y, float z, float volume, floa
|
||||
sprintf_s(basePath, "Windows64Media/Sound/%s", (char*)szSoundName);
|
||||
|
||||
char finalPath[256];
|
||||
sprintf_s(finalPath, "%s.wav", basePath);
|
||||
|
||||
// Check path cache first to avoid expensive filesystem probing
|
||||
auto cacheIt = m_soundPathCache.find(iSound);
|
||||
if (cacheIt != m_soundPathCache.end())
|
||||
const char* extensions[] = { ".ogg", ".wav", ".mp3" };
|
||||
size_t extCount = sizeof(extensions) / sizeof(extensions[0]);
|
||||
bool found = false;
|
||||
|
||||
for (size_t extIdx = 0; extIdx < extCount; extIdx++)
|
||||
{
|
||||
const auto& paths = cacheIt->second;
|
||||
if (paths.empty())
|
||||
return; // previously probed, no files found
|
||||
const std::string& chosen = paths[rand() % paths.size()];
|
||||
sprintf_s(finalPath, "%s", chosen.c_str());
|
||||
char basePlusExt[256];
|
||||
sprintf_s(basePlusExt, "%s%s", basePath, extensions[extIdx]);
|
||||
|
||||
DWORD attr = GetFileAttributesA(basePlusExt);
|
||||
if (attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY))
|
||||
{
|
||||
sprintf_s(finalPath, "%s", basePlusExt);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Cache miss — probe filesystem and store results
|
||||
std::vector<std::string> validPaths;
|
||||
const char* extensions[] = { ".ogg", ".wav", ".mp3" };
|
||||
size_t extCount = sizeof(extensions) / sizeof(extensions[0]);
|
||||
bool found = false;
|
||||
|
||||
// Check base name with each extension (non-numbered)
|
||||
if (!found)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
for (size_t extIdx = 0; extIdx < extCount; extIdx++)
|
||||
{
|
||||
char basePlusExt[256];
|
||||
sprintf_s(basePlusExt, "%s%s", basePath, extensions[extIdx]);
|
||||
|
||||
DWORD attr = GetFileAttributesA(basePlusExt);
|
||||
if (attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY))
|
||||
for (size_t i = 1; i < 32; i++)
|
||||
{
|
||||
validPaths.push_back(basePlusExt);
|
||||
found = true;
|
||||
break; // non-numbered: only one base file needed
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
{
|
||||
// Check numbered variants (e.g. sound1.ogg, sound2.ogg, ...)
|
||||
for (size_t extIdx = 0; extIdx < extCount; extIdx++)
|
||||
{
|
||||
for (int i = 1; i < 32; i++)
|
||||
char numberedPath[256];
|
||||
sprintf_s(numberedPath, "%s%d%s", basePath, i, extensions[extIdx]);
|
||||
|
||||
DWORD attr = GetFileAttributesA(numberedPath);
|
||||
if (attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY))
|
||||
{
|
||||
char numberedPath[256];
|
||||
sprintf_s(numberedPath, "%s%d%s", basePath, i, extensions[extIdx]);
|
||||
|
||||
DWORD attr = GetFileAttributesA(numberedPath);
|
||||
if (attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY))
|
||||
{
|
||||
validPaths.push_back(numberedPath);
|
||||
}
|
||||
count = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_soundPathCache[iSound] = validPaths;
|
||||
|
||||
if (validPaths.empty())
|
||||
if (count > 0)
|
||||
{
|
||||
sprintf_s(finalPath, "%s.wav", basePath); // fallback for debug print
|
||||
}
|
||||
else
|
||||
{
|
||||
const std::string& chosen = validPaths[rand() % validPaths.size()];
|
||||
sprintf_s(finalPath, "%s", chosen.c_str());
|
||||
int chosen = (rand() % count) + 1;
|
||||
for (size_t extIdx = 0; extIdx < extCount; extIdx++)
|
||||
{
|
||||
char numberedPath[256];
|
||||
sprintf_s(numberedPath, "%s%d%s", basePath, chosen, extensions[extIdx]);
|
||||
|
||||
DWORD attr = GetFileAttributesA(numberedPath);
|
||||
if (attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY))
|
||||
{
|
||||
sprintf_s(finalPath, "%s", numberedPath);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
sprintf_s(finalPath, "%s%d.wav", basePath, chosen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -558,7 +546,7 @@ void SoundEngine::play(int iSound, float x, float y, float z, float volume, floa
|
||||
if (ma_sound_init_from_file(
|
||||
&m_engine,
|
||||
finalPath,
|
||||
MA_SOUND_FLAG_DECODE | MA_SOUND_FLAG_ASYNC,
|
||||
MA_SOUND_FLAG_ASYNC,
|
||||
nullptr,
|
||||
nullptr,
|
||||
&s->sound) != MA_SUCCESS)
|
||||
@@ -614,40 +602,24 @@ void SoundEngine::playUI(int iSound, float volume, float pitch)
|
||||
sprintf_s(basePath, "Windows64Media/Sound/Minecraft/UI/%s", ConvertSoundPathToName(name));
|
||||
|
||||
char finalPath[256];
|
||||
sprintf_s(finalPath, "%s.wav", basePath);
|
||||
|
||||
// Check UI sound path cache first
|
||||
auto cacheIt = m_uiSoundPathCache.find(iSound);
|
||||
if (cacheIt != m_uiSoundPathCache.end())
|
||||
const char* extensions[] = { ".ogg", ".wav", ".mp3" };
|
||||
size_t count = sizeof(extensions) / sizeof(extensions[0]);
|
||||
bool found = false;
|
||||
for (size_t i = 0; i < count; i++)
|
||||
{
|
||||
if (cacheIt->second.empty())
|
||||
sprintf_s(finalPath, "%s%s", basePath, extensions[i]);
|
||||
if (FileExists(finalPath))
|
||||
{
|
||||
app.DebugPrintf("No sound file found for UI sound (cached): %s\n", basePath);
|
||||
return;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
sprintf_s(finalPath, "%s", cacheIt->second.c_str());
|
||||
}
|
||||
else
|
||||
if (!found)
|
||||
{
|
||||
// Cache miss — probe filesystem and store result
|
||||
const char* extensions[] = { ".ogg", ".wav", ".mp3" };
|
||||
size_t count = sizeof(extensions) / sizeof(extensions[0]);
|
||||
bool found = false;
|
||||
for (size_t i = 0; i < count; i++)
|
||||
{
|
||||
sprintf_s(finalPath, "%s%s", basePath, extensions[i]);
|
||||
if (FileExists(finalPath))
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
m_uiSoundPathCache[iSound] = ""; // cache negative result
|
||||
app.DebugPrintf("No sound file found for UI sound: %s\n", basePath);
|
||||
return;
|
||||
}
|
||||
m_uiSoundPathCache[iSound] = finalPath;
|
||||
app.DebugPrintf("No sound file found for UI sound: %s\n", basePath);
|
||||
return;
|
||||
}
|
||||
|
||||
MiniAudioSound* s = new MiniAudioSound();
|
||||
@@ -661,7 +633,7 @@ void SoundEngine::playUI(int iSound, float volume, float pitch)
|
||||
if (ma_sound_init_from_file(
|
||||
&m_engine,
|
||||
finalPath,
|
||||
MA_SOUND_FLAG_DECODE | MA_SOUND_FLAG_ASYNC,
|
||||
MA_SOUND_FLAG_ASYNC,
|
||||
nullptr,
|
||||
nullptr,
|
||||
&s->sound) != MA_SUCCESS)
|
||||
@@ -814,46 +786,6 @@ int SoundEngine::GetRandomishTrack(int iStart,int iEnd)
|
||||
app.DebugPrintf("Select track %d\n",iVal);
|
||||
return iVal;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////
|
||||
//
|
||||
// getOverworldMusicID - selects overworld music based on game mode
|
||||
//
|
||||
/////////////////////////////////////////////
|
||||
int SoundEngine::getOverworldMusicID(Minecraft *pMinecraft)
|
||||
{
|
||||
#ifndef _XBOX
|
||||
// Check if any local player is in creative mode
|
||||
bool isCreative = false;
|
||||
for(unsigned int i = 0; i < MAX_LOCAL_PLAYERS; i++)
|
||||
{
|
||||
if(pMinecraft->localplayers[i] != nullptr && pMinecraft->localgameModes[i] != nullptr)
|
||||
{
|
||||
GameType *mode = pMinecraft->localgameModes[i]->getLocalPlayerMode();
|
||||
if(mode != nullptr && mode->isCreative())
|
||||
{
|
||||
isCreative = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(isCreative)
|
||||
{
|
||||
// Creative: survival tracks + creative tracks
|
||||
int survivalCount = m_iStream_Overworld_Max - m_iStream_Overworld_Min + 1;
|
||||
int creativeCount = m_iStream_Creative_Max - m_iStream_Creative_Min + 1;
|
||||
int pick = random->nextInt(survivalCount + creativeCount);
|
||||
if(pick < survivalCount)
|
||||
return GetRandomishTrack(m_iStream_Overworld_Min, m_iStream_Overworld_Max);
|
||||
else
|
||||
return GetRandomishTrack(m_iStream_Creative_Min, m_iStream_Creative_Max);
|
||||
}
|
||||
#endif
|
||||
// Survival/Adventure: survival tracks only
|
||||
return GetRandomishTrack(m_iStream_Overworld_Min, m_iStream_Overworld_Max);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////
|
||||
//
|
||||
// getMusicID
|
||||
@@ -861,33 +793,29 @@ int SoundEngine::getOverworldMusicID(Minecraft *pMinecraft)
|
||||
/////////////////////////////////////////////
|
||||
int SoundEngine::getMusicID(int iDomain)
|
||||
{
|
||||
int result=-1;
|
||||
int iRandomVal=0;
|
||||
Minecraft *pMinecraft=Minecraft::GetInstance();
|
||||
|
||||
// Before the game has started?
|
||||
if(pMinecraft==nullptr)
|
||||
{
|
||||
#ifndef _XBOX
|
||||
// Title screen: play menu music
|
||||
result = GetRandomishTrack(m_iStream_Menu_Min,m_iStream_Menu_Max);
|
||||
#else
|
||||
result = GetRandomishTrack(m_iStream_Overworld_Min,m_iStream_Overworld_Max);
|
||||
#endif
|
||||
// any track from the overworld
|
||||
return GetRandomishTrack(m_iStream_Overworld_Min,m_iStream_Overworld_Max);
|
||||
}
|
||||
else if(pMinecraft->skins->isUsingDefaultSkin())
|
||||
|
||||
if(pMinecraft->skins->isUsingDefaultSkin())
|
||||
{
|
||||
switch(iDomain)
|
||||
{
|
||||
case LevelData::DIMENSION_END:
|
||||
// the end isn't random - it has different music depending on whether the dragon is alive or not, but we've not added the dead dragon music yet
|
||||
result = m_iStream_End_Min;
|
||||
break;
|
||||
return m_iStream_End_Min;
|
||||
case LevelData::DIMENSION_NETHER:
|
||||
result = GetRandomishTrack(m_iStream_Nether_Min,m_iStream_Nether_Max);
|
||||
break;
|
||||
return GetRandomishTrack(m_iStream_Nether_Min,m_iStream_Nether_Max);
|
||||
//return m_iStream_Nether_Min + random->nextInt(m_iStream_Nether_Max-m_iStream_Nether_Min);
|
||||
default: //overworld
|
||||
result = getOverworldMusicID(pMinecraft);
|
||||
break;
|
||||
//return m_iStream_Overworld_Min + random->nextInt(m_iStream_Overworld_Max-m_iStream_Overworld_Min);
|
||||
return GetRandomishTrack(m_iStream_Overworld_Min,m_iStream_Overworld_Max);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -896,22 +824,15 @@ int SoundEngine::getMusicID(int iDomain)
|
||||
switch(iDomain)
|
||||
{
|
||||
case LevelData::DIMENSION_END:
|
||||
result = GetRandomishTrack(m_iStream_End_Min,m_iStream_End_Max);
|
||||
break;
|
||||
return GetRandomishTrack(m_iStream_End_Min,m_iStream_End_Max);
|
||||
case LevelData::DIMENSION_NETHER:
|
||||
result = GetRandomishTrack(m_iStream_Nether_Min,m_iStream_Nether_Max);
|
||||
break;
|
||||
//return m_iStream_Nether_Min + random->nextInt(m_iStream_Nether_Max-m_iStream_Nether_Min);
|
||||
return GetRandomishTrack(m_iStream_Nether_Min,m_iStream_Nether_Max);
|
||||
default: //overworld
|
||||
result = getOverworldMusicID(pMinecraft);
|
||||
break;
|
||||
//return m_iStream_Overworld_Min + random->nextInt(m_iStream_Overworld_Max-m_iStream_Overworld_Min);
|
||||
return GetRandomishTrack(m_iStream_Overworld_Min,m_iStream_Overworld_Max);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
if(result >= 0 && result < eStream_Max)
|
||||
app.DebugPrintf("getMusicID: selected track '%s' (id=%d, domain=%d)\n", m_szStreamFileA[result], result, iDomain);
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////
|
||||
@@ -1576,4 +1497,4 @@ char *SoundEngine::ConvertSoundPathToName(const wstring& name, bool bConvertSpac
|
||||
return buf;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,13 +1,10 @@
|
||||
#pragma once
|
||||
class Minecraft;
|
||||
class Mob;
|
||||
class Options;
|
||||
using namespace std;
|
||||
#include "..\..\Minecraft.World\SoundTypes.h"
|
||||
|
||||
#include "miniaudio.h"
|
||||
#include <unordered_map>
|
||||
#include <string>
|
||||
|
||||
constexpr float SFX_3D_MIN_DISTANCE = 1.0f;
|
||||
constexpr float SFX_3D_MAX_DISTANCE = 16.0f;
|
||||
@@ -26,10 +23,8 @@ enum eMUSICFILES
|
||||
eStream_Overworld_hal4,
|
||||
eStream_Overworld_nuance1,
|
||||
eStream_Overworld_nuance2,
|
||||
eStream_Overworld_piano1,
|
||||
eStream_Overworld_piano2,
|
||||
eStream_Overworld_piano3, // <-- make piano3 the last survival overworld one
|
||||
#ifndef _XBOX
|
||||
// Add the new music tracks
|
||||
eStream_Overworld_Creative1,
|
||||
eStream_Overworld_Creative2,
|
||||
eStream_Overworld_Creative3,
|
||||
@@ -41,6 +36,9 @@ enum eMUSICFILES
|
||||
eStream_Overworld_Menu3,
|
||||
eStream_Overworld_Menu4,
|
||||
#endif
|
||||
eStream_Overworld_piano1,
|
||||
eStream_Overworld_piano2,
|
||||
eStream_Overworld_piano3, // <-- make piano3 the last overworld one
|
||||
// Nether
|
||||
eStream_Nether1,
|
||||
eStream_Nether2,
|
||||
@@ -136,7 +134,6 @@ public:
|
||||
bool isStreamingWavebankReady(); // 4J Added
|
||||
int getMusicID(int iDomain);
|
||||
int getMusicID(const wstring& name);
|
||||
int getOverworldMusicID(Minecraft *pMinecraft);
|
||||
void SetStreamingSounds(int iOverworldMin, int iOverWorldMax, int iNetherMin, int iNetherMax, int iEndMin, int iEndMax, int iCD1);
|
||||
void updateMiniAudio();
|
||||
void playMusicUpdate();
|
||||
@@ -188,15 +185,8 @@ private:
|
||||
int m_iStream_Nether_Min,m_iStream_Nether_Max;
|
||||
int m_iStream_End_Min,m_iStream_End_Max;
|
||||
int m_iStream_CD_1;
|
||||
#ifndef _XBOX
|
||||
int m_iStream_Creative_Min, m_iStream_Creative_Max;
|
||||
int m_iStream_Menu_Min, m_iStream_Menu_Max;
|
||||
#endif
|
||||
bool *m_bHeardTrackA;
|
||||
|
||||
std::unordered_map<int, std::vector<std::string>> m_soundPathCache; // play(): sound ID → all valid variant paths
|
||||
std::unordered_map<int, std::string> m_uiSoundPathCache; // playUI(): sound ID → resolved path
|
||||
|
||||
#ifdef __ORBIS__
|
||||
int32_t m_hBGMAudio;
|
||||
#endif
|
||||
|
||||
@@ -187,28 +187,28 @@ const WCHAR *ConsoleSoundEngine::wchSoundNames[eSoundType_MAX]=
|
||||
|
||||
L"liquid.swim", //eSoundType_LIQUID_SWIM,
|
||||
|
||||
L"Mob.horse.land", //eSoundType_MOB_HORSE_LAND,
|
||||
L"Mob.horse.armor", //eSoundType_MOB_HORSE_ARMOR,
|
||||
L"Mob.horse.leather", //eSoundType_MOB_HORSE_LEATHER,
|
||||
L"Mob.horse.zombie.death", //eSoundType_MOB_HORSE_ZOMBIE_DEATH,
|
||||
L"Mob.horse.skeleton.death", //eSoundType_MOB_HORSE_SKELETON_DEATH,
|
||||
L"Mob.horse.donkey.death", //eSoundType_MOB_HORSE_DONKEY_DEATH,
|
||||
L"Mob.horse.death", //eSoundType_MOB_HORSE_DEATH,
|
||||
L"Mob.horse.zombie.hit", //eSoundType_MOB_HORSE_ZOMBIE_HIT,
|
||||
L"Mob.horse.skeleton.hit", //eSoundType_MOB_HORSE_SKELETON_HIT,
|
||||
L"Mob.horse.donkey.hit", //eSoundType_MOB_HORSE_DONKEY_HIT,
|
||||
L"Mob.horse.hit", //eSoundType_MOB_HORSE_HIT,
|
||||
L"Mob.horse.zombie.idle", //eSoundType_MOB_HORSE_ZOMBIE_IDLE,
|
||||
L"Mob.horse.skeleton.idle", //eSoundType_MOB_HORSE_SKELETON_IDLE,
|
||||
L"Mob.horse.donkey.idle", //eSoundType_MOB_HORSE_DONKEY_IDLE,
|
||||
L"Mob.horse.idle", //eSoundType_MOB_HORSE_IDLE,
|
||||
L"Mob.horse.donkey.angry", //eSoundType_MOB_HORSE_DONKEY_ANGRY,
|
||||
L"Mob.horse.angry", //eSoundType_MOB_HORSE_ANGRY,
|
||||
L"Mob.horse.gallop", //eSoundType_MOB_HORSE_GALLOP,
|
||||
L"Mob.horse.breathe", //eSoundType_MOB_HORSE_BREATHE,
|
||||
L"Mob.horse.wood", //eSoundType_MOB_HORSE_WOOD,
|
||||
L"Mob.horse.soft", //eSoundType_MOB_HORSE_SOFT,
|
||||
L"Mob.horse.jump", //eSoundType_MOB_HORSE_JUMP,
|
||||
L"mob.horse.land", //eSoundType_MOB_HORSE_LAND,
|
||||
L"mob.horse.armor", //eSoundType_MOB_HORSE_ARMOR,
|
||||
L"mob.horse.leather", //eSoundType_MOB_HORSE_LEATHER,
|
||||
L"mob.horse.zombie.death", //eSoundType_MOB_HORSE_ZOMBIE_DEATH,
|
||||
L"mob.horse.skeleton.death", //eSoundType_MOB_HORSE_SKELETON_DEATH,
|
||||
L"mob.horse.donkey.death", //eSoundType_MOB_HORSE_DONKEY_DEATH,
|
||||
L"mob.horse.death", //eSoundType_MOB_HORSE_DEATH,
|
||||
L"mob.horse.zombie.hit", //eSoundType_MOB_HORSE_ZOMBIE_HIT,
|
||||
L"mob.horse.skeleton.hit", //eSoundType_MOB_HORSE_SKELETON_HIT,
|
||||
L"mob.horse.donkey.hit", //eSoundType_MOB_HORSE_DONKEY_HIT,
|
||||
L"mob.horse.hit", //eSoundType_MOB_HORSE_HIT,
|
||||
L"mob.horse.zombie.idle", //eSoundType_MOB_HORSE_ZOMBIE_IDLE,
|
||||
L"mob.horse.skeleton.idle", //eSoundType_MOB_HORSE_SKELETON_IDLE,
|
||||
L"mob.horse.donkey.idle", //eSoundType_MOB_HORSE_DONKEY_IDLE,
|
||||
L"mob.horse.idle", //eSoundType_MOB_HORSE_IDLE,
|
||||
L"mob.horse.donkey.angry", //eSoundType_MOB_HORSE_DONKEY_ANGRY,
|
||||
L"mob.horse.angry", //eSoundType_MOB_HORSE_ANGRY,
|
||||
L"mob.horse.gallop", //eSoundType_MOB_HORSE_GALLOP,
|
||||
L"mob.horse.breathe", //eSoundType_MOB_HORSE_BREATHE,
|
||||
L"mob.horse.wood", //eSoundType_MOB_HORSE_WOOD,
|
||||
L"mob.horse.soft", //eSoundType_MOB_HORSE_SOFT,
|
||||
L"mob.horse.jump", //eSoundType_MOB_HORSE_JUMP,
|
||||
|
||||
L"mob.witch.ambient", //eSoundType_MOB_WITCH_IDLE,
|
||||
L"mob.witch.hurt", //eSoundType_MOB_WITCH_HURT,
|
||||
@@ -223,8 +223,6 @@ const WCHAR *ConsoleSoundEngine::wchSoundNames[eSoundType_MAX]=
|
||||
// 4J-PB - Some sounds were updated, but we can't do that for the 360 or we have to do a new sound bank
|
||||
// instead, we'll add the sounds as new ones and change the code to reference them
|
||||
L"fire.new_ignite",
|
||||
|
||||
L"damage.critical", //eSoundType_DAMAGE_CRITICAL,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
|
||||
#pragma once
|
||||
#include "../Minecraft.Client/Common/C4JMemoryPool.h"
|
||||
#include "..\Minecraft.Client\Common\C4JMemoryPool.h"
|
||||
|
||||
// Custom allocator, takes a C4JMemoryPool class, which can be one of a number of pool implementations.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "stdafx.h"
|
||||
#include "ColourTable.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
|
||||
unordered_map<wstring,eMinecraftColour> ColourTable::s_colourNamesMap;
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
|
||||
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
|
||||
@@ -0,0 +1,115 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Media\ChestMenu720.swf" />
|
||||
<None Include="Media\CreateWorldMenu720.swf" />
|
||||
<None Include="Media\CreativeMenu720.swf" />
|
||||
<None Include="Media\DebugMenu720.swf" />
|
||||
<None Include="Media\FullscreenProgress720.swf" />
|
||||
<None Include="Media\HUD720.swf" />
|
||||
<None Include="Media\InventoryMenu720.swf" />
|
||||
<None Include="Media\languages.loc" />
|
||||
<None Include="Media\LaunchMoreOptionsMenu720.swf" />
|
||||
<None Include="Media\LoadMenu720.swf" />
|
||||
<None Include="Media\LoadOrJoinMenu720.swf" />
|
||||
<None Include="Media\MainMenu720.swf" />
|
||||
<None Include="Media\media.arc" />
|
||||
<None Include="Media\Panorama720.swf" />
|
||||
<None Include="Media\PauseMenu720.swf" />
|
||||
<None Include="Media\skin.swf" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Media\strings.resx" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="Media\media.txt" />
|
||||
<Text Include="Media\strings_begin.txt" />
|
||||
<Text Include="Media\strings_Controls.txt" />
|
||||
<Text Include="Media\strings_Credits.txt" />
|
||||
<Text Include="Media\strings_Descriptions.txt" />
|
||||
<Text Include="Media\strings_end.txt" />
|
||||
<Text Include="Media\strings_HowToPlay.txt" />
|
||||
<Text Include="Media\strings_ItemsAndTiles.txt" />
|
||||
<Text Include="Media\strings_Misc.txt" />
|
||||
<Text Include="Media\strings_PotionsAndEnchantments.txt" />
|
||||
<Text Include="Media\strings_Tips.txt" />
|
||||
<Text Include="Media\strings_Tooltips.txt" />
|
||||
<Text Include="Media\strings_Tutorial.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\Durango\strings.h" />
|
||||
<ClInclude Include="..\Orbis\strings.h" />
|
||||
<ClInclude Include="..\PS3\strings.h" />
|
||||
<ClInclude Include="..\Windows64\strings.h" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}</ProjectGuid>
|
||||
<Keyword>MakeFileProj</Keyword>
|
||||
<SccProjectName>SAK</SccProjectName>
|
||||
<SccAuxPath>SAK</SccAuxPath>
|
||||
<SccLocalPath>SAK</SccLocalPath>
|
||||
<SccProvider>SAK</SccProvider>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Makefile</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v110</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Makefile</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v110</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<NMakePreprocessorDefinitions>WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
<NMakeBuildCommandLine>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</NMakeBuildCommandLine>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<NMakePreprocessorDefinitions>WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
</ItemDefinitionGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,136 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="IggyMedia">
|
||||
<UniqueIdentifier>{55c7ab2e-b3e5-4aed-9ffe-3308591d9c34}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Strings">
|
||||
<UniqueIdentifier>{eaa0eb72-0b27-4080-ad53-f68e42f37ba8}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Archive">
|
||||
<UniqueIdentifier>{711ad95b-eb56-4e18-b001-34ad7b8075a3}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Archive\Win64">
|
||||
<UniqueIdentifier>{1432ec3d-c5d0-46da-91b6-e7737095a97e}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Archive\PS4">
|
||||
<UniqueIdentifier>{4b2aeaf1-04d7-454d-b2d9-08364799831c}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Archive\PS3">
|
||||
<UniqueIdentifier>{4b0eaef6-fa2f-4605-b0da-a81ffb5659bc}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Archive\Durango">
|
||||
<UniqueIdentifier>{bf1c74da-21f1-4bdd-98ed-83457946e4cc}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Media\ChestMenu720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\CreateWorldMenu720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\CreativeMenu720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\DebugMenu720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\FullscreenProgress720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\HUD720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\InventoryMenu720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\media.arc">
|
||||
<Filter>Archive</Filter>
|
||||
</None>
|
||||
<None Include="Media\languages.loc">
|
||||
<Filter>Archive</Filter>
|
||||
</None>
|
||||
<None Include="Media\skin.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\MainMenu720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\Panorama720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\LoadOrJoinMenu720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\LaunchMoreOptionsMenu720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\LoadMenu720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
<None Include="Media\PauseMenu720.swf">
|
||||
<Filter>IggyMedia</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Media\strings.resx">
|
||||
<Filter>Strings</Filter>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="Media\strings_begin.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_Controls.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_Credits.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_Descriptions.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_end.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_HowToPlay.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_ItemsAndTiles.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_Misc.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_PotionsAndEnchantments.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_Tips.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_Tooltips.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\strings_Tutorial.txt">
|
||||
<Filter>Strings</Filter>
|
||||
</Text>
|
||||
<Text Include="Media\media.txt">
|
||||
<Filter>Archive</Filter>
|
||||
</Text>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\Durango\strings.h">
|
||||
<Filter>Archive\Durango</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\PS3\strings.h">
|
||||
<Filter>Archive\PS3</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\Orbis\strings.h">
|
||||
<Filter>Archive\PS4</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\Windows64\strings.h">
|
||||
<Filter>Archive\Win64</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "stdafx.h"
|
||||
#include "ConsoleGameMode.h"
|
||||
#include "./Tutorial/Tutorial.h"
|
||||
#include ".\Tutorial\Tutorial.h"
|
||||
|
||||
ConsoleGameMode::ConsoleGameMode(int iPad, Minecraft *minecraft, ClientConnection *connection)
|
||||
: TutorialMode(iPad, minecraft, connection)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#pragma once
|
||||
#include "./Tutorial/TutorialMode.h"
|
||||
#include ".\Tutorial\TutorialMode.h"
|
||||
|
||||
class ConsoleGameMode : public TutorialMode
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "stdafx.h"
|
||||
#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD)
|
||||
#include "../../Minecraft.Server/ServerLogManager.h"
|
||||
#include "..\..\Minecraft.Server\ServerLogManager.h"
|
||||
#endif
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
@@ -1,66 +1,66 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../Minecraft.World/net.minecraft.world.entity.item.h"
|
||||
#include "../../Minecraft.World/net.minecraft.world.entity.player.h"
|
||||
#include "../../Minecraft.World/net.minecraft.world.level.tile.entity.h"
|
||||
#include "../../Minecraft.World/net.minecraft.world.phys.h"
|
||||
#include "../../Minecraft.World/InputOutputStream.h"
|
||||
#include "../../Minecraft.World/compression.h"
|
||||
#include "../Options.h"
|
||||
#include "../MinecraftServer.h"
|
||||
#include "../MultiPlayerLevel.h"
|
||||
#include "../GameRenderer.h"
|
||||
#include "../ProgressRenderer.h"
|
||||
#include "../LevelRenderer.h"
|
||||
#include "../MobSkinMemTextureProcessor.h"
|
||||
#include "../Minecraft.h"
|
||||
#include "../ClientConnection.h"
|
||||
#include "../MultiPlayerLocalPlayer.h"
|
||||
#include "../LocalPlayer.h"
|
||||
#include "../../Minecraft.World/Player.h"
|
||||
#include "../../Minecraft.World/Inventory.h"
|
||||
#include "../../Minecraft.World/Level.h"
|
||||
#include "../../Minecraft.World/FurnaceTileEntity.h"
|
||||
#include "../../Minecraft.World/Container.h"
|
||||
#include "../../Minecraft.World/DispenserTileEntity.h"
|
||||
#include "../../Minecraft.World/SignTileEntity.h"
|
||||
#include "../StatsCounter.h"
|
||||
#include "../GameMode.h"
|
||||
#include "../Xbox/Social/SocialManager.h"
|
||||
#include "Tutorial/TutorialMode.h"
|
||||
#include "..\..\Minecraft.World\net.minecraft.world.entity.item.h"
|
||||
#include "..\..\Minecraft.World\net.minecraft.world.entity.player.h"
|
||||
#include "..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h"
|
||||
#include "..\..\Minecraft.World\net.minecraft.world.phys.h"
|
||||
#include "..\..\Minecraft.World\InputOutputStream.h"
|
||||
#include "..\..\Minecraft.World\compression.h"
|
||||
#include "..\Options.h"
|
||||
#include "..\MinecraftServer.h"
|
||||
#include "..\MultiPlayerLevel.h"
|
||||
#include "..\GameRenderer.h"
|
||||
#include "..\ProgressRenderer.h"
|
||||
#include "..\LevelRenderer.h"
|
||||
#include "..\MobSkinMemTextureProcessor.h"
|
||||
#include "..\Minecraft.h"
|
||||
#include "..\ClientConnection.h"
|
||||
#include "..\MultiPlayerLocalPlayer.h"
|
||||
#include "..\LocalPlayer.h"
|
||||
#include "..\..\Minecraft.World\Player.h"
|
||||
#include "..\..\Minecraft.World\Inventory.h"
|
||||
#include "..\..\Minecraft.World\Level.h"
|
||||
#include "..\..\Minecraft.World\FurnaceTileEntity.h"
|
||||
#include "..\..\Minecraft.World\Container.h"
|
||||
#include "..\..\Minecraft.World\DispenserTileEntity.h"
|
||||
#include "..\..\Minecraft.World\SignTileEntity.h"
|
||||
#include "..\StatsCounter.h"
|
||||
#include "..\GameMode.h"
|
||||
#include "..\Xbox\Social\SocialManager.h"
|
||||
#include "Tutorial\TutorialMode.h"
|
||||
#if defined _XBOX || defined _WINDOWS64
|
||||
#include "../Xbox/XML/ATGXmlParser.h"
|
||||
#include "../Xbox/XML/xmlFilesCallback.h"
|
||||
#include "..\Xbox\XML\ATGXmlParser.h"
|
||||
#include "..\Xbox\XML\xmlFilesCallback.h"
|
||||
#endif
|
||||
#include "Minecraft_Macros.h"
|
||||
#include "../PlayerList.h"
|
||||
#include "../ServerPlayer.h"
|
||||
#include "GameRules/ConsoleGameRules.h"
|
||||
#include "GameRules/ConsoleSchematicFile.h"
|
||||
#include "../User.h"
|
||||
#include "../../Minecraft.World/LevelData.h"
|
||||
#include "..\PlayerList.h"
|
||||
#include "..\ServerPlayer.h"
|
||||
#include "GameRules\ConsoleGameRules.h"
|
||||
#include "GameRules\ConsoleSchematicFile.h"
|
||||
#include "..\User.h"
|
||||
#include "..\..\Minecraft.World\LevelData.h"
|
||||
#if defined(_WINDOWS64) && defined(MINECRAFT_SERVER_BUILD)
|
||||
#include "../../Minecraft.Server/ServerLogManager.h"
|
||||
#include "..\..\Minecraft.Server\ServerLogManager.h"
|
||||
#endif
|
||||
#include "../../Minecraft.World/net.minecraft.world.entity.player.h"
|
||||
#include "../EntityRenderDispatcher.h"
|
||||
#include "../../Minecraft.World/compression.h"
|
||||
#include "../TexturePackRepository.h"
|
||||
#include "../DLCTexturePack.h"
|
||||
#include "DLC/DLCPack.h"
|
||||
#include "../StringTable.h"
|
||||
#include "..\..\Minecraft.World\net.minecraft.world.entity.player.h"
|
||||
#include "..\EntityRenderDispatcher.h"
|
||||
#include "..\..\Minecraft.World\compression.h"
|
||||
#include "..\TexturePackRepository.h"
|
||||
#include "..\DLCTexturePack.h"
|
||||
#include "DLC\DLCPack.h"
|
||||
#include "..\StringTable.h"
|
||||
#ifndef _XBOX
|
||||
#include "../ArchiveFile.h"
|
||||
#include "..\ArchiveFile.h"
|
||||
#endif
|
||||
#include "../Minecraft.h"
|
||||
#include "..\Minecraft.h"
|
||||
#ifdef _XBOX
|
||||
#include "../Xbox/GameConfig/Minecraft.spa.h"
|
||||
#include "../Xbox/Network/NetworkPlayerXbox.h"
|
||||
#include "XUI/XUI_TextEntry.h"
|
||||
#include "XUI/XUI_XZP_Icons.h"
|
||||
#include "XUI/XUI_PauseMenu.h"
|
||||
#include "..\Xbox\GameConfig\Minecraft.spa.h"
|
||||
#include "..\Xbox\Network\NetworkPlayerXbox.h"
|
||||
#include "XUI\XUI_TextEntry.h"
|
||||
#include "XUI\XUI_XZP_Icons.h"
|
||||
#include "XUI\XUI_PauseMenu.h"
|
||||
#else
|
||||
#include "UI/UI.h"
|
||||
#include "UI/UIScene_PauseMenu.h"
|
||||
#include "UI\UI.h"
|
||||
#include "UI\UIScene_PauseMenu.h"
|
||||
#endif
|
||||
#ifdef __PS3__
|
||||
#include <sys/tty.h>
|
||||
@@ -69,8 +69,7 @@
|
||||
#include <save_data_dialog.h>
|
||||
#endif
|
||||
|
||||
#include "../Common/Leaderboards/LeaderboardManager.h"
|
||||
#include <regex>
|
||||
#include "..\Common\Leaderboards\LeaderboardManager.h"
|
||||
|
||||
//CMinecraftApp app;
|
||||
unsigned int CMinecraftApp::m_uiLastSignInData = 0;
|
||||
@@ -188,7 +187,6 @@ CMinecraftApp::CMinecraftApp()
|
||||
#endif
|
||||
|
||||
ZeroMemory(m_playerColours,MINECRAFT_NET_MAX_PLAYERS);
|
||||
ZeroMemory(m_playerMapIcons,MINECRAFT_NET_MAX_PLAYERS);
|
||||
|
||||
m_iDLCOfferC=0;
|
||||
m_bAllDLCContentRetrieved=true;
|
||||
@@ -208,8 +206,6 @@ CMinecraftApp::CMinecraftApp()
|
||||
m_dwRequiredTexturePackID=0;
|
||||
|
||||
m_bResetNether=false;
|
||||
m_seedOverride = 0;
|
||||
m_hasSeedOverride = false;
|
||||
|
||||
#ifdef _XBOX
|
||||
// m_bTransferSavesToXboxOne=false;
|
||||
@@ -1386,7 +1382,6 @@ void CMinecraftApp::ApplyGameSettingsChanged(int iPad)
|
||||
ActionGameSettings(iPad,eGameSetting_AnimatedCharacter);
|
||||
|
||||
ActionGameSettings(iPad,eGameSetting_PS3_EULA_Read);
|
||||
ActionGameSettings(iPad,eGameSetting_VSync);
|
||||
|
||||
}
|
||||
|
||||
@@ -1622,22 +1617,6 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal)
|
||||
case eGameSetting_PSVita_NetworkModeAdhoc:
|
||||
//nothing to do here
|
||||
break;
|
||||
case eGameSetting_VSync:
|
||||
#ifdef _WINDOWS64
|
||||
{
|
||||
extern bool g_bVSync;
|
||||
g_bVSync = (GetGameSettings(iPad, eGameSetting_VSync) != 0);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case eGameSetting_ExclusiveFullscreen:
|
||||
#ifdef _WINDOWS64
|
||||
{
|
||||
extern void SetExclusiveFullscreen(bool enabled);
|
||||
SetExclusiveFullscreen(GetGameSettings(iPad, eGameSetting_ExclusiveFullscreen) != 0);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2349,38 +2328,6 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV
|
||||
}
|
||||
break;
|
||||
|
||||
case eGameSetting_VSync:
|
||||
if(((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_VSYNC)>>24)!=(ucVal&0x01))
|
||||
{
|
||||
if(ucVal==1)
|
||||
{
|
||||
GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_VSYNC;
|
||||
}
|
||||
else
|
||||
{
|
||||
GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_VSYNC;
|
||||
}
|
||||
ActionGameSettings(iPad,eVal);
|
||||
GameSettingsA[iPad]->bSettingsChanged=true;
|
||||
}
|
||||
break;
|
||||
|
||||
case eGameSetting_ExclusiveFullscreen:
|
||||
if(((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_EXCLUSIVEFULLSCREEN)>>25)!=(ucVal&0x01))
|
||||
{
|
||||
if(ucVal==1)
|
||||
{
|
||||
GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_EXCLUSIVEFULLSCREEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_EXCLUSIVEFULLSCREEN;
|
||||
}
|
||||
ActionGameSettings(iPad,eVal);
|
||||
GameSettingsA[iPad]->bSettingsChanged=true;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2516,12 +2463,6 @@ unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal)
|
||||
case eGameSetting_PSVita_NetworkModeAdhoc:
|
||||
return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PSVITANETWORKMODEADHOC)>>17;
|
||||
|
||||
case eGameSetting_VSync:
|
||||
return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_VSYNC)>>24;
|
||||
|
||||
case eGameSetting_ExclusiveFullscreen:
|
||||
return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_EXCLUSIVEFULLSCREEN)>>25;
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -6654,97 +6595,6 @@ wstring CMinecraftApp::FormatHTMLString(int iPad, const wstring &desc, int shado
|
||||
return text;
|
||||
}
|
||||
|
||||
//found list of html escapes at https://stackoverflow.com/questions/7381974/which-characters-need-to-be-escaped-in-html
|
||||
wstring CMinecraftApp::EscapeHTMLString(const wstring& desc)
|
||||
{
|
||||
static std::unordered_map<wchar_t, wchar_t*> replacementMap = {
|
||||
{L'&', L"&"},
|
||||
{L'<', L"<"},
|
||||
{L'>', L">"},
|
||||
};
|
||||
|
||||
wstring finalString = L"";
|
||||
for (int i = 0; i < desc.size(); i++) {
|
||||
wchar_t _char = desc[i];
|
||||
auto it = replacementMap.find(_char);
|
||||
|
||||
if (it != replacementMap.end()) finalString += it->second;
|
||||
else finalString += _char;
|
||||
}
|
||||
|
||||
return finalString;
|
||||
}
|
||||
|
||||
wstring CMinecraftApp::FormatChatMessage(const wstring& desc, bool applyStyling)
|
||||
{
|
||||
static std::wregex IDS_Pattern(LR"(\{\*IDS_(\d+)\*\})"); //maybe theres a better way to do translateable IDS
|
||||
static std::wstring_view colorFormatString = L"<font color=\"#%08x\">";
|
||||
|
||||
wstring results = desc;
|
||||
wchar_t replacements[64];
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_0), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§0", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_1), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§1", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_2), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§2", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_3), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§3", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_4), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§4", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_5), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§5", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_6), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§6", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_7), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§7", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_8), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§8", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_9), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§9", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_a), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§a", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_b), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§b", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_c), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§c", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_d), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§d", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_e), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§e", replacements);
|
||||
|
||||
swprintf(replacements, 64, (applyStyling ? colorFormatString.data() : L""), GetHTMLColour(eHTMLColor_f), 0xFFFFFFFF);
|
||||
results = replaceAll(results, L"§f", replacements);
|
||||
results = replaceAll(results, L"§r", replacements); //we only support color so reset is the same as white color
|
||||
|
||||
results = replaceAll(results, L"'", L"\u2019");
|
||||
|
||||
if (applyStyling) {
|
||||
std::wsmatch match;
|
||||
while (std::regex_search(results, match, IDS_Pattern)) {
|
||||
results = replaceAll(results, match[0], app.GetString(std::stoi(match[1].str())));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
wstring CMinecraftApp::GetActionReplacement(int iPad, unsigned char ucAction)
|
||||
{
|
||||
unsigned int input = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal(iPad) ,ucAction);
|
||||
@@ -8234,16 +8084,6 @@ void CMinecraftApp::SetGameHostOption(unsigned int &uiHostSettings, eGameHostOpt
|
||||
uiHostSettings&=~GAME_HOST_OPTION_BITMASK_WORLDSIZE;
|
||||
uiHostSettings|=(GAME_HOST_OPTION_BITMASK_WORLDSIZE & (uiVal<<GAME_HOST_OPTION_BITMASK_WORLDSIZE_BITSHIFT));
|
||||
break;
|
||||
case eGameHostOption_Hardcore: // 4J Added - for hardcore mode
|
||||
if(uiVal!=0)
|
||||
{
|
||||
uiHostSettings |= GAME_HOST_OPTION_BITMASK_HARDCORE;
|
||||
}
|
||||
else
|
||||
{
|
||||
uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_HARDCORE;
|
||||
}
|
||||
break;
|
||||
case eGameHostOption_All:
|
||||
uiHostSettings=uiVal;
|
||||
break;
|
||||
@@ -8345,9 +8185,6 @@ unsigned int CMinecraftApp::GetGameHostOption(unsigned int uiHostSettings, eGame
|
||||
case eGameHostOption_DoDaylightCycle:
|
||||
return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE);
|
||||
break;
|
||||
case eGameHostOption_Hardcore: // 4J Added - for hardcore mode
|
||||
return (uiHostSettings&GAME_HOST_OPTION_BITMASK_HARDCORE) ? 1 : 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -8626,39 +8463,6 @@ short CMinecraftApp::GetPlayerColour(BYTE networkSmallId)
|
||||
return index;
|
||||
}
|
||||
|
||||
void CMinecraftApp::SetPlayerMapIcon(const wchar_t* name, char icon)
|
||||
{
|
||||
if (name == nullptr) return;
|
||||
// Update existing entry or use first empty slot
|
||||
int emptySlot = -1;
|
||||
for (int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i)
|
||||
{
|
||||
if (m_playerMapIcons[i].name[0] != 0 && _wcsicmp(m_playerMapIcons[i].name, name) == 0)
|
||||
{
|
||||
m_playerMapIcons[i].icon = icon;
|
||||
return;
|
||||
}
|
||||
if (emptySlot < 0 && m_playerMapIcons[i].name[0] == 0)
|
||||
emptySlot = i;
|
||||
}
|
||||
if (emptySlot >= 0)
|
||||
{
|
||||
wcsncpy_s(m_playerMapIcons[emptySlot].name, 32, name, _TRUNCATE);
|
||||
m_playerMapIcons[emptySlot].icon = icon;
|
||||
}
|
||||
}
|
||||
|
||||
char CMinecraftApp::GetPlayerMapIconByName(const wchar_t* name)
|
||||
{
|
||||
if (name == nullptr) return 0;
|
||||
for (int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i)
|
||||
{
|
||||
if (m_playerMapIcons[i].name[0] != 0 && _wcsicmp(m_playerMapIcons[i].name, name) == 0)
|
||||
return m_playerMapIcons[i].icon;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
unsigned int CMinecraftApp::GetPlayerPrivileges(BYTE networkSmallId)
|
||||
{
|
||||
|
||||
@@ -5,23 +5,23 @@ using namespace std;
|
||||
#include "Audio/Consoles_SoundEngine.h"
|
||||
|
||||
#include <xuiapp.h>
|
||||
#include "./Tutorial/TutorialEnum.h"
|
||||
#include ".\Tutorial\TutorialEnum.h"
|
||||
|
||||
#ifdef _XBOX
|
||||
#include "./XUI/XUI_Helper.h"
|
||||
#include "./XUI/XUI_HelpCredits.h"
|
||||
#include ".\XUI\XUI_Helper.h"
|
||||
#include ".\XUI\XUI_HelpCredits.h"
|
||||
#endif
|
||||
#include "UI/UIStructs.h"
|
||||
#include "UI\UIStructs.h"
|
||||
|
||||
#include "../../Minecraft.World/DisconnectPacket.h"
|
||||
#include "..\..\Minecraft.World\DisconnectPacket.h"
|
||||
#include <xsocialpost.h>
|
||||
|
||||
#include "../StringTable.h"
|
||||
#include "./DLC/DLCManager.h"
|
||||
#include "./GameRules/ConsoleGameRulesConstants.h"
|
||||
#include "./GameRules/GameRuleManager.h"
|
||||
#include "../SkinBox.h"
|
||||
#include "../ArchiveFile.h"
|
||||
#include "..\StringTable.h"
|
||||
#include ".\DLC\DLCManager.h"
|
||||
#include ".\GameRules\ConsoleGameRulesConstants.h"
|
||||
#include ".\GameRules\GameRuleManager.h"
|
||||
#include "..\SkinBox.h"
|
||||
#include "..\ArchiveFile.h"
|
||||
|
||||
typedef struct _JoinFromInviteData
|
||||
{
|
||||
@@ -564,9 +564,7 @@ public:
|
||||
int GetHTMLColour(eMinecraftColour colour);
|
||||
int GetHTMLColor(eMinecraftColour colour) { return GetHTMLColour(colour); }
|
||||
int GetHTMLFontSize(EHTMLFontSize size);
|
||||
wstring FormatHTMLString(int iPad, const wstring& desc, int shadowColour = 0xFFFFFFFF);
|
||||
wstring EscapeHTMLString(const wstring &desc);
|
||||
wstring FormatChatMessage(const wstring& desc, bool applyStyling = true);
|
||||
wstring FormatHTMLString(int iPad, const wstring &desc, int shadowColour = 0xFFFFFFFF);
|
||||
wstring GetActionReplacement(int iPad, unsigned char ucAction);
|
||||
wstring GetVKReplacement(unsigned int uiVKey);
|
||||
wstring GetIconReplacement(unsigned int uiIcon);
|
||||
@@ -708,8 +706,6 @@ private:
|
||||
bool m_bGameNewWorldSizeUseMoat;
|
||||
unsigned int m_GameNewHellScale;
|
||||
#endif
|
||||
int64_t m_seedOverride;
|
||||
bool m_hasSeedOverride;
|
||||
unsigned int FromBigEndian(unsigned int uiValue);
|
||||
|
||||
public:
|
||||
@@ -727,10 +723,6 @@ public:
|
||||
void SetGameNewHellScale(unsigned int newScale) { m_GameNewHellScale = newScale; }
|
||||
unsigned int GetGameNewHellScale() { return m_GameNewHellScale; }
|
||||
#endif
|
||||
void SetSeedOverride(int64_t seed) { m_seedOverride = seed; m_hasSeedOverride = true; }
|
||||
bool HasSeedOverride() { return m_hasSeedOverride; }
|
||||
int64_t GetSeedOverride() { return m_seedOverride; }
|
||||
|
||||
void SetResetNether(bool bResetNether) {m_bResetNether=bResetNether;}
|
||||
bool GetResetNether() {return m_bResetNether;}
|
||||
bool CanRecordStatsAndAchievements();
|
||||
@@ -755,14 +747,10 @@ public:
|
||||
private:
|
||||
BYTE m_playerColours[MINECRAFT_NET_MAX_PLAYERS]; // An array of QNet small-id's
|
||||
unsigned int m_playerGamePrivileges[MINECRAFT_NET_MAX_PLAYERS];
|
||||
struct PlayerMapIconEntry { wchar_t name[32]; char icon; };
|
||||
PlayerMapIconEntry m_playerMapIcons[MINECRAFT_NET_MAX_PLAYERS];
|
||||
|
||||
public:
|
||||
void UpdatePlayerInfo(BYTE networkSmallId, SHORT playerColourIndex, unsigned int playerGamePrivileges);
|
||||
short GetPlayerColour(BYTE networkSmallId);
|
||||
void SetPlayerMapIcon(const wchar_t* name, char icon);
|
||||
char GetPlayerMapIconByName(const wchar_t* name);
|
||||
unsigned int GetPlayerPrivileges(BYTE networkSmallId);
|
||||
|
||||
wstring getEntityName(eINSTANCEOF type);
|
||||
@@ -817,10 +805,6 @@ public:
|
||||
void SetCorruptSaveDeleted(bool bVal) {m_bCorruptSaveDeleted=bVal;}
|
||||
bool GetCorruptSaveDeleted(void) {return m_bCorruptSaveDeleted;}
|
||||
|
||||
// 4J Added: Store save folder name for hardcore world deletion on Win64
|
||||
void SetCurrentSaveFolderName(const wstring& name) { m_currentSaveFolderName = name; }
|
||||
const wstring& GetCurrentSaveFolderName() const { return m_currentSaveFolderName; }
|
||||
|
||||
void EnterSaveNotificationSection();
|
||||
void LeaveSaveNotificationSection();
|
||||
private:
|
||||
@@ -842,7 +826,6 @@ private:
|
||||
CRITICAL_SECTION csAdditionalSkinBoxes;
|
||||
CRITICAL_SECTION csAnimOverrideBitmask;
|
||||
bool m_bCorruptSaveDeleted;
|
||||
wstring m_currentSaveFolderName; // 4J Added: for hardcore world deletion on Win64
|
||||
|
||||
DWORD m_dwAdditionalModelParts[XUSER_MAX_COUNT];
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
#include "DLCManager.h"
|
||||
#include "DLCAudioFile.h"
|
||||
#if defined _XBOX || defined _WINDOWS64
|
||||
#include "../../Xbox/XML/ATGXmlParser.h"
|
||||
#include "../../Xbox/XML/xmlFilesCallback.h"
|
||||
#include "..\..\Xbox\XML\ATGXmlParser.h"
|
||||
#include "..\..\Xbox\XML\xmlFilesCallback.h"
|
||||
#endif
|
||||
|
||||
DLCAudioFile::DLCAudioFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_Audio,path)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "stdafx.h"
|
||||
#include "DLCManager.h"
|
||||
#include "DLCColourTableFile.h"
|
||||
#include "../../Minecraft.h"
|
||||
#include "../../TexturePackRepository.h"
|
||||
#include "../../TexturePack.h"
|
||||
#include "..\..\Minecraft.h"
|
||||
#include "..\..\TexturePackRepository.h"
|
||||
#include "..\..\TexturePack.h"
|
||||
|
||||
DLCColourTableFile::DLCColourTableFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_ColourTable,path)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "DLCFile.h"
|
||||
#include "../GameRules/LevelGenerationOptions.h"
|
||||
#include "..\GameRules\LevelGenerationOptions.h"
|
||||
|
||||
class DLCGameRules : public DLCFile
|
||||
{
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "../../../Minecraft.World/File.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/InputOutputStream.h"
|
||||
#include "..\..\..\Minecraft.World\File.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\InputOutputStream.h"
|
||||
|
||||
#include "DLCManager.h"
|
||||
#include "DLCGameRulesHeader.h"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "DLCGameRules.h"
|
||||
#include "../GameRules/LevelGenerationOptions.h"
|
||||
#include "..\GameRules\LevelGenerationOptions.h"
|
||||
|
||||
class DLCGameRulesHeader : public DLCGameRules, public JustGrSource
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "DLCManager.h"
|
||||
#include "DLCLocalisationFile.h"
|
||||
#include "../../StringTable.h"
|
||||
#include "..\..\StringTable.h"
|
||||
|
||||
DLCLocalisationFile::DLCLocalisationFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_LocalisationData,path)
|
||||
{
|
||||
|
||||
@@ -3,14 +3,13 @@
|
||||
#include "DLCManager.h"
|
||||
#include "DLCPack.h"
|
||||
#include "DLCFile.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../Minecraft.h"
|
||||
#include "../../TexturePackRepository.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\Minecraft.h"
|
||||
#include "..\..\TexturePackRepository.h"
|
||||
#include "Common/UI/UI.h"
|
||||
|
||||
const WCHAR *DLCManager::wchTypeNamesA[]=
|
||||
{
|
||||
L"XMLVERSION",
|
||||
L"DISPLAYNAME",
|
||||
L"THEMENAME",
|
||||
L"FREE",
|
||||
@@ -388,65 +387,41 @@ 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=readUInt32(pbData, false);
|
||||
unsigned int uiVersion=*(unsigned int *)pbData;
|
||||
uiCurrentByte+=sizeof(int);
|
||||
|
||||
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);
|
||||
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);
|
||||
return false;
|
||||
}
|
||||
pack->SetDataPointer(pbData);
|
||||
unsigned int uiParameterCount=readUInt32(&pbData[uiCurrentByte], bSwapEndian);
|
||||
unsigned int uiParameterCount=*(unsigned int *)&pbData[uiCurrentByte];
|
||||
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;i<uiParameterCount;i++)
|
||||
{
|
||||
pParams->dwType = bSwapEndian ? SwapInt32(pParams->dwType) : pParams->dwType;
|
||||
pParams->dwWchCount = bSwapEndian ? SwapInt32(pParams->dwWchCount) : pParams->dwWchCount;
|
||||
char16_t* wchData = reinterpret_cast<char16_t*>(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<WCHAR *>(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);
|
||||
|
||||
if (bXMLVersion)
|
||||
{
|
||||
uiCurrentByte += sizeof(int);
|
||||
}
|
||||
|
||||
unsigned int uiFileCount=readUInt32(&pbData[uiCurrentByte], bSwapEndian);
|
||||
unsigned int uiFileCount=*(unsigned int *)&pbData[uiCurrentByte];
|
||||
uiCurrentByte+=sizeof(int);
|
||||
C4JStorage::DLC_FILE_DETAILS *pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte];
|
||||
|
||||
DWORD dwTemp=uiCurrentByte;
|
||||
for(unsigned int i=0;i<uiFileCount;i++)
|
||||
{
|
||||
pFile->dwWchCount = bSwapEndian ? SwapInt32(pFile->dwWchCount) : pFile->dwWchCount;
|
||||
dwTemp+=sizeof(C4JStorage::DLC_FILE_DETAILS)+pFile->dwWchCount*sizeof(WCHAR);
|
||||
pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[dwTemp];
|
||||
}
|
||||
@@ -455,13 +430,6 @@ bool DLCManager::processDLCDataFile(DWORD &dwFilesProcessed, PBYTE pbData, DWORD
|
||||
|
||||
for(unsigned int i=0;i<uiFileCount;i++)
|
||||
{
|
||||
pFile->dwType = bSwapEndian ? SwapInt32(pFile->dwType) : pFile->dwType;
|
||||
pFile->uiFileSize = bSwapEndian ? SwapInt32(pFile->uiFileSize) : pFile->uiFileSize;
|
||||
char16_t* wchFile = reinterpret_cast<char16_t*>(pFile->wchFile);
|
||||
if (bSwapEndian) {
|
||||
SwapUTF16Bytes(wchFile, pFile->dwWchCount);
|
||||
}
|
||||
|
||||
EDLCType type = static_cast<EDLCType>(pFile->dwType);
|
||||
|
||||
DLCFile *dlcFile = nullptr;
|
||||
@@ -477,18 +445,12 @@ bool DLCManager::processDLCDataFile(DWORD &dwFilesProcessed, PBYTE pbData, DWORD
|
||||
}
|
||||
|
||||
// Params
|
||||
uiParameterCount=readUInt32(pbTemp, bSwapEndian);
|
||||
uiParameterCount=*(unsigned int *)pbTemp;
|
||||
pbTemp+=sizeof(int);
|
||||
pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp;
|
||||
for(unsigned int j=0;j<uiParameterCount;j++)
|
||||
{
|
||||
//DLCManager::EDLCParameterType paramType = DLCManager::e_DLCParamType_Invalid;
|
||||
pParams->dwType = bSwapEndian ? SwapInt32(pParams->dwType) : pParams->dwType;
|
||||
pParams->dwWchCount = bSwapEndian ? SwapInt32(pParams->dwWchCount) : pParams->dwWchCount;
|
||||
char16_t* wchData = reinterpret_cast<char16_t*>(pParams->wchData);
|
||||
if (bSwapEndian) {
|
||||
SwapUTF16Bytes(wchData, pParams->dwWchCount);
|
||||
}
|
||||
|
||||
auto it = parameterMapping.find(pParams->dwType);
|
||||
|
||||
|
||||
@@ -31,8 +31,7 @@ public:
|
||||
{
|
||||
e_DLCParamType_Invalid = -1,
|
||||
|
||||
e_DLCParamType_XMLVersion = 0,
|
||||
e_DLCParamType_DisplayName,
|
||||
e_DLCParamType_DisplayName = 0,
|
||||
e_DLCParamType_ThemeName,
|
||||
e_DLCParamType_Free, // identify free skins
|
||||
e_DLCParamType_Credit, // legal credits for DLC
|
||||
@@ -95,30 +94,6 @@ 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);
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#include "DLCGameRulesHeader.h"
|
||||
#include "DLCAudioFile.h"
|
||||
#include "DLCColourTableFile.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
|
||||
DLCPack::DLCPack(const wstring &name,DWORD dwLicenseMask)
|
||||
{
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#include "stdafx.h"
|
||||
#include "DLCManager.h"
|
||||
#include "DLCSkinFile.h"
|
||||
#include "../../ModelPart.h"
|
||||
#include "../../EntityRenderer.h"
|
||||
#include "../../EntityRenderDispatcher.h"
|
||||
#include "../../../Minecraft.World/Player.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "..\..\ModelPart.h"
|
||||
#include "..\..\EntityRenderer.h"
|
||||
#include "..\..\EntityRenderDispatcher.h"
|
||||
#include "..\..\..\Minecraft.World\Player.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
|
||||
DLCSkinFile::DLCSkinFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_Skin,path)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
#include "DLCFile.h"
|
||||
#include "../../../Minecraft.Client/HumanoidModel.h"
|
||||
#include "..\..\..\Minecraft.Client\HumanoidModel.h"
|
||||
|
||||
class DLCSkinFile : public DLCFile
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.item.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.item.enchantment.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.item.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.item.enchantment.h"
|
||||
#include "AddEnchantmentRuleDefinition.h"
|
||||
|
||||
AddEnchantmentRuleDefinition::AddEnchantmentRuleDefinition()
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.item.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.inventory.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.entity.player.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.item.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h"
|
||||
#include "AddItemRuleDefinition.h"
|
||||
#include "AddEnchantmentRuleDefinition.h"
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.phys.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.dimension.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.chunk.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.tile.entity.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.dimension.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h"
|
||||
#include "ApplySchematicRuleDefinition.h"
|
||||
#include "LevelGenerationOptions.h"
|
||||
#include "ConsoleSchematicFile.h"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "BiomeOverride.h"
|
||||
|
||||
BiomeOverride::BiomeOverride()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../WstringLookup.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "..\..\WstringLookup.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "CollectItemRuleDefinition.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.item.h"
|
||||
#include "../../../Minecraft.World/Connection.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.network.packet.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.item.h"
|
||||
#include "..\..\..\Minecraft.World\Connection.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h"
|
||||
|
||||
CollectItemRuleDefinition::CollectItemRuleDefinition()
|
||||
{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "stdafx.h"
|
||||
#include "CompleteAllRuleDefinition.h"
|
||||
#include "ConsoleGameRules.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/Connection.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.network.packet.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\Connection.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h"
|
||||
|
||||
void CompleteAllRuleDefinition::getChildren(vector<GameRuleDefinition *> *children)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.item.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.item.h"
|
||||
#include "CompoundGameRuleDefinition.h"
|
||||
#include "ConsoleGameRules.h"
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#include "stdafx.h"
|
||||
#include "ConsoleGenerateStructure.h"
|
||||
#include "ConsoleGameRules.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.dimension.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.levelgen.structure.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.dimension.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.h"
|
||||
|
||||
ConsoleGenerateStructure::ConsoleGenerateStructure() : StructurePiece(0)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
#include "GameRuleDefinition.h"
|
||||
#include "../../../Minecraft.World/StructurePiece.h"
|
||||
#include "..\..\..\Minecraft.World\StructurePiece.h"
|
||||
|
||||
class Level;
|
||||
class Random;
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
#include "stdafx.h"
|
||||
#include <vector>
|
||||
#include "../../../Minecraft.World/com.mojang.nbt.h"
|
||||
#include "../../../Minecraft.World/System.h"
|
||||
#include "..\..\..\Minecraft.World\com.mojang.nbt.h"
|
||||
#include "..\..\..\Minecraft.World\System.h"
|
||||
#include "ConsoleSchematicFile.h"
|
||||
#include "../../../Minecraft.World/InputOutputStream.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.chunk.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.tile.entity.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.entity.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.entity.item.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.phys.h"
|
||||
#include "../../../Minecraft.World/compression.h"
|
||||
#include "..\..\..\Minecraft.World\InputOutputStream.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.entity.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.entity.item.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h"
|
||||
#include "..\..\..\Minecraft.World\compression.h"
|
||||
|
||||
ConsoleSchematicFile::ConsoleSchematicFile()
|
||||
{
|
||||
|
||||
@@ -4,7 +4,7 @@ using namespace std;
|
||||
#define XBOX_SCHEMATIC_ORIGINAL_VERSION 1
|
||||
#define XBOX_SCHEMATIC_CURRENT_VERSION 2
|
||||
|
||||
#include "../../../Minecraft.World/ArrayWithLength.h"
|
||||
#include "..\..\..\Minecraft.World\ArrayWithLength.h"
|
||||
|
||||
class Level;
|
||||
class DataOutputStream;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../WstringLookup.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "..\..\WstringLookup.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "ConsoleGameRules.h"
|
||||
|
||||
GameRuleDefinition::GameRuleDefinition()
|
||||
|
||||
@@ -3,7 +3,7 @@ using namespace std;
|
||||
#include <unordered_map>
|
||||
#include <string>
|
||||
|
||||
#include "../../../Minecraft.World/ItemInstance.h"
|
||||
#include "..\..\..\Minecraft.World\ItemInstance.h"
|
||||
#include "ConsoleGameRulesConstants.h"
|
||||
|
||||
#include "GameRulesInstance.h"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../../Minecraft.World/compression.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/File.h"
|
||||
#include "../../../Minecraft.World/compression.h"
|
||||
#include "../DLC/DLCPack.h"
|
||||
#include "../DLC/DLCLocalisationFile.h"
|
||||
#include "../DLC/DLCGameRulesFile.h"
|
||||
#include "../DLC/DLCGameRules.h"
|
||||
#include "../DLC/DLCGameRulesHeader.h"
|
||||
#include "../../StringTable.h"
|
||||
#include "..\..\..\Minecraft.World\compression.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\File.h"
|
||||
#include "..\..\..\Minecraft.World\compression.h"
|
||||
#include "..\DLC\DLCPack.h"
|
||||
#include "..\DLC\DLCLocalisationFile.h"
|
||||
#include "..\DLC\DLCGameRulesFile.h"
|
||||
#include "..\DLC\DLCGameRules.h"
|
||||
#include "..\DLC\DLCGameRulesHeader.h"
|
||||
#include "..\..\StringTable.h"
|
||||
#include "ConsoleGameRules.h"
|
||||
#include "GameRuleManager.h"
|
||||
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/Pos.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.phys.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.level.chunk.h"
|
||||
#include "Common/DLC/DLCGameRulesHeader.h"
|
||||
#include "../../StringTable.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\Pos.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h"
|
||||
#include "Common\DLC\DLCGameRulesHeader.h"
|
||||
#include "..\..\StringTable.h"
|
||||
#include "LevelGenerationOptions.h"
|
||||
#include "ConsoleGameRules.h"
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ using namespace std;
|
||||
#pragma message("LevelGenerationOptions.h ")
|
||||
|
||||
#include "GameRuleDefinition.h"
|
||||
#include "../../../Minecraft.World/StructureFeature.h"
|
||||
#include "..\..\..\Minecraft.World\StructureFeature.h"
|
||||
|
||||
class ApplySchematicRuleDefinition;
|
||||
class LevelChunk;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../StringTable.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\StringTable.h"
|
||||
#include "ConsoleGameRules.h"
|
||||
#include "LevelRuleset.h"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "NamedAreaRuleDefinition.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.phys.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h"
|
||||
|
||||
NamedAreaRuleDefinition::NamedAreaRuleDefinition()
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "StartFeature.h"
|
||||
|
||||
StartFeature::StartFeature()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
using namespace std;
|
||||
|
||||
#include "GameRuleDefinition.h"
|
||||
#include "../../../Minecraft.World/StructureFeature.h"
|
||||
#include "..\..\..\Minecraft.World\StructureFeature.h"
|
||||
|
||||
class StartFeature : public GameRuleDefinition
|
||||
{
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#include "stdafx.h"
|
||||
#include "UpdatePlayerRuleDefinition.h"
|
||||
#include "ConsoleGameRules.h"
|
||||
#include "../../../Minecraft.World/Pos.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.entity.player.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.food.h"
|
||||
#include "../../../Minecraft.World/net.minecraft.world.item.h"
|
||||
#include "..\..\..\Minecraft.World\Pos.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.food.h"
|
||||
#include "..\..\..\Minecraft.World\net.minecraft.world.item.h"
|
||||
|
||||
UpdatePlayerRuleDefinition::UpdatePlayerRuleDefinition()
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "stdafx.h"
|
||||
#include "../../../Minecraft.World/StringHelpers.h"
|
||||
#include "..\..\..\Minecraft.World\StringHelpers.h"
|
||||
#include "UseTileRuleDefinition.h"
|
||||
|
||||
UseTileRuleDefinition::UseTileRuleDefinition()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user