135 Commits

Author SHA1 Message Date
deepfriedwaffles
8615e8ae9f Added iOS comppiling instructions to README 2026-04-05 14:43:35 -04:00
deepfriedwaffles
d88e57f0aa fixed the possible broken header search and added all jobs including ios to publish 2026-04-05 14:43:35 -04:00
Kolyah35
958eaab5c4 FIX: web and android compilation 2026-04-05 14:43:35 -04:00
Kolyah35
c4934cb19b FIX: other platforms compilation 2026-04-05 14:43:35 -04:00
deepfriedwaffles
8f05d4269b Lowered minimum deployment to iOS 12, rather than iOS 14 2026-04-05 14:43:35 -04:00
deepfriedwaffles
8c5f98b60b Update .github/workflows/build.yml
I keep messing this up. For now I am removing all the needs for publish except iOS
2026-04-05 14:43:35 -04:00
deepfriedwaffles
d8961ef83f removed if line from publish to always run it. can we not skip publish thanks 2026-04-05 14:43:35 -04:00
deepfriedwaffles
0099ed531d Fixed bugs in starting the game. ALso added build job for iOS ipa unsigned 2026-04-05 14:43:35 -04:00
deepfriedwaffles
3158f603e2 fixed button not pressable on ios 2026-04-05 14:43:34 -04:00
deepfriedwaffles
dc5f5d1977 IT COMPILESgit add .! also added full screen support. see issues. 2026-04-05 14:43:34 -04:00
deepfriedwaffles
71a8a099ea restore include paths for cross-platform builds because i messed absolutely every #include up. 2026-04-05 14:43:34 -04:00
deepfriedwaffles
d075fb42a2 more refactoring for iOS 2026-04-05 14:43:34 -04:00
deepfriedwaffles
95f4703516 fixed slider for hopefully the final fucking time. Nether Reactor fix: Need to make the array for building it all unsigned integers as now Xcode is strict about the new C++ Standards as they have changed since 2011 2026-04-05 14:43:34 -04:00
deepfriedwaffles
5c1aa7fdaa Synced options UI files from main branch 2026-04-05 14:43:34 -04:00
deepfriedwaffles
bceac853da gonna try changing all Options::Option* in the whole project to just Option* not sure if this works but it gets the compiler to shut up. if this breaks everything change all 'Option*' to 'Options::Option*' as it once was. 2026-04-05 14:43:34 -04:00
deepfriedwaffles
b0d8027295 more header fixes 2026-04-05 14:43:34 -04:00
deepfriedwaffles
b4aa4a220c fix missing file, commiting now because what im about to do might break Option class 2026-04-05 14:43:34 -04:00
deepfriedwaffles
e22e1014f4 added needed missing files 2026-04-05 14:43:34 -04:00
deepfriedwaffles
b4553eb39b Started to port to iOS; fixing compiler errors here and there 2026-04-05 14:43:34 -04:00
Shredder
378dfe8e22 award for brain of a goldfish goes to me 2026-04-03 15:54:48 +05:00
Shredder
61f0124beb oops forgot to define some things 2026-04-03 15:37:15 +05:00
Shredder
ff5c57f6ba Added Foliage and Grass Color tinting, Started Basic Work on restoring ravines, New Option to Toggle Tinting. 2026-04-03 14:55:33 +05:00
Shredder
eac71a93d1 ok this should finally work now 2026-04-02 01:35:06 +05:00
Shredder
fa249728e5 hopefully fixes broken build 2026-04-02 01:19:47 +05:00
Shredder
84e8744387 oops forgot to include the other files. 2026-04-01 23:37:37 +05:00
Shredder
27f0287986 Ported over Spooner Trees (Fancy Trees), Flint and Steel can be used to ignite fire now and modified Forest and Rainforest to generate spooner trees. 2026-04-01 23:31:15 +05:00
Shredder
109bbcfdb1 Added Rendering and Dynamic texture for Fire and it's behaviour 2026-04-01 14:03:38 +05:00
Kolyah35
cbd81b47ce ADD: EpikIzCool to credits 2026-03-24 17:32:52 +03:00
Kolyah35
c146791845 Merge pull request 'Fix Whool and block variations n slabs n stuff' (#13) from EpikIzCool/minecraft-pe-0.6.1:main into main
Reviewed-on: https://192.168.0.2:3000/Kolyah35/minecraft-pe-0.6.1/pulls/13
2026-03-24 16:31:46 +02:00
EpikIzCool
a7c75d2ad2 Touch thingie 2026-03-24 00:29:52 +02:00
EpikIzCool
468ae4a211 Whool Fix part 1 2026-03-24 00:24:16 +02:00
mschiller890
9405e8daad FIXED: Scrolling with mouse wheel improved 2026-03-22 18:38:14 +01:00
mschiller890
bef09a3305 FIXED: sprinting now works when flying 2026-03-22 14:51:22 +01:00
Kolyah35
82f827af29 Merge remote-tracking branch 'refs/remotes/origin/main' 2026-03-22 02:12:46 +03:00
Kolyah35
4f8b18b735 FIX: Now we're using useTouchsceen() right way!!!! 2026-03-22 02:12:04 +03:00
InviseDivine
2acb57d051 revert all sht 2026-03-21 19:19:07 +02:00
InviseDivine
5251085752 i broke all 2026-03-21 19:09:11 +02:00
InviseDivine
a16f76f2b6 idk??? 2026-03-21 19:05:00 +02:00
InviseDivine
b088f39e52 emm 2026-03-21 18:54:51 +02:00
InviseDivine
13c624e07e hmmmmmmmmmm 2026-03-21 18:54:04 +02:00
InviseDivine
2bfa8f11f1 hmm 2026-03-21 18:39:08 +02:00
InviseDivine
98a05e5aa3 FIX: Keyboard on android 2026-03-21 18:25:42 +02:00
InviseDivine
3f6d9cdcb8 FIX: Armor display 2026-03-21 18:10:46 +02:00
InviseDivine
39186069cf Merge branch 'main' of https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1 2026-03-21 16:22:50 +02:00
InviseDivine
b94c16b22a FIX: Bow release 2026-03-21 16:22:50 +02:00
Kolyah35
91ce365a26 Merge remote-tracking branch 'refs/remotes/origin/main' 2026-03-21 17:20:18 +03:00
Kolyah35
f114536463 FIX: improve web port 2026-03-21 17:19:46 +03:00
InviseDivine
6e0615c0bc FEAT: Auto jump in settings (again) 2026-03-21 16:03:51 +02:00
InviseDivine
fd3ee23e4e Merge branch 'main' of https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1 2026-03-21 15:44:06 +02:00
InviseDivine
e9766ed2a1 FEAT: Option button in PauseScreen 2026-03-21 15:44:05 +02:00
Kolyah35
298451c290 USE_LIBPNG when compile web 2026-03-21 15:28:50 +03:00
Kolyah35
668fc9d16f oh i forgot data 2026-03-21 15:25:18 +03:00
Kolyah35
5717aeab24 ADD: Web action 2026-03-21 15:23:37 +03:00
Kolyah35
9af1496b9d FIX: windows CI build 2026-03-21 15:04:50 +03:00
InviseDivine
6bfae5a14e Merge branch 'main' of https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1 2026-03-21 13:43:29 +02:00
InviseDivine
4034cf243d FIX: glfw crash when closing the game 2026-03-21 13:43:28 +02:00
Kolyah35
b6e7414f04 Merge pull request 'fix msvc build & mingw build' (#10) from evildebugger/minecraft-pe-0.6.1:main into main
Reviewed-on: https://192.168.0.2:3000/Kolyah35/minecraft-pe-0.6.1/pulls/10
2026-03-21 12:48:51 +02:00
66hh
83f3284827 fix msvc build & mingw build
1. Include unified header files using lowercase filenames
2. Change special characters to escape sequences to solve encoding issues
2026-03-21 18:32:09 +08:00
Kolyah35
3dab395af3 fix workflow and im done 2026-03-21 02:45:06 +03:00
Kolyah35
011c8f7123 fix mingw build 2026-03-21 02:35:04 +03:00
Kolyah35
f69c009da9 replace pwd with workspace 2026-03-21 01:38:17 +03:00
Kolyah35
b66b4a2dc2 wtf im dumb 2026-03-21 01:35:40 +03:00
Kolyah35
7037b2b5f2 create build dir 2026-03-21 01:33:57 +03:00
Kolyah35
d54e39b332 -_- 2026-03-21 01:32:47 +03:00
Kolyah35
f96ba8bb33 ubuntu 22.04 2026-03-21 01:31:42 +03:00
Kolyah35
f0e1980f59 i dont like xwin anymore 2026-03-21 01:31:35 +03:00
mschiller890
52f607b126 Made some changes to the GUI scale slider.
Should be waaaaaaay better now
2026-03-20 23:20:37 +01:00
Kolyah35
84a956531c and here 2026-03-21 00:56:21 +03:00
Kolyah35
c4f5f22f24 disable module scan 2026-03-21 00:51:35 +03:00
Kolyah35
7867aea042 bruh 2026-03-21 00:43:57 +03:00
Kolyah35
a90e1463ee maybe try geode msvc sdk 2026-03-21 00:41:19 +03:00
Kolyah35
59e820e27f setup ninja 2026-03-21 00:33:59 +03:00
Kolyah35
1199f53632 -_- 2026-03-21 00:28:07 +03:00
Kolyah35
dc0e2c192b oh i forgot headers 2026-03-21 00:23:56 +03:00
Kolyah35
6ef9efa434 maybe ninja? 2026-03-21 00:17:53 +03:00
Kolyah35
72e6537dc5 Merge remote-tracking branch 'refs/remotes/origin/main' 2026-03-21 00:15:24 +03:00
Kolyah35
0e2e7694d3 oops 2026-03-21 00:12:51 +03:00
InviseDivine
45f04ca07b readme fix 2026-03-20 23:08:24 +02:00
InviseDivine
42e7a3da90 Merge branch 'main' of https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1 2026-03-20 23:00:36 +02:00
InviseDivine
0edee15930 FEAT:Raspberry PI cursor in tweaks 2026-03-20 22:59:52 +02:00
mschiller890
753fdbe701 FIXED: support 64x32 + 64x64 skins with fallback for failed skin URL 2026-03-20 21:47:53 +01:00
mschiller890
ac60559a22 FIXED: Saving works on Android now!
I honestly changed too much stuff trying to pinpoint a fix. I might be stupid.
I have no idea what I did that fixed this.
2026-03-20 21:11:17 +01:00
Kolyah35
be6fa57a10 trying to speed up windows build 2026-03-20 23:07:27 +03:00
Kolyah35
68f5bc3a0a why zip only files inside data??? 2026-03-20 22:56:00 +03:00
Kolyah35
0a24a51663 uuuh 2026-03-20 22:43:49 +03:00
Kolyah35
96b17e9c8a tring to pack data with desktop releases 2026-03-20 22:26:26 +03:00
Kolyah35
c08c4d270d specify targets for linux 2026-03-20 22:17:20 +03:00
Kolyah35
8cd74922bf maybe remove that subdir from path? 2026-03-20 22:10:50 +03:00
Kolyah35
b2707cc35d yeah fix shit 2026-03-20 22:03:41 +03:00
Kolyah35
1ff91505d8 FIX: ndk and tools caching 2026-03-20 21:57:57 +03:00
Kolyah35
b909f3c576 EnumOption 2026-03-20 21:53:10 +03:00
Kolyah35
8d1c4f1c4e aaah who did revert my cmake changes 2026-03-20 21:50:45 +03:00
Kolyah35
bc5cbe6b73 Merge remote-tracking branch 'refs/remotes/origin/main' 2026-03-20 21:47:46 +03:00
Kolyah35
cda2534c1e ADD: pause and chat btn 2026-03-20 21:46:43 +03:00
mschiller890
c54bdfdcff Target SDK lowered for compatibility
Setting it to 36 broke some permission things
Still seems like the game can't write anywhere even with r/w permissions...
2026-03-20 19:07:25 +01:00
InviseDivine
d5b2c59ebf FIX: Cmake 2026-03-20 19:14:18 +02:00
Kolyah35
5d415dcca1 Merge remote-tracking branch 'refs/remotes/origin/main' 2026-03-20 19:57:24 +03:00
Kolyah35
a317bf66af FIX: Increased save time 2026-03-20 19:57:00 +03:00
InviseDivine
cb28b78776 Merge branch 'main' of https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1 2026-03-20 18:43:33 +02:00
InviseDivine
6a77ae3c64 FIX: Skins loading 2026-03-20 18:41:28 +02:00
mschiller890
c5fb648df7 FIXED: Android controls no longer tiny 2026-03-20 13:19:57 +01:00
mschiller890
a51f47a108 FIXED: Android 32bit build issues, expanded supported SDKs 2026-03-20 12:57:55 +01:00
mschiller890
017d908c54 armeabi-v7a building should work now.
./build.sh --abi arm64-v8a
./build.sh --abi armeabi-v7a

arm64-v8a is default.
2026-03-20 09:31:34 +01:00
mschiller890
70a45fb446 fixed apk not getting packaged 2026-03-20 09:35:47 +02:00
mschiller890
e0dac8a95c maybe manual caching will be better 2026-03-19 21:37:50 +02:00
mschiller890
1cd73cfc1e hmmmmmmmmmmmmmmmmmmmm... 2026-03-19 21:30:33 +02:00
mschiller890
c1fe428aa3 where are you hiding, r14b NDK 2026-03-19 21:25:44 +02:00
mschiller890
24d3b9488d improve Android build job with cached NDK script 2026-03-19 21:20:15 +02:00
mschiller890
f3f0918e77 SHITSHITSHIT 2026-03-19 20:39:30 +02:00
mschiller890
e190335abe Hopefully added Android building to the workflow
please work
2026-03-19 20:36:41 +02:00
InviseDivine
402b053432 wtf 2026-03-19 20:02:15 +02:00
Kolyah35
0964e3ea4b fix release att 1 2026-03-19 20:57:01 +03:00
Kolyah35
0dc8deac93 fuck i dumbass 2026-03-19 20:32:22 +03:00
Kolyah35
13280cb8a7 fix artifacts att 3 2026-03-19 20:16:04 +03:00
Kolyah35
11117cd4f6 fix artifacts att 2 2026-03-19 19:46:58 +03:00
Kolyah35
78d218ccb1 fix build att 6 2026-03-19 19:31:52 +03:00
Kolyah35
a72c2c4094 FIX: windows build ig 2026-03-19 19:12:00 +03:00
Kolyah35
193f63893d REMOVE: png server dependency 2026-03-19 19:09:40 +03:00
Kolyah35
bb181ca838 AAAAH 2026-03-19 18:59:05 +03:00
Kolyah35
eadbe78f6b -_- 2026-03-19 18:58:00 +03:00
Kolyah35
bfc796b59f oh fu 2026-03-19 18:55:17 +03:00
Kolyah35
04d892c926 ADD: github actions 2026-03-19 18:53:13 +03:00
Kolyah35
e469e03366 REMOVE: all build actions 2026-03-19 17:58:48 +03:00
Kolyah35
ca2af5edb4 ADD: fire (and reduce options writings) 2026-03-19 17:55:22 +03:00
Kolyah35
e49f58bc89 Merge remote-tracking branch 'refs/remotes/origin/main' 2026-03-19 02:27:04 +03:00
Kolyah35
e9914e3fbd ADD: WebASM port (no sound/no network) 2026-03-19 02:26:34 +03:00
InviseDivine
157ef5ff05 FIX: Settings save when leave on escape 2026-03-18 22:50:35 +02:00
Kolyah35
4769d4ae72 minor changes 2026-03-17 23:08:56 +03:00
Kolyah35
d15051aab6 Merge remote-tracking branch 'refs/remotes/origin/main' 2026-03-17 22:50:18 +03:00
Kolyah35
5ff8b54c4f REMOVE: User class 2026-03-17 22:49:59 +03:00
mschiller890
48e3b11c4e can i get a better error please??? 2026-03-17 21:44:23 +02:00
Kolyah35
2c132d5bc7 cache ndk to avoid downloading and extracting :v 2026-03-17 21:59:19 +03:00
Kolyah35
e0a39fb6c1 Merge remote-tracking branch 'refs/remotes/origin/main' 2026-03-17 21:59:16 +03:00
Kolyah35
ccac464750 just a comment 2026-03-17 21:53:15 +03:00
mschiller890
11e986bcf2 FIXED: Android build issues, added building to Andr from Linux
I really hope this didnt break anything
Im proud of the bash script
2026-03-17 19:01:27 +01:00
151 changed files with 4295 additions and 1869 deletions

27
.github/actions/setup-cache/action.yml vendored Normal file
View File

@@ -0,0 +1,27 @@
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 Normal file
View File

@@ -0,0 +1,17 @@
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

View File

@@ -1,36 +0,0 @@
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 Normal file
View File

@@ -0,0 +1,366 @@
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

View File

@@ -1,75 +0,0 @@
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
View File

@@ -3,13 +3,12 @@ build/
out/ out/
bin/ bin/
lib/ lib/
build-apk/
cmake-build-*/ cmake-build-*/
CMakeFiles/ CMakeFiles/
CMakeCache.txt CMakeCache.txt
cmake_install.cmake cmake_install.cmake
Makefile Makefile
*.cmake
!cmake/CPM.cmake
# Compiled object files # Compiled object files
*.o *.o

View File

@@ -6,53 +6,109 @@ include(cmake/CPM.cmake)
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(CMAKE_POLICY_VERSION_MINIMUM 3.10) set(CMAKE_POLICY_VERSION_MINIMUM 3.10)
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") 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.")
endif() endif()
enum_option(PLATFORM "Desktop;Web" "Platform to build for.")
find_package(Threads REQUIRED) find_package(Threads REQUIRED)
find_package(OpenSSL) find_package(OpenSSL)
if (OpenSSL_FOUND)
message(STATUS "found openssl ${OPENSSL_VERSION}") 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")
endif() endif()
CPMAddPackage("gh:madler/zlib@1.3.2") # I totally shocked
CPMAddPackage( if(${PLATFORM} MATCHES "Web")
NAME "libpng" set(PNG_LIB png)
GIT_REPOSITORY "https://github.com/pnggroup/libpng.git" set(AL_LIBTYPE "STATIC")
GIT_TAG "v1.6.55"
EXCLUDE_FROM_ALL TRUE add_library(zlib INTERFACE IMPORTED)
OPTIONS set_target_properties(zlib PROPERTIES
"ZLIB_ROOT ${zlib_SOURCE_DIR}" INTERFACE_LINK_OPTIONS "-sUSE_ZLIB=1"
"ZLIB_INCLUDE_DIRS ${zlib_SOURCE_DIR}" )
"PNG_TOOLS OFF"
"PNG_TESTS OFF" add_library(png INTERFACE IMPORTED)
"BUILD_SHARED_LIBS ON" 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( CPMAddPackage(
NAME "openal" NAME "openal"
GIT_REPOSITORY "https://github.com/kcat/openal-soft.git" GIT_REPOSITORY "https://github.com/kcat/openal-soft.git"
GIT_TAG "1.25.1" GIT_TAG "1.25.1"
EXCLUDE_FROM_ALL TRUE
OPTIONS OPTIONS
"ALSOFT_EXAMPLES OFF" "ALSOFT_EXAMPLES OFF"
"ALSOFT_TESTS OFF" "ALSOFT_TESTS OFF"
"ALSOFT_UTILS OFF" "ALSOFT_UTILS OFF"
"BUILD_SHARED_LIBS ON" "LIBTYPE ${AL_LIBTYPE}"
) "ALSOFT_ENABLE_MODULES OFF"
"ALSOFT_STATIC_STDCXX ON"
CPMAddPackage( "ALSOFT_STATIC_LIBGCC ON"
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 * # TODO: Clear this paths with *
@@ -234,50 +290,32 @@ file(GLOB CLIENT_SOURCES
"src/SharedConstants.cpp" "src/SharedConstants.cpp"
"src/main.cpp" "src/main.cpp"
"src/NinecraftApp.cpp" "src/NinecraftApp.cpp"
"src/AppPlatform_glfw.cpp"
"src/main.cpp"
) )
if(NOT DEFINED PLATFORM) if (${PLATFORM} STREQUAL "Desktop")
set(PLATFORM "PLATFORM_GLFW") list(APPEND CLIENT_SOURCES glad/src/glad.c)
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() endif()
# Server # Server
if(UNIX) 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 target_include_directories("${PROJECT_NAME}-server" PUBLIC
"${CMAKE_SOURCE_DIR}/src/" "${CMAKE_SOURCE_DIR}/src/"
"project/lib_projects/raknet/jni/RaknetSources" "project/lib_projects/raknet/jni/RaknetSources"
) )
target_link_libraries("${PROJECT_NAME}-server" ${CMAKE_THREAD_LIBS_INIT} png_shared) target_link_libraries("${PROJECT_NAME}-server" ${CMAKE_THREAD_LIBS_INIT})
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() endif()
add_executable(${PROJECT_NAME} ${CLIENT_SOURCES})
target_compile_definitions(${PROJECT_NAME} PUBLIC ${PLATFORM_CPP})
target_include_directories(${PROJECT_NAME} PUBLIC target_include_directories(${PROJECT_NAME} PUBLIC
"${CMAKE_SOURCE_DIR}/glad/include/" "${CMAKE_SOURCE_DIR}/glad/include/"
@@ -287,9 +325,52 @@ target_include_directories(${PROJECT_NAME} PUBLIC
"lib/include" "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 # Client
target_compile_definitions(${PROJECT_NAME} PUBLIC "OPENGL_ES" "NO_EGL" ${PLATFORM}) target_compile_definitions(${PROJECT_NAME} PUBLIC "OPENGL_ES" "NO_EGL" ${PLATFORM})
target_link_libraries(${PROJECT_NAME} zlib png_shared alsoft.common OpenAL::OpenAL glfw ${EXTRA_LIBS}) target_link_libraries(${PROJECT_NAME} zlib ${PNG_LIB} OpenAL::OpenAL glfw ${EXTRA_LIBS})
if (OpenSSL_FOUND) if (OpenSSL_FOUND)
target_link_libraries(${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto) target_link_libraries(${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto)
@@ -297,72 +378,27 @@ if (OpenSSL_FOUND)
endif() endif()
if (NOT UNIX) if (NOT UNIX)
add_custom_command( add_custom_command(
TARGET ${PROJECT_NAME} TARGET ${PROJECT_NAME}
POST_BUILD POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_RUNTIME_DLLS:${PROJECT_NAME}> $<TARGET_FILE_DIR:${PROJECT_NAME}> COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_RUNTIME_DLLS:${PROJECT_NAME}> $<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMAND_EXPAND_LISTS COMMAND_EXPAND_LISTS
) )
endif() endif()
add_custom_command( if(NOT ${PLATFORM} MATCHES "Web")
TARGET ${PROJECT_NAME} add_custom_command(
POST_BUILD TARGET ${PROJECT_NAME}
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/data" $<TARGET_FILE_DIR:${PROJECT_NAME}>/data POST_BUILD
) COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/data" $<TARGET_FILE_DIR:${PROJECT_NAME}>/data
)
# Installing and packing else()
add_custom_command(
find_package(Git REQUIRED) TARGET ${PROJECT_NAME}
POST_BUILD
execute_process( COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/index.html" $<TARGET_FILE_DIR:${PROJECT_NAME}>
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() endif()
install(DIRECTORY "${CMAKE_SOURCE_DIR}/data" DESTINATION .) message(STATUS "Compiling with the flags:")
message(STATUS " PLATFORM=" ${PLATFORM_CPP})
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
View File

@@ -17,9 +17,9 @@ This project aims to preserve and improve this early version of Minecraft PE.
- [ ] Screen fixes - [ ] Screen fixes
- [ ] Rewrite platform logic - [ ] Rewrite platform logic
- [x] Fix sound - [x] Fix sound
- [ ] Do a server connection GUI - [x] Do a server connection GUI
- [ ] Controller support - [ ] Controller support
- [ ] Minecraft server hosting - [x] Minecraft server hosting
- [x] Screen fixess - [x] Screen fixess
- [x] Fix fog - [x] Fix fog
- [x] Add sprinting - [x] Add sprinting
@@ -70,7 +70,7 @@ cmake --build .
4. Press **Run** (or F5) to build and launch the game. 4. Press **Run** (or F5) to build and launch the game.
## Android ## Android
### Windows
1. Download **Android NDK r14b**: 1. Download **Android NDK r14b**:
http://dl.google.com/android/repository/android-ndk-r14b-windows-x86_64.zip http://dl.google.com/android/repository/android-ndk-r14b-windows-x86_64.zip
@@ -94,4 +94,142 @@ cmake --build .
# Only repackage + install (no compilation) # Only repackage + install (no compilation)
.\build.ps1 -NoBuild .\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 dont 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.

View File

@@ -1,18 +1,16 @@
# ============================================================ # ============================================================
# 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: # Usage:
# .\build.ps1 # full build (NDK + Java + APK + install) # .\build.ps1 # full build (NDK + Java + APK + install)
# .\build.ps1 -NoCpp # skip NDK rebuild (Java/assets changed) # .\build.ps1 -NoCpp # skip NDK rebuild (Java/assets changed)
# .\build.ps1 -NoJava # skip Java recompile (C++ changed only) # .\build.ps1 -NoJava # skip Java recompile (C++ changed only)
# .\build.ps1 -NoBuild # repackage + install only (no recompile) # .\build.ps1 -NoBuild # repackage + install only (no recompile)
# .\build.ps1 -Clean # remove build output before building
# ============================================================ # ============================================================
param( param(
[switch]$NoCpp, [switch]$NoCpp,
[switch]$NoJava, [switch]$NoJava,
[switch]$NoBuild [switch]$NoBuild,
[switch]$Clean
) )
Set-StrictMode -Version Latest Set-StrictMode -Version Latest
@@ -66,7 +64,13 @@ function Write-Stub([string]$rel, [string]$content) {
if (-not (Test-Path $full)) { [System.IO.File]::WriteAllText($full, $content); Write-Host " stub: $rel" } if (-not (Test-Path $full)) { [System.IO.File]::WriteAllText($full, $content); Write-Host " stub: $rel" }
} }
# ── 0. Bootstrap ───────────────────────────────────────────── # ── 0. Clean (optional) ───────────────────────────────────────
if ($Clean) {
Write-Step "Cleaning build output"
Remove-Item -Recurse -Force $apkbuild -ErrorAction SilentlyContinue
}
# ── 1. Bootstrap ─────────────────────────────────────────────
Write-Step "Bootstrap" Write-Step "Bootstrap"
New-Dir $apkbuild New-Dir $apkbuild
@@ -227,16 +231,16 @@ if (-not $NoCpp -and -not $NoBuild) {
} }
Push-Location "$junctionBase/project/android/jni" Push-Location "$junctionBase/project/android/jni"
$env:NDK_MODULE_PATH = "$junctionBase/project/lib_projects" $env:NDK_MODULE_PATH = "$junctionBase/project/lib_projects"
# run ndk-build and capture everything; let user see full output for debugging # run ndk-build and stream output directly to the console
$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 $ndkCmd = Join-Path $ndk 'ndk-build.cmd'
# dump entire output for diagnosis $ndkArgs = "NDK_PROJECT_PATH=`"$junctionBase/project/android`" APP_BUILD_SCRIPT=`"$junctionBase/project/android/jni/Android.mk`""
Write-Host "---- NDK BUILD OUTPUT BEGIN ----"
$ndkOutput | ForEach-Object { Write-Host $_ } $proc = Start-Process -FilePath $ndkCmd -ArgumentList $ndkArgs -NoNewWindow -Wait -PassThru
Write-Host "---- NDK BUILD OUTPUT END ----"
# optionally highlight errors/warnings afterwards
$ndkOutput | Where-Object { $_ -match "error:|warning:|libminecraftpe|In file included" }
Pop-Location Pop-Location
Assert-ExitCode "ndk-build" if ($proc.ExitCode -ne 0) {
Write-Host "ndk-build failed (exit $($proc.ExitCode))" -ForegroundColor Red
exit 1
}
Copy-Item $libSrc $libDst -Force Copy-Item $libSrc $libDst -Force
Write-Host " .so -> $libDst" Write-Host " .so -> $libDst"
} }
@@ -246,7 +250,7 @@ if (-not $NoJava -and -not $NoBuild) {
Write-Step "Java compile" Write-Step "Java compile"
New-Dir (Split-Path $rJava -Parent) New-Dir (Split-Path $rJava -Parent)
& "$sdkTools\aapt.exe" package -f -M $manifest -S $res -I $androidJar -J "$apkbuild\gen" -F "$apkbuild\_rgen.apk" 2>&1 | Out-Null & "$sdkTools\aapt.exe" package -f -M $manifest -S $res -I $androidJar -J "$apkbuild\gen" -F "$apkbuild\_rgen.apk"
Assert-ExitCode "aapt R.java" Assert-ExitCode "aapt R.java"
Remove-Item "$apkbuild\_rgen.apk" -ea SilentlyContinue Remove-Item "$apkbuild\_rgen.apk" -ea SilentlyContinue
@@ -258,11 +262,9 @@ if (-not $NoJava -and -not $NoBuild) {
Remove-Item $classesDir -Recurse -Force -ea SilentlyContinue Remove-Item $classesDir -Recurse -Force -ea SilentlyContinue
New-Dir $classesDir New-Dir $classesDir
$eap = $ErrorActionPreference; $ErrorActionPreference = "Continue"
$errors = & javac --release 8 -cp $androidJar -d $classesDir @srcs 2>&1 | & javac --release 8 -cp $androidJar -d $classesDir @srcs
Where-Object { $_ -match "error:" } if ($LASTEXITCODE -ne 0) { Write-Host 'javac failed' -ForegroundColor Red; exit 1 }
$ErrorActionPreference = $eap
if ($errors) { Write-Host $errors -ForegroundColor Red; exit 1 }
Write-Host " javac OK" Write-Host " javac OK"
$classFiles = Get-ChildItem $classesDir -Recurse -Filter "*.class" | Select-Object -Exp FullName $classFiles = Get-ChildItem $classesDir -Recurse -Filter "*.class" | Select-Object -Exp FullName

455
build.sh Executable file
View File

@@ -0,0 +1,455 @@
#!/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!"

9
cmake/EnumOption.cmake Normal file
View File

@@ -0,0 +1,9 @@
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.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 111 KiB

View File

@@ -152,7 +152,9 @@ options.group.graphics=Graphics
options.group.tweaks=Tweaks options.group.tweaks=Tweaks
options.allowSprint=Allow sprint options.allowSprint=Allow sprint
options.barOnTop=HUD above inventory options.barOnTop=HUD above inventory
options.autojump=Auto Jump options.rpiCursor=Show Raspberry PI cursor
options.foliageTint=Tint Grass and Leaves
options.autoJump=Auto Jump
options.thirdperson=Third Person options.thirdperson=Third Person
options.servervisible=Server Visible options.servervisible=Server Visible
options.sensitivity=Sensitivity options.sensitivity=Sensitivity
@@ -181,9 +183,10 @@ options.graphics.fast=Fast
options.guiScale=GUI Scale options.guiScale=GUI Scale
options.guiScale.auto=Auto options.guiScale.auto=Auto
options.guiScale.small=Small options.guiScale.small=Small
options.guiScale.normal=Normal options.guiScale.medium=Medium
options.guiScale.large=Large options.guiScale.large=Large
options.guiScale.larger=Larger options.guiScale.larger=Larger
options.guiScale.largest=Largest
options.advancedOpengl=Advanced OpenGL options.advancedOpengl=Advanced OpenGL
options.renderClouds=Clouds options.renderClouds=Clouds
options.farWarning1=A 64 bit Java installation is recommended options.farWarning1=A 64 bit Java installation is recommended

46
misc/web/index.html Normal file
View File

@@ -0,0 +1,46 @@
<!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>

View File

@@ -6,8 +6,8 @@
android:installLocation="preferExternal"> android:installLocation="preferExternal">
<!-- This is the platform API where NativeActivity was introduced. --> <!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="24" <uses-sdk android:minSdkVersion="19"
android:targetSdkVersion="24" /> android:targetSdkVersion="30" />
<!-- uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="true"/ --> <!-- uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="true"/ -->

View File

@@ -168,9 +168,10 @@ options.graphics.fast=Fast
options.guiScale=GUI Scale options.guiScale=GUI Scale
options.guiScale.auto=Auto options.guiScale.auto=Auto
options.guiScale.small=Small options.guiScale.small=Small
options.guiScale.normal=Normal options.guiScale.medium=Medium
options.guiScale.large=Large options.guiScale.large=Large
options.guiScale.larger=Larger options.guiScale.larger=Larger
options.guiScale.largest=Largest
options.advancedOpengl=Advanced OpenGL options.advancedOpengl=Advanced OpenGL
options.renderClouds=Clouds options.renderClouds=Clouds
options.farWarning1=A 64 bit Java installation is recommended options.farWarning1=A 64 bit Java installation is recommended

View File

@@ -24,6 +24,7 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
../../../src/client/Options.cpp \ ../../../src/client/Options.cpp \
../../../src/client/OptionsFile.cpp \ ../../../src/client/OptionsFile.cpp \
../../../src/client/OptionStrings.cpp \ ../../../src/client/OptionStrings.cpp \
../../../src/client/Option.cpp \
../../../src/client/gamemode/GameMode.cpp \ ../../../src/client/gamemode/GameMode.cpp \
../../../src/client/gamemode/CreativeMode.cpp \ ../../../src/client/gamemode/CreativeMode.cpp \
../../../src/client/gamemode/SurvivalMode.cpp \ ../../../src/client/gamemode/SurvivalMode.cpp \
@@ -37,14 +38,14 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
../../../src/client/gui/components/NinePatch.cpp \ ../../../src/client/gui/components/NinePatch.cpp \
../../../src/client/gui/components/OptionsGroup.cpp \ ../../../src/client/gui/components/OptionsGroup.cpp \
../../../src/client/gui/components/OptionsItem.cpp \ ../../../src/client/gui/components/OptionsItem.cpp \
../../../src/client/gui/components/OptionsPane.cpp \ ../../../src/client/gui/components/KeyOption.cpp \
../../../src/client/gui/components/TextOption.cpp \
../../../src/client/gui/components/RolledSelectionListH.cpp \ ../../../src/client/gui/components/RolledSelectionListH.cpp \
../../../src/client/gui/components/RolledSelectionListV.cpp \ ../../../src/client/gui/components/RolledSelectionListV.cpp \
../../../src/client/gui/components/ScrolledSelectionList.cpp \ ../../../src/client/gui/components/ScrolledSelectionList.cpp \
../../../src/client/gui/components/ScrollingPane.cpp \ ../../../src/client/gui/components/ScrollingPane.cpp \
../../../src/client/gui/components/Slider.cpp \ ../../../src/client/gui/components/Slider.cpp \
../../../src/client/gui/components/TextBox.cpp \ ../../../src/client/gui/components/TextBox.cpp \
../../../src/client/gui/components/SmallButton.cpp \
../../../src/client/gui/Font.cpp \ ../../../src/client/gui/Font.cpp \
../../../src/client/gui/Gui.cpp \ ../../../src/client/gui/Gui.cpp \
../../../src/client/gui/GuiComponent.cpp \ ../../../src/client/gui/GuiComponent.cpp \
@@ -208,6 +209,8 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
../../../src/world/level/MobSpawner.cpp \ ../../../src/world/level/MobSpawner.cpp \
../../../src/world/level/Region.cpp \ ../../../src/world/level/Region.cpp \
../../../src/world/level/TickNextTickData.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/Biome.cpp \
../../../src/world/level/biome/BiomeSource.cpp \ ../../../src/world/level/biome/BiomeSource.cpp \
../../../src/world/level/chunk/LevelChunk.cpp \ ../../../src/world/level/chunk/LevelChunk.cpp \
@@ -256,7 +259,8 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
../../../src/world/phys/HitResult.cpp ../../../src/world/phys/HitResult.cpp
LOCAL_CFLAGS := -DPLATFORM_ANDROID -DPRE_ANDROID23 -Wno-narrowing $(LOCAL_CFLAGS) LOCAL_CFLAGS := -DPLATFORM_ANDROID -DPRE_ANDROID23 -Wno-narrowing $(LOCAL_CFLAGS)
LOCAL_CPPFLAGS := -std=c++11 LOCAL_CPPFLAGS := -std=c++14 -frtti
LOCAL_CPPFLAGS += -frtti
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../src LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../src
#LOCAL_CFLAGS := -DANDROID_PUBLISH -DDEMO_MODE $(LOCAL_CFLAGS) #LOCAL_CFLAGS := -DANDROID_PUBLISH -DDEMO_MODE $(LOCAL_CFLAGS)

View File

@@ -1,6 +1,7 @@
APP_PLATFORM := android-21 APP_PLATFORM := android-19
APP_STL := gnustl_static APP_STL := gnustl_static
APP_OPTIM := release APP_OPTIM := release
APP_ABI := arm64-v8a APP_ABI := arm64-v8a
APP_SHORT_COMMANDS := true APP_SHORT_COMMANDS := true
APP_CPPFLAGS += -frtti -fexceptions
#APP_ABI := armeabi-v7a x86 #APP_ABI := armeabi-v7a x86

View File

@@ -5,8 +5,8 @@
android:versionName="0.6.1-alpha-0.0.3"> android:versionName="0.6.1-alpha-0.0.3">
<uses-sdk <uses-sdk
android:minSdkVersion="24" android:minSdkVersion="19"
android:targetSdkVersion="28"/> android:targetSdkVersion="30"/>
<uses-feature <uses-feature
android:name="android.hardware.touchscreen.multitouch" android:name="android.hardware.touchscreen.multitouch"

View File

@@ -168,8 +168,10 @@ options.graphics.fast=Fast
options.guiScale=GUI Scale options.guiScale=GUI Scale
options.guiScale.auto=Auto options.guiScale.auto=Auto
options.guiScale.small=Small options.guiScale.small=Small
options.guiScale.normal=Normal options.guiScale.medium=Medium
options.guiScale.large=Large options.guiScale.large=Large
options.guiScale.larger=Larger
options.guiScale.largest=Largest
options.advancedOpengl=Advanced OpenGL options.advancedOpengl=Advanced OpenGL
options.renderClouds=Clouds options.renderClouds=Clouds
options.farWarning1=A 64 bit Java installation is recommended options.farWarning1=A 64 bit Java installation is recommended

View File

@@ -183,6 +183,8 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
../../../src/world/level/MobSpawner.cpp \ ../../../src/world/level/MobSpawner.cpp \
../../../src/world/level/Region.cpp \ ../../../src/world/level/Region.cpp \
../../../src/world/level/TickNextTickData.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/Biome.cpp \
../../../src/world/level/biome/BiomeSource.cpp \ ../../../src/world/level/biome/BiomeSource.cpp \
../../../src/world/level/chunk/LevelChunk.cpp \ ../../../src/world/level/chunk/LevelChunk.cpp \

View File

@@ -1,4 +1,4 @@
APP_PLATFORM := android-9 APP_PLATFORM := android-19
APP_STL := gnustl_static APP_STL := gnustl_static
APP_OPTIM := release APP_OPTIM := release
APP_ABI := armeabi-v7a APP_ABI := armeabi-v7a

View File

@@ -59,6 +59,7 @@ public class MainActivity extends Activity {
private static final int PERMISSION_REQUEST_CODE = 123; private static final int PERMISSION_REQUEST_CODE = 123;
private GLView _glView; private GLView _glView;
private boolean _nativeInitialized = false;
public float invScale = 1.0f;// / 1.5f; public float invScale = 1.0f;// / 1.5f;
private int _screenWidth = 0; private int _screenWidth = 0;
private int _screenHeight = 0; private int _screenHeight = 0;
@@ -77,63 +78,48 @@ public class MainActivity extends Activity {
_screenWidth = Math.max(_dm.widthPixels, _dm.heightPixels); _screenWidth = Math.max(_dm.widthPixels, _dm.heightPixels);
_screenHeight = Math.min(_dm.widthPixels, _dm.heightPixels); _screenHeight = Math.min(_dm.widthPixels, _dm.heightPixels);
nativeOnCreate(_screenWidth, _screenHeight);
_glView = new GLView(getApplication(), this); _glView = new GLView(getApplication(), this);
//_glView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); //_glView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
_glView.setEGLConfigChooser(true); _glView.setEGLConfigChooser(true);
//_glView //_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(); _glView.commit();
setContentView(_glView); setContentView(_glView);
_soundPlayer = new SoundPlayer(this, AudioManager.STREAM_MUSIC); _soundPlayer = new SoundPlayer(this, AudioManager.STREAM_MUSIC);
// request dangerous permissions at runtime if necessary
checkAndRequestPermissions(); checkAndRequestPermissions();
initNative();
} }
private void checkAndRequestPermissions() { private void initNative() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (_nativeInitialized) {
boolean needRequest = false; return;
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 @Override
@@ -146,8 +132,18 @@ public class MainActivity extends Activity {
break; break;
} }
} }
if (!granted) { if (granted) {
// user denied; you might want to warn or close the app 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();
} }
} }
super.onRequestPermissionsResult(requestCode, permissions, grantResults); super.onRequestPermissionsResult(requestCode, permissions, grantResults);

View File

@@ -0,0 +1,48 @@
<?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>

View File

@@ -41,7 +41,6 @@
042A91AE16B17517007ABBC6 /* GuiElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A316B17517007ABBC6 /* GuiElement.cpp */; }; 042A91AE16B17517007ABBC6 /* GuiElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A316B17517007ABBC6 /* GuiElement.cpp */; };
042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A516B17517007ABBC6 /* NinePatch.cpp */; }; 042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A516B17517007ABBC6 /* NinePatch.cpp */; };
042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A716B17517007ABBC6 /* OptionsGroup.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 */; }; 042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91AB16B17517007ABBC6 /* TextBox.cpp */; };
044129071682FF9600B70EE6 /* MouseHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 044129061682FF9600B70EE6 /* MouseHandler.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 */; }; 9D293CE716071C08000305C8 /* CreateNewWorld_iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */; };
@@ -1148,6 +1147,32 @@
D5F3B7DE14548E7900D25470 /* IASKSpecifierValuesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C914548E7900D25470 /* IASKSpecifierValuesView.xib */; }; D5F3B7DE14548E7900D25470 /* IASKSpecifierValuesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C914548E7900D25470 /* IASKSpecifierValuesView.xib */; };
D5F3B7E51454930400D25470 /* InAppSettings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7E41454930400D25470 /* InAppSettings.bundle */; }; D5F3B7E51454930400D25470 /* InAppSettings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7E41454930400D25470 /* InAppSettings.bundle */; };
F912B8CF2F6C3D5200BC60DF /* TextBox.h in Sources */ = {isa = PBXBuildFile; fileRef = 042A91AC16B17517007ABBC6 /* TextBox.h */; }; 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 */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
@@ -1209,8 +1234,6 @@
042A91A616B17517007ABBC6 /* NinePatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NinePatch.h; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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>"; }; 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; }; 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>"; }; 044129061682FF9600B70EE6 /* MouseHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseHandler.cpp; sourceTree = "<group>"; };
@@ -2018,7 +2041,7 @@
D5B50D6914CFF66F005F7284 /* Multitouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Multitouch.h; sourceTree = "<group>"; }; 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>"; }; 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>"; }; D5B50D6B14CFF66F005F7284 /* time.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = time.cpp; sourceTree = "<group>"; };
D5B50D6C14CFF66F005F7284 /* time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time.h; sourceTree = "<group>"; }; D5B50D6C14CFF66F005F7284 /* time.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 4; path = time.h; sourceTree = "<group>"; };
D5B50E5614CFF66F005F7284 /* SharedConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedConstants.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>"; }; 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>"; }; D5B50E5814CFF66F005F7284 /* terrain_5551.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = terrain_5551.h; sourceTree = "<group>"; };
@@ -2409,6 +2432,31 @@
D5F3B7C814548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSToggleSwitchSpecifierViewCell.xib; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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 */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@@ -3227,8 +3275,6 @@
042A91A616B17517007ABBC6 /* NinePatch.h */, 042A91A616B17517007ABBC6 /* NinePatch.h */,
042A91A716B17517007ABBC6 /* OptionsGroup.cpp */, 042A91A716B17517007ABBC6 /* OptionsGroup.cpp */,
042A91A816B17517007ABBC6 /* OptionsGroup.h */, 042A91A816B17517007ABBC6 /* OptionsGroup.h */,
042A91A916B17517007ABBC6 /* OptionsPane.cpp */,
042A91AA16B17517007ABBC6 /* OptionsPane.h */,
042A91AB16B17517007ABBC6 /* TextBox.cpp */, 042A91AB16B17517007ABBC6 /* TextBox.cpp */,
042A91AC16B17517007ABBC6 /* TextBox.h */, 042A91AC16B17517007ABBC6 /* TextBox.h */,
D5B50C2814CFF66F005F7284 /* Button.cpp */, D5B50C2814CFF66F005F7284 /* Button.cpp */,
@@ -4257,6 +4303,7 @@
D5CF9C37144C225000E4244F = { D5CF9C37144C225000E4244F = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
F99D344D2F7372A100DC153E /* Launch Screen.storyboard */,
D5E1BA9A1451C8A0007DCC4F /* Default@2x.png */, D5E1BA9A1451C8A0007DCC4F /* Default@2x.png */,
9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */, 9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */,
D5F07744145EF79B00EC30FB /* Default-Landscape~ipad.png */, D5F07744145EF79B00EC30FB /* Default-Landscape~ipad.png */,
@@ -4268,6 +4315,30 @@
D5CF9C45144C225000E4244F /* Frameworks */, D5CF9C45144C225000E4244F /* Frameworks */,
D5CF9C43144C225000E4244F /* Products */, D5CF9C43144C225000E4244F /* Products */,
D5B50C1614CFF66F005F7284 /* src */, 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>"; sourceTree = "<group>";
}; };
@@ -4606,6 +4677,7 @@
D5B50A5614CFF492005F7284 /* pig.png in Resources */, D5B50A5614CFF492005F7284 /* pig.png in Resources */,
D5B50A5814CFF492005F7284 /* sheep_fur.png in Resources */, D5B50A5814CFF492005F7284 /* sheep_fur.png in Resources */,
D5B50A5A14CFF492005F7284 /* sheep.png in Resources */, D5B50A5A14CFF492005F7284 /* sheep.png in Resources */,
F99D344F2F7372A100DC153E /* Launch Screen.storyboard in Resources */,
D5B50A5C14CFF492005F7284 /* skeleton.png in Resources */, D5B50A5C14CFF492005F7284 /* skeleton.png in Resources */,
D5B50A5E14CFF492005F7284 /* spider.png in Resources */, D5B50A5E14CFF492005F7284 /* spider.png in Resources */,
D5B50A6014CFF492005F7284 /* zombie.png in Resources */, D5B50A6014CFF492005F7284 /* zombie.png in Resources */,
@@ -4942,6 +5014,7 @@
D5ACF26F15C03DBF00E21C22 /* sand2.m4a in Resources */, D5ACF26F15C03DBF00E21C22 /* sand2.m4a in Resources */,
D5ACF27115C03DBF00E21C22 /* sand3.m4a in Resources */, D5ACF27115C03DBF00E21C22 /* sand3.m4a in Resources */,
D5ACF27315C03DBF00E21C22 /* sand4.m4a in Resources */, D5ACF27315C03DBF00E21C22 /* sand4.m4a in Resources */,
F99D344E2F7372A100DC153E /* Launch Screen.storyboard in Resources */,
D5ACF27515C03DBF00E21C22 /* snow1.m4a in Resources */, D5ACF27515C03DBF00E21C22 /* snow1.m4a in Resources */,
D5ACF27715C03DBF00E21C22 /* snow2.m4a in Resources */, D5ACF27715C03DBF00E21C22 /* snow2.m4a in Resources */,
D5ACF27915C03DBF00E21C22 /* snow3.m4a in Resources */, D5ACF27915C03DBF00E21C22 /* snow3.m4a in Resources */,
@@ -5018,18 +5091,22 @@
D58BB544146A0B910002C9F5 /* IASKSettingsStore.m in Sources */, D58BB544146A0B910002C9F5 /* IASKSettingsStore.m in Sources */,
D58BB545146A0B910002C9F5 /* IASKSettingsStoreFile.m in Sources */, D58BB545146A0B910002C9F5 /* IASKSettingsStoreFile.m in Sources */,
D58BB546146A0B910002C9F5 /* IASKSettingsStoreUserDefaults.m in Sources */, D58BB546146A0B910002C9F5 /* IASKSettingsStoreUserDefaults.m in Sources */,
F99D34232F736AD400DC153E /* TextOption.cpp in Sources */,
D58BB547146A0B910002C9F5 /* IASKSpecifier.m in Sources */, D58BB547146A0B910002C9F5 /* IASKSpecifier.m in Sources */,
D58BB548146A0B910002C9F5 /* IASKPSSliderSpecifierViewCell.m in Sources */, D58BB548146A0B910002C9F5 /* IASKPSSliderSpecifierViewCell.m in Sources */,
D58BB549146A0B910002C9F5 /* IASKPSTextFieldSpecifierViewCell.m in Sources */, D58BB549146A0B910002C9F5 /* IASKPSTextFieldSpecifierViewCell.m in Sources */,
D58BB54A146A0B910002C9F5 /* IASKPSTitleValueSpecifierViewCell.m in Sources */, D58BB54A146A0B910002C9F5 /* IASKPSTitleValueSpecifierViewCell.m in Sources */,
D58BB54B146A0B910002C9F5 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */, D58BB54B146A0B910002C9F5 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */,
F99D343B2F736C3B00DC153E /* UsernameScreen.cpp in Sources */,
D58BB54C146A0B910002C9F5 /* IASKSlider.m in Sources */, D58BB54C146A0B910002C9F5 /* IASKSlider.m in Sources */,
D58BB54D146A0B910002C9F5 /* IASKSwitch.m in Sources */, D58BB54D146A0B910002C9F5 /* IASKSwitch.m in Sources */,
F99D34302F736BAD00DC153E /* ConsoleScreen.cpp in Sources */,
D58BB54E146A0B910002C9F5 /* IASKTextField.m in Sources */, D58BB54E146A0B910002C9F5 /* IASKTextField.m in Sources */,
D58BB550146A0B910002C9F5 /* PVRTexture.m in Sources */, D58BB550146A0B910002C9F5 /* PVRTexture.m in Sources */,
D5D43CC9146AF4B4002ED842 /* RenameMPWorldViewController.mm in Sources */, D5D43CC9146AF4B4002ED842 /* RenameMPWorldViewController.mm in Sources */,
D5B50F7014CFF670005F7284 /* AppPlatform_iOS.mm in Sources */, D5B50F7014CFF670005F7284 /* AppPlatform_iOS.mm in Sources */,
D5B50F7414CFF670005F7284 /* CreativeMode.cpp in Sources */, D5B50F7414CFF670005F7284 /* CreativeMode.cpp in Sources */,
F99D34432F736F9400DC153E /* Option.cpp in Sources */,
D5B50F7614CFF670005F7284 /* GameMode.cpp in Sources */, D5B50F7614CFF670005F7284 /* GameMode.cpp in Sources */,
D5B50F7814CFF670005F7284 /* Button.cpp in Sources */, D5B50F7814CFF670005F7284 /* Button.cpp in Sources */,
D5B50F7A14CFF670005F7284 /* ImageButton.cpp in Sources */, D5B50F7A14CFF670005F7284 /* ImageButton.cpp in Sources */,
@@ -5074,6 +5151,7 @@
D5B50FC814CFF670005F7284 /* KeyboardInput.cpp in Sources */, D5B50FC814CFF670005F7284 /* KeyboardInput.cpp in Sources */,
D5B50FCA14CFF670005F7284 /* TouchscreenInput.cpp in Sources */, D5B50FCA14CFF670005F7284 /* TouchscreenInput.cpp in Sources */,
D5B50FCC14CFF670005F7284 /* LocalPlayer.cpp in Sources */, D5B50FCC14CFF670005F7284 /* LocalPlayer.cpp in Sources */,
F99D34482F736FE800DC153E /* KeyOption.cpp in Sources */,
D5B50FCE14CFF670005F7284 /* Chunk.cpp in Sources */, D5B50FCE14CFF670005F7284 /* Chunk.cpp in Sources */,
D5B50FD014CFF670005F7284 /* Frustum.cpp in Sources */, D5B50FD014CFF670005F7284 /* Frustum.cpp in Sources */,
D5B50FD214CFF670005F7284 /* ChickenRenderer.cpp in Sources */, D5B50FD214CFF670005F7284 /* ChickenRenderer.cpp in Sources */,
@@ -5132,6 +5210,7 @@
D5B5113014CFF670005F7284 /* TripodCamera.cpp in Sources */, D5B5113014CFF670005F7284 /* TripodCamera.cpp in Sources */,
D5B5113214CFF670005F7284 /* Mob.cpp in Sources */, D5B5113214CFF670005F7284 /* Mob.cpp in Sources */,
D5B5113414CFF670005F7284 /* MobCategory.cpp in Sources */, D5B5113414CFF670005F7284 /* MobCategory.cpp in Sources */,
F99D34282F736AFB00DC153E /* OptionsFile.cpp in Sources */,
D5B5113814CFF670005F7284 /* PathFinderMob.cpp in Sources */, D5B5113814CFF670005F7284 /* PathFinderMob.cpp in Sources */,
D5B5113A14CFF670005F7284 /* Inventory.cpp in Sources */, D5B5113A14CFF670005F7284 /* Inventory.cpp in Sources */,
D5B5113C14CFF670005F7284 /* Player.cpp in Sources */, D5B5113C14CFF670005F7284 /* Player.cpp in Sources */,
@@ -5143,6 +5222,7 @@
D5B5114814CFF670005F7284 /* Item.cpp in Sources */, D5B5114814CFF670005F7284 /* Item.cpp in Sources */,
D5B5114A14CFF670005F7284 /* ItemInstance.cpp in Sources */, D5B5114A14CFF670005F7284 /* ItemInstance.cpp in Sources */,
D5B5114C14CFF670005F7284 /* PickaxeItem.cpp in Sources */, D5B5114C14CFF670005F7284 /* PickaxeItem.cpp in Sources */,
F99D344B2F7370CF00DC153E /* Slider.cpp in Sources */,
D5B5114E14CFF670005F7284 /* ShovelItem.cpp in Sources */, D5B5114E14CFF670005F7284 /* ShovelItem.cpp in Sources */,
D5B5115014CFF670005F7284 /* Biome.cpp in Sources */, D5B5115014CFF670005F7284 /* Biome.cpp in Sources */,
D5B5115214CFF670005F7284 /* BiomeSource.cpp in Sources */, D5B5115214CFF670005F7284 /* BiomeSource.cpp in Sources */,
@@ -5193,6 +5273,7 @@
D5251DBA1538192700FC82C8 /* CloudServer.cpp in Sources */, D5251DBA1538192700FC82C8 /* CloudServer.cpp in Sources */,
D5251DBE1538192700FC82C8 /* CommandParserInterface.cpp in Sources */, D5251DBE1538192700FC82C8 /* CommandParserInterface.cpp in Sources */,
D5251DC01538192700FC82C8 /* ConnectionGraph2.cpp in Sources */, D5251DC01538192700FC82C8 /* ConnectionGraph2.cpp in Sources */,
F99D34402F736C8400DC153E /* GuiElementContainer.cpp in Sources */,
D5251DC21538192700FC82C8 /* ConsoleServer.cpp in Sources */, D5251DC21538192700FC82C8 /* ConsoleServer.cpp in Sources */,
D5251DC41538192700FC82C8 /* DataCompressor.cpp in Sources */, D5251DC41538192700FC82C8 /* DataCompressor.cpp in Sources */,
D5251DC61538192700FC82C8 /* DirectoryDeltaTransfer.cpp in Sources */, D5251DC61538192700FC82C8 /* DirectoryDeltaTransfer.cpp in Sources */,
@@ -5217,6 +5298,8 @@
D5251DEC1538192700FC82C8 /* HTTPConnection.cpp in Sources */, D5251DEC1538192700FC82C8 /* HTTPConnection.cpp in Sources */,
D5251DEE1538192700FC82C8 /* IncrementalReadInterface.cpp in Sources */, D5251DEE1538192700FC82C8 /* IncrementalReadInterface.cpp in Sources */,
D5251DF01538192700FC82C8 /* Itoa.cpp in Sources */, D5251DF01538192700FC82C8 /* Itoa.cpp in Sources */,
F99D34202F736AA100DC153E /* HttpClient.cpp in Sources */,
F99D34382F736C1000DC153E /* JoinByIPScreen.cpp in Sources */,
D5251DF21538192700FC82C8 /* LinuxStrings.cpp in Sources */, D5251DF21538192700FC82C8 /* LinuxStrings.cpp in Sources */,
D5251DF41538192700FC82C8 /* LocklessTypes.cpp in Sources */, D5251DF41538192700FC82C8 /* LocklessTypes.cpp in Sources */,
D5251DF61538192700FC82C8 /* LogCommandParser.cpp in Sources */, D5251DF61538192700FC82C8 /* LogCommandParser.cpp in Sources */,
@@ -5245,6 +5328,7 @@
D5251E2A1538192700FC82C8 /* RakSleep.cpp in Sources */, D5251E2A1538192700FC82C8 /* RakSleep.cpp in Sources */,
D5251E2C1538192700FC82C8 /* RakString.cpp in Sources */, D5251E2C1538192700FC82C8 /* RakString.cpp in Sources */,
D5251E2E1538192700FC82C8 /* RakThread.cpp in Sources */, D5251E2E1538192700FC82C8 /* RakThread.cpp in Sources */,
F99D34332F736BDA00DC153E /* CreditsScreen.cpp in Sources */,
D5251E301538192700FC82C8 /* RakWString.cpp in Sources */, D5251E301538192700FC82C8 /* RakWString.cpp in Sources */,
D5251E321538192700FC82C8 /* Rand.cpp in Sources */, D5251E321538192700FC82C8 /* Rand.cpp in Sources */,
D5251E341538192700FC82C8 /* rdlmalloc.cpp in Sources */, D5251E341538192700FC82C8 /* rdlmalloc.cpp in Sources */,
@@ -5287,6 +5371,7 @@
D5951EEB159349100043A12A /* TileEntity.cpp in Sources */, D5951EEB159349100043A12A /* TileEntity.cpp in Sources */,
D5951EEF159349680043A12A /* FurnaceScreen.cpp in Sources */, D5951EEF159349680043A12A /* FurnaceScreen.cpp in Sources */,
D5951EF215934A2D0043A12A /* Feature.cpp in Sources */, D5951EF215934A2D0043A12A /* Feature.cpp in Sources */,
F99D342C2F736B6F00DC153E /* OptionsItem.cpp in Sources */,
D5951EF815934AC50043A12A /* BaseContainerMenu.cpp in Sources */, D5951EF815934AC50043A12A /* BaseContainerMenu.cpp in Sources */,
D5951EFA15934AC50043A12A /* FurnaceMenu.cpp in Sources */, D5951EFA15934AC50043A12A /* FurnaceMenu.cpp in Sources */,
D5D381F315A1A1CF00B6C50E /* FillingContainer.cpp in Sources */, D5D381F315A1A1CF00B6C50E /* FillingContainer.cpp in Sources */,
@@ -5349,6 +5434,7 @@
F912B8CF2F6C3D5200BC60DF /* TextBox.h in Sources */, F912B8CF2F6C3D5200BC60DF /* TextBox.h in Sources */,
D5CF9C57144C225000E4244F /* main.mm in Sources */, D5CF9C57144C225000E4244F /* main.mm in Sources */,
D5CF9C5B144C225000E4244F /* minecraftpeAppDelegate.mm in Sources */, D5CF9C5B144C225000E4244F /* minecraftpeAppDelegate.mm in Sources */,
F99D343C2F736C3B00DC153E /* UsernameScreen.cpp in Sources */,
D5CF9C65144C225000E4244F /* EAGLView.m in Sources */, D5CF9C65144C225000E4244F /* EAGLView.m in Sources */,
D5CFA01D144C453900E4244F /* minecraftpeViewController.mm in Sources */, D5CFA01D144C453900E4244F /* minecraftpeViewController.mm in Sources */,
D5A55E4914500EDE00A7571B /* CreateNewWorldViewController.mm in Sources */, D5A55E4914500EDE00A7571B /* CreateNewWorldViewController.mm in Sources */,
@@ -5362,6 +5448,7 @@
D5F3B7D014548E7900D25470 /* IASKSettingsStoreUserDefaults.m in Sources */, D5F3B7D014548E7900D25470 /* IASKSettingsStoreUserDefaults.m in Sources */,
D5F3B7D114548E7900D25470 /* IASKSpecifier.m in Sources */, D5F3B7D114548E7900D25470 /* IASKSpecifier.m in Sources */,
D5F3B7D214548E7900D25470 /* IASKPSSliderSpecifierViewCell.m in Sources */, D5F3B7D214548E7900D25470 /* IASKPSSliderSpecifierViewCell.m in Sources */,
F99D34472F736FE800DC153E /* KeyOption.cpp in Sources */,
D5F3B7D314548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.m in Sources */, D5F3B7D314548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.m in Sources */,
D5F3B7D414548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.m in Sources */, D5F3B7D414548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.m in Sources */,
D5F3B7D514548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */, D5F3B7D514548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */,
@@ -5473,11 +5560,13 @@
D5B5112D14CFF670005F7284 /* PrimedTnt.cpp in Sources */, D5B5112D14CFF670005F7284 /* PrimedTnt.cpp in Sources */,
D5B5112F14CFF670005F7284 /* TripodCamera.cpp in Sources */, D5B5112F14CFF670005F7284 /* TripodCamera.cpp in Sources */,
D5B5113114CFF670005F7284 /* Mob.cpp in Sources */, D5B5113114CFF670005F7284 /* Mob.cpp in Sources */,
F99D34442F736F9400DC153E /* Option.cpp in Sources */,
D5B5113314CFF670005F7284 /* MobCategory.cpp in Sources */, D5B5113314CFF670005F7284 /* MobCategory.cpp in Sources */,
D5B5113714CFF670005F7284 /* PathFinderMob.cpp in Sources */, D5B5113714CFF670005F7284 /* PathFinderMob.cpp in Sources */,
D5B5113914CFF670005F7284 /* Inventory.cpp in Sources */, D5B5113914CFF670005F7284 /* Inventory.cpp in Sources */,
D5B5113B14CFF670005F7284 /* Player.cpp in Sources */, D5B5113B14CFF670005F7284 /* Player.cpp in Sources */,
D5B5113D14CFF670005F7284 /* Arrow.cpp in Sources */, D5B5113D14CFF670005F7284 /* Arrow.cpp in Sources */,
F99D343F2F736C8400DC153E /* GuiElementContainer.cpp in Sources */,
D5B5113F14CFF670005F7284 /* Recipes.cpp in Sources */, D5B5113F14CFF670005F7284 /* Recipes.cpp in Sources */,
D5B5114114CFF670005F7284 /* ToolRecipes.cpp in Sources */, D5B5114114CFF670005F7284 /* ToolRecipes.cpp in Sources */,
D5B5114314CFF670005F7284 /* WeaponRecipes.cpp in Sources */, D5B5114314CFF670005F7284 /* WeaponRecipes.cpp in Sources */,
@@ -5515,10 +5604,12 @@
D5B5118514CFF670005F7284 /* HitResult.cpp in Sources */, D5B5118514CFF670005F7284 /* HitResult.cpp in Sources */,
D5B5118B14D03342005F7284 /* SynchedEntityData.cpp in Sources */, D5B5118B14D03342005F7284 /* SynchedEntityData.cpp in Sources */,
D5B5118E14DEA27F005F7284 /* DeathScreen.cpp in Sources */, D5B5118E14DEA27F005F7284 /* DeathScreen.cpp in Sources */,
F99D34242F736AD400DC153E /* TextOption.cpp in Sources */,
D5B5119114DEA2B7005F7284 /* LevelData.cpp in Sources */, D5B5119114DEA2B7005F7284 /* LevelData.cpp in Sources */,
D5B5119414DEA2EF005F7284 /* DyePowderItem.cpp in Sources */, D5B5119414DEA2EF005F7284 /* DyePowderItem.cpp in Sources */,
D584926D14FD234400741128 /* SharedConstants.cpp in Sources */, D584926D14FD234400741128 /* SharedConstants.cpp in Sources */,
D584927314FD236700741128 /* MoveControl.cpp in Sources */, D584927314FD236700741128 /* MoveControl.cpp in Sources */,
F99D344C2F7370CF00DC153E /* Slider.cpp in Sources */,
D584928614FD240D00741128 /* IConfigListener.cpp in Sources */, D584928614FD240D00741128 /* IConfigListener.cpp in Sources */,
D584928914FD2FAF00741128 /* Path.cpp in Sources */, D584928914FD2FAF00741128 /* Path.cpp in Sources */,
D5B86281153810BD00F3238A /* I18n.cpp in Sources */, D5B86281153810BD00F3238A /* I18n.cpp in Sources */,
@@ -5570,6 +5661,7 @@
D5251E011538192700FC82C8 /* NatTypeDetectionServer.cpp in Sources */, D5251E011538192700FC82C8 /* NatTypeDetectionServer.cpp in Sources */,
D5251E031538192700FC82C8 /* NetworkIDManager.cpp in Sources */, D5251E031538192700FC82C8 /* NetworkIDManager.cpp in Sources */,
D5251E051538192700FC82C8 /* NetworkIDObject.cpp in Sources */, D5251E051538192700FC82C8 /* NetworkIDObject.cpp in Sources */,
F99D34372F736C1000DC153E /* JoinByIPScreen.cpp in Sources */,
D5251E071538192700FC82C8 /* PacketConsoleLogger.cpp in Sources */, D5251E071538192700FC82C8 /* PacketConsoleLogger.cpp in Sources */,
D5251E091538192700FC82C8 /* PacketFileLogger.cpp in Sources */, D5251E091538192700FC82C8 /* PacketFileLogger.cpp in Sources */,
D5251E0B1538192700FC82C8 /* PacketizedTCP.cpp in Sources */, D5251E0B1538192700FC82C8 /* PacketizedTCP.cpp in Sources */,
@@ -5599,11 +5691,13 @@
D5251E411538192700FC82C8 /* SendToThread.cpp in Sources */, D5251E411538192700FC82C8 /* SendToThread.cpp in Sources */,
D5251E431538192700FC82C8 /* SHA1.cpp in Sources */, D5251E431538192700FC82C8 /* SHA1.cpp in Sources */,
D5251E451538192700FC82C8 /* SignaledEvent.cpp in Sources */, D5251E451538192700FC82C8 /* SignaledEvent.cpp in Sources */,
F99D34342F736BDA00DC153E /* CreditsScreen.cpp in Sources */,
D5251E471538192700FC82C8 /* SimpleMutex.cpp in Sources */, D5251E471538192700FC82C8 /* SimpleMutex.cpp in Sources */,
D5251E491538192700FC82C8 /* SocketLayer.cpp in Sources */, D5251E491538192700FC82C8 /* SocketLayer.cpp in Sources */,
D5251E4B1538192700FC82C8 /* StringCompressor.cpp in Sources */, D5251E4B1538192700FC82C8 /* StringCompressor.cpp in Sources */,
D5251E4D1538192700FC82C8 /* StringTable.cpp in Sources */, D5251E4D1538192700FC82C8 /* StringTable.cpp in Sources */,
D5251E4F1538192700FC82C8 /* SuperFastHash.cpp in Sources */, D5251E4F1538192700FC82C8 /* SuperFastHash.cpp in Sources */,
F99D342B2F736B6F00DC153E /* OptionsItem.cpp in Sources */,
D5251E511538192700FC82C8 /* TableSerializer.cpp in Sources */, D5251E511538192700FC82C8 /* TableSerializer.cpp in Sources */,
D5251E531538192700FC82C8 /* TCPInterface.cpp in Sources */, D5251E531538192700FC82C8 /* TCPInterface.cpp in Sources */,
D5251E551538192700FC82C8 /* TeamBalancer.cpp in Sources */, D5251E551538192700FC82C8 /* TeamBalancer.cpp in Sources */,
@@ -5626,6 +5720,7 @@
D5951EDD159348C50043A12A /* ItemPane.cpp in Sources */, D5951EDD159348C50043A12A /* ItemPane.cpp in Sources */,
D5951EE3159349000043A12A /* FurnaceTile.cpp in Sources */, D5951EE3159349000043A12A /* FurnaceTile.cpp in Sources */,
D5951EE8159349100043A12A /* FurnaceTileEntity.cpp in Sources */, D5951EE8159349100043A12A /* FurnaceTileEntity.cpp in Sources */,
F99D342F2F736BAD00DC153E /* ConsoleScreen.cpp in Sources */,
D5951EEA159349100043A12A /* TileEntity.cpp in Sources */, D5951EEA159349100043A12A /* TileEntity.cpp in Sources */,
D5951EEE159349680043A12A /* FurnaceScreen.cpp in Sources */, D5951EEE159349680043A12A /* FurnaceScreen.cpp in Sources */,
D5951EF115934A2D0043A12A /* Feature.cpp in Sources */, D5951EF115934A2D0043A12A /* Feature.cpp in Sources */,
@@ -5662,6 +5757,7 @@
D544941E15D13F45005FA9B0 /* PlayerRenderer.cpp in Sources */, D544941E15D13F45005FA9B0 /* PlayerRenderer.cpp in Sources */,
D544942215D13F5E005FA9B0 /* RemotePlayer.cpp in Sources */, D544942215D13F5E005FA9B0 /* RemotePlayer.cpp in Sources */,
D5B17ED515E226F50056E751 /* Throwable.cpp in Sources */, D5B17ED515E226F50056E751 /* Throwable.cpp in Sources */,
F99D341F2F736AA100DC153E /* HttpClient.cpp in Sources */,
D5B17ED915E2273F0056E751 /* SurvivalMode.cpp in Sources */, D5B17ED915E2273F0056E751 /* SurvivalMode.cpp in Sources */,
D5B17EDD15E227670056E751 /* TrapDoorTile.cpp in Sources */, D5B17EDD15E227670056E751 /* TrapDoorTile.cpp in Sources */,
D5B17EE115E260910056E751 /* MoveFolder.mm in Sources */, D5B17EE115E260910056E751 /* MoveFolder.mm in Sources */,
@@ -5697,6 +5793,7 @@
0400453A16A4125C003EB6FA /* FallingTileRenderer.cpp in Sources */, 0400453A16A4125C003EB6FA /* FallingTileRenderer.cpp in Sources */,
0413970716A82E1E008A9F1A /* ArmorItem.cpp in Sources */, 0413970716A82E1E008A9F1A /* ArmorItem.cpp in Sources */,
0413970D16A82E6B008A9F1A /* CraftingFilters.cpp in Sources */, 0413970D16A82E6B008A9F1A /* CraftingFilters.cpp in Sources */,
F99D34272F736AFB00DC153E /* OptionsFile.cpp in Sources */,
0413970E16A82E6B008A9F1A /* StonecutterScreen.cpp in Sources */, 0413970E16A82E6B008A9F1A /* StonecutterScreen.cpp in Sources */,
0413971116A82E7B008A9F1A /* ArmorScreen.cpp in Sources */, 0413971116A82E7B008A9F1A /* ArmorScreen.cpp in Sources */,
0413971516A82EB9008A9F1A /* ArmorRecipes.cpp in Sources */, 0413971516A82EB9008A9F1A /* ArmorRecipes.cpp in Sources */,
@@ -5705,7 +5802,6 @@
042A91AE16B17517007ABBC6 /* GuiElement.cpp in Sources */, 042A91AE16B17517007ABBC6 /* GuiElement.cpp in Sources */,
042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */, 042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */,
042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */, 042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */,
042A91B116B17517007ABBC6 /* OptionsPane.cpp in Sources */,
042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */, 042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@@ -5743,7 +5839,7 @@
D50BE20815EE05B8008AA75E /* Ad-Hoc */ = { D50BE20815EE05B8008AA75E /* Ad-Hoc */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = YES;
ARCHS = "$(ARCHS_STANDARD)"; ARCHS = "$(ARCHS_STANDARD)";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB";
COPY_PHASE_STRIP = YES; COPY_PHASE_STRIP = YES;
@@ -5756,11 +5852,7 @@
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO; GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
"$(SRCROOT)/src/**",
"$(SRCROOT)/src/client/gui/components/**",
"$(SRCROOT)/src/client/gui/**",
);
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
@@ -5768,7 +5860,8 @@
RUN_CLANG_STATIC_ANALYZER = NO; RUN_CLANG_STATIC_ANALYZER = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)\\src/**"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
USE_HEADERMAP = NO;
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;
}; };
name = "Ad-Hoc"; name = "Ad-Hoc";
@@ -5783,9 +5876,11 @@
GCC_VERSION = ""; GCC_VERSION = "";
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = (
"$(SRCROOT)/src/client/gui/components/**", "$(SRCROOT)/../../src",
"$(SRCROOT)/src/client/gui/**", "$(SRCROOT)/../../src/client/gui/components",
"$(SRCROOT)/src/**", "$(SRCROOT)/../../src/world",
"$(SRCROOT)/../../src/platform/input",
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
); );
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
@@ -5795,6 +5890,9 @@
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
RUN_CLANG_STATIC_ANALYZER = NO; RUN_CLANG_STATIC_ANALYZER = NO;
SDKROOT = iphoneos; 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; WRAPPER_EXTENSION = app;
}; };
name = "Ad-Hoc"; name = "Ad-Hoc";
@@ -5867,7 +5965,7 @@
D5A20ADB146AAD9C00A52FEC /* AppStore */ = { D5A20ADB146AAD9C00A52FEC /* AppStore */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = YES;
ARCHS = "$(ARCHS_STANDARD)"; ARCHS = "$(ARCHS_STANDARD)";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB";
COPY_PHASE_STRIP = YES; COPY_PHASE_STRIP = YES;
@@ -5879,11 +5977,7 @@
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO; GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
"$(SRCROOT)/src/**",
"$(SRCROOT)/src/client/gui/components/**",
"$(SRCROOT)/src/client/gui/**",
);
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
@@ -5891,7 +5985,8 @@
RUN_CLANG_STATIC_ANALYZER = NO; RUN_CLANG_STATIC_ANALYZER = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)\\src/**"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
USE_HEADERMAP = NO;
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;
}; };
name = AppStore; name = AppStore;
@@ -5907,9 +6002,11 @@
GCC_VERSION = ""; GCC_VERSION = "";
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = (
"$(SRCROOT)/src/client/gui/components/**", "$(SRCROOT)/../../src",
"$(SRCROOT)/src/client/gui/**", "$(SRCROOT)/../../src/client/gui/components",
"$(SRCROOT)/src/**", "$(SRCROOT)/../../src/world",
"$(SRCROOT)/../../src/platform/input",
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
); );
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
@@ -5923,6 +6020,9 @@
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "1B194957-98CF-49B7-A0E7-76692B4B722D"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "1B194957-98CF-49B7-A0E7-76692B4B722D";
RUN_CLANG_STATIC_ANALYZER = NO; RUN_CLANG_STATIC_ANALYZER = NO;
SDKROOT = iphoneos; 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; WRAPPER_EXTENSION = app;
}; };
name = AppStore; name = AppStore;
@@ -5955,7 +6055,7 @@
D5CF9C6C144C225000E4244F /* Debug */ = { D5CF9C6C144C225000E4244F /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = YES;
ARCHS = "$(ARCHS_STANDARD)"; ARCHS = "$(ARCHS_STANDARD)";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
@@ -5975,17 +6075,14 @@
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO; GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
"$(SRCROOT)/src/**",
"$(SRCROOT)/src/client/gui/components/**",
"$(SRCROOT)/src/client/gui/**",
);
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
RUN_CLANG_STATIC_ANALYZER = NO; RUN_CLANG_STATIC_ANALYZER = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)\\src/**"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
USE_HEADERMAP = NO;
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;
}; };
name = Debug; name = Debug;
@@ -5993,7 +6090,7 @@
D5CF9C6D144C225000E4244F /* Release */ = { D5CF9C6D144C225000E4244F /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = YES;
ARCHS = "$(ARCHS_STANDARD)"; ARCHS = "$(ARCHS_STANDARD)";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES; COPY_PHASE_STRIP = YES;
@@ -6006,18 +6103,15 @@
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO; GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
"$(SRCROOT)/src/**",
"$(SRCROOT)/src/client/gui/components/**",
"$(SRCROOT)/src/client/gui/**",
);
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
RUN_CLANG_STATIC_ANALYZER = NO; RUN_CLANG_STATIC_ANALYZER = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)\\src/**"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
USE_HEADERMAP = NO;
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;
}; };
name = Release; name = Release;
@@ -6035,9 +6129,11 @@
GCC_VERSION = ""; GCC_VERSION = "";
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = (
"$(SRCROOT)/src/client/gui/components/**", "$(SRCROOT)/../../src",
"$(SRCROOT)/src/client/gui/**", "$(SRCROOT)/../../src/client/gui/components",
"$(SRCROOT)/src/**", "$(SRCROOT)/../../src/world",
"$(SRCROOT)/../../src/platform/input",
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
); );
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
@@ -6048,6 +6144,9 @@
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
RUN_CLANG_STATIC_ANALYZER = NO; RUN_CLANG_STATIC_ANALYZER = NO;
SDKROOT = iphoneos; 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; WRAPPER_EXTENSION = app;
}; };
name = Debug; name = Debug;
@@ -6065,9 +6164,11 @@
GCC_VERSION = ""; GCC_VERSION = "";
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = (
"$(SRCROOT)/src/client/gui/components/**", "$(SRCROOT)/../../src",
"$(SRCROOT)/src/client/gui/**", "$(SRCROOT)/../../src/client/gui/components",
"$(SRCROOT)/src/**", "$(SRCROOT)/../../src/world",
"$(SRCROOT)/../../src/platform/input",
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
); );
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
@@ -6078,6 +6179,9 @@
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
RUN_CLANG_STATIC_ANALYZER = NO; RUN_CLANG_STATIC_ANALYZER = NO;
SDKROOT = iphoneos; 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; WRAPPER_EXTENSION = app;
}; };
name = Release; name = Release;

View File

@@ -58,6 +58,8 @@
<array> <array>
<string>minecraft.ttf</string> <string>minecraft.ttf</string>
</array> </array>
<key>UILaunchStoryboardName</key>
<string>Launch Screen</string>
<key>UIPrerenderedIcon</key> <key>UIPrerenderedIcon</key>
<true/> <true/>
<key>UIRequiresPersistentWiFi</key> <key>UIRequiresPersistentWiFi</key>

View File

@@ -4,10 +4,11 @@ include $(CLEAR_VARS)
LOCAL_MODULE := RakNet LOCAL_MODULE := RakNet
MY_PREFIX := $(LOCAL_PATH)/RakNetSources/ MY_PREFIX := $(LOCAL_PATH)/RaknetSources/
MY_SOURCES := $(wildcard $(MY_PREFIX)*.cpp) 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_CFLAGS := -Wno-psabi $(LOCAL_CFLAGS)
LOCAL_CPPFLAGS += -frtti
include $(BUILD_STATIC_LIBRARY) include $(BUILD_STATIC_LIBRARY)

View File

@@ -1,8 +1,8 @@
#if defined(X360__) #if defined(X360__)
#elif defined (_WIN32) #elif defined (_WIN32)
#include <WinSock2.h> #include <winsock2.h>
#include <windows.h> #include <windows.h>
#include <Ws2tcpip.h> #include <ws2tcpip.h>
// Must always include Winsock2.h before windows.h // Must always include Winsock2.h before windows.h
// or else: // or else:

View File

@@ -74,6 +74,8 @@ public:
virtual TextureData loadTextureFromMemory(const unsigned char* data, size_t size) { return TextureData(); } 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 playSound(const std::string& fn, float volume, float pitch) {}
virtual void hideCursor(bool hide) {}
virtual void showDialog(int dialogId) {} virtual void showDialog(int dialogId) {}
virtual void createUserInput() {} virtual void createUserInput() {}

View File

@@ -202,6 +202,8 @@ public:
LOGI("initConsts: screenWidth=%d, calling getScreenHeight\n", _screenWidth); LOGI("initConsts: screenWidth=%d, calling getScreenHeight\n", _screenWidth);
_screenHeight = env->CallIntMethod(instance, fHeight); _screenHeight = env->CallIntMethod(instance, fHeight);
LOGI("initConsts: screenHeight=%d, done\n", _screenHeight); LOGI("initConsts: screenHeight=%d, done\n", _screenHeight);
return 1;
} }
void tick() { void tick() {
@@ -536,7 +538,7 @@ public:
static __inline bool isSquare(int n) { static __inline bool isSquare(int n) {
int L = n & 0xf; 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; int t = (int) sqrt((double) n) + 0.5;
return t*t == n; return t*t == n;

View File

@@ -20,6 +20,10 @@
#include <shellapi.h> #include <shellapi.h>
#endif #endif
#ifdef __EMSCRIPTEN__
#include <emscripten/html5.h>
#endif
static void png_funcReadFile(png_structp pngPtr, png_bytep data, png_size_t length) { 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); ((std::istream*)png_get_io_ptr(pngPtr))->read((char*)data, length);
} }
@@ -31,7 +35,7 @@ public:
{ {
} }
BinaryBlob readAssetFile(const std::string& filename) { BinaryBlob readAssetFile(const std::string& filename) override {
FILE* fp = fopen(("data/" + filename).c_str(), "r"); FILE* fp = fopen(("data/" + filename).c_str(), "r");
if (!fp) if (!fp)
return BinaryBlob(); return BinaryBlob();
@@ -48,7 +52,7 @@ public:
return blob; return blob;
} }
void saveScreenshot(const std::string& filename, int glWidth, int glHeight) { void saveScreenshot(const std::string& filename, int glWidth, int glHeight) override {
//@todo //@todo
} }
@@ -56,7 +60,7 @@ public:
return (p & 0xff00ff00) | ((p >> 16) & 0xff) | ((p << 16) & 0xff0000); return (p & 0xff00ff00) | ((p >> 16) & 0xff) | ((p << 16) & 0xff0000);
} }
TextureData loadTexture(const std::string& filename_, bool textureFolder) TextureData loadTexture(const std::string& filename_, bool textureFolder) override
{ {
// Support fetching PNG textures via HTTP/HTTPS (for skins, etc) // Support fetching PNG textures via HTTP/HTTPS (for skins, etc)
if (Util::startsWith(filename_, "http://") || Util::startsWith(filename_, "https://")) { if (Util::startsWith(filename_, "http://") || Util::startsWith(filename_, "https://")) {
@@ -73,50 +77,20 @@ public:
: filename_; : filename_;
std::ifstream source(filename.c_str(), std::ios::binary); 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()); LOGI("Couldn't find file: %s\n", filename.c_str());
return out; 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 { TextureData loadTextureFromMemory(const unsigned char* data, size_t size) override {
@@ -132,12 +106,36 @@ public:
return std::string(mbstr); return std::string(mbstr);
} }
virtual int getScreenWidth() { return 854; }; virtual int getScreenWidth() override {
virtual int getScreenHeight() { return 480; }; #ifdef __EMSCRIPTEN__
int w, h;
emscripten_get_canvas_element_size("canvas", &w, &h);
virtual float getPixelsPerMillimeter(); return w;
#endif
virtual bool supportsTouchscreen() override { return true; } 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 void openURL(const std::string& url) override { virtual void openURL(const std::string& url) override {
#ifdef _WIN32 #ifdef _WIN32
@@ -145,9 +143,13 @@ public:
#elif __linux__ #elif __linux__
std::string command = "xdg-open " + url; std::string command = "xdg-open " + url;
system(command.c_str()); system(command.c_str());
#elif __EMSCRIPTEN__
emscripten_run_script(std::string("window.open('" + url + "', '_blank')").c_str());
#endif #endif
} }
GLFWwindow* window;
private: private:
}; };
#endif /*APPPLATFORM_GLFW_H__*/ #endif /*APPPLATFORM_GLFW_H__*/

View File

@@ -275,8 +275,10 @@ void AppPlatform_iOS::hideKeyboard() {
[_viewController hideKeyboard]; [_viewController hideKeyboard];
super::hideKeyboard(); super::hideKeyboard();
} }
void AppPlatform_iOS::isPowerVR() {
// this was originally void but i changed it to bool because void cant return values
bool AppPlatform_iOS::isPowerVR() {
const char* s = (const char*)glGetString(GL_RENDERER); const char* s = (const char*)glGetString(GL_RENDERER);
if (!s) return false; if (!s) return false;
return strstr(s, "SGX") != NULL; return strstr(s, "SGX") != NULL;
} }

View File

@@ -99,6 +99,9 @@ void NinecraftApp::init()
I18n::loadLanguage(platform(), "en_US"); I18n::loadLanguage(platform(), "en_US");
#endif #endif
if (!externalStoragePath.empty()) {
options.setOptionsFilePath(externalStoragePath);
}
Minecraft::init(); Minecraft::init();
#if !defined(DEMO_MODE) && !defined(APPLE_DEMO_PROMOTION) && !defined(NO_STORAGE) #if !defined(DEMO_MODE) && !defined(APPLE_DEMO_PROMOTION) && !defined(NO_STORAGE)
@@ -117,7 +120,6 @@ void NinecraftApp::init()
setScreen(new UsernameScreen()); setScreen(new UsernameScreen());
} }
#else #else
user->name = "Server";
hostMultiplayer(); hostMultiplayer();
#endif #endif
} }
@@ -246,8 +248,9 @@ void NinecraftApp::initGLStates()
glCullFace(GL_BACK); glCullFace(GL_BACK);
glEnable2(GL_TEXTURE_2D); glEnable2(GL_TEXTURE_2D);
#ifndef _EMSCRIPTEN_
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); 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 // Both updates isPowerVR flag in java and returns if the graphics chip is PowerVR SGX or not
_powerVr = platform()->isPowerVR(); _powerVr = platform()->isPowerVR();
#ifdef __APPLE__ #ifdef __APPLE__

View File

@@ -1,4 +1,5 @@
#include "Minecraft.h" #include "Minecraft.h"
#include "Options.h"
#include "client/Options.h" #include "client/Options.h"
#include "client/player/input/IBuildInput.h" #include "client/player/input/IBuildInput.h"
#include "platform/input/Keyboard.h" #include "platform/input/Keyboard.h"
@@ -23,6 +24,8 @@
#include "../world/level/storage/LevelStorageSource.h" #include "../world/level/storage/LevelStorageSource.h"
#include "../world/level/storage/LevelStorage.h" #include "../world/level/storage/LevelStorage.h"
#include "player/input/KeyboardInput.h" #include "player/input/KeyboardInput.h"
#include "player/input/ControllerTurnInput.h"
#include "player/input/XperiaPlayInput.h"
#include "world/level/chunk/ChunkSource.h" #include "world/level/chunk/ChunkSource.h"
#ifndef STANDALONE_SERVER #ifndef STANDALONE_SERVER
@@ -87,6 +90,7 @@
#include "../network/command/CommandServer.h" #include "../network/command/CommandServer.h"
#include "gamemode/CreatorMode.h" #include "gamemode/CreatorMode.h"
#include "../world/level/GrassColor.h"
static void checkGlError(const char* tag) { static void checkGlError(const char* tag) {
#ifdef GLDEBUG #ifdef GLDEBUG
while (1) { while (1) {
@@ -114,8 +118,7 @@ int Minecraft::customDebugId = Minecraft::CDI_NONE;
bool Minecraft::useAmbientOcclusion = false; bool Minecraft::useAmbientOcclusion = false;
Minecraft::Minecraft() Minecraft::Minecraft() :
: user(NULL),
level(NULL), level(NULL),
player(NULL), player(NULL),
cameraTargetPlayer(NULL), cameraTargetPlayer(NULL),
@@ -220,7 +223,6 @@ Minecraft::~Minecraft()
} }
//delete player; //delete player;
delete user;
delete inputHolder; delete inputHolder;
delete storageSource; delete storageSource;
@@ -640,13 +642,11 @@ void Minecraft::tickInput() {
const MouseAction& e = Mouse::getEvent(); const MouseAction& e = Mouse::getEvent();
#ifdef RPI // If clicked when not having focus, get focus @keyboard if (!useTouchscreen() && !mouseGrabbed) {
if (!mouseGrabbed) {
if (!screen && e.data == MouseAction::DATA_DOWN) { if (!screen && e.data == MouseAction::DATA_DOWN) {
grabMouse(); grabMouse();
} }
} }
#endif
if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) {
gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY());
@@ -660,9 +660,7 @@ void Minecraft::tickInput() {
Inventory* v = player->inventory; Inventory* v = player->inventory;
int numSlots = gui.getNumSlots(); int numSlots = gui.getNumSlots();
#ifndef PLATFORM_DESKTOP if (!useTouchscreen()) numSlots--;
numSlots--;
#endif
int slot = (v->selected - e.dy + numSlots) % numSlots; int slot = (v->selected - e.dy + numSlots) % numSlots;
v->selectSlot(slot); v->selectSlot(slot);
@@ -691,155 +689,147 @@ void Minecraft::tickInput() {
if (isPressed) { if (isPressed) {
gui.handleKeyPressed(key); gui.handleKeyPressed(key);
#if defined(WIN32) || defined(RPI) || defined (PLATFORM_DESKTOP)//|| defined(_DEBUG) || defined(DEBUG) if (key >= '0' && key <= '9') {
if (key >= '0' && key <= '9') { int digit = key - '0';
int digit = key - '0'; int slot = digit - 1;
int slot = digit - 1;
if (slot >= 0 && slot < gui.getNumSlots()) if (slot >= 0 && slot < gui.getNumSlots())
player->inventory->selectSlot(slot); player->inventory->selectSlot(slot);
#if defined(WIN32) #if defined(WIN32)
if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) {
// Set adventure settings here! // Set adventure settings here!
AdventureSettingsPacket p(level->adventureSettings); AdventureSettingsPacket p(level->adventureSettings);
p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); p.toggle((AdventureSettingsPacket::Flags)(1 << slot));
p.fillIn(level->adventureSettings); p.fillIn(level->adventureSettings);
raknetInstance->send(p); raknetInstance->send(p);
} }
if (digit == 0) { if (digit == 0) {
Pos pos((int)player->x, (int)player->y-1, (int)player->z); Pos pos((int)player->x, (int)player->y-1, (int)player->z);
SetSpawnPositionPacket p(pos); SetSpawnPositionPacket p(pos);
raknetInstance->send(p); raknetInstance->send(p);
} }
#endif #endif
} }
#endif
#if defined(PLATFORM_DESKTOP) if (key == Keyboard::KEY_LEFT_CTRL) {
if (key == Keyboard::KEY_LEFT_CTRL) { player->setSprinting(true);
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 (key == Keyboard::KEY_E) { if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode
screenChooser.setScreen(SCREEN_BLOCKSELECTION); setIsCreativeMode(!isCreativeMode());
}
if (!screen && key == Keyboard::KEY_T && level) { if (key == Keyboard::KEY_P) // Step forward in time
setScreen(new ConsoleScreen()); level->setTime( level->getTime() + 1000);
}
if (key == Keyboard::KEY_F3) { if (key == Keyboard::KEY_G) {
options.toggle(OPTIONS_RENDER_DEBUG); setScreen(new ArmorScreen());
}
if (key == Keyboard::KEY_F5) {
options.toggle(OPTIONS_THIRD_PERSON_VIEW);
/* /*
ImprovedNoise noise; std::vector<AABB>& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f));
for (int i = 0; i < 16; ++i) LOGI("boxes: %d\n", (int)boxs.size());
printf("%d\t%f\n", i, noise.grad2(i, 3, 8));
*/ */
} }
if (!screen && key == Keyboard::KEY_O || key == 250) { if (key == Keyboard::KEY_Y) {
releaseMouse(); 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_F) { if (key == Keyboard::KEY_X) {
int dst = options.getIntValue(OPTIONS_VIEW_DISTANCE); const EntityList& entities = level->getAllEntities();
options.set(OPTIONS_VIEW_DISTANCE, (dst + 1) % 4); for (int i = entities.size()-1; i >= 0; --i) {
Entity* e = entities[i];
if (!e->isPlayer())
level->removeEntity(e);
}
} }
#ifdef CHEATS
if (key == Keyboard::KEY_U) { if (key == Keyboard::KEY_C /*|| key == 4*/) {
onGraphicsReset(); player->inventory->clearInventoryWithDefault();
player->heal(100); // @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_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_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 #endif
#ifndef PLATFORM_DESKTOP if (key == Keyboard::KEY_ESCAPE)
if (key == 82) pauseGame(false);
pauseGame(false);
#else
if (key == Keyboard::KEY_ESCAPE)
pauseGame(false);
#endif
#ifndef OPENGL_ES #ifndef OPENGL_ES
if (key == Keyboard::KEY_P) { if (key == Keyboard::KEY_P) {
@@ -866,11 +856,18 @@ void Minecraft::tickInput() {
gameMode->stopDestroyBlock(); gameMode->stopDestroyBlock();
} }
if (!Mouse::isButtonDown(MouseAction::ACTION_RIGHT)) {
gameMode->releaseUsingItem(player);
}
if (useTouchscreen()) { if (useTouchscreen()) {
// Touch: gesture recognizer classifies the action type (turn/destroy/build) // Touch: gesture recognizer classifies the action type (turn/destroy/build)
BuildActionIntention bai; BuildActionIntention bai;
if (inputHolder && inputHolder->getBuildInput()->tickBuild(player, &bai)) { if (inputHolder && inputHolder->getBuildInput()->tickBuild(player, &bai)) {
handleBuildAction(&bai); handleBuildAction(&bai);
} else {
gameMode->stopDestroyBlock();
} }
} else { } else {
// Desktop: left mouse = destroy/attack // Desktop: left mouse = destroy/attack
@@ -1109,10 +1106,12 @@ void Minecraft::releaseMouse()
} }
bool Minecraft::useTouchscreen() { bool Minecraft::useTouchscreen() {
#ifdef RPI #if TARGET_OS_IPHONE
return true;
#elif RPI
return false; return false;
#endif #endif
return options.getBooleanValue(OPTIONS_USE_TOUCHSCREEN) || !_supportsNonTouchscreen; return options.getBooleanValue(OPTIONS_USE_TOUCHSCREEN) && !_supportsNonTouchscreen;
} }
bool Minecraft::supportNonTouchScreen() { bool Minecraft::supportNonTouchScreen() {
return _supportsNonTouchscreen; return _supportsNonTouchscreen;
@@ -1129,12 +1128,31 @@ void Minecraft::init()
textures = new Textures(&options, platform()); textures = new Textures(&options, platform());
textures->addDynamicTexture(new WaterTexture()); textures->addDynamicTexture(new WaterTexture());
textures->addDynamicTexture(new WaterSideTexture()); textures->addDynamicTexture(new WaterSideTexture());
textures->addDynamicTexture(new FireTexture());
gui.texturesLoaded(textures); gui.texturesLoaded(textures);
levelRenderer = new LevelRenderer(this); levelRenderer = new LevelRenderer(this);
gameRenderer = new GameRenderer(this); gameRenderer = new GameRenderer(this);
particleEngine = new ParticleEngine(level, textures); 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 // Platform specific initialization here
font = new Font(&options, "font/default8.png", textures); font = new Font(&options, "font/default8.png", textures);
@@ -1143,10 +1161,10 @@ void Minecraft::init()
checkGlError("Init complete"); checkGlError("Init complete");
#endif #endif
user = new User(options.getStringValue(OPTIONS_USERNAME), ""); options.load();
setIsCreativeMode(false); // false means it's Survival Mode setIsCreativeMode(false); // false means it's Survival Mode
reloadOptions(); reloadOptions();
} }
void Minecraft::setSize(int w, int h) { void Minecraft::setSize(int w, int h) {
@@ -1160,12 +1178,13 @@ void Minecraft::setSize(int w, int h) {
// determine gui scale, optionally overriding auto // determine gui scale, optionally overriding auto
if (guiScale != 0) { if (guiScale != 0) {
// manual selection: 1->small, 2->normal, 3->large, 4->larger // manual selection: 1->small, 2->medium, 3->large, 4->larger, 5->largest
switch (guiScale) { switch (guiScale) {
case 1: Gui::GuiScale = 2.0f; break; case 1: Gui::GuiScale = 2.0f; break;
case 2: Gui::GuiScale = 3.0f; break; case 2: Gui::GuiScale = 3.0f; break;
case 3: Gui::GuiScale = 4.0f; break; case 3: Gui::GuiScale = 4.0f; break;
case 4: Gui::GuiScale = 5.0f; break; // bigger than large case 4: Gui::GuiScale = 5.0f; break;
case 5: Gui::GuiScale = 6.0f; break;
default: Gui::GuiScale = 1.0f; break; // auto default: Gui::GuiScale = 1.0f; break; // auto
} }
} else { } else {
@@ -1227,7 +1246,6 @@ void Minecraft::reloadOptions() {
if ((wasTouchscreen != useTouchscreen()) || (inputHolder == 0)) if ((wasTouchscreen != useTouchscreen()) || (inputHolder == 0))
_reloadInput(); _reloadInput();
// TODO:
// user->name = options.username; // user->name = options.username;
LOGI("Reloading-options\n"); LOGI("Reloading-options\n");
@@ -1241,11 +1259,7 @@ void Minecraft::_reloadInput() {
#ifndef STANDALONE_SERVER #ifndef STANDALONE_SERVER
delete inputHolder; delete inputHolder;
#ifdef PLATFORM_DESKTOP
const bool useTouchHolder = false;
#else
const bool useTouchHolder = useTouchscreen(); const bool useTouchHolder = useTouchscreen();
#endif
if (useTouchHolder) { if (useTouchHolder) {
inputHolder = new TouchInputHolder(this, &options); inputHolder = new TouchInputHolder(this, &options);
} else { } else {
@@ -1332,9 +1346,9 @@ void Minecraft::hostMultiplayer(int port) {
#if !defined(NO_NETWORK) #if !defined(NO_NETWORK)
netCallback = new ServerSideNetworkHandler(this, raknetInstance); netCallback = new ServerSideNetworkHandler(this, raknetInstance);
#ifdef STANDALONE_SERVER #ifdef STANDALONE_SERVER
raknetInstance->host(user->name, port, 16); raknetInstance->host("Server", port, 16);
#else #else
raknetInstance->host(user->name, port); raknetInstance->host(options.getStringValue(OPTIONS_USERNAME), port);
#endif #endif
#endif #endif
} }
@@ -1391,8 +1405,10 @@ void Minecraft::_levelGenerated()
this->cameraTargetPlayer = player; this->cameraTargetPlayer = player;
std::string serverName = options.getStringValue(OPTIONS_USERNAME) + " - " + level->getLevelData()->levelName;
if (raknetInstance->isServer()) if (raknetInstance->isServer())
raknetInstance->announceServer(user->name); raknetInstance->announceServer(serverName);
if (netCallback) { if (netCallback) {
netCallback->levelGenerated(level); netCallback->levelGenerated(level);
@@ -1568,6 +1584,8 @@ void Minecraft::optionUpdated(OptionId option, bool value ) {
if(netCallback != NULL && option == OPTIONS_SERVER_VISIBLE) { if(netCallback != NULL && option == OPTIONS_SERVER_VISIBLE) {
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback;
ss->allowIncomingConnections(value); ss->allowIncomingConnections(value);
} else if (option == OPTIONS_USE_TOUCHSCREEN) {
_reloadInput();
} }
} }

View File

@@ -13,7 +13,6 @@
//#include "../network/RakNetInstance.h" //#include "../network/RakNetInstance.h"
#include "../world/phys/HitResult.h" #include "../world/phys/HitResult.h"
class User;
class Level; class Level;
class LocalPlayer; class LocalPlayer;
class IInputHolder; class IInputHolder;
@@ -110,6 +109,8 @@ public:
bool isLevelGenerated(); bool isLevelGenerated();
void handleMouseDown(int button, bool down);
void audioEngineOn(); void audioEngineOn();
void audioEngineOff(); void audioEngineOff();
@@ -165,7 +166,6 @@ public:
int lastTickTime; int lastTickTime;
float ticksSinceLastUpdate; float ticksSinceLastUpdate;
User* user;
Level* level; Level* level;
LocalPlayer* player; LocalPlayer* player;
@@ -221,6 +221,7 @@ private:
bool _isCreativeMode; bool _isCreativeMode;
//int _respawnPlayerTicks; //int _respawnPlayerTicks;
Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour
// shit* lmao
PerfRenderer* _perfRenderer; PerfRenderer* _perfRenderer;
CommandServer* _commandServer; CommandServer* _commandServer;

View File

@@ -5,7 +5,7 @@
#include <SDL/SDL.h> #include <SDL/SDL.h>
#endif #endif
#ifdef PLATFORM_GLFW #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#endif #endif
@@ -34,7 +34,7 @@ void MouseHandler::grab() {
SDL_ShowCursor(0); SDL_ShowCursor(0);
#endif #endif
#ifdef PLATFORM_GLFW #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
glfwSetInputMode(glfwGetCurrentContext(), GLFW_CURSOR, GLFW_CURSOR_DISABLED); glfwSetInputMode(glfwGetCurrentContext(), GLFW_CURSOR, GLFW_CURSOR_DISABLED);
#endif #endif
} }
@@ -46,7 +46,7 @@ void MouseHandler::release() {
SDL_ShowCursor(1); SDL_ShowCursor(1);
#endif #endif
#ifdef PLATFORM_GLFW #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
glfwSetInputMode(glfwGetCurrentContext(), GLFW_CURSOR, GLFW_CURSOR_NORMAL); glfwSetInputMode(glfwGetCurrentContext(), GLFW_CURSOR, GLFW_CURSOR_NORMAL);
#endif #endif
} }

View File

@@ -1,5 +1,8 @@
#include "Option.h" #include "Option.h"
#include <sstream> #include <sstream>
#include <cstdio>
Option::~Option() {}
bool Option::parse_bool_like(const std::string& value, bool& out) { bool Option::parse_bool_like(const std::string& value, bool& out) {
if (value == "true" || value == "YES") { if (value == "true" || value == "YES") {
@@ -23,7 +26,7 @@ bool OptionFloat::parse(const std::string& value) {
return true; return true;
} }
return std::sscanf(value.c_str(), "%f", &m_value) == 1; return sscanf(value.c_str(), "%f", &m_value) == 1;
} }
bool OptionInt::parse(const std::string& value) { bool OptionInt::parse(const std::string& value) {
bool b; bool b;
@@ -32,7 +35,7 @@ bool OptionInt::parse(const std::string& value) {
return true; return true;
} }
return std::sscanf(value.c_str(), "%d", &m_value) == 1; return sscanf(value.c_str(), "%d", &m_value) == 1;
} }
bool OptionBool::parse(const std::string& value) { bool OptionBool::parse(const std::string& value) {
if (value == "0") { if (value == "0") {

View File

@@ -1,7 +1,7 @@
#pragma once #pragma once
#include <sstream> #include <sstream>
#include <type_traits> #include <type_traits>
#include "Mth.h" #include <util/Mth.h>
/* /*
template<typename T> template<typename T>
struct is_option_type : std::false_type {}; struct is_option_type : std::false_type {};
@@ -21,7 +21,7 @@ template<> struct is_min_max_option<float> : std::true_type {};
class Option { class Option {
public: public:
Option(const std::string& key) : m_key("options." + key) {} Option(const std::string& key) : m_key("options." + key) {}
virtual ~Option() = default; virtual ~Option();
const std::string& getStringId() { return m_key; } const std::string& getStringId() { return m_key; }

View File

@@ -20,6 +20,7 @@ OptionBool fixedCamera("fixedCamera", false);
OptionBool isFlying("isflying", false); OptionBool isFlying("isflying", false);
OptionBool barOnTop("barOnTop", false); OptionBool barOnTop("barOnTop", false);
OptionBool allowSprint("allowSprint", true); OptionBool allowSprint("allowSprint", true);
OptionBool rpiCursor("rpiCursor", false);
OptionBool autoJump("autoJump", true); OptionBool autoJump("autoJump", true);
@@ -59,6 +60,8 @@ OptionBool useTouchscreen("useTouchscreen", true);
OptionBool serverVisible("servervisible", true); OptionBool serverVisible("servervisible", true);
OptionBool foliageTint("foliagetint", false);
OptionInt keyForward("key.forward", Keyboard::KEY_W); OptionInt keyForward("key.forward", Keyboard::KEY_W);
OptionInt keyLeft("key.left", Keyboard::KEY_A); OptionInt keyLeft("key.left", Keyboard::KEY_A);
OptionInt keyBack("key.back", Keyboard::KEY_S); OptionInt keyBack("key.back", Keyboard::KEY_S);
@@ -135,6 +138,8 @@ void Options::initTable() {
m_options[OPTIONS_USE_TOUCHSCREEN] = &useTouchscreen; m_options[OPTIONS_USE_TOUCHSCREEN] = &useTouchscreen;
m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible; m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible;
m_options[OPTIONS_KEY_FORWARD] = &keyForward; m_options[OPTIONS_KEY_FORWARD] = &keyForward;
@@ -158,6 +163,8 @@ void Options::initTable() {
m_options[OPTIONS_BAR_ON_TOP] = &barOnTop; m_options[OPTIONS_BAR_ON_TOP] = &barOnTop;
m_options[OPTIONS_ALLOW_SPRINT] = &allowSprint; 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_AUTOJUMP] = &autoJump;
m_options[OPTIONS_LAST_IP] = &lastIp; m_options[OPTIONS_LAST_IP] = &lastIp;
@@ -168,9 +175,7 @@ void Options::set(OptionId key, const std::string& value) {
if (option) { if (option) {
option->set(value); option->set(value);
notifyOptionUpdate(key, value); notifyOptionUpdate(key, value);
save();
} }
} }
@@ -179,9 +184,7 @@ void Options::set(OptionId key, float value) {
if (option) { if (option) {
option->set(value); option->set(value);
notifyOptionUpdate(key, value); notifyOptionUpdate(key, value);
save();
} }
} }
@@ -190,9 +193,7 @@ void Options::set(OptionId key, int value) {
if (option) { if (option) {
option->set(value); option->set(value);
notifyOptionUpdate(key, value); notifyOptionUpdate(key, value);
save();
} }
} }
@@ -201,9 +202,7 @@ void Options::toggle(OptionId key) {
if (option) { if (option) {
option->toggle(); option->toggle();
notifyOptionUpdate(key, option->get()); notifyOptionUpdate(key, option->get());
save();
} }
} }
@@ -291,6 +290,10 @@ void Options::save() {
optionsFile.save(stringVec); optionsFile.save(stringVec);
} }
void Options::setOptionsFilePath(const std::string& path) {
optionsFile.setOptionsPath(path + "/options.txt");
}
void Options::notifyOptionUpdate(OptionId key, bool value) { void Options::notifyOptionUpdate(OptionId key, bool value) {
minecraft->optionUpdated(key, value); minecraft->optionUpdated(key, value);
} }

View File

@@ -83,6 +83,8 @@ enum OptionId {
OPTIONS_FIRST_LAUNCH, OPTIONS_FIRST_LAUNCH,
OPTIONS_LAST_IP, OPTIONS_LAST_IP,
OPTIONS_RPI_CURSOR,
OPTIONS_FOLIAGE_TINT,
// Should be last! // Should be last!
OPTIONS_COUNT OPTIONS_COUNT
}; };
@@ -104,15 +106,10 @@ public:
// elements werent initialized so i was getting a garbage pointer and a crash // elements werent initialized so i was getting a garbage pointer and a crash
m_options.fill(nullptr); m_options.fill(nullptr);
initTable(); initTable();
load(); // load() is deferred to init() where path is configured correctly
} }
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) { int getIntValue(OptionId key) {
auto option = opt<OptionInt>(key); auto option = opt<OptionInt>(key);
@@ -148,6 +145,11 @@ public:
void load(); void load();
void save(); 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, bool value);
void notifyOptionUpdate(OptionId key, float value); void notifyOptionUpdate(OptionId key, float value);

View File

@@ -1,30 +1,76 @@
#include "OptionsFile.h" #include "OptionsFile.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <errno.h>
#include <platform/log.h> #include <platform/log.h>
#if defined(_WIN32)
#include <direct.h>
#else
#include <sys/stat.h>
#include <sys/types.h>
#endif
OptionsFile::OptionsFile() { OptionsFile::OptionsFile() {
#ifdef __APPLE__ #ifdef __APPLE__
settingsPath = "./Documents/options.txt"; settingsPath = "./Documents/options.txt";
#elif defined(ANDROID) #elif defined(ANDROID)
settingsPath = "options.txt"; settingsPath = "options.txt";
#elif defined(__EMSCRIPTEN__)
settingsPath = "/games/com.mojang/options.txt";
#else #else
settingsPath = "options.txt"; settingsPath = "options.txt";
#endif #endif
} }
void OptionsFile::save(const StringVector& settings) { void OptionsFile::setOptionsPath(const std::string& path) {
FILE* pFile = fopen(settingsPath.c_str(), "w"); settingsPath = path;
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));
}
} }
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);
}
StringVector OptionsFile::getOptionStrings() { StringVector OptionsFile::getOptionStrings() {
StringVector returnVector; StringVector returnVector;
FILE* pFile = fopen(settingsPath.c_str(), "r"); FILE* pFile = fopen(settingsPath.c_str(), "r");
@@ -45,7 +91,8 @@ StringVector OptionsFile::getOptionStrings() {
} }
fclose(pFile); fclose(pFile);
} else { } else {
LOGI("OptionsFile::getOptionStrings failed to open '%s' for reading: %s", settingsPath.c_str(), strerror(errno)); if (errno != ENOENT)
LOGI("OptionsFile::getOptionStrings failed to open '%s' for reading: %s", settingsPath.c_str(), strerror(errno));
} }
return returnVector; return returnVector;
} }

View File

@@ -11,7 +11,9 @@ public:
OptionsFile(); OptionsFile();
void save(const StringVector& settings); void save(const StringVector& settings);
StringVector getOptionStrings(); StringVector getOptionStrings();
void setOptionsPath(const std::string& path);
std::string getOptionsPath() const;
private: private:
std::string settingsPath; std::string settingsPath;
}; };

View File

@@ -1,62 +0,0 @@
#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__*/

View File

@@ -1,69 +1,56 @@
#include "CreativeMode.h" #include "CreativeMode.h"
#include "../Minecraft.h" #include "../Minecraft.h"
#ifndef STANDALONE_SERVER #ifndef STANDALONE_SERVER
#include "../particle/ParticleEngine.h" #include "../particle/ParticleEngine.h"
#endif #endif
#include "../player/LocalPlayer.h" #include "../player/LocalPlayer.h"
#ifndef STANDALONE_SERVER #ifndef STANDALONE_SERVER
#include "../renderer/LevelRenderer.h" #include "../renderer/LevelRenderer.h"
#include "../sound/SoundEngine.h" #include "../sound/SoundEngine.h"
#endif #endif
#include "../../world/level/Level.h" #include "../../world/level/Level.h"
//#include "../../network/Packet.h" //#include "../../network/Packet.h"
#include "../../network/packet/RemoveBlockPacket.h" #include "../../network/packet/RemoveBlockPacket.h"
#include "../../world/entity/player/Abilities.h" #include "../../world/entity/player/Abilities.h"
static const int DestructionTickDelay = 5; static const int DestructionTickDelay = 5;
CreativeMode::CreativeMode(Minecraft* minecraft) CreativeMode::CreativeMode(Minecraft* minecraft)
: super(minecraft) : super(minecraft)
{ {
} }
void CreativeMode::startDestroyBlock(int x, int y, int z, int face) { void CreativeMode::startDestroyBlock(int x, int y, int z, int face) {
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id) if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
return; return;
creativeDestroyBlock(x, y, z, face); creativeDestroyBlock(x, y, z, face);
destroyDelay = DestructionTickDelay; destroyDelay = DestructionTickDelay;
} }
void CreativeMode::creativeDestroyBlock(int x, int y, int z, int face) { void CreativeMode::creativeDestroyBlock(int x, int y, int z, int face) {
minecraft->level->extinguishFire(x, y, z, face); minecraft->level->extinguishFire(x, y, z, face);
destroyBlock(x, y, z, face); destroyBlock(x, y, z, face);
} }
void CreativeMode::continueDestroyBlock(int x, int y, int z, int face) { void CreativeMode::continueDestroyBlock(int x, int y, int z, int face) {
destroyDelay--; destroyDelay--;
if (destroyDelay <= 0) { if (destroyDelay <= 0) {
destroyDelay = DestructionTickDelay; destroyDelay = DestructionTickDelay;
creativeDestroyBlock(x, y, z, face); creativeDestroyBlock(x, y, z, face);
} }
} }
void CreativeMode::stopDestroyBlock() { void CreativeMode::stopDestroyBlock() {
destroyDelay = 0; destroyDelay = 0;
} }
void CreativeMode::initAbilities( Abilities& abilities ) { void CreativeMode::initAbilities( Abilities& abilities ) {
abilities.mayfly = true; abilities.mayfly = true;
abilities.instabuild = true; abilities.instabuild = true;
abilities.invulnerable = true; abilities.invulnerable = true;
} }
bool CreativeMode::isCreativeType() { bool CreativeMode::isCreativeType() {
return true; 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);
}
}

View File

@@ -1,27 +1,26 @@
#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__ #ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__
#define NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__ #define NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__
//package net.minecraft.client.gamemode; //package net.minecraft.client.gamemode;
#include "GameMode.h" #include "GameMode.h"
class CreativeMode: public GameMode class CreativeMode: public GameMode
{ {
typedef GameMode super; typedef GameMode super;
public: public:
CreativeMode(Minecraft* minecraft); CreativeMode(Minecraft* minecraft);
void startDestroyBlock(int x, int y, int z, int face); void startDestroyBlock(int x, int y, int z, int face);
void continueDestroyBlock(int x, int y, int z, int face); void continueDestroyBlock(int x, int y, int z, int face);
void stopDestroyBlock(); void stopDestroyBlock();
bool isCreativeType(); bool isCreativeType();
void initAbilities(Abilities& abilities); void initAbilities(Abilities& abilities);
void releaseUsingItem(Player* player); private:
private: void creativeDestroyBlock(int x, int y, int z, int face);
void creativeDestroyBlock(int x, int y, int z, int face); };
};
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__*/
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreativeMode_H__*/

View File

@@ -1,115 +1,102 @@
#include "CreatorMode.h" #include "CreatorMode.h"
#include "../Minecraft.h" #include "../Minecraft.h"
#include "../particle/ParticleEngine.h" #include "../particle/ParticleEngine.h"
#include "../player/LocalPlayer.h" #include "../player/LocalPlayer.h"
#include "../renderer/LevelRenderer.h" #include "../renderer/LevelRenderer.h"
#include "../sound/SoundEngine.h" #include "../sound/SoundEngine.h"
#include "../../world/level/Level.h" #include "../../world/level/Level.h"
//#include "../../network/Packet.h" //#include "../../network/Packet.h"
#include "../../network/packet/RemoveBlockPacket.h" #include "../../network/packet/RemoveBlockPacket.h"
#include "../../world/entity/player/Abilities.h" #include "../../world/entity/player/Abilities.h"
static const int DestructionTickDelay = 5; static const int DestructionTickDelay = 5;
class Creator: public ICreator { class Creator: public ICreator {
//virtual void getEvents(); //virtual void getEvents();
public: public:
Creator(/*int eventLifeTime*/) Creator(/*int eventLifeTime*/)
: _tileEvents(32), : _tileEvents(32),
_tickId(0) _tickId(0)
{ {
} }
void setTick(int tick) { void setTick(int tick) {
_tickId = tick; _tickId = tick;
} }
EventList<TileEvent>& getTileEvents() { return _tileEvents; } EventList<TileEvent>& getTileEvents() { return _tileEvents; }
void addevent_blockUse(int entityId, int x, int y, int z, int face) { void addevent_blockUse(int entityId, int x, int y, int z, int face) {
TileEvent t = { TileEvent t = {
entityId, entityId,
x,y,z, x,y,z,
face face
}; };
_tileEvents.add(t, _tickId); _tileEvents.add(t, _tickId);
} }
private: private:
EventList<TileEvent> _tileEvents; EventList<TileEvent> _tileEvents;
int _tickId; int _tickId;
}; };
CreatorMode::CreatorMode(Minecraft* minecraft) CreatorMode::CreatorMode(Minecraft* minecraft)
: super(minecraft) : super(minecraft)
{ {
_creator = new Creator(); _creator = new Creator();
} }
CreatorMode::~CreatorMode() { CreatorMode::~CreatorMode() {
delete _creator; delete _creator;
} }
void CreatorMode::startDestroyBlock(int x, int y, int z, int face) { void CreatorMode::startDestroyBlock(int x, int y, int z, int face) {
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id) if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
return; return;
CreatorDestroyBlock(x, y, z, face); CreatorDestroyBlock(x, y, z, face);
destroyDelay = DestructionTickDelay; destroyDelay = DestructionTickDelay;
} }
void CreatorMode::CreatorDestroyBlock(int x, int y, int z, int face) { void CreatorMode::CreatorDestroyBlock(int x, int y, int z, int face) {
minecraft->level->extinguishFire(x, y, z, face); minecraft->level->extinguishFire(x, y, z, face);
destroyBlock(x, y, z, face); destroyBlock(x, y, z, face);
} }
void CreatorMode::continueDestroyBlock(int x, int y, int z, int face) { void CreatorMode::continueDestroyBlock(int x, int y, int z, int face) {
destroyDelay--; destroyDelay--;
if (destroyDelay <= 0) { if (destroyDelay <= 0) {
destroyDelay = DestructionTickDelay; destroyDelay = DestructionTickDelay;
CreatorDestroyBlock(x, y, z, face); 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 ) { 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) if (item && item->id == ((Item*)Item::sword_iron)->id)
_creator->addevent_blockUse(player->entityId, x, y, z, face); _creator->addevent_blockUse(player->entityId, x, y, z, face);
return super::useItemOn(player, level, item, x, y, z, face, hit); return super::useItemOn(player, level, item, x, y, z, face, hit);
} }
void CreatorMode::stopDestroyBlock() { void CreatorMode::stopDestroyBlock() {
destroyDelay = 0; destroyDelay = 0;
} }
void CreatorMode::initAbilities( Abilities& abilities ) { void CreatorMode::initAbilities( Abilities& abilities ) {
abilities.mayfly = true; abilities.mayfly = true;
abilities.instabuild = true; abilities.instabuild = true;
abilities.invulnerable = true; abilities.invulnerable = true;
} }
bool CreatorMode::isCreativeType() { bool CreatorMode::isCreativeType() {
return true; return true;
} }
void CreatorMode::releaseUsingItem( Player* player ) { ICreator* CreatorMode::getCreator() {
if(player->getCarriedItem() != NULL) { return _creator;
int oldItemId = player->getCarriedItem()->id; }
int oldAux = player->getAuxData();
super::releaseUsingItem(player); void CreatorMode::tick() {
if(player->getCarriedItem() != NULL && player->getCarriedItem()->id == oldItemId) { _creator->setTick(minecraft->level->getTime());
player->getCarriedItem()->setAuxValue(oldAux); super::tick();
} }
} else {
super::releaseUsingItem(player);
}
}
ICreator* CreatorMode::getCreator() {
return _creator;
}
void CreatorMode::tick() {
_creator->setTick(minecraft->level->getTime());
super::tick();
}

View File

@@ -1,61 +1,61 @@
#ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__ #ifndef NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__
#define NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__ #define NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__
//package net.minecraft.client.gamemode; //package net.minecraft.client.gamemode;
#include "GameMode.h" #include "GameMode.h"
#include "../../world/PosTranslator.h" #include "../../world/PosTranslator.h"
class ICreator { class ICreator {
public: public:
virtual ~ICreator() {} virtual ~ICreator() {}
struct TileEvent { struct TileEvent {
int entityId; int entityId;
int x, y, z; int x, y, z;
int face; int face;
void write(std::stringstream& ss, IPosTranslator& t) const { void write(std::stringstream& ss, IPosTranslator& t) const {
int xx = x, yy = y, zz = z; int xx = x, yy = y, zz = z;
t.to(xx, yy, zz); t.to(xx, yy, zz);
ss << xx << "," << yy << "," << zz << "," << face << "," << entityId; ss << xx << "," << yy << "," << zz << "," << face << "," << entityId;
} }
}; };
template <class T> template <class T>
class EventList { class EventList {
public: public:
EventList(int size) { EventList(int size) {
_events.reserve(size); _events.reserve(size);
_maxSize = (int)size; _maxSize = (int)size;
clear(); clear();
} }
void clear() { void clear() {
_index = -1; _index = -1;
_size = 0; _size = 0;
} }
void add(const T& item, int tick) { void add(const T& item, int tick) {
if (_size < _maxSize) { if (_size < _maxSize) {
_events.push_back(Item()); _events.push_back(Item());
++_size; ++_size;
} }
Item& e = _events[_nextIndex()]; Item& e = _events[_nextIndex()];
e.item = item; e.item = item;
e.timestamp = tick; e.timestamp = tick;
} }
int size() const { int size() const {
return _size; return _size;
} }
const T& operator[](int i) const { const T& operator[](int i) const {
return _events[_getIndex(i)].item; return _events[_getIndex(i)].item;
} }
T& operator[](int i) { T& operator[](int i) {
return _events[_getIndex(i)].item; return _events[_getIndex(i)].item;
} }
void write(std::stringstream& ss, IPosTranslator& t, int minTimetamp) const { void write(std::stringstream& ss, IPosTranslator& t, int minTimetamp) const {
int i = _getFirstNewerIndex(minTimetamp); int i = _getFirstNewerIndex(minTimetamp);
if (i < 0) if (i < 0)
return; return;
@@ -66,63 +66,62 @@ public:
ss << "|"; ss << "|";
if (++i == _size) i = 0; if (++i == _size) i = 0;
} }
} }
private: private:
int _getIndex(int i) const { return (1 + _index + i) % _size; } int _getIndex(int i) const { return (1 + _index + i) % _size; }
int _nextIndex() { int _nextIndex() {
if (++_index == _size) _index = 0; if (++_index == _size) _index = 0;
return _index; return _index;
} }
int _getFirstNewerIndex(int timestamp) const { int _getFirstNewerIndex(int timestamp) const {
for (int i = _index + 1, j = 0; j < _size; ++i, ++j) { for (int i = _index + 1, j = 0; j < _size; ++i, ++j) {
if (i == _size) i = 0; if (i == _size) i = 0;
if (_events[i].timestamp >= timestamp) return i; if (_events[i].timestamp >= timestamp) return i;
} }
return -1; return -1;
} }
struct Item { struct Item {
int timestamp; int timestamp;
T item; T item;
}; };
int _index; int _index;
int _size; int _size;
int _maxSize; int _maxSize;
std::vector<Item> _events; std::vector<Item> _events;
}; };
virtual EventList<TileEvent>& getTileEvents() = 0; virtual EventList<TileEvent>& getTileEvents() = 0;
}; };
class Creator; class Creator;
class CreatorMode: public GameMode class CreatorMode: public GameMode
{ {
typedef GameMode super; typedef GameMode super;
public: public:
CreatorMode(Minecraft* minecraft); CreatorMode(Minecraft* minecraft);
~CreatorMode(); ~CreatorMode();
void startDestroyBlock(int x, int y, int z, int face); void startDestroyBlock(int x, int y, int z, int face);
void continueDestroyBlock(int x, int y, int z, int face); void continueDestroyBlock(int x, int y, int z, int face);
void stopDestroyBlock(); void stopDestroyBlock();
bool useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit); bool useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit);
void tick(); void tick();
ICreator* getCreator(); ICreator* getCreator();
bool isCreativeType(); bool isCreativeType();
void initAbilities(Abilities& abilities); void initAbilities(Abilities& abilities);
void releaseUsingItem(Player* player); private:
private: void CreatorDestroyBlock(int x, int y, int z, int face);
void CreatorDestroyBlock(int x, int y, int z, int face);
Creator* _creator;
Creator* _creator; };
};
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__*/
#endif /*NET_MINECRAFT_CLIENT_GAMEMODE__CreatorMode_H__*/

View File

@@ -1,173 +1,174 @@
#include "GameMode.h" #include "GameMode.h"
#include "../Minecraft.h" #include "../Minecraft.h"
#include "../../network/packet/UseItemPacket.h" #include "../../network/packet/UseItemPacket.h"
#include "../../network/packet/PlayerActionPacket.h" #include "../../network/packet/PlayerActionPacket.h"
#include "../../world/level/Level.h" #include "../../world/level/Level.h"
#include "../../world/item/ItemInstance.h" #include "../../world/item/ItemInstance.h"
#include "../player/LocalPlayer.h" #include "../player/LocalPlayer.h"
#ifndef STANDALONE_SERVER #include "client/Options.h"
#include "../sound/SoundEngine.h" #ifndef STANDALONE_SERVER
#include "../particle/ParticleEngine.h" #include "../sound/SoundEngine.h"
#endif #include "../particle/ParticleEngine.h"
#include "../../network/RakNetInstance.h" #endif
#include "../../network/packet/RemoveBlockPacket.h" #include "../../network/RakNetInstance.h"
#ifndef STANDALONE_SERVER #include "../../network/packet/RemoveBlockPacket.h"
#include "../renderer/LevelRenderer.h" #ifndef STANDALONE_SERVER
#endif #include "../renderer/LevelRenderer.h"
#include "../../world/level/material/Material.h" #endif
#include "../../world/level/material/Material.h"
GameMode::GameMode( Minecraft* minecraft)
: minecraft(minecraft), GameMode::GameMode( Minecraft* minecraft)
destroyProgress(0), : minecraft(minecraft),
oDestroyProgress(0), destroyProgress(0),
destroyTicks(0), oDestroyProgress(0),
destroyDelay(0) destroyTicks(0),
{ destroyDelay(0)
} {
}
/*virtual*/
Player* GameMode::createPlayer(Level* level) { /*virtual*/
return new LocalPlayer(minecraft, level, minecraft->user, level->dimension->id, isCreativeType()); 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) { /*virtual*/
player->interact(entity); void GameMode::interact(Player* player, Entity* entity) {
} player->interact(entity);
}
/*virtual*/
void GameMode::attack(Player* player, Entity* entity) { /*virtual*/
if (minecraft->level->adventureSettings.noPvP && entity->isPlayer()) void GameMode::attack(Player* player, Entity* entity) {
return; if (minecraft->level->adventureSettings.noPvP && entity->isPlayer())
if (minecraft->level->adventureSettings.noPvM && entity->isMob()) return;
return; if (minecraft->level->adventureSettings.noPvM && entity->isMob())
player->attack(entity); return;
} player->attack(entity);
}
/* virtual */
void GameMode::startDestroyBlock( int x, int y, int z, int face ) { /* virtual */
if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id) void GameMode::startDestroyBlock( int x, int y, int z, int face ) {
return; if(minecraft->player->getCarriedItem() != NULL && minecraft->player->getCarriedItem()->id == Item::bow->id)
destroyBlock(x, y, z, face); return;
} destroyBlock(x, y, z, face);
}
/*virtual*/
bool GameMode::destroyBlock(int x, int y, int z, int face) { /*virtual*/
Level* level = minecraft->level; bool GameMode::destroyBlock(int x, int y, int z, int face) {
Tile* oldTile = Tile::tiles[level->getTile(x, y, z)]; Level* level = minecraft->level;
if (!oldTile) Tile* oldTile = Tile::tiles[level->getTile(x, y, z)];
return false; if (!oldTile)
return false;
if (level->adventureSettings.immutableWorld) {
if (oldTile != (Tile*)Tile::leaves if (level->adventureSettings.immutableWorld) {
&& oldTile->material != Material::plant) { if (oldTile != (Tile*)Tile::leaves
return false; && oldTile->material != Material::plant) {
} return false;
} }
#ifndef STANDALONE_SERVER }
minecraft->particleEngine->destroy(x, y, z); #ifndef STANDALONE_SERVER
#endif minecraft->particleEngine->destroy(x, y, z);
int data = level->getData(x, y, z); #endif
bool changed = level->setTile(x, y, z, 0); int data = level->getData(x, y, z);
if (changed) { bool changed = level->setTile(x, y, z, 0);
#ifndef STANDALONE_SERVER if (changed) {
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); #ifndef STANDALONE_SERVER
#endif 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);
oldTile->destroy(level, x, y, z, data); #endif
if (minecraft->options.getBooleanValue(OPTIONS_DESTROY_VIBRATION)) minecraft->platform()->vibrate(24); 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); if (minecraft->isOnline()) {
minecraft->raknetInstance->send(packet); RemoveBlockPacket packet(minecraft->player, x, y, z);
} minecraft->raknetInstance->send(packet);
} }
return changed; }
} return changed;
/*virtual*/ }
bool GameMode::useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit) { /*virtual*/
float clickX = hit.x - x; bool GameMode::useItemOn(Player* player, Level* level, ItemInstance* item, int x, int y, int z, int face, const Vec3& hit) {
float clickY = hit.y - y; float clickX = hit.x - x;
float clickZ = hit.z - z; float clickY = hit.y - y;
item = player->inventory->getSelected(); float clickZ = hit.z - z;
if(level->isClientSide) { if (level->isClientSide) {
UseItemPacket packet(x, y, z, face, item, player->entityId, clickX, clickY, clickZ); item = player->inventory->getSelected();
minecraft->raknetInstance->send(packet); 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; int t = level->getTile(x, y, z);
if (t > 0 && Tile::tiles[t]->use(level, x, y, z, player)) if (t == Tile::invisible_bedrock->id) return false;
return true; if (t > 0 && Tile::tiles[t]->use(level, x, y, z, player))
return true;
if (item == NULL) return false;
if(isCreativeType()) { if (item == NULL) return false;
int aux = item->getAuxValue(); if(isCreativeType()) {
int count = item->count; int aux = item->getAuxValue();
bool success = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ); int count = item->count;
item->setAuxValue(aux); bool success = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
item->count = count; item->setAuxValue(aux);
return success; item->count = count;
} else { return success;
return item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ); } 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; bool GameMode::useItem( Player* player, Level* level, ItemInstance* item ) {
int oldCount = item->count;
ItemInstance* itemInstance = item->use(level, player);
if(level->isClientSide) { ItemInstance* itemInstance = item->use(level, player);
UseItemPacket packet(item, player->entityId, player->aimDirection); if(level->isClientSide) {
minecraft->raknetInstance->send(packet); 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 != item || (itemInstance != NULL && itemInstance->count != oldCount)) {
//if (itemInstance.count == 0) { //player.inventory.items[player.inventory.selected] = itemInstance;
// player.inventory.items[player.inventory.selected] = NULL; //if (itemInstance.count == 0) {
//} // player.inventory.items[player.inventory.selected] = NULL;
return true; //}
} return true;
return false; }
} return false;
}
ItemInstance* GameMode::handleInventoryMouseClick( int containerId, int slotNum, int buttonNum, Player* player ) {
//return player.containerMenu.clicked(slotNum, buttonNum, player); ItemInstance* GameMode::handleInventoryMouseClick( int containerId, int slotNum, int buttonNum, Player* player ) {
return NULL; //return player.containerMenu.clicked(slotNum, buttonNum, player);
} return NULL;
}
void GameMode::handleCloseInventory( int containerId, Player* player ) {
//player.containerMenu.removed(player); void GameMode::handleCloseInventory( int containerId, Player* player ) {
//player.containerMenu = player.inventoryMenu; //player.containerMenu.removed(player);
} //player.containerMenu = player.inventoryMenu;
}
float GameMode::getPickRange() {
return 5.0f; float GameMode::getPickRange() {
} return 5.0f;
}
void GameMode::initPlayer( Player* player ) {
initAbilities(player->abilities); void GameMode::initPlayer( Player* player ) {
} initAbilities(player->abilities);
}
void GameMode::releaseUsingItem(Player* player){
if(minecraft->level->isClientSide) { void GameMode::releaseUsingItem(Player* player){
PlayerActionPacket packet(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 0, player->entityId); if (minecraft->level->isClientSide && player->isUsingItem()) {
minecraft->raknetInstance->send(packet); PlayerActionPacket packet(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 0, player->entityId);
} minecraft->raknetInstance->send(packet);
player->releaseUsingItem(); }
} player->releaseUsingItem();
}
void GameMode::tick() {
oDestroyProgress = destroyProgress; void GameMode::tick() {
} oDestroyProgress = destroyProgress;
}
void GameMode::render( float a ) {
#ifndef STANDALONE_SERVER void GameMode::render( float a ) {
if (destroyProgress <= 0) { #ifndef STANDALONE_SERVER
minecraft->gui.progress = 0; if (destroyProgress <= 0) {
minecraft->levelRenderer->destroyProgress = 0; minecraft->gui.progress = 0;
} else { minecraft->levelRenderer->destroyProgress = 0;
float dp = oDestroyProgress + (destroyProgress - oDestroyProgress) * a; } else {
minecraft->gui.progress = dp; float dp = oDestroyProgress + (destroyProgress - oDestroyProgress) * a;
minecraft->levelRenderer->destroyProgress = dp; minecraft->gui.progress = dp;
} minecraft->levelRenderer->destroyProgress = dp;
#endif }
} #endif
}

View File

@@ -186,7 +186,7 @@ void Font::draw( const std::string& str, float x, float y, int color, bool darke
glPushMatrix2(); glPushMatrix2();
glTranslatef2((GLfloat)x, (GLfloat)y, 0.0f); glTranslatef2((GLfloat)x, (GLfloat)y, 0.0f);
for (unsigned int i = 0; i < str.length(); i++) { for (unsigned int i = 0; i < str.length(); i++) {
while (str.length() > i + 1 && str[i] == '<EFBFBD>') { while (str.length() > i + 1 && str[i] == '\xa7') {
int cc = hex.find((char)tolower(str[i + 1])); int cc = hex.find((char)tolower(str[i + 1]));
if (cc < 0 || cc > 15) cc = 15; if (cc < 0 || cc > 15) cc = 15;
lists[index++] = listPos + 256 + cc + (darken ? 16 : 0); lists[index++] = listPos + 256 + cc + (darken ? 16 : 0);
@@ -235,7 +235,7 @@ int Font::width( const std::string& str )
int len = 0; int len = 0;
for (unsigned int i = 0; i < str.length(); i++) { for (unsigned int i = 0; i < str.length(); i++) {
if (str[i] == '<EFBFBD>') { if (str[i] == '\xa7') {
i++; i++;
} else { } else {
//int ch = SharedConstants.acceptableLetters.indexOf(str.charAt(i)); //int ch = SharedConstants.acceptableLetters.indexOf(str.charAt(i));
@@ -274,7 +274,7 @@ std::string Font::sanitize( const std::string& str )
int j = 0; int j = 0;
for (unsigned int i = 0; i < str.length(); i++) { for (unsigned int i = 0; i < str.length(); i++) {
if (str[i] == '<EFBFBD>') { if (str[i] == '\xa7') {
i++; i++;
//} else if (SharedConstants.acceptableLetters.indexOf(str.charAt(i)) >= 0) { //} else if (SharedConstants.acceptableLetters.indexOf(str.charAt(i)) >= 0) {
} else { } else {

View File

@@ -27,6 +27,7 @@
#include "../../platform/time.h" #include "../../platform/time.h"
#include <cmath> #include <cmath>
#include <algorithm> #include <algorithm>
#include <sstream>
float Gui::InvGuiScale = 1.0f / 3.0f; float Gui::InvGuiScale = 1.0f / 3.0f;
float Gui::GuiScale = 1.0f / Gui::InvGuiScale; float Gui::GuiScale = 1.0f / Gui::InvGuiScale;
@@ -50,7 +51,8 @@ Gui::Gui(Minecraft* minecraft)
_currentDropTicks(-1), _currentDropTicks(-1),
_currentDropSlot(-1), _currentDropSlot(-1),
MAX_MESSAGE_WIDTH(240), MAX_MESSAGE_WIDTH(240),
itemNameOverlayTime(2) itemNameOverlayTime(2),
_openInventorySlot(minecraft->useTouchscreen())
{ {
glGenBuffers2(1, &_inventoryRc.vboId); glGenBuffers2(1, &_inventoryRc.vboId);
glGenBuffers2(1, &rcFeedbackInner.vboId); glGenBuffers2(1, &rcFeedbackInner.vboId);
@@ -74,11 +76,8 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) {
//minecraft->gameRenderer->setupGuiScreen(); //minecraft->gameRenderer->setupGuiScreen();
Font* font = minecraft->font; Font* font = minecraft->font;
#ifdef PLATFORM_DESKTOP
const bool isTouchInterface = false;
#else
const bool isTouchInterface = minecraft->useTouchscreen(); const bool isTouchInterface = minecraft->useTouchscreen();
#endif
const int screenWidth = (int)(minecraft->width * InvGuiScale); const int screenWidth = (int)(minecraft->width * InvGuiScale);
const int screenHeight = (int)(minecraft->height * InvGuiScale); const int screenHeight = (int)(minecraft->height * InvGuiScale);
blitOffset = -90; blitOffset = -90;
@@ -205,16 +204,10 @@ void Gui::handleClick(int button, int x, int y) {
if (button != MouseAction::ACTION_LEFT) return; if (button != MouseAction::ACTION_LEFT) return;
int slot = getSlotIdAt(x, y); int slot = getSlotIdAt(x, y);
if (slot != -1) if (slot != -1) {
{ if (_openInventorySlot && slot == (getNumSlots()-1)) {
#ifndef PLATFORM_DESKTOP
if (slot == (getNumSlots()-1))
{
minecraft->screenChooser.setScreen(SCREEN_BLOCKSELECTION); minecraft->screenChooser.setScreen(SCREEN_BLOCKSELECTION);
} } else {
else
#endif
{
minecraft->player->inventory->selectSlot(slot); minecraft->player->inventory->selectSlot(slot);
itemNameOverlayTime = 0; itemNameOverlayTime = 0;
} }
@@ -348,7 +341,7 @@ void Gui::setNowPlaying(const std::string& string) {
void Gui::displayClientMessage(const std::string& messageId) { void Gui::displayClientMessage(const std::string& messageId) {
//Language language = Language.getInstance(); //Language language = Language.getInstance();
//std::string languageString = language.getElement(messageId); //std::string languageString = language.getElement(messageId);
addMessage(std::string("Client message: ") + messageId); addMessage(messageId);
} }
void Gui::renderVignette(float br, int w, int h) { void Gui::renderVignette(float br, int w, int h) {
@@ -429,9 +422,9 @@ void Gui::onConfigChanged( const Config& c ) {
// Create outer feedback circle // Create outer feedback circle
// //
#ifdef ANDROID #ifdef ANDROID
const float mm = 12; const float mm = 50; //20
#else #else
const float mm = 12; const float mm = 50; //20
#endif #endif
const float maxRadius = minecraft->pixelCalcUi.millimetersToPixels(mm); const float maxRadius = minecraft->pixelCalcUi.millimetersToPixels(mm);
const float radius = Mth::Min(80.0f/2, maxRadius); const float radius = Mth::Min(80.0f/2, maxRadius);
@@ -536,11 +529,7 @@ void Gui::tickItemDrop()
static bool isCurrentlyActive = false; static bool isCurrentlyActive = false;
isCurrentlyActive = false; isCurrentlyActive = false;
int slots = getNumSlots(); int slots = getNumSlots() - _openInventorySlot;
#ifndef PLATFORM_DESKTOP
slots--;
#endif
if (Mouse::isButtonDown(MouseAction::ACTION_LEFT)) { if (Mouse::isButtonDown(MouseAction::ACTION_LEFT)) {
int slot = getSlotIdAt(Mouse::getX(), Mouse::getY()); int slot = getSlotIdAt(Mouse::getX(), Mouse::getY());
@@ -841,7 +830,9 @@ void Gui::renderPlayerList(Font* font, int screenWidth, int screenHeight) {
} }
// player count title // player count title
std::string titleText = "Players (" + std::to_string(playerNames.size()) + ")"; std::ostringstream titleStream;
titleStream << "Players (" << playerNames.size() << ")";
std::string titleText = titleStream.str();
float titleWidth = font->width(titleText); float titleWidth = font->width(titleText);
if (titleWidth > maxNameWidth) if (titleWidth > maxNameWidth)
@@ -1080,13 +1071,7 @@ void Gui::renderToolBar( float a, int ySlot, const int screenWidth ) {
float x = baseItemX; float x = baseItemX;
int slots = getNumSlots(); int slots = getNumSlots() - _openInventorySlot;
// TODO: if using touchscreen
#ifndef PLATFORM_DESKTOP
slots--;
#endif
for (int i = 0; i < slots; i++) { for (int i = 0; i < slots; i++) {
renderSlot(i, (int)x, ySlot, a); renderSlot(i, (int)x, ySlot, a);
@@ -1094,9 +1079,10 @@ void Gui::renderToolBar( float a, int ySlot, const int screenWidth ) {
} }
_inventoryNeedsUpdate = false; _inventoryNeedsUpdate = false;
#ifndef PLATFORM_DESKTOP
blit(screenWidth / 2 + 10 * getNumSlots() - 20 + 4, ySlot + 6, 242, 252, 14, 4, 14, 4); if (_openInventorySlot) {
#endif blit(screenWidth / 2 + 10 * getNumSlots() - 20 + 4, ySlot + 6, 242, 252, 14, 4, 14, 4);
}
minecraft->textures->loadAndBindTexture("gui/gui_blocks.png"); minecraft->textures->loadAndBindTexture("gui/gui_blocks.png");
t.endOverrideAndDraw(); t.endOverrideAndDraw();

View File

@@ -127,6 +127,8 @@ private:
static const float DropTicks; static const float DropTicks;
float _currentDropTicks; float _currentDropTicks;
int _currentDropSlot; int _currentDropSlot;
bool _openInventorySlot;
}; };
#endif /*NET_MINECRAFT_CLIENT_GUI__Gui_H__*/ #endif /*NET_MINECRAFT_CLIENT_GUI__Gui_H__*/

View File

@@ -177,9 +177,11 @@ void Screen::keyPressed( int eventKey )
textbox->keyPressed(minecraft, eventKey); textbox->keyPressed(minecraft, eventKey);
} }
#ifdef TABBING
if (minecraft->useTouchscreen()) if (minecraft->useTouchscreen())
return; return;
// "Tabbing" the buttons (walking with keys) // "Tabbing" the buttons (walking with keys)
const int tabButtonCount = tabButtons.size(); const int tabButtonCount = tabButtons.size();
if (!tabButtonCount) if (!tabButtonCount)
@@ -199,6 +201,7 @@ void Screen::keyPressed( int eventKey )
} }
updateTabButtonSelection(); updateTabButtonSelection();
#endif
} }
void Screen::charPressed(char inputChar) { void Screen::charPressed(char inputChar) {
@@ -209,11 +212,13 @@ void Screen::charPressed(char inputChar) {
void Screen::updateTabButtonSelection() void Screen::updateTabButtonSelection()
{ {
#ifdef TABBING
if (minecraft->useTouchscreen()) if (minecraft->useTouchscreen())
return; return;
for (unsigned int i = 0; i < tabButtons.size(); ++i) for (unsigned int i = 0; i < tabButtons.size(); ++i)
tabButtons[i]->selected = (i == tabButtonIndex); tabButtons[i]->selected = (i == tabButtonIndex);
#endif
} }
void Screen::mouseClicked( int x, int y, int buttonNum ) void Screen::mouseClicked( int x, int y, int buttonNum )

View File

@@ -95,7 +95,7 @@ void Button::renderBg( Minecraft* minecraft, int xm, int ym )
} }
bool Button::hovered(Minecraft* minecraft, int xm , int ym) { bool Button::hovered(Minecraft* minecraft, int xm , int ym) {
return minecraft->useTouchscreen()? (_currentlyDown && isInside(xm, ym)) : false; return minecraft->useTouchscreen()? (_currentlyDown && isInside(xm, ym)) : isInside(xm, ym);
} }
bool Button::isInside( int xm, int ym ) { bool Button::isInside( int xm, int ym ) {
@@ -143,7 +143,8 @@ 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 ) 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) : false); 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));
minecraft->textures->loadAndBindTexture("gui/touchgui.png"); minecraft->textures->loadAndBindTexture("gui/touchgui.png");

View File

@@ -42,7 +42,7 @@ void ImageButton::render(Minecraft* minecraft, int xm, int ym) {
//minecraft->textures->loadAndBindTexture("gui/gui.png"); //minecraft->textures->loadAndBindTexture("gui/gui.png");
glColor4f2(1, 1, 1, 1); glColor4f2(1, 1, 1, 1);
bool hovered = active && (minecraft->useTouchscreen()? (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : false); bool hovered = active && (minecraft->useTouchscreen()? (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : isInside(xm, ym));
bool IsSecondImage = isSecondImage(hovered); 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); //printf("ButtonId: %d - Hovered? %d (cause: %d, %d, %d, %d, <> %d, %d)\n", id, hovered, x, y, x+w, y+h, xm, ym);

View File

@@ -33,7 +33,7 @@ void LargeImageButton::render(Minecraft* minecraft, int xm, int ym) {
//minecraft->textures->loadAndBindTexture("gui/gui.png"); //minecraft->textures->loadAndBindTexture("gui/gui.png");
glColor4f2(1, 1, 1, 1); glColor4f2(1, 1, 1, 1);
bool hovered = active && (minecraft->useTouchscreen()? (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : false); bool hovered = active && (minecraft->useTouchscreen()? (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : isInside(xm, ym));
//printf("ButtonId: %d - Hovered? %d (cause: %d, %d, %d, %d, <> %d, %d)\n", id, hovered, x, y, x+w, y+h, xm, ym); //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); //int yImage = getYImage(hovered || selected);

View File

@@ -65,7 +65,7 @@ void OptionsGroup::createToggle(OptionId optId, Minecraft* minecraft ) {
std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId()); std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId());
OptionsItem* item = new OptionsItem(itemLabel, element); OptionsItem* item = new OptionsItem(optId, itemLabel, element);
addChild(item); addChild(item);
setupPositions(); setupPositions();
@@ -77,7 +77,7 @@ void OptionsGroup::createProgressSlider(OptionId optId, Minecraft* minecraft ) {
element->height = 20; element->height = 20;
std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId()); std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId());
OptionsItem* item = new OptionsItem(itemLabel, element); OptionsItem* item = new OptionsItem(optId, itemLabel, element);
addChild(item); addChild(item);
setupPositions(); setupPositions();
} }
@@ -87,7 +87,7 @@ void OptionsGroup::createStepSlider(OptionId optId, Minecraft* minecraft ) {
element->width = 100; element->width = 100;
element->height = 20; element->height = 20;
std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId()); std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId());
OptionsItem* item = new OptionsItem(itemLabel, element); OptionsItem* item = new OptionsItem(optId, itemLabel, element);
addChild(item); addChild(item);
setupPositions(); setupPositions();
} }
@@ -98,7 +98,7 @@ void OptionsGroup::createTextbox(OptionId optId, Minecraft* minecraft) {
element->height = 20; element->height = 20;
std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId()); std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId());
OptionsItem* item = new OptionsItem(itemLabel, element); OptionsItem* item = new OptionsItem(optId, itemLabel, element);
addChild(item); addChild(item);
setupPositions(); setupPositions();
} }
@@ -109,7 +109,7 @@ void OptionsGroup::createKey(OptionId optId, Minecraft* minecraft) {
element->height = 20; element->height = 20;
std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId()); std::string itemLabel = I18n::get(minecraft->options.getOpt(optId)->getStringId());
OptionsItem* item = new OptionsItem(itemLabel, element); OptionsItem* item = new OptionsItem(optId, itemLabel, element);
addChild(item); addChild(item);
setupPositions(); setupPositions();
} }

View File

@@ -1,9 +1,11 @@
#include "OptionsItem.h" #include "OptionsItem.h"
#include "../../Minecraft.h" #include "../../Minecraft.h"
#include "../../../locale/I18n.h"
#include "../../../util/Mth.h" #include "../../../util/Mth.h"
OptionsItem::OptionsItem( std::string label, GuiElement* element ) OptionsItem::OptionsItem( OptionId optionId, std::string label, GuiElement* element )
: GuiElementContainer(false, true, 0, 0, 24, 12), : GuiElementContainer(false, true, 0, 0, 24, 12),
label(label) { m_optionId(optionId),
m_label(label) {
addChild(element); addChild(element);
} }
@@ -19,6 +21,22 @@ void OptionsItem::setupPositions() {
void OptionsItem::render( Minecraft* minecraft, int xm, int ym ) { void OptionsItem::render( Minecraft* minecraft, int xm, int ym ) {
int yOffset = (height - 8) / 2; int yOffset = (height - 8) / 2;
minecraft->font->draw(label, (float)x, (float)y + yOffset, 0x909090, false); 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);
super::render(minecraft, xm, ym); super::render(minecraft, xm, ym);
} }

View File

@@ -15,12 +15,13 @@ class OptionsItem: public GuiElementContainer
{ {
typedef GuiElementContainer super; typedef GuiElementContainer super;
public: public:
OptionsItem(std::string label, GuiElement* element); OptionsItem(OptionId optionId, std::string label, GuiElement* element);
virtual void render(Minecraft* minecraft, int xm, int ym); virtual void render(Minecraft* minecraft, int xm, int ym);
void setupPositions(); void setupPositions();
private: private:
std::string label; OptionId m_optionId;
std::string m_label;
}; };
#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__OptionsItem_H__*/ #endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__OptionsItem_H__*/

View File

@@ -4,6 +4,7 @@
#include "ImageButton.h" #include "ImageButton.h"
#include "Slider.h" #include "Slider.h"
#include "../../Minecraft.h" #include "../../Minecraft.h"
#include "client/Options.h"
OptionsPane::OptionsPane() { OptionsPane::OptionsPane() {
@@ -28,7 +29,7 @@ OptionsGroup& OptionsPane::createOptionsGroup( std::string label ) {
return *newGroup; return *newGroup;
} }
void OptionsPane::createToggle( unsigned int group, std::string label, const Option* option ) { void OptionsPane::createToggle( unsigned int group, std::string label, OptionId option ) {
if(group > children.size()) return; if(group > children.size()) return;
ImageDef def; ImageDef def;
def.setSrc(IntRectangle(160, 206, 39, 20)); def.setSrc(IntRectangle(160, 206, 39, 20));
@@ -37,27 +38,27 @@ void OptionsPane::createToggle( unsigned int group, std::string label, const Opt
def.height = 20 * 0.7f; def.height = 20 * 0.7f;
OptionButton* element = new OptionButton(option); OptionButton* element = new OptionButton(option);
element->setImageDef(def, true); element->setImageDef(def, true);
OptionsItem* item = new OptionsItem(label, element); OptionsItem* item = new OptionsItem(option, label, element);
((OptionsGroup*)children[group])->addChild(item); ((OptionsGroup*)children[group])->addChild(item);
setupPositions(); setupPositions();
} }
void OptionsPane::createProgressSlider( Minecraft* minecraft, unsigned int group, std::string label, const Option* option, float progressMin/*=1.0f*/, float progressMax/*=1.0f */ ) { void OptionsPane::createProgressSlider( Minecraft* minecraft, unsigned int group, std::string label, OptionId option, float progressMin/*=1.0f*/, float progressMax/*=1.0f */ ) {
if(group > children.size()) return; if(group > children.size()) return;
Slider* element = new Slider(minecraft, option, progressMin, progressMax); Slider* element = new SliderFloat(minecraft, option);
element->width = 100; element->width = 100;
element->height = 20; element->height = 20;
OptionsItem* item = new OptionsItem(label, element); OptionsItem* item = new OptionsItem(option, label, element);
((OptionsGroup*)children[group])->addChild(item); ((OptionsGroup*)children[group])->addChild(item);
setupPositions(); setupPositions();
} }
void OptionsPane::createStepSlider( Minecraft* minecraft, unsigned int group, std::string label, const Option* option, const std::vector<int>& stepVec ) { void OptionsPane::createStepSlider( Minecraft* minecraft, unsigned int group, std::string label, OptionId option, const std::vector<int>& stepVec ) {
if(group > children.size()) return; if(group > children.size()) return;
Slider* element = new Slider(minecraft, option, stepVec); Slider* element = new SliderInt(minecraft, option);
element->width = 100; element->width = 100;
element->height = 20; element->height = 20;
OptionsItem* item = new OptionsItem(label, element); OptionsItem* item = new OptionsItem(option, label, element);
((OptionsGroup*)children[group])->addChild(item); ((OptionsGroup*)children[group])->addChild(item);
setupPositions(); setupPositions();
} }

View File

@@ -21,9 +21,9 @@ class OptionsPane: public GuiElementContainer
public: public:
OptionsPane(); OptionsPane();
OptionsGroup& createOptionsGroup( std::string label ); OptionsGroup& createOptionsGroup( std::string label );
void createToggle( unsigned int group, std::string label, const Option* option ); void createToggle( unsigned int group, std::string label, OptionId option );
void createProgressSlider(Minecraft* minecraft, unsigned int group, std::string label, const Option* option, float progressMin=1.0f, float progressMax=1.0f ); 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, const Option* option, const std::vector<int>& stepVec ); void createStepSlider(Minecraft* minecraft, unsigned int group, std::string label, OptionId option, const std::vector<int>& stepVec );
void setupPositions(); void setupPositions();
}; };

View File

@@ -20,6 +20,9 @@ static const float kMinimumTrackingForDrag = 5;
static const float kMinIndicatorLength = 34.0f / 3; static const float kMinIndicatorLength = 34.0f / 3;
static const float PKScrollIndicatorEndSize = 3; static const float PKScrollIndicatorEndSize = 3;
static const float PKScrollIndicatorThickness = 7.0f /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( ScrollingPane::ScrollingPane(
int optionFlags, int optionFlags,
@@ -70,13 +73,19 @@ ScrollingPane::ScrollingPane(
} }
//LOGI("%d, %d :: %d\n", bbox.w, itemBbox.w, this->columns); //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 (columns * itemBbox.w <= bbox.w) flags |= SF_LockX;
if (rows * itemBbox.h <= bbox.h) flags |= SF_LockY; 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); dragDeltas.reserve(128);
te_moved = 0; te_moved = 0;
@@ -114,6 +123,34 @@ void ScrollingPane::tick() {
updateScrollFade(vScroll); updateScrollFade(vScroll);
updateScrollFade(hScroll); 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) { bool ScrollingPane::getGridItemFor_slow(int itemIndex, GridItem& out) {
@@ -549,11 +586,39 @@ void ScrollingPane::stepThroughDecelerationAnimation(bool noAnimation) {
} }
void ScrollingPane::scrollBy(float dx, float dy) { void ScrollingPane::scrollBy(float dx, float dy) {
// adjust the translation offsets fpx/fpy by the requested amount // compute target content offset from wheel delta (in screen-space w/ opposite sign)
float nfpx = fpx + dx; float targetX = _contentOffset.x - dx;
float nfpy = fpy + dy; float targetY = _contentOffset.y - dy;
// convert back to content offset (fpx = -contentOffset.x)
setContentOffset(Vec3(-nfpx, -nfpy, 0)); 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));
} }
void ScrollingPane::setContentOffset(float x, float y) { void ScrollingPane::setContentOffset(float x, float y) {

View File

@@ -2,6 +2,7 @@
#include "../../Minecraft.h" #include "../../Minecraft.h"
#include "../../renderer/Textures.h" #include "../../renderer/Textures.h"
#include "../Screen.h" #include "../Screen.h"
#include "../../../locale/I18n.h"
#include "../../../util/Mth.h" #include "../../../util/Mth.h"
#include <algorithm> #include <algorithm>
#include <assert.h> #include <assert.h>
@@ -21,7 +22,7 @@ void Slider::render( Minecraft* minecraft, int xm, int ym ) {
if (m_numSteps > 2) { if (m_numSteps > 2) {
int stepDistance = barWidth / (m_numSteps-1); 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; int renderSliderStepPosX = xSliderStart + a * stepDistance + 1;
fill(renderSliderStepPosX - 1, ySliderStart - 2, renderSliderStepPosX + 1, ySliderEnd + 2, 0xff606060); fill(renderSliderStepPosX - 1, ySliderStart - 2, renderSliderStepPosX + 1, ySliderEnd + 2, 0xff606060);
} }
@@ -64,15 +65,20 @@ SliderFloat::SliderFloat(Minecraft* minecraft, OptionId option)
SliderInt::SliderInt(Minecraft* minecraft, OptionId option) SliderInt::SliderInt(Minecraft* minecraft, OptionId option)
: Slider(option), m_option(dynamic_cast<OptionInt*>(minecraft->options.getOpt(option))) : Slider(option), m_option(dynamic_cast<OptionInt*>(minecraft->options.getOpt(option)))
{ {
m_numSteps = m_option->getMax() - m_option->getMin(); m_numSteps = m_option->getMax() - m_option->getMin() + 1;
m_percentage = float(m_option->get() - m_option->getMin()) / (m_numSteps-1); 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 ) { void SliderInt::mouseReleased( Minecraft* minecraft, int x, int y, int buttonNum ) {
Slider::mouseReleased(minecraft, x, y, buttonNum); Slider::mouseReleased(minecraft, x, y, buttonNum);
if (pointInside(x, y)) { if (pointInside(x, y)) {
int curStep = Mth::floor(m_percentage * (m_numSteps-1)); int curStep = int(m_percentage * (m_numSteps-1) + 0.5f);
curStep = Mth::clamp(curStep + m_option->getMin(), m_option->getMin(), m_option->getMax());
m_percentage = float(curStep - m_option->getMin()) / (m_numSteps-1); m_percentage = float(curStep - m_option->getMin()) / (m_numSteps-1);
minecraft->options.set(m_optId, curStep); minecraft->options.set(m_optId, curStep);

View File

@@ -3,7 +3,6 @@
#include "GuiElement.h" #include "GuiElement.h"
#include "../../../client/Options.h" #include "../../../client/Options.h"
#include "OptionsPane.h" // was originally Option.h, shouldn't it be this?
class Slider : public GuiElement { class Slider : public GuiElement {
typedef GuiElement super; typedef GuiElement super;
@@ -38,6 +37,7 @@ class SliderInt : public Slider {
public: public:
SliderInt(Minecraft* minecraft, OptionId option); 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; virtual void mouseReleased( Minecraft* minecraft, int x, int y, int buttonNum ) override;
protected: protected:

View File

@@ -31,7 +31,7 @@ ConfirmScreen::~ConfirmScreen() {
void ConfirmScreen::init() void ConfirmScreen::init()
{ {
if (minecraft->useTouchscreen()) { if (/* minecraft->useTouchscreen() */ true) {
yesButton = new Touch::TButton(0, 0, 0, yesButtonText), yesButton = new Touch::TButton(0, 0, 0, yesButtonText),
noButton = new Touch::TButton(1, 0, 0, noButtonText); noButton = new Touch::TButton(1, 0, 0, noButtonText);
} else { } else {

View File

@@ -216,8 +216,5 @@ void ConsoleScreen::render(int /*xm*/, int /*ym*/, float /*a*/)
displayed += '_'; displayed += '_';
// Placeholder hint when empty // Placeholder hint when empty
if (_input.empty() && (_cursorBlink / 10) % 2 != 0) font->drawShadow(displayed, (float)(boxX0 + 2), (float)(boxY + 2), 0xffffffff);
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);
} }

View File

@@ -28,6 +28,7 @@ void CreditsScreen::init() {
buttons.push_back(bHeader); buttons.push_back(bHeader);
buttons.push_back(btnBack); buttons.push_back(btnBack);
// TODO: rewrite it
// prepare text lines // prepare text lines
_lines.clear(); _lines.clear();
_lines.push_back("Minecraft: Pocket Edition"); _lines.push_back("Minecraft: Pocket Edition");
@@ -37,6 +38,9 @@ void CreditsScreen::init() {
_lines.push_back("mschiller890"); _lines.push_back("mschiller890");
_lines.push_back("InviseDivine"); _lines.push_back("InviseDivine");
_lines.push_back("Kolyah35"); _lines.push_back("Kolyah35");
_lines.push_back("karson");
_lines.push_back("deepfriedwaffles");
_lines.push_back("EpikIzCool");
_lines.push_back(""); _lines.push_back("");
// avoid color tags around the URL so it isn't mangled by the parser please // 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"); _lines.push_back("Join our Discord server: https://discord.gg/c58YesBxve");

View File

@@ -23,7 +23,7 @@ DeathScreen::~DeathScreen()
void DeathScreen::init() void DeathScreen::init()
{ {
if (minecraft->useTouchscreen()) { if (/* minecraft->useTouchscreen() */ true) {
bRespawn = new Touch::TButton(1, "Respawn!"); bRespawn = new Touch::TButton(1, "Respawn!");
bTitle = new Touch::TButton(2, "Main menu"); bTitle = new Touch::TButton(2, "Main menu");
} else { } else {

View File

@@ -21,7 +21,7 @@ public:
} }
void init() { void init() {
if (minecraft->useTouchscreen()) if (/* minecraft->useTouchscreen() */ true)
_back = new Touch::TButton(1, "Ok"); _back = new Touch::TButton(1, "Ok");
else else
_back = new Button(1, "Ok"); _back = new Button(1, "Ok");

View File

@@ -17,7 +17,7 @@ InBedScreen::~InBedScreen() {
} }
void InBedScreen::init() { void InBedScreen::init() {
if (minecraft->useTouchscreen()) { if (/* minecraft->useTouchscreen() */ true) {
bWakeUp = new Touch::TButton(1, "Leave Bed"); bWakeUp = new Touch::TButton(1, "Leave Bed");
} else { } else {
bWakeUp = new Button(1, "Leave Bed"); bWakeUp = new Button(1, "Leave Bed");

View File

@@ -2,8 +2,8 @@
#include "../Screen.h" #include "../Screen.h"
#include "../components/Button.h" #include "../components/Button.h"
#include "../../Minecraft.h" #include "../../Minecraft.h"
#include "ImageButton.h" #include "../components/ImageButton.h"
#include "TextBox.h" #include "../components/TextBox.h"
class JoinByIPScreen: public Screen class JoinByIPScreen: public Screen
{ {

View File

@@ -9,6 +9,7 @@
#include "../components/ImageButton.h" #include "../components/ImageButton.h"
#include "../components/OptionsGroup.h" #include "../components/OptionsGroup.h"
#include "platform/input/Keyboard.h"
OptionsScreen::OptionsScreen() OptionsScreen::OptionsScreen()
: btnClose(NULL), : btnClose(NULL),
@@ -18,7 +19,6 @@ OptionsScreen::OptionsScreen()
} }
OptionsScreen::~OptionsScreen() { OptionsScreen::~OptionsScreen() {
if (btnClose != NULL) { if (btnClose != NULL) {
delete btnClose; delete btnClose;
btnClose = NULL; btnClose = NULL;
@@ -52,7 +52,6 @@ OptionsScreen::~OptionsScreen() {
} }
void OptionsScreen::init() { void OptionsScreen::init() {
bHeader = new Touch::THeader(0, "Options"); bHeader = new Touch::THeader(0, "Options");
btnClose = new ImageButton(1, ""); btnClose = new ImageButton(1, "");
@@ -88,7 +87,6 @@ void OptionsScreen::init() {
} }
void OptionsScreen::setupPositions() { void OptionsScreen::setupPositions() {
int buttonHeight = btnClose->height; int buttonHeight = btnClose->height;
btnClose->x = width - btnClose->width; btnClose->x = width - btnClose->width;
@@ -133,7 +131,6 @@ void OptionsScreen::setupPositions() {
void OptionsScreen::render(int xm, int ym, float a) { void OptionsScreen::render(int xm, int ym, float a) {
renderBackground(); renderBackground();
int xmm = xm * width / minecraft->width; int xmm = xm * width / minecraft->width;
@@ -149,27 +146,24 @@ void OptionsScreen::removed() {
} }
void OptionsScreen::buttonClicked(Button* button) { void OptionsScreen::buttonClicked(Button* button) {
if (button == btnClose) { if (button == btnClose) {
minecraft->options.save(); minecraft->options.save();
minecraft->screenChooser.setScreen(SCREEN_STARTMENU); if (minecraft->screen != NULL) {
minecraft->setScreen(NULL);
} else {
minecraft->screenChooser.setScreen(SCREEN_STARTMENU);
}
} }
else if (button->id > 1 && button->id < 7) { else if (button->id > 1 && button->id < 7) {
int categoryButton = button->id - categoryButtons[0]->id; int categoryButton = button->id - categoryButtons[0]->id;
selectCategory(categoryButton); selectCategory(categoryButton);
} }
else if (button == btnCredits) { else if (button == btnCredits) {
minecraft->setScreen(new CreditsScreen()); minecraft->setScreen(new CreditsScreen());
} }
} }
void OptionsScreen::selectCategory(int index) { void OptionsScreen::selectCategory(int index) {
int currentIndex = 0; int currentIndex = 0;
for (std::vector<Touch::TButton*>::iterator it = categoryButtons.begin(); it != categoryButtons.end(); ++it) { for (std::vector<Touch::TButton*>::iterator it = categoryButtons.begin(); it != categoryButtons.end(); ++it) {
@@ -213,7 +207,8 @@ void OptionsScreen::generateOptionScreens() {
// // Controls Pane // // Controls Pane
optionPanes[2]->addOptionItem(OPTIONS_INVERT_Y_MOUSE, minecraft) optionPanes[2]->addOptionItem(OPTIONS_INVERT_Y_MOUSE, minecraft)
.addOptionItem(OPTIONS_USE_TOUCHSCREEN, minecraft); .addOptionItem(OPTIONS_USE_TOUCHSCREEN, minecraft)
.addOptionItem(OPTIONS_AUTOJUMP, minecraft);
for (int i = OPTIONS_KEY_FORWARD; i <= OPTIONS_KEY_USE; i++) { for (int i = OPTIONS_KEY_FORWARD; i <= OPTIONS_KEY_USE; i++) {
optionPanes[2]->addOptionItem((OptionId)i, minecraft); optionPanes[2]->addOptionItem((OptionId)i, minecraft);
@@ -232,11 +227,12 @@ void OptionsScreen::generateOptionScreens() {
.addOptionItem(OPTIONS_AMBIENT_OCCLUSION, minecraft); .addOptionItem(OPTIONS_AMBIENT_OCCLUSION, minecraft);
optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft) optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft)
.addOptionItem(OPTIONS_BAR_ON_TOP, minecraft); .addOptionItem(OPTIONS_BAR_ON_TOP, minecraft)
.addOptionItem(OPTIONS_RPI_CURSOR, minecraft)
.addOptionItem(OPTIONS_FOLIAGE_TINT, minecraft);
} }
void OptionsScreen::mouseClicked(int x, int y, int buttonNum) { void OptionsScreen::mouseClicked(int x, int y, int buttonNum) {
if (currentOptionsGroup != NULL) if (currentOptionsGroup != NULL)
currentOptionsGroup->mouseClicked(minecraft, x, y, buttonNum); currentOptionsGroup->mouseClicked(minecraft, x, y, buttonNum);
@@ -244,7 +240,6 @@ void OptionsScreen::mouseClicked(int x, int y, int buttonNum) {
} }
void OptionsScreen::mouseReleased(int x, int y, int buttonNum) { void OptionsScreen::mouseReleased(int x, int y, int buttonNum) {
if (currentOptionsGroup != NULL) if (currentOptionsGroup != NULL)
currentOptionsGroup->mouseReleased(minecraft, x, y, buttonNum); currentOptionsGroup->mouseReleased(minecraft, x, y, buttonNum);
@@ -254,7 +249,9 @@ void OptionsScreen::mouseReleased(int x, int y, int buttonNum) {
void OptionsScreen::keyPressed(int eventKey) { void OptionsScreen::keyPressed(int eventKey) {
if (currentOptionsGroup != NULL) if (currentOptionsGroup != NULL)
currentOptionsGroup->keyPressed(minecraft, eventKey); currentOptionsGroup->keyPressed(minecraft, eventKey);
if (eventKey == Keyboard::KEY_ESCAPE)
minecraft->options.save();
super::keyPressed(eventKey); super::keyPressed(eventKey);
} }
@@ -271,4 +268,4 @@ void OptionsScreen::tick() {
currentOptionsGroup->tick(minecraft); currentOptionsGroup->tick(minecraft);
super::tick(); super::tick();
} }

View File

@@ -5,12 +5,16 @@
#include "../../../util/Mth.h" #include "../../../util/Mth.h"
#include "../../../network/RakNetInstance.h" #include "../../../network/RakNetInstance.h"
#include "../../../network/ServerSideNetworkHandler.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) PauseScreen::PauseScreen(bool wasBackPaused)
: saveStep(0), : saveStep(0),
visibleTime(0), visibleTime(0),
bContinue(0), bContinue(0),
bQuit(0), bQuit(0),
bOptions(0),
bQuitAndSaveLocally(0), bQuitAndSaveLocally(0),
bServerVisibility(0), bServerVisibility(0),
// bThirdPerson(0), // bThirdPerson(0),
@@ -39,18 +43,21 @@ PauseScreen::~PauseScreen() {
delete bQuit; delete bQuit;
delete bQuitAndSaveLocally; delete bQuitAndSaveLocally;
delete bServerVisibility; delete bServerVisibility;
delete bOptions;
// delete bThirdPerson; // delete bThirdPerson;
} }
void PauseScreen::init() { void PauseScreen::init() {
if (minecraft->useTouchscreen()) { if (/* minecraft->useTouchscreen() */ true) {
bContinue = new Touch::TButton(1, "Back to game"); bContinue = new Touch::TButton(1, "Back to game");
bOptions = new Touch::TButton(5, "Options");
bQuit = new Touch::TButton(2, "Quit to title"); bQuit = new Touch::TButton(2, "Quit to title");
bQuitAndSaveLocally = new Touch::TButton(3, "Quit and copy map"); bQuitAndSaveLocally = new Touch::TButton(3, "Quit and copy map");
bServerVisibility = new Touch::TButton(4, ""); bServerVisibility = new Touch::TButton(4, "");
// bThirdPerson = new Touch::TButton(5, "Toggle 3:rd person view"); // bThirdPerson = new Touch::TButton(5, "Toggle 3:rd person view");
} else { } else {
bContinue = new Button(1, "Back to game"); bContinue = new Button(1, "Back to game");
bOptions = new Button(5, "Options");
bQuit = new Button(2, "Quit to title"); bQuit = new Button(2, "Quit to title");
bQuitAndSaveLocally = new Button(3, "Quit and copy map"); bQuitAndSaveLocally = new Button(3, "Quit and copy map");
bServerVisibility = new Button(4, ""); bServerVisibility = new Button(4, "");
@@ -59,7 +66,7 @@ void PauseScreen::init() {
buttons.push_back(bContinue); buttons.push_back(bContinue);
buttons.push_back(bQuit); buttons.push_back(bQuit);
buttons.push_back(bOptions);
// bSound.updateImage(&minecraft->options); // bSound.updateImage(&minecraft->options);
bThirdPerson.updateImage(&minecraft->options); bThirdPerson.updateImage(&minecraft->options);
bHideGui.updateImage(&minecraft->options); bHideGui.updateImage(&minecraft->options);
@@ -99,21 +106,24 @@ void PauseScreen::setupPositions() {
saveStep = 0; saveStep = 0;
int yBase = 16; int yBase = 16;
bContinue->width = bQuit->width = /*bThirdPerson->w =*/ 160; bContinue->width = bOptions->width = bQuit->width = /*bThirdPerson->w =*/ 160;
bQuitAndSaveLocally->width = bServerVisibility->width = 160; bQuitAndSaveLocally->width = bServerVisibility->width = 160;
bContinue->x = (width - bContinue->width) / 2; bContinue->x = (width - bContinue->width) / 2;
bContinue->y = yBase + 32 * 1; bContinue->y = yBase + 32 * 1;
bOptions->x = (width - bOptions->width) / 2;
bOptions->y = yBase + 32 * 2;
bQuit->x = (width - bQuit->width) / 2; bQuit->x = (width - bQuit->width) / 2;
bQuit->y = yBase + 32 * 2; bQuit->y = yBase + 32 * 3;
#if APPLE_DEMO_PROMOTION #if APPLE_DEMO_PROMOTION
bQuit->y += 16; bQuit->y += 16;
#endif #endif
bQuitAndSaveLocally->x = bServerVisibility->x = (width - bQuitAndSaveLocally->width) / 2; bQuitAndSaveLocally->x = bServerVisibility->x = (width - bQuitAndSaveLocally->width) / 2;
bQuitAndSaveLocally->y = bServerVisibility->y = yBase + 32 * 3; bQuitAndSaveLocally->y = bServerVisibility->y = yBase + 32 * 4;
// bSound.y = bThirdPerson.y = 8; // bSound.y = bThirdPerson.y = 8;
// bSound.x = 4; // bSound.x = 4;
@@ -157,7 +167,9 @@ void PauseScreen::buttonClicked(Button* button) {
if (button->id == bQuitAndSaveLocally->id) { if (button->id == bQuitAndSaveLocally->id) {
minecraft->leaveGame(true); minecraft->leaveGame(true);
} }
if (button->id == bOptions->id) {
minecraft->setScreen(new OptionsScreen());
}
if (button->id == bServerVisibility->id) { if (button->id == bServerVisibility->id) {
if (minecraft->raknetInstance && minecraft->netCallback && minecraft->raknetInstance->isServer()) { if (minecraft->raknetInstance && minecraft->netCallback && minecraft->raknetInstance->isServer()) {
ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) minecraft->netCallback; ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) minecraft->netCallback;

View File

@@ -33,7 +33,9 @@ private:
Button* bQuit; Button* bQuit;
Button* bQuitAndSaveLocally; Button* bQuitAndSaveLocally;
Button* bServerVisibility; Button* bServerVisibility;
// Button* bThirdPerson; Button* bOptions;
// Button* bThirdPerson;
// OptionButton bSound; // OptionButton bSound;
OptionButton bThirdPerson; OptionButton bThirdPerson;

View File

@@ -11,6 +11,8 @@ public:
void render(int xm, int ym, float a); void render(int xm, int ym, float a);
bool isInGameScreen(); bool isInGameScreen();
virtual void keyPressed(int eventKey) {}
void tick(); void tick();
private: private:
int ticks; int ticks;

View File

@@ -4,6 +4,7 @@
#include "JoinGameScreen.h" #include "JoinGameScreen.h"
#include "PauseScreen.h" #include "PauseScreen.h"
#include "RenameMPLevelScreen.h" #include "RenameMPLevelScreen.h"
#include "ConsoleScreen.h"
#include "IngameBlockSelectionScreen.h" #include "IngameBlockSelectionScreen.h"
#include "JoinByIPScreen.h" #include "JoinByIPScreen.h"
#include "touch/TouchStartMenuScreen.h" #include "touch/TouchStartMenuScreen.h"
@@ -19,7 +20,8 @@ Screen* ScreenChooser::createScreen( ScreenId id )
{ {
Screen* screen = NULL; Screen* screen = NULL;
if (_mc->useTouchscreen()) { // :sob:
if (/* _mc->useTouchscreen() */ true) {
switch (id) { switch (id) {
case SCREEN_STARTMENU: screen = new Touch::StartMenuScreen(); break; case SCREEN_STARTMENU: screen = new Touch::StartMenuScreen(); break;
case SCREEN_SELECTWORLD: screen = new Touch::SelectWorldScreen();break; case SCREEN_SELECTWORLD: screen = new Touch::SelectWorldScreen();break;
@@ -28,6 +30,7 @@ Screen* ScreenChooser::createScreen( ScreenId id )
case SCREEN_PAUSEPREV: screen = new PauseScreen(true); break; case SCREEN_PAUSEPREV: screen = new PauseScreen(true); break;
case SCREEN_BLOCKSELECTION: screen = new Touch::IngameBlockSelectionScreen(); break; case SCREEN_BLOCKSELECTION: screen = new Touch::IngameBlockSelectionScreen(); break;
case SCREEN_JOINBYIP: screen = new JoinByIPScreen(); break; case SCREEN_JOINBYIP: screen = new JoinByIPScreen(); break;
case SCREEN_CONSOLE: screen = new ConsoleScreen(); break;
case SCREEN_NONE: case SCREEN_NONE:
default: default:
// Do nothing // Do nothing
@@ -42,7 +45,7 @@ Screen* ScreenChooser::createScreen( ScreenId id )
case SCREEN_PAUSEPREV: screen = new PauseScreen(true); break; case SCREEN_PAUSEPREV: screen = new PauseScreen(true); break;
case SCREEN_BLOCKSELECTION: screen = new IngameBlockSelectionScreen(); break; case SCREEN_BLOCKSELECTION: screen = new IngameBlockSelectionScreen(); break;
case SCREEN_JOINBYIP: screen = new JoinByIPScreen(); break; case SCREEN_JOINBYIP: screen = new JoinByIPScreen(); break;
case SCREEN_CONSOLE: screen = new ConsoleScreen(); break;
case SCREEN_NONE: case SCREEN_NONE:
default: default:
// Do nothing // Do nothing

View File

@@ -9,7 +9,8 @@ enum ScreenId {
SCREEN_PAUSEPREV, SCREEN_PAUSEPREV,
SCREEN_SELECTWORLD, SCREEN_SELECTWORLD,
SCREEN_BLOCKSELECTION, SCREEN_BLOCKSELECTION,
SCREEN_JOINBYIP SCREEN_JOINBYIP,
SCREEN_CONSOLE
}; };
class Screen; class Screen;

View File

@@ -56,7 +56,7 @@ void SimpleChooseLevelScreen::init()
def.setSrc(IntRectangle(150, 0, (int)def.width, (int)def.height)); def.setSrc(IntRectangle(150, 0, (int)def.width, (int)def.height));
bBack->setImageDef(def, true); bBack->setImageDef(def, true);
} }
if (minecraft->useTouchscreen()) { if (/* minecraft->useTouchscreen() */ true) {
bGamemode = new Touch::TButton(1, "Survival mode"); bGamemode = new Touch::TButton(1, "Survival mode");
bCheats = new Touch::TButton(4, "Cheats: Off"); bCheats = new Touch::TButton(4, "Cheats: Off");
bCreate = new Touch::TButton(3, "Create"); bCreate = new Touch::TButton(3, "Create");

View File

@@ -1,7 +1,6 @@
#include "UsernameScreen.h" #include "UsernameScreen.h"
#include "StartMenuScreen.h" #include "StartMenuScreen.h"
#include "../../Minecraft.h" #include "../../Minecraft.h"
#include "../../User.h"
#include "../Font.h" #include "../Font.h"
#include "../components/Button.h" #include "../components/Button.h"
#include "../../../platform/input/Keyboard.h" #include "../../../platform/input/Keyboard.h"
@@ -36,8 +35,8 @@ void UsernameScreen::setupPositions()
// Make the done button match the touch-style option tabs // Make the done button match the touch-style option tabs
_btnDone.width = 66; _btnDone.width = 66;
_btnDone.height = 26; _btnDone.height = 26;
_btnDone.x = (width - _btnDone.width) / 2; _btnDone.x = cx - (_btnDone.width / 2);
_btnDone.y = height / 2 + 52; _btnDone.y = cy + 52;
tUsername.width = 120; tUsername.width = 120;
tUsername.height = 20; tUsername.height = 20;
@@ -75,7 +74,6 @@ void UsernameScreen::buttonClicked(Button* button)
if (button == &_btnDone && !tUsername.text.empty()) { if (button == &_btnDone && !tUsername.text.empty()) {
minecraft->options.set(OPTIONS_USERNAME, tUsername.text); minecraft->options.set(OPTIONS_USERNAME, tUsername.text);
minecraft->options.save(); minecraft->options.save();
minecraft->user->name = tUsername.text;
minecraft->setScreen(NULL); // goes to StartMenuScreen minecraft->setScreen(NULL); // goes to StartMenuScreen
} }
} }

View File

@@ -16,7 +16,7 @@
#include "../../../../world/level/Level.h" #include "../../../../world/level/Level.h"
#include "../../../../world/item/DyePowderItem.h" #include "../../../../world/item/DyePowderItem.h"
#include "../../../../world/item/crafting/Recipe.h" #include "../../../../world/item/crafting/Recipe.h"
#include "Keyboard.h" #include "platform/input/Keyboard.h"
static NinePatchLayer* guiPaneFrame = NULL; static NinePatchLayer* guiPaneFrame = NULL;
@@ -41,7 +41,7 @@ public:
//fill(x+1, y+1, x+w-1, y+h-1, 0xff999999); //fill(x+1, y+1, x+w-1, y+h-1, 0xff999999);
bool hovered = active && (minecraft->useTouchscreen()? bool hovered = active && (minecraft->useTouchscreen()?
(_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : false); (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : isInside(xm, ym));
if (hovered || *selectedPtr == this) if (hovered || *selectedPtr == this)
statePressed->draw(Tesselator::instance, (float)x, (float)y); 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); //fill(x+1, y+1, x+w-1, y+h-1, 0xff999999);
bool hovered = active && (minecraft->useTouchscreen()? bool hovered = active && (minecraft->useTouchscreen()?
(_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : false); (_currentlyDown && xm >= x && ym >= y && xm < x + width && ym < y + height) : isInside(xm, ym));
if (hovered || selected) if (hovered || selected)
bgSelected->draw(Tesselator::instance, (float)x, (float)y); bgSelected->draw(Tesselator::instance, (float)x, (float)y);

View File

@@ -1,291 +1,293 @@
#include "TouchIngameBlockSelectionScreen.h" #include "TouchIngameBlockSelectionScreen.h"
#include "../crafting/WorkbenchScreen.h" #include "../crafting/WorkbenchScreen.h"
#include "../../Screen.h" #include "../../Screen.h"
#include "../../components/ImageButton.h" #include "../../components/ImageButton.h"
#include "../../components/InventoryPane.h" #include "../../components/InventoryPane.h"
#include "../../../gamemode/GameMode.h" #include "../../../gamemode/GameMode.h"
#include "../../../renderer/TileRenderer.h" #include "../../../renderer/TileRenderer.h"
#include "../../../player/LocalPlayer.h" #include "../../../player/LocalPlayer.h"
#include "../../../renderer/gles.h" #include "../../../renderer/gles.h"
#include "../../../renderer/entity/ItemRenderer.h" #include "../../../renderer/entity/ItemRenderer.h"
#include "../../../renderer/Tesselator.h" #include "../../../renderer/Tesselator.h"
#include "../../../renderer/Textures.h" #include "../../../renderer/Textures.h"
#include "../../../Minecraft.h" #include "../../../Minecraft.h"
#include "../../../sound/SoundEngine.h" #include "../../../sound/SoundEngine.h"
#include "../../../../world/entity/player/Inventory.h" #include "../../../../world/entity/player/Inventory.h"
#include "../../../../platform/input/Mouse.h" #include "../../../../platform/input/Mouse.h"
#include "../../../../util/Mth.h" #include "../../../../util/Mth.h"
#include "../../../../world/item/ItemInstance.h" #include "../../../../world/item/ItemInstance.h"
#include "../../../../world/entity/player/Player.h" #include "../../../../world/entity/player/Player.h"
#include "../../../../world/item/crafting/Recipe.h" #include "../../../../world/item/crafting/Recipe.h"
#include "../../../player/input/touchscreen/TouchAreaModel.h" #include "../../../player/input/touchscreen/TouchAreaModel.h"
#include "../ArmorScreen.h" #include "../ArmorScreen.h"
namespace Touch { namespace Touch {
#if defined(__APPLE__) #if defined(__APPLE__)
static const std::string demoVersionString("Not available in the Lite version"); static const std::string demoVersionString("Not available in the Lite version");
#else #else
static const std::string demoVersionString("Not available in the demo version"); static const std::string demoVersionString("Not available in the demo version");
#endif #endif
#ifdef __APPLE__ #ifdef __APPLE__
static const float BorderPixels = 4; static const float BorderPixels = 4;
#ifdef DEMO_MODE #ifdef DEMO_MODE
static const float BlockPixels = 22; static const float BlockPixels = 22;
#else #else
static const float BlockPixels = 22; static const float BlockPixels = 22;
#endif #endif
#else #else
static const float BorderPixels = 4; static const float BorderPixels = 4;
static const float BlockPixels = 24; static const float BlockPixels = 24;
#endif #endif
static const int ItemSize = (int)(BlockPixels + 2*BorderPixels); static const int ItemSize = (int)(BlockPixels + 2*BorderPixels);
static const int Bx = 10; // Border Frame width static const int Bx = 10; // Border Frame width
static const int By = 6; // Border Frame height static const int By = 6; // Border Frame height
// //
// Block selection screen // Block selection screen
// //
IngameBlockSelectionScreen::IngameBlockSelectionScreen() IngameBlockSelectionScreen::IngameBlockSelectionScreen()
: selectedItem(0), : selectedItem(0),
_blockList(NULL), _blockList(NULL),
_pendingClose(false), _pendingClose(false),
bArmor (4, "Armor"), bArmor (4, "Armor"),
bDone (3, ""), bDone (3, ""),
//bDone (3, "Done"), //bDone (3, "Done"),
bMenu (2, "Menu"), bMenu (2, "Menu"),
bCraft (1, "Craft"), bCraft (1, "Craft"),
bHeader (0, "Select blocks") bHeader (0, "Select blocks")
{ {
} }
IngameBlockSelectionScreen::~IngameBlockSelectionScreen() IngameBlockSelectionScreen::~IngameBlockSelectionScreen()
{ {
delete _blockList; delete _blockList;
} }
void IngameBlockSelectionScreen::init() void IngameBlockSelectionScreen::init()
{ {
Inventory* inventory = minecraft->player->inventory; Inventory* inventory = minecraft->player->inventory;
//const int itemWidth = 2 * BorderPixels + //const int itemWidth = 2 * BorderPixels +
int maxWidth = width - Bx - Bx; int maxWidth = width - Bx - Bx;
InventoryColumns = maxWidth / ItemSize; InventoryColumns = maxWidth / ItemSize;
const int realWidth = InventoryColumns * ItemSize; const int realWidth = InventoryColumns * ItemSize;
const int realBx = (width - realWidth) / 2; const int realBx = (width - realWidth) / 2;
IntRectangle rect(realBx, IntRectangle rect(realBx,
#ifdef __APPLE__ #ifdef __APPLE__
24 + By - ((width==240)?1:0), realWidth, ((width==240)?1:0) + height-By-By-20-24); 24 + By - ((width==240)?1:0), realWidth, ((width==240)?1:0) + height-By-By-20-24);
#else #else
24 + By, realWidth, height-By-By-20-24); 24 + By, realWidth, height-By-By-20-24);
#endif #endif
_blockList = new InventoryPane(this, minecraft, rect, width, BorderPixels, inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE, ItemSize, (int)BorderPixels); _blockList = new InventoryPane(this, minecraft, rect, width, BorderPixels, inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE, ItemSize, (int)BorderPixels);
_blockList->fillMarginX = realBx; _blockList->fillMarginX = realBx;
//for (int i = 0; i < inventory->getContainerSize(); ++i) //for (int i = 0; i < inventory->getContainerSize(); ++i)
//LOGI("> %d - %s\n", i, inventory->getItem(i)? inventory->getItem(i)->getDescriptionId().c_str() : "<-->\n"); //LOGI("> %d - %s\n", i, inventory->getItem(i)? inventory->getItem(i)->getDescriptionId().c_str() : "<-->\n");
InventorySize = inventory->getContainerSize(); // Grid indices are 0..N-1 for main inventory only; slots 0..MAX_SELECTION_SIZE-1 are hotbar links.
InventoryRows = 1 + (InventorySize-1) / InventoryColumns; InventorySize = inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE;
InventoryRows = 1 + (InventorySize-1) / InventoryColumns;
//
// Buttons //
// // Buttons
ImageDef def; //
def.name = "gui/spritesheet.png"; ImageDef def;
def.x = 0; def.name = "gui/spritesheet.png";
def.y = 1; def.x = 0;
def.width = def.height = 18; def.y = 1;
def.setSrc(IntRectangle(60, 0, 18, 18)); def.width = def.height = 18;
bDone.setImageDef(def, true); def.setSrc(IntRectangle(60, 0, 18, 18));
bDone.width = bDone.height = 19; bDone.setImageDef(def, true);
bDone.width = bDone.height = 19;
bDone.scaleWhenPressed = false;
bDone.scaleWhenPressed = false;
buttons.push_back(&bHeader);
buttons.push_back(&bDone); buttons.push_back(&bHeader);
if (!minecraft->isCreativeMode()) { buttons.push_back(&bDone);
buttons.push_back(&bCraft); if (!minecraft->isCreativeMode()) {
buttons.push_back(&bArmor); buttons.push_back(&bCraft);
} buttons.push_back(&bArmor);
} }
}
void IngameBlockSelectionScreen::setupPositions() {
bHeader.y = bDone.y = bCraft.y = 0; void IngameBlockSelectionScreen::setupPositions() {
bDone.x = width - bDone.width; bHeader.y = bDone.y = bCraft.y = 0;
bCraft.x = 0;//width - bDone.w - bCraft.w; bDone.x = width - bDone.width;
bCraft.width = bArmor.width = 48; bCraft.x = 0;//width - bDone.w - bCraft.w;
bArmor.x = bCraft.width; bCraft.width = bArmor.width = 48;
bArmor.x = bCraft.width;
if (minecraft->isCreativeMode()) {
bHeader.x = 0; if (minecraft->isCreativeMode()) {
bHeader.width = width;// - bDone.w; bHeader.x = 0;
bHeader.xText = width/2; // Center of the screen bHeader.width = width;// - bDone.w;
} else { bHeader.xText = width/2; // Center of the screen
bHeader.x = bCraft.width + bArmor.width; } else {
bHeader.width = width - bCraft.width - bArmor.width;// - bDone.w; bHeader.x = bCraft.width + bArmor.width;
bHeader.xText = bHeader.x + (bHeader.width - bDone.width) /2; 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.x = 0;
clippingArea.y = 0; clippingArea.w = minecraft->width;
clippingArea.h = (int)(Gui::GuiScale * 24); clippingArea.y = 0;
} clippingArea.h = (int)(Gui::GuiScale * 24);
}
void IngameBlockSelectionScreen::removed()
{ void IngameBlockSelectionScreen::removed()
minecraft->gui.inventoryUpdated(); {
} minecraft->gui.inventoryUpdated();
}
int IngameBlockSelectionScreen::getSlotPosX(int slotX) {
// @todo: Number of columns int IngameBlockSelectionScreen::getSlotPosX(int slotX) {
return width / 2 - InventoryColumns * 10 + slotX * 20 + 2; // @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::getSlotPosY(int slotY) {
} return height - 16 - 3 - 22 * 2 - 22 * slotY;
}
int IngameBlockSelectionScreen::getSlotHeight() {
// same as non-touch implementation int IngameBlockSelectionScreen::getSlotHeight() {
return 22; // same as non-touch implementation
} return 22;
}
void IngameBlockSelectionScreen::mouseClicked(int x, int y, int buttonNum) {
_pendingClose = _blockList->_clickArea->isInside((float)x, (float)y); void IngameBlockSelectionScreen::mouseClicked(int x, int y, int buttonNum) {
if (!_pendingClose) _pendingClose = _blockList->_clickArea->isInside((float)x, (float)y);
super::mouseClicked(x, y, buttonNum); 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)) void IngameBlockSelectionScreen::mouseReleased(int x, int y, int buttonNum) {
minecraft->setScreen(NULL); if (_pendingClose && _blockList->_clickArea->isInside((float)x, (float)y))
else minecraft->setScreen(NULL);
super::mouseReleased(x, y, buttonNum); else
} super::mouseReleased(x, y, buttonNum);
}
void IngameBlockSelectionScreen::mouseWheel(int dx, int dy, int xm, int ym)
{ void IngameBlockSelectionScreen::mouseWheel(int dx, int dy, int xm, int ym)
if (dy == 0) return; {
if (_blockList) { if (dy == 0) return;
float amount = -dy * getSlotHeight(); if (_blockList) {
_blockList->scrollBy(0, amount); float amount = -dy * getSlotHeight();
} _blockList->scrollBy(0, amount);
int cols = InventoryColumns; }
int maxIndex = InventorySize - 1; int cols = InventoryColumns;
int idx = selectedItem; int maxIndex = InventorySize - 1;
if (dy > 0) { int idx = selectedItem;
if (idx >= cols) idx -= cols; if (dy > 0) {
} else { if (idx >= cols) idx -= cols;
if (idx + cols <= maxIndex) idx += cols; } else {
} if (idx + cols <= maxIndex) idx += cols;
selectedItem = idx; }
} selectedItem = idx;
}
bool IngameBlockSelectionScreen::addItem(const InventoryPane* pane, int itemId)
{ bool IngameBlockSelectionScreen::addItem(const InventoryPane* pane, int itemId)
Inventory* inventory = minecraft->player->inventory; {
itemId += Inventory::MAX_SELECTION_SIZE; Inventory* inventory = minecraft->player->inventory;
itemId += Inventory::MAX_SELECTION_SIZE;
if (!inventory->getItem(itemId))
return false; if (!inventory->getItem(itemId))
return false;
inventory->moveToSelectionSlot(0, itemId, true);
inventory->moveToSelectionSlot(0, itemId, true);
inventory->selectSlot(0);
#ifdef __APPLE__ inventory->selectSlot(0);
minecraft->soundEngine->playUI("random.pop", 0.3f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random())); #ifdef __APPLE__
#else minecraft->soundEngine->playUI("random.pop", 0.3f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random()));
minecraft->soundEngine->playUI("random.pop2", 1.0f, 0.3f);//1.0f + 0.2f*(Mth::random()-Mth::random())); #else
#endif 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); // Flash the selected gui item
return true; minecraft->gui.flashSlot(inventory->selected);
} return true;
}
void IngameBlockSelectionScreen::tick()
{ void IngameBlockSelectionScreen::tick()
_blockList->tick(); {
super::tick(); _blockList->tick();
} super::tick();
}
void IngameBlockSelectionScreen::render( int xm, int ym, float a )
{ void IngameBlockSelectionScreen::render( int xm, int ym, float a )
glDisable2(GL_DEPTH_TEST); {
glEnable2(GL_BLEND); glDisable2(GL_DEPTH_TEST);
glEnable2(GL_BLEND);
Screen::render(xm, ym, a);
_blockList->render(xm, ym, a); Screen::render(xm, ym, a);
_blockList->render(xm, ym, a);
// render frame
IntRectangle& bbox = _blockList->rect; // render frame
Tesselator::instance.colorABGR(0xffffffff); IntRectangle& bbox = _blockList->rect;
minecraft->textures->loadAndBindTexture("gui/itemframe.png"); Tesselator::instance.colorABGR(0xffffffff);
glEnable2(GL_BLEND); minecraft->textures->loadAndBindTexture("gui/itemframe.png");
glColor4f2(1, 1, 1, 1); glEnable2(GL_BLEND);
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f2(1, 1, 1, 1);
blit(0, bbox.y-By, 0, 0, width, bbox.h+By+By, 215, 256); // why bbox.h + 1*B? glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable2(GL_BLEND); 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);
} glEnable2(GL_DEPTH_TEST);
}
void IngameBlockSelectionScreen::renderDemoOverlay() {
#ifdef DEMO_MODE void IngameBlockSelectionScreen::renderDemoOverlay() {
fill( getSlotPosX(0) - 3, getSlotPosY(1) - 3, #ifdef DEMO_MODE
getSlotPosX(9) - 3, getSlotPosY(-1) - 3, 0xa0 << 24); 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; const int centerX = (getSlotPosX(4) + getSlotPosX(5)) / 2;
drawCenteredString(minecraft->font, demoVersionString, centerX, centerY, 0xffffffff); const int centerY = (getSlotPosY(0) + getSlotPosY(1)) / 2 + 5;
#endif /*DEMO_MODE*/ drawCenteredString(minecraft->font, demoVersionString, centerX, centerY, 0xffffffff);
} #endif /*DEMO_MODE*/
}
void IngameBlockSelectionScreen::buttonClicked(Button* button) {
if (button->id == bDone.id) void IngameBlockSelectionScreen::buttonClicked(Button* button) {
minecraft->setScreen(NULL); if (button->id == bDone.id)
minecraft->setScreen(NULL);
if (button->id == bMenu.id)
minecraft->screenChooser.setScreen(SCREEN_PAUSE); if (button->id == bMenu.id)
minecraft->screenChooser.setScreen(SCREEN_PAUSE);
if (button->id == bCraft.id)
minecraft->setScreen(new WorkbenchScreen(Recipe::SIZE_2X2)); if (button->id == bCraft.id)
minecraft->setScreen(new WorkbenchScreen(Recipe::SIZE_2X2));
if (button == &bArmor)
minecraft->setScreen(new ArmorScreen()); if (button == &bArmor)
} minecraft->setScreen(new ArmorScreen());
}
bool IngameBlockSelectionScreen::isAllowed( int slot )
{ bool IngameBlockSelectionScreen::isAllowed( int slot )
if (slot < 0 || slot >= minecraft->player->inventory->getContainerSize()) {
return false; const int gridCount = minecraft->player->inventory->getContainerSize() - Inventory::MAX_SELECTION_SIZE;
if (slot < 0 || slot >= gridCount)
#ifdef DEMO_MODE return false;
if (slot >= (minecraft->isCreativeMode()? 28 : 27)) return false;
#endif #ifdef DEMO_MODE
return true; if (slot >= (minecraft->isCreativeMode()? 28 : 27)) return false;
} #endif
return true;
bool IngameBlockSelectionScreen::hasClippingArea( IntRectangle& out ) }
{
out = clippingArea; bool IngameBlockSelectionScreen::hasClippingArea( IntRectangle& out )
return true; {
} out = clippingArea;
return true;
std::vector<const ItemInstance*> IngameBlockSelectionScreen::getItems( const InventoryPane* forPane ) }
{
std::vector<const ItemInstance*> out; std::vector<const ItemInstance*> IngameBlockSelectionScreen::getItems( const InventoryPane* forPane )
for (int i = Inventory::MAX_SELECTION_SIZE; i < minecraft->player->inventory->getContainerSize(); ++i) {
out.push_back(minecraft->player->inventory->getItem(i)); std::vector<const ItemInstance*> out;
return out; for (int i = Inventory::MAX_SELECTION_SIZE; i < minecraft->player->inventory->getContainerSize(); ++i)
} out.push_back(minecraft->player->inventory->getItem(i));
return out;
} }
}

View File

@@ -86,21 +86,21 @@ public:
SelectWorldScreen(); SelectWorldScreen();
virtual ~SelectWorldScreen(); virtual ~SelectWorldScreen();
virtual void init(); virtual void init() override;
virtual void setupPositions(); virtual void setupPositions() override;
virtual void tick(); virtual void tick() override;
virtual void render(int xm, int ym, float a); virtual void render(int xm, int ym, float a) override;
virtual bool isIndexValid(int index); virtual bool isIndexValid(int index);
virtual bool handleBackEvent(bool isDown); virtual bool handleBackEvent(bool isDown) override;
virtual void buttonClicked(Button* button); virtual void buttonClicked(Button* button) override;
virtual void keyPressed(int eventKey); virtual void keyPressed(int eventKey) override;
// support for mouse wheel when desktop code uses touch variant // support for mouse wheel when desktop code uses touch variant
virtual void mouseWheel(int dx, int dy, int xm, int ym) override; virtual void mouseWheel(int dx, int dy, int xm, int ym) override;
bool isInGameScreen(); bool isInGameScreen() override;
private: private:
void loadLevelSource(); void loadLevelSource();
std::string getUniqueLevelName(const std::string& level); std::string getUniqueLevelName(const std::string& level);

View File

@@ -24,12 +24,15 @@
#include "../../platform/HttpClient.h" #include "../../platform/HttpClient.h"
#include "../../platform/CThread.h" #include "../../platform/CThread.h"
#include "../../util/StringUtils.h" #include "../../util/StringUtils.h"
#include "client/Options.h"
#if defined(_WIN32) #if defined(_WIN32)
#include <direct.h> #include <direct.h>
#include <sys/stat.h>
#else #else
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <errno.h>
#endif #endif
#ifndef STANDALONE_SERVER #ifndef STANDALONE_SERVER
@@ -185,6 +188,33 @@ static bool ensureDirectoryExists(const std::string& path) {
return _mkdir(path.c_str()) == 0 || errno == EEXIST; return _mkdir(path.c_str()) == 0 || errno == EEXIST;
#else #else
struct stat st; 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)) if (stat(path.c_str(), &st) == 0 && S_ISDIR(st.st_mode))
return true; return true;
return mkdir(path.c_str(), 0755) == 0 || errno == EEXIST; return mkdir(path.c_str(), 0755) == 0 || errno == EEXIST;
@@ -226,6 +256,7 @@ static void* fetchSkinForPlayer(void* param) {
std::string skinUrl = getSkinUrlForUsername(player->name); std::string skinUrl = getSkinUrlForUsername(player->name);
if (skinUrl.empty()) { if (skinUrl.empty()) {
LOGW("[Skin] skin URL lookup failed for %s\n", player->name.c_str()); LOGW("[Skin] skin URL lookup failed for %s\n", player->name.c_str());
player->setTextureName("mob/char.png");
return NULL; return NULL;
} }
@@ -233,6 +264,7 @@ static void* fetchSkinForPlayer(void* param) {
std::vector<unsigned char> skinData; std::vector<unsigned char> skinData;
if (!HttpClient::download(skinUrl, skinData) || skinData.empty()) { if (!HttpClient::download(skinUrl, skinData) || skinData.empty()) {
LOGW("[Skin] download failed for %s\n", skinUrl.c_str()); LOGW("[Skin] download failed for %s\n", skinUrl.c_str());
player->setTextureName("mob/char.png");
return NULL; return NULL;
} }
@@ -242,11 +274,13 @@ static void* fetchSkinForPlayer(void* param) {
fwrite(skinData.data(), 1, skinData.size(), fp); fwrite(skinData.data(), 1, skinData.size(), fp);
fclose(fp); fclose(fp);
LOGI("[Skin] cached skin to %s\n", cacheFile.c_str()); LOGI("[Skin] cached skin to %s\n", cacheFile.c_str());
} else {
player->setTextureName("skins/" + player->name + ".png");
} else {
LOGW("[Skin] failed to write skin cache %s\n", cacheFile.c_str()); 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; return NULL;
} }
@@ -287,11 +321,12 @@ static void* fetchCapeForPlayer(void* param) {
fwrite(capeData.data(), 1, capeData.size(), fp); fwrite(capeData.data(), 1, capeData.size(), fp);
fclose(fp); fclose(fp);
LOGI("[Cape] cached cape to %s\n", cacheFile.c_str()); LOGI("[Cape] cached cape to %s\n", cacheFile.c_str());
player->setCapeTextureName("capes/" + player->name + ".png");
} else { } else {
LOGW("[Cape] failed to write cape cache %s\n", cacheFile.c_str()); LOGW("[Cape] failed to write cape cache %s\n", cacheFile.c_str());
} }
player->setCapeTextureName("capes/" + player->name + ".png");
return NULL; return NULL;
} }
@@ -310,7 +345,7 @@ static bool isJumpable(int tileId) {
} // anonymous namespace } // anonymous namespace
LocalPlayer::LocalPlayer(Minecraft* minecraft, Level* level, User* user, int dimension, bool isCreative) LocalPlayer::LocalPlayer(Minecraft* minecraft, Level* level, const std::string& username, int dimension, bool isCreative)
: Player(level, isCreative), : Player(level, isCreative),
minecraft(minecraft), minecraft(minecraft),
input(NULL), input(NULL),
@@ -324,11 +359,15 @@ LocalPlayer::LocalPlayer(Minecraft* minecraft, Level* level, User* user, int dim
{ {
this->dimension = dimension; this->dimension = dimension;
_init(); _init();
#ifndef STANDALONE_SERVER #ifndef STANDALONE_SERVER
if (user != NULL && !user->name.empty()) {
this->name = user->name; if (minecraft->options.getStringValue(OPTIONS_USERNAME).size() != 0) {
textureName = "mob/char.png";
this->name = minecraft->options.getStringValue(OPTIONS_USERNAME);
printf("test \n");
// Fetch user skin and cape from Mojang servers in the background (avoids blocking the main thread) // 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(fetchSkinForPlayer, this);
new CThread(fetchCapeForPlayer, this); new CThread(fetchCapeForPlayer, this);
} }
@@ -349,9 +388,15 @@ void LocalPlayer::calculateFlight(float xa, float ya, float za) {
ya = 0; ya = 0;
za = za * flySpeed; za = za * flySpeed;
if (sprinting) {
float sprintBoost = getWalkingSpeedModifier(); // 1.3x
xa *= sprintBoost;
za *= sprintBoost;
}
#ifdef ANDROID #ifdef ANDROID
if (Keyboard::isKeyDown(103)) ya = .2f * minecraft->options.flySpeed; if (Keyboard::isKeyDown(103)) ya = .2f * flySpeed;
if (Keyboard::isKeyDown(102)) ya = -.2f * minecraft->options.flySpeed; if (Keyboard::isKeyDown(102)) ya = -.2f * flySpeed;
#else #else
if (Keyboard::isKeyDown(Keyboard::KEY_E)) ya = .2f * flySpeed; if (Keyboard::isKeyDown(Keyboard::KEY_E)) ya = .2f * flySpeed;
if (Keyboard::isKeyDown(Keyboard::KEY_Q)) ya = -.2f * flySpeed; if (Keyboard::isKeyDown(Keyboard::KEY_Q)) ya = -.2f * flySpeed;
@@ -467,7 +512,7 @@ void LocalPlayer::aiStep() {
if (sprintDoubleTapTimer > 0) sprintDoubleTapTimer--; if (sprintDoubleTapTimer > 0) sprintDoubleTapTimer--;
prevForwardHeld = forwardHeld; prevForwardHeld = forwardHeld;
} }
if (input->sneaking || abilities.flying) if (input->sneaking)
sprinting = false; sprinting = false;
if (input->sneaking) { if (input->sneaking) {

View File

@@ -4,8 +4,6 @@
//package net.minecraft.client.player; //package net.minecraft.client.player;
#include "input/IMoveInput.h" #include "input/IMoveInput.h"
#include "../User.h"
#include "../../platform/input/Keyboard.h"
#include "../../util/SmoothFloat.h" #include "../../util/SmoothFloat.h"
#include "../../world/entity/player/Player.h" #include "../../world/entity/player/Player.h"
@@ -17,7 +15,7 @@ class LocalPlayer: public Player
{ {
typedef Player super; typedef Player super;
public: public:
LocalPlayer(Minecraft* minecraft, Level* level, User* user, int dimension, bool isCreative); LocalPlayer(Minecraft* minecraft, Level* level, const std::string& username, int dimension, bool isCreative);
~LocalPlayer(); ~LocalPlayer();
void _init(); void _init();

View File

@@ -50,10 +50,8 @@ void KeyboardInput::tick( Player* player )
ya *= 0.3f; ya *= 0.3f;
} }
#if defined(RPI) || defined(PLATFORM_DESKTOP) wantUp = jumping;
wantUp = jumping; wantDown = sneaking;
wantDown = sneaking;
#endif
if (keys[KEY_CRAFT]) if (keys[KEY_CRAFT])
player->startCrafting((int)player->x, (int)player->y, (int)player->z, Recipe::SIZE_2X2); player->startCrafting((int)player->x, (int)player->y, (int)player->z, Recipe::SIZE_2X2);

View File

@@ -4,6 +4,8 @@
//package net.minecraft.client.player; //package net.minecraft.client.player;
#include "KeyboardInput.h" #include "KeyboardInput.h"
#include "platform/input/Controller.h"
#include "world/entity/player/Player.h"
// @note: This is just copy-pasted from KeyboardInput right now. // @note: This is just copy-pasted from KeyboardInput right now.
class XperiaPlayInput: public KeyboardInput class XperiaPlayInput: public KeyboardInput

View File

@@ -426,9 +426,7 @@ public:
virtual void onConfigChanged(const Config& c) { virtual void onConfigChanged(const Config& c) {
_move.onConfigChanged(c); _move.onConfigChanged(c);
_turnBuild.moveArea = _move.getRectangleArea(); _turnBuild.moveArea = _move.getRectangleArea();
#ifdef __APPLE__
_turnBuild.pauseArea = _move.getPauseRectangleArea(); _turnBuild.pauseArea = _move.getPauseRectangleArea();
#endif
_turnBuild.inventoryArea = _mc->gui.getRectangleArea( _mc->options.getBooleanValue(OPTIONS_IS_LEFT_HANDED)? 1 : -1 ); _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); _turnBuild.setSensitivity(c.options->getBooleanValue(OPTIONS_IS_JOY_TOUCH_AREA)? 1.8f : 1.0f);
((ITurnInput*)&_turnBuild)->onConfigChanged(c); ((ITurnInput*)&_turnBuild)->onConfigChanged(c);

View File

@@ -9,7 +9,10 @@
#include "../../../../platform/log.h" #include "../../../../platform/log.h"
#include "../../../renderer/Textures.h" #include "../../../renderer/Textures.h"
#include "../../../sound/SoundEngine.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_FIRST = 100;
static const int AREA_DPAD_N = 100; static const int AREA_DPAD_N = 100;
static const int AREA_DPAD_S = 101; static const int AREA_DPAD_S = 101;
@@ -17,6 +20,7 @@ static const int AREA_DPAD_W = 102;
static const int AREA_DPAD_E = 103; static const int AREA_DPAD_E = 103;
static const int AREA_DPAD_C = 104; static const int AREA_DPAD_C = 104;
static const int AREA_PAUSE = 105; static const int AREA_PAUSE = 105;
static const int AREA_CHAT = 106;
static int cPressed = 0; static int cPressed = 0;
static int cReleased = 0; static int cReleased = 0;
@@ -126,8 +130,8 @@ void TouchscreenInput_TestFps::onConfigChanged(const Config& c) {
// If too large (like playing on Tablet) // If too large (like playing on Tablet)
PixelCalc& pc = _minecraft->pixelCalc; PixelCalc& pc = _minecraft->pixelCalc;
if (pc.pixelsToMillimeters(Bw) > 14) { if (pc.pixelsToMillimeters(Bw) > 200) { //14
Bw = Bh = pc.millimetersToPixels(14); Bw = Bh = pc.millimetersToPixels(200); //14
} }
// temp data // temp data
float xx; float xx;
@@ -158,14 +162,11 @@ void TouchscreenInput_TestFps::onConfigChanged(const Config& c) {
xx = BaseX + 2 * Bw; yy = BaseY + Bh; xx = BaseX + 2 * Bw; yy = BaseY + Bh;
_model.addArea(AREA_DPAD_E, aRight = new RectangleArea(xx, yy, xx+Bw, yy+Bh)); _model.addArea(AREA_DPAD_E, aRight = new RectangleArea(xx, yy, xx+Bw, yy+Bh));
#ifdef __APPLE__
float maxPixels = _minecraft->pixelCalc.millimetersToPixels(10); float maxPixels = _minecraft->pixelCalc.millimetersToPixels(10);
float btnSize = Mth::Min(18 * Gui::GuiScale, maxPixels); // float btnSize = Mth::Min(18 * Gui::GuiScale, maxPixels);
_model.addArea(AREA_PAUSE, aPause = new RectangleArea(w - 4 - btnSize, float btnSize = pc.millimetersToPixels(18 * Gui::GuiScale);
4, _model.addArea(AREA_PAUSE, aPause = new RectangleArea(w - 4 - btnSize, 4, w - 4, 4 + btnSize));
w - 4, _model.addArea(AREA_CHAT, aChat = new RectangleArea(w - 8 - btnSize * 2, 4, w - 8 - btnSize, 4 + btnSize));
4 + btnSize));
#endif /* __APPLE__ */
//rebuild(); //rebuild();
} }
@@ -309,14 +310,20 @@ void TouchscreenInput_TestFps::tick( Player* player )
setButton = true; setButton = true;
xa -= 1; xa -= 1;
} }
#ifdef __APPLE__
else if (areaId == AREA_PAUSE) { else if (areaId == AREA_PAUSE) {
if (Multitouch::isReleased(p)) { if (Multitouch::isReleased(p)) {
_minecraft->soundEngine->playUI("random.click", 1, 1); _minecraft->soundEngine->playUI("random.click", 1, 1);
_minecraft->screenChooser.setScreen(SCREEN_PAUSE); _minecraft->screenChooser.setScreen(SCREEN_PAUSE);
} }
} }
#endif /*__APPLE__*/ else if (areaId == AREA_CHAT) {
if (Multitouch::isReleased(p)) {
_minecraft->soundEngine->playUI("random.click", 1, 1);
_minecraft->screenChooser.setScreen(SCREEN_CONSOLE);
_minecraft->platform()->showKeyboard();
}
}
_buttons[areaId - AREA_DPAD_FIRST] = setButton; _buttons[areaId - AREA_DPAD_FIRST] = setButton;
} }
@@ -499,15 +506,14 @@ void TouchscreenInput_TestFps::rebuild() {
drawRectangleArea(t, aJump, imageU + imageSize * 4, imageV, (float)imageSize); drawRectangleArea(t, aJump, imageU + imageSize * 4, imageV, (float)imageSize);
} }
#ifdef __APPLE__
if (!_minecraft->screen) { if (!_minecraft->screen) {
if (isButtonDown(AREA_PAUSE)) t.colorABGR(cPressedPause); t.colorABGR(0xFFFFFFFF);
else t.colorABGR(cReleasedPause); // if (isButtonDown(AREA_PAUSE)) t.colorABGR(cPressedPause);
// else t.colorABGR(cReleasedPause);
drawRectangleArea(t, aPause, 200, 64, 18.0f); drawRectangleArea(t, aPause, 200, 64, 18.0f);
drawRectangleArea(t, aChat, 200, 82, 18.0f);
} }
#endif /*__APPLE__*/
//t.end(true, _bufferId); //t.end(true, _bufferId);
//return; //return;

View File

@@ -61,6 +61,7 @@ private:
RectangleArea* aUp; RectangleArea* aUp;
RectangleArea* aDown; RectangleArea* aDown;
RectangleArea* aPause; RectangleArea* aPause;
RectangleArea* aChat;
//RectangleArea* aUpJump; //RectangleArea* aUpJump;
RectangleArea* aJump; RectangleArea* aJump;
RectangleArea* aUpLeft; RectangleArea* aUpLeft;

View File

@@ -7,6 +7,10 @@
#include "../../world/level/Region.h" #include "../../world/level/Region.h"
#include "../../world/level/chunk/LevelChunk.h" #include "../../world/level/chunk/LevelChunk.h"
#include "../../util/Mth.h" #include "../../util/Mth.h"
#include "../../world/level/biome/BiomeSource.h"
#include "../../world/level/Level.h"
//#include "../../platform/time.h" //#include "../../platform/time.h"
/*static*/ int Chunk::updates = 0; /*static*/ int Chunk::updates = 0;
@@ -259,4 +263,4 @@ void Chunk::resetUpdates()
{ {
updates = 0; updates = 0;
//swRebuild.reset(); //swRebuild.reset();
} }

View File

@@ -1,4 +1,5 @@
#include "GameRenderer.h" #include "GameRenderer.h"
#include "client/Options.h"
#include "gles.h" #include "gles.h"
#include "../../util/PerfTimer.h" #include "../../util/PerfTimer.h"
@@ -152,7 +153,7 @@ void GameRenderer::render(float a) {
int xMouse = (int)(Mouse::getX() * Gui::InvGuiScale); int xMouse = (int)(Mouse::getX() * Gui::InvGuiScale);
int yMouse = (int)(Mouse::getY() * Gui::InvGuiScale); int yMouse = (int)(Mouse::getY() * Gui::InvGuiScale);
#ifndef PLATFORM_DESKTOP
if (mc->useTouchscreen()) { if (mc->useTouchscreen()) {
const int pid = Multitouch::getFirstActivePointerIdExThisUpdate(); const int pid = Multitouch::getFirstActivePointerIdExThisUpdate();
if (pid >= 0) { if (pid >= 0) {
@@ -163,7 +164,6 @@ void GameRenderer::render(float a) {
yMouse = -9999; yMouse = -9999;
} }
} }
#endif
TIMER_POP(); TIMER_POP();
bool hasClearedColorBuffer = false; bool hasClearedColorBuffer = false;
@@ -214,12 +214,14 @@ void GameRenderer::render(float a) {
glDisable2(GL_SCISSOR_TEST); glDisable2(GL_SCISSOR_TEST);
mc->screen->render(xMouse, yMouse, a); mc->screen->render(xMouse, yMouse, a);
#ifdef RPI
mc->platform()->hideCursor(!mc->options.getBooleanValue(OPTIONS_RPI_CURSOR));
if (mc->options.getBooleanValue(OPTIONS_RPI_CURSOR))
renderCursor(xMouse, yMouse, mc); renderCursor(xMouse, yMouse, mc);
#endif
// Screen might have been removed, so check it again // Screen might have been removed, so check it again
if (mc->screen && !mc->screen->isInGameScreen()) if (mc->screen && !mc->screen->isInGameScreen())
sleepMs(15); sleepMs(15);
} }
} }
@@ -358,9 +360,9 @@ void GameRenderer::renderLevel(float a) {
if (mc->hitResult.isHit() && !cameraEntity->isUnderLiquid(Material::water)) { if (mc->hitResult.isHit() && !cameraEntity->isUnderLiquid(Material::water)) {
TIMER_POP_PUSH("select"); TIMER_POP_PUSH("select");
Player* player = (Player*) cameraEntity; Player* player = (Player*) cameraEntity;
if (mc->useTouchscreen()) { // if (mc->useTouchscreen()) {
levelRenderer->renderHitSelect(player, mc->hitResult, 0, NULL, a); //player.inventory->getSelected(), a); levelRenderer->renderHitSelect(player, mc->hitResult, 0, NULL, a); //player.inventory->getSelected(), a);
} // }
levelRenderer->renderHit(player, mc->hitResult, 0, NULL, a);//player->inventory.getSelected(), a); levelRenderer->renderHit(player, mc->hitResult, 0, NULL, a);//player->inventory.getSelected(), a);
} }
} }
@@ -654,11 +656,9 @@ void GameRenderer::pick(float a) {
float range = mc->gameMode->getPickRange(); float range = mc->gameMode->getPickRange();
bool isPicking = true; bool isPicking = true;
#ifndef PLATFORM_DESKTOP
bool freeform = mc->useTouchscreen() && !mc->options.isJoyTouchArea; bool freeform = mc->useTouchscreen(); //&& !mc->options.getBooleanValue(OPTIONS_IS_JOY_TOUCH_AREA);
#else
bool freeform = false;
#endif
if (freeform) { if (freeform) {
isPicking = updateFreeformPickDirection(a, pickDirection); isPicking = updateFreeformPickDirection(a, pickDirection);
} else { } else {

View File

@@ -25,6 +25,8 @@
#include "../../client/player/LocalPlayer.h" #include "../../client/player/LocalPlayer.h"
#include "../../world/level/GrassColor.h"
#ifdef GFX_SMALLER_CHUNKS #ifdef GFX_SMALLER_CHUNKS
/* static */ const int LevelRenderer::CHUNK_SIZE = 8; /* static */ const int LevelRenderer::CHUNK_SIZE = 8;
#else #else
@@ -143,6 +145,10 @@ void LevelRenderer::setLevel( Level* level )
level->addListener(this); level->addListener(this);
allChanged(); allChanged();
} }
if (mc->options.getBooleanValue(OPTIONS_AMBIENT_OCCLUSION)) {
mc->useAmbientOcclusion = !mc->useAmbientOcclusion;
allChanged();
}
} }
void LevelRenderer::allChanged() void LevelRenderer::allChanged()
@@ -155,6 +161,11 @@ void LevelRenderer::allChanged()
Tile::leaves_carried->setFancy(fancy); Tile::leaves_carried->setFancy(fancy);
lastViewDistance = mc->options.getIntValue(OPTIONS_VIEW_DISTANCE); 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); int dist = (512 >> 3) << (3 - lastViewDistance);
if (lastViewDistance <= 2 && mc->isPowerVR()) if (lastViewDistance <= 2 && mc->isPowerVR())
dist = (int)((float)dist * 0.8f); dist = (int)((float)dist * 0.8f);

View File

@@ -79,6 +79,9 @@ RenderChunk Tesselator::end( bool useMine, int bufferId )
const int o_vertices = vertices; const int o_vertices = vertices;
if (vertices > 0) { if (vertices > 0) {
if (p <= 0 || p > maxVertices) { clear(); return RenderChunk(); }
int bytes = p * sizeof(VERTEX);
if (bytes <= 0) return RenderChunk();
if (++vboId >= vboCounts) if (++vboId >= vboCounts)
vboId = 0; vboId = 0;
@@ -92,11 +95,11 @@ RenderChunk Tesselator::end( bool useMine, int bufferId )
bufferId = vboIds[vboId]; bufferId = vboIds[vboId];
#endif #endif
int access = GL_STATIC_DRAW;//(accessMode==ACCESS_DYNAMIC) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; int access = GL_STATIC_DRAW;//(accessMode==ACCESS_DYNAMIC) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW;
int bytes = p * sizeof(VERTEX);
glBindBuffer2(GL_ARRAY_BUFFER, bufferId); glBindBuffer2(GL_ARRAY_BUFFER, bufferId);
glBufferData2(GL_ARRAY_BUFFER, bytes, _varray, access); // GL_STREAM_DRAW glBufferData2(GL_ARRAY_BUFFER, bytes, _varray, access); // GL_STREAM_DRAW
totalSize += bytes; totalSize += bytes;
#ifndef USE_VBO #ifndef USE_VBO
// 0 1 2 3 4 5 6 7 // 0 1 2 3 4 5 6 7
// x y z u v c // x y z u v c
@@ -264,6 +267,7 @@ void Tesselator::vertex( float x, float y, float z )
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
const int offs = 3 - i; const int offs = 3 - i;
if (p - offs < 0 || p >= maxVertices) { clear(); return; }
VERTEX& src = _varray[p - offs]; VERTEX& src = _varray[p - offs];
VERTEX& dst = _varray[p]; VERTEX& dst = _varray[p];
@@ -287,6 +291,7 @@ void Tesselator::vertex( float x, float y, float z )
} }
} }
if (p < 0 || p >= maxVertices) { clear(); return; }
VERTEX& vertex = _varray[p]; VERTEX& vertex = _varray[p];
if (hasTexture) { if (hasTexture) {
@@ -377,13 +382,15 @@ void Tesselator::draw()
tesselating = false; tesselating = false;
if (vertices > 0) { if (vertices > 0) {
if (p <= 0 || p > maxVertices) { clear(); return; }
int bytes = p * sizeof(VERTEX);
if (bytes <= 0) { clear(); return; }
if (++vboId >= vboCounts) if (++vboId >= vboCounts)
vboId = 0; vboId = 0;
int bufferId = vboIds[vboId]; int bufferId = vboIds[vboId];
int access = GL_DYNAMIC_DRAW;//(accessMode==ACCESS_DYNAMIC) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; int access = GL_DYNAMIC_DRAW;//(accessMode==ACCESS_DYNAMIC) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW;
int bytes = p * sizeof(VERTEX);
glBindBuffer2(GL_ARRAY_BUFFER, bufferId); glBindBuffer2(GL_ARRAY_BUFFER, bufferId);
glBufferData2(GL_ARRAY_BUFFER, bytes, _varray, access); // GL_STREAM_DRAW glBufferData2(GL_ARRAY_BUFFER, bytes, _varray, access); // GL_STREAM_DRAW

View File

@@ -249,6 +249,37 @@ int Textures::crispBlend( int c0, int c1 )
return (a << 24) | (r << 16) | (g << 8) | b; 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) { ///*public*/ int loadHttpTexture(std::string url, std::string backup) {
// HttpTexture texture = httpTextures.get(url); // HttpTexture texture = httpTextures.get(url);
// if (texture != NULL) { // if (texture != NULL) {

View File

@@ -44,6 +44,8 @@ public:
TextureId assignTexture(const std::string& resourceName, const TextureData& img); TextureId assignTexture(const std::string& resourceName, const TextureData& img);
const TextureData* getTemporaryTextureData(TextureId id); const TextureData* getTemporaryTextureData(TextureId id);
int* loadTexturePixels(TextureId texId, const std::string& resourceName);
void tick(bool uploadToGraphicsCard); void tick(bool uploadToGraphicsCard);
void clear(); void clear();

View File

@@ -13,6 +13,7 @@
#include "../../world/level/tile/BedTile.h" #include "../../world/level/tile/BedTile.h"
#include "../../world/level/tile/StemTile.h" #include "../../world/level/tile/StemTile.h"
#include "../../world/level/tile/StairTile.h" #include "../../world/level/tile/StairTile.h"
#include "../../world/level/tile/FireTile.h"
#include "../../world/Direction.h" #include "../../world/Direction.h"
#include "../../world/Facing.h" #include "../../world/Facing.h"
#include "tileentity/TileEntityRenderer.h" #include "tileentity/TileEntityRenderer.h"
@@ -157,8 +158,8 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z )
return tesselateRowInWorld(tt, x, y, z); return tesselateRowInWorld(tt, x, y, z);
} else if (shape == Tile::SHAPE_TORCH) { } else if (shape == Tile::SHAPE_TORCH) {
return tesselateTorchInWorld(tt, x, y, z); return tesselateTorchInWorld(tt, x, y, z);
//} else if (shape == Tile::SHAPE_FIRE) { } else if (shape == Tile::SHAPE_FIRE) {
// return tesselateFireInWorld(tt, x, y, z); return tesselateFireInWorld(tt, x, y, z);
//} else if (shape == Tile::SHAPE_RED_DUST) { //} else if (shape == Tile::SHAPE_RED_DUST) {
// return tesselateDustInWorld(tt, x, y, z); // return tesselateDustInWorld(tt, x, y, z);
} else if (shape == Tile::SHAPE_LADDER) { } else if (shape == Tile::SHAPE_LADDER) {
@@ -222,6 +223,278 @@ bool TileRenderer::tesselateTorchInWorld( Tile* tt, int x, int y, int z )
return true; 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 ) bool TileRenderer::tesselateLadderInWorld( Tile* tt, int x, int y, int z )
{ {
Tesselator& t = Tesselator::instance; Tesselator& t = Tesselator::instance;

View File

@@ -34,6 +34,8 @@ public:
bool tesselateFenceGateInWorld(FenceGateTile* tt, int x, int y, int z); bool tesselateFenceGateInWorld(FenceGateTile* tt, int x, int y, int z);
bool tesselateBedInWorld(Tile *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 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 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); void tesselateCrossTexture(Tile* tt, int data, float x, float y, float z);

View File

@@ -19,12 +19,13 @@ public:
protected: protected:
void additionalRendering(Mob* mob, float a); void additionalRendering(Mob* mob, float a);
private:
HumanoidModel* humanoidModel; HumanoidModel* humanoidModel;
// Last rotation values for cape smoothing (reduces jitter) // Last rotation values for cape smoothing (reduces jitter)
float lastCapeXRot; float lastCapeXRot;
float lastCapeZRot; float lastCapeZRot;
private:
// i guess ill keep this just in case seomthing breaks
}; };
#endif /*NET_MINECRAFT_CLIENT_RENDERER_ENTITY__HumanoidMobRenderer_H__*/ #endif /*NET_MINECRAFT_CLIENT_RENDERER_ENTITY__HumanoidMobRenderer_H__*/

Some files were not shown because too many files have changed in this diff Show More