mirror of
https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
synced 2026-04-05 23:13:33 +00:00
Compare commits
5 Commits
fix-ios-co
...
05baea1ed4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
05baea1ed4 | ||
|
|
04aea27334 | ||
|
|
2d731bc3b6 | ||
|
|
0d1387ad8f | ||
|
|
d103caddab |
27
.github/actions/setup-cache/action.yml
vendored
27
.github/actions/setup-cache/action.yml
vendored
@@ -1,27 +0,0 @@
|
||||
name: Setup cache
|
||||
description: Sets up sccache, CPM cache, etc.
|
||||
|
||||
inputs:
|
||||
host:
|
||||
description: 'Host platform: win or linux'
|
||||
required: true
|
||||
target:
|
||||
description: 'Target platform: win, linux'
|
||||
required: true
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Setup sccache
|
||||
uses: hendrikmuhs/ccache-action@v1.2.13
|
||||
with:
|
||||
variant: sccache
|
||||
key: ${{ inputs.target }}-v1
|
||||
|
||||
- name: Setup CPM Cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: cpm-cache
|
||||
key: cpm-${{ inputs.target }}-v1-${{ hashFiles('**/CMakeLists.txt', '**/*.cmake') }}
|
||||
restore-keys: |
|
||||
cpm-${{ inputs.target }}-v1-
|
||||
17
.github/actions/setup-ninja/action.yml
vendored
17
.github/actions/setup-ninja/action.yml
vendored
@@ -1,17 +0,0 @@
|
||||
name: Setup Ninja
|
||||
description: Sets up Ninja
|
||||
|
||||
inputs:
|
||||
host:
|
||||
description: 'Host platform: win, mac or linux'
|
||||
required: true
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Setup
|
||||
shell: bash
|
||||
run: |
|
||||
curl -L https://github.com/ninja-build/ninja/releases/latest/download/ninja-${{ inputs.host }}.zip -o ninja.zip
|
||||
7z x ninja.zip -o"$GITHUB_WORKSPACE/ninja"
|
||||
echo "$GITHUB_WORKSPACE/ninja" >> $GITHUB_PATH
|
||||
36
.github/workflows/android.yml
vendored
Normal file
36
.github/workflows/android.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
name: Android Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download Android NDK r14b
|
||||
shell: powershell
|
||||
run: |
|
||||
Invoke-WebRequest `
|
||||
-Uri "http://dl.google.com/android/repository/android-ndk-r14b-windows-x86_64.zip" `
|
||||
-OutFile "ndk.zip"
|
||||
|
||||
- name: Extract NDK
|
||||
shell: powershell
|
||||
run: |
|
||||
Expand-Archive ndk.zip C:\
|
||||
|
||||
- name: Verify NDK path
|
||||
shell: powershell
|
||||
run: |
|
||||
Test-Path "C:\android-ndk-r14b"
|
||||
|
||||
- name: Run build script
|
||||
shell: powershell
|
||||
run: |
|
||||
./build.ps1
|
||||
366
.github/workflows/build.yml
vendored
366
.github/workflows/build.yml
vendored
@@ -1,366 +0,0 @@
|
||||
name: Build Game
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- '**' # every branch
|
||||
- '!no-build-**' # unless marked as no-build
|
||||
|
||||
env:
|
||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||
BUILD_TYPE: Release
|
||||
CPM_SOURCE_CACHE: ${{ github.workspace }}/cpm-cache
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build-windows:
|
||||
name: Build Windows
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup caches
|
||||
uses: ./.github/actions/setup-cache
|
||||
with:
|
||||
host: linux
|
||||
target: win
|
||||
|
||||
- name: Setup Ninja
|
||||
uses: ./.github/actions/setup-ninja
|
||||
with:
|
||||
host: linux
|
||||
|
||||
- name: Download llvm-mingw
|
||||
run: |
|
||||
curl -L https://github.com/mstorsjo/llvm-mingw/releases/download/20260311/llvm-mingw-20260311-msvcrt-ubuntu-22.04-x86_64.tar.xz -o llvm-mingw.tar.xz
|
||||
tar -xf llvm-mingw.tar.xz
|
||||
mv llvm-mingw-* llvm-mingw
|
||||
|
||||
- name: Create Build Environment
|
||||
# Some projects don't allow in-source building, so create a separate build directory
|
||||
# We'll use this as our working directory for all subsequent commands
|
||||
run: cmake -E make_directory ${{github.workspace}}/build
|
||||
|
||||
- name: Configure CMake
|
||||
working-directory: ${{github.workspace}}/build
|
||||
run: |
|
||||
cmake $GITHUB_WORKSPACE \
|
||||
-G Ninja \
|
||||
-DCMAKE_SYSTEM_NAME=Windows \
|
||||
-DCMAKE_C_COMPILER=$GITHUB_WORKSPACE/llvm-mingw/bin/x86_64-w64-mingw32-clang \
|
||||
-DCMAKE_CXX_COMPILER=$GITHUB_WORKSPACE/llvm-mingw/bin/x86_64-w64-mingw32-clang++ \
|
||||
-DCMAKE_RC_COMPILER=$GITHUB_WORKSPACE/llvm-mingw/bin/x86_64-w64-mingw32-windres \
|
||||
-DALSOFT_BACKEND_PIPEWIRE=OFF \
|
||||
-DCMAKE_BUILD_TYPE=$BUILD_TYPE
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{github.workspace}}/build
|
||||
run: cmake --build . --config $BUILD_TYPE --target MinecraftPE --parallel
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: mcpe-windows
|
||||
path: |
|
||||
${{github.workspace}}/build/MinecraftPE.exe
|
||||
${{github.workspace}}/build/libpng16.dll
|
||||
${{github.workspace}}/build/OpenAL32.dll
|
||||
${{github.workspace}}/build/libz.dll
|
||||
|
||||
build-ios:
|
||||
# credit to pengubow from deepfriedwaffles repo
|
||||
name: Build iOS
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cd project/iosproj
|
||||
xcodebuild -scheme minecraftpe -derivedDataPath build -destination 'generic/platform=iOS' CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
|
||||
mkdir -p Payload
|
||||
cp -R build/Build/Products/Debug-iphoneos/minecraftpe.app Payload/
|
||||
zip -r minecraftpe.ipa Payload
|
||||
rm -rf Payload
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@main
|
||||
with:
|
||||
name: minecraftpe-ios
|
||||
path: project/iosproj/minecraftpe.ipa
|
||||
|
||||
build-linux:
|
||||
name: Build Linux
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup caches
|
||||
uses: ./.github/actions/setup-cache
|
||||
with:
|
||||
host: linux
|
||||
target: linux
|
||||
|
||||
- name: Create Build Environment
|
||||
# Some projects don't allow in-source building, so create a separate build directory
|
||||
# We'll use this as our working directory for all subsequent commands
|
||||
run: cmake -E make_directory ${{github.workspace}}/build
|
||||
|
||||
- name: Setup Environment
|
||||
run: |
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install gcc-multilib
|
||||
sudo apt-get install -y --no-install-recommends build-essential libgl-dev libwayland-dev xorg-dev libxkbcommon-dev
|
||||
|
||||
- name: Configure CMake
|
||||
# Use a bash shell so we can use the same syntax for environment variable
|
||||
# access regardless of the host operating system
|
||||
shell: bash
|
||||
working-directory: ${{github.workspace}}/build
|
||||
run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{github.workspace}}/build
|
||||
shell: bash
|
||||
run: |
|
||||
cmake --build . --config $BUILD_TYPE --target MinecraftPE --parallel
|
||||
cmake --build . --config $BUILD_TYPE --target MinecraftPE-server --parallel
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: mcpe-linux
|
||||
path: |
|
||||
${{github.workspace}}/build/MinecraftPE
|
||||
${{github.workspace}}/build/MinecraftPE-server
|
||||
|
||||
build-android: # pray to god
|
||||
name: Build Android (${{ matrix.abi }})
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
# keep going with the other ABI if one fails so you at least get something useful
|
||||
fail-fast: false
|
||||
matrix:
|
||||
abi: [ arm64-v8a, armeabi-v7a ]
|
||||
|
||||
env:
|
||||
ANDROID_SDK_ROOT: ${{ github.workspace }}/android-sdk
|
||||
ANDROID_NDK_PATH: ${{ github.workspace }}/android-ndk-r14b
|
||||
ANDROID_PLATFORM_API: 36
|
||||
ANDROID_BUILD_TOOLS_VERSION: 36.0.0
|
||||
ADB: /bin/true
|
||||
# build.sh reads MATRIX_ABI to decide which ABI to build when no --abi flag is passed
|
||||
MATRIX_ABI: ${{ matrix.abi }}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Cache Android command-line tools
|
||||
id: cache-android-tools
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ${{ env.ANDROID_SDK_ROOT }}
|
||||
key: android-cmdline-tools-v36
|
||||
|
||||
- name: Setup Android command line tools
|
||||
if: steps.cache-android-tools.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
if [ ! -d "$ANDROID_SDK_ROOT/cmdline-tools/latest" ]; then
|
||||
mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools"
|
||||
curl -o cmdline-tools.zip -L "https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip"
|
||||
unzip -q cmdline-tools.zip -d "$ANDROID_SDK_ROOT/cmdline-tools"
|
||||
mv "$ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools" "$ANDROID_SDK_ROOT/cmdline-tools/latest"
|
||||
fi
|
||||
yes | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --sdk_root="$ANDROID_SDK_ROOT" "platform-tools" "platforms;android-${ANDROID_PLATFORM_API}" "build-tools;${ANDROID_BUILD_TOOLS_VERSION}"
|
||||
|
||||
|
||||
- name: Cache Android NDK r14b
|
||||
id: cache-android-ndk
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ${{ github.workspace }}/android-ndk-r14b
|
||||
key: android-ndk-r14b
|
||||
|
||||
- name: Install Android NDK r14b
|
||||
if: steps.cache-android-ndk.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
if [ ! -d "$ANDROID_NDK_PATH" ]; then
|
||||
curl -L -o ndk.zip "https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip"
|
||||
unzip -q ndk.zip -d "$GITHUB_WORKSPACE"
|
||||
fi
|
||||
|
||||
- name: Install system prerequisites
|
||||
run: |
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y --no-install-recommends wget unzip curl git python3 libncurses6 libtinfo6
|
||||
if ! ldconfig -p | grep -q "libncurses.so.5"; then
|
||||
sudo ln -sf /lib/x86_64-linux-gnu/libncurses.so.6 /usr/lib/x86_64-linux-gnu/libncurses.so.5 || true
|
||||
fi
|
||||
if ! ldconfig -p | grep -q "libtinfo.so.5"; then
|
||||
sudo ln -sf /lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5 || true
|
||||
fi
|
||||
|
||||
- name: Setup Java 25
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 25
|
||||
|
||||
- name: Validate environment
|
||||
run: |
|
||||
echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT"
|
||||
echo "ANDROID_NDK_PATH=$ANDROID_NDK_PATH"
|
||||
echo "JAVA_HOME=$JAVA_HOME"
|
||||
echo "MATRIX_ABI=$MATRIX_ABI"
|
||||
$ANDROID_SDK_ROOT/platform-tools/adb version || true
|
||||
java -version
|
||||
javac -version
|
||||
|
||||
- name: Run Android build script
|
||||
run: |
|
||||
chmod +x ./build.sh
|
||||
./build.sh
|
||||
|
||||
- name: Upload APK
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
# artifact name is ABI-specific so both matrix legs can upload without clobbering each other
|
||||
name: minecraftpe-apk-${{ matrix.abi }}
|
||||
path: ${{ github.workspace }}/build-apk/minecraftpe-*-debug.apk
|
||||
|
||||
build-web:
|
||||
name: Build Web
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup caches
|
||||
uses: ./.github/actions/setup-cache
|
||||
with:
|
||||
host: linux
|
||||
target: linux
|
||||
|
||||
- name: Setup Ninja
|
||||
uses: ./.github/actions/setup-ninja
|
||||
with:
|
||||
host: linux
|
||||
|
||||
- name: Setup emsdk
|
||||
uses: mymindstorm/setup-emsdk@v14
|
||||
with:
|
||||
version: 5.0.3
|
||||
actions-cache-folder: 'emsdk-cache'
|
||||
|
||||
- name: Create Build Environment
|
||||
# Some projects don't allow in-source building, so create a separate build directory
|
||||
# We'll use this as our working directory for all subsequent commands
|
||||
run: cmake -E make_directory ${{github.workspace}}/build
|
||||
|
||||
- name: Configure CMake
|
||||
# Use a bash shell so we can use the same syntax for environment variable
|
||||
# access regardless of the host operating system
|
||||
shell: bash
|
||||
working-directory: ${{github.workspace}}/build
|
||||
run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -G Ninja -DCMAKE_TOOLCHAIN_FILE="$GITHUB_WORKSPACE/emsdk-cache/emsdk-main/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{github.workspace}}/build
|
||||
run: cmake --build . --config $BUILD_TYPE --target MinecraftPE --parallel
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: mcpe-web
|
||||
path: |
|
||||
${{github.workspace}}/build/MinecraftPE.js
|
||||
${{github.workspace}}/build/MinecraftPE.wasm
|
||||
${{github.workspace}}/build/MinecraftPE.data
|
||||
|
||||
publish:
|
||||
name: Publish
|
||||
runs-on: ubuntu-latest
|
||||
needs: [ build-windows, build-ios, build-linux, build-android, build-web ]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Declare Version Variables
|
||||
id: ref
|
||||
run: |
|
||||
echo "version=$(cat VERSION | xargs)" >> $GITHUB_OUTPUT
|
||||
echo "hash=$(git rev-parse --short "$GITHUB_SHA")" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Download Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Zip Windows Artifacts
|
||||
uses: vimtor/action-zip@v1.2
|
||||
with:
|
||||
files: mcpe-windows/MinecraftPE.exe mcpe-windows/libpng16.dll mcpe-windows/OpenAL32.dll mcpe-windows/libz.dll
|
||||
dest: minecraftpe-${{ steps.ref.outputs.hash }}-windows.zip
|
||||
|
||||
- name: Zip Linux Artifacts
|
||||
uses: vimtor/action-zip@v1.2
|
||||
with:
|
||||
files: mcpe-linux/MinecraftPE
|
||||
dest: minecraftpe-${{ steps.ref.outputs.hash }}-linux.zip
|
||||
|
||||
- name: Zip Linux Server Artifacts
|
||||
uses: vimtor/action-zip@v1.2
|
||||
with:
|
||||
files: mcpe-linux/MinecraftPE-server
|
||||
dest: minecraftpe-server-${{ steps.ref.outputs.hash }}.zip
|
||||
|
||||
- name: Zip Android arm64-v8a Artifact
|
||||
uses: vimtor/action-zip@v1.2
|
||||
with:
|
||||
files: minecraftpe-apk-arm64-v8a/minecraftpe-v8a-debug.apk
|
||||
dest: minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.zip
|
||||
|
||||
- name: Zip Android armeabi-v7a Artifact
|
||||
uses: vimtor/action-zip@v1.2
|
||||
with:
|
||||
files: minecraftpe-apk-armeabi-v7a/minecraftpe-v7a-debug.apk
|
||||
dest: minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.zip
|
||||
|
||||
- name: Zip Web Artifact
|
||||
uses: vimtor/action-zip@v1.2
|
||||
with:
|
||||
files: mcpe-web/MinecraftPE.js mcpe-web/MinecraftPE.wasm mcpe-web/MinecraftPE.data misc/web/index.html
|
||||
dest: minecraftpe-${{ steps.ref.outputs.hash }}-web.zip
|
||||
|
||||
- name: Zip Data
|
||||
uses: vimtor/action-zip@v1.2
|
||||
with:
|
||||
files: data
|
||||
recursive: false
|
||||
dest: data.zip
|
||||
|
||||
- name: Update Development Release
|
||||
uses: andelf/nightly-release@main
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: dev
|
||||
name: 'Development Release'
|
||||
body: |
|
||||
MinecraftPE development release for commit ${{ github.sha }}.
|
||||
files: |
|
||||
./data.zip
|
||||
./minecraftpe-${{ steps.ref.outputs.hash }}-windows.zip
|
||||
./minecraftpe-${{ steps.ref.outputs.hash }}-linux.zip
|
||||
./minecraftpe-server-${{ steps.ref.outputs.hash }}.zip
|
||||
./minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.zip
|
||||
./minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.zip
|
||||
./minecraftpe-${{ steps.ref.outputs.hash }}-web.zip
|
||||
75
.github/workflows/cmake-multiplatform.yml
vendored
Normal file
75
.github/workflows/cmake-multiplatform.yml
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
name: CMake multiplatform
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest]
|
||||
build_type: [Release]
|
||||
include:
|
||||
- os: windows-latest
|
||||
c_compiler: clang
|
||||
cpp_compiler: clang++
|
||||
- os: ubuntu-latest
|
||||
c_compiler: clang
|
||||
cpp_compiler: clang++
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set reusable strings
|
||||
# Turn repeated input strings (such as the build output directory) into step outputs. These step outputs can be used throughout the workflow file.
|
||||
id: strings
|
||||
shell: bash
|
||||
run: |
|
||||
echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Setup Environment
|
||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||
run: |
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install gcc-multilib
|
||||
sudo apt-get install -y --no-install-recommends build-essential libgl-dev libwayland-dev xorg-dev libxkbcommon-dev
|
||||
|
||||
- name: Configure CMake
|
||||
run: >
|
||||
cmake -B ${{ steps.strings.outputs.build-output-dir }}
|
||||
-DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }}
|
||||
-DCMAKE_C_COMPILER=${{ matrix.c_compiler }}
|
||||
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
||||
-S ${{ github.workspace }}
|
||||
|
||||
- name: Build
|
||||
run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }}
|
||||
|
||||
- name: Install
|
||||
run: cmake --install ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }}
|
||||
|
||||
- name: Pack
|
||||
run: |
|
||||
cd ${{ steps.strings.outputs.build-output-dir }}
|
||||
cpack -C ${{ matrix.build_type }}
|
||||
|
||||
- name: Create or Update Development Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
name: Development Build
|
||||
tag_name: dev
|
||||
body: |
|
||||
${{ github.event.head_commit.timestamp }}
|
||||
draft: false
|
||||
prerelease: true
|
||||
generate_release_notes: false
|
||||
files: 'build/package/*.zip'
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -3,12 +3,13 @@ build/
|
||||
out/
|
||||
bin/
|
||||
lib/
|
||||
build-apk/
|
||||
cmake-build-*/
|
||||
CMakeFiles/
|
||||
CMakeCache.txt
|
||||
cmake_install.cmake
|
||||
Makefile
|
||||
*.cmake
|
||||
!cmake/CPM.cmake
|
||||
|
||||
# Compiled object files
|
||||
*.o
|
||||
|
||||
296
CMakeLists.txt
296
CMakeLists.txt
@@ -6,109 +6,53 @@ include(cmake/CPM.cmake)
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
||||
set(CMAKE_POLICY_VERSION_MINIMUM 3.10)
|
||||
|
||||
include(cmake/EnumOption.cmake)
|
||||
|
||||
if(EMSCRIPTEN)
|
||||
# When configuring web builds with "emcmake cmake -B build -S .", set PLATFORM to Web by default
|
||||
set(PLATFORM Web CACHE STRING "Platform to build for.")
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
set(CMAKE_CXX_FLAGS "-Wno-c++11-narrowing -Wno-narrowing -Wno-invalid-source-encoding -Wno-reserved-user-defined-literal")
|
||||
endif()
|
||||
|
||||
enum_option(PLATFORM "Desktop;Web" "Platform to build for.")
|
||||
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
find_package(OpenSSL)
|
||||
|
||||
if (${PLATFORM} STREQUAL "Desktop")
|
||||
set(PLATFORM_CPP "PLATFORM_DESKTOP")
|
||||
|
||||
if (MINGW)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc")
|
||||
endif()
|
||||
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-c++11-narrowing -Wno-narrowing -Wno-invalid-source-encoding -Wno-reserved-user-defined-literal")
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||
include_directories(misc/windows)
|
||||
set(EXTRA_LIBS ws2_32 winhttp)
|
||||
elseif(UNIX)
|
||||
find_library(pthread NAMES pthread)
|
||||
set(EXTRA_LIBS pthread m)
|
||||
endif()
|
||||
|
||||
elseif (${PLATFORM} STREQUAL "Web")
|
||||
set(PLATFORM_CPP "PLATFORM_WEB")
|
||||
set(EXTRA_LIBS "idbfs.js")
|
||||
if (OpenSSL_FOUND)
|
||||
message(STATUS "found openssl ${OPENSSL_VERSION}")
|
||||
endif()
|
||||
|
||||
# I totally shocked
|
||||
if(${PLATFORM} MATCHES "Web")
|
||||
set(PNG_LIB png)
|
||||
set(AL_LIBTYPE "STATIC")
|
||||
|
||||
add_library(zlib INTERFACE IMPORTED)
|
||||
set_target_properties(zlib PROPERTIES
|
||||
INTERFACE_LINK_OPTIONS "-sUSE_ZLIB=1"
|
||||
)
|
||||
|
||||
add_library(png INTERFACE IMPORTED)
|
||||
set_target_properties(png PROPERTIES
|
||||
INTERFACE_COMPILE_OPTIONS "-sUSE_LIBPNG=1"
|
||||
INTERFACE_LINK_OPTIONS "-sUSE_LIBPNG=1"
|
||||
)
|
||||
|
||||
add_library(glfw INTERFACE IMPORTED)
|
||||
set_target_properties(glfw PROPERTIES
|
||||
INTERFACE_LINK_OPTIONS "-sUSE_GLFW=3"
|
||||
)
|
||||
else()
|
||||
set(PNG_LIB png_shared)
|
||||
set(AL_LIBTYPE "SHARED")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME "zlib"
|
||||
GIT_REPOSITORY "https://github.com/madler/zlib"
|
||||
GIT_TAG "v1.3.2"
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME "libpng"
|
||||
GIT_REPOSITORY "https://github.com/pnggroup/libpng.git"
|
||||
GIT_TAG "v1.6.55"
|
||||
OPTIONS
|
||||
"ZLIB_ROOT ${zlib_SOURCE_DIR}"
|
||||
"ZLIB_INCLUDE_DIRS ${zlib_SOURCE_DIR}"
|
||||
"PNG_TOOLS OFF"
|
||||
"PNG_TESTS OFF"
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME "glfw"
|
||||
GIT_REPOSITORY "https://github.com/glfw/glfw.git"
|
||||
GIT_TAG "3.4"
|
||||
EXCLUDE_FROM_ALL TRUE
|
||||
OPTIONS
|
||||
"GLFW_BUILD_EXAMPLES OFF"
|
||||
"GLFW_BUILD_TESTS OFF"
|
||||
"GLFW_BUILD_DOCS OFF"
|
||||
)
|
||||
endif()
|
||||
CPMAddPackage("gh:madler/zlib@1.3.2")
|
||||
CPMAddPackage(
|
||||
NAME "libpng"
|
||||
GIT_REPOSITORY "https://github.com/pnggroup/libpng.git"
|
||||
GIT_TAG "v1.6.55"
|
||||
EXCLUDE_FROM_ALL TRUE
|
||||
OPTIONS
|
||||
"ZLIB_ROOT ${zlib_SOURCE_DIR}"
|
||||
"ZLIB_INCLUDE_DIRS ${zlib_SOURCE_DIR}"
|
||||
"PNG_TOOLS OFF"
|
||||
"PNG_TESTS OFF"
|
||||
"BUILD_SHARED_LIBS ON"
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME "openal"
|
||||
GIT_REPOSITORY "https://github.com/kcat/openal-soft.git"
|
||||
GIT_TAG "1.25.1"
|
||||
EXCLUDE_FROM_ALL TRUE
|
||||
OPTIONS
|
||||
"ALSOFT_EXAMPLES OFF"
|
||||
"ALSOFT_TESTS OFF"
|
||||
"ALSOFT_UTILS OFF"
|
||||
"LIBTYPE ${AL_LIBTYPE}"
|
||||
"ALSOFT_ENABLE_MODULES OFF"
|
||||
"ALSOFT_STATIC_STDCXX ON"
|
||||
"ALSOFT_STATIC_LIBGCC ON"
|
||||
"BUILD_SHARED_LIBS ON"
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME "glfw"
|
||||
GIT_REPOSITORY "https://github.com/glfw/glfw.git"
|
||||
GIT_TAG "3.4"
|
||||
EXCLUDE_FROM_ALL TRUE
|
||||
OPTIONS
|
||||
"GLFW_BUILD_EXAMPLES OFF"
|
||||
"GLFW_BUILD_TESTS OFF"
|
||||
"GLFW_BUILD_DOCS OFF"
|
||||
"BUILD_SHARED_LIBS ON"
|
||||
)
|
||||
|
||||
# TODO: Clear this paths with *
|
||||
@@ -290,32 +234,50 @@ file(GLOB CLIENT_SOURCES
|
||||
"src/SharedConstants.cpp"
|
||||
"src/main.cpp"
|
||||
"src/NinecraftApp.cpp"
|
||||
|
||||
"src/AppPlatform_glfw.cpp"
|
||||
"src/main.cpp"
|
||||
)
|
||||
|
||||
if (${PLATFORM} STREQUAL "Desktop")
|
||||
list(APPEND CLIENT_SOURCES glad/src/glad.c)
|
||||
if(NOT DEFINED PLATFORM)
|
||||
set(PLATFORM "PLATFORM_GLFW")
|
||||
endif()
|
||||
|
||||
|
||||
if(PLATFORM STREQUAL "PLATFORM_WIN32")
|
||||
list(APPEND CLIENT_SOURCES "src/AppPlatform_win32.cpp")
|
||||
endif()
|
||||
|
||||
if(PLATFORM STREQUAL "PLATFORM_GLFW")
|
||||
list(APPEND CLIENT_SOURCES "src/AppPlatform_glfw.cpp")
|
||||
endif()
|
||||
|
||||
# Server
|
||||
if(UNIX)
|
||||
add_executable("${PROJECT_NAME}-server" ${SERVER_SOURCES})
|
||||
add_executable("${PROJECT_NAME}-server" ${SERVER_SOURCES})
|
||||
|
||||
target_compile_definitions("${PROJECT_NAME}-server" PUBLIC "STANDALONE_SERVER" "SERVER_PROFILER")
|
||||
target_compile_definitions("${PROJECT_NAME}-server" PUBLIC "STANDALONE_SERVER" "SERVER_PROFILER")
|
||||
|
||||
target_include_directories("${PROJECT_NAME}-server" PUBLIC
|
||||
"${CMAKE_SOURCE_DIR}/src/"
|
||||
"project/lib_projects/raknet/jni/RaknetSources"
|
||||
)
|
||||
target_include_directories("${PROJECT_NAME}-server" PUBLIC
|
||||
"${CMAKE_SOURCE_DIR}/src/"
|
||||
"project/lib_projects/raknet/jni/RaknetSources"
|
||||
)
|
||||
|
||||
target_link_libraries("${PROJECT_NAME}-server" ${CMAKE_THREAD_LIBS_INIT})
|
||||
target_link_libraries("${PROJECT_NAME}-server" ${CMAKE_THREAD_LIBS_INIT} png_shared)
|
||||
endif()
|
||||
|
||||
add_executable(${PROJECT_NAME}
|
||||
${CLIENT_SOURCES}
|
||||
"glad/src/glad.c"
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
set(EXTRA_LIBS "ws2_32")
|
||||
target_compile_definitions(${PROJECT_NAME} PUBLIC "_CRT_SECURE_NO_WARNINGS")
|
||||
endif()
|
||||
|
||||
if(PLATFORM STREQUAL "PLATFORM_WIN32" OR PLATFORM STREQUAL "PLATFORM_GLFW")
|
||||
target_compile_definitions(${PROJECT_NAME} PUBLIC "PLATFORM_DESKTOP")
|
||||
endif()
|
||||
|
||||
add_executable(${PROJECT_NAME} ${CLIENT_SOURCES})
|
||||
|
||||
target_compile_definitions(${PROJECT_NAME} PUBLIC ${PLATFORM_CPP})
|
||||
|
||||
target_include_directories(${PROJECT_NAME} PUBLIC
|
||||
"${CMAKE_SOURCE_DIR}/glad/include/"
|
||||
@@ -325,52 +287,9 @@ target_include_directories(${PROJECT_NAME} PUBLIC
|
||||
"lib/include"
|
||||
)
|
||||
|
||||
if(${PLATFORM} MATCHES "Web")
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
# uuuh i hate it
|
||||
set(EM_FLAGS "-pthread -sUSE_PTHREADS=1 -sUSE_LIBPNG=1 -sSHARED_MEMORY=1")
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EM_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EM_FLAGS}")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EM_FLAGS} --preload-file ${CMAKE_SOURCE_DIR}/data@/data")
|
||||
|
||||
target_compile_options(${PROJECT_NAME} PUBLIC
|
||||
"-Os"
|
||||
"-Wno-invalid-source-encoding"
|
||||
"-Wno-narrowing"
|
||||
"-Wno-deprecated-register"
|
||||
"-Wno-reserved-user-defined-literal"
|
||||
)
|
||||
|
||||
target_link_options(${PROJECT_NAME} PUBLIC
|
||||
"-Os"
|
||||
"-sALLOW_MEMORY_GROWTH=1"
|
||||
"-sFORCE_FILESYSTEM=1"
|
||||
"-sLEGACY_GL_EMULATION=1"
|
||||
"-sGL_UNSAFE_OPTS=0"
|
||||
"-sEMULATE_FUNCTION_POINTER_CASTS=1"
|
||||
"-sALLOW_TABLE_GROWTH=1"
|
||||
"-sEXPORTED_RUNTIME_METHODS=['FS','stringToUTF8','UTF8ToString','cwrap','ccall','HEAP8','HEAPU8','HEAP32','HEAPU32']"
|
||||
"-sEXPORTED_FUNCTIONS=['_main']"
|
||||
)
|
||||
|
||||
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
message("DEBUG MODE")
|
||||
|
||||
target_link_options(${PROJECT_NAME} PUBLIC
|
||||
"-sASSERTIONS=2"
|
||||
"-sSTACK_OVERFLOW_CHECK=2"
|
||||
"-sSTACK_SIZE=5242880"
|
||||
"-sGL_DEBUG=1"
|
||||
)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(${PROJECT_NAME} PUBLIC "__EMSCRIPTEN__" "NO_SOUND" "NO_NETWORK")
|
||||
endif()
|
||||
|
||||
# Client
|
||||
target_compile_definitions(${PROJECT_NAME} PUBLIC "OPENGL_ES" "NO_EGL" ${PLATFORM})
|
||||
target_link_libraries(${PROJECT_NAME} zlib ${PNG_LIB} OpenAL::OpenAL glfw ${EXTRA_LIBS})
|
||||
target_link_libraries(${PROJECT_NAME} zlib png_shared alsoft.common OpenAL::OpenAL glfw ${EXTRA_LIBS})
|
||||
|
||||
if (OpenSSL_FOUND)
|
||||
target_link_libraries(${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto)
|
||||
@@ -378,27 +297,72 @@ if (OpenSSL_FOUND)
|
||||
endif()
|
||||
|
||||
if (NOT UNIX)
|
||||
add_custom_command(
|
||||
TARGET ${PROJECT_NAME}
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_RUNTIME_DLLS:${PROJECT_NAME}> $<TARGET_FILE_DIR:${PROJECT_NAME}>
|
||||
COMMAND_EXPAND_LISTS
|
||||
)
|
||||
add_custom_command(
|
||||
TARGET ${PROJECT_NAME}
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_RUNTIME_DLLS:${PROJECT_NAME}> $<TARGET_FILE_DIR:${PROJECT_NAME}>
|
||||
COMMAND_EXPAND_LISTS
|
||||
)
|
||||
endif()
|
||||
|
||||
if(NOT ${PLATFORM} MATCHES "Web")
|
||||
add_custom_command(
|
||||
TARGET ${PROJECT_NAME}
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/data" $<TARGET_FILE_DIR:${PROJECT_NAME}>/data
|
||||
)
|
||||
else()
|
||||
add_custom_command(
|
||||
TARGET ${PROJECT_NAME}
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/index.html" $<TARGET_FILE_DIR:${PROJECT_NAME}>
|
||||
)
|
||||
add_custom_command(
|
||||
TARGET ${PROJECT_NAME}
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/data" $<TARGET_FILE_DIR:${PROJECT_NAME}>/data
|
||||
)
|
||||
|
||||
# Installing and packing
|
||||
|
||||
find_package(Git REQUIRED)
|
||||
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE GIT_SHORTSHA
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
string(TOLOWER ${CMAKE_SYSTEM_NAME} SYSTEM_NAME)
|
||||
set(CPACK_PACKAGE_NAME "MCPE-0.6.1-for-all")
|
||||
set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${SYSTEM_NAME})
|
||||
set(CPACK_PACKAGE_VENDOR "MCPE-0.6.1-for-all")
|
||||
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
|
||||
set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/package")
|
||||
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install")
|
||||
set(CPACK_GENERATOR "ZIP")
|
||||
|
||||
set(GIT_REPO "https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1")
|
||||
|
||||
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION .)
|
||||
|
||||
if(NOT UNIX)
|
||||
install(FILES
|
||||
$<TARGET_RUNTIME_DLLS:${PROJECT_NAME}>
|
||||
DESTINATION .
|
||||
)
|
||||
endif()
|
||||
|
||||
message(STATUS "Compiling with the flags:")
|
||||
message(STATUS " PLATFORM=" ${PLATFORM_CPP})
|
||||
install(DIRECTORY "${CMAKE_SOURCE_DIR}/data" DESTINATION .)
|
||||
|
||||
string(TIMESTAMP CURRENT_DATE "%Y-%m-%d")
|
||||
string(TIMESTAMP CURRENT_TIME "%H:%M:%S")
|
||||
|
||||
set(VERSION_STR "${PROJECT_VERSION}")
|
||||
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(VERSION_STR "${VERSION_STR} - Development Build")
|
||||
endif()
|
||||
|
||||
file(WRITE "${CMAKE_BINARY_DIR}/version.txt"
|
||||
"Minecraft PE 0.6.1
|
||||
|
||||
Autogenerated file by cmake-${CMAKE_VERSION}
|
||||
Report issues ${GIT_REPO}/issues
|
||||
|
||||
Build date: ${CURRENT_DATE} ${CURRENT_TIME}
|
||||
Build configuration: ${CMAKE_BUILD_TYPE}
|
||||
Git commit: ${GIT_SHORTSHA}
|
||||
Platform: ${CMAKE_SYSTEM_NAME}")
|
||||
|
||||
install(FILES "${CMAKE_BINARY_DIR}/version.txt" DESTINATION .)
|
||||
|
||||
include(CPack)
|
||||
146
README.md
146
README.md
@@ -17,9 +17,9 @@ This project aims to preserve and improve this early version of Minecraft PE.
|
||||
- [ ] Screen fixes
|
||||
- [ ] Rewrite platform logic
|
||||
- [x] Fix sound
|
||||
- [x] Do a server connection GUI
|
||||
- [ ] Do a server connection GUI
|
||||
- [ ] Controller support
|
||||
- [x] Minecraft server hosting
|
||||
- [ ] Minecraft server hosting
|
||||
- [x] Screen fixess
|
||||
- [x] Fix fog
|
||||
- [x] Add sprinting
|
||||
@@ -70,7 +70,7 @@ cmake --build .
|
||||
4. Press **Run** (or F5) to build and launch the game.
|
||||
|
||||
## Android
|
||||
### Windows
|
||||
|
||||
1. Download **Android NDK r14b**:
|
||||
http://dl.google.com/android/repository/android-ndk-r14b-windows-x86_64.zip
|
||||
|
||||
@@ -94,142 +94,4 @@ cmake --build .
|
||||
|
||||
# Only repackage + install (no compilation)
|
||||
.\build.ps1 -NoBuild
|
||||
```
|
||||
|
||||
### Linux
|
||||
1. Download **Command line tools**:
|
||||
https://developer.android.com/studio#command-line-tools-only
|
||||
|
||||
2. Unzip it into a folder, e.g.:
|
||||
|
||||
```bash
|
||||
mkdir -p "$HOME/Android/Sdk/"
|
||||
unzip commandlinetools-linux-*.zip -d "$HOME/Android/Sdk/"
|
||||
```
|
||||
|
||||
3. Your structure should look like
|
||||
|
||||
```bash
|
||||
$HOME/Android/Sdk/cmdline-tools/bin/sdkmanager
|
||||
```
|
||||
|
||||
> [!Note]
|
||||
> `sdkmanager` expects the SDK to include a `cmdline-tools/latest/` folder.
|
||||
> If you only have `cmdline-tools/bin`, create the required layout:
|
||||
>
|
||||
> ```bash
|
||||
> mkdir -p "$HOME/Android/Sdk/cmdline-tools/latest"
|
||||
> ln -snf ../bin "$HOME/Android/Sdk/cmdline-tools/latest/bin"
|
||||
> ln -snf ../lib "$HOME/Android/Sdk/cmdline-tools/latest/lib"
|
||||
> ln -snf ../source.properties "$HOME/Android/Sdk/cmdline-tools/latest/source.properties"
|
||||
> ln -snf ../NOTICE.txt "$HOME/Android/Sdk/cmdline-tools/latest/NOTICE.txt"
|
||||
> ```
|
||||
|
||||
4. Install the build tools (and platform) using `sdkmanager`
|
||||
|
||||
```bash
|
||||
export ANDROID_SDK_ROOT="$HOME/Android/Sdk"
|
||||
export PATH="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$PATH"
|
||||
|
||||
sdkmanager --install "platform-tools" "platforms;android-35" "build-tools;35.0.0"
|
||||
```
|
||||
|
||||
> [!Note]
|
||||
> if you want build.sh to always find the SDK,
|
||||
> Set ANDROID_SDK_ROOT in your shell config (~/.bashrc / ~/.profile / ~/.config/fish/config.fish), for example:
|
||||
>
|
||||
> ```bash
|
||||
> export ANDROID_SDK_ROOT="$HOME/Android/Sdk"
|
||||
> ```
|
||||
>
|
||||
> Then restart your shell (or `source` the file)
|
||||
|
||||
5. Verify the install
|
||||
|
||||
```bash
|
||||
ls "$ANDROID_SDK_ROOT/build-tools"
|
||||
```
|
||||
|
||||
You should see a version folder like:
|
||||
|
||||
```bash
|
||||
35.0.0
|
||||
33.0.2
|
||||
```
|
||||
|
||||
6. Download **Android NDK r14b**:
|
||||
https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
|
||||
|
||||
7. Extract the archive to `/home/username/`, so that the final directory path is `/home/username/android-ndk-r14b/`
|
||||
|
||||
> [!Warning]
|
||||
> Make sure you don’t end up with a nested folder like `/home/username/android-ndk-r14b/android-ndk-r14b/`.
|
||||
|
||||
8. Re run `build.sh`
|
||||
|
||||
## Web
|
||||
1. Download and install **emsdk**: https://emscripten.org/docs/getting_started/downloads.html
|
||||
> [!Note]
|
||||
> On arch linux you can use AUR:
|
||||
> `yay -Sy emsdk`
|
||||
|
||||
2. Configure and build project:
|
||||
```
|
||||
mkdir build && cd build
|
||||
cmake .. -B . -G Ninja "-DCMAKE_TOOLCHAIN_FILE=$EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
|
||||
cmake --build . --target MinecraftPE
|
||||
```
|
||||
> [!Note]
|
||||
> If you are using VSCode with CMake plugin, you can add Emscripten kit
|
||||
> 1. Press Ctrl + Shift + P
|
||||
> 2. Type `CMake: Edit User-Local CMake Kits` and hit Enter
|
||||
> 3. Add this:
|
||||
```json
|
||||
{
|
||||
"name": "Emscripten",
|
||||
"compilers": {
|
||||
"C": "/usr/lib/emsdk/upstream/bin/clang",
|
||||
"CXX": "/usr/lib/emsdk/upstream/bin/clang++"
|
||||
},
|
||||
"toolchainFile": "/usr/lib/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
|
||||
}
|
||||
```
|
||||
3. Run game:
|
||||
```
|
||||
emrun --port 8080 .
|
||||
```
|
||||
## iOS
|
||||
### Xcode
|
||||
> [Note!]
|
||||
> There's a precompiled IPA artifact in the GitHub mirror under Actions for those who either don't have Macs or don't want to build themself. But if you want to build youself, you'll need a Mac with Xcode. Download Xcode from the Mac App Store.
|
||||
|
||||
### 1. Clone
|
||||
Open your terminal and clone the repository
|
||||
```bash
|
||||
git clone https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
|
||||
cd minecraft-pe-0.6.1
|
||||
```
|
||||
You can also build from the ios-support branch by checking out to it
|
||||
```
|
||||
git checkout ios-support
|
||||
```
|
||||
|
||||
### 2. Open in Xcode
|
||||
|
||||
The project file is in `minecraft-pe-0.6.1/project/iosproj/minecraftpe.xcodeproj`. Open it.
|
||||
|
||||
### 3. Configure Code Signing
|
||||
|
||||
Before you can deploy to an iPhone, you must sign the app with your own Apple Developer account:
|
||||
|
||||
1. Select the **minecraftpe** project in the left sidebar.
|
||||
2. Go to **Signing & Capabilities**.
|
||||
3. Change the **Bundle Identifier** to something unique (e.g., `com.yourname.mcpe`).
|
||||
4. Select your **Team** from the dropdown menu.
|
||||
|
||||
### 4. Build and Run
|
||||
|
||||
1. Connect your iPhone via USB or LAN.
|
||||
2. Select your device from the run destination menu at the top of Xcode.
|
||||
3. Press **Cmd + R** (or the Play button).
|
||||
4. **Note:** If you encounter a "Developer Mode" or "Untrusted Developer" error on your phone, go to **Settings > General > VPN & Device Management** to trust your certificate.
|
||||
```
|
||||
52
build.ps1
52
build.ps1
@@ -1,16 +1,18 @@
|
||||
# ============================================================
|
||||
# MCPE 0.6.1 Android Build Script — from-scratch capable
|
||||
# Works on a clean machine; creates all dirs, keystore and
|
||||
# stub Java files automatically.
|
||||
#
|
||||
# Usage:
|
||||
# .\build.ps1 # full build (NDK + Java + APK + install)
|
||||
# .\build.ps1 -NoCpp # skip NDK rebuild (Java/assets changed)
|
||||
# .\build.ps1 -NoJava # skip Java recompile (C++ changed only)
|
||||
# .\build.ps1 -NoBuild # repackage + install only (no recompile)
|
||||
# .\build.ps1 -Clean # remove build output before building
|
||||
# .\build.ps1 # full build (NDK + Java + APK + install)
|
||||
# .\build.ps1 -NoCpp # skip NDK rebuild (Java/assets changed)
|
||||
# .\build.ps1 -NoJava # skip Java recompile (C++ changed only)
|
||||
# .\build.ps1 -NoBuild # repackage + install only (no recompile)
|
||||
# ============================================================
|
||||
param(
|
||||
[switch]$NoCpp,
|
||||
[switch]$NoJava,
|
||||
[switch]$NoBuild,
|
||||
[switch]$Clean
|
||||
[switch]$NoBuild
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
@@ -64,13 +66,7 @@ function Write-Stub([string]$rel, [string]$content) {
|
||||
if (-not (Test-Path $full)) { [System.IO.File]::WriteAllText($full, $content); Write-Host " stub: $rel" }
|
||||
}
|
||||
|
||||
# ── 0. Clean (optional) ───────────────────────────────────────
|
||||
if ($Clean) {
|
||||
Write-Step "Cleaning build output"
|
||||
Remove-Item -Recurse -Force $apkbuild -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
# ── 1. Bootstrap ─────────────────────────────────────────────
|
||||
# ── 0. Bootstrap ─────────────────────────────────────────────
|
||||
Write-Step "Bootstrap"
|
||||
|
||||
New-Dir $apkbuild
|
||||
@@ -231,16 +227,16 @@ if (-not $NoCpp -and -not $NoBuild) {
|
||||
}
|
||||
Push-Location "$junctionBase/project/android/jni"
|
||||
$env:NDK_MODULE_PATH = "$junctionBase/project/lib_projects"
|
||||
# run ndk-build and stream output directly to the console
|
||||
$ndkCmd = Join-Path $ndk 'ndk-build.cmd'
|
||||
$ndkArgs = "NDK_PROJECT_PATH=`"$junctionBase/project/android`" APP_BUILD_SCRIPT=`"$junctionBase/project/android/jni/Android.mk`""
|
||||
|
||||
$proc = Start-Process -FilePath $ndkCmd -ArgumentList $ndkArgs -NoNewWindow -Wait -PassThru
|
||||
# run ndk-build and capture everything; let user see full output for debugging
|
||||
$ndkOutput = & "$ndk\ndk-build.cmd" NDK_PROJECT_PATH="$junctionBase/project/android" APP_BUILD_SCRIPT="$junctionBase/project/android/jni/Android.mk" 2>&1 | Tee-Object -Variable ndkOutput
|
||||
# dump entire output for diagnosis
|
||||
Write-Host "---- NDK BUILD OUTPUT BEGIN ----"
|
||||
$ndkOutput | ForEach-Object { Write-Host $_ }
|
||||
Write-Host "---- NDK BUILD OUTPUT END ----"
|
||||
# optionally highlight errors/warnings afterwards
|
||||
$ndkOutput | Where-Object { $_ -match "error:|warning:|libminecraftpe|In file included" }
|
||||
Pop-Location
|
||||
if ($proc.ExitCode -ne 0) {
|
||||
Write-Host "ndk-build failed (exit $($proc.ExitCode))" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
Assert-ExitCode "ndk-build"
|
||||
Copy-Item $libSrc $libDst -Force
|
||||
Write-Host " .so -> $libDst"
|
||||
}
|
||||
@@ -250,7 +246,7 @@ if (-not $NoJava -and -not $NoBuild) {
|
||||
Write-Step "Java compile"
|
||||
|
||||
New-Dir (Split-Path $rJava -Parent)
|
||||
& "$sdkTools\aapt.exe" package -f -M $manifest -S $res -I $androidJar -J "$apkbuild\gen" -F "$apkbuild\_rgen.apk"
|
||||
& "$sdkTools\aapt.exe" package -f -M $manifest -S $res -I $androidJar -J "$apkbuild\gen" -F "$apkbuild\_rgen.apk" 2>&1 | Out-Null
|
||||
Assert-ExitCode "aapt R.java"
|
||||
Remove-Item "$apkbuild\_rgen.apk" -ea SilentlyContinue
|
||||
|
||||
@@ -262,9 +258,11 @@ if (-not $NoJava -and -not $NoBuild) {
|
||||
|
||||
Remove-Item $classesDir -Recurse -Force -ea SilentlyContinue
|
||||
New-Dir $classesDir
|
||||
|
||||
& javac --release 8 -cp $androidJar -d $classesDir @srcs
|
||||
if ($LASTEXITCODE -ne 0) { Write-Host 'javac failed' -ForegroundColor Red; exit 1 }
|
||||
$eap = $ErrorActionPreference; $ErrorActionPreference = "Continue"
|
||||
$errors = & javac --release 8 -cp $androidJar -d $classesDir @srcs 2>&1 |
|
||||
Where-Object { $_ -match "error:" }
|
||||
$ErrorActionPreference = $eap
|
||||
if ($errors) { Write-Host $errors -ForegroundColor Red; exit 1 }
|
||||
Write-Host " javac OK"
|
||||
|
||||
$classFiles = Get-ChildItem $classesDir -Recurse -Filter "*.class" | Select-Object -Exp FullName
|
||||
|
||||
455
build.sh
455
build.sh
@@ -1,455 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# ============================================================
|
||||
# Usage:
|
||||
# ./build.sh # full build (NDK + Java + APK + install)
|
||||
# ./build.sh --no-cpp # skip NDK rebuild (Java/assets changed)
|
||||
# ./build.sh --no-java # skip Java recompile (C++ changed only)
|
||||
# ./build.sh --no-build # repackage + install only (no recompile)
|
||||
#
|
||||
# ABI targeting:
|
||||
# ./build.sh --abi arm64-v8a # build for arm64 only (default)
|
||||
# ./build.sh --abi armeabi-v7a # build for ARMv7 only
|
||||
# ./build.sh --abi all # build for both ABIs (fat APK)
|
||||
# ============================================================
|
||||
|
||||
# lets be strict cuz we are safe like that
|
||||
# *thanos snap*
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
########################################
|
||||
# configuration
|
||||
########################################
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REPO_ROOT="$SCRIPT_DIR"
|
||||
|
||||
# build output directory (similar to apkbuild in the PS script)
|
||||
# maybe doing this in build.ps1 would be cleaner, than putting the apkbuild in C:
|
||||
BUILD_DIR="$REPO_ROOT/build-apk"
|
||||
|
||||
# default Android/NDK/SDK paths (can be overridden by env vars)
|
||||
ANDROID_NDK_PATH="${ANDROID_NDK_PATH:-$HOME/android-ndk-r14b}"
|
||||
ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT:-${ANDROID_HOME:-$HOME/Android/Sdk}}"
|
||||
ANDROID_BUILD_TOOLS_VERSION="${ANDROID_BUILD_TOOLS_VERSION:-}"
|
||||
ANDROID_PLATFORM_API="${ANDROID_PLATFORM_API:-}"
|
||||
|
||||
# ABI selection: can be set via --abi flag or MATRIX_ABI env var.
|
||||
# Supported values: arm64-v8a, armeabi-v7a, all
|
||||
# MATRIX_ABI takes precedence over the default but is overridden by --abi on the CLI.
|
||||
TARGET_ABI="${MATRIX_ABI:-arm64-v8a}"
|
||||
|
||||
function fail() {
|
||||
echo "ERROR: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
function find_build_tools_dir() {
|
||||
if [[ -n "$ANDROID_BUILD_TOOLS_VERSION" ]]; then
|
||||
local candidate="$ANDROID_SDK_ROOT/build-tools/$ANDROID_BUILD_TOOLS_VERSION"
|
||||
[[ -d "$candidate" ]] && echo "$candidate" && return
|
||||
fi
|
||||
|
||||
if [[ ! -d "$ANDROID_SDK_ROOT/build-tools" ]]; then
|
||||
fail "Android build-tools not found under $ANDROID_SDK_ROOT/build-tools. Set ANDROID_SDK_ROOT or install Android SDK build-tools."
|
||||
fi
|
||||
|
||||
# picking the highest build tools version because its the easiest way rn
|
||||
# i guess if it breaks then fuck you
|
||||
local best
|
||||
best=$(ls -1 "$ANDROID_SDK_ROOT/build-tools" | sort -V | tail -n 1)
|
||||
[[ -n "$best" && -d "$ANDROID_SDK_ROOT/build-tools/$best" ]] || \
|
||||
fail "No Android build-tools versions found under $ANDROID_SDK_ROOT/build-tools."
|
||||
echo "$ANDROID_SDK_ROOT/build-tools/$best"
|
||||
}
|
||||
|
||||
function find_android_platform_dir() {
|
||||
if [[ -n "$ANDROID_PLATFORM_API" ]]; then
|
||||
local candidate="$ANDROID_SDK_ROOT/platforms/android-$ANDROID_PLATFORM_API"
|
||||
[[ -d "$candidate" ]] && echo "$candidate" && return
|
||||
fi
|
||||
|
||||
if [[ ! -d "$ANDROID_SDK_ROOT/platforms" ]]; then
|
||||
fail "Android platforms not found under $ANDROID_SDK_ROOT/platforms. Install an Android platform."
|
||||
fi
|
||||
|
||||
# pick the highest api level installed for now
|
||||
# ideally we should be able to build to any api level, but lets keep it simple for now and
|
||||
# just pick the highest one available
|
||||
local best
|
||||
best=$(ls -1 "$ANDROID_SDK_ROOT/platforms" | grep -E '^android-[0-9]+' | sed 's/android-//' | sort -n | tail -n 1)
|
||||
[[ -n "$best" ]] || fail "No Android platforms found under $ANDROID_SDK_ROOT/platforms."
|
||||
echo "$ANDROID_SDK_ROOT/platforms/android-$best"
|
||||
}
|
||||
|
||||
ANDROID_BUILD_TOOLS_DIR="$(find_build_tools_dir)"
|
||||
ANDROID_PLATFORM_DIR="$(find_android_platform_dir)"
|
||||
|
||||
KEYSTORE_FILE="$BUILD_DIR/debug.keystore"
|
||||
PACKAGE_NAME="com.mojang.minecraftpe"
|
||||
|
||||
# android tool binaries
|
||||
AAPT="$ANDROID_BUILD_TOOLS_DIR/aapt"
|
||||
ZIPALIGN="$ANDROID_BUILD_TOOLS_DIR/zipalign"
|
||||
APKSIGNER="$ANDROID_BUILD_TOOLS_DIR/apksigner"
|
||||
DEX_TOOL="$ANDROID_BUILD_TOOLS_DIR/d8"
|
||||
ADB="${ADB:-$ANDROID_SDK_ROOT/platform-tools/adb}"
|
||||
|
||||
# java tool binaries
|
||||
JAVA_HOME_DEFAULT="${JAVA_HOME:-}" # may be empty
|
||||
|
||||
# prefer javac from the jdk;
|
||||
# on some systems /usr/lib/jvm/default points to a JRE only.
|
||||
# If javac is missing, try to locate a JDK installation.
|
||||
JAVAC_CMD=""
|
||||
if command -v javac >/dev/null 2>&1; then
|
||||
JAVAC_CMD="$(command -v javac)"
|
||||
elif [[ -n "$JAVA_HOME_DEFAULT" && -x "$JAVA_HOME_DEFAULT/bin/javac" ]]; then
|
||||
JAVAC_CMD="$JAVA_HOME_DEFAULT/bin/javac"
|
||||
elif [[ -x "/usr/lib/jvm/java-8-openjdk/bin/javac" ]]; then
|
||||
JAVAC_CMD="/usr/lib/jvm/java-8-openjdk/bin/javac"
|
||||
elif [[ -x "/usr/lib/jvm/default/bin/javac" ]]; then
|
||||
JAVAC_CMD="/usr/lib/jvm/default/bin/javac"
|
||||
fi
|
||||
|
||||
if [[ -z "$JAVAC_CMD" ]]; then
|
||||
fail "javac not found; install a JDK and ensure javac is on PATH"
|
||||
fi
|
||||
|
||||
KEYTOOL="" # will be detected later
|
||||
|
||||
# swource directories
|
||||
JNI_DIR="$REPO_ROOT/project/android/jni"
|
||||
JAVA_SRC_DIR="$REPO_ROOT/project/android_java/src"
|
||||
ANDROID_MANIFEST="$REPO_ROOT/project/android_java/AndroidManifest.xml"
|
||||
ANDROID_RES_DIR="$REPO_ROOT/project/android_java/res"
|
||||
DATA_DIR="$REPO_ROOT/data"
|
||||
|
||||
# output files: APK names are derived after argument parsing once TARGET_ABI is final.
|
||||
# see the "resolve APK output filenames" block below.
|
||||
APK_UNSIGNED=""
|
||||
APK_ALIGNED=""
|
||||
APK_SIGNED=""
|
||||
DEX_OUTPUT="$BUILD_DIR/classes.dex"
|
||||
|
||||
# flags parsed from CLI args
|
||||
NO_CPP=false
|
||||
NO_JAVA=false
|
||||
NO_BUILD=false
|
||||
|
||||
########################################
|
||||
# helpers
|
||||
########################################
|
||||
function usage() {
|
||||
cat <<EOF
|
||||
Usage: $0 [--no-cpp] [--no-java] [--no-build] [--abi <abi>]
|
||||
|
||||
Options:
|
||||
--no-cpp Skip the NDK (C++) build step
|
||||
--no-java Skip the Java build step
|
||||
--no-build Skip the compile steps; just package + install
|
||||
--abi <abi> Target ABI: arm64-v8a (default), armeabi-v7a, or all
|
||||
Can also be set via MATRIX_ABI env var for CI matrix builds.
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
function log_step() {
|
||||
echo -e "\n==> $1"
|
||||
}
|
||||
|
||||
function fail() {
|
||||
echo "ERROR: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
function require_cmd() {
|
||||
if ! command -v "$1" >/dev/null 2>&1; then
|
||||
fail "$1 not found; install it (e.g. 'sudo pacman -S $1')"
|
||||
fi
|
||||
}
|
||||
|
||||
# ensure required tools are available early
|
||||
require_cmd zip
|
||||
require_cmd unzip
|
||||
|
||||
function ensure_dir() {
|
||||
mkdir -p "$1"
|
||||
}
|
||||
|
||||
function find_keytool() {
|
||||
# first try JAVA_HOME if set
|
||||
if [[ -n "$JAVA_HOME_DEFAULT" && -x "$JAVA_HOME_DEFAULT/bin/keytool" ]]; then
|
||||
echo "$JAVA_HOME_DEFAULT/bin/keytool"
|
||||
return
|
||||
fi
|
||||
|
||||
# try common install locations
|
||||
if [[ -n "${JAVA_HOME:-}" && -x "${JAVA_HOME}/bin/keytool" ]]; then
|
||||
echo "${JAVA_HOME}/bin/keytool"
|
||||
return
|
||||
fi
|
||||
|
||||
if command -v keytool >/dev/null 2>&1; then
|
||||
command -v keytool
|
||||
return
|
||||
fi
|
||||
|
||||
fail "keytool not found. Set JAVA_HOME or install a JDK."
|
||||
}
|
||||
|
||||
function write_stub_file() {
|
||||
local rel_path="$1"
|
||||
local content="$2"
|
||||
local full_path="$BUILD_DIR/stubs/$rel_path"
|
||||
|
||||
ensure_dir "$(dirname "$full_path")"
|
||||
if [[ ! -f "$full_path" ]]; then
|
||||
echo -e "$content" > "$full_path"
|
||||
echo " stub: $rel_path"
|
||||
fi
|
||||
}
|
||||
|
||||
function build_ndk_abi() {
|
||||
local abi="$1"
|
||||
|
||||
# armeabi-v7a needs a few extra NDK flags to get hardware FPU support
|
||||
# without APP_ABI the default would be whatever Android.mk says, so we
|
||||
# always pass it explicitly so the same Android.mk works for both targets
|
||||
local -a extra_flags=( "APP_ABI=$abi" )
|
||||
if [[ "$abi" == "armeabi-v7a" ]]; then
|
||||
# enable hardware FPU + NEON like the old Minecraft ARMv7 builds used to
|
||||
extra_flags+=( "APP_ARM_MODE=arm" "APP_ARM_NEON=true" )
|
||||
fi
|
||||
|
||||
echo " ndk-build for $abi..."
|
||||
if ! "$ANDROID_NDK_PATH/ndk-build" \
|
||||
NDK_PROJECT_PATH="$REPO_ROOT/project/android" \
|
||||
APP_BUILD_SCRIPT="$JNI_DIR/Android.mk" \
|
||||
"${extra_flags[@]}" \
|
||||
2>&1 | tee "$BUILD_DIR/ndk-build-${abi}.log"; then
|
||||
echo "NDK build failed for $abi. See $BUILD_DIR/ndk-build-${abi}.log" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ensure_dir "$BUILD_DIR/lib/$abi"
|
||||
cp -v "$REPO_ROOT/project/android/libs/$abi/libminecraftpe.so" "$BUILD_DIR/lib/$abi/"
|
||||
echo " .so -> $BUILD_DIR/lib/$abi/libminecraftpe.so"
|
||||
}
|
||||
|
||||
########################################
|
||||
# argument parsing
|
||||
########################################
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--no-cpp) NO_CPP=true ;;
|
||||
--no-java) NO_JAVA=true ;;
|
||||
--no-build) NO_BUILD=true ;;
|
||||
--abi)
|
||||
shift
|
||||
[[ $# -gt 0 ]] || fail "--abi requires a value (arm64-v8a, armeabi-v7a, all)"
|
||||
TARGET_ABI="$1"
|
||||
;;
|
||||
-h|--help) usage ;;
|
||||
*)
|
||||
echo "Unknown option: $1" >&2
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# validate the ABI value now that all args are parsed
|
||||
case "$TARGET_ABI" in
|
||||
arm64-v8a|armeabi-v7a|all) ;;
|
||||
*) fail "Unknown ABI '$TARGET_ABI'. Supported values: arm64-v8a, armeabi-v7a, all" ;;
|
||||
esac
|
||||
|
||||
echo " TARGET_ABI=$TARGET_ABI"
|
||||
|
||||
# resolve APK output filenames now that TARGET_ABI is final.
|
||||
# arm64-v8a -> minecraftpe-v8a-debug.apk
|
||||
# armeabi-v7a -> minecraftpe-v7a-debug.apk
|
||||
# all -> minecraftpe-all-debug.apk (fat APK containing both ABIs)
|
||||
case "$TARGET_ABI" in
|
||||
arm64-v8a) APK_SUFFIX="v8a" ;;
|
||||
armeabi-v7a) APK_SUFFIX="v7a" ;;
|
||||
*) APK_SUFFIX="$TARGET_ABI" ;;
|
||||
esac
|
||||
APK_UNSIGNED="$BUILD_DIR/minecraftpe-${APK_SUFFIX}-unsigned.apk"
|
||||
APK_ALIGNED="$BUILD_DIR/minecraftpe-${APK_SUFFIX}-aligned.apk"
|
||||
APK_SIGNED="$BUILD_DIR/minecraftpe-${APK_SUFFIX}-debug.apk"
|
||||
|
||||
########################################
|
||||
# validate required tools
|
||||
########################################
|
||||
KEYTOOL="$(find_keytool)"
|
||||
|
||||
if [[ ! -x "$AAPT" ]]; then
|
||||
fail "aapt not found at $AAPT"
|
||||
fi
|
||||
|
||||
if [[ ! -x "$ZIPALIGN" ]]; then
|
||||
fail "zipalign not found at $ZIPALIGN"
|
||||
fi
|
||||
|
||||
if [[ ! -x "$APKSIGNER" ]]; then
|
||||
fail "apksigner not found at $APKSIGNER"
|
||||
fi
|
||||
|
||||
if [[ ! -x "$DEX_TOOL" ]]; then
|
||||
fail "d8 not found at $DEX_TOOL"
|
||||
fi
|
||||
|
||||
if [[ ! -x "$ADB" ]]; then
|
||||
fail "adb not found at $ADB"
|
||||
fi
|
||||
|
||||
########################################
|
||||
# bootstrap
|
||||
########################################
|
||||
log_step "Bootstrap"
|
||||
|
||||
ensure_dir "$BUILD_DIR"
|
||||
ensure_dir "$BUILD_DIR/lib/arm64-v8a"
|
||||
ensure_dir "$BUILD_DIR/lib/armeabi-v7a"
|
||||
ensure_dir "$BUILD_DIR/gen"
|
||||
ensure_dir "$BUILD_DIR/stubs"
|
||||
|
||||
# create a debug keystore if it doesn't exist
|
||||
if [[ ! -f "$KEYSTORE_FILE" ]]; then
|
||||
echo " generating debug.keystore..."
|
||||
"$KEYTOOL" -genkeypair \
|
||||
-keystore "$KEYSTORE_FILE" -storepass android -keypass android \
|
||||
-alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 \
|
||||
-dname "CN=Android Debug,O=Android,C=US" >/dev/null 2>&1
|
||||
echo " keystore created"
|
||||
else
|
||||
echo " keystore OK"
|
||||
fi
|
||||
|
||||
# why dont we just include the stubs lol
|
||||
write_stub_file "com/mojang/android/StringValue.java" "package com.mojang.android;\npublic interface StringValue { String getStringValue(); }\n"
|
||||
|
||||
write_stub_file "com/mojang/android/licensing/LicenseCodes.java" "package com.mojang.android.licensing;\npublic class LicenseCodes { public static final int LICENSE_OK = 0; }\n"
|
||||
|
||||
write_stub_file "com/mojang/android/EditTextAscii.java" "package com.mojang.android;\nimport android.content.Context;\nimport android.text.Editable;\nimport android.text.TextWatcher;\nimport android.util.AttributeSet;\nimport android.widget.EditText;\npublic class EditTextAscii extends EditText implements TextWatcher {\n public EditTextAscii(Context c) { super(c); addTextChangedListener(this); }\n public EditTextAscii(Context c, AttributeSet a) { super(c,a); addTextChangedListener(this); }\n public EditTextAscii(Context c, AttributeSet a, int d) { super(c,a,d); addTextChangedListener(this); }\n @Override public void onTextChanged(CharSequence s,int st,int b,int co){}\n public void beforeTextChanged(CharSequence s,int st,int co,int aft){}\n public void afterTextChanged(Editable e){\n String s=e.toString(),san=sanitize(s);\n if(!s.equals(san))e.replace(0,e.length(),san);\n }\n static public String sanitize(String s){\n StringBuilder sb=new StringBuilder();\n for(int i=0;i<s.length();i++){char c=s.charAt(i);if(c<128)sb.append(c);}\n return sb.toString();\n }\n}\n"
|
||||
|
||||
write_stub_file "com/mojang/android/preferences/SliderPreference.java" "package com.mojang.android.preferences;\nimport android.content.Context;\nimport android.content.res.Resources;\nimport android.preference.DialogPreference;\nimport android.util.AttributeSet;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.widget.LinearLayout;\nimport android.widget.SeekBar;\nimport android.widget.TextView;\npublic class SliderPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener {\n private static final String NS=\"http://schemas.android.com/apk/res/android\";\n private Context _ctx; private TextView _tv; private SeekBar _sb;\n private String _suf; private int _def,_max,_val,_min;\n public SliderPreference(Context ctx,AttributeSet a){\n super(ctx,a); _ctx=ctx;\n _suf=gStr(a,NS,\"text\",\"\"); _def=gInt(a,NS,\"defaultValue\",0);\n _max=gInt(a,NS,\"max\",100); _min=gInt(a,null,\"min\",0);\n setDefaultValue(_def);\n }\n @Override protected View onCreateDialogView(){\n LinearLayout l=new LinearLayout(_ctx); l.setOrientation(LinearLayout.VERTICAL); l.setPadding(6,6,6,6);\n _tv=new TextView(_ctx); _tv.setGravity(Gravity.CENTER_HORIZONTAL); _tv.setTextSize(32);\n l.addView(_tv,new LinearLayout.LayoutParams(-1,-2));\n _sb=new SeekBar(_ctx); _sb.setOnSeekBarChangeListener(this);\n l.addView(_sb,new LinearLayout.LayoutParams(-1,-2));\n if(shouldPersist())_val=getPersistedInt(_def);\n _sb.setMax(_max); _sb.setProgress(_val); return l;\n }\n @Override protected void onSetInitialValue(boolean r,Object d){\n super.onSetInitialValue(r,d);\n _val=r?(shouldPersist()?getPersistedInt(_def):0):(Integer)d;\n }\n public void onProgressChanged(SeekBar s,int v,boolean f){\n _val=v+_min; _tv.setText(_val+_suf);\n if(shouldPersist())persistInt(_val); callChangeListener(Integer.valueOf(_val));\n }\n public void onStartTrackingTouch(SeekBar s){}\n public void onStopTrackingTouch(SeekBar s){}\n private int gInt(AttributeSet a,String ns,String n,int d){int id=a.getAttributeResourceValue(ns,n,0);return id!=0?getContext().getResources().getInteger(id):a.getAttributeIntValue(ns,n,d);}\n private String gStr(AttributeSet a,String ns,String n,String d){int id=a.getAttributeResourceValue(ns,n,0);if(id!=0)return getContext().getResources().getString(id);String v=a.getAttributeValue(ns,n);return v!=null?v:d;}\n}\n"
|
||||
|
||||
write_stub_file "com/mojang/minecraftpe/MainMenuOptionsActivity.java" "package com.mojang.minecraftpe;\nimport android.app.Activity;\npublic class MainMenuOptionsActivity extends Activity {\n public static final String Internal_Game_DifficultyPeaceful=\"internal_game_difficulty_peaceful\";\n public static final String Game_DifficultyLevel=\"game_difficulty\";\n public static final String Controls_Sensitivity=\"controls_sensitivity\";\n}\n"
|
||||
|
||||
write_stub_file "com/mojang/minecraftpe/Minecraft_Market.java" "package com.mojang.minecraftpe;\nimport android.app.Activity; import android.content.Intent; import android.os.Bundle;\npublic class Minecraft_Market extends Activity {\n @Override protected void onCreate(Bundle s){super.onCreate(s);startActivity(new Intent(this,MainActivity.class));finish();}\n}\n"
|
||||
|
||||
write_stub_file "com/mojang/minecraftpe/Minecraft_Market_Demo.java" "package com.mojang.minecraftpe;\nimport android.content.Intent; import android.net.Uri;\npublic class Minecraft_Market_Demo extends MainActivity {\n @Override public void buyGame(){startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse(\"market://details?id=com.mojang.minecraftpe\")));}\n @Override protected boolean isDemo(){return true;}\n}\n"
|
||||
|
||||
write_stub_file "com/mojang/minecraftpe/GameModeButton.java" "package com.mojang.minecraftpe;\nimport com.mojang.android.StringValue;\nimport android.content.Context; import android.util.AttributeSet;\nimport android.view.View; import android.view.View.OnClickListener;\nimport android.widget.TextView; import android.widget.ToggleButton;\npublic class GameModeButton extends ToggleButton implements OnClickListener,StringValue {\n static final int Creative=0,Survival=1;\n private int _type=0; private boolean _attached=false;\n public GameModeButton(Context c,AttributeSet a){super(c,a);setOnClickListener(this);}\n public void onClick(View v){_update();}\n @Override protected void onFinishInflate(){super.onFinishInflate();_update();}\n @Override protected void onAttachedToWindow(){if(!_attached){_update();_attached=true;}}\n private void _update(){_set(isChecked()?Survival:Creative);}\n private void _set(int i){\n _type=i<Creative?Creative:(i>Survival?Survival:i);\n int id=_type==Survival?R.string.gamemode_survival_summary:R.string.gamemode_creative_summary;\n String desc=getContext().getString(id);\n View v=getRootView().findViewById(R.id.labelGameModeDesc);\n if(desc!=null&&v instanceof TextView)((TextView)v).setText(desc);\n }\n public String getStringValue(){return new String[]{\"creative\",\"survival\"}[_type];}\n static public String getStringForType(int i){int c=i<Creative?Creative:(i>Survival?Survival:i);return new String[]{\"creative\",\"survival\"}[c];}\n}\n"
|
||||
|
||||
echo " stubs OK"
|
||||
|
||||
########################################
|
||||
# ndk build
|
||||
########################################
|
||||
if [[ "$NO_CPP" == false && "$NO_BUILD" == false ]]; then
|
||||
log_step "NDK build ($TARGET_ABI)"
|
||||
|
||||
# the original windows build script used a junction to avoid long paths here
|
||||
# on linux, path lengths are *usually* fine, but we still keep things simple
|
||||
pushd "$JNI_DIR" >/dev/null
|
||||
|
||||
export NDK_MODULE_PATH="$REPO_ROOT/project/lib_projects"
|
||||
|
||||
# build each requested ABI by delegating to build_ndk_abi()
|
||||
if [[ "$TARGET_ABI" == "all" ]]; then
|
||||
build_ndk_abi "arm64-v8a"
|
||||
build_ndk_abi "armeabi-v7a"
|
||||
else
|
||||
build_ndk_abi "$TARGET_ABI"
|
||||
fi
|
||||
|
||||
popd >/dev/null
|
||||
fi
|
||||
|
||||
########################################
|
||||
# java compile
|
||||
########################################
|
||||
if [[ "$NO_JAVA" == false && "$NO_BUILD" == false ]]; then
|
||||
log_step "Java compile"
|
||||
|
||||
ensure_dir "$(dirname "$BUILD_DIR/gen/R.java")"
|
||||
|
||||
# generate R.java
|
||||
"$AAPT" package -f -M "$ANDROID_MANIFEST" -S "$ANDROID_RES_DIR" -I "$ANDROID_PLATFORM_DIR/android.jar" -J "$BUILD_DIR/gen" -F "$BUILD_DIR/_rgen.apk"
|
||||
rm -f "$BUILD_DIR/_rgen.apk"
|
||||
|
||||
# collect all source files (project + stubs + generated R.java)
|
||||
JAVA_SOURCES=(
|
||||
$(find "$JAVA_SRC_DIR" -name "*.java" -print)
|
||||
$(find "$BUILD_DIR/stubs" -name "*.java" -print)
|
||||
"$BUILD_DIR/gen/R.java"
|
||||
)
|
||||
|
||||
rm -rf "$BUILD_DIR/classes"
|
||||
ensure_dir "$BUILD_DIR/classes"
|
||||
|
||||
# Some JDK versions (<=8) don't support --release.
|
||||
JAVAC_ARGS=(--release 8)
|
||||
if "$JAVAC_CMD" -version 2>&1 | grep -qE '^javac 1\.'; then
|
||||
JAVAC_ARGS=(-source 1.8 -target 1.8)
|
||||
fi
|
||||
|
||||
"$JAVAC_CMD" "${JAVAC_ARGS[@]}" -cp "$ANDROID_PLATFORM_DIR/android.jar" -d "$BUILD_DIR/classes" "${JAVA_SOURCES[@]}"
|
||||
echo " javac OK"
|
||||
|
||||
# convert class files into dex
|
||||
JAVA_CLASS_FILES=( $(find "$BUILD_DIR/classes" -name "*.class" -print) )
|
||||
"$DEX_TOOL" --min-api 21 --output "$BUILD_DIR" "${JAVA_CLASS_FILES[@]}"
|
||||
echo " d8 -> $DEX_OUTPUT"
|
||||
fi
|
||||
|
||||
########################################
|
||||
# package apk
|
||||
########################################
|
||||
log_step "Package APK"
|
||||
|
||||
rm -f "$APK_UNSIGNED" "$APK_ALIGNED" "$APK_SIGNED"
|
||||
|
||||
"$AAPT" package -f -M "$ANDROID_MANIFEST" -S "$ANDROID_RES_DIR" -I "$ANDROID_PLATFORM_DIR/android.jar" -F "$APK_UNSIGNED"
|
||||
|
||||
# add classes.dex and native library/libraries into apk.
|
||||
# when building for "all" we pack both ABIs into the same APK so Android can
|
||||
# pick the right one at install time (fat APK). for a single-ABI build we
|
||||
# only include the one .so that was actually compiled.
|
||||
pushd "$BUILD_DIR" >/dev/null
|
||||
zip -q "$APK_UNSIGNED" "classes.dex"
|
||||
if [[ "$TARGET_ABI" == "all" ]]; then
|
||||
zip -q "$APK_UNSIGNED" "lib/arm64-v8a/libminecraftpe.so"
|
||||
zip -q "$APK_UNSIGNED" "lib/armeabi-v7a/libminecraftpe.so"
|
||||
else
|
||||
zip -q "$APK_UNSIGNED" "lib/$TARGET_ABI/libminecraftpe.so"
|
||||
fi
|
||||
popd >/dev/null
|
||||
|
||||
# add assets from data/ directory into the apk under assets/
|
||||
TMP_ASSETS_DIR="$(mktemp -d)"
|
||||
mkdir -p "$TMP_ASSETS_DIR/assets"
|
||||
cp -r "$DATA_DIR/." "$TMP_ASSETS_DIR/assets/"
|
||||
pushd "$TMP_ASSETS_DIR" >/dev/null
|
||||
zip -q -r "$APK_UNSIGNED" assets
|
||||
popd >/dev/null
|
||||
rm -rf "$TMP_ASSETS_DIR"
|
||||
|
||||
"$ZIPALIGN" -p 4 "$APK_UNSIGNED" "$APK_ALIGNED"
|
||||
"$APKSIGNER" sign --ks "$KEYSTORE_FILE" --ks-pass pass:android --key-pass pass:android --out "$APK_SIGNED" "$APK_ALIGNED"
|
||||
|
||||
echo " signed -> $APK_SIGNED"
|
||||
|
||||
########################################
|
||||
# install
|
||||
########################################
|
||||
log_step "Install"
|
||||
|
||||
"$ADB" shell am force-stop "$PACKAGE_NAME" || true
|
||||
"$ADB" uninstall "$PACKAGE_NAME" || true
|
||||
"$ADB" install --no-incremental "$APK_SIGNED"
|
||||
|
||||
echo -e "\nDone. Enjoy MCPE 0.6.1 on your device!"
|
||||
@@ -1,9 +0,0 @@
|
||||
macro(enum_option var values description)
|
||||
set(${var}_VALUES ${values})
|
||||
list(GET ${var}_VALUES 0 default)
|
||||
set(${var} "${default}" CACHE STRING "${description}")
|
||||
set_property(CACHE ${var} PROPERTY STRINGS ${${var}_VALUES})
|
||||
if (NOT ";${${var}_VALUES};" MATCHES ";${${var}};")
|
||||
message(FATAL_ERROR "Unknown value ${${var}}. Only -D${var}=${${var}_VALUES} allowed.")
|
||||
endif()
|
||||
endmacro()
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 17 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 25 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 23 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 90 KiB |
@@ -152,9 +152,7 @@ options.group.graphics=Graphics
|
||||
options.group.tweaks=Tweaks
|
||||
options.allowSprint=Allow sprint
|
||||
options.barOnTop=HUD above inventory
|
||||
options.rpiCursor=Show Raspberry PI cursor
|
||||
options.foliageTint=Tint Grass and Leaves
|
||||
options.autoJump=Auto Jump
|
||||
options.autojump=Auto Jump
|
||||
options.thirdperson=Third Person
|
||||
options.servervisible=Server Visible
|
||||
options.sensitivity=Sensitivity
|
||||
@@ -183,10 +181,9 @@ options.graphics.fast=Fast
|
||||
options.guiScale=GUI Scale
|
||||
options.guiScale.auto=Auto
|
||||
options.guiScale.small=Small
|
||||
options.guiScale.medium=Medium
|
||||
options.guiScale.normal=Normal
|
||||
options.guiScale.large=Large
|
||||
options.guiScale.larger=Larger
|
||||
options.guiScale.largest=Largest
|
||||
options.advancedOpengl=Advanced OpenGL
|
||||
options.renderClouds=Clouds
|
||||
options.farWarning1=A 64 bit Java installation is recommended
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>MCPE 0.6.1</title>
|
||||
<style>
|
||||
html, body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
background: black;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#canvas {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<canvas id="canvas"></canvas>
|
||||
|
||||
<script>
|
||||
var Module = {
|
||||
canvas: document.getElementById('canvas'),
|
||||
onRuntimeInitialized: function () { resizeCanvas() }
|
||||
};
|
||||
|
||||
function resizeCanvas() {
|
||||
const canvas = Module.canvas;
|
||||
canvas.width = window.innerWidth;
|
||||
canvas.height = window.innerHeight;
|
||||
}
|
||||
|
||||
window.addEventListener('resize', resizeCanvas);
|
||||
window.addEventListener('onunload', () => {
|
||||
FS.syncfs(true, function (err) { console.log('Sync FS failed: ' + err) });
|
||||
})
|
||||
</script>
|
||||
|
||||
<script src="MinecraftPE.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -6,8 +6,8 @@
|
||||
android:installLocation="preferExternal">
|
||||
|
||||
<!-- This is the platform API where NativeActivity was introduced. -->
|
||||
<uses-sdk android:minSdkVersion="19"
|
||||
android:targetSdkVersion="30" />
|
||||
<uses-sdk android:minSdkVersion="24"
|
||||
android:targetSdkVersion="24" />
|
||||
|
||||
<!-- uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="true"/ -->
|
||||
|
||||
|
||||
@@ -168,10 +168,9 @@ options.graphics.fast=Fast
|
||||
options.guiScale=GUI Scale
|
||||
options.guiScale.auto=Auto
|
||||
options.guiScale.small=Small
|
||||
options.guiScale.medium=Medium
|
||||
options.guiScale.normal=Normal
|
||||
options.guiScale.large=Large
|
||||
options.guiScale.larger=Larger
|
||||
options.guiScale.largest=Largest
|
||||
options.advancedOpengl=Advanced OpenGL
|
||||
options.renderClouds=Clouds
|
||||
options.farWarning1=A 64 bit Java installation is recommended
|
||||
|
||||
@@ -24,7 +24,6 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
||||
../../../src/client/Options.cpp \
|
||||
../../../src/client/OptionsFile.cpp \
|
||||
../../../src/client/OptionStrings.cpp \
|
||||
../../../src/client/Option.cpp \
|
||||
../../../src/client/gamemode/GameMode.cpp \
|
||||
../../../src/client/gamemode/CreativeMode.cpp \
|
||||
../../../src/client/gamemode/SurvivalMode.cpp \
|
||||
@@ -38,14 +37,14 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
||||
../../../src/client/gui/components/NinePatch.cpp \
|
||||
../../../src/client/gui/components/OptionsGroup.cpp \
|
||||
../../../src/client/gui/components/OptionsItem.cpp \
|
||||
../../../src/client/gui/components/KeyOption.cpp \
|
||||
../../../src/client/gui/components/TextOption.cpp \
|
||||
../../../src/client/gui/components/OptionsPane.cpp \
|
||||
../../../src/client/gui/components/RolledSelectionListH.cpp \
|
||||
../../../src/client/gui/components/RolledSelectionListV.cpp \
|
||||
../../../src/client/gui/components/ScrolledSelectionList.cpp \
|
||||
../../../src/client/gui/components/ScrollingPane.cpp \
|
||||
../../../src/client/gui/components/Slider.cpp \
|
||||
../../../src/client/gui/components/TextBox.cpp \
|
||||
../../../src/client/gui/components/SmallButton.cpp \
|
||||
../../../src/client/gui/Font.cpp \
|
||||
../../../src/client/gui/Gui.cpp \
|
||||
../../../src/client/gui/GuiComponent.cpp \
|
||||
@@ -209,8 +208,6 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
||||
../../../src/world/level/MobSpawner.cpp \
|
||||
../../../src/world/level/Region.cpp \
|
||||
../../../src/world/level/TickNextTickData.cpp \
|
||||
../../../src/world/level/FoliageColor.cpp \
|
||||
../../../src/world/level/GrassColor.cpp \
|
||||
../../../src/world/level/biome/Biome.cpp \
|
||||
../../../src/world/level/biome/BiomeSource.cpp \
|
||||
../../../src/world/level/chunk/LevelChunk.cpp \
|
||||
@@ -259,8 +256,7 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
||||
../../../src/world/phys/HitResult.cpp
|
||||
|
||||
LOCAL_CFLAGS := -DPLATFORM_ANDROID -DPRE_ANDROID23 -Wno-narrowing $(LOCAL_CFLAGS)
|
||||
LOCAL_CPPFLAGS := -std=c++14 -frtti
|
||||
LOCAL_CPPFLAGS += -frtti
|
||||
LOCAL_CPPFLAGS := -std=c++11
|
||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../src
|
||||
|
||||
#LOCAL_CFLAGS := -DANDROID_PUBLISH -DDEMO_MODE $(LOCAL_CFLAGS)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
APP_PLATFORM := android-19
|
||||
APP_PLATFORM := android-21
|
||||
APP_STL := gnustl_static
|
||||
APP_OPTIM := release
|
||||
APP_ABI := arm64-v8a
|
||||
APP_SHORT_COMMANDS := true
|
||||
APP_CPPFLAGS += -frtti -fexceptions
|
||||
#APP_ABI := armeabi-v7a x86
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
android:versionName="0.6.1-alpha-0.0.3">
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="19"
|
||||
android:targetSdkVersion="30"/>
|
||||
android:minSdkVersion="24"
|
||||
android:targetSdkVersion="28"/>
|
||||
|
||||
<uses-feature
|
||||
android:name="android.hardware.touchscreen.multitouch"
|
||||
|
||||
@@ -168,10 +168,8 @@ options.graphics.fast=Fast
|
||||
options.guiScale=GUI Scale
|
||||
options.guiScale.auto=Auto
|
||||
options.guiScale.small=Small
|
||||
options.guiScale.medium=Medium
|
||||
options.guiScale.normal=Normal
|
||||
options.guiScale.large=Large
|
||||
options.guiScale.larger=Larger
|
||||
options.guiScale.largest=Largest
|
||||
options.advancedOpengl=Advanced OpenGL
|
||||
options.renderClouds=Clouds
|
||||
options.farWarning1=A 64 bit Java installation is recommended
|
||||
|
||||
@@ -183,8 +183,6 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
||||
../../../src/world/level/MobSpawner.cpp \
|
||||
../../../src/world/level/Region.cpp \
|
||||
../../../src/world/level/TickNextTickData.cpp \
|
||||
../../../src/world/level/FoliageColor.cpp \
|
||||
../../../src/world/level/GrassColor.cpp \
|
||||
../../../src/world/level/biome/Biome.cpp \
|
||||
../../../src/world/level/biome/BiomeSource.cpp \
|
||||
../../../src/world/level/chunk/LevelChunk.cpp \
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
APP_PLATFORM := android-19
|
||||
APP_PLATFORM := android-9
|
||||
APP_STL := gnustl_static
|
||||
APP_OPTIM := release
|
||||
APP_ABI := armeabi-v7a
|
||||
@@ -59,7 +59,6 @@ public class MainActivity extends Activity {
|
||||
private static final int PERMISSION_REQUEST_CODE = 123;
|
||||
|
||||
private GLView _glView;
|
||||
private boolean _nativeInitialized = false;
|
||||
public float invScale = 1.0f;// / 1.5f;
|
||||
private int _screenWidth = 0;
|
||||
private int _screenHeight = 0;
|
||||
@@ -78,48 +77,63 @@ public class MainActivity extends Activity {
|
||||
_screenWidth = Math.max(_dm.widthPixels, _dm.heightPixels);
|
||||
_screenHeight = Math.min(_dm.widthPixels, _dm.heightPixels);
|
||||
|
||||
nativeOnCreate(_screenWidth, _screenHeight);
|
||||
|
||||
_glView = new GLView(getApplication(), this);
|
||||
//_glView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
|
||||
|
||||
_glView.setEGLConfigChooser(true);
|
||||
//_glView
|
||||
|
||||
// _glView.setEGLConfigChooser(
|
||||
// new GLSurfaceView.EGLConfigChooser() {
|
||||
//
|
||||
// @Override
|
||||
// public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
|
||||
// // TODO Auto-generated method stub
|
||||
//
|
||||
// // Specify a configuration for our opengl session
|
||||
// // and grab the first configuration that matches is
|
||||
// int[] configSpec = {
|
||||
// EGL10.EGL_DEPTH_SIZE, 24,
|
||||
// EGL10.EGL_NONE
|
||||
// };
|
||||
// EGLConfig[] configs = new EGLConfig[1];
|
||||
// int[] num_config = new int[1];
|
||||
// egl.eglChooseConfig(display, configSpec, configs, 1, num_config);
|
||||
// EGLConfig config = configs[0];
|
||||
// return config;
|
||||
//
|
||||
// //return null;
|
||||
// }
|
||||
// } );
|
||||
|
||||
_glView.commit();
|
||||
setContentView(_glView);
|
||||
|
||||
_soundPlayer = new SoundPlayer(this, AudioManager.STREAM_MUSIC);
|
||||
setContentView(_glView);
|
||||
|
||||
_soundPlayer = new SoundPlayer(this, AudioManager.STREAM_MUSIC);
|
||||
|
||||
// request dangerous permissions at runtime if necessary
|
||||
checkAndRequestPermissions();
|
||||
initNative();
|
||||
}
|
||||
|
||||
private void initNative() {
|
||||
if (_nativeInitialized) {
|
||||
return;
|
||||
private void checkAndRequestPermissions() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
boolean needRequest = false;
|
||||
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
needRequest = true;
|
||||
}
|
||||
if (checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
needRequest = true;
|
||||
}
|
||||
if (needRequest) {
|
||||
requestPermissions(new String[] {
|
||||
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
android.Manifest.permission.READ_EXTERNAL_STORAGE
|
||||
}, PERMISSION_REQUEST_CODE);
|
||||
}
|
||||
}
|
||||
_nativeInitialized = true;
|
||||
nativeOnCreate(_screenWidth, _screenHeight);
|
||||
}
|
||||
|
||||
// request dangerous permissions at runtime if necessary
|
||||
private boolean checkAndRequestPermissions() {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean writeGranted = checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
|
||||
boolean readGranted = checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
if (writeGranted && readGranted) {
|
||||
return true;
|
||||
}
|
||||
|
||||
requestPermissions(new String[] {
|
||||
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
android.Manifest.permission.READ_EXTERNAL_STORAGE
|
||||
}, PERMISSION_REQUEST_CODE);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -132,18 +146,8 @@ public class MainActivity extends Activity {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (granted) {
|
||||
initNative();
|
||||
} else {
|
||||
// We can still run using app-specific external files in scoped-storage,
|
||||
// so allow startup while warning the user.
|
||||
initNative();
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle("Storage permission recommended")
|
||||
.setMessage("MinecraftPE can still run with app-private storage, but public external save/load may require permission.")
|
||||
.setPositiveButton("OK", null)
|
||||
.setCancelable(true)
|
||||
.show();
|
||||
if (!granted) {
|
||||
// user denied; you might want to warn or close the app
|
||||
}
|
||||
}
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
|
||||
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="EHf-IW-A2E">
|
||||
<objects>
|
||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="obG-Y5-kRd">
|
||||
<rect key="frame" x="0.0" y="626.5" width="375" height="20.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="minecraftpe" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="GJd-Yh-RWb">
|
||||
<rect key="frame" x="0.0" y="202" width="375" height="43"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Bcu-3y-fUS" firstAttribute="centerX" secondItem="obG-Y5-kRd" secondAttribute="centerX" id="5cz-MP-9tL"/>
|
||||
<constraint firstItem="Bcu-3y-fUS" firstAttribute="centerX" secondItem="GJd-Yh-RWb" secondAttribute="centerX" id="Q3B-4B-g5h"/>
|
||||
<constraint firstItem="obG-Y5-kRd" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" constant="20" symbolic="YES" id="SfN-ll-jLj"/>
|
||||
<constraint firstAttribute="bottom" secondItem="obG-Y5-kRd" secondAttribute="bottom" constant="20" id="Y44-ml-fuU"/>
|
||||
<constraint firstItem="GJd-Yh-RWb" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="bottom" multiplier="1/3" constant="1" id="moa-c2-u7t"/>
|
||||
<constraint firstItem="GJd-Yh-RWb" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" constant="20" symbolic="YES" id="x7j-FC-K8j"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="53" y="375"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
@@ -41,6 +41,7 @@
|
||||
042A91AE16B17517007ABBC6 /* GuiElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A316B17517007ABBC6 /* GuiElement.cpp */; };
|
||||
042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A516B17517007ABBC6 /* NinePatch.cpp */; };
|
||||
042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A716B17517007ABBC6 /* OptionsGroup.cpp */; };
|
||||
042A91B116B17517007ABBC6 /* OptionsPane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A916B17517007ABBC6 /* OptionsPane.cpp */; };
|
||||
042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91AB16B17517007ABBC6 /* TextBox.cpp */; };
|
||||
044129071682FF9600B70EE6 /* MouseHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 044129061682FF9600B70EE6 /* MouseHandler.cpp */; };
|
||||
9D293CE716071C08000305C8 /* CreateNewWorld_iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */; };
|
||||
@@ -1147,32 +1148,6 @@
|
||||
D5F3B7DE14548E7900D25470 /* IASKSpecifierValuesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C914548E7900D25470 /* IASKSpecifierValuesView.xib */; };
|
||||
D5F3B7E51454930400D25470 /* InAppSettings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7E41454930400D25470 /* InAppSettings.bundle */; };
|
||||
F912B8CF2F6C3D5200BC60DF /* TextBox.h in Sources */ = {isa = PBXBuildFile; fileRef = 042A91AC16B17517007ABBC6 /* TextBox.h */; };
|
||||
F99D341F2F736AA100DC153E /* HttpClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D341E2F736AA100DC153E /* HttpClient.cpp */; };
|
||||
F99D34202F736AA100DC153E /* HttpClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D341E2F736AA100DC153E /* HttpClient.cpp */; };
|
||||
F99D34232F736AD400DC153E /* TextOption.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34222F736AD400DC153E /* TextOption.cpp */; };
|
||||
F99D34242F736AD400DC153E /* TextOption.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34222F736AD400DC153E /* TextOption.cpp */; };
|
||||
F99D34272F736AFB00DC153E /* OptionsFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34262F736AFB00DC153E /* OptionsFile.cpp */; };
|
||||
F99D34282F736AFB00DC153E /* OptionsFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34262F736AFB00DC153E /* OptionsFile.cpp */; };
|
||||
F99D342B2F736B6F00DC153E /* OptionsItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D342A2F736B6F00DC153E /* OptionsItem.cpp */; };
|
||||
F99D342C2F736B6F00DC153E /* OptionsItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D342A2F736B6F00DC153E /* OptionsItem.cpp */; };
|
||||
F99D342F2F736BAD00DC153E /* ConsoleScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D342E2F736BAD00DC153E /* ConsoleScreen.cpp */; };
|
||||
F99D34302F736BAD00DC153E /* ConsoleScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D342E2F736BAD00DC153E /* ConsoleScreen.cpp */; };
|
||||
F99D34332F736BDA00DC153E /* CreditsScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34322F736BDA00DC153E /* CreditsScreen.cpp */; };
|
||||
F99D34342F736BDA00DC153E /* CreditsScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34322F736BDA00DC153E /* CreditsScreen.cpp */; };
|
||||
F99D34372F736C1000DC153E /* JoinByIPScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34362F736C1000DC153E /* JoinByIPScreen.cpp */; };
|
||||
F99D34382F736C1000DC153E /* JoinByIPScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34362F736C1000DC153E /* JoinByIPScreen.cpp */; };
|
||||
F99D343B2F736C3B00DC153E /* UsernameScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D343A2F736C3B00DC153E /* UsernameScreen.cpp */; };
|
||||
F99D343C2F736C3B00DC153E /* UsernameScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D343A2F736C3B00DC153E /* UsernameScreen.cpp */; };
|
||||
F99D343F2F736C8400DC153E /* GuiElementContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D343E2F736C8400DC153E /* GuiElementContainer.cpp */; };
|
||||
F99D34402F736C8400DC153E /* GuiElementContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D343E2F736C8400DC153E /* GuiElementContainer.cpp */; };
|
||||
F99D34432F736F9400DC153E /* Option.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34422F736F9400DC153E /* Option.cpp */; };
|
||||
F99D34442F736F9400DC153E /* Option.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34422F736F9400DC153E /* Option.cpp */; };
|
||||
F99D34472F736FE800DC153E /* KeyOption.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34462F736FE800DC153E /* KeyOption.cpp */; };
|
||||
F99D34482F736FE800DC153E /* KeyOption.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34462F736FE800DC153E /* KeyOption.cpp */; };
|
||||
F99D344B2F7370CF00DC153E /* Slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D344A2F7370CF00DC153E /* Slider.cpp */; };
|
||||
F99D344C2F7370CF00DC153E /* Slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D344A2F7370CF00DC153E /* Slider.cpp */; };
|
||||
F99D344E2F7372A100DC153E /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F99D344D2F7372A100DC153E /* Launch Screen.storyboard */; };
|
||||
F99D344F2F7372A100DC153E /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F99D344D2F7372A100DC153E /* Launch Screen.storyboard */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
@@ -1234,6 +1209,8 @@
|
||||
042A91A616B17517007ABBC6 /* NinePatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NinePatch.h; sourceTree = "<group>"; };
|
||||
042A91A716B17517007ABBC6 /* OptionsGroup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OptionsGroup.cpp; sourceTree = "<group>"; };
|
||||
042A91A816B17517007ABBC6 /* OptionsGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OptionsGroup.h; sourceTree = "<group>"; };
|
||||
042A91A916B17517007ABBC6 /* OptionsPane.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OptionsPane.cpp; sourceTree = "<group>"; };
|
||||
042A91AA16B17517007ABBC6 /* OptionsPane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OptionsPane.h; sourceTree = "<group>"; };
|
||||
042A91AB16B17517007ABBC6 /* TextBox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextBox.cpp; sourceTree = "<group>"; };
|
||||
042A91AC16B17517007ABBC6 /* TextBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TextBox.h; path = ../../src/client/gui/components/TextBox.h; sourceTree = SOURCE_ROOT; };
|
||||
044129061682FF9600B70EE6 /* MouseHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseHandler.cpp; sourceTree = "<group>"; };
|
||||
@@ -2041,7 +2018,7 @@
|
||||
D5B50D6914CFF66F005F7284 /* Multitouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Multitouch.h; sourceTree = "<group>"; };
|
||||
D5B50D6A14CFF66F005F7284 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
|
||||
D5B50D6B14CFF66F005F7284 /* time.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = time.cpp; sourceTree = "<group>"; };
|
||||
D5B50D6C14CFF66F005F7284 /* time.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 4; path = time.h; sourceTree = "<group>"; };
|
||||
D5B50D6C14CFF66F005F7284 /* time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time.h; sourceTree = "<group>"; };
|
||||
D5B50E5614CFF66F005F7284 /* SharedConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedConstants.h; sourceTree = "<group>"; };
|
||||
D5B50E5714CFF66F005F7284 /* terrain_4444.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = terrain_4444.h; sourceTree = "<group>"; };
|
||||
D5B50E5814CFF66F005F7284 /* terrain_5551.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = terrain_5551.h; sourceTree = "<group>"; };
|
||||
@@ -2432,31 +2409,6 @@
|
||||
D5F3B7C814548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSToggleSwitchSpecifierViewCell.xib; sourceTree = "<group>"; };
|
||||
D5F3B7C914548E7900D25470 /* IASKSpecifierValuesView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKSpecifierValuesView.xib; sourceTree = "<group>"; };
|
||||
D5F3B7E41454930400D25470 /* InAppSettings.bundle */ = {isa = PBXFileReference; explicitFileType = "wrapper.installer-pkg"; path = InAppSettings.bundle; sourceTree = "<group>"; };
|
||||
F99D341D2F736AA100DC153E /* HttpClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HttpClient.h; path = ../../src/platform/HttpClient.h; sourceTree = "<group>"; };
|
||||
F99D341E2F736AA100DC153E /* HttpClient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HttpClient.cpp; path = ../../src/platform/HttpClient.cpp; sourceTree = "<group>"; };
|
||||
F99D34212F736AD400DC153E /* TextOption.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TextOption.h; path = ../../src/client/gui/components/TextOption.h; sourceTree = "<group>"; };
|
||||
F99D34222F736AD400DC153E /* TextOption.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TextOption.cpp; path = ../../src/client/gui/components/TextOption.cpp; };
|
||||
F99D34252F736AFB00DC153E /* OptionsFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionsFile.h; path = ../../src/client/OptionsFile.h; sourceTree = "<group>"; sourceTree = "<group>"; };
|
||||
F99D34262F736AFB00DC153E /* OptionsFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OptionsFile.cpp; path = ../../src/client/OptionsFile.cpp; sourceTree = "<group>"; };
|
||||
F99D34292F736B6F00DC153E /* OptionsItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionsItem.h; path = ../../src/client/gui/components/OptionsItem.h; sourceTree = "<group>"; };
|
||||
F99D342A2F736B6F00DC153E /* OptionsItem.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OptionsItem.cpp; path = ../../src/client/gui/components/OptionsItem.cpp; sourceTree = "<group>"; };
|
||||
F99D342D2F736BAD00DC153E /* ConsoleScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ConsoleScreen.h; path = ../../src/client/gui/screens/ConsoleScreen.h; sourceTree = "<group>"; };
|
||||
F99D342E2F736BAD00DC153E /* ConsoleScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ConsoleScreen.cpp; path = ../../src/client/gui/screens/ConsoleScreen.cpp; sourceTree = "<group>"; };
|
||||
F99D34312F736BDA00DC153E /* CreditsScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CreditsScreen.h; path = ../../src/client/gui/screens/CreditsScreen.h; sourceTree = "<group>"; };
|
||||
F99D34322F736BDA00DC153E /* CreditsScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CreditsScreen.cpp; path = ../../src/client/gui/screens/CreditsScreen.cpp; sourceTree = "<group>"; };
|
||||
F99D34352F736C1000DC153E /* JoinByIPScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JoinByIPScreen.h; path = ../../src/client/gui/screens/JoinByIPScreen.h; sourceTree = "<group>"; };
|
||||
F99D34362F736C1000DC153E /* JoinByIPScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JoinByIPScreen.cpp; path = ../../src/client/gui/screens/JoinByIPScreen.cpp; sourceTree = "<group>"; };
|
||||
F99D34392F736C3B00DC153E /* UsernameScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = UsernameScreen.h; path = ../../src/client/gui/screens/UsernameScreen.h; sourceTree = "<group>"; };
|
||||
F99D343A2F736C3B00DC153E /* UsernameScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UsernameScreen.cpp; path = ../../src/client/gui/screens/UsernameScreen.cpp; sourceTree = "<group>"; };
|
||||
F99D343D2F736C8400DC153E /* GuiElementContainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GuiElementContainer.h; path = ../../src/client/gui/components/GuiElementContainer.h; sourceTree = "<group>"; };
|
||||
F99D343E2F736C8400DC153E /* GuiElementContainer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GuiElementContainer.cpp; path = ../../src/client/gui/components/GuiElementContainer.cpp; sourceTree = "<group>"; };
|
||||
F99D34412F736F9400DC153E /* Option.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Option.h; path = ../../src/client/Option.h; sourceTree = "<group>"; };
|
||||
F99D34422F736F9400DC153E /* Option.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Option.cpp; path = ../../src/client/Option.cpp; sourceTree = "<group>"; };
|
||||
F99D34452F736FE800DC153E /* KeyOption.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = KeyOption.h; path = ../../src/client/gui/components/KeyOption.h; sourceTree = "<group>"; };
|
||||
F99D34462F736FE800DC153E /* KeyOption.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = KeyOption.cpp; path = ../../src/client/gui/components/KeyOption.cpp; sourceTree = "<group>"; };
|
||||
F99D34492F7370CF00DC153E /* Slider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Slider.h; path = ../../src/client/gui/components/Slider.h; sourceTree = "<group>"; };
|
||||
F99D344A2F7370CF00DC153E /* Slider.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Slider.cpp; path = ../../src/client/gui/components/Slider.cpp; sourceTree = "<group>"; };
|
||||
F99D344D2F7372A100DC153E /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -3275,6 +3227,8 @@
|
||||
042A91A616B17517007ABBC6 /* NinePatch.h */,
|
||||
042A91A716B17517007ABBC6 /* OptionsGroup.cpp */,
|
||||
042A91A816B17517007ABBC6 /* OptionsGroup.h */,
|
||||
042A91A916B17517007ABBC6 /* OptionsPane.cpp */,
|
||||
042A91AA16B17517007ABBC6 /* OptionsPane.h */,
|
||||
042A91AB16B17517007ABBC6 /* TextBox.cpp */,
|
||||
042A91AC16B17517007ABBC6 /* TextBox.h */,
|
||||
D5B50C2814CFF66F005F7284 /* Button.cpp */,
|
||||
@@ -4303,7 +4257,6 @@
|
||||
D5CF9C37144C225000E4244F = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F99D344D2F7372A100DC153E /* Launch Screen.storyboard */,
|
||||
D5E1BA9A1451C8A0007DCC4F /* Default@2x.png */,
|
||||
9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */,
|
||||
D5F07744145EF79B00EC30FB /* Default-Landscape~ipad.png */,
|
||||
@@ -4315,30 +4268,6 @@
|
||||
D5CF9C45144C225000E4244F /* Frameworks */,
|
||||
D5CF9C43144C225000E4244F /* Products */,
|
||||
D5B50C1614CFF66F005F7284 /* src */,
|
||||
F99D341D2F736AA100DC153E /* HttpClient.h */,
|
||||
F99D341E2F736AA100DC153E /* HttpClient.cpp */,
|
||||
F99D34212F736AD400DC153E /* TextOption.h */,
|
||||
F99D34222F736AD400DC153E /* TextOption.cpp */,
|
||||
F99D34252F736AFB00DC153E /* OptionsFile.h */,
|
||||
F99D34262F736AFB00DC153E /* OptionsFile.cpp */,
|
||||
F99D34292F736B6F00DC153E /* OptionsItem.h */,
|
||||
F99D342A2F736B6F00DC153E /* OptionsItem.cpp */,
|
||||
F99D342D2F736BAD00DC153E /* ConsoleScreen.h */,
|
||||
F99D342E2F736BAD00DC153E /* ConsoleScreen.cpp */,
|
||||
F99D34312F736BDA00DC153E /* CreditsScreen.h */,
|
||||
F99D34322F736BDA00DC153E /* CreditsScreen.cpp */,
|
||||
F99D34352F736C1000DC153E /* JoinByIPScreen.h */,
|
||||
F99D34362F736C1000DC153E /* JoinByIPScreen.cpp */,
|
||||
F99D34392F736C3B00DC153E /* UsernameScreen.h */,
|
||||
F99D343A2F736C3B00DC153E /* UsernameScreen.cpp */,
|
||||
F99D343D2F736C8400DC153E /* GuiElementContainer.h */,
|
||||
F99D343E2F736C8400DC153E /* GuiElementContainer.cpp */,
|
||||
F99D34412F736F9400DC153E /* Option.h */,
|
||||
F99D34422F736F9400DC153E /* Option.cpp */,
|
||||
F99D34452F736FE800DC153E /* KeyOption.h */,
|
||||
F99D34462F736FE800DC153E /* KeyOption.cpp */,
|
||||
F99D34492F7370CF00DC153E /* Slider.h */,
|
||||
F99D344A2F7370CF00DC153E /* Slider.cpp */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -4677,7 +4606,6 @@
|
||||
D5B50A5614CFF492005F7284 /* pig.png in Resources */,
|
||||
D5B50A5814CFF492005F7284 /* sheep_fur.png in Resources */,
|
||||
D5B50A5A14CFF492005F7284 /* sheep.png in Resources */,
|
||||
F99D344F2F7372A100DC153E /* Launch Screen.storyboard in Resources */,
|
||||
D5B50A5C14CFF492005F7284 /* skeleton.png in Resources */,
|
||||
D5B50A5E14CFF492005F7284 /* spider.png in Resources */,
|
||||
D5B50A6014CFF492005F7284 /* zombie.png in Resources */,
|
||||
@@ -5014,7 +4942,6 @@
|
||||
D5ACF26F15C03DBF00E21C22 /* sand2.m4a in Resources */,
|
||||
D5ACF27115C03DBF00E21C22 /* sand3.m4a in Resources */,
|
||||
D5ACF27315C03DBF00E21C22 /* sand4.m4a in Resources */,
|
||||
F99D344E2F7372A100DC153E /* Launch Screen.storyboard in Resources */,
|
||||
D5ACF27515C03DBF00E21C22 /* snow1.m4a in Resources */,
|
||||
D5ACF27715C03DBF00E21C22 /* snow2.m4a in Resources */,
|
||||
D5ACF27915C03DBF00E21C22 /* snow3.m4a in Resources */,
|
||||
@@ -5091,22 +5018,18 @@
|
||||
D58BB544146A0B910002C9F5 /* IASKSettingsStore.m in Sources */,
|
||||
D58BB545146A0B910002C9F5 /* IASKSettingsStoreFile.m in Sources */,
|
||||
D58BB546146A0B910002C9F5 /* IASKSettingsStoreUserDefaults.m in Sources */,
|
||||
F99D34232F736AD400DC153E /* TextOption.cpp in Sources */,
|
||||
D58BB547146A0B910002C9F5 /* IASKSpecifier.m in Sources */,
|
||||
D58BB548146A0B910002C9F5 /* IASKPSSliderSpecifierViewCell.m in Sources */,
|
||||
D58BB549146A0B910002C9F5 /* IASKPSTextFieldSpecifierViewCell.m in Sources */,
|
||||
D58BB54A146A0B910002C9F5 /* IASKPSTitleValueSpecifierViewCell.m in Sources */,
|
||||
D58BB54B146A0B910002C9F5 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */,
|
||||
F99D343B2F736C3B00DC153E /* UsernameScreen.cpp in Sources */,
|
||||
D58BB54C146A0B910002C9F5 /* IASKSlider.m in Sources */,
|
||||
D58BB54D146A0B910002C9F5 /* IASKSwitch.m in Sources */,
|
||||
F99D34302F736BAD00DC153E /* ConsoleScreen.cpp in Sources */,
|
||||
D58BB54E146A0B910002C9F5 /* IASKTextField.m in Sources */,
|
||||
D58BB550146A0B910002C9F5 /* PVRTexture.m in Sources */,
|
||||
D5D43CC9146AF4B4002ED842 /* RenameMPWorldViewController.mm in Sources */,
|
||||
D5B50F7014CFF670005F7284 /* AppPlatform_iOS.mm in Sources */,
|
||||
D5B50F7414CFF670005F7284 /* CreativeMode.cpp in Sources */,
|
||||
F99D34432F736F9400DC153E /* Option.cpp in Sources */,
|
||||
D5B50F7614CFF670005F7284 /* GameMode.cpp in Sources */,
|
||||
D5B50F7814CFF670005F7284 /* Button.cpp in Sources */,
|
||||
D5B50F7A14CFF670005F7284 /* ImageButton.cpp in Sources */,
|
||||
@@ -5151,7 +5074,6 @@
|
||||
D5B50FC814CFF670005F7284 /* KeyboardInput.cpp in Sources */,
|
||||
D5B50FCA14CFF670005F7284 /* TouchscreenInput.cpp in Sources */,
|
||||
D5B50FCC14CFF670005F7284 /* LocalPlayer.cpp in Sources */,
|
||||
F99D34482F736FE800DC153E /* KeyOption.cpp in Sources */,
|
||||
D5B50FCE14CFF670005F7284 /* Chunk.cpp in Sources */,
|
||||
D5B50FD014CFF670005F7284 /* Frustum.cpp in Sources */,
|
||||
D5B50FD214CFF670005F7284 /* ChickenRenderer.cpp in Sources */,
|
||||
@@ -5210,7 +5132,6 @@
|
||||
D5B5113014CFF670005F7284 /* TripodCamera.cpp in Sources */,
|
||||
D5B5113214CFF670005F7284 /* Mob.cpp in Sources */,
|
||||
D5B5113414CFF670005F7284 /* MobCategory.cpp in Sources */,
|
||||
F99D34282F736AFB00DC153E /* OptionsFile.cpp in Sources */,
|
||||
D5B5113814CFF670005F7284 /* PathFinderMob.cpp in Sources */,
|
||||
D5B5113A14CFF670005F7284 /* Inventory.cpp in Sources */,
|
||||
D5B5113C14CFF670005F7284 /* Player.cpp in Sources */,
|
||||
@@ -5222,7 +5143,6 @@
|
||||
D5B5114814CFF670005F7284 /* Item.cpp in Sources */,
|
||||
D5B5114A14CFF670005F7284 /* ItemInstance.cpp in Sources */,
|
||||
D5B5114C14CFF670005F7284 /* PickaxeItem.cpp in Sources */,
|
||||
F99D344B2F7370CF00DC153E /* Slider.cpp in Sources */,
|
||||
D5B5114E14CFF670005F7284 /* ShovelItem.cpp in Sources */,
|
||||
D5B5115014CFF670005F7284 /* Biome.cpp in Sources */,
|
||||
D5B5115214CFF670005F7284 /* BiomeSource.cpp in Sources */,
|
||||
@@ -5273,7 +5193,6 @@
|
||||
D5251DBA1538192700FC82C8 /* CloudServer.cpp in Sources */,
|
||||
D5251DBE1538192700FC82C8 /* CommandParserInterface.cpp in Sources */,
|
||||
D5251DC01538192700FC82C8 /* ConnectionGraph2.cpp in Sources */,
|
||||
F99D34402F736C8400DC153E /* GuiElementContainer.cpp in Sources */,
|
||||
D5251DC21538192700FC82C8 /* ConsoleServer.cpp in Sources */,
|
||||
D5251DC41538192700FC82C8 /* DataCompressor.cpp in Sources */,
|
||||
D5251DC61538192700FC82C8 /* DirectoryDeltaTransfer.cpp in Sources */,
|
||||
@@ -5298,8 +5217,6 @@
|
||||
D5251DEC1538192700FC82C8 /* HTTPConnection.cpp in Sources */,
|
||||
D5251DEE1538192700FC82C8 /* IncrementalReadInterface.cpp in Sources */,
|
||||
D5251DF01538192700FC82C8 /* Itoa.cpp in Sources */,
|
||||
F99D34202F736AA100DC153E /* HttpClient.cpp in Sources */,
|
||||
F99D34382F736C1000DC153E /* JoinByIPScreen.cpp in Sources */,
|
||||
D5251DF21538192700FC82C8 /* LinuxStrings.cpp in Sources */,
|
||||
D5251DF41538192700FC82C8 /* LocklessTypes.cpp in Sources */,
|
||||
D5251DF61538192700FC82C8 /* LogCommandParser.cpp in Sources */,
|
||||
@@ -5328,7 +5245,6 @@
|
||||
D5251E2A1538192700FC82C8 /* RakSleep.cpp in Sources */,
|
||||
D5251E2C1538192700FC82C8 /* RakString.cpp in Sources */,
|
||||
D5251E2E1538192700FC82C8 /* RakThread.cpp in Sources */,
|
||||
F99D34332F736BDA00DC153E /* CreditsScreen.cpp in Sources */,
|
||||
D5251E301538192700FC82C8 /* RakWString.cpp in Sources */,
|
||||
D5251E321538192700FC82C8 /* Rand.cpp in Sources */,
|
||||
D5251E341538192700FC82C8 /* rdlmalloc.cpp in Sources */,
|
||||
@@ -5371,7 +5287,6 @@
|
||||
D5951EEB159349100043A12A /* TileEntity.cpp in Sources */,
|
||||
D5951EEF159349680043A12A /* FurnaceScreen.cpp in Sources */,
|
||||
D5951EF215934A2D0043A12A /* Feature.cpp in Sources */,
|
||||
F99D342C2F736B6F00DC153E /* OptionsItem.cpp in Sources */,
|
||||
D5951EF815934AC50043A12A /* BaseContainerMenu.cpp in Sources */,
|
||||
D5951EFA15934AC50043A12A /* FurnaceMenu.cpp in Sources */,
|
||||
D5D381F315A1A1CF00B6C50E /* FillingContainer.cpp in Sources */,
|
||||
@@ -5434,7 +5349,6 @@
|
||||
F912B8CF2F6C3D5200BC60DF /* TextBox.h in Sources */,
|
||||
D5CF9C57144C225000E4244F /* main.mm in Sources */,
|
||||
D5CF9C5B144C225000E4244F /* minecraftpeAppDelegate.mm in Sources */,
|
||||
F99D343C2F736C3B00DC153E /* UsernameScreen.cpp in Sources */,
|
||||
D5CF9C65144C225000E4244F /* EAGLView.m in Sources */,
|
||||
D5CFA01D144C453900E4244F /* minecraftpeViewController.mm in Sources */,
|
||||
D5A55E4914500EDE00A7571B /* CreateNewWorldViewController.mm in Sources */,
|
||||
@@ -5448,7 +5362,6 @@
|
||||
D5F3B7D014548E7900D25470 /* IASKSettingsStoreUserDefaults.m in Sources */,
|
||||
D5F3B7D114548E7900D25470 /* IASKSpecifier.m in Sources */,
|
||||
D5F3B7D214548E7900D25470 /* IASKPSSliderSpecifierViewCell.m in Sources */,
|
||||
F99D34472F736FE800DC153E /* KeyOption.cpp in Sources */,
|
||||
D5F3B7D314548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.m in Sources */,
|
||||
D5F3B7D414548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.m in Sources */,
|
||||
D5F3B7D514548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */,
|
||||
@@ -5560,13 +5473,11 @@
|
||||
D5B5112D14CFF670005F7284 /* PrimedTnt.cpp in Sources */,
|
||||
D5B5112F14CFF670005F7284 /* TripodCamera.cpp in Sources */,
|
||||
D5B5113114CFF670005F7284 /* Mob.cpp in Sources */,
|
||||
F99D34442F736F9400DC153E /* Option.cpp in Sources */,
|
||||
D5B5113314CFF670005F7284 /* MobCategory.cpp in Sources */,
|
||||
D5B5113714CFF670005F7284 /* PathFinderMob.cpp in Sources */,
|
||||
D5B5113914CFF670005F7284 /* Inventory.cpp in Sources */,
|
||||
D5B5113B14CFF670005F7284 /* Player.cpp in Sources */,
|
||||
D5B5113D14CFF670005F7284 /* Arrow.cpp in Sources */,
|
||||
F99D343F2F736C8400DC153E /* GuiElementContainer.cpp in Sources */,
|
||||
D5B5113F14CFF670005F7284 /* Recipes.cpp in Sources */,
|
||||
D5B5114114CFF670005F7284 /* ToolRecipes.cpp in Sources */,
|
||||
D5B5114314CFF670005F7284 /* WeaponRecipes.cpp in Sources */,
|
||||
@@ -5604,12 +5515,10 @@
|
||||
D5B5118514CFF670005F7284 /* HitResult.cpp in Sources */,
|
||||
D5B5118B14D03342005F7284 /* SynchedEntityData.cpp in Sources */,
|
||||
D5B5118E14DEA27F005F7284 /* DeathScreen.cpp in Sources */,
|
||||
F99D34242F736AD400DC153E /* TextOption.cpp in Sources */,
|
||||
D5B5119114DEA2B7005F7284 /* LevelData.cpp in Sources */,
|
||||
D5B5119414DEA2EF005F7284 /* DyePowderItem.cpp in Sources */,
|
||||
D584926D14FD234400741128 /* SharedConstants.cpp in Sources */,
|
||||
D584927314FD236700741128 /* MoveControl.cpp in Sources */,
|
||||
F99D344C2F7370CF00DC153E /* Slider.cpp in Sources */,
|
||||
D584928614FD240D00741128 /* IConfigListener.cpp in Sources */,
|
||||
D584928914FD2FAF00741128 /* Path.cpp in Sources */,
|
||||
D5B86281153810BD00F3238A /* I18n.cpp in Sources */,
|
||||
@@ -5661,7 +5570,6 @@
|
||||
D5251E011538192700FC82C8 /* NatTypeDetectionServer.cpp in Sources */,
|
||||
D5251E031538192700FC82C8 /* NetworkIDManager.cpp in Sources */,
|
||||
D5251E051538192700FC82C8 /* NetworkIDObject.cpp in Sources */,
|
||||
F99D34372F736C1000DC153E /* JoinByIPScreen.cpp in Sources */,
|
||||
D5251E071538192700FC82C8 /* PacketConsoleLogger.cpp in Sources */,
|
||||
D5251E091538192700FC82C8 /* PacketFileLogger.cpp in Sources */,
|
||||
D5251E0B1538192700FC82C8 /* PacketizedTCP.cpp in Sources */,
|
||||
@@ -5691,13 +5599,11 @@
|
||||
D5251E411538192700FC82C8 /* SendToThread.cpp in Sources */,
|
||||
D5251E431538192700FC82C8 /* SHA1.cpp in Sources */,
|
||||
D5251E451538192700FC82C8 /* SignaledEvent.cpp in Sources */,
|
||||
F99D34342F736BDA00DC153E /* CreditsScreen.cpp in Sources */,
|
||||
D5251E471538192700FC82C8 /* SimpleMutex.cpp in Sources */,
|
||||
D5251E491538192700FC82C8 /* SocketLayer.cpp in Sources */,
|
||||
D5251E4B1538192700FC82C8 /* StringCompressor.cpp in Sources */,
|
||||
D5251E4D1538192700FC82C8 /* StringTable.cpp in Sources */,
|
||||
D5251E4F1538192700FC82C8 /* SuperFastHash.cpp in Sources */,
|
||||
F99D342B2F736B6F00DC153E /* OptionsItem.cpp in Sources */,
|
||||
D5251E511538192700FC82C8 /* TableSerializer.cpp in Sources */,
|
||||
D5251E531538192700FC82C8 /* TCPInterface.cpp in Sources */,
|
||||
D5251E551538192700FC82C8 /* TeamBalancer.cpp in Sources */,
|
||||
@@ -5720,7 +5626,6 @@
|
||||
D5951EDD159348C50043A12A /* ItemPane.cpp in Sources */,
|
||||
D5951EE3159349000043A12A /* FurnaceTile.cpp in Sources */,
|
||||
D5951EE8159349100043A12A /* FurnaceTileEntity.cpp in Sources */,
|
||||
F99D342F2F736BAD00DC153E /* ConsoleScreen.cpp in Sources */,
|
||||
D5951EEA159349100043A12A /* TileEntity.cpp in Sources */,
|
||||
D5951EEE159349680043A12A /* FurnaceScreen.cpp in Sources */,
|
||||
D5951EF115934A2D0043A12A /* Feature.cpp in Sources */,
|
||||
@@ -5757,7 +5662,6 @@
|
||||
D544941E15D13F45005FA9B0 /* PlayerRenderer.cpp in Sources */,
|
||||
D544942215D13F5E005FA9B0 /* RemotePlayer.cpp in Sources */,
|
||||
D5B17ED515E226F50056E751 /* Throwable.cpp in Sources */,
|
||||
F99D341F2F736AA100DC153E /* HttpClient.cpp in Sources */,
|
||||
D5B17ED915E2273F0056E751 /* SurvivalMode.cpp in Sources */,
|
||||
D5B17EDD15E227670056E751 /* TrapDoorTile.cpp in Sources */,
|
||||
D5B17EE115E260910056E751 /* MoveFolder.mm in Sources */,
|
||||
@@ -5793,7 +5697,6 @@
|
||||
0400453A16A4125C003EB6FA /* FallingTileRenderer.cpp in Sources */,
|
||||
0413970716A82E1E008A9F1A /* ArmorItem.cpp in Sources */,
|
||||
0413970D16A82E6B008A9F1A /* CraftingFilters.cpp in Sources */,
|
||||
F99D34272F736AFB00DC153E /* OptionsFile.cpp in Sources */,
|
||||
0413970E16A82E6B008A9F1A /* StonecutterScreen.cpp in Sources */,
|
||||
0413971116A82E7B008A9F1A /* ArmorScreen.cpp in Sources */,
|
||||
0413971516A82EB9008A9F1A /* ArmorRecipes.cpp in Sources */,
|
||||
@@ -5802,6 +5705,7 @@
|
||||
042A91AE16B17517007ABBC6 /* GuiElement.cpp in Sources */,
|
||||
042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */,
|
||||
042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */,
|
||||
042A91B116B17517007ABBC6 /* OptionsPane.cpp in Sources */,
|
||||
042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -5839,7 +5743,7 @@
|
||||
D50BE20815EE05B8008AA75E /* Ad-Hoc */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = YES;
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_STANDARD)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
@@ -5852,7 +5756,11 @@
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/src/**",
|
||||
"$(SRCROOT)/src/client/gui/components/**",
|
||||
"$(SRCROOT)/src/client/gui/**",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
|
||||
@@ -5860,8 +5768,7 @@
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
USE_HEADERMAP = NO;
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)\\src/**";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = "Ad-Hoc";
|
||||
@@ -5876,11 +5783,9 @@
|
||||
GCC_VERSION = "";
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/../../src",
|
||||
"$(SRCROOT)/../../src/client/gui/components",
|
||||
"$(SRCROOT)/../../src/world",
|
||||
"$(SRCROOT)/../../src/platform/input",
|
||||
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
|
||||
"$(SRCROOT)/src/client/gui/components/**",
|
||||
"$(SRCROOT)/src/client/gui/**",
|
||||
"$(SRCROOT)/src/**",
|
||||
);
|
||||
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
|
||||
@@ -5890,9 +5795,6 @@
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SYSTEM_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../lib_projects/InAppSettingsKit/Models $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USE_HEADERMAP = NO;
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = "Ad-Hoc";
|
||||
@@ -5965,7 +5867,7 @@
|
||||
D5A20ADB146AAD9C00A52FEC /* AppStore */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = YES;
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_STANDARD)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
@@ -5977,7 +5879,11 @@
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/src/**",
|
||||
"$(SRCROOT)/src/client/gui/components/**",
|
||||
"$(SRCROOT)/src/client/gui/**",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
|
||||
@@ -5985,8 +5891,7 @@
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
USE_HEADERMAP = NO;
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)\\src/**";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = AppStore;
|
||||
@@ -6002,11 +5907,9 @@
|
||||
GCC_VERSION = "";
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/../../src",
|
||||
"$(SRCROOT)/../../src/client/gui/components",
|
||||
"$(SRCROOT)/../../src/world",
|
||||
"$(SRCROOT)/../../src/platform/input",
|
||||
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
|
||||
"$(SRCROOT)/src/client/gui/components/**",
|
||||
"$(SRCROOT)/src/client/gui/**",
|
||||
"$(SRCROOT)/src/**",
|
||||
);
|
||||
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
|
||||
@@ -6020,9 +5923,6 @@
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "1B194957-98CF-49B7-A0E7-76692B4B722D";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SYSTEM_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../lib_projects/InAppSettingsKit/Models $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USE_HEADERMAP = NO;
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = AppStore;
|
||||
@@ -6055,7 +5955,7 @@
|
||||
D5CF9C6C144C225000E4244F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = YES;
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_STANDARD)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
@@ -6075,14 +5975,17 @@
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/src/**",
|
||||
"$(SRCROOT)/src/client/gui/components/**",
|
||||
"$(SRCROOT)/src/client/gui/**",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
USE_HEADERMAP = NO;
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)\\src/**";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Debug;
|
||||
@@ -6090,7 +5993,7 @@
|
||||
D5CF9C6D144C225000E4244F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = YES;
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_STANDARD)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
@@ -6103,15 +6006,18 @@
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/src/**",
|
||||
"$(SRCROOT)/src/client/gui/components/**",
|
||||
"$(SRCROOT)/src/client/gui/**",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
USE_HEADERMAP = NO;
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)\\src/**";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
@@ -6129,11 +6035,9 @@
|
||||
GCC_VERSION = "";
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/../../src",
|
||||
"$(SRCROOT)/../../src/client/gui/components",
|
||||
"$(SRCROOT)/../../src/world",
|
||||
"$(SRCROOT)/../../src/platform/input",
|
||||
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
|
||||
"$(SRCROOT)/src/client/gui/components/**",
|
||||
"$(SRCROOT)/src/client/gui/**",
|
||||
"$(SRCROOT)/src/**",
|
||||
);
|
||||
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
|
||||
@@ -6144,9 +6048,6 @@
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SYSTEM_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../lib_projects/InAppSettingsKit/Models $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USE_HEADERMAP = NO;
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Debug;
|
||||
@@ -6164,11 +6065,9 @@
|
||||
GCC_VERSION = "";
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/../../src",
|
||||
"$(SRCROOT)/../../src/client/gui/components",
|
||||
"$(SRCROOT)/../../src/world",
|
||||
"$(SRCROOT)/../../src/platform/input",
|
||||
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
|
||||
"$(SRCROOT)/src/client/gui/components/**",
|
||||
"$(SRCROOT)/src/client/gui/**",
|
||||
"$(SRCROOT)/src/**",
|
||||
);
|
||||
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
|
||||
@@ -6179,9 +6078,6 @@
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SYSTEM_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../lib_projects/InAppSettingsKit/Models $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USE_HEADERMAP = NO;
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Release;
|
||||
|
||||
@@ -58,8 +58,6 @@
|
||||
<array>
|
||||
<string>minecraft.ttf</string>
|
||||
</array>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>Launch Screen</string>
|
||||
<key>UIPrerenderedIcon</key>
|
||||
<true/>
|
||||
<key>UIRequiresPersistentWiFi</key>
|
||||
|
||||
@@ -4,11 +4,10 @@ include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := RakNet
|
||||
|
||||
MY_PREFIX := $(LOCAL_PATH)/RaknetSources/
|
||||
MY_PREFIX := $(LOCAL_PATH)/RakNetSources/
|
||||
MY_SOURCES := $(wildcard $(MY_PREFIX)*.cpp)
|
||||
LOCAL_SRC_FILES += $(MY_SOURCES:$(MY_PREFIX)%=RaknetSources/%)
|
||||
LOCAL_SRC_FILES += $(MY_SOURCES:$(MY_PREFIX)%=RakNetSources/%)
|
||||
|
||||
LOCAL_CFLAGS := -Wno-psabi $(LOCAL_CFLAGS)
|
||||
LOCAL_CPPFLAGS += -frtti
|
||||
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#if defined(X360__)
|
||||
#elif defined (_WIN32)
|
||||
#include <winsock2.h>
|
||||
#include <WinSock2.h>
|
||||
#include <windows.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <Ws2tcpip.h>
|
||||
|
||||
// Must always include Winsock2.h before windows.h
|
||||
// or else:
|
||||
|
||||
@@ -74,8 +74,6 @@ public:
|
||||
virtual TextureData loadTextureFromMemory(const unsigned char* data, size_t size) { return TextureData(); }
|
||||
|
||||
virtual void playSound(const std::string& fn, float volume, float pitch) {}
|
||||
|
||||
virtual void hideCursor(bool hide) {}
|
||||
|
||||
virtual void showDialog(int dialogId) {}
|
||||
virtual void createUserInput() {}
|
||||
|
||||
@@ -202,8 +202,6 @@ public:
|
||||
LOGI("initConsts: screenWidth=%d, calling getScreenHeight\n", _screenWidth);
|
||||
_screenHeight = env->CallIntMethod(instance, fHeight);
|
||||
LOGI("initConsts: screenHeight=%d, done\n", _screenHeight);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void tick() {
|
||||
@@ -538,7 +536,7 @@ public:
|
||||
|
||||
static __inline bool isSquare(int n) {
|
||||
int L = n & 0xf;
|
||||
if (((1 << L) & 0x213) == 0) return false;
|
||||
if ((1 << L) & 0x213 == 0) return false;
|
||||
|
||||
int t = (int) sqrt((double) n) + 0.5;
|
||||
return t*t == n;
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
#include <shellapi.h>
|
||||
#endif
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
#include <emscripten/html5.h>
|
||||
#endif
|
||||
|
||||
static void png_funcReadFile(png_structp pngPtr, png_bytep data, png_size_t length) {
|
||||
((std::istream*)png_get_io_ptr(pngPtr))->read((char*)data, length);
|
||||
}
|
||||
@@ -35,7 +31,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
BinaryBlob readAssetFile(const std::string& filename) override {
|
||||
BinaryBlob readAssetFile(const std::string& filename) {
|
||||
FILE* fp = fopen(("data/" + filename).c_str(), "r");
|
||||
if (!fp)
|
||||
return BinaryBlob();
|
||||
@@ -52,7 +48,7 @@ public:
|
||||
return blob;
|
||||
}
|
||||
|
||||
void saveScreenshot(const std::string& filename, int glWidth, int glHeight) override {
|
||||
void saveScreenshot(const std::string& filename, int glWidth, int glHeight) {
|
||||
//@todo
|
||||
}
|
||||
|
||||
@@ -60,7 +56,7 @@ public:
|
||||
return (p & 0xff00ff00) | ((p >> 16) & 0xff) | ((p << 16) & 0xff0000);
|
||||
}
|
||||
|
||||
TextureData loadTexture(const std::string& filename_, bool textureFolder) override
|
||||
TextureData loadTexture(const std::string& filename_, bool textureFolder)
|
||||
{
|
||||
// Support fetching PNG textures via HTTP/HTTPS (for skins, etc)
|
||||
if (Util::startsWith(filename_, "http://") || Util::startsWith(filename_, "https://")) {
|
||||
@@ -77,20 +73,50 @@ public:
|
||||
: filename_;
|
||||
std::ifstream source(filename.c_str(), std::ios::binary);
|
||||
|
||||
if (!source) {
|
||||
if (source) {
|
||||
png_structp pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
||||
|
||||
if (!pngPtr)
|
||||
return out;
|
||||
|
||||
png_infop infoPtr = png_create_info_struct(pngPtr);
|
||||
|
||||
if (!infoPtr) {
|
||||
png_destroy_read_struct(&pngPtr, NULL, NULL);
|
||||
return out;
|
||||
}
|
||||
|
||||
// Hack to get around the broken libpng for windows
|
||||
png_set_read_fn(pngPtr,(void*)&source, png_funcReadFile);
|
||||
|
||||
png_read_info(pngPtr, infoPtr);
|
||||
|
||||
// Set up the texdata properties
|
||||
out.w = png_get_image_width(pngPtr, infoPtr);
|
||||
out.h = png_get_image_height(pngPtr, infoPtr);
|
||||
|
||||
png_bytep* rowPtrs = new png_bytep[out.h];
|
||||
out.data = new unsigned char[4 * out.w * out.h];
|
||||
out.memoryHandledExternally = false;
|
||||
|
||||
int rowStrideBytes = 4 * out.w;
|
||||
for (int i = 0; i < out.h; i++) {
|
||||
rowPtrs[i] = (png_bytep)&out.data[i*rowStrideBytes];
|
||||
}
|
||||
png_read_image(pngPtr, rowPtrs);
|
||||
|
||||
// Teardown and return
|
||||
png_destroy_read_struct(&pngPtr, &infoPtr,(png_infopp)0);
|
||||
delete[] (png_bytep)rowPtrs;
|
||||
source.close();
|
||||
|
||||
return out;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGI("Couldn't find file: %s\n", filename.c_str());
|
||||
return out;
|
||||
}
|
||||
|
||||
std::vector<unsigned char> fileData((std::istreambuf_iterator<char>(source)), std::istreambuf_iterator<char>());
|
||||
source.close();
|
||||
|
||||
if (fileData.empty()) {
|
||||
LOGI("Couldn't read file: %s\n", filename.c_str());
|
||||
return out;
|
||||
}
|
||||
|
||||
return loadTextureFromMemory(fileData.data(), fileData.size());
|
||||
}
|
||||
|
||||
TextureData loadTextureFromMemory(const unsigned char* data, size_t size) override {
|
||||
@@ -106,36 +132,12 @@ public:
|
||||
return std::string(mbstr);
|
||||
}
|
||||
|
||||
virtual int getScreenWidth() override {
|
||||
#ifdef __EMSCRIPTEN__
|
||||
int w, h;
|
||||
emscripten_get_canvas_element_size("canvas", &w, &h);
|
||||
virtual int getScreenWidth() { return 854; };
|
||||
virtual int getScreenHeight() { return 480; };
|
||||
|
||||
return w;
|
||||
#endif
|
||||
virtual float getPixelsPerMillimeter();
|
||||
|
||||
return 854;
|
||||
};
|
||||
|
||||
virtual int getScreenHeight() override {
|
||||
#ifdef __EMSCRIPTEN__
|
||||
int w, h;
|
||||
emscripten_get_canvas_element_size("canvas", &w, &h);
|
||||
|
||||
return h;
|
||||
#endif
|
||||
|
||||
return 480;
|
||||
};
|
||||
|
||||
virtual float getPixelsPerMillimeter() override;
|
||||
|
||||
virtual bool supportsTouchscreen() override { return false; /* glfw supports only mouse and keyboard */ }
|
||||
|
||||
virtual void hideCursor(bool hide) override {
|
||||
int isHide = hide ? GLFW_CURSOR_NORMAL : GLFW_CURSOR_HIDDEN;
|
||||
glfwSetInputMode(window, GLFW_CURSOR, isHide);
|
||||
}
|
||||
virtual bool supportsTouchscreen() override { return true; }
|
||||
|
||||
virtual void openURL(const std::string& url) override {
|
||||
#ifdef _WIN32
|
||||
@@ -143,13 +145,9 @@ public:
|
||||
#elif __linux__
|
||||
std::string command = "xdg-open " + url;
|
||||
system(command.c_str());
|
||||
#elif __EMSCRIPTEN__
|
||||
emscripten_run_script(std::string("window.open('" + url + "', '_blank')").c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
GLFWwindow* window;
|
||||
|
||||
private:
|
||||
};
|
||||
#endif /*APPPLATFORM_GLFW_H__*/
|
||||
|
||||
@@ -275,10 +275,8 @@ void AppPlatform_iOS::hideKeyboard() {
|
||||
[_viewController hideKeyboard];
|
||||
super::hideKeyboard();
|
||||
}
|
||||
|
||||
// this was originally void but i changed it to bool because void cant return values
|
||||
bool AppPlatform_iOS::isPowerVR() {
|
||||
void AppPlatform_iOS::isPowerVR() {
|
||||
const char* s = (const char*)glGetString(GL_RENDERER);
|
||||
if (!s) return false;
|
||||
return strstr(s, "SGX") != NULL;
|
||||
}
|
||||
}
|
||||
@@ -99,9 +99,6 @@ void NinecraftApp::init()
|
||||
I18n::loadLanguage(platform(), "en_US");
|
||||
#endif
|
||||
|
||||
if (!externalStoragePath.empty()) {
|
||||
options.setOptionsFilePath(externalStoragePath);
|
||||
}
|
||||
Minecraft::init();
|
||||
|
||||
#if !defined(DEMO_MODE) && !defined(APPLE_DEMO_PROMOTION) && !defined(NO_STORAGE)
|
||||
@@ -120,6 +117,7 @@ void NinecraftApp::init()
|
||||
setScreen(new UsernameScreen());
|
||||
}
|
||||
#else
|
||||
user->name = "Server";
|
||||
hostMultiplayer();
|
||||
#endif
|
||||
}
|
||||
@@ -248,9 +246,8 @@ void NinecraftApp::initGLStates()
|
||||
glCullFace(GL_BACK);
|
||||
|
||||
glEnable2(GL_TEXTURE_2D);
|
||||
#ifndef _EMSCRIPTEN_
|
||||
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
|
||||
#endif
|
||||
|
||||
// Both updates isPowerVR flag in java and returns if the graphics chip is PowerVR SGX or not
|
||||
_powerVr = platform()->isPowerVR();
|
||||
#ifdef __APPLE__
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#include "Minecraft.h"
|
||||
#include "Options.h"
|
||||
#include "client/Options.h"
|
||||
#include "client/player/input/IBuildInput.h"
|
||||
#include "platform/input/Keyboard.h"
|
||||
@@ -24,8 +23,6 @@
|
||||
#include "../world/level/storage/LevelStorageSource.h"
|
||||
#include "../world/level/storage/LevelStorage.h"
|
||||
#include "player/input/KeyboardInput.h"
|
||||
#include "player/input/ControllerTurnInput.h"
|
||||
#include "player/input/XperiaPlayInput.h"
|
||||
#include "world/level/chunk/ChunkSource.h"
|
||||
|
||||
#ifndef STANDALONE_SERVER
|
||||
@@ -90,7 +87,6 @@
|
||||
#include "../network/command/CommandServer.h"
|
||||
#include "gamemode/CreatorMode.h"
|
||||
|
||||
#include "../world/level/GrassColor.h"
|
||||
static void checkGlError(const char* tag) {
|
||||
#ifdef GLDEBUG
|
||||
while (1) {
|
||||
@@ -118,7 +114,8 @@ int Minecraft::customDebugId = Minecraft::CDI_NONE;
|
||||
|
||||
bool Minecraft::useAmbientOcclusion = false;
|
||||
|
||||
Minecraft::Minecraft() :
|
||||
Minecraft::Minecraft()
|
||||
: user(NULL),
|
||||
level(NULL),
|
||||
player(NULL),
|
||||
cameraTargetPlayer(NULL),
|
||||
@@ -223,6 +220,7 @@ Minecraft::~Minecraft()
|
||||
}
|
||||
|
||||
//delete player;
|
||||
delete user;
|
||||
delete inputHolder;
|
||||
|
||||
delete storageSource;
|
||||
@@ -642,11 +640,13 @@ void Minecraft::tickInput() {
|
||||
|
||||
const MouseAction& e = Mouse::getEvent();
|
||||
|
||||
if (!useTouchscreen() && !mouseGrabbed) {
|
||||
#ifdef RPI // If clicked when not having focus, get focus @keyboard
|
||||
if (!mouseGrabbed) {
|
||||
if (!screen && e.data == MouseAction::DATA_DOWN) {
|
||||
grabMouse();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) {
|
||||
gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY());
|
||||
@@ -660,7 +660,9 @@ void Minecraft::tickInput() {
|
||||
Inventory* v = player->inventory;
|
||||
|
||||
int numSlots = gui.getNumSlots();
|
||||
if (!useTouchscreen()) numSlots--;
|
||||
#ifndef PLATFORM_DESKTOP
|
||||
numSlots--;
|
||||
#endif
|
||||
|
||||
int slot = (v->selected - e.dy + numSlots) % numSlots;
|
||||
v->selectSlot(slot);
|
||||
@@ -689,147 +691,155 @@ void Minecraft::tickInput() {
|
||||
if (isPressed) {
|
||||
gui.handleKeyPressed(key);
|
||||
|
||||
if (key >= '0' && key <= '9') {
|
||||
int digit = key - '0';
|
||||
int slot = digit - 1;
|
||||
#if defined(WIN32) || defined(RPI) || defined (PLATFORM_DESKTOP)//|| defined(_DEBUG) || defined(DEBUG)
|
||||
if (key >= '0' && key <= '9') {
|
||||
int digit = key - '0';
|
||||
int slot = digit - 1;
|
||||
|
||||
if (slot >= 0 && slot < gui.getNumSlots())
|
||||
player->inventory->selectSlot(slot);
|
||||
if (slot >= 0 && slot < gui.getNumSlots())
|
||||
player->inventory->selectSlot(slot);
|
||||
|
||||
#if defined(WIN32)
|
||||
if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) {
|
||||
// Set adventure settings here!
|
||||
AdventureSettingsPacket p(level->adventureSettings);
|
||||
p.toggle((AdventureSettingsPacket::Flags)(1 << slot));
|
||||
p.fillIn(level->adventureSettings);
|
||||
raknetInstance->send(p);
|
||||
}
|
||||
if (digit == 0) {
|
||||
Pos pos((int)player->x, (int)player->y-1, (int)player->z);
|
||||
SetSpawnPositionPacket p(pos);
|
||||
raknetInstance->send(p);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_LEFT_CTRL) {
|
||||
player->setSprinting(true);
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_E) {
|
||||
screenChooser.setScreen(SCREEN_BLOCKSELECTION);
|
||||
}
|
||||
|
||||
if (!screen && key == Keyboard::KEY_T && level) {
|
||||
setScreen(new ConsoleScreen());
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_F3) {
|
||||
options.toggle(OPTIONS_RENDER_DEBUG);
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_F5) {
|
||||
options.toggle(OPTIONS_THIRD_PERSON_VIEW);
|
||||
/*
|
||||
ImprovedNoise noise;
|
||||
for (int i = 0; i < 16; ++i)
|
||||
printf("%d\t%f\n", i, noise.grad2(i, 3, 8));
|
||||
*/
|
||||
}
|
||||
|
||||
if (!screen && key == Keyboard::KEY_O || key == 250) {
|
||||
releaseMouse();
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_F) {
|
||||
int dst = options.getIntValue(OPTIONS_VIEW_DISTANCE);
|
||||
options.set(OPTIONS_VIEW_DISTANCE, (dst + 1) % 4);
|
||||
}
|
||||
#ifdef CHEATS
|
||||
if (key == Keyboard::KEY_U) {
|
||||
onGraphicsReset();
|
||||
player->heal(100);
|
||||
#if defined(WIN32)
|
||||
if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) {
|
||||
// Set adventure settings here!
|
||||
AdventureSettingsPacket p(level->adventureSettings);
|
||||
p.toggle((AdventureSettingsPacket::Flags)(1 << slot));
|
||||
p.fillIn(level->adventureSettings);
|
||||
raknetInstance->send(p);
|
||||
}
|
||||
if (digit == 0) {
|
||||
Pos pos((int)player->x, (int)player->y-1, (int)player->z);
|
||||
SetSpawnPositionPacket p(pos);
|
||||
raknetInstance->send(p);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#if defined(PLATFORM_DESKTOP)
|
||||
if (key == Keyboard::KEY_LEFT_CTRL) {
|
||||
player->setSprinting(true);
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode
|
||||
setIsCreativeMode(!isCreativeMode());
|
||||
if (key == Keyboard::KEY_E) {
|
||||
screenChooser.setScreen(SCREEN_BLOCKSELECTION);
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_P) // Step forward in time
|
||||
level->setTime( level->getTime() + 1000);
|
||||
if (!screen && key == Keyboard::KEY_T && level) {
|
||||
setScreen(new ConsoleScreen());
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_G) {
|
||||
setScreen(new ArmorScreen());
|
||||
if (key == Keyboard::KEY_F3) {
|
||||
options.toggle(OPTIONS_RENDER_DEBUG);
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_F5) {
|
||||
options.toggle(OPTIONS_THIRD_PERSON_VIEW);
|
||||
/*
|
||||
std::vector<AABB>& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f));
|
||||
LOGI("boxes: %d\n", (int)boxs.size());
|
||||
ImprovedNoise noise;
|
||||
for (int i = 0; i < 16; ++i)
|
||||
printf("%d\t%f\n", i, noise.grad2(i, 3, 8));
|
||||
*/
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_Y) {
|
||||
textures->reloadAll();
|
||||
player->hurtTo(2);
|
||||
if (!screen && key == Keyboard::KEY_O || key == 250) {
|
||||
releaseMouse();
|
||||
}
|
||||
if (key == Keyboard::KEY_Z || key == 108) {
|
||||
for (int i = 0; i < 1; ++i) {
|
||||
Mob* mob = NULL;
|
||||
int forceId = 0;//MobTypes::Sheep;
|
||||
|
||||
int types[] = {
|
||||
MobTypes::Sheep,
|
||||
MobTypes::Pig,
|
||||
MobTypes::Chicken,
|
||||
MobTypes::Cow,
|
||||
};
|
||||
|
||||
int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))];
|
||||
mob = MobFactory::CreateMob(mobType, level);
|
||||
|
||||
//((Animal*)mob)->setAge(-1000);
|
||||
float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot);
|
||||
float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot);
|
||||
if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true))
|
||||
delete mob;
|
||||
if (key == Keyboard::KEY_F) {
|
||||
int dst = options.getIntValue(OPTIONS_VIEW_DISTANCE);
|
||||
options.set(OPTIONS_VIEW_DISTANCE, (dst + 1) % 4);
|
||||
}
|
||||
#ifdef CHEATS
|
||||
if (key == Keyboard::KEY_U) {
|
||||
onGraphicsReset();
|
||||
player->heal(100);
|
||||
}
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_X) {
|
||||
const EntityList& entities = level->getAllEntities();
|
||||
for (int i = entities.size()-1; i >= 0; --i) {
|
||||
Entity* e = entities[i];
|
||||
if (!e->isPlayer())
|
||||
level->removeEntity(e);
|
||||
if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode
|
||||
setIsCreativeMode(!isCreativeMode());
|
||||
|
||||
if (key == Keyboard::KEY_P) // Step forward in time
|
||||
level->setTime( level->getTime() + 1000);
|
||||
|
||||
if (key == Keyboard::KEY_G) {
|
||||
setScreen(new ArmorScreen());
|
||||
/*
|
||||
std::vector<AABB>& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f));
|
||||
LOGI("boxes: %d\n", (int)boxs.size());
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_C /*|| key == 4*/) {
|
||||
player->inventory->clearInventoryWithDefault();
|
||||
// @todo: Add saving here for benchmarking
|
||||
}
|
||||
if (key == Keyboard::KEY_H) {
|
||||
setScreen( new PrerenderTilesScreen() );
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_O) {
|
||||
for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i)
|
||||
if (player->inventory->getItem(i))
|
||||
player->inventory->dropSlot(i, false);
|
||||
}
|
||||
if (key == Keyboard::KEY_M) {
|
||||
Difficulty difficulty = (Difficulty)options.getIntValue(OPTIONS_DIFFICULTY);
|
||||
options.set(OPTIONS_DIFFICULTY, (difficulty == Difficulty::PEACEFUL)?
|
||||
Difficulty::NORMAL : Difficulty::PEACEFUL);
|
||||
//setIsCreativeMode( !isCreativeMode() );
|
||||
}
|
||||
|
||||
if (options.getBooleanValue(OPTIONS_RENDER_DEBUG)) {
|
||||
if (key >= '0' && key <= '9') {
|
||||
_perfRenderer->debugFpsMeterKeyPress(key - '0');
|
||||
if (key == Keyboard::KEY_Y) {
|
||||
textures->reloadAll();
|
||||
player->hurtTo(2);
|
||||
}
|
||||
}
|
||||
if (key == Keyboard::KEY_Z || key == 108) {
|
||||
for (int i = 0; i < 1; ++i) {
|
||||
Mob* mob = NULL;
|
||||
int forceId = 0;//MobTypes::Sheep;
|
||||
|
||||
int types[] = {
|
||||
MobTypes::Sheep,
|
||||
MobTypes::Pig,
|
||||
MobTypes::Chicken,
|
||||
MobTypes::Cow,
|
||||
};
|
||||
|
||||
int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))];
|
||||
mob = MobFactory::CreateMob(mobType, level);
|
||||
|
||||
//((Animal*)mob)->setAge(-1000);
|
||||
float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot);
|
||||
float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot);
|
||||
if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true))
|
||||
delete mob;
|
||||
}
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_X) {
|
||||
const EntityList& entities = level->getAllEntities();
|
||||
for (int i = entities.size()-1; i >= 0; --i) {
|
||||
Entity* e = entities[i];
|
||||
if (!e->isPlayer())
|
||||
level->removeEntity(e);
|
||||
}
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_C /*|| key == 4*/) {
|
||||
player->inventory->clearInventoryWithDefault();
|
||||
// @todo: Add saving here for benchmarking
|
||||
}
|
||||
if (key == Keyboard::KEY_H) {
|
||||
setScreen( new PrerenderTilesScreen() );
|
||||
}
|
||||
|
||||
if (key == Keyboard::KEY_O) {
|
||||
for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i)
|
||||
if (player->inventory->getItem(i))
|
||||
player->inventory->dropSlot(i, false);
|
||||
}
|
||||
if (key == Keyboard::KEY_M) {
|
||||
Difficulty difficulty = (Difficulty)options.getIntValue(OPTIONS_DIFFICULTY);
|
||||
options.set(OPTIONS_DIFFICULTY, (difficulty == Difficulty::PEACEFUL)?
|
||||
Difficulty::NORMAL : Difficulty::PEACEFUL);
|
||||
//setIsCreativeMode( !isCreativeMode() );
|
||||
}
|
||||
|
||||
if (options.getBooleanValue(OPTIONS_RENDER_DEBUG)) {
|
||||
if (key >= '0' && key <= '9') {
|
||||
_perfRenderer->debugFpsMeterKeyPress(key - '0');
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (key == Keyboard::KEY_ESCAPE)
|
||||
pauseGame(false);
|
||||
#ifndef PLATFORM_DESKTOP
|
||||
if (key == 82)
|
||||
pauseGame(false);
|
||||
#else
|
||||
if (key == Keyboard::KEY_ESCAPE)
|
||||
pauseGame(false);
|
||||
#endif
|
||||
|
||||
#ifndef OPENGL_ES
|
||||
if (key == Keyboard::KEY_P) {
|
||||
@@ -856,18 +866,11 @@ void Minecraft::tickInput() {
|
||||
gameMode->stopDestroyBlock();
|
||||
}
|
||||
|
||||
if (!Mouse::isButtonDown(MouseAction::ACTION_RIGHT)) {
|
||||
gameMode->releaseUsingItem(player);
|
||||
}
|
||||
|
||||
if (useTouchscreen()) {
|
||||
// Touch: gesture recognizer classifies the action type (turn/destroy/build)
|
||||
BuildActionIntention bai;
|
||||
|
||||
if (inputHolder && inputHolder->getBuildInput()->tickBuild(player, &bai)) {
|
||||
handleBuildAction(&bai);
|
||||
} else {
|
||||
gameMode->stopDestroyBlock();
|
||||
}
|
||||
} else {
|
||||
// Desktop: left mouse = destroy/attack
|
||||
@@ -1106,12 +1109,10 @@ void Minecraft::releaseMouse()
|
||||
}
|
||||
|
||||
bool Minecraft::useTouchscreen() {
|
||||
#if TARGET_OS_IPHONE
|
||||
return true;
|
||||
#elif RPI
|
||||
#ifdef RPI
|
||||
return false;
|
||||
#endif
|
||||
return options.getBooleanValue(OPTIONS_USE_TOUCHSCREEN) && !_supportsNonTouchscreen;
|
||||
return options.getBooleanValue(OPTIONS_USE_TOUCHSCREEN) || !_supportsNonTouchscreen;
|
||||
}
|
||||
bool Minecraft::supportNonTouchScreen() {
|
||||
return _supportsNonTouchscreen;
|
||||
@@ -1128,31 +1129,12 @@ void Minecraft::init()
|
||||
textures = new Textures(&options, platform());
|
||||
textures->addDynamicTexture(new WaterTexture());
|
||||
textures->addDynamicTexture(new WaterSideTexture());
|
||||
textures->addDynamicTexture(new FireTexture());
|
||||
gui.texturesLoaded(textures);
|
||||
|
||||
levelRenderer = new LevelRenderer(this);
|
||||
gameRenderer = new GameRenderer(this);
|
||||
particleEngine = new ParticleEngine(level, textures);
|
||||
|
||||
// 4j's code for reference
|
||||
// FoliageColor::init(textures->loadTexturePixels(L"misc/foliagecolor.png"));
|
||||
|
||||
|
||||
// my code
|
||||
TextureId foliageId = (textures->loadTexture("environment/foliagecolor.png")); // loading the uh png for foliage color
|
||||
int* foliagePixels = textures->loadTexturePixels(foliageId, "environment/foliagecolor.png");
|
||||
// now i can finally initialize foliage color, probably not the best way to handle this but i cant be arsed rn
|
||||
FoliageColor::init(foliagePixels);
|
||||
|
||||
TextureId grassId = (textures->loadTexture("environment/grasscolor.png")); // loading the uh png for foliage color
|
||||
int* grassPixels = textures->loadTexturePixels(grassId, "environment/grasscolor.png");
|
||||
GrassColor::init(grassPixels);
|
||||
|
||||
bool tint = options.getBooleanValue(OPTIONS_FOLIAGE_TINT); // finally, toggleable foliage color
|
||||
FoliageColor::setUseTint(tint);
|
||||
GrassColor::setUseTint(tint);
|
||||
|
||||
// Platform specific initialization here
|
||||
font = new Font(&options, "font/default8.png", textures);
|
||||
|
||||
@@ -1161,10 +1143,10 @@ void Minecraft::init()
|
||||
checkGlError("Init complete");
|
||||
#endif
|
||||
|
||||
options.load();
|
||||
|
||||
user = new User(options.getStringValue(OPTIONS_USERNAME), "");
|
||||
setIsCreativeMode(false); // false means it's Survival Mode
|
||||
reloadOptions();
|
||||
|
||||
}
|
||||
|
||||
void Minecraft::setSize(int w, int h) {
|
||||
@@ -1178,13 +1160,12 @@ void Minecraft::setSize(int w, int h) {
|
||||
|
||||
// determine gui scale, optionally overriding auto
|
||||
if (guiScale != 0) {
|
||||
// manual selection: 1->small, 2->medium, 3->large, 4->larger, 5->largest
|
||||
// manual selection: 1->small, 2->normal, 3->large, 4->larger
|
||||
switch (guiScale) {
|
||||
case 1: Gui::GuiScale = 2.0f; break;
|
||||
case 2: Gui::GuiScale = 3.0f; break;
|
||||
case 3: Gui::GuiScale = 4.0f; break;
|
||||
case 4: Gui::GuiScale = 5.0f; break;
|
||||
case 5: Gui::GuiScale = 6.0f; break;
|
||||
case 4: Gui::GuiScale = 5.0f; break; // bigger than large
|
||||
default: Gui::GuiScale = 1.0f; break; // auto
|
||||
}
|
||||
} else {
|
||||
@@ -1246,6 +1227,7 @@ void Minecraft::reloadOptions() {
|
||||
if ((wasTouchscreen != useTouchscreen()) || (inputHolder == 0))
|
||||
_reloadInput();
|
||||
|
||||
// TODO:
|
||||
// user->name = options.username;
|
||||
|
||||
LOGI("Reloading-options\n");
|
||||
@@ -1259,7 +1241,11 @@ void Minecraft::_reloadInput() {
|
||||
#ifndef STANDALONE_SERVER
|
||||
delete inputHolder;
|
||||
|
||||
#ifdef PLATFORM_DESKTOP
|
||||
const bool useTouchHolder = false;
|
||||
#else
|
||||
const bool useTouchHolder = useTouchscreen();
|
||||
#endif
|
||||
if (useTouchHolder) {
|
||||
inputHolder = new TouchInputHolder(this, &options);
|
||||
} else {
|
||||
@@ -1346,9 +1332,9 @@ void Minecraft::hostMultiplayer(int port) {
|
||||
#if !defined(NO_NETWORK)
|
||||
netCallback = new ServerSideNetworkHandler(this, raknetInstance);
|
||||
#ifdef STANDALONE_SERVER
|
||||
raknetInstance->host("Server", port, 16);
|
||||
raknetInstance->host(user->name, port, 16);
|
||||
#else
|
||||
raknetInstance->host(options.getStringValue(OPTIONS_USERNAME), port);
|
||||
raknetInstance->host(user->name, port);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
@@ -1405,10 +1391,8 @@ void Minecraft::_levelGenerated()
|
||||
|
||||
this->cameraTargetPlayer = player;
|
||||
|
||||
std::string serverName = options.getStringValue(OPTIONS_USERNAME) + " - " + level->getLevelData()->levelName;
|
||||
|
||||
if (raknetInstance->isServer())
|
||||
raknetInstance->announceServer(serverName);
|
||||
raknetInstance->announceServer(user->name);
|
||||
|
||||
if (netCallback) {
|
||||
netCallback->levelGenerated(level);
|
||||
@@ -1584,8 +1568,6 @@ void Minecraft::optionUpdated(OptionId option, bool value ) {
|
||||
if(netCallback != NULL && option == OPTIONS_SERVER_VISIBLE) {
|
||||
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback;
|
||||
ss->allowIncomingConnections(value);
|
||||
} else if (option == OPTIONS_USE_TOUCHSCREEN) {
|
||||
_reloadInput();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
//#include "../network/RakNetInstance.h"
|
||||
#include "../world/phys/HitResult.h"
|
||||
|
||||
class User;
|
||||
class Level;
|
||||
class LocalPlayer;
|
||||
class IInputHolder;
|
||||
@@ -109,8 +110,6 @@ public:
|
||||
|
||||
bool isLevelGenerated();
|
||||
|
||||
void handleMouseDown(int button, bool down);
|
||||
|
||||
void audioEngineOn();
|
||||
void audioEngineOff();
|
||||
|
||||
@@ -166,6 +165,7 @@ public:
|
||||
int lastTickTime;
|
||||
float ticksSinceLastUpdate;
|
||||
|
||||
User* user;
|
||||
Level* level;
|
||||
|
||||
LocalPlayer* player;
|
||||
@@ -221,7 +221,6 @@ private:
|
||||
bool _isCreativeMode;
|
||||
//int _respawnPlayerTicks;
|
||||
Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour
|
||||
// shit* lmao
|
||||
|
||||
PerfRenderer* _perfRenderer;
|
||||
CommandServer* _commandServer;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <SDL/SDL.h>
|
||||
#endif
|
||||
|
||||
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
||||
#ifdef PLATFORM_GLFW
|
||||
#include <GLFW/glfw3.h>
|
||||
#endif
|
||||
|
||||
@@ -34,7 +34,7 @@ void MouseHandler::grab() {
|
||||
SDL_ShowCursor(0);
|
||||
#endif
|
||||
|
||||
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
||||
#ifdef PLATFORM_GLFW
|
||||
glfwSetInputMode(glfwGetCurrentContext(), GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||
#endif
|
||||
}
|
||||
@@ -46,7 +46,7 @@ void MouseHandler::release() {
|
||||
SDL_ShowCursor(1);
|
||||
#endif
|
||||
|
||||
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
||||
#ifdef PLATFORM_GLFW
|
||||
glfwSetInputMode(glfwGetCurrentContext(), GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
#include "Option.h"
|
||||
#include <sstream>
|
||||
#include <cstdio>
|
||||
|
||||
Option::~Option() {}
|
||||
|
||||
bool Option::parse_bool_like(const std::string& value, bool& out) {
|
||||
if (value == "true" || value == "YES") {
|
||||
@@ -26,7 +23,7 @@ bool OptionFloat::parse(const std::string& value) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return sscanf(value.c_str(), "%f", &m_value) == 1;
|
||||
return std::sscanf(value.c_str(), "%f", &m_value) == 1;
|
||||
}
|
||||
bool OptionInt::parse(const std::string& value) {
|
||||
bool b;
|
||||
@@ -35,7 +32,7 @@ bool OptionInt::parse(const std::string& value) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return sscanf(value.c_str(), "%d", &m_value) == 1;
|
||||
return std::sscanf(value.c_str(), "%d", &m_value) == 1;
|
||||
}
|
||||
bool OptionBool::parse(const std::string& value) {
|
||||
if (value == "0") {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
#include <sstream>
|
||||
#include <type_traits>
|
||||
#include <util/Mth.h>
|
||||
#include "Mth.h"
|
||||
/*
|
||||
template<typename T>
|
||||
struct is_option_type : std::false_type {};
|
||||
@@ -21,7 +21,7 @@ template<> struct is_min_max_option<float> : std::true_type {};
|
||||
class Option {
|
||||
public:
|
||||
Option(const std::string& key) : m_key("options." + key) {}
|
||||
virtual ~Option();
|
||||
virtual ~Option() = default;
|
||||
|
||||
const std::string& getStringId() { return m_key; }
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@ OptionBool fixedCamera("fixedCamera", false);
|
||||
OptionBool isFlying("isflying", false);
|
||||
OptionBool barOnTop("barOnTop", false);
|
||||
OptionBool allowSprint("allowSprint", true);
|
||||
OptionBool rpiCursor("rpiCursor", false);
|
||||
OptionBool autoJump("autoJump", true);
|
||||
|
||||
|
||||
@@ -60,8 +59,6 @@ OptionBool useTouchscreen("useTouchscreen", true);
|
||||
|
||||
OptionBool serverVisible("servervisible", true);
|
||||
|
||||
OptionBool foliageTint("foliagetint", false);
|
||||
|
||||
OptionInt keyForward("key.forward", Keyboard::KEY_W);
|
||||
OptionInt keyLeft("key.left", Keyboard::KEY_A);
|
||||
OptionInt keyBack("key.back", Keyboard::KEY_S);
|
||||
@@ -138,8 +135,6 @@ void Options::initTable() {
|
||||
|
||||
m_options[OPTIONS_USE_TOUCHSCREEN] = &useTouchscreen;
|
||||
|
||||
|
||||
|
||||
m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible;
|
||||
|
||||
m_options[OPTIONS_KEY_FORWARD] = &keyForward;
|
||||
@@ -163,8 +158,6 @@ void Options::initTable() {
|
||||
|
||||
m_options[OPTIONS_BAR_ON_TOP] = &barOnTop;
|
||||
m_options[OPTIONS_ALLOW_SPRINT] = &allowSprint;
|
||||
m_options[OPTIONS_RPI_CURSOR] = &rpiCursor;
|
||||
m_options[OPTIONS_FOLIAGE_TINT] = &foliageTint;
|
||||
|
||||
m_options[OPTIONS_AUTOJUMP] = &autoJump;
|
||||
m_options[OPTIONS_LAST_IP] = &lastIp;
|
||||
@@ -175,7 +168,9 @@ void Options::set(OptionId key, const std::string& value) {
|
||||
|
||||
if (option) {
|
||||
option->set(value);
|
||||
|
||||
notifyOptionUpdate(key, value);
|
||||
save();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,7 +179,9 @@ void Options::set(OptionId key, float value) {
|
||||
|
||||
if (option) {
|
||||
option->set(value);
|
||||
|
||||
notifyOptionUpdate(key, value);
|
||||
save();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -193,7 +190,9 @@ void Options::set(OptionId key, int value) {
|
||||
|
||||
if (option) {
|
||||
option->set(value);
|
||||
|
||||
notifyOptionUpdate(key, value);
|
||||
save();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,7 +201,9 @@ void Options::toggle(OptionId key) {
|
||||
|
||||
if (option) {
|
||||
option->toggle();
|
||||
|
||||
notifyOptionUpdate(key, option->get());
|
||||
save();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -290,10 +291,6 @@ void Options::save() {
|
||||
optionsFile.save(stringVec);
|
||||
}
|
||||
|
||||
void Options::setOptionsFilePath(const std::string& path) {
|
||||
optionsFile.setOptionsPath(path + "/options.txt");
|
||||
}
|
||||
|
||||
void Options::notifyOptionUpdate(OptionId key, bool value) {
|
||||
minecraft->optionUpdated(key, value);
|
||||
}
|
||||
|
||||
@@ -83,8 +83,6 @@ enum OptionId {
|
||||
OPTIONS_FIRST_LAUNCH,
|
||||
OPTIONS_LAST_IP,
|
||||
|
||||
OPTIONS_RPI_CURSOR,
|
||||
OPTIONS_FOLIAGE_TINT,
|
||||
// Should be last!
|
||||
OPTIONS_COUNT
|
||||
};
|
||||
@@ -106,10 +104,15 @@ public:
|
||||
// elements werent initialized so i was getting a garbage pointer and a crash
|
||||
m_options.fill(nullptr);
|
||||
initTable();
|
||||
// load() is deferred to init() where path is configured correctly
|
||||
load();
|
||||
}
|
||||
|
||||
void initTable();
|
||||
void initTable();
|
||||
|
||||
void set(OptionId key, int value);
|
||||
void set(OptionId key, float value);
|
||||
void set(OptionId key, const std::string& value);
|
||||
void toggle(OptionId key);
|
||||
|
||||
int getIntValue(OptionId key) {
|
||||
auto option = opt<OptionInt>(key);
|
||||
@@ -145,11 +148,6 @@ public:
|
||||
|
||||
void load();
|
||||
void save();
|
||||
void set(OptionId key, int value);
|
||||
void set(OptionId key, float value);
|
||||
void set(OptionId key, const std::string& value);
|
||||
void setOptionsFilePath(const std::string& path);
|
||||
void toggle(OptionId key);
|
||||
|
||||
void notifyOptionUpdate(OptionId key, bool value);
|
||||
void notifyOptionUpdate(OptionId key, float value);
|
||||
|
||||
@@ -1,76 +1,30 @@
|
||||
#include "OptionsFile.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <platform/log.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <direct.h>
|
||||
#else
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
OptionsFile::OptionsFile() {
|
||||
#ifdef __APPLE__
|
||||
settingsPath = "./Documents/options.txt";
|
||||
#elif defined(ANDROID)
|
||||
settingsPath = "options.txt";
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
settingsPath = "/games/com.mojang/options.txt";
|
||||
#else
|
||||
settingsPath = "options.txt";
|
||||
#endif
|
||||
}
|
||||
|
||||
void OptionsFile::setOptionsPath(const std::string& path) {
|
||||
settingsPath = path;
|
||||
}
|
||||
|
||||
std::string OptionsFile::getOptionsPath() const {
|
||||
return settingsPath;
|
||||
}
|
||||
void OptionsFile::save(const StringVector& settings) {
|
||||
FILE* pFile = fopen(settingsPath.c_str(), "w");
|
||||
|
||||
if (!pFile && errno == ENOENT) {
|
||||
std::string dir = settingsPath;
|
||||
size_t fpos = dir.find_last_of("/\\");
|
||||
if (fpos != std::string::npos) {
|
||||
dir.resize(fpos);
|
||||
|
||||
std::string toCreate;
|
||||
for (size_t i = 0; i <= dir.size(); ++i) {
|
||||
if (i == dir.size() || dir[i] == '/' || dir[i] == '\\') {
|
||||
if (!toCreate.empty()) {
|
||||
#if defined(_WIN32)
|
||||
_mkdir(toCreate.c_str());
|
||||
#else
|
||||
mkdir(toCreate.c_str(), 0755);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (i < dir.size())
|
||||
toCreate.push_back(dir[i]);
|
||||
}
|
||||
}
|
||||
|
||||
pFile = fopen(settingsPath.c_str(), "w");
|
||||
}
|
||||
|
||||
if (!pFile) {
|
||||
LOGI("OptionsFile::save failed: %s", strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
for (const auto& s : settings) {
|
||||
fprintf(pFile, "%s\n", s.c_str());
|
||||
}
|
||||
|
||||
fclose(pFile);
|
||||
FILE* pFile = fopen(settingsPath.c_str(), "w");
|
||||
if(pFile != NULL) {
|
||||
for(StringVector::const_iterator it = settings.begin(); it != settings.end(); ++it) {
|
||||
fprintf(pFile, "%s\n", it->c_str());
|
||||
}
|
||||
fclose(pFile);
|
||||
} else {
|
||||
LOGI("OptionsFile::save failed to open '%s' for writing: %s", settingsPath.c_str(), strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
StringVector OptionsFile::getOptionStrings() {
|
||||
StringVector returnVector;
|
||||
FILE* pFile = fopen(settingsPath.c_str(), "r");
|
||||
@@ -91,8 +45,7 @@ StringVector OptionsFile::getOptionStrings() {
|
||||
}
|
||||
fclose(pFile);
|
||||
} else {
|
||||
if (errno != ENOENT)
|
||||
LOGI("OptionsFile::getOptionStrings failed to open '%s' for reading: %s", settingsPath.c_str(), strerror(errno));
|
||||
LOGI("OptionsFile::getOptionStrings failed to open '%s' for reading: %s", settingsPath.c_str(), strerror(errno));
|
||||
}
|
||||
return returnVector;
|
||||
}
|
||||
|
||||
@@ -11,9 +11,7 @@ public:
|
||||
OptionsFile();
|
||||
void save(const StringVector& settings);
|
||||
StringVector getOptionStrings();
|
||||
void setOptionsPath(const std::string& path);
|
||||
std::string getOptionsPath() const;
|
||||
|
||||
|
||||
private:
|
||||
std::string settingsPath;
|
||||
};
|
||||
|
||||
62
src/client/User.h
Executable file
62
src/client/User.h
Executable file
@@ -0,0 +1,62 @@
|
||||
#ifndef NET_MINECRAFT_CLIENT__User_H__
|
||||
#define NET_MINECRAFT_CLIENT__User_H__
|
||||
|
||||
//package net.minecraft.client;
|
||||
|
||||
#include "../world/level/tile/Tile.h"
|
||||
|
||||
class User
|
||||
{
|
||||
public:
|
||||
//static List<Tile> allowedTiles = /*new*/ ArrayList<Tile>();
|
||||
|
||||
//static {
|
||||
// allowedTiles.push_back(Tile::rock);
|
||||
// allowedTiles.push_back(Tile::stoneBrick);
|
||||
// allowedTiles.push_back(Tile::redBrick);
|
||||
// allowedTiles.push_back(Tile::dirt);
|
||||
// allowedTiles.push_back(Tile::wood);
|
||||
// allowedTiles.push_back(Tile::treeTrunk);
|
||||
// allowedTiles.push_back(Tile::leaves);
|
||||
// allowedTiles.push_back(Tile::torch);
|
||||
// allowedTiles.push_back(Tile::stoneSlabHalf);
|
||||
|
||||
// allowedTiles.push_back(Tile::glass);
|
||||
// allowedTiles.push_back(Tile::mossStone);
|
||||
// allowedTiles.push_back(Tile::sapling);
|
||||
// allowedTiles.push_back(Tile::flower);
|
||||
// allowedTiles.push_back(Tile::rose);
|
||||
// allowedTiles.push_back(Tile::mushroom1);
|
||||
// allowedTiles.push_back(Tile::mushroom2);
|
||||
// allowedTiles.push_back(Tile::sand);
|
||||
// allowedTiles.push_back(Tile::gravel);
|
||||
// allowedTiles.push_back(Tile::sponge);
|
||||
|
||||
// allowedTiles.push_back(Tile::cloth);
|
||||
// allowedTiles.push_back(Tile::coalOre);
|
||||
// allowedTiles.push_back(Tile::ironOre);
|
||||
// allowedTiles.push_back(Tile::goldOre);
|
||||
// allowedTiles.push_back(Tile::ironBlock);
|
||||
// allowedTiles.push_back(Tile::goldBlock);
|
||||
// allowedTiles.push_back(Tile::bookshelf);
|
||||
// allowedTiles.push_back(Tile::tnt);
|
||||
// allowedTiles.push_back(Tile::obsidian);
|
||||
|
||||
// // System.out.println(allowedTiles.size());
|
||||
//}
|
||||
|
||||
static bool isTileAllowed(const Tile& tile) {
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string name;
|
||||
std::string sessionId;
|
||||
//std::string mpPassword;
|
||||
|
||||
User(const std::string& name, const std::string& sessionId) {
|
||||
this->name = name;
|
||||
this->sessionId = sessionId;
|
||||
}
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT__User_H__*/
|
||||
@@ -1,56 +1,69 @@
|
||||
#include "CreativeMode.h"
|
||||
#include "../Minecraft.h"
|
||||
#ifndef STANDALONE_SERVER
|
||||
#include "../particle/ParticleEngine.h"
|
||||
#endif
|
||||
#include "../player/LocalPlayer.h"
|
||||
#ifndef STANDALONE_SERVER
|
||||
#include "../renderer/LevelRenderer.h"
|
||||
#include "../sound/SoundEngine.h"
|
||||
#endif
|
||||
#include "../../world/level/Level.h"
|
||||
//#include "../../network/Packet.h"
|
||||
#include "../../network/packet/RemoveBlockPacket.h"
|
||||
#include "../../world/entity/player/Abilities.h"
|
||||
|
||||
static const int DestructionTickDelay = 5;
|
||||
|
||||
CreativeMode::CreativeMode(Minecraft* minecraft)
|
||||
: super(minecraft)
|
||||
{
|
||||
}
|
||||
|
||||
void CreativeMode::startDestroyBlock(int x, int y, int z, int face) {
|
||||
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
||||
return;
|
||||
|
||||
creativeDestroyBlock(x, y, z, face);
|
||||
destroyDelay = DestructionTickDelay;
|
||||
}
|
||||
|
||||
void CreativeMode::creativeDestroyBlock(int x, int y, int z, int face) {
|
||||
minecraft->level->extinguishFire(x, y, z, face);
|
||||
destroyBlock(x, y, z, face);
|
||||
}
|
||||
|
||||
void CreativeMode::continueDestroyBlock(int x, int y, int z, int face) {
|
||||
destroyDelay--;
|
||||
if (destroyDelay <= 0) {
|
||||
destroyDelay = DestructionTickDelay;
|
||||
creativeDestroyBlock(x, y, z, face);
|
||||
}
|
||||
}
|
||||
|
||||
void CreativeMode::stopDestroyBlock() {
|
||||
destroyDelay = 0;
|
||||
}
|
||||
|
||||
void CreativeMode::initAbilities( Abilities& abilities ) {
|
||||
abilities.mayfly = true;
|
||||
abilities.instabuild = true;
|
||||
abilities.invulnerable = true;
|
||||
}
|
||||
|
||||
bool CreativeMode::isCreativeType() {
|
||||
return true;
|
||||
}
|
||||
#include "CreativeMode.h"
|
||||
#include "../Minecraft.h"
|
||||
#ifndef STANDALONE_SERVER
|
||||
#include "../particle/ParticleEngine.h"
|
||||
#endif
|
||||
#include "../player/LocalPlayer.h"
|
||||
#ifndef STANDALONE_SERVER
|
||||
#include "../renderer/LevelRenderer.h"
|
||||
#include "../sound/SoundEngine.h"
|
||||
#endif
|
||||
#include "../../world/level/Level.h"
|
||||
//#include "../../network/Packet.h"
|
||||
#include "../../network/packet/RemoveBlockPacket.h"
|
||||
#include "../../world/entity/player/Abilities.h"
|
||||
|
||||
static const int DestructionTickDelay = 5;
|
||||
|
||||
CreativeMode::CreativeMode(Minecraft* minecraft)
|
||||
: super(minecraft)
|
||||
{
|
||||
}
|
||||
|
||||
void CreativeMode::startDestroyBlock(int x, int y, int z, int face) {
|
||||
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
||||
return;
|
||||
|
||||
creativeDestroyBlock(x, y, z, face);
|
||||
destroyDelay = DestructionTickDelay;
|
||||
}
|
||||
|
||||
void CreativeMode::creativeDestroyBlock(int x, int y, int z, int face) {
|
||||
minecraft->level->extinguishFire(x, y, z, face);
|
||||
destroyBlock(x, y, z, face);
|
||||
}
|
||||
|
||||
void CreativeMode::continueDestroyBlock(int x, int y, int z, int face) {
|
||||
destroyDelay--;
|
||||
if (destroyDelay <= 0) {
|
||||
destroyDelay = DestructionTickDelay;
|
||||
creativeDestroyBlock(x, y, z, face);
|
||||
}
|
||||
}
|
||||
|
||||
void CreativeMode::stopDestroyBlock() {
|
||||
destroyDelay = 0;
|
||||
}
|
||||
|
||||
void CreativeMode::initAbilities( Abilities& abilities ) {
|
||||
abilities.mayfly = true;
|
||||
abilities.instabuild = true;
|
||||
abilities.invulnerable = true;
|
||||
}
|
||||
|
||||
bool CreativeMode::isCreativeType() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void CreativeMode::releaseUsingItem( Player* player ) {
|
||||
if(player->getCarriedItem() != NULL) {
|
||||
int oldItemId = player->getCarriedItem()->id;
|
||||
int oldAux = player->getAuxData();
|
||||
super::releaseUsingItem(player);
|
||||
if(player->getCarriedItem() != NULL && player->getCarriedItem()->id == oldItemId) {
|
||||
player->getCarriedItem()->setAuxValue(oldAux);
|
||||
}
|
||||
} else {
|
||||
super::releaseUsingItem(player);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,27 @@
|
||||
#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__
|
||||
#define NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__
|
||||
|
||||
//package net.minecraft.client.gamemode;
|
||||
|
||||
#include "GameMode.h"
|
||||
|
||||
class CreativeMode: public GameMode
|
||||
{
|
||||
typedef GameMode super;
|
||||
public:
|
||||
CreativeMode(Minecraft* minecraft);
|
||||
|
||||
void startDestroyBlock(int x, int y, int z, int face);
|
||||
void continueDestroyBlock(int x, int y, int z, int face);
|
||||
void stopDestroyBlock();
|
||||
|
||||
bool isCreativeType();
|
||||
|
||||
void initAbilities(Abilities& abilities);
|
||||
|
||||
private:
|
||||
void creativeDestroyBlock(int x, int y, int z, int face);
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__*/
|
||||
#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__
|
||||
#define NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__
|
||||
|
||||
//package net.minecraft.client.gamemode;
|
||||
|
||||
#include "GameMode.h"
|
||||
|
||||
class CreativeMode: public GameMode
|
||||
{
|
||||
typedef GameMode super;
|
||||
public:
|
||||
CreativeMode(Minecraft* minecraft);
|
||||
|
||||
void startDestroyBlock(int x, int y, int z, int face);
|
||||
void continueDestroyBlock(int x, int y, int z, int face);
|
||||
void stopDestroyBlock();
|
||||
|
||||
bool isCreativeType();
|
||||
|
||||
void initAbilities(Abilities& abilities);
|
||||
|
||||
void releaseUsingItem(Player* player);
|
||||
private:
|
||||
void creativeDestroyBlock(int x, int y, int z, int face);
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__*/
|
||||
|
||||
@@ -1,102 +1,115 @@
|
||||
#include "CreatorMode.h"
|
||||
#include "../Minecraft.h"
|
||||
#include "../particle/ParticleEngine.h"
|
||||
#include "../player/LocalPlayer.h"
|
||||
#include "../renderer/LevelRenderer.h"
|
||||
#include "../sound/SoundEngine.h"
|
||||
#include "../../world/level/Level.h"
|
||||
//#include "../../network/Packet.h"
|
||||
#include "../../network/packet/RemoveBlockPacket.h"
|
||||
#include "../../world/entity/player/Abilities.h"
|
||||
|
||||
static const int DestructionTickDelay = 5;
|
||||
|
||||
class Creator: public ICreator {
|
||||
//virtual void getEvents();
|
||||
|
||||
public:
|
||||
Creator(/*int eventLifeTime*/)
|
||||
: _tileEvents(32),
|
||||
_tickId(0)
|
||||
{
|
||||
}
|
||||
|
||||
void setTick(int tick) {
|
||||
_tickId = tick;
|
||||
}
|
||||
|
||||
EventList<TileEvent>& getTileEvents() { return _tileEvents; }
|
||||
|
||||
void addevent_blockUse(int entityId, int x, int y, int z, int face) {
|
||||
TileEvent t = {
|
||||
entityId,
|
||||
x,y,z,
|
||||
face
|
||||
};
|
||||
_tileEvents.add(t, _tickId);
|
||||
}
|
||||
|
||||
private:
|
||||
EventList<TileEvent> _tileEvents;
|
||||
int _tickId;
|
||||
};
|
||||
|
||||
CreatorMode::CreatorMode(Minecraft* minecraft)
|
||||
: super(minecraft)
|
||||
{
|
||||
_creator = new Creator();
|
||||
}
|
||||
|
||||
CreatorMode::~CreatorMode() {
|
||||
delete _creator;
|
||||
}
|
||||
|
||||
void CreatorMode::startDestroyBlock(int x, int y, int z, int face) {
|
||||
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
||||
return;
|
||||
|
||||
CreatorDestroyBlock(x, y, z, face);
|
||||
destroyDelay = DestructionTickDelay;
|
||||
}
|
||||
|
||||
void CreatorMode::CreatorDestroyBlock(int x, int y, int z, int face) {
|
||||
minecraft->level->extinguishFire(x, y, z, face);
|
||||
destroyBlock(x, y, z, face);
|
||||
}
|
||||
|
||||
void CreatorMode::continueDestroyBlock(int x, int y, int z, int face) {
|
||||
destroyDelay--;
|
||||
if (destroyDelay <= 0) {
|
||||
destroyDelay = DestructionTickDelay;
|
||||
CreatorDestroyBlock(x, y, z, face);
|
||||
}
|
||||
}
|
||||
|
||||
bool CreatorMode::useItemOn( Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit ) {
|
||||
if (item && item->id == ((Item*)Item::sword_iron)->id)
|
||||
_creator->addevent_blockUse(player->entityId, x, y, z, face);
|
||||
return super::useItemOn(player, level, item, x, y, z, face, hit);
|
||||
}
|
||||
|
||||
void CreatorMode::stopDestroyBlock() {
|
||||
destroyDelay = 0;
|
||||
}
|
||||
|
||||
void CreatorMode::initAbilities( Abilities& abilities ) {
|
||||
abilities.mayfly = true;
|
||||
abilities.instabuild = true;
|
||||
abilities.invulnerable = true;
|
||||
}
|
||||
|
||||
bool CreatorMode::isCreativeType() {
|
||||
return true;
|
||||
}
|
||||
|
||||
ICreator* CreatorMode::getCreator() {
|
||||
return _creator;
|
||||
}
|
||||
|
||||
void CreatorMode::tick() {
|
||||
_creator->setTick(minecraft->level->getTime());
|
||||
super::tick();
|
||||
}
|
||||
#include "CreatorMode.h"
|
||||
#include "../Minecraft.h"
|
||||
#include "../particle/ParticleEngine.h"
|
||||
#include "../player/LocalPlayer.h"
|
||||
#include "../renderer/LevelRenderer.h"
|
||||
#include "../sound/SoundEngine.h"
|
||||
#include "../../world/level/Level.h"
|
||||
//#include "../../network/Packet.h"
|
||||
#include "../../network/packet/RemoveBlockPacket.h"
|
||||
#include "../../world/entity/player/Abilities.h"
|
||||
|
||||
static const int DestructionTickDelay = 5;
|
||||
|
||||
class Creator: public ICreator {
|
||||
//virtual void getEvents();
|
||||
|
||||
public:
|
||||
Creator(/*int eventLifeTime*/)
|
||||
: _tileEvents(32),
|
||||
_tickId(0)
|
||||
{
|
||||
}
|
||||
|
||||
void setTick(int tick) {
|
||||
_tickId = tick;
|
||||
}
|
||||
|
||||
EventList<TileEvent>& getTileEvents() { return _tileEvents; }
|
||||
|
||||
void addevent_blockUse(int entityId, int x, int y, int z, int face) {
|
||||
TileEvent t = {
|
||||
entityId,
|
||||
x,y,z,
|
||||
face
|
||||
};
|
||||
_tileEvents.add(t, _tickId);
|
||||
}
|
||||
|
||||
private:
|
||||
EventList<TileEvent> _tileEvents;
|
||||
int _tickId;
|
||||
};
|
||||
|
||||
CreatorMode::CreatorMode(Minecraft* minecraft)
|
||||
: super(minecraft)
|
||||
{
|
||||
_creator = new Creator();
|
||||
}
|
||||
|
||||
CreatorMode::~CreatorMode() {
|
||||
delete _creator;
|
||||
}
|
||||
|
||||
void CreatorMode::startDestroyBlock(int x, int y, int z, int face) {
|
||||
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
||||
return;
|
||||
|
||||
CreatorDestroyBlock(x, y, z, face);
|
||||
destroyDelay = DestructionTickDelay;
|
||||
}
|
||||
|
||||
void CreatorMode::CreatorDestroyBlock(int x, int y, int z, int face) {
|
||||
minecraft->level->extinguishFire(x, y, z, face);
|
||||
destroyBlock(x, y, z, face);
|
||||
}
|
||||
|
||||
void CreatorMode::continueDestroyBlock(int x, int y, int z, int face) {
|
||||
destroyDelay--;
|
||||
if (destroyDelay <= 0) {
|
||||
destroyDelay = DestructionTickDelay;
|
||||
CreatorDestroyBlock(x, y, z, face);
|
||||
}
|
||||
}
|
||||
|
||||
bool CreatorMode::useItemOn( Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit ) {
|
||||
if (item && item->id == ((Item*)Item::sword_iron)->id)
|
||||
_creator->addevent_blockUse(player->entityId, x, y, z, face);
|
||||
return super::useItemOn(player, level, item, x, y, z, face, hit);
|
||||
}
|
||||
|
||||
void CreatorMode::stopDestroyBlock() {
|
||||
destroyDelay = 0;
|
||||
}
|
||||
|
||||
void CreatorMode::initAbilities( Abilities& abilities ) {
|
||||
abilities.mayfly = true;
|
||||
abilities.instabuild = true;
|
||||
abilities.invulnerable = true;
|
||||
}
|
||||
|
||||
bool CreatorMode::isCreativeType() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void CreatorMode::releaseUsingItem( Player* player ) {
|
||||
if(player->getCarriedItem() != NULL) {
|
||||
int oldItemId = player->getCarriedItem()->id;
|
||||
int oldAux = player->getAuxData();
|
||||
super::releaseUsingItem(player);
|
||||
if(player->getCarriedItem() != NULL && player->getCarriedItem()->id == oldItemId) {
|
||||
player->getCarriedItem()->setAuxValue(oldAux);
|
||||
}
|
||||
} else {
|
||||
super::releaseUsingItem(player);
|
||||
}
|
||||
}
|
||||
|
||||
ICreator* CreatorMode::getCreator() {
|
||||
return _creator;
|
||||
}
|
||||
|
||||
void CreatorMode::tick() {
|
||||
_creator->setTick(minecraft->level->getTime());
|
||||
super::tick();
|
||||
}
|
||||
|
||||
@@ -1,61 +1,61 @@
|
||||
#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__
|
||||
#define NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__
|
||||
|
||||
//package net.minecraft.client.gamemode;
|
||||
|
||||
#include "GameMode.h"
|
||||
#include "../../world/PosTranslator.h"
|
||||
|
||||
class ICreator {
|
||||
public:
|
||||
virtual ~ICreator() {}
|
||||
|
||||
struct TileEvent {
|
||||
int entityId;
|
||||
int x, y, z;
|
||||
int face;
|
||||
|
||||
void write(std::stringstream& ss, IPosTranslator& t) const {
|
||||
int xx = x, yy = y, zz = z;
|
||||
t.to(xx, yy, zz);
|
||||
ss << xx << "," << yy << "," << zz << "," << face << "," << entityId;
|
||||
}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class EventList {
|
||||
public:
|
||||
EventList(int size) {
|
||||
_events.reserve(size);
|
||||
_maxSize = (int)size;
|
||||
clear();
|
||||
}
|
||||
void clear() {
|
||||
_index = -1;
|
||||
_size = 0;
|
||||
}
|
||||
void add(const T& item, int tick) {
|
||||
if (_size < _maxSize) {
|
||||
_events.push_back(Item());
|
||||
++_size;
|
||||
}
|
||||
Item& e = _events[_nextIndex()];
|
||||
e.item = item;
|
||||
e.timestamp = tick;
|
||||
}
|
||||
int size() const {
|
||||
return _size;
|
||||
}
|
||||
|
||||
const T& operator[](int i) const {
|
||||
return _events[_getIndex(i)].item;
|
||||
}
|
||||
|
||||
T& operator[](int i) {
|
||||
return _events[_getIndex(i)].item;
|
||||
}
|
||||
|
||||
void write(std::stringstream& ss, IPosTranslator& t, int minTimetamp) const {
|
||||
#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__
|
||||
#define NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__
|
||||
|
||||
//package net.minecraft.client.gamemode;
|
||||
|
||||
#include "GameMode.h"
|
||||
#include "../../world/PosTranslator.h"
|
||||
|
||||
class ICreator {
|
||||
public:
|
||||
virtual ~ICreator() {}
|
||||
|
||||
struct TileEvent {
|
||||
int entityId;
|
||||
int x, y, z;
|
||||
int face;
|
||||
|
||||
void write(std::stringstream& ss, IPosTranslator& t) const {
|
||||
int xx = x, yy = y, zz = z;
|
||||
t.to(xx, yy, zz);
|
||||
ss << xx << "," << yy << "," << zz << "," << face << "," << entityId;
|
||||
}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class EventList {
|
||||
public:
|
||||
EventList(int size) {
|
||||
_events.reserve(size);
|
||||
_maxSize = (int)size;
|
||||
clear();
|
||||
}
|
||||
void clear() {
|
||||
_index = -1;
|
||||
_size = 0;
|
||||
}
|
||||
void add(const T& item, int tick) {
|
||||
if (_size < _maxSize) {
|
||||
_events.push_back(Item());
|
||||
++_size;
|
||||
}
|
||||
Item& e = _events[_nextIndex()];
|
||||
e.item = item;
|
||||
e.timestamp = tick;
|
||||
}
|
||||
int size() const {
|
||||
return _size;
|
||||
}
|
||||
|
||||
const T& operator[](int i) const {
|
||||
return _events[_getIndex(i)].item;
|
||||
}
|
||||
|
||||
T& operator[](int i) {
|
||||
return _events[_getIndex(i)].item;
|
||||
}
|
||||
|
||||
void write(std::stringstream& ss, IPosTranslator& t, int minTimetamp) const {
|
||||
int i = _getFirstNewerIndex(minTimetamp);
|
||||
if (i < 0)
|
||||
return;
|
||||
@@ -66,62 +66,63 @@ public:
|
||||
ss << "|";
|
||||
if (++i == _size) i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
int _getIndex(int i) const { return (1 + _index + i) % _size; }
|
||||
int _nextIndex() {
|
||||
if (++_index == _size) _index = 0;
|
||||
return _index;
|
||||
}
|
||||
|
||||
int _getFirstNewerIndex(int timestamp) const {
|
||||
for (int i = _index + 1, j = 0; j < _size; ++i, ++j) {
|
||||
if (i == _size) i = 0;
|
||||
if (_events[i].timestamp >= timestamp) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
struct Item {
|
||||
int timestamp;
|
||||
T item;
|
||||
};
|
||||
|
||||
int _index;
|
||||
int _size;
|
||||
int _maxSize;
|
||||
std::vector<Item> _events;
|
||||
};
|
||||
|
||||
virtual EventList<TileEvent>& getTileEvents() = 0;
|
||||
};
|
||||
|
||||
class Creator;
|
||||
|
||||
class CreatorMode: public GameMode
|
||||
{
|
||||
typedef GameMode super;
|
||||
public:
|
||||
CreatorMode(Minecraft* minecraft);
|
||||
~CreatorMode();
|
||||
|
||||
void startDestroyBlock(int x, int y, int z, int face);
|
||||
void continueDestroyBlock(int x, int y, int z, int face);
|
||||
void stopDestroyBlock();
|
||||
|
||||
bool useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit);
|
||||
|
||||
void tick();
|
||||
ICreator* getCreator();
|
||||
|
||||
bool isCreativeType();
|
||||
|
||||
void initAbilities(Abilities& abilities);
|
||||
|
||||
private:
|
||||
void CreatorDestroyBlock(int x, int y, int z, int face);
|
||||
|
||||
Creator* _creator;
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__*/
|
||||
}
|
||||
|
||||
private:
|
||||
int _getIndex(int i) const { return (1 + _index + i) % _size; }
|
||||
int _nextIndex() {
|
||||
if (++_index == _size) _index = 0;
|
||||
return _index;
|
||||
}
|
||||
|
||||
int _getFirstNewerIndex(int timestamp) const {
|
||||
for (int i = _index + 1, j = 0; j < _size; ++i, ++j) {
|
||||
if (i == _size) i = 0;
|
||||
if (_events[i].timestamp >= timestamp) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
struct Item {
|
||||
int timestamp;
|
||||
T item;
|
||||
};
|
||||
|
||||
int _index;
|
||||
int _size;
|
||||
int _maxSize;
|
||||
std::vector<Item> _events;
|
||||
};
|
||||
|
||||
virtual EventList<TileEvent>& getTileEvents() = 0;
|
||||
};
|
||||
|
||||
class Creator;
|
||||
|
||||
class CreatorMode: public GameMode
|
||||
{
|
||||
typedef GameMode super;
|
||||
public:
|
||||
CreatorMode(Minecraft* minecraft);
|
||||
~CreatorMode();
|
||||
|
||||
void startDestroyBlock(int x, int y, int z, int face);
|
||||
void continueDestroyBlock(int x, int y, int z, int face);
|
||||
void stopDestroyBlock();
|
||||
|
||||
bool useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit);
|
||||
|
||||
void tick();
|
||||
ICreator* getCreator();
|
||||
|
||||
bool isCreativeType();
|
||||
|
||||
void initAbilities(Abilities& abilities);
|
||||
|
||||
void releaseUsingItem(Player* player);
|
||||
private:
|
||||
void CreatorDestroyBlock(int x, int y, int z, int face);
|
||||
|
||||
Creator* _creator;
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__*/
|
||||
|
||||
@@ -1,174 +1,173 @@
|
||||
#include "GameMode.h"
|
||||
#include "../Minecraft.h"
|
||||
#include "../../network/packet/UseItemPacket.h"
|
||||
#include "../../network/packet/PlayerActionPacket.h"
|
||||
#include "../../world/level/Level.h"
|
||||
#include "../../world/item/ItemInstance.h"
|
||||
#include "../player/LocalPlayer.h"
|
||||
#include "client/Options.h"
|
||||
#ifndef STANDALONE_SERVER
|
||||
#include "../sound/SoundEngine.h"
|
||||
#include "../particle/ParticleEngine.h"
|
||||
#endif
|
||||
#include "../../network/RakNetInstance.h"
|
||||
#include "../../network/packet/RemoveBlockPacket.h"
|
||||
#ifndef STANDALONE_SERVER
|
||||
#include "../renderer/LevelRenderer.h"
|
||||
#endif
|
||||
#include "../../world/level/material/Material.h"
|
||||
|
||||
GameMode::GameMode( Minecraft* minecraft)
|
||||
: minecraft(minecraft),
|
||||
destroyProgress(0),
|
||||
oDestroyProgress(0),
|
||||
destroyTicks(0),
|
||||
destroyDelay(0)
|
||||
{
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
Player* GameMode::createPlayer(Level* level) {
|
||||
return new LocalPlayer(minecraft, level, minecraft->options.getStringValue(OPTIONS_USERNAME), level->dimension->id, isCreativeType());
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
void GameMode::interact(Player* player, Entity* entity) {
|
||||
player->interact(entity);
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
void GameMode::attack(Player* player, Entity* entity) {
|
||||
if (minecraft->level->adventureSettings.noPvP && entity->isPlayer())
|
||||
return;
|
||||
if (minecraft->level->adventureSettings.noPvM && entity->isMob())
|
||||
return;
|
||||
player->attack(entity);
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
void GameMode::startDestroyBlock( int x, int y, int z, int face ) {
|
||||
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
||||
return;
|
||||
destroyBlock(x, y, z, face);
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
bool GameMode::destroyBlock(int x, int y, int z, int face) {
|
||||
Level* level = minecraft->level;
|
||||
Tile* oldTile = Tile::tiles[level->getTile(x, y, z)];
|
||||
if (!oldTile)
|
||||
return false;
|
||||
|
||||
if (level->adventureSettings.immutableWorld) {
|
||||
if (oldTile != (Tile*)Tile::leaves
|
||||
&& oldTile->material != Material::plant) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#ifndef STANDALONE_SERVER
|
||||
minecraft->particleEngine->destroy(x, y, z);
|
||||
#endif
|
||||
int data = level->getData(x, y, z);
|
||||
bool changed = level->setTile(x, y, z, 0);
|
||||
if (changed) {
|
||||
#ifndef STANDALONE_SERVER
|
||||
minecraft->soundEngine->play(oldTile->soundType->getBreakSound(), x + 0.5f, y + 0.5f, z + 0.5f, (oldTile->soundType->getVolume() + 1) / 2, oldTile->soundType->getPitch() * 0.8f);
|
||||
#endif
|
||||
oldTile->destroy(level, x, y, z, data);
|
||||
if (minecraft->options.getBooleanValue(OPTIONS_DESTROY_VIBRATION)) minecraft->platform()->vibrate(24);
|
||||
|
||||
if (minecraft->isOnline()) {
|
||||
RemoveBlockPacket packet(minecraft->player, x, y, z);
|
||||
minecraft->raknetInstance->send(packet);
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
/*virtual*/
|
||||
bool GameMode::useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit) {
|
||||
float clickX = hit.x - x;
|
||||
float clickY = hit.y - y;
|
||||
float clickZ = hit.z - z;
|
||||
if (level->isClientSide) {
|
||||
item = player->inventory->getSelected();
|
||||
UseItemPacket packet(x, y, z, face, item, player->entityId, clickX, clickY, clickZ);
|
||||
minecraft->raknetInstance->send(packet);
|
||||
}
|
||||
int t = level->getTile(x, y, z);
|
||||
if (t == Tile::invisible_bedrock->id) return false;
|
||||
if (t > 0 && Tile::tiles[t]->use(level, x, y, z, player))
|
||||
return true;
|
||||
|
||||
if (item == NULL) return false;
|
||||
if(isCreativeType()) {
|
||||
int aux = item->getAuxValue();
|
||||
int count = item->count;
|
||||
bool success = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
|
||||
item->setAuxValue(aux);
|
||||
item->count = count;
|
||||
return success;
|
||||
} else {
|
||||
return item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
|
||||
}
|
||||
}
|
||||
|
||||
bool GameMode::useItem( Player* player, Level* level, ItemInstance* item ) {
|
||||
int oldCount = item->count;
|
||||
|
||||
ItemInstance* itemInstance = item->use(level, player);
|
||||
if(level->isClientSide) {
|
||||
UseItemPacket packet(item, player->entityId, player->aimDirection);
|
||||
minecraft->raknetInstance->send(packet);
|
||||
}
|
||||
if (itemInstance != item || (itemInstance != NULL && itemInstance->count != oldCount)) {
|
||||
//player.inventory.items[player.inventory.selected] = itemInstance;
|
||||
//if (itemInstance.count == 0) {
|
||||
// player.inventory.items[player.inventory.selected] = NULL;
|
||||
//}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemInstance* GameMode::handleInventoryMouseClick( int containerId, int slotNum, int buttonNum, Player* player ) {
|
||||
//return player.containerMenu.clicked(slotNum, buttonNum, player);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void GameMode::handleCloseInventory( int containerId, Player* player ) {
|
||||
//player.containerMenu.removed(player);
|
||||
//player.containerMenu = player.inventoryMenu;
|
||||
}
|
||||
|
||||
float GameMode::getPickRange() {
|
||||
return 5.0f;
|
||||
}
|
||||
|
||||
void GameMode::initPlayer( Player* player ) {
|
||||
initAbilities(player->abilities);
|
||||
}
|
||||
|
||||
void GameMode::releaseUsingItem(Player* player){
|
||||
if (minecraft->level->isClientSide && player->isUsingItem()) {
|
||||
PlayerActionPacket packet(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 0, player->entityId);
|
||||
minecraft->raknetInstance->send(packet);
|
||||
}
|
||||
player->releaseUsingItem();
|
||||
}
|
||||
|
||||
void GameMode::tick() {
|
||||
oDestroyProgress = destroyProgress;
|
||||
}
|
||||
|
||||
void GameMode::render( float a ) {
|
||||
#ifndef STANDALONE_SERVER
|
||||
if (destroyProgress <= 0) {
|
||||
minecraft->gui.progress = 0;
|
||||
minecraft->levelRenderer->destroyProgress = 0;
|
||||
} else {
|
||||
float dp = oDestroyProgress + (destroyProgress - oDestroyProgress) * a;
|
||||
minecraft->gui.progress = dp;
|
||||
minecraft->levelRenderer->destroyProgress = dp;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#include "GameMode.h"
|
||||
#include "../Minecraft.h"
|
||||
#include "../../network/packet/UseItemPacket.h"
|
||||
#include "../../network/packet/PlayerActionPacket.h"
|
||||
#include "../../world/level/Level.h"
|
||||
#include "../../world/item/ItemInstance.h"
|
||||
#include "../player/LocalPlayer.h"
|
||||
#ifndef STANDALONE_SERVER
|
||||
#include "../sound/SoundEngine.h"
|
||||
#include "../particle/ParticleEngine.h"
|
||||
#endif
|
||||
#include "../../network/RakNetInstance.h"
|
||||
#include "../../network/packet/RemoveBlockPacket.h"
|
||||
#ifndef STANDALONE_SERVER
|
||||
#include "../renderer/LevelRenderer.h"
|
||||
#endif
|
||||
#include "../../world/level/material/Material.h"
|
||||
|
||||
GameMode::GameMode( Minecraft* minecraft)
|
||||
: minecraft(minecraft),
|
||||
destroyProgress(0),
|
||||
oDestroyProgress(0),
|
||||
destroyTicks(0),
|
||||
destroyDelay(0)
|
||||
{
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
Player* GameMode::createPlayer(Level* level) {
|
||||
return new LocalPlayer(minecraft, level, minecraft->user, level->dimension->id, isCreativeType());
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
void GameMode::interact(Player* player, Entity* entity) {
|
||||
player->interact(entity);
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
void GameMode::attack(Player* player, Entity* entity) {
|
||||
if (minecraft->level->adventureSettings.noPvP && entity->isPlayer())
|
||||
return;
|
||||
if (minecraft->level->adventureSettings.noPvM && entity->isMob())
|
||||
return;
|
||||
player->attack(entity);
|
||||
}
|
||||
|
||||
/* virtual */
|
||||
void GameMode::startDestroyBlock( int x, int y, int z, int face ) {
|
||||
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
|
||||
return;
|
||||
destroyBlock(x, y, z, face);
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
bool GameMode::destroyBlock(int x, int y, int z, int face) {
|
||||
Level* level = minecraft->level;
|
||||
Tile* oldTile = Tile::tiles[level->getTile(x, y, z)];
|
||||
if (!oldTile)
|
||||
return false;
|
||||
|
||||
if (level->adventureSettings.immutableWorld) {
|
||||
if (oldTile != (Tile*)Tile::leaves
|
||||
&& oldTile->material != Material::plant) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#ifndef STANDALONE_SERVER
|
||||
minecraft->particleEngine->destroy(x, y, z);
|
||||
#endif
|
||||
int data = level->getData(x, y, z);
|
||||
bool changed = level->setTile(x, y, z, 0);
|
||||
if (changed) {
|
||||
#ifndef STANDALONE_SERVER
|
||||
minecraft->soundEngine->play(oldTile->soundType->getBreakSound(), x + 0.5f, y + 0.5f, z + 0.5f, (oldTile->soundType->getVolume() + 1) / 2, oldTile->soundType->getPitch() * 0.8f);
|
||||
#endif
|
||||
oldTile->destroy(level, x, y, z, data);
|
||||
if (minecraft->options.getBooleanValue(OPTIONS_DESTROY_VIBRATION)) minecraft->platform()->vibrate(24);
|
||||
|
||||
if (minecraft->isOnline()) {
|
||||
RemoveBlockPacket packet(minecraft->player, x, y, z);
|
||||
minecraft->raknetInstance->send(packet);
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
/*virtual*/
|
||||
bool GameMode::useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit) {
|
||||
float clickX = hit.x - x;
|
||||
float clickY = hit.y - y;
|
||||
float clickZ = hit.z - z;
|
||||
item = player->inventory->getSelected();
|
||||
if(level->isClientSide) {
|
||||
UseItemPacket packet(x, y, z, face, item, player->entityId, clickX, clickY, clickZ);
|
||||
minecraft->raknetInstance->send(packet);
|
||||
}
|
||||
int t = level->getTile(x, y, z);
|
||||
if (t == Tile::invisible_bedrock->id) return false;
|
||||
if (t > 0 && Tile::tiles[t]->use(level, x, y, z, player))
|
||||
return true;
|
||||
|
||||
if (item == NULL) return false;
|
||||
if(isCreativeType()) {
|
||||
int aux = item->getAuxValue();
|
||||
int count = item->count;
|
||||
bool success = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
|
||||
item->setAuxValue(aux);
|
||||
item->count = count;
|
||||
return success;
|
||||
} else {
|
||||
return item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
|
||||
}
|
||||
}
|
||||
|
||||
bool GameMode::useItem( Player* player, Level* level, ItemInstance* item ) {
|
||||
int oldCount = item->count;
|
||||
|
||||
ItemInstance* itemInstance = item->use(level, player);
|
||||
if(level->isClientSide) {
|
||||
UseItemPacket packet(item, player->entityId, player->aimDirection);
|
||||
minecraft->raknetInstance->send(packet);
|
||||
}
|
||||
if (itemInstance != item || (itemInstance != NULL && itemInstance->count != oldCount)) {
|
||||
//player.inventory.items[player.inventory.selected] = itemInstance;
|
||||
//if (itemInstance.count == 0) {
|
||||
// player.inventory.items[player.inventory.selected] = NULL;
|
||||
//}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemInstance* GameMode::handleInventoryMouseClick( int containerId, int slotNum, int buttonNum, Player* player ) {
|
||||
//return player.containerMenu.clicked(slotNum, buttonNum, player);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void GameMode::handleCloseInventory( int containerId, Player* player ) {
|
||||
//player.containerMenu.removed(player);
|
||||
//player.containerMenu = player.inventoryMenu;
|
||||
}
|
||||
|
||||
float GameMode::getPickRange() {
|
||||
return 5.0f;
|
||||
}
|
||||
|
||||
void GameMode::initPlayer( Player* player ) {
|
||||
initAbilities(player->abilities);
|
||||
}
|
||||
|
||||
void GameMode::releaseUsingItem(Player* player){
|
||||
if(minecraft->level->isClientSide) {
|
||||
PlayerActionPacket packet(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 0, player->entityId);
|
||||
minecraft->raknetInstance->send(packet);
|
||||
}
|
||||
player->releaseUsingItem();
|
||||
}
|
||||
|
||||
void GameMode::tick() {
|
||||
oDestroyProgress = destroyProgress;
|
||||
}
|
||||
|
||||
void GameMode::render( float a ) {
|
||||
#ifndef STANDALONE_SERVER
|
||||
if (destroyProgress <= 0) {
|
||||
minecraft->gui.progress = 0;
|
||||
minecraft->levelRenderer->destroyProgress = 0;
|
||||
} else {
|
||||
float dp = oDestroyProgress + (destroyProgress - oDestroyProgress) * a;
|
||||
minecraft->gui.progress = dp;
|
||||
minecraft->levelRenderer->destroyProgress = dp;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -186,7 +186,7 @@ void Font::draw( const std::string& str, float x, float y, int color, bool darke
|
||||
glPushMatrix2();
|
||||
glTranslatef2((GLfloat)x, (GLfloat)y, 0.0f);
|
||||
for (unsigned int i = 0; i < str.length(); i++) {
|
||||
while (str.length() > i + 1 && str[i] == '\xa7') {
|
||||
while (str.length() > i + 1 && str[i] == '<EFBFBD>') {
|
||||
int cc = hex.find((char)tolower(str[i + 1]));
|
||||
if (cc < 0 || cc > 15) cc = 15;
|
||||
lists[index++] = listPos + 256 + cc + (darken ? 16 : 0);
|
||||
@@ -235,7 +235,7 @@ int Font::width( const std::string& str )
|
||||
int len = 0;
|
||||
|
||||
for (unsigned int i = 0; i < str.length(); i++) {
|
||||
if (str[i] == '\xa7') {
|
||||
if (str[i] == '<EFBFBD>') {
|
||||
i++;
|
||||
} else {
|
||||
//int ch = SharedConstants.acceptableLetters.indexOf(str.charAt(i));
|
||||
@@ -274,7 +274,7 @@ std::string Font::sanitize( const std::string& str )
|
||||
int j = 0;
|
||||
|
||||
for (unsigned int i = 0; i < str.length(); i++) {
|
||||
if (str[i] == '\xa7') {
|
||||
if (str[i] == '<EFBFBD>') {
|
||||
i++;
|
||||
//} else if (SharedConstants.acceptableLetters.indexOf(str.charAt(i)) >= 0) {
|
||||
} else {
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include "../../platform/time.h"
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
|
||||
float Gui::InvGuiScale = 1.0f / 3.0f;
|
||||
float Gui::GuiScale = 1.0f / Gui::InvGuiScale;
|
||||
@@ -51,8 +50,7 @@ Gui::Gui(Minecraft* minecraft)
|
||||
_currentDropTicks(-1),
|
||||
_currentDropSlot(-1),
|
||||
MAX_MESSAGE_WIDTH(240),
|
||||
itemNameOverlayTime(2),
|
||||
_openInventorySlot(minecraft->useTouchscreen())
|
||||
itemNameOverlayTime(2)
|
||||
{
|
||||
glGenBuffers2(1, &_inventoryRc.vboId);
|
||||
glGenBuffers2(1, &rcFeedbackInner.vboId);
|
||||
@@ -76,8 +74,11 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) {
|
||||
//minecraft->gameRenderer->setupGuiScreen();
|
||||
Font* font = minecraft->font;
|
||||
|
||||
#ifdef PLATFORM_DESKTOP
|
||||
const bool isTouchInterface = false;
|
||||
#else
|
||||
const bool isTouchInterface = minecraft->useTouchscreen();
|
||||
|
||||
#endif
|
||||
const int screenWidth = (int)(minecraft->width * InvGuiScale);
|
||||
const int screenHeight = (int)(minecraft->height * InvGuiScale);
|
||||
blitOffset = -90;
|
||||
@@ -204,10 +205,16 @@ void Gui::handleClick(int button, int x, int y) {
|
||||
if (button != MouseAction::ACTION_LEFT) return;
|
||||
|
||||
int slot = getSlotIdAt(x, y);
|
||||
if (slot != -1) {
|
||||
if (_openInventorySlot && slot == (getNumSlots()-1)) {
|
||||
if (slot != -1)
|
||||
{
|
||||
#ifndef PLATFORM_DESKTOP
|
||||
if (slot == (getNumSlots()-1))
|
||||
{
|
||||
minecraft->screenChooser.setScreen(SCREEN_BLOCKSELECTION);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
minecraft->player->inventory->selectSlot(slot);
|
||||
itemNameOverlayTime = 0;
|
||||
}
|
||||
@@ -341,7 +348,7 @@ void Gui::setNowPlaying(const std::string& string) {
|
||||
void Gui::displayClientMessage(const std::string& messageId) {
|
||||
//Language language = Language.getInstance();
|
||||
//std::string languageString = language.getElement(messageId);
|
||||
addMessage(messageId);
|
||||
addMessage(std::string("Client message: ") + messageId);
|
||||
}
|
||||
|
||||
void Gui::renderVignette(float br, int w, int h) {
|
||||
@@ -422,9 +429,9 @@ void Gui::onConfigChanged( const Config& c ) {
|
||||
// Create outer feedback circle
|
||||
//
|
||||
#ifdef ANDROID
|
||||
const float mm = 50; //20
|
||||
const float mm = 12;
|
||||
#else
|
||||
const float mm = 50; //20
|
||||
const float mm = 12;
|
||||
#endif
|
||||
const float maxRadius = minecraft->pixelCalcUi.millimetersToPixels(mm);
|
||||
const float radius = Mth::Min(80.0f/2, maxRadius);
|
||||
@@ -529,7 +536,11 @@ void Gui::tickItemDrop()
|
||||
static bool isCurrentlyActive = false;
|
||||
isCurrentlyActive = false;
|
||||
|
||||
int slots = getNumSlots() - _openInventorySlot;
|
||||
int slots = getNumSlots();
|
||||
|
||||
#ifndef PLATFORM_DESKTOP
|
||||
slots--;
|
||||
#endif
|
||||
|
||||
if (Mouse::isButtonDown(MouseAction::ACTION_LEFT)) {
|
||||
int slot = getSlotIdAt(Mouse::getX(), Mouse::getY());
|
||||
@@ -830,9 +841,7 @@ void Gui::renderPlayerList(Font* font, int screenWidth, int screenHeight) {
|
||||
}
|
||||
|
||||
// player count title
|
||||
std::ostringstream titleStream;
|
||||
titleStream << "Players (" << playerNames.size() << ")";
|
||||
std::string titleText = titleStream.str();
|
||||
std::string titleText = "Players (" + std::to_string(playerNames.size()) + ")";
|
||||
float titleWidth = font->width(titleText);
|
||||
|
||||
if (titleWidth > maxNameWidth)
|
||||
@@ -1071,7 +1080,13 @@ void Gui::renderToolBar( float a, int ySlot, const int screenWidth ) {
|
||||
|
||||
float x = baseItemX;
|
||||
|
||||
int slots = getNumSlots() - _openInventorySlot;
|
||||
int slots = getNumSlots();
|
||||
|
||||
// TODO: if using touchscreen
|
||||
|
||||
#ifndef PLATFORM_DESKTOP
|
||||
slots--;
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < slots; i++) {
|
||||
renderSlot(i, (int)x, ySlot, a);
|
||||
@@ -1079,10 +1094,9 @@ void Gui::renderToolBar( float a, int ySlot, const int screenWidth ) {
|
||||
}
|
||||
_inventoryNeedsUpdate = false;
|
||||
|
||||
|
||||
if (_openInventorySlot) {
|
||||
blit(screenWidth / 2 + 10 * getNumSlots() - 20 + 4, ySlot + 6, 242, 252, 14, 4, 14, 4);
|
||||
}
|
||||
#ifndef PLATFORM_DESKTOP
|
||||
blit(screenWidth / 2 + 10 * getNumSlots() - 20 + 4, ySlot + 6, 242, 252, 14, 4, 14, 4);
|
||||
#endif
|
||||
|
||||
minecraft->textures->loadAndBindTexture("gui/gui_blocks.png");
|
||||
t.endOverrideAndDraw();
|
||||
|
||||
@@ -127,8 +127,6 @@ private:
|
||||
static const float DropTicks;
|
||||
float _currentDropTicks;
|
||||
int _currentDropSlot;
|
||||
|
||||
bool _openInventorySlot;
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT_GUI__Gui_H__*/
|
||||
|
||||
@@ -177,11 +177,9 @@ void Screen::keyPressed( int eventKey )
|
||||
textbox->keyPressed(minecraft, eventKey);
|
||||
}
|
||||
|
||||
#ifdef TABBING
|
||||
if (minecraft->useTouchscreen())
|
||||
return;
|
||||
|
||||
|
||||
// "Tabbing" the buttons (walking with keys)
|
||||
const int tabButtonCount = tabButtons.size();
|
||||
if (!tabButtonCount)
|
||||
@@ -201,7 +199,6 @@ void Screen::keyPressed( int eventKey )
|
||||
}
|
||||
|
||||
updateTabButtonSelection();
|
||||
#endif
|
||||
}
|
||||
|
||||
void Screen::charPressed(char inputChar) {
|
||||
@@ -212,13 +209,11 @@ void Screen::charPressed(char inputChar) {
|
||||
|
||||
void Screen::updateTabButtonSelection()
|
||||
{
|
||||
#ifdef TABBING
|
||||
if (minecraft->useTouchscreen())
|
||||
return;
|
||||
|
||||
for (unsigned int i = 0; i < tabButtons.size(); ++i)
|
||||
tabButtons[i]->selected = (i == tabButtonIndex);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Screen::mouseClicked( int x, int y, int buttonNum )
|
||||
|
||||
@@ -95,7 +95,7 @@ void Button::renderBg( Minecraft* minecraft, int xm, int ym )
|
||||
}
|
||||
|
||||
bool Button::hovered(Minecraft* minecraft, int xm , int ym) {
|
||||
return minecraft->useTouchscreen()? (_currentlyDown && isInside(xm, ym)) : isInside(xm, ym);
|
||||
return minecraft->useTouchscreen()? (_currentlyDown && isInside(xm, ym)) : false;
|
||||
}
|
||||
|
||||
bool Button::isInside( int xm, int ym ) {
|
||||
@@ -143,8 +143,7 @@ TButton::TButton( int id, int x, int y, int w, int h, const std::string& msg )
|
||||
|
||||
void TButton::renderBg( Minecraft* minecraft, int xm, int ym )
|
||||
{
|
||||
bool hovered = active && (minecraft->useTouchscreen()? (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : isInside(xm, ym));
|
||||
// bool hovered = active && (_currentlyDown && isInside(xm, ym));
|
||||
bool hovered = active && (minecraft->useTouchscreen()? (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : false);
|
||||
|
||||
minecraft->textures->loadAndBindTexture("gui/touchgui.png");
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ void ImageButton::render(Minecraft* minecraft, int xm, int ym) {
|
||||
//minecraft->textures->loadAndBindTexture("gui/gui.png");
|
||||
glColor4f2(1, 1, 1, 1);
|
||||
|
||||
bool hovered = active && (minecraft->useTouchscreen()? (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : isInside(xm, ym));
|
||||
bool hovered = active && (minecraft->useTouchscreen()? (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : false);
|
||||
bool IsSecondImage = isSecondImage(hovered);
|
||||
|
||||
//printf("ButtonId: %d - Hovered? %d (cause: %d, %d, %d, %d, <> %d, %d)\n", id, hovered, x, y, x+w, y+h, xm, ym);
|
||||
|
||||
@@ -33,7 +33,7 @@ void LargeImageButton::render(Minecraft* minecraft, int xm, int ym) {
|
||||
|
||||
//minecraft->textures->loadAndBindTexture("gui/gui.png");
|
||||
glColor4f2(1, 1, 1, 1);
|
||||
bool hovered = active && (minecraft->useTouchscreen()? (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : isInside(xm, ym));
|
||||
bool hovered = active && (minecraft->useTouchscreen()? (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : false);
|
||||
|
||||
//printf("ButtonId: %d - Hovered? %d (cause: %d, %d, %d, %d, <> %d, %d)\n", id, hovered, x, y, x+w, y+h, xm, ym);
|
||||
//int yImage = getYImage(hovered || selected);
|
||||
|
||||
@@ -65,7 +65,7 @@ void OptionsGroup::createToggle(OptionId optId, Minecraft* minecraft ) {
|
||||
|
||||
std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId());
|
||||
|
||||
OptionsItem* item = new OptionsItem(optId, itemLabel, element);
|
||||
OptionsItem* item = new OptionsItem(itemLabel, element);
|
||||
|
||||
addChild(item);
|
||||
setupPositions();
|
||||
@@ -77,7 +77,7 @@ void OptionsGroup::createProgressSlider(OptionId optId, Minecraft* minecraft ) {
|
||||
element->height = 20;
|
||||
|
||||
std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId());
|
||||
OptionsItem* item = new OptionsItem(optId, itemLabel, element);
|
||||
OptionsItem* item = new OptionsItem(itemLabel, element);
|
||||
addChild(item);
|
||||
setupPositions();
|
||||
}
|
||||
@@ -87,7 +87,7 @@ void OptionsGroup::createStepSlider(OptionId optId, Minecraft* minecraft ) {
|
||||
element->width = 100;
|
||||
element->height = 20;
|
||||
std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId());
|
||||
OptionsItem* item = new OptionsItem(optId, itemLabel, element);
|
||||
OptionsItem* item = new OptionsItem(itemLabel, element);
|
||||
addChild(item);
|
||||
setupPositions();
|
||||
}
|
||||
@@ -98,7 +98,7 @@ void OptionsGroup::createTextbox(OptionId optId, Minecraft* minecraft) {
|
||||
element->height = 20;
|
||||
|
||||
std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId());
|
||||
OptionsItem* item = new OptionsItem(optId, itemLabel, element);
|
||||
OptionsItem* item = new OptionsItem(itemLabel, element);
|
||||
addChild(item);
|
||||
setupPositions();
|
||||
}
|
||||
@@ -109,7 +109,7 @@ void OptionsGroup::createKey(OptionId optId, Minecraft* minecraft) {
|
||||
element->height = 20;
|
||||
|
||||
std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId());
|
||||
OptionsItem* item = new OptionsItem(optId, itemLabel, element);
|
||||
OptionsItem* item = new OptionsItem(itemLabel, element);
|
||||
addChild(item);
|
||||
setupPositions();
|
||||
}
|
||||
@@ -1,11 +1,9 @@
|
||||
#include "OptionsItem.h"
|
||||
#include "../../Minecraft.h"
|
||||
#include "../../../locale/I18n.h"
|
||||
#include "../../../util/Mth.h"
|
||||
OptionsItem::OptionsItem( OptionId optionId, std::string label, GuiElement* element )
|
||||
OptionsItem::OptionsItem( std::string label, GuiElement* element )
|
||||
: GuiElementContainer(false, true, 0, 0, 24, 12),
|
||||
m_optionId(optionId),
|
||||
m_label(label) {
|
||||
label(label) {
|
||||
addChild(element);
|
||||
}
|
||||
|
||||
@@ -21,22 +19,6 @@ void OptionsItem::setupPositions() {
|
||||
|
||||
void OptionsItem::render( Minecraft* minecraft, int xm, int ym ) {
|
||||
int yOffset = (height - 8) / 2;
|
||||
std::string text = m_label;
|
||||
if (m_optionId == OPTIONS_GUI_SCALE) {
|
||||
int value = minecraft->options.getIntValue(OPTIONS_GUI_SCALE);
|
||||
std::string scaleText;
|
||||
switch (value) {
|
||||
case 0: scaleText = I18n::get("options.guiScale.auto"); break;
|
||||
case 1: scaleText = I18n::get("options.guiScale.small"); break;
|
||||
case 2: scaleText = I18n::get("options.guiScale.medium"); break;
|
||||
case 3: scaleText = I18n::get("options.guiScale.large"); break;
|
||||
case 4: scaleText = I18n::get("options.guiScale.larger"); break;
|
||||
case 5: scaleText = I18n::get("options.guiScale.largest"); break;
|
||||
default: scaleText = I18n::get("options.guiScale.auto"); break;
|
||||
}
|
||||
text += ": " + scaleText;
|
||||
}
|
||||
|
||||
minecraft->font->draw(text, (float)x, (float)y + yOffset, 0x909090, false);
|
||||
minecraft->font->draw(label, (float)x, (float)y + yOffset, 0x909090, false);
|
||||
super::render(minecraft, xm, ym);
|
||||
}
|
||||
@@ -15,13 +15,12 @@ class OptionsItem: public GuiElementContainer
|
||||
{
|
||||
typedef GuiElementContainer super;
|
||||
public:
|
||||
OptionsItem(OptionId optionId, std::string label, GuiElement* element);
|
||||
OptionsItem(std::string label, GuiElement* element);
|
||||
virtual void render(Minecraft* minecraft, int xm, int ym);
|
||||
void setupPositions();
|
||||
|
||||
private:
|
||||
OptionId m_optionId;
|
||||
std::string m_label;
|
||||
std::string label;
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__OptionsItem_H__*/
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include "ImageButton.h"
|
||||
#include "Slider.h"
|
||||
#include "../../Minecraft.h"
|
||||
#include "client/Options.h"
|
||||
|
||||
OptionsPane::OptionsPane() {
|
||||
|
||||
@@ -29,7 +28,7 @@ OptionsGroup& OptionsPane::createOptionsGroup( std::string label ) {
|
||||
return *newGroup;
|
||||
}
|
||||
|
||||
void OptionsPane::createToggle( unsigned int group, std::string label, OptionId option ) {
|
||||
void OptionsPane::createToggle( unsigned int group, std::string label, const Option* option ) {
|
||||
if(group > children.size()) return;
|
||||
ImageDef def;
|
||||
def.setSrc(IntRectangle(160, 206, 39, 20));
|
||||
@@ -38,27 +37,27 @@ void OptionsPane::createToggle( unsigned int group, std::string label, OptionId
|
||||
def.height = 20 * 0.7f;
|
||||
OptionButton* element = new OptionButton(option);
|
||||
element->setImageDef(def, true);
|
||||
OptionsItem* item = new OptionsItem(option, label, element);
|
||||
OptionsItem* item = new OptionsItem(label, element);
|
||||
((OptionsGroup*)children[group])->addChild(item);
|
||||
setupPositions();
|
||||
}
|
||||
|
||||
void OptionsPane::createProgressSlider( Minecraft* minecraft, unsigned int group, std::string label, OptionId option, float progressMin/*=1.0f*/, float progressMax/*=1.0f */ ) {
|
||||
void OptionsPane::createProgressSlider( Minecraft* minecraft, unsigned int group, std::string label, const Option* option, float progressMin/*=1.0f*/, float progressMax/*=1.0f */ ) {
|
||||
if(group > children.size()) return;
|
||||
Slider* element = new SliderFloat(minecraft, option);
|
||||
Slider* element = new Slider(minecraft, option, progressMin, progressMax);
|
||||
element->width = 100;
|
||||
element->height = 20;
|
||||
OptionsItem* item = new OptionsItem(option, label, element);
|
||||
OptionsItem* item = new OptionsItem(label, element);
|
||||
((OptionsGroup*)children[group])->addChild(item);
|
||||
setupPositions();
|
||||
}
|
||||
|
||||
void OptionsPane::createStepSlider( Minecraft* minecraft, unsigned int group, std::string label, OptionId option, const std::vector<int>& stepVec ) {
|
||||
void OptionsPane::createStepSlider( Minecraft* minecraft, unsigned int group, std::string label, const Option* option, const std::vector<int>& stepVec ) {
|
||||
if(group > children.size()) return;
|
||||
Slider* element = new SliderInt(minecraft, option);
|
||||
Slider* element = new Slider(minecraft, option, stepVec);
|
||||
element->width = 100;
|
||||
element->height = 20;
|
||||
OptionsItem* item = new OptionsItem(option, label, element);
|
||||
OptionsItem* item = new OptionsItem(label, element);
|
||||
((OptionsGroup*)children[group])->addChild(item);
|
||||
setupPositions();
|
||||
}
|
||||
|
||||
@@ -21,9 +21,9 @@ class OptionsPane: public GuiElementContainer
|
||||
public:
|
||||
OptionsPane();
|
||||
OptionsGroup& createOptionsGroup( std::string label );
|
||||
void createToggle( unsigned int group, std::string label, OptionId option );
|
||||
void createProgressSlider(Minecraft* minecraft, unsigned int group, std::string label, OptionId option, float progressMin=1.0f, float progressMax=1.0f );
|
||||
void createStepSlider(Minecraft* minecraft, unsigned int group, std::string label, OptionId option, const std::vector<int>& stepVec );
|
||||
void createToggle( unsigned int group, std::string label, const Option* option );
|
||||
void createProgressSlider(Minecraft* minecraft, unsigned int group, std::string label, const Option* option, float progressMin=1.0f, float progressMax=1.0f );
|
||||
void createStepSlider(Minecraft* minecraft, unsigned int group, std::string label, const Option* option, const std::vector<int>& stepVec );
|
||||
void setupPositions();
|
||||
};
|
||||
|
||||
|
||||
@@ -20,9 +20,6 @@ static const float kMinimumTrackingForDrag = 5;
|
||||
static const float kMinIndicatorLength = 34.0f / 3;
|
||||
static const float PKScrollIndicatorEndSize = 3;
|
||||
static const float PKScrollIndicatorThickness = 7.0f /3;
|
||||
static const float kWheelOverscrollMax = 80.0f;
|
||||
static const float kWheelOverscrollDamping = 0.6f;
|
||||
static const float kWheelOverscrollRestoreAlpha = 0.18f;
|
||||
|
||||
ScrollingPane::ScrollingPane(
|
||||
int optionFlags,
|
||||
@@ -73,19 +70,13 @@ ScrollingPane::ScrollingPane(
|
||||
}
|
||||
//LOGI("%d, %d :: %d\n", bbox.w, itemBbox.w, this->columns);
|
||||
|
||||
rows = 1 + (numItems-1) / this->columns;
|
||||
rows = 1 + (numItems-1) / this->columns,
|
||||
|
||||
/*
|
||||
if (columns * itemBbox.w <= bbox.w) flags |= SF_LockX;
|
||||
if (rows * itemBbox.h <= bbox.h) flags |= SF_LockY;
|
||||
*/
|
||||
|
||||
// initialize content bounds immediately
|
||||
adjustContentSize();
|
||||
minPoint.set((float)(this->size.w - this->adjustedContentSize.w), (float)(this->size.h - this->adjustedContentSize.h), 0);
|
||||
this->snapContentOffsetToBounds(false);
|
||||
|
||||
|
||||
dragDeltas.reserve(128);
|
||||
|
||||
te_moved = 0;
|
||||
@@ -123,34 +114,6 @@ void ScrollingPane::tick() {
|
||||
updateScrollFade(vScroll);
|
||||
updateScrollFade(hScroll);
|
||||
}
|
||||
|
||||
if (isNotSet(SF_HardLimits) && !Mouse::isButtonDown(MouseAction::ACTION_LEFT) && !dragging && !tracking && !decelerating) {
|
||||
float targetX = _contentOffset.x;
|
||||
float targetY = _contentOffset.y;
|
||||
bool corrected = false;
|
||||
|
||||
if (targetX > 0.0f) {
|
||||
targetX = Mth::lerp(targetX, 0.0f, kWheelOverscrollRestoreAlpha);
|
||||
corrected = true;
|
||||
} else if (targetX < minPoint.x) {
|
||||
targetX = Mth::lerp(targetX, minPoint.x, kWheelOverscrollRestoreAlpha);
|
||||
corrected = true;
|
||||
}
|
||||
|
||||
if (targetY > 0.0f) {
|
||||
targetY = Mth::lerp(targetY, 0.0f, kWheelOverscrollRestoreAlpha);
|
||||
corrected = true;
|
||||
} else if (targetY < minPoint.y) {
|
||||
targetY = Mth::lerp(targetY, minPoint.y, kWheelOverscrollRestoreAlpha);
|
||||
corrected = true;
|
||||
}
|
||||
|
||||
if (corrected) {
|
||||
if (Mth::abs(targetX - _contentOffset.x) < 0.25f) targetX = (targetX > 0.0f ? 0.0f : (targetX < minPoint.x ? minPoint.x : targetX));
|
||||
if (Mth::abs(targetY - _contentOffset.y) < 0.25f) targetY = (targetY > 0.0f ? 0.0f : (targetY < minPoint.y ? minPoint.y : targetY));
|
||||
setContentOffset(Vec3(targetX, targetY, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool ScrollingPane::getGridItemFor_slow(int itemIndex, GridItem& out) {
|
||||
@@ -586,39 +549,11 @@ void ScrollingPane::stepThroughDecelerationAnimation(bool noAnimation) {
|
||||
}
|
||||
|
||||
void ScrollingPane::scrollBy(float dx, float dy) {
|
||||
// compute target content offset from wheel delta (in screen-space w/ opposite sign)
|
||||
float targetX = _contentOffset.x - dx;
|
||||
float targetY = _contentOffset.y - dy;
|
||||
|
||||
if (isSet(SF_LockX)) targetX = _contentOffset.x;
|
||||
if (isSet(SF_LockY)) targetY = _contentOffset.y;
|
||||
|
||||
if (isSet(SF_HardLimits)) {
|
||||
targetX = Mth::clamp(targetX, minPoint.x, 0.0f);
|
||||
targetY = Mth::clamp(targetY, minPoint.y, 0.0f);
|
||||
} else {
|
||||
if (targetX > 0.0f) {
|
||||
float overshoot = targetX;
|
||||
overshoot = Mth::Min(overshoot, kWheelOverscrollMax);
|
||||
targetX = overshoot * kWheelOverscrollDamping;
|
||||
} else if (targetX < minPoint.x) {
|
||||
float overshoot = targetX - minPoint.x;
|
||||
overshoot = Mth::Max(overshoot, -kWheelOverscrollMax);
|
||||
targetX = minPoint.x + overshoot * kWheelOverscrollDamping;
|
||||
}
|
||||
|
||||
if (targetY > 0.0f) {
|
||||
float overshoot = targetY;
|
||||
overshoot = Mth::Min(overshoot, kWheelOverscrollMax);
|
||||
targetY = overshoot * kWheelOverscrollDamping;
|
||||
} else if (targetY < minPoint.y) {
|
||||
float overshoot = targetY - minPoint.y;
|
||||
overshoot = Mth::Max(overshoot, -kWheelOverscrollMax);
|
||||
targetY = minPoint.y + overshoot * kWheelOverscrollDamping;
|
||||
}
|
||||
}
|
||||
|
||||
setContentOffset(Vec3(targetX, targetY, 0));
|
||||
// adjust the translation offsets fpx/fpy by the requested amount
|
||||
float nfpx = fpx + dx;
|
||||
float nfpy = fpy + dy;
|
||||
// convert back to content offset (fpx = -contentOffset.x)
|
||||
setContentOffset(Vec3(-nfpx, -nfpy, 0));
|
||||
}
|
||||
|
||||
void ScrollingPane::setContentOffset(float x, float y) {
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
#include "../../Minecraft.h"
|
||||
#include "../../renderer/Textures.h"
|
||||
#include "../Screen.h"
|
||||
#include "../../../locale/I18n.h"
|
||||
#include "../../../util/Mth.h"
|
||||
#include <algorithm>
|
||||
#include <assert.h>
|
||||
@@ -22,7 +21,7 @@ void Slider::render( Minecraft* minecraft, int xm, int ym ) {
|
||||
|
||||
if (m_numSteps > 2) {
|
||||
int stepDistance = barWidth / (m_numSteps-1);
|
||||
for(int a = 0; a < m_numSteps; ++a) {
|
||||
for(int a = 0; a <= m_numSteps; ++a) {
|
||||
int renderSliderStepPosX = xSliderStart + a * stepDistance + 1;
|
||||
fill(renderSliderStepPosX - 1, ySliderStart - 2, renderSliderStepPosX + 1, ySliderEnd + 2, 0xff606060);
|
||||
}
|
||||
@@ -65,20 +64,15 @@ SliderFloat::SliderFloat(Minecraft* minecraft, OptionId option)
|
||||
SliderInt::SliderInt(Minecraft* minecraft, OptionId option)
|
||||
: Slider(option), m_option(dynamic_cast<OptionInt*>(minecraft->options.getOpt(option)))
|
||||
{
|
||||
m_numSteps = m_option->getMax() - m_option->getMin() + 1;
|
||||
m_numSteps = m_option->getMax() - m_option->getMin();
|
||||
m_percentage = float(m_option->get() - m_option->getMin()) / (m_numSteps-1);
|
||||
}
|
||||
|
||||
void SliderInt::render( Minecraft* minecraft, int xm, int ym ) {
|
||||
Slider::render(minecraft, xm, ym);
|
||||
}
|
||||
|
||||
void SliderInt::mouseReleased( Minecraft* minecraft, int x, int y, int buttonNum ) {
|
||||
Slider::mouseReleased(minecraft, x, y, buttonNum);
|
||||
|
||||
if (pointInside(x, y)) {
|
||||
int curStep = int(m_percentage * (m_numSteps-1) + 0.5f);
|
||||
curStep = Mth::clamp(curStep + m_option->getMin(), m_option->getMin(), m_option->getMax());
|
||||
int curStep = Mth::floor(m_percentage * (m_numSteps-1));
|
||||
m_percentage = float(curStep - m_option->getMin()) / (m_numSteps-1);
|
||||
|
||||
minecraft->options.set(m_optId, curStep);
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "GuiElement.h"
|
||||
#include "../../../client/Options.h"
|
||||
#include "OptionsPane.h" // was originally Option.h, shouldn't it be this?
|
||||
|
||||
class Slider : public GuiElement {
|
||||
typedef GuiElement super;
|
||||
@@ -37,7 +38,6 @@ class SliderInt : public Slider {
|
||||
public:
|
||||
SliderInt(Minecraft* minecraft, OptionId option);
|
||||
|
||||
virtual void render( Minecraft* minecraft, int xm, int ym ) override;
|
||||
virtual void mouseReleased( Minecraft* minecraft, int x, int y, int buttonNum ) override;
|
||||
|
||||
protected:
|
||||
|
||||
@@ -31,7 +31,7 @@ ConfirmScreen::~ConfirmScreen() {
|
||||
|
||||
void ConfirmScreen::init()
|
||||
{
|
||||
if (/* minecraft->useTouchscreen() */ true) {
|
||||
if (minecraft->useTouchscreen()) {
|
||||
yesButton = new Touch::TButton(0, 0, 0, yesButtonText),
|
||||
noButton = new Touch::TButton(1, 0, 0, noButtonText);
|
||||
} else {
|
||||
|
||||
@@ -216,5 +216,8 @@ void ConsoleScreen::render(int /*xm*/, int /*ym*/, float /*a*/)
|
||||
displayed += '_';
|
||||
|
||||
// Placeholder hint when empty
|
||||
font->drawShadow(displayed, (float)(boxX0 + 2), (float)(boxY + 2), 0xffffffff);
|
||||
if (_input.empty() && (_cursorBlink / 10) % 2 != 0)
|
||||
font->drawShadow("Type a message or /command", (float)(boxX0 + 2), (float)(boxY + 2), 0xff606060);
|
||||
else
|
||||
font->drawShadow(displayed, (float)(boxX0 + 2), (float)(boxY + 2), 0xffffffff);
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ void CreditsScreen::init() {
|
||||
buttons.push_back(bHeader);
|
||||
buttons.push_back(btnBack);
|
||||
|
||||
// TODO: rewrite it
|
||||
// prepare text lines
|
||||
_lines.clear();
|
||||
_lines.push_back("Minecraft: Pocket Edition");
|
||||
@@ -38,9 +37,6 @@ void CreditsScreen::init() {
|
||||
_lines.push_back("mschiller890");
|
||||
_lines.push_back("InviseDivine");
|
||||
_lines.push_back("Kolyah35");
|
||||
_lines.push_back("karson");
|
||||
_lines.push_back("deepfriedwaffles");
|
||||
_lines.push_back("EpikIzCool");
|
||||
_lines.push_back("");
|
||||
// avoid color tags around the URL so it isn't mangled by the parser please
|
||||
_lines.push_back("Join our Discord server: https://discord.gg/c58YesBxve");
|
||||
|
||||
@@ -23,7 +23,7 @@ DeathScreen::~DeathScreen()
|
||||
|
||||
void DeathScreen::init()
|
||||
{
|
||||
if (/* minecraft->useTouchscreen() */ true) {
|
||||
if (minecraft->useTouchscreen()) {
|
||||
bRespawn = new Touch::TButton(1, "Respawn!");
|
||||
bTitle = new Touch::TButton(2, "Main menu");
|
||||
} else {
|
||||
|
||||
@@ -21,7 +21,7 @@ public:
|
||||
}
|
||||
|
||||
void init() {
|
||||
if (/* minecraft->useTouchscreen() */ true)
|
||||
if (minecraft->useTouchscreen())
|
||||
_back = new Touch::TButton(1, "Ok");
|
||||
else
|
||||
_back = new Button(1, "Ok");
|
||||
|
||||
@@ -17,7 +17,7 @@ InBedScreen::~InBedScreen() {
|
||||
}
|
||||
|
||||
void InBedScreen::init() {
|
||||
if (/* minecraft->useTouchscreen() */ true) {
|
||||
if (minecraft->useTouchscreen()) {
|
||||
bWakeUp = new Touch::TButton(1, "Leave Bed");
|
||||
} else {
|
||||
bWakeUp = new Button(1, "Leave Bed");
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
#include "../Screen.h"
|
||||
#include "../components/Button.h"
|
||||
#include "../../Minecraft.h"
|
||||
#include "../components/ImageButton.h"
|
||||
#include "../components/TextBox.h"
|
||||
#include "ImageButton.h"
|
||||
#include "TextBox.h"
|
||||
|
||||
class JoinByIPScreen: public Screen
|
||||
{
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
|
||||
#include "../components/ImageButton.h"
|
||||
#include "../components/OptionsGroup.h"
|
||||
#include "platform/input/Keyboard.h"
|
||||
|
||||
OptionsScreen::OptionsScreen()
|
||||
: btnClose(NULL),
|
||||
@@ -19,6 +18,7 @@ OptionsScreen::OptionsScreen()
|
||||
}
|
||||
|
||||
OptionsScreen::~OptionsScreen() {
|
||||
|
||||
if (btnClose != NULL) {
|
||||
delete btnClose;
|
||||
btnClose = NULL;
|
||||
@@ -52,6 +52,7 @@ OptionsScreen::~OptionsScreen() {
|
||||
}
|
||||
|
||||
void OptionsScreen::init() {
|
||||
|
||||
bHeader = new Touch::THeader(0, "Options");
|
||||
|
||||
btnClose = new ImageButton(1, "");
|
||||
@@ -87,6 +88,7 @@ void OptionsScreen::init() {
|
||||
}
|
||||
|
||||
void OptionsScreen::setupPositions() {
|
||||
|
||||
int buttonHeight = btnClose->height;
|
||||
|
||||
btnClose->x = width - btnClose->width;
|
||||
@@ -131,6 +133,7 @@ void OptionsScreen::setupPositions() {
|
||||
|
||||
|
||||
void OptionsScreen::render(int xm, int ym, float a) {
|
||||
|
||||
renderBackground();
|
||||
|
||||
int xmm = xm * width / minecraft->width;
|
||||
@@ -146,24 +149,27 @@ void OptionsScreen::removed() {
|
||||
}
|
||||
|
||||
void OptionsScreen::buttonClicked(Button* button) {
|
||||
|
||||
if (button == btnClose) {
|
||||
minecraft->options.save();
|
||||
if (minecraft->screen != NULL) {
|
||||
minecraft->setScreen(NULL);
|
||||
} else {
|
||||
minecraft->screenChooser.setScreen(SCREEN_STARTMENU);
|
||||
}
|
||||
minecraft->screenChooser.setScreen(SCREEN_STARTMENU);
|
||||
|
||||
}
|
||||
else if (button->id > 1 && button->id < 7) {
|
||||
|
||||
int categoryButton = button->id - categoryButtons[0]->id;
|
||||
selectCategory(categoryButton);
|
||||
|
||||
}
|
||||
else if (button == btnCredits) {
|
||||
|
||||
minecraft->setScreen(new CreditsScreen());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void OptionsScreen::selectCategory(int index) {
|
||||
|
||||
int currentIndex = 0;
|
||||
|
||||
for (std::vector<Touch::TButton*>::iterator it = categoryButtons.begin(); it != categoryButtons.end(); ++it) {
|
||||
@@ -207,8 +213,7 @@ void OptionsScreen::generateOptionScreens() {
|
||||
|
||||
// // Controls Pane
|
||||
optionPanes[2]->addOptionItem(OPTIONS_INVERT_Y_MOUSE, minecraft)
|
||||
.addOptionItem(OPTIONS_USE_TOUCHSCREEN, minecraft)
|
||||
.addOptionItem(OPTIONS_AUTOJUMP, minecraft);
|
||||
.addOptionItem(OPTIONS_USE_TOUCHSCREEN, minecraft);
|
||||
|
||||
for (int i = OPTIONS_KEY_FORWARD; i <= OPTIONS_KEY_USE; i++) {
|
||||
optionPanes[2]->addOptionItem((OptionId)i, minecraft);
|
||||
@@ -227,12 +232,11 @@ void OptionsScreen::generateOptionScreens() {
|
||||
.addOptionItem(OPTIONS_AMBIENT_OCCLUSION, minecraft);
|
||||
|
||||
optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft)
|
||||
.addOptionItem(OPTIONS_BAR_ON_TOP, minecraft)
|
||||
.addOptionItem(OPTIONS_RPI_CURSOR, minecraft)
|
||||
.addOptionItem(OPTIONS_FOLIAGE_TINT, minecraft);
|
||||
.addOptionItem(OPTIONS_BAR_ON_TOP, minecraft);
|
||||
}
|
||||
|
||||
void OptionsScreen::mouseClicked(int x, int y, int buttonNum) {
|
||||
|
||||
if (currentOptionsGroup != NULL)
|
||||
currentOptionsGroup->mouseClicked(minecraft, x, y, buttonNum);
|
||||
|
||||
@@ -240,6 +244,7 @@ void OptionsScreen::mouseClicked(int x, int y, int buttonNum) {
|
||||
}
|
||||
|
||||
void OptionsScreen::mouseReleased(int x, int y, int buttonNum) {
|
||||
|
||||
if (currentOptionsGroup != NULL)
|
||||
currentOptionsGroup->mouseReleased(minecraft, x, y, buttonNum);
|
||||
|
||||
@@ -249,9 +254,7 @@ void OptionsScreen::mouseReleased(int x, int y, int buttonNum) {
|
||||
void OptionsScreen::keyPressed(int eventKey) {
|
||||
if (currentOptionsGroup != NULL)
|
||||
currentOptionsGroup->keyPressed(minecraft, eventKey);
|
||||
if (eventKey == Keyboard::KEY_ESCAPE)
|
||||
minecraft->options.save();
|
||||
|
||||
|
||||
super::keyPressed(eventKey);
|
||||
}
|
||||
|
||||
@@ -268,4 +271,4 @@ void OptionsScreen::tick() {
|
||||
currentOptionsGroup->tick(minecraft);
|
||||
|
||||
super::tick();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,16 +5,12 @@
|
||||
#include "../../../util/Mth.h"
|
||||
#include "../../../network/RakNetInstance.h"
|
||||
#include "../../../network/ServerSideNetworkHandler.h"
|
||||
#include "client/Options.h"
|
||||
#include "client/gui/components/Button.h"
|
||||
#include "client/gui/screens/OptionsScreen.h"
|
||||
|
||||
PauseScreen::PauseScreen(bool wasBackPaused)
|
||||
: saveStep(0),
|
||||
visibleTime(0),
|
||||
bContinue(0),
|
||||
bQuit(0),
|
||||
bOptions(0),
|
||||
bQuitAndSaveLocally(0),
|
||||
bServerVisibility(0),
|
||||
// bThirdPerson(0),
|
||||
@@ -43,21 +39,18 @@ PauseScreen::~PauseScreen() {
|
||||
delete bQuit;
|
||||
delete bQuitAndSaveLocally;
|
||||
delete bServerVisibility;
|
||||
delete bOptions;
|
||||
// delete bThirdPerson;
|
||||
}
|
||||
|
||||
void PauseScreen::init() {
|
||||
if (/* minecraft->useTouchscreen() */ true) {
|
||||
if (minecraft->useTouchscreen()) {
|
||||
bContinue = new Touch::TButton(1, "Back to game");
|
||||
bOptions = new Touch::TButton(5, "Options");
|
||||
bQuit = new Touch::TButton(2, "Quit to title");
|
||||
bQuitAndSaveLocally = new Touch::TButton(3, "Quit and copy map");
|
||||
bServerVisibility = new Touch::TButton(4, "");
|
||||
// bThirdPerson = new Touch::TButton(5, "Toggle 3:rd person view");
|
||||
} else {
|
||||
bContinue = new Button(1, "Back to game");
|
||||
bOptions = new Button(5, "Options");
|
||||
bQuit = new Button(2, "Quit to title");
|
||||
bQuitAndSaveLocally = new Button(3, "Quit and copy map");
|
||||
bServerVisibility = new Button(4, "");
|
||||
@@ -66,7 +59,7 @@ void PauseScreen::init() {
|
||||
|
||||
buttons.push_back(bContinue);
|
||||
buttons.push_back(bQuit);
|
||||
buttons.push_back(bOptions);
|
||||
|
||||
// bSound.updateImage(&minecraft->options);
|
||||
bThirdPerson.updateImage(&minecraft->options);
|
||||
bHideGui.updateImage(&minecraft->options);
|
||||
@@ -106,24 +99,21 @@ void PauseScreen::setupPositions() {
|
||||
saveStep = 0;
|
||||
int yBase = 16;
|
||||
|
||||
bContinue->width = bOptions->width = bQuit->width = /*bThirdPerson->w =*/ 160;
|
||||
bContinue->width = bQuit->width = /*bThirdPerson->w =*/ 160;
|
||||
bQuitAndSaveLocally->width = bServerVisibility->width = 160;
|
||||
|
||||
bContinue->x = (width - bContinue->width) / 2;
|
||||
bContinue->y = yBase + 32 * 1;
|
||||
|
||||
bOptions->x = (width - bOptions->width) / 2;
|
||||
bOptions->y = yBase + 32 * 2;
|
||||
|
||||
bQuit->x = (width - bQuit->width) / 2;
|
||||
bQuit->y = yBase + 32 * 3;
|
||||
bQuit->y = yBase + 32 * 2;
|
||||
|
||||
#if APPLE_DEMO_PROMOTION
|
||||
bQuit->y += 16;
|
||||
#endif
|
||||
|
||||
bQuitAndSaveLocally->x = bServerVisibility->x = (width - bQuitAndSaveLocally->width) / 2;
|
||||
bQuitAndSaveLocally->y = bServerVisibility->y = yBase + 32 * 4;
|
||||
bQuitAndSaveLocally->y = bServerVisibility->y = yBase + 32 * 3;
|
||||
|
||||
// bSound.y = bThirdPerson.y = 8;
|
||||
// bSound.x = 4;
|
||||
@@ -167,9 +157,7 @@ void PauseScreen::buttonClicked(Button* button) {
|
||||
if (button->id == bQuitAndSaveLocally->id) {
|
||||
minecraft->leaveGame(true);
|
||||
}
|
||||
if (button->id == bOptions->id) {
|
||||
minecraft->setScreen(new OptionsScreen());
|
||||
}
|
||||
|
||||
if (button->id == bServerVisibility->id) {
|
||||
if (minecraft->raknetInstance && minecraft->netCallback && minecraft->raknetInstance->isServer()) {
|
||||
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) minecraft->netCallback;
|
||||
|
||||
@@ -33,9 +33,7 @@ private:
|
||||
Button* bQuit;
|
||||
Button* bQuitAndSaveLocally;
|
||||
Button* bServerVisibility;
|
||||
Button* bOptions;
|
||||
|
||||
// Button* bThirdPerson;
|
||||
// Button* bThirdPerson;
|
||||
|
||||
// OptionButton bSound;
|
||||
OptionButton bThirdPerson;
|
||||
|
||||
@@ -11,8 +11,6 @@ public:
|
||||
void render(int xm, int ym, float a);
|
||||
bool isInGameScreen();
|
||||
|
||||
virtual void keyPressed(int eventKey) {}
|
||||
|
||||
void tick();
|
||||
private:
|
||||
int ticks;
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include "JoinGameScreen.h"
|
||||
#include "PauseScreen.h"
|
||||
#include "RenameMPLevelScreen.h"
|
||||
#include "ConsoleScreen.h"
|
||||
#include "IngameBlockSelectionScreen.h"
|
||||
#include "JoinByIPScreen.h"
|
||||
#include "touch/TouchStartMenuScreen.h"
|
||||
@@ -20,8 +19,7 @@ Screen* ScreenChooser::createScreen( ScreenId id )
|
||||
{
|
||||
Screen* screen = NULL;
|
||||
|
||||
// :sob:
|
||||
if (/* _mc->useTouchscreen() */ true) {
|
||||
if (_mc->useTouchscreen()) {
|
||||
switch (id) {
|
||||
case SCREEN_STARTMENU: screen = new Touch::StartMenuScreen(); break;
|
||||
case SCREEN_SELECTWORLD: screen = new Touch::SelectWorldScreen();break;
|
||||
@@ -30,7 +28,6 @@ Screen* ScreenChooser::createScreen( ScreenId id )
|
||||
case SCREEN_PAUSEPREV: screen = new PauseScreen(true); break;
|
||||
case SCREEN_BLOCKSELECTION: screen = new Touch::IngameBlockSelectionScreen(); break;
|
||||
case SCREEN_JOINBYIP: screen = new JoinByIPScreen(); break;
|
||||
case SCREEN_CONSOLE: screen = new ConsoleScreen(); break;
|
||||
case SCREEN_NONE:
|
||||
default:
|
||||
// Do nothing
|
||||
@@ -45,7 +42,7 @@ Screen* ScreenChooser::createScreen( ScreenId id )
|
||||
case SCREEN_PAUSEPREV: screen = new PauseScreen(true); break;
|
||||
case SCREEN_BLOCKSELECTION: screen = new IngameBlockSelectionScreen(); break;
|
||||
case SCREEN_JOINBYIP: screen = new JoinByIPScreen(); break;
|
||||
case SCREEN_CONSOLE: screen = new ConsoleScreen(); break;
|
||||
|
||||
case SCREEN_NONE:
|
||||
default:
|
||||
// Do nothing
|
||||
|
||||
@@ -9,8 +9,7 @@ enum ScreenId {
|
||||
SCREEN_PAUSEPREV,
|
||||
SCREEN_SELECTWORLD,
|
||||
SCREEN_BLOCKSELECTION,
|
||||
SCREEN_JOINBYIP,
|
||||
SCREEN_CONSOLE
|
||||
SCREEN_JOINBYIP
|
||||
};
|
||||
|
||||
class Screen;
|
||||
|
||||
@@ -56,7 +56,7 @@ void SimpleChooseLevelScreen::init()
|
||||
def.setSrc(IntRectangle(150, 0, (int)def.width, (int)def.height));
|
||||
bBack->setImageDef(def, true);
|
||||
}
|
||||
if (/* minecraft->useTouchscreen() */ true) {
|
||||
if (minecraft->useTouchscreen()) {
|
||||
bGamemode = new Touch::TButton(1, "Survival mode");
|
||||
bCheats = new Touch::TButton(4, "Cheats: Off");
|
||||
bCreate = new Touch::TButton(3, "Create");
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "UsernameScreen.h"
|
||||
#include "StartMenuScreen.h"
|
||||
#include "../../Minecraft.h"
|
||||
#include "../../User.h"
|
||||
#include "../Font.h"
|
||||
#include "../components/Button.h"
|
||||
#include "../../../platform/input/Keyboard.h"
|
||||
@@ -35,8 +36,8 @@ void UsernameScreen::setupPositions()
|
||||
// Make the done button match the touch-style option tabs
|
||||
_btnDone.width = 66;
|
||||
_btnDone.height = 26;
|
||||
_btnDone.x = cx - (_btnDone.width / 2);
|
||||
_btnDone.y = cy + 52;
|
||||
_btnDone.x = (width - _btnDone.width) / 2;
|
||||
_btnDone.y = height / 2 + 52;
|
||||
|
||||
tUsername.width = 120;
|
||||
tUsername.height = 20;
|
||||
@@ -74,6 +75,7 @@ void UsernameScreen::buttonClicked(Button* button)
|
||||
if (button == &_btnDone && !tUsername.text.empty()) {
|
||||
minecraft->options.set(OPTIONS_USERNAME, tUsername.text);
|
||||
minecraft->options.save();
|
||||
minecraft->user->name = tUsername.text;
|
||||
minecraft->setScreen(NULL); // goes to StartMenuScreen
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "../../../../world/level/Level.h"
|
||||
#include "../../../../world/item/DyePowderItem.h"
|
||||
#include "../../../../world/item/crafting/Recipe.h"
|
||||
#include "platform/input/Keyboard.h"
|
||||
#include "Keyboard.h"
|
||||
|
||||
static NinePatchLayer* guiPaneFrame = NULL;
|
||||
|
||||
@@ -41,7 +41,7 @@ public:
|
||||
//fill(x+1, y+1, x+w-1, y+h-1, 0xff999999);
|
||||
|
||||
bool hovered = active && (minecraft->useTouchscreen()?
|
||||
(_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : isInside(xm, ym));
|
||||
(_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : false);
|
||||
|
||||
if (hovered || *selectedPtr == this)
|
||||
statePressed->draw(Tesselator::instance, (float)x, (float)y);
|
||||
@@ -547,7 +547,7 @@ void CraftButton::renderBg(Minecraft* minecraft, int xm, int ym) {
|
||||
//fill(x+1, y+1, x+w-1, y+h-1, 0xff999999);
|
||||
|
||||
bool hovered = active && (minecraft->useTouchscreen()?
|
||||
(_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : isInside(xm, ym));
|
||||
(_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : false);
|
||||
|
||||
if (hovered || selected)
|
||||
bgSelected->draw(Tesselator::instance, (float)x, (float)y);
|
||||
|
||||
@@ -1,293 +1,291 @@
|
||||
#include "TouchIngameBlockSelectionScreen.h"
|
||||
#include "../crafting/WorkbenchScreen.h"
|
||||
#include "../../Screen.h"
|
||||
#include "../../components/ImageButton.h"
|
||||
#include "../../components/InventoryPane.h"
|
||||
#include "../../../gamemode/GameMode.h"
|
||||
#include "../../../renderer/TileRenderer.h"
|
||||
#include "../../../player/LocalPlayer.h"
|
||||
#include "../../../renderer/gles.h"
|
||||
#include "../../../renderer/entity/ItemRenderer.h"
|
||||
#include "../../../renderer/Tesselator.h"
|
||||
#include "../../../renderer/Textures.h"
|
||||
#include "../../../Minecraft.h"
|
||||
#include "../../../sound/SoundEngine.h"
|
||||
#include "../../../../world/entity/player/Inventory.h"
|
||||
#include "../../../../platform/input/Mouse.h"
|
||||
#include "../../../../util/Mth.h"
|
||||
#include "../../../../world/item/ItemInstance.h"
|
||||
#include "../../../../world/entity/player/Player.h"
|
||||
#include "../../../../world/item/crafting/Recipe.h"
|
||||
#include "../../../player/input/touchscreen/TouchAreaModel.h"
|
||||
#include "../ArmorScreen.h"
|
||||
|
||||
namespace Touch {
|
||||
|
||||
#if defined(__APPLE__)
|
||||
static const std::string demoVersionString("Not available in the Lite version");
|
||||
#else
|
||||
static const std::string demoVersionString("Not available in the demo version");
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
static const float BorderPixels = 4;
|
||||
#ifdef DEMO_MODE
|
||||
static const float BlockPixels = 22;
|
||||
#else
|
||||
static const float BlockPixels = 22;
|
||||
#endif
|
||||
#else
|
||||
static const float BorderPixels = 4;
|
||||
static const float BlockPixels = 24;
|
||||
#endif
|
||||
|
||||
static const int ItemSize = (int)(BlockPixels + 2*BorderPixels);
|
||||
|
||||
static const int Bx = 10; // Border Frame width
|
||||
static const int By = 6; // Border Frame height
|
||||
|
||||
//
|
||||
// Block selection screen
|
||||
//
|
||||
IngameBlockSelectionScreen::IngameBlockSelectionScreen()
|
||||
: selectedItem(0),
|
||||
_blockList(NULL),
|
||||
_pendingClose(false),
|
||||
bArmor (4, "Armor"),
|
||||
bDone (3, ""),
|
||||
//bDone (3, "Done"),
|
||||
bMenu (2, "Menu"),
|
||||
bCraft (1, "Craft"),
|
||||
bHeader (0, "Select blocks")
|
||||
{
|
||||
}
|
||||
|
||||
IngameBlockSelectionScreen::~IngameBlockSelectionScreen()
|
||||
{
|
||||
delete _blockList;
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::init()
|
||||
{
|
||||
Inventory* inventory = minecraft->player->inventory;
|
||||
|
||||
//const int itemWidth = 2 * BorderPixels +
|
||||
|
||||
int maxWidth = width - Bx - Bx;
|
||||
InventoryColumns = maxWidth / ItemSize;
|
||||
const int realWidth = InventoryColumns * ItemSize;
|
||||
const int realBx = (width - realWidth) / 2;
|
||||
|
||||
IntRectangle rect(realBx,
|
||||
#ifdef __APPLE__
|
||||
24 + By - ((width==240)?1:0), realWidth, ((width==240)?1:0) + height-By-By-20-24);
|
||||
#else
|
||||
24 + By, realWidth, height-By-By-20-24);
|
||||
#endif
|
||||
|
||||
_blockList = new InventoryPane(this, minecraft, rect, width, BorderPixels, inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE, ItemSize, (int)BorderPixels);
|
||||
_blockList->fillMarginX = realBx;
|
||||
|
||||
//for (int i = 0; i < inventory->getContainerSize(); ++i)
|
||||
//LOGI("> %d - %s\n", i, inventory->getItem(i)? inventory->getItem(i)->getDescriptionId().c_str() : "<-->\n");
|
||||
|
||||
// Grid indices are 0..N-1 for main inventory only; slots 0..MAX_SELECTION_SIZE-1 are hotbar links.
|
||||
InventorySize = inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE;
|
||||
InventoryRows = 1 + (InventorySize-1) / InventoryColumns;
|
||||
|
||||
//
|
||||
// Buttons
|
||||
//
|
||||
ImageDef def;
|
||||
def.name = "gui/spritesheet.png";
|
||||
def.x = 0;
|
||||
def.y = 1;
|
||||
def.width = def.height = 18;
|
||||
def.setSrc(IntRectangle(60, 0, 18, 18));
|
||||
bDone.setImageDef(def, true);
|
||||
bDone.width = bDone.height = 19;
|
||||
|
||||
bDone.scaleWhenPressed = false;
|
||||
|
||||
buttons.push_back(&bHeader);
|
||||
buttons.push_back(&bDone);
|
||||
if (!minecraft->isCreativeMode()) {
|
||||
buttons.push_back(&bCraft);
|
||||
buttons.push_back(&bArmor);
|
||||
}
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::setupPositions() {
|
||||
bHeader.y = bDone.y = bCraft.y = 0;
|
||||
bDone.x = width - bDone.width;
|
||||
bCraft.x = 0;//width - bDone.w - bCraft.w;
|
||||
bCraft.width = bArmor.width = 48;
|
||||
bArmor.x = bCraft.width;
|
||||
|
||||
if (minecraft->isCreativeMode()) {
|
||||
bHeader.x = 0;
|
||||
bHeader.width = width;// - bDone.w;
|
||||
bHeader.xText = width/2; // Center of the screen
|
||||
} else {
|
||||
bHeader.x = bCraft.width + bArmor.width;
|
||||
bHeader.width = width - bCraft.width - bArmor.width;// - bDone.w;
|
||||
bHeader.xText = bHeader.x + (bHeader.width - bDone.width) /2;
|
||||
}
|
||||
|
||||
clippingArea.x = 0;
|
||||
clippingArea.w = minecraft->width;
|
||||
clippingArea.y = 0;
|
||||
clippingArea.h = (int)(Gui::GuiScale * 24);
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::removed()
|
||||
{
|
||||
minecraft->gui.inventoryUpdated();
|
||||
}
|
||||
|
||||
int IngameBlockSelectionScreen::getSlotPosX(int slotX) {
|
||||
// @todo: Number of columns
|
||||
return width / 2 - InventoryColumns * 10 + slotX * 20 + 2;
|
||||
}
|
||||
|
||||
int IngameBlockSelectionScreen::getSlotPosY(int slotY) {
|
||||
return height - 16 - 3 - 22 * 2 - 22 * slotY;
|
||||
}
|
||||
|
||||
int IngameBlockSelectionScreen::getSlotHeight() {
|
||||
// same as non-touch implementation
|
||||
return 22;
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::mouseClicked(int x, int y, int buttonNum) {
|
||||
_pendingClose = _blockList->_clickArea->isInside((float)x, (float)y);
|
||||
if (!_pendingClose)
|
||||
super::mouseClicked(x, y, buttonNum);
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::mouseReleased(int x, int y, int buttonNum) {
|
||||
if (_pendingClose && _blockList->_clickArea->isInside((float)x, (float)y))
|
||||
minecraft->setScreen(NULL);
|
||||
else
|
||||
super::mouseReleased(x, y, buttonNum);
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::mouseWheel(int dx, int dy, int xm, int ym)
|
||||
{
|
||||
if (dy == 0) return;
|
||||
if (_blockList) {
|
||||
float amount = -dy * getSlotHeight();
|
||||
_blockList->scrollBy(0, amount);
|
||||
}
|
||||
int cols = InventoryColumns;
|
||||
int maxIndex = InventorySize - 1;
|
||||
int idx = selectedItem;
|
||||
if (dy > 0) {
|
||||
if (idx >= cols) idx -= cols;
|
||||
} else {
|
||||
if (idx + cols <= maxIndex) idx += cols;
|
||||
}
|
||||
selectedItem = idx;
|
||||
}
|
||||
|
||||
bool IngameBlockSelectionScreen::addItem(const InventoryPane* pane, int itemId)
|
||||
{
|
||||
Inventory* inventory = minecraft->player->inventory;
|
||||
itemId += Inventory::MAX_SELECTION_SIZE;
|
||||
|
||||
if (!inventory->getItem(itemId))
|
||||
return false;
|
||||
|
||||
inventory->moveToSelectionSlot(0, itemId, true);
|
||||
|
||||
inventory->selectSlot(0);
|
||||
#ifdef __APPLE__
|
||||
minecraft->soundEngine->playUI("random.pop", 0.3f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random()));
|
||||
#else
|
||||
minecraft->soundEngine->playUI("random.pop2", 1.0f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random()));
|
||||
#endif
|
||||
|
||||
// Flash the selected gui item
|
||||
minecraft->gui.flashSlot(inventory->selected);
|
||||
return true;
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::tick()
|
||||
{
|
||||
_blockList->tick();
|
||||
super::tick();
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::render( int xm, int ym, float a )
|
||||
{
|
||||
glDisable2(GL_DEPTH_TEST);
|
||||
glEnable2(GL_BLEND);
|
||||
|
||||
Screen::render(xm, ym, a);
|
||||
_blockList->render(xm, ym, a);
|
||||
|
||||
// render frame
|
||||
IntRectangle& bbox = _blockList->rect;
|
||||
Tesselator::instance.colorABGR(0xffffffff);
|
||||
minecraft->textures->loadAndBindTexture("gui/itemframe.png");
|
||||
glEnable2(GL_BLEND);
|
||||
glColor4f2(1, 1, 1, 1);
|
||||
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
blit(0, bbox.y-By, 0, 0, width, bbox.h+By+By, 215, 256); // why bbox.h + 1*B?
|
||||
glDisable2(GL_BLEND);
|
||||
|
||||
glEnable2(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::renderDemoOverlay() {
|
||||
#ifdef DEMO_MODE
|
||||
fill( getSlotPosX(0) - 3, getSlotPosY(1) - 3,
|
||||
getSlotPosX(9) - 3, getSlotPosY(-1) - 3, 0xa0 << 24);
|
||||
|
||||
const int centerX = (getSlotPosX(4) + getSlotPosX(5)) / 2;
|
||||
const int centerY = (getSlotPosY(0) + getSlotPosY(1)) / 2 + 5;
|
||||
drawCenteredString(minecraft->font, demoVersionString, centerX, centerY, 0xffffffff);
|
||||
#endif /*DEMO_MODE*/
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::buttonClicked(Button* button) {
|
||||
if (button->id == bDone.id)
|
||||
minecraft->setScreen(NULL);
|
||||
|
||||
if (button->id == bMenu.id)
|
||||
minecraft->screenChooser.setScreen(SCREEN_PAUSE);
|
||||
|
||||
if (button->id == bCraft.id)
|
||||
minecraft->setScreen(new WorkbenchScreen(Recipe::SIZE_2X2));
|
||||
|
||||
if (button == &bArmor)
|
||||
minecraft->setScreen(new ArmorScreen());
|
||||
}
|
||||
|
||||
bool IngameBlockSelectionScreen::isAllowed( int slot )
|
||||
{
|
||||
const int gridCount = minecraft->player->inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE;
|
||||
if (slot < 0 || slot >= gridCount)
|
||||
return false;
|
||||
|
||||
#ifdef DEMO_MODE
|
||||
if (slot >= (minecraft->isCreativeMode()? 28 : 27)) return false;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IngameBlockSelectionScreen::hasClippingArea( IntRectangle& out )
|
||||
{
|
||||
out = clippingArea;
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<const ItemInstance*> IngameBlockSelectionScreen::getItems( const InventoryPane* forPane )
|
||||
{
|
||||
std::vector<const ItemInstance*> out;
|
||||
for (int i = Inventory::MAX_SELECTION_SIZE; i < minecraft->player->inventory->getContainerSize(); ++i)
|
||||
out.push_back(minecraft->player->inventory->getItem(i));
|
||||
return out;
|
||||
}
|
||||
|
||||
}
|
||||
#include "TouchIngameBlockSelectionScreen.h"
|
||||
#include "../crafting/WorkbenchScreen.h"
|
||||
#include "../../Screen.h"
|
||||
#include "../../components/ImageButton.h"
|
||||
#include "../../components/InventoryPane.h"
|
||||
#include "../../../gamemode/GameMode.h"
|
||||
#include "../../../renderer/TileRenderer.h"
|
||||
#include "../../../player/LocalPlayer.h"
|
||||
#include "../../../renderer/gles.h"
|
||||
#include "../../../renderer/entity/ItemRenderer.h"
|
||||
#include "../../../renderer/Tesselator.h"
|
||||
#include "../../../renderer/Textures.h"
|
||||
#include "../../../Minecraft.h"
|
||||
#include "../../../sound/SoundEngine.h"
|
||||
#include "../../../../world/entity/player/Inventory.h"
|
||||
#include "../../../../platform/input/Mouse.h"
|
||||
#include "../../../../util/Mth.h"
|
||||
#include "../../../../world/item/ItemInstance.h"
|
||||
#include "../../../../world/entity/player/Player.h"
|
||||
#include "../../../../world/item/crafting/Recipe.h"
|
||||
#include "../../../player/input/touchscreen/TouchAreaModel.h"
|
||||
#include "../ArmorScreen.h"
|
||||
|
||||
namespace Touch {
|
||||
|
||||
#if defined(__APPLE__)
|
||||
static const std::string demoVersionString("Not available in the Lite version");
|
||||
#else
|
||||
static const std::string demoVersionString("Not available in the demo version");
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
static const float BorderPixels = 4;
|
||||
#ifdef DEMO_MODE
|
||||
static const float BlockPixels = 22;
|
||||
#else
|
||||
static const float BlockPixels = 22;
|
||||
#endif
|
||||
#else
|
||||
static const float BorderPixels = 4;
|
||||
static const float BlockPixels = 24;
|
||||
#endif
|
||||
|
||||
static const int ItemSize = (int)(BlockPixels + 2*BorderPixels);
|
||||
|
||||
static const int Bx = 10; // Border Frame width
|
||||
static const int By = 6; // Border Frame height
|
||||
|
||||
//
|
||||
// Block selection screen
|
||||
//
|
||||
IngameBlockSelectionScreen::IngameBlockSelectionScreen()
|
||||
: selectedItem(0),
|
||||
_blockList(NULL),
|
||||
_pendingClose(false),
|
||||
bArmor (4, "Armor"),
|
||||
bDone (3, ""),
|
||||
//bDone (3, "Done"),
|
||||
bMenu (2, "Menu"),
|
||||
bCraft (1, "Craft"),
|
||||
bHeader (0, "Select blocks")
|
||||
{
|
||||
}
|
||||
|
||||
IngameBlockSelectionScreen::~IngameBlockSelectionScreen()
|
||||
{
|
||||
delete _blockList;
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::init()
|
||||
{
|
||||
Inventory* inventory = minecraft->player->inventory;
|
||||
|
||||
//const int itemWidth = 2 * BorderPixels +
|
||||
|
||||
int maxWidth = width - Bx - Bx;
|
||||
InventoryColumns = maxWidth / ItemSize;
|
||||
const int realWidth = InventoryColumns * ItemSize;
|
||||
const int realBx = (width - realWidth) / 2;
|
||||
|
||||
IntRectangle rect(realBx,
|
||||
#ifdef __APPLE__
|
||||
24 + By - ((width==240)?1:0), realWidth, ((width==240)?1:0) + height-By-By-20-24);
|
||||
#else
|
||||
24 + By, realWidth, height-By-By-20-24);
|
||||
#endif
|
||||
|
||||
_blockList = new InventoryPane(this, minecraft, rect, width, BorderPixels, inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE, ItemSize, (int)BorderPixels);
|
||||
_blockList->fillMarginX = realBx;
|
||||
|
||||
//for (int i = 0; i < inventory->getContainerSize(); ++i)
|
||||
//LOGI("> %d - %s\n", i, inventory->getItem(i)? inventory->getItem(i)->getDescriptionId().c_str() : "<-->\n");
|
||||
|
||||
InventorySize = inventory->getContainerSize();
|
||||
InventoryRows = 1 + (InventorySize-1) / InventoryColumns;
|
||||
|
||||
//
|
||||
// Buttons
|
||||
//
|
||||
ImageDef def;
|
||||
def.name = "gui/spritesheet.png";
|
||||
def.x = 0;
|
||||
def.y = 1;
|
||||
def.width = def.height = 18;
|
||||
def.setSrc(IntRectangle(60, 0, 18, 18));
|
||||
bDone.setImageDef(def, true);
|
||||
bDone.width = bDone.height = 19;
|
||||
|
||||
bDone.scaleWhenPressed = false;
|
||||
|
||||
buttons.push_back(&bHeader);
|
||||
buttons.push_back(&bDone);
|
||||
if (!minecraft->isCreativeMode()) {
|
||||
buttons.push_back(&bCraft);
|
||||
buttons.push_back(&bArmor);
|
||||
}
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::setupPositions() {
|
||||
bHeader.y = bDone.y = bCraft.y = 0;
|
||||
bDone.x = width - bDone.width;
|
||||
bCraft.x = 0;//width - bDone.w - bCraft.w;
|
||||
bCraft.width = bArmor.width = 48;
|
||||
bArmor.x = bCraft.width;
|
||||
|
||||
if (minecraft->isCreativeMode()) {
|
||||
bHeader.x = 0;
|
||||
bHeader.width = width;// - bDone.w;
|
||||
bHeader.xText = width/2; // Center of the screen
|
||||
} else {
|
||||
bHeader.x = bCraft.width + bArmor.width;
|
||||
bHeader.width = width - bCraft.width - bArmor.width;// - bDone.w;
|
||||
bHeader.xText = bHeader.x + (bHeader.width - bDone.width) /2;
|
||||
}
|
||||
|
||||
clippingArea.x = 0;
|
||||
clippingArea.w = minecraft->width;
|
||||
clippingArea.y = 0;
|
||||
clippingArea.h = (int)(Gui::GuiScale * 24);
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::removed()
|
||||
{
|
||||
minecraft->gui.inventoryUpdated();
|
||||
}
|
||||
|
||||
int IngameBlockSelectionScreen::getSlotPosX(int slotX) {
|
||||
// @todo: Number of columns
|
||||
return width / 2 - InventoryColumns * 10 + slotX * 20 + 2;
|
||||
}
|
||||
|
||||
int IngameBlockSelectionScreen::getSlotPosY(int slotY) {
|
||||
return height - 16 - 3 - 22 * 2 - 22 * slotY;
|
||||
}
|
||||
|
||||
int IngameBlockSelectionScreen::getSlotHeight() {
|
||||
// same as non-touch implementation
|
||||
return 22;
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::mouseClicked(int x, int y, int buttonNum) {
|
||||
_pendingClose = _blockList->_clickArea->isInside((float)x, (float)y);
|
||||
if (!_pendingClose)
|
||||
super::mouseClicked(x, y, buttonNum);
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::mouseReleased(int x, int y, int buttonNum) {
|
||||
if (_pendingClose && _blockList->_clickArea->isInside((float)x, (float)y))
|
||||
minecraft->setScreen(NULL);
|
||||
else
|
||||
super::mouseReleased(x, y, buttonNum);
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::mouseWheel(int dx, int dy, int xm, int ym)
|
||||
{
|
||||
if (dy == 0) return;
|
||||
if (_blockList) {
|
||||
float amount = -dy * getSlotHeight();
|
||||
_blockList->scrollBy(0, amount);
|
||||
}
|
||||
int cols = InventoryColumns;
|
||||
int maxIndex = InventorySize - 1;
|
||||
int idx = selectedItem;
|
||||
if (dy > 0) {
|
||||
if (idx >= cols) idx -= cols;
|
||||
} else {
|
||||
if (idx + cols <= maxIndex) idx += cols;
|
||||
}
|
||||
selectedItem = idx;
|
||||
}
|
||||
|
||||
bool IngameBlockSelectionScreen::addItem(const InventoryPane* pane, int itemId)
|
||||
{
|
||||
Inventory* inventory = minecraft->player->inventory;
|
||||
itemId += Inventory::MAX_SELECTION_SIZE;
|
||||
|
||||
if (!inventory->getItem(itemId))
|
||||
return false;
|
||||
|
||||
inventory->moveToSelectionSlot(0, itemId, true);
|
||||
|
||||
inventory->selectSlot(0);
|
||||
#ifdef __APPLE__
|
||||
minecraft->soundEngine->playUI("random.pop", 0.3f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random()));
|
||||
#else
|
||||
minecraft->soundEngine->playUI("random.pop2", 1.0f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random()));
|
||||
#endif
|
||||
|
||||
// Flash the selected gui item
|
||||
minecraft->gui.flashSlot(inventory->selected);
|
||||
return true;
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::tick()
|
||||
{
|
||||
_blockList->tick();
|
||||
super::tick();
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::render( int xm, int ym, float a )
|
||||
{
|
||||
glDisable2(GL_DEPTH_TEST);
|
||||
glEnable2(GL_BLEND);
|
||||
|
||||
Screen::render(xm, ym, a);
|
||||
_blockList->render(xm, ym, a);
|
||||
|
||||
// render frame
|
||||
IntRectangle& bbox = _blockList->rect;
|
||||
Tesselator::instance.colorABGR(0xffffffff);
|
||||
minecraft->textures->loadAndBindTexture("gui/itemframe.png");
|
||||
glEnable2(GL_BLEND);
|
||||
glColor4f2(1, 1, 1, 1);
|
||||
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
blit(0, bbox.y-By, 0, 0, width, bbox.h+By+By, 215, 256); // why bbox.h + 1*B?
|
||||
glDisable2(GL_BLEND);
|
||||
|
||||
glEnable2(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::renderDemoOverlay() {
|
||||
#ifdef DEMO_MODE
|
||||
fill( getSlotPosX(0) - 3, getSlotPosY(1) - 3,
|
||||
getSlotPosX(9) - 3, getSlotPosY(-1) - 3, 0xa0 << 24);
|
||||
|
||||
const int centerX = (getSlotPosX(4) + getSlotPosX(5)) / 2;
|
||||
const int centerY = (getSlotPosY(0) + getSlotPosY(1)) / 2 + 5;
|
||||
drawCenteredString(minecraft->font, demoVersionString, centerX, centerY, 0xffffffff);
|
||||
#endif /*DEMO_MODE*/
|
||||
}
|
||||
|
||||
void IngameBlockSelectionScreen::buttonClicked(Button* button) {
|
||||
if (button->id == bDone.id)
|
||||
minecraft->setScreen(NULL);
|
||||
|
||||
if (button->id == bMenu.id)
|
||||
minecraft->screenChooser.setScreen(SCREEN_PAUSE);
|
||||
|
||||
if (button->id == bCraft.id)
|
||||
minecraft->setScreen(new WorkbenchScreen(Recipe::SIZE_2X2));
|
||||
|
||||
if (button == &bArmor)
|
||||
minecraft->setScreen(new ArmorScreen());
|
||||
}
|
||||
|
||||
bool IngameBlockSelectionScreen::isAllowed( int slot )
|
||||
{
|
||||
if (slot < 0 || slot >= minecraft->player->inventory->getContainerSize())
|
||||
return false;
|
||||
|
||||
#ifdef DEMO_MODE
|
||||
if (slot >= (minecraft->isCreativeMode()? 28 : 27)) return false;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IngameBlockSelectionScreen::hasClippingArea( IntRectangle& out )
|
||||
{
|
||||
out = clippingArea;
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<const ItemInstance*> IngameBlockSelectionScreen::getItems( const InventoryPane* forPane )
|
||||
{
|
||||
std::vector<const ItemInstance*> out;
|
||||
for (int i = Inventory::MAX_SELECTION_SIZE; i < minecraft->player->inventory->getContainerSize(); ++i)
|
||||
out.push_back(minecraft->player->inventory->getItem(i));
|
||||
return out;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -86,21 +86,21 @@ public:
|
||||
SelectWorldScreen();
|
||||
virtual ~SelectWorldScreen();
|
||||
|
||||
virtual void init() override;
|
||||
virtual void setupPositions() override;
|
||||
virtual void init();
|
||||
virtual void setupPositions();
|
||||
|
||||
virtual void tick() override;
|
||||
virtual void render(int xm, int ym, float a) override;
|
||||
virtual void tick();
|
||||
virtual void render(int xm, int ym, float a);
|
||||
|
||||
virtual bool isIndexValid(int index);
|
||||
virtual bool handleBackEvent(bool isDown) override;
|
||||
virtual void buttonClicked(Button* button) override;
|
||||
virtual void keyPressed(int eventKey) override;
|
||||
virtual bool handleBackEvent(bool isDown);
|
||||
virtual void buttonClicked(Button* button);
|
||||
virtual void keyPressed(int eventKey);
|
||||
|
||||
// support for mouse wheel when desktop code uses touch variant
|
||||
virtual void mouseWheel(int dx, int dy, int xm, int ym) override;
|
||||
|
||||
bool isInGameScreen() override;
|
||||
bool isInGameScreen();
|
||||
private:
|
||||
void loadLevelSource();
|
||||
std::string getUniqueLevelName(const std::string& level);
|
||||
|
||||
@@ -24,15 +24,12 @@
|
||||
#include "../../platform/HttpClient.h"
|
||||
#include "../../platform/CThread.h"
|
||||
#include "../../util/StringUtils.h"
|
||||
#include "client/Options.h"
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <direct.h>
|
||||
#include <sys/stat.h>
|
||||
#else
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
#ifndef STANDALONE_SERVER
|
||||
@@ -188,33 +185,6 @@ static bool ensureDirectoryExists(const std::string& path) {
|
||||
return _mkdir(path.c_str()) == 0 || errno == EEXIST;
|
||||
#else
|
||||
struct stat st;
|
||||
if (stat(path.c_str(), &st) == 0 && S_ISDIR(st.st_mode))
|
||||
return true;
|
||||
|
||||
std::string subPath;
|
||||
size_t i = 0;
|
||||
while (i < path.length()) {
|
||||
i = path.find_first_of("/\\", i);
|
||||
if (i == std::string::npos) {
|
||||
subPath = path;
|
||||
} else {
|
||||
subPath = path.substr(0, i);
|
||||
}
|
||||
|
||||
if (!subPath.empty()) {
|
||||
if (stat(subPath.c_str(), &st) != 0) {
|
||||
if (mkdir(subPath.c_str(), 0755) != 0 && errno != EEXIST)
|
||||
return false;
|
||||
} else if (!S_ISDIR(st.st_mode)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == std::string::npos)
|
||||
break;
|
||||
i += 1;
|
||||
}
|
||||
|
||||
if (stat(path.c_str(), &st) == 0 && S_ISDIR(st.st_mode))
|
||||
return true;
|
||||
return mkdir(path.c_str(), 0755) == 0 || errno == EEXIST;
|
||||
@@ -256,7 +226,6 @@ static void* fetchSkinForPlayer(void* param) {
|
||||
std::string skinUrl = getSkinUrlForUsername(player->name);
|
||||
if (skinUrl.empty()) {
|
||||
LOGW("[Skin] skin URL lookup failed for %s\n", player->name.c_str());
|
||||
player->setTextureName("mob/char.png");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -264,7 +233,6 @@ static void* fetchSkinForPlayer(void* param) {
|
||||
std::vector<unsigned char> skinData;
|
||||
if (!HttpClient::download(skinUrl, skinData) || skinData.empty()) {
|
||||
LOGW("[Skin] download failed for %s\n", skinUrl.c_str());
|
||||
player->setTextureName("mob/char.png");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -274,13 +242,11 @@ static void* fetchSkinForPlayer(void* param) {
|
||||
fwrite(skinData.data(), 1, skinData.size(), fp);
|
||||
fclose(fp);
|
||||
LOGI("[Skin] cached skin to %s\n", cacheFile.c_str());
|
||||
|
||||
player->setTextureName("skins/" + player->name + ".png");
|
||||
} else {
|
||||
} else {
|
||||
LOGW("[Skin] failed to write skin cache %s\n", cacheFile.c_str());
|
||||
player->setTextureName("mob/char.png");
|
||||
}
|
||||
|
||||
player->setTextureName("skins/" + player->name + ".png");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -321,12 +287,11 @@ static void* fetchCapeForPlayer(void* param) {
|
||||
fwrite(capeData.data(), 1, capeData.size(), fp);
|
||||
fclose(fp);
|
||||
LOGI("[Cape] cached cape to %s\n", cacheFile.c_str());
|
||||
|
||||
player->setCapeTextureName("capes/" + player->name + ".png");
|
||||
} else {
|
||||
LOGW("[Cape] failed to write cape cache %s\n", cacheFile.c_str());
|
||||
}
|
||||
|
||||
player->setCapeTextureName("capes/" + player->name + ".png");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -345,7 +310,7 @@ static bool isJumpable(int tileId) {
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
LocalPlayer::LocalPlayer(Minecraft* minecraft, Level* level, const std::string& username, int dimension, bool isCreative)
|
||||
LocalPlayer::LocalPlayer(Minecraft* minecraft, Level* level, User* user, int dimension, bool isCreative)
|
||||
: Player(level, isCreative),
|
||||
minecraft(minecraft),
|
||||
input(NULL),
|
||||
@@ -359,15 +324,11 @@ LocalPlayer::LocalPlayer(Minecraft* minecraft, Level* level, const std::string&
|
||||
{
|
||||
this->dimension = dimension;
|
||||
_init();
|
||||
|
||||
#ifndef STANDALONE_SERVER
|
||||
|
||||
if (minecraft->options.getStringValue(OPTIONS_USERNAME).size() != 0) {
|
||||
textureName = "mob/char.png";
|
||||
|
||||
this->name = minecraft->options.getStringValue(OPTIONS_USERNAME);
|
||||
printf("test \n");
|
||||
if (user != NULL && !user->name.empty()) {
|
||||
this->name = user->name;
|
||||
// Fetch user skin and cape from Mojang servers in the background (avoids blocking the main thread)
|
||||
// TODO: Fix this memory leak
|
||||
new CThread(fetchSkinForPlayer, this);
|
||||
new CThread(fetchCapeForPlayer, this);
|
||||
}
|
||||
@@ -388,15 +349,9 @@ void LocalPlayer::calculateFlight(float xa, float ya, float za) {
|
||||
ya = 0;
|
||||
za = za * flySpeed;
|
||||
|
||||
if (sprinting) {
|
||||
float sprintBoost = getWalkingSpeedModifier(); // 1.3x
|
||||
xa *= sprintBoost;
|
||||
za *= sprintBoost;
|
||||
}
|
||||
|
||||
#ifdef ANDROID
|
||||
if (Keyboard::isKeyDown(103)) ya = .2f * flySpeed;
|
||||
if (Keyboard::isKeyDown(102)) ya = -.2f * flySpeed;
|
||||
if (Keyboard::isKeyDown(103)) ya = .2f * minecraft->options.flySpeed;
|
||||
if (Keyboard::isKeyDown(102)) ya = -.2f * minecraft->options.flySpeed;
|
||||
#else
|
||||
if (Keyboard::isKeyDown(Keyboard::KEY_E)) ya = .2f * flySpeed;
|
||||
if (Keyboard::isKeyDown(Keyboard::KEY_Q)) ya = -.2f * flySpeed;
|
||||
@@ -512,7 +467,7 @@ void LocalPlayer::aiStep() {
|
||||
if (sprintDoubleTapTimer > 0) sprintDoubleTapTimer--;
|
||||
prevForwardHeld = forwardHeld;
|
||||
}
|
||||
if (input->sneaking)
|
||||
if (input->sneaking || abilities.flying)
|
||||
sprinting = false;
|
||||
|
||||
if (input->sneaking) {
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
//package net.minecraft.client.player;
|
||||
|
||||
#include "input/IMoveInput.h"
|
||||
#include "../User.h"
|
||||
#include "../../platform/input/Keyboard.h"
|
||||
#include "../../util/SmoothFloat.h"
|
||||
#include "../../world/entity/player/Player.h"
|
||||
|
||||
@@ -15,7 +17,7 @@ class LocalPlayer: public Player
|
||||
{
|
||||
typedef Player super;
|
||||
public:
|
||||
LocalPlayer(Minecraft* minecraft, Level* level, const std::string& username, int dimension, bool isCreative);
|
||||
LocalPlayer(Minecraft* minecraft, Level* level, User* user, int dimension, bool isCreative);
|
||||
~LocalPlayer();
|
||||
|
||||
void _init();
|
||||
|
||||
@@ -50,8 +50,10 @@ void KeyboardInput::tick( Player* player )
|
||||
ya *= 0.3f;
|
||||
}
|
||||
|
||||
wantUp = jumping;
|
||||
wantDown = sneaking;
|
||||
#if defined(RPI) || defined(PLATFORM_DESKTOP)
|
||||
wantUp = jumping;
|
||||
wantDown = sneaking;
|
||||
#endif
|
||||
|
||||
if (keys[KEY_CRAFT])
|
||||
player->startCrafting((int)player->x, (int)player->y, (int)player->z, Recipe::SIZE_2X2);
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
//package net.minecraft.client.player;
|
||||
|
||||
#include "KeyboardInput.h"
|
||||
#include "platform/input/Controller.h"
|
||||
#include "world/entity/player/Player.h"
|
||||
|
||||
// @note: This is just copy-pasted from KeyboardInput right now.
|
||||
class XperiaPlayInput: public KeyboardInput
|
||||
|
||||
@@ -426,7 +426,9 @@ public:
|
||||
virtual void onConfigChanged(const Config& c) {
|
||||
_move.onConfigChanged(c);
|
||||
_turnBuild.moveArea = _move.getRectangleArea();
|
||||
#ifdef __APPLE__
|
||||
_turnBuild.pauseArea = _move.getPauseRectangleArea();
|
||||
#endif
|
||||
_turnBuild.inventoryArea = _mc->gui.getRectangleArea( _mc->options.getBooleanValue(OPTIONS_IS_LEFT_HANDED)? 1 : -1 );
|
||||
_turnBuild.setSensitivity(c.options->getBooleanValue(OPTIONS_IS_JOY_TOUCH_AREA)? 1.8f : 1.0f);
|
||||
((ITurnInput*)&_turnBuild)->onConfigChanged(c);
|
||||
|
||||
@@ -9,10 +9,7 @@
|
||||
#include "../../../../platform/log.h"
|
||||
#include "../../../renderer/Textures.h"
|
||||
#include "../../../sound/SoundEngine.h"
|
||||
#include "client/gui/screens/ScreenChooser.h"
|
||||
|
||||
|
||||
// ARGHHHHHH WHY NOT FUCKING ENUM
|
||||
static const int AREA_DPAD_FIRST = 100;
|
||||
static const int AREA_DPAD_N = 100;
|
||||
static const int AREA_DPAD_S = 101;
|
||||
@@ -20,7 +17,6 @@ static const int AREA_DPAD_W = 102;
|
||||
static const int AREA_DPAD_E = 103;
|
||||
static const int AREA_DPAD_C = 104;
|
||||
static const int AREA_PAUSE = 105;
|
||||
static const int AREA_CHAT = 106;
|
||||
|
||||
static int cPressed = 0;
|
||||
static int cReleased = 0;
|
||||
@@ -130,8 +126,8 @@ void TouchscreenInput_TestFps::onConfigChanged(const Config& c) {
|
||||
|
||||
// If too large (like playing on Tablet)
|
||||
PixelCalc& pc = _minecraft->pixelCalc;
|
||||
if (pc.pixelsToMillimeters(Bw) > 200) { //14
|
||||
Bw = Bh = pc.millimetersToPixels(200); //14
|
||||
if (pc.pixelsToMillimeters(Bw) > 14) {
|
||||
Bw = Bh = pc.millimetersToPixels(14);
|
||||
}
|
||||
// temp data
|
||||
float xx;
|
||||
@@ -162,11 +158,14 @@ void TouchscreenInput_TestFps::onConfigChanged(const Config& c) {
|
||||
xx = BaseX + 2 * Bw; yy = BaseY + Bh;
|
||||
_model.addArea(AREA_DPAD_E, aRight = new RectangleArea(xx, yy, xx+Bw, yy+Bh));
|
||||
|
||||
#ifdef __APPLE__
|
||||
float maxPixels = _minecraft->pixelCalc.millimetersToPixels(10);
|
||||
// float btnSize = Mth::Min(18 * Gui::GuiScale, maxPixels);
|
||||
float btnSize = pc.millimetersToPixels(18 * Gui::GuiScale);
|
||||
_model.addArea(AREA_PAUSE, aPause = new RectangleArea(w - 4 - btnSize, 4, w - 4, 4 + btnSize));
|
||||
_model.addArea(AREA_CHAT, aChat = new RectangleArea(w - 8 - btnSize * 2, 4, w - 8 - btnSize, 4 + btnSize));
|
||||
float btnSize = Mth::Min(18 * Gui::GuiScale, maxPixels);
|
||||
_model.addArea(AREA_PAUSE, aPause = new RectangleArea(w - 4 - btnSize,
|
||||
4,
|
||||
w - 4,
|
||||
4 + btnSize));
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
//rebuild();
|
||||
}
|
||||
@@ -310,20 +309,14 @@ void TouchscreenInput_TestFps::tick( Player* player )
|
||||
setButton = true;
|
||||
xa -= 1;
|
||||
}
|
||||
#ifdef __APPLE__
|
||||
else if (areaId == AREA_PAUSE) {
|
||||
if (Multitouch::isReleased(p)) {
|
||||
_minecraft->soundEngine->playUI("random.click", 1, 1);
|
||||
_minecraft->screenChooser.setScreen(SCREEN_PAUSE);
|
||||
}
|
||||
}
|
||||
else if (areaId == AREA_CHAT) {
|
||||
if (Multitouch::isReleased(p)) {
|
||||
_minecraft->soundEngine->playUI("random.click", 1, 1);
|
||||
_minecraft->screenChooser.setScreen(SCREEN_CONSOLE);
|
||||
_minecraft->platform()->showKeyboard();
|
||||
}
|
||||
}
|
||||
|
||||
#endif /*__APPLE__*/
|
||||
_buttons[areaId - AREA_DPAD_FIRST] = setButton;
|
||||
}
|
||||
|
||||
@@ -506,14 +499,15 @@ void TouchscreenInput_TestFps::rebuild() {
|
||||
drawRectangleArea(t, aJump, imageU + imageSize * 4, imageV, (float)imageSize);
|
||||
}
|
||||
|
||||
|
||||
#ifdef __APPLE__
|
||||
if (!_minecraft->screen) {
|
||||
t.colorABGR(0xFFFFFFFF);
|
||||
// if (isButtonDown(AREA_PAUSE)) t.colorABGR(cPressedPause);
|
||||
// else t.colorABGR(cReleasedPause);
|
||||
if (isButtonDown(AREA_PAUSE)) t.colorABGR(cPressedPause);
|
||||
else t.colorABGR(cReleasedPause);
|
||||
|
||||
drawRectangleArea(t, aPause, 200, 64, 18.0f);
|
||||
drawRectangleArea(t, aChat, 200, 82, 18.0f);
|
||||
}
|
||||
#endif /*__APPLE__*/
|
||||
//t.end(true, _bufferId);
|
||||
//return;
|
||||
|
||||
|
||||
@@ -61,7 +61,6 @@ private:
|
||||
RectangleArea* aUp;
|
||||
RectangleArea* aDown;
|
||||
RectangleArea* aPause;
|
||||
RectangleArea* aChat;
|
||||
//RectangleArea* aUpJump;
|
||||
RectangleArea* aJump;
|
||||
RectangleArea* aUpLeft;
|
||||
|
||||
@@ -7,10 +7,6 @@
|
||||
#include "../../world/level/Region.h"
|
||||
#include "../../world/level/chunk/LevelChunk.h"
|
||||
#include "../../util/Mth.h"
|
||||
|
||||
#include "../../world/level/biome/BiomeSource.h"
|
||||
|
||||
#include "../../world/level/Level.h"
|
||||
//#include "../../platform/time.h"
|
||||
|
||||
/*static*/ int Chunk::updates = 0;
|
||||
@@ -263,4 +259,4 @@ void Chunk::resetUpdates()
|
||||
{
|
||||
updates = 0;
|
||||
//swRebuild.reset();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#include "GameRenderer.h"
|
||||
#include "client/Options.h"
|
||||
#include "gles.h"
|
||||
|
||||
#include "../../util/PerfTimer.h"
|
||||
@@ -153,7 +152,7 @@ void GameRenderer::render(float a) {
|
||||
|
||||
int xMouse = (int)(Mouse::getX() * Gui::InvGuiScale);
|
||||
int yMouse = (int)(Mouse::getY() * Gui::InvGuiScale);
|
||||
|
||||
#ifndef PLATFORM_DESKTOP
|
||||
if (mc->useTouchscreen()) {
|
||||
const int pid = Multitouch::getFirstActivePointerIdExThisUpdate();
|
||||
if (pid >= 0) {
|
||||
@@ -164,6 +163,7 @@ void GameRenderer::render(float a) {
|
||||
yMouse = -9999;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
TIMER_POP();
|
||||
|
||||
bool hasClearedColorBuffer = false;
|
||||
@@ -214,14 +214,12 @@ void GameRenderer::render(float a) {
|
||||
glDisable2(GL_SCISSOR_TEST);
|
||||
|
||||
mc->screen->render(xMouse, yMouse, a);
|
||||
|
||||
mc->platform()->hideCursor(!mc->options.getBooleanValue(OPTIONS_RPI_CURSOR));
|
||||
if (mc->options.getBooleanValue(OPTIONS_RPI_CURSOR))
|
||||
#ifdef RPI
|
||||
renderCursor(xMouse, yMouse, mc);
|
||||
|
||||
// Screen might have been removed, so check it again
|
||||
if (mc->screen && !mc->screen->isInGameScreen())
|
||||
sleepMs(15);
|
||||
#endif
|
||||
// Screen might have been removed, so check it again
|
||||
if (mc->screen && !mc->screen->isInGameScreen())
|
||||
sleepMs(15);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -360,9 +358,9 @@ void GameRenderer::renderLevel(float a) {
|
||||
if (mc->hitResult.isHit() && !cameraEntity->isUnderLiquid(Material::water)) {
|
||||
TIMER_POP_PUSH("select");
|
||||
Player* player = (Player*) cameraEntity;
|
||||
// if (mc->useTouchscreen()) {
|
||||
if (mc->useTouchscreen()) {
|
||||
levelRenderer->renderHitSelect(player, mc->hitResult, 0, NULL, a); //player.inventory->getSelected(), a);
|
||||
// }
|
||||
}
|
||||
levelRenderer->renderHit(player, mc->hitResult, 0, NULL, a);//player->inventory.getSelected(), a);
|
||||
}
|
||||
}
|
||||
@@ -656,9 +654,11 @@ void GameRenderer::pick(float a) {
|
||||
|
||||
float range = mc->gameMode->getPickRange();
|
||||
bool isPicking = true;
|
||||
|
||||
bool freeform = mc->useTouchscreen(); //&& !mc->options.getBooleanValue(OPTIONS_IS_JOY_TOUCH_AREA);
|
||||
|
||||
#ifndef PLATFORM_DESKTOP
|
||||
bool freeform = mc->useTouchscreen() && !mc->options.isJoyTouchArea;
|
||||
#else
|
||||
bool freeform = false;
|
||||
#endif
|
||||
if (freeform) {
|
||||
isPicking = updateFreeformPickDirection(a, pickDirection);
|
||||
} else {
|
||||
|
||||
@@ -25,8 +25,6 @@
|
||||
|
||||
#include "../../client/player/LocalPlayer.h"
|
||||
|
||||
#include "../../world/level/GrassColor.h"
|
||||
|
||||
#ifdef GFX_SMALLER_CHUNKS
|
||||
/* static */ const int LevelRenderer::CHUNK_SIZE = 8;
|
||||
#else
|
||||
@@ -145,10 +143,6 @@ void LevelRenderer::setLevel( Level* level )
|
||||
level->addListener(this);
|
||||
allChanged();
|
||||
}
|
||||
if (mc->options.getBooleanValue(OPTIONS_AMBIENT_OCCLUSION)) {
|
||||
mc->useAmbientOcclusion = !mc->useAmbientOcclusion;
|
||||
allChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void LevelRenderer::allChanged()
|
||||
@@ -161,11 +155,6 @@ void LevelRenderer::allChanged()
|
||||
Tile::leaves_carried->setFancy(fancy);
|
||||
lastViewDistance = mc->options.getIntValue(OPTIONS_VIEW_DISTANCE);
|
||||
|
||||
bool tint = mc->options.getBooleanValue(OPTIONS_FOLIAGE_TINT);
|
||||
FoliageColor::setUseTint(tint);
|
||||
GrassColor::setUseTint(tint);
|
||||
|
||||
|
||||
int dist = (512 >> 3) << (3 - lastViewDistance);
|
||||
if (lastViewDistance <= 2 && mc->isPowerVR())
|
||||
dist = (int)((float)dist * 0.8f);
|
||||
|
||||
@@ -79,9 +79,6 @@ RenderChunk Tesselator::end( bool useMine, int bufferId )
|
||||
const int o_vertices = vertices;
|
||||
|
||||
if (vertices > 0) {
|
||||
if (p <= 0 || p > maxVertices) { clear(); return RenderChunk(); }
|
||||
int bytes = p * sizeof(VERTEX);
|
||||
if (bytes <= 0) return RenderChunk();
|
||||
if (++vboId >= vboCounts)
|
||||
vboId = 0;
|
||||
|
||||
@@ -95,11 +92,11 @@ RenderChunk Tesselator::end( bool useMine, int bufferId )
|
||||
bufferId = vboIds[vboId];
|
||||
#endif
|
||||
int access = GL_STATIC_DRAW;//(accessMode==ACCESS_DYNAMIC) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW;
|
||||
int bytes = p * sizeof(VERTEX);
|
||||
glBindBuffer2(GL_ARRAY_BUFFER, bufferId);
|
||||
glBufferData2(GL_ARRAY_BUFFER, bytes, _varray, access); // GL_STREAM_DRAW
|
||||
|
||||
totalSize += bytes;
|
||||
|
||||
|
||||
#ifndef USE_VBO
|
||||
// 0 1 2 3 4 5 6 7
|
||||
// x y z u v c
|
||||
@@ -267,7 +264,6 @@ void Tesselator::vertex( float x, float y, float z )
|
||||
for (int i = 0; i < 2; i++) {
|
||||
|
||||
const int offs = 3 - i;
|
||||
if (p - offs < 0 || p >= maxVertices) { clear(); return; }
|
||||
VERTEX& src = _varray[p - offs];
|
||||
VERTEX& dst = _varray[p];
|
||||
|
||||
@@ -291,7 +287,6 @@ void Tesselator::vertex( float x, float y, float z )
|
||||
}
|
||||
}
|
||||
|
||||
if (p < 0 || p >= maxVertices) { clear(); return; }
|
||||
VERTEX& vertex = _varray[p];
|
||||
|
||||
if (hasTexture) {
|
||||
@@ -382,15 +377,13 @@ void Tesselator::draw()
|
||||
tesselating = false;
|
||||
|
||||
if (vertices > 0) {
|
||||
if (p <= 0 || p > maxVertices) { clear(); return; }
|
||||
int bytes = p * sizeof(VERTEX);
|
||||
if (bytes <= 0) { clear(); return; }
|
||||
if (++vboId >= vboCounts)
|
||||
vboId = 0;
|
||||
|
||||
int bufferId = vboIds[vboId];
|
||||
|
||||
int access = GL_DYNAMIC_DRAW;//(accessMode==ACCESS_DYNAMIC) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW;
|
||||
int bytes = p * sizeof(VERTEX);
|
||||
glBindBuffer2(GL_ARRAY_BUFFER, bufferId);
|
||||
glBufferData2(GL_ARRAY_BUFFER, bytes, _varray, access); // GL_STREAM_DRAW
|
||||
|
||||
|
||||
@@ -249,37 +249,6 @@ int Textures::crispBlend( int c0, int c1 )
|
||||
return (a << 24) | (r << 16) | (g << 8) | b;
|
||||
}
|
||||
|
||||
// shredder here, moved the code from minecraft.cpp bcus that isnt the right place
|
||||
// had to implement this because i couldn't find a similar function in the code to do this
|
||||
int* Textures::loadTexturePixels(TextureId texId, const std::string& resourceName){
|
||||
|
||||
const TextureData* texture = getTemporaryTextureData(texId); // storing raw pixels
|
||||
|
||||
int size = texture->w * texture->h; // gets the size of our funny lil guy
|
||||
int* pixels = new int[size]; // memory leaks be galore
|
||||
unsigned char* raw = texture->data; // storing raw data into our beloved variable
|
||||
for (int i = 0; i < (texture->w * texture->h); i++){
|
||||
// my head hurts i hate working with this
|
||||
|
||||
|
||||
// uh since each pixel stores r g b a, aka the color channels which are each one byte, we multiply them by 4 to move from one pixel to another
|
||||
|
||||
int r = raw[i * 4 + 0]; // gets us the first channel aka red
|
||||
int g = raw[i * 4 + 1]; // gets us the second channel green
|
||||
int b = raw[i * 4 + 2]; // gets us the third channel blue
|
||||
int a = raw[i * 4 + 3]; // gets us the alpha channel
|
||||
|
||||
// woohoo pixels uh should have been seperated into their colors now hopefully
|
||||
|
||||
// r g b a
|
||||
// ugh we now got to turn it into the AA RR GGBB format aak 0xAARRGGBB
|
||||
// b gets 0 - 7 (8 bits), g gets 7 - 15 (8 bits), r gets 16 - 23 (8 bits), alpha gets the last ones 24 - 31 (8 bits),
|
||||
pixels[i] = (a << 24) | (r << 16) | (g << 8) | (b); // shuld combine them into one 32 bit int unless i did something dumb
|
||||
}
|
||||
return pixels; // your meal has been prepared john colors
|
||||
}
|
||||
|
||||
|
||||
///*public*/ int loadHttpTexture(std::string url, std::string backup) {
|
||||
// HttpTexture texture = httpTextures.get(url);
|
||||
// if (texture != NULL) {
|
||||
|
||||
@@ -44,8 +44,6 @@ public:
|
||||
TextureId assignTexture(const std::string& resourceName, const TextureData& img);
|
||||
const TextureData* getTemporaryTextureData(TextureId id);
|
||||
|
||||
int* loadTexturePixels(TextureId texId, const std::string& resourceName);
|
||||
|
||||
void tick(bool uploadToGraphicsCard);
|
||||
|
||||
void clear();
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include "../../world/level/tile/BedTile.h"
|
||||
#include "../../world/level/tile/StemTile.h"
|
||||
#include "../../world/level/tile/StairTile.h"
|
||||
#include "../../world/level/tile/FireTile.h"
|
||||
#include "../../world/Direction.h"
|
||||
#include "../../world/Facing.h"
|
||||
#include "tileentity/TileEntityRenderer.h"
|
||||
@@ -158,8 +157,8 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z )
|
||||
return tesselateRowInWorld(tt, x, y, z);
|
||||
} else if (shape == Tile::SHAPE_TORCH) {
|
||||
return tesselateTorchInWorld(tt, x, y, z);
|
||||
} else if (shape == Tile::SHAPE_FIRE) {
|
||||
return tesselateFireInWorld(tt, x, y, z);
|
||||
//} else if (shape == Tile::SHAPE_FIRE) {
|
||||
// return tesselateFireInWorld(tt, x, y, z);
|
||||
//} else if (shape == Tile::SHAPE_RED_DUST) {
|
||||
// return tesselateDustInWorld(tt, x, y, z);
|
||||
} else if (shape == Tile::SHAPE_LADDER) {
|
||||
@@ -223,278 +222,6 @@ bool TileRenderer::tesselateTorchInWorld( Tile* tt, int x, int y, int z )
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
||||
{
|
||||
// @todo: fire alpha transparency seems to be scuffed, also it seems i might have messed up the second layer while porting from lce/java , need to look into it - shredder
|
||||
|
||||
Tesselator& t = Tesselator::instance;
|
||||
|
||||
int tex = tt->getTexture(0);
|
||||
|
||||
if (fixedTexture >= 0) tex = fixedTexture;
|
||||
|
||||
float br = tt->getBrightness( level, x, y, z );
|
||||
t.color( br, br, br );
|
||||
|
||||
int xt = ((tex & 0xf) << 4);
|
||||
int yt = tex & 0xf0;
|
||||
|
||||
float u0 = (xt) / 256.0f;
|
||||
float u1 = (xt + 15.99f) / 256.0f;
|
||||
float v0 = (yt) / 256.0f;
|
||||
float v1 = (yt + 15.99f) / 256.0f;
|
||||
float h = 1.4f;
|
||||
|
||||
if ( level->isSolidBlockingTile( x, y - 1, z ) || Tile::fire->canBurn( level, x, y - 1, z ) )
|
||||
{
|
||||
float x0 = x + 0.5f + 0.2f;
|
||||
float x1 = x + 0.5f - 0.2f;
|
||||
float z0 = z + 0.5f + 0.2f;
|
||||
float z1 = z + 0.5f - 0.2f;
|
||||
|
||||
float x0_ = x + 0.5f - 0.3f;
|
||||
float x1_ = x + 0.5f + 0.3f;
|
||||
float z0_ = z + 0.5f - 0.3f;
|
||||
float z1_ = z + 0.5f + 0.3f;
|
||||
|
||||
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v0 ) );
|
||||
|
||||
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v0 ) );
|
||||
|
||||
|
||||
|
||||
u0 = (xt) / 256.0f;
|
||||
u1 = (xt + 15.99f) / 256.0f;
|
||||
v0 = (yt) / 256.0f;
|
||||
v1 = (yt + 15.99f) / 256.0f;
|
||||
|
||||
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||
|
||||
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||
|
||||
x0 = x + 0.5f - 0.5f;
|
||||
x1 = x + 0.5f + 0.5f;
|
||||
z0 = z + 0.5f - 0.5f;
|
||||
z1 = z + 0.5f + 0.5f;
|
||||
|
||||
x0_ = x + 0.5f - 0.4f;
|
||||
x1_ = x + 0.5f + 0.4f;
|
||||
z0_ = z + 0.5f - 0.4f;
|
||||
z1_ = z + 0.5f + 0.4f;
|
||||
|
||||
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v0 ) );
|
||||
|
||||
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v0 ) );
|
||||
|
||||
|
||||
u0 = (xt) / 256.0f;
|
||||
u1 = (xt + 15.99f) / 256.0f;
|
||||
v0 = (yt) / 256.0f;
|
||||
v1 = (yt + 15.99f) / 256.0f;
|
||||
|
||||
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||
|
||||
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
float r = 0.2f;
|
||||
float yo = 1 / 16.0f;
|
||||
if ( ( ( x + y + z ) & 1 ) == 1 )
|
||||
{
|
||||
u0 = (xt) / 256.0f;
|
||||
u1 = (xt + 15.99f) / 256.0f;
|
||||
v0 = (yt) / 256.0f;
|
||||
v1 = (yt + 15.99f) / 256.0f;
|
||||
}
|
||||
if ( ( ( x / 2 + y / 2 + z / 2 ) & 1 ) == 1 )
|
||||
{
|
||||
float tmp = u1;
|
||||
u1 = u0;
|
||||
u0 = tmp;
|
||||
}
|
||||
if ( Tile::fire->canBurn( level, x - 1, y, z ) )
|
||||
{
|
||||
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
|
||||
1.0f ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||
1.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u0 ), ( float )( v0 ) );
|
||||
|
||||
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u0 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||
1.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
|
||||
1.0f ), ( float )( u1 ), ( float )( v0 ) );
|
||||
}
|
||||
if ( Tile::fire->canBurn( level, x + 1, y, z ) )
|
||||
{
|
||||
t.vertexUV( ( float )( x + 1 - r ), ( float )( y + h + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u0 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 1 - 0 ), ( float )( y + 0 + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1 - 0 ), ( float )( y + 0 + yo ), ( float )( z +
|
||||
1.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1 - r ), ( float )( y + h + yo ), ( float )( z +
|
||||
1.0f ), ( float )( u1 ), ( float )( v0 ) );
|
||||
|
||||
t.vertexUV( ( float )( x + 1.0f - r ), ( float )( y + h + yo ), ( float )( z +
|
||||
1.0f ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f - 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||
1.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f - 0 ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f - r ), ( float )( y + h + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u0 ), ( float )( v0 ) );
|
||||
}
|
||||
if ( Tile::fire->canBurn( level, x, y, z - 1 ) )
|
||||
{
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z +
|
||||
r ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z +
|
||||
r ), ( float )( u0 ), ( float )( v0 ) );
|
||||
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z +
|
||||
r ), ( float )( u0 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
|
||||
0.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z +
|
||||
r ), ( float )( u1 ), ( float )( v0 ) );
|
||||
}
|
||||
if ( Tile::fire->canBurn( level, x, y, z + 1 ) )
|
||||
{
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
|
||||
r ), ( float )( u0 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
|
||||
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
|
||||
0.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
|
||||
r ), ( float )( u1 ), ( float )( v0 ) );
|
||||
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
|
||||
r ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
|
||||
0.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
|
||||
0.0f ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
|
||||
r ), ( float )( u0 ), ( float )( v0 ) );
|
||||
}
|
||||
if ( Tile::fire->canBurn( level, x, y + 1.0f, z ) )
|
||||
{
|
||||
double x0 = x + 0.5f + 0.5f;
|
||||
double x1 = x + 0.5f - 0.5f;
|
||||
double z0 = z + 0.5f + 0.5f;
|
||||
double z1 = z + 0.5f - 0.5f;
|
||||
|
||||
double x0_ = x + 0.5f - 0.5f;
|
||||
double x1_ = x + 0.5f + 0.5f;
|
||||
double z0_ = z + 0.5f - 0.5f;
|
||||
double z1_ = z + 0.5f + 0.5f;
|
||||
|
||||
u0 = (xt) / 256.0f;
|
||||
u1 = (xt + 15.99f) / 256.0f;
|
||||
v0 = (yt) / 256.0f;
|
||||
v1 = (yt + 15.99f) / 256.0f;
|
||||
|
||||
y += 1;
|
||||
h = -0.2f;
|
||||
|
||||
if ( ( ( x + y + z ) & 1 ) == 0 )
|
||||
{
|
||||
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z +
|
||||
0 ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z +
|
||||
0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z +
|
||||
1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z +
|
||||
1 ), ( float )( u0 ), ( float )( v0 ) );
|
||||
|
||||
u0 = (xt) / 256.0f;
|
||||
u1 = (xt + 15.99f) / 256.0f;
|
||||
v0 = (yt) / 256.0f;
|
||||
v1 = (yt + 15.99f) / 256.0f;
|
||||
|
||||
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z +
|
||||
1.0f ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x1 ), ( float )( y + 0.0f ), ( float )( z +
|
||||
1.0f ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x1 ), ( float )( y + 0.0f ), ( float )( z +
|
||||
0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z +
|
||||
0 ), ( float )( u0 ), ( float )( v0 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
|
||||
h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
|
||||
0.0f ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
|
||||
0.0f ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
|
||||
h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||
|
||||
u0 = (xt) / 256.0f;
|
||||
u1 = (xt + 15.99f) / 256.0f;
|
||||
v0 = (yt) / 256.0f;
|
||||
v1 = (yt + 15.99f) / 256.0f;
|
||||
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
|
||||
h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) );
|
||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
|
||||
0.0f ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
|
||||
0.0f ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) );
|
||||
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
|
||||
h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool TileRenderer::tesselateLadderInWorld( Tile* tt, int x, int y, int z )
|
||||
{
|
||||
Tesselator& t = Tesselator::instance;
|
||||
|
||||
@@ -34,8 +34,6 @@ public:
|
||||
bool tesselateFenceGateInWorld(FenceGateTile* tt, int x, int y, int z);
|
||||
bool tesselateBedInWorld(Tile *tt, int x, int y, int z);
|
||||
bool tesselateRowInWorld(Tile* tt, int x, int y, int z);
|
||||
bool tesselateFireInWorld(Tile* tt, int x, int y, int z);
|
||||
|
||||
|
||||
void tesselateTorch(Tile* tt, float x, float y, float z, float xxa, float zza);
|
||||
void tesselateCrossTexture(Tile* tt, int data, float x, float y, float z);
|
||||
|
||||
@@ -19,13 +19,12 @@ public:
|
||||
protected:
|
||||
void additionalRendering(Mob* mob, float a);
|
||||
|
||||
private:
|
||||
HumanoidModel* humanoidModel;
|
||||
|
||||
// Last rotation values for cape smoothing (reduces jitter)
|
||||
float lastCapeXRot;
|
||||
float lastCapeZRot;
|
||||
private:
|
||||
// i guess ill keep this just in case seomthing breaks
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT_RENDERER_ENTITY__HumanoidMobRenderer_H__*/
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user