21 Commits

Author SHA1 Message Date
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
31 changed files with 385 additions and 388 deletions

View File

@@ -18,7 +18,7 @@ permissions:
jobs: jobs:
build-windows: build-windows:
name: Windows Build name: Build Windows
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
@@ -68,13 +68,12 @@ jobs:
name: mcpe-windows name: mcpe-windows
path: | path: |
${{github.workspace}}/build/MinecraftPE.exe ${{github.workspace}}/build/MinecraftPE.exe
${{github.workspace}}/build/glfw3.dll
${{github.workspace}}/build/libpng16.dll ${{github.workspace}}/build/libpng16.dll
${{github.workspace}}/build/OpenAL32.dll ${{github.workspace}}/build/OpenAL32.dll
${{github.workspace}}/build/z.dll ${{github.workspace}}/build/libz.dll
build-linux: build-linux:
name: Linux Build name: Build Linux
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@@ -120,7 +119,7 @@ jobs:
${{github.workspace}}/build/MinecraftPE-server ${{github.workspace}}/build/MinecraftPE-server
build-android: # pray to god build-android: # pray to god
name: Build Android APK (${{ matrix.abi }}) name: Build Android (${{ matrix.abi }})
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
@@ -215,10 +214,59 @@ jobs:
name: minecraftpe-apk-${{ matrix.abi }} name: minecraftpe-apk-${{ matrix.abi }}
path: ${{ github.workspace }}/build-apk/minecraftpe-*-debug.apk 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: publish:
name: Publish name: Publish
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [ build-windows, build-linux, build-android ] needs: [ build-windows, build-linux, build-android, build-web ]
if: github.ref == 'refs/heads/main' if: github.ref == 'refs/heads/main'
steps: steps:
- name: Checkout - name: Checkout
@@ -236,13 +284,13 @@ jobs:
- name: Zip Windows Artifacts - name: Zip Windows Artifacts
uses: vimtor/action-zip@v1.2 uses: vimtor/action-zip@v1.2
with: with:
files: data mcpe-windows/MinecraftPE.exe mcpe-windows/glfw3.dll mcpe-windows/libpng16.dll mcpe-windows/OpenAL32.dll mcpe-windows/z.dll 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 dest: minecraftpe-${{ steps.ref.outputs.hash }}-windows.zip
- name: Zip Linux Artifacts - name: Zip Linux Artifacts
uses: vimtor/action-zip@v1.2 uses: vimtor/action-zip@v1.2
with: with:
files: data mcpe-linux/MinecraftPE files: mcpe-linux/MinecraftPE
dest: minecraftpe-${{ steps.ref.outputs.hash }}-linux.zip dest: minecraftpe-${{ steps.ref.outputs.hash }}-linux.zip
- name: Zip Linux Server Artifacts - name: Zip Linux Server Artifacts
@@ -263,6 +311,19 @@ jobs:
files: minecraftpe-apk-armeabi-v7a/minecraftpe-v7a-debug.apk files: minecraftpe-apk-armeabi-v7a/minecraftpe-v7a-debug.apk
dest: minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.zip 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 - name: Update Development Release
uses: andelf/nightly-release@main uses: andelf/nightly-release@main
env: env:
@@ -273,8 +334,10 @@ jobs:
body: | body: |
MinecraftPE development release for commit ${{ github.sha }}. MinecraftPE development release for commit ${{ github.sha }}.
files: | files: |
./data.zip
./minecraftpe-${{ steps.ref.outputs.hash }}-windows.zip ./minecraftpe-${{ steps.ref.outputs.hash }}-windows.zip
./minecraftpe-${{ steps.ref.outputs.hash }}-linux.zip ./minecraftpe-${{ steps.ref.outputs.hash }}-linux.zip
./minecraftpe-server-${{ steps.ref.outputs.hash }}.zip ./minecraftpe-server-${{ steps.ref.outputs.hash }}.zip
./minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.zip ./minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.zip
./minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.zip ./minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.zip
./minecraftpe-${{ steps.ref.outputs.hash }}-web.zip

View File

@@ -7,10 +7,6 @@ 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")
endif()
include(cmake/EnumOption.cmake) include(cmake/EnumOption.cmake)
if(EMSCRIPTEN) if(EMSCRIPTEN)
@@ -26,6 +22,14 @@ find_package(OpenSSL)
if (${PLATFORM} STREQUAL "Desktop") if (${PLATFORM} STREQUAL "Desktop")
set(PLATFORM_CPP "PLATFORM_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) if (WIN32)
add_definitions(-D_CRT_SECURE_NO_WARNINGS) add_definitions(-D_CRT_SECURE_NO_WARNINGS)
include_directories(misc/windows) include_directories(misc/windows)
@@ -52,6 +56,7 @@ if(${PLATFORM} MATCHES "Web")
add_library(png INTERFACE IMPORTED) add_library(png INTERFACE IMPORTED)
set_target_properties(png PROPERTIES set_target_properties(png PROPERTIES
INTERFACE_COMPILE_OPTIONS "-sUSE_LIBPNG=1"
INTERFACE_LINK_OPTIONS "-sUSE_LIBPNG=1" INTERFACE_LINK_OPTIONS "-sUSE_LIBPNG=1"
) )
@@ -102,6 +107,8 @@ CPMAddPackage(
"ALSOFT_UTILS OFF" "ALSOFT_UTILS OFF"
"LIBTYPE ${AL_LIBTYPE}" "LIBTYPE ${AL_LIBTYPE}"
"ALSOFT_ENABLE_MODULES OFF" "ALSOFT_ENABLE_MODULES OFF"
"ALSOFT_STATIC_STDCXX ON"
"ALSOFT_STATIC_LIBGCC ON"
) )
# TODO: Clear this paths with * # TODO: Clear this paths with *
@@ -321,11 +328,11 @@ target_include_directories(${PROJECT_NAME} PUBLIC
if(${PLATFORM} MATCHES "Web") if(${PLATFORM} MATCHES "Web")
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD 11)
# uuuh i hate it # uuuh i hate it
set(EM_FLAGS "-pthread -sUSE_PTHREADS=1 -sSHARED_MEMORY=1") set(EM_FLAGS "-pthread -sUSE_PTHREADS=1 -sUSE_LIBPNG=1 -sSHARED_MEMORY=1")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EM_FLAGS}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EM_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_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 -sPROXY_TO_PTHREAD") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EM_FLAGS} --preload-file ${CMAKE_SOURCE_DIR}/data@/data")
target_compile_options(${PROJECT_NAME} PUBLIC target_compile_options(${PROJECT_NAME} PUBLIC
"-Os" "-Os"

View File

@@ -153,7 +153,7 @@ options.group.tweaks=Tweaks
options.allowSprint=Allow sprint options.allowSprint=Allow sprint
options.barOnTop=HUD above inventory options.barOnTop=HUD above inventory
options.rpiCursor=Show Raspberry PI cursor options.rpiCursor=Show Raspberry PI cursor
options.autojump=Auto Jump 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

View File

@@ -1,143 +1,46 @@
<!doctype html> <!DOCTYPE html>
<html lang="en-us"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>MCPE 0.6.1</title>
<title>Emscripten-Generated Code</title>
<style> <style>
.emscripten { padding-right: 0; margin-left: auto; margin-right: auto; display: block; } html, body {
textarea.emscripten { font-family: monospace; width: 80%; } margin: 0;
div.emscripten { text-align: center; } padding: 0;
div.emscripten_border { border: 1px solid black; } height: 100%;
/* the canvas *must not* have any border or padding, or mouse coords will be wrong */ background: black;
canvas.emscripten { border: 0px none; background-color: black; } overflow: hidden;
.spinner {
height: 50px;
width: 50px;
margin: 0px auto;
-webkit-animation: rotation .8s linear infinite;
-moz-animation: rotation .8s linear infinite;
-o-animation: rotation .8s linear infinite;
animation: rotation 0.8s linear infinite;
border-left: 10px solid rgb(0,150,240);
border-right: 10px solid rgb(0,150,240);
border-bottom: 10px solid rgb(0,150,240);
border-top: 10px solid rgb(100,0,200);
border-radius: 100%;
background-color: rgb(200,100,250);
}
@-webkit-keyframes rotation {
from {-webkit-transform: rotate(0deg);}
to {-webkit-transform: rotate(360deg);}
}
@-moz-keyframes rotation {
from {-moz-transform: rotate(0deg);}
to {-moz-transform: rotate(360deg);}
}
@-o-keyframes rotation {
from {-o-transform: rotate(0deg);}
to {-o-transform: rotate(360deg);}
}
@keyframes rotation {
from {transform: rotate(0deg);}
to {transform: rotate(360deg);}
} }
#canvas {
width: 100vw;
height: 100vh;
display: block;
}
</style> </style>
</head> </head>
<body> <body>
<hr/>
<figure style="overflow:visible;" id="spinner"><div class="spinner"></div><center style="margin-top:0.5em"><strong>emscripten</strong></center></figure>
<div class="emscripten" id="status">Downloading...</div>
<div class="emscripten">
<progress value="0" max="100" id="progress" hidden=1></progress>
</div>
<div class="emscripten_border">
<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()" tabindex=-1></canvas>
</div>
<hr/>
<div class="emscripten">
<input type="checkbox" id="resize">Resize canvas
<input type="checkbox" id="pointerLock" checked>Lock/hide mouse pointer
&nbsp;&nbsp;&nbsp;
<input type="button" value="Fullscreen" onclick="Module.requestFullscreen(document.getElementById('pointerLock').checked,
document.getElementById('resize').checked)">
</div>
<hr/> <canvas id="canvas"></canvas>
<textarea class="emscripten" id="output" rows="8"></textarea>
<hr>
<script type='text/javascript'>
var statusElement = document.getElementById('status');
var progressElement = document.getElementById('progress');
var spinnerElement = document.getElementById('spinner');
var canvasElement = document.getElementById('canvas');
var outputElement = document.getElementById('output');
if (outputElement) outputElement.value = ''; // clear browser cache
// As a default initial behavior, pop up an alert when webgl context is lost. To make your
// application robust, you may want to override this behavior before shipping!
// See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
canvasElement.addEventListener("webglcontextlost", (e) => {
alert('WebGL context lost. You will need to reload the page.');
e.preventDefault();
}, false);
function setStatus(text) {
if (!setStatus.last) setStatus.last = { time: Date.now(), text: '' };
if (text === setStatus.last.text) return;
var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/);
var now = Date.now();
if (m && now - setStatus.last.time < 30) return; // if this is a progress update, skip it if too soon
setStatus.last.time = now;
setStatus.last.text = text;
if (m) {
text = m[1];
progressElement.value = parseInt(m[2])*100;
progressElement.max = parseInt(m[4])*100;
progressElement.hidden = false;
spinnerElement.hidden = false;
} else {
progressElement.value = null;
progressElement.max = null;
progressElement.hidden = true;
if (!text) spinnerElement.hidden = true;
}
statusElement.innerHTML = text;
}
<script>
var Module = { var Module = {
print(...args) { canvas: document.getElementById('canvas'),
// These replacements are necessary if you render to raw HTML onRuntimeInitialized: function () { resizeCanvas() }
//text = text.replace(/&/g, "&amp;"); };
//text = text.replace(/</g, "&lt;");
//text = text.replace(/>/g, "&gt;"); function resizeCanvas() {
//text = text.replace('\n', '<br>', 'g'); const canvas = Module.canvas;
console.log(...args); canvas.width = window.innerWidth;
if (outputElement) { canvas.height = window.innerHeight;
var text = args.join(' ');
outputElement.value += text + "\n";
outputElement.scrollTop = outputElement.scrollHeight; // focus on bottom
} }
},
canvas: canvasElement, window.addEventListener('resize', resizeCanvas);
setStatus: setStatus, window.addEventListener('onunload', () => {
totalDependencies: 0, FS.syncfs(true, function (err) { console.log('Sync FS failed: ' + err) });
monitorRunDependencies(left) { })
this.totalDependencies = Math.max(this.totalDependencies, left); </script>
setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
} <script src="MinecraftPE.js"></script>
}; </body>
setStatus('Downloading...');
window.onerror = () => {
setStatus('Exception thrown, see JavaScript console');
spinnerElement.style.display = 'none';
setStatus = (text) => {
if (text) console.error('[post-exception status] ' + text);
};
};
</script>
<script src="MinecraftPE.js"></script>
</body>
</html> </html>

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);
} }
@@ -102,12 +106,31 @@ public:
return std::string(mbstr); return std::string(mbstr);
} }
virtual int getScreenWidth() override { return 854; }; virtual int getScreenWidth() override {
virtual int getScreenHeight() override { return 480; }; #ifdef __EMSCRIPTEN__
int w, h;
emscripten_get_canvas_element_size("canvas", &w, &h);
return w;
#endif
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 float getPixelsPerMillimeter() override;
virtual bool supportsTouchscreen() override { return true; } virtual bool supportsTouchscreen() override { return false; /* glfw supports only mouse and keyboard */ }
virtual void hideCursor(bool hide) override { virtual void hideCursor(bool hide) override {
int isHide = hide ? GLFW_CURSOR_NORMAL : GLFW_CURSOR_HIDDEN; int isHide = hide ? GLFW_CURSOR_NORMAL : GLFW_CURSOR_HIDDEN;
@@ -120,6 +143,8 @@ 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
} }

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"
@@ -640,13 +641,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 +659,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,7 +688,6 @@ 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;
@@ -714,8 +710,7 @@ void Minecraft::tickInput() {
} }
#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);
} }
@@ -831,15 +826,9 @@ void Minecraft::tickInput() {
} }
} }
#endif #endif
#endif
#ifndef PLATFORM_DESKTOP
if (key == 82)
pauseGame(false);
#else
if (key == Keyboard::KEY_ESCAPE) if (key == Keyboard::KEY_ESCAPE)
pauseGame(false); pauseGame(false);
#endif
#ifndef OPENGL_ES #ifndef OPENGL_ES
if (key == Keyboard::KEY_P) { if (key == Keyboard::KEY_P) {
@@ -866,11 +855,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
@@ -1112,7 +1108,7 @@ bool Minecraft::useTouchscreen() {
#ifdef RPI #ifdef 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;
@@ -1228,7 +1224,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");
@@ -1242,11 +1237,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 {
@@ -1571,6 +1562,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

@@ -109,6 +109,8 @@ public:
bool isLevelGenerated(); bool isLevelGenerated();
void handleMouseDown(int button, bool down);
void audioEngineOn(); void audioEngineOn();
void audioEngineOff(); void audioEngineOff();

View File

@@ -5,7 +5,7 @@
#include <SDL/SDL.h> #include <SDL/SDL.h>
#endif #endif
#ifdef PLATFORM_DESKTOP #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_DESKTOP #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_DESKTOP #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

@@ -16,6 +16,8 @@ OptionsFile::OptionsFile() {
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

View File

@@ -51,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);
@@ -75,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;
@@ -206,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;
} }
@@ -349,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) {
@@ -537,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());
@@ -1083,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);
@@ -1097,9 +1079,10 @@ void Gui::renderToolBar( float a, int ySlot, const int screenWidth ) {
} }
_inventoryNeedsUpdate = false; _inventoryNeedsUpdate = false;
#ifndef PLATFORM_DESKTOP
if (_openInventorySlot) {
blit(screenWidth / 2 + 10 * getNumSlots() - 20 + 4, ySlot + 6, 242, 252, 14, 4, 14, 4); blit(screenWidth / 2 + 10 * getNumSlots() - 20 + 4, ySlot + 6, 242, 252, 14, 4, 14, 4);
#endif }
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

@@ -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

@@ -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

@@ -19,7 +19,6 @@ OptionsScreen::OptionsScreen()
} }
OptionsScreen::~OptionsScreen() { OptionsScreen::~OptionsScreen() {
if (btnClose != NULL) { if (btnClose != NULL) {
delete btnClose; delete btnClose;
btnClose = NULL; btnClose = NULL;
@@ -53,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, "");
@@ -89,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;
@@ -134,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;
@@ -150,11 +146,14 @@ 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();
if (minecraft->screen != NULL) {
minecraft->setScreen(NULL);
} else {
minecraft->screenChooser.setScreen(SCREEN_STARTMENU); minecraft->screenChooser.setScreen(SCREEN_STARTMENU);
} }
}
else if (button->id > 1 && button->id < 7) { 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);
@@ -165,7 +164,6 @@ void OptionsScreen::buttonClicked(Button* button) {
} }
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) {
@@ -209,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);
@@ -230,7 +229,6 @@ void OptionsScreen::generateOptionScreens() {
} }
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);
@@ -238,7 +236,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);

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

@@ -21,7 +21,7 @@ Screen* ScreenChooser::createScreen( ScreenId id )
Screen* screen = NULL; Screen* screen = NULL;
// :sob: // :sob:
if (_mc->useTouchscreen()) { 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;

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

@@ -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

@@ -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

@@ -164,7 +164,7 @@ void TouchscreenInput_TestFps::onConfigChanged(const Config& c) {
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);
float btnSize = pc.millimetersToPixels(50); float btnSize = pc.millimetersToPixels(18 * Gui::GuiScale);
_model.addArea(AREA_PAUSE, aPause = new RectangleArea(w - 4 - btnSize, 4, w - 4, 4 + btnSize)); _model.addArea(AREA_PAUSE, aPause = new RectangleArea(w - 4 - btnSize, 4, w - 4, 4 + btnSize));
_model.addArea(AREA_CHAT, aChat = new RectangleArea(w - 8 - btnSize * 2, 4, w - 8 - btnSize, 4 + btnSize)); _model.addArea(AREA_CHAT, aChat = new RectangleArea(w - 8 - btnSize * 2, 4, w - 8 - btnSize, 4 + btnSize));
@@ -320,6 +320,7 @@ void TouchscreenInput_TestFps::tick( Player* player )
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_CONSOLE); _minecraft->screenChooser.setScreen(SCREEN_CONSOLE);
_minecraft->platform()->showKeyboard();
} }
} }

View File

@@ -153,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) {
@@ -164,7 +164,6 @@ void GameRenderer::render(float a) {
yMouse = -9999; yMouse = -9999;
} }
} }
#endif
TIMER_POP(); TIMER_POP();
bool hasClearedColorBuffer = false; bool hasClearedColorBuffer = false;
@@ -361,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);
} }
} }
@@ -657,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.getBooleanValue(OPTIONS_IS_JOY_TOUCH_AREA); 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

@@ -17,8 +17,8 @@ PlayerRenderer::PlayerRenderer( HumanoidModel* humanoidModel, float shadow )
: super(humanoidModel, shadow), : super(humanoidModel, shadow),
playerModel64(humanoidModel), playerModel64(humanoidModel),
playerModel32(new HumanoidModel(0, 0, 64, 32)), playerModel32(new HumanoidModel(0, 0, 64, 32)),
armorParts1(new HumanoidModel(1.0f, 0, 64, 64)), armorParts1(new HumanoidModel(1.0f, 0, 64, 32)),
armorParts2(new HumanoidModel(0.5f, 0, 64, 64)) armorParts2(new HumanoidModel(0.5f, 0, 64, 32))
{ {
// default to legacy skin path until we know the exact texture size // default to legacy skin path until we know the exact texture size
model = playerModel32; model = playerModel32;
@@ -77,10 +77,10 @@ void PlayerRenderer::render(Entity* mob_, float x, float y, float z, float rot,
model = desired; model = desired;
humanoidModel = desired; humanoidModel = desired;
} }
// LOGI("[PlayerRenderer] %s: skin=%s, modelTex=%dx%d, desired=%s\n", LOGI("[PlayerRenderer] %s: skin=%s, modelTex=%dx%d, desired=%s\n",
// ((Player*)mob)->name.c_str(), mob->getTexture().c_str(), ((Player*)mob)->name.c_str(), mob->getTexture().c_str(),
// humanoidModel->texWidth, humanoidModel->texHeight, humanoidModel->texWidth, humanoidModel->texHeight,
// (desired == playerModel64 ? "64" : "32")); (desired == playerModel64 ? "64" : "32"));
HumanoidMobRenderer::render(mob_, x, y, z, rot, a); HumanoidMobRenderer::render(mob_, x, y, z, rot, a);
} }

View File

@@ -139,12 +139,14 @@ int main(void) {
#ifndef STANDALONE_SERVER #ifndef STANDALONE_SERVER
// Platform init. // Platform init.
appContext.platform = new AppPlatform_glfw(); appContext.platform = new AppPlatform_glfw();
#if defined(DEBUG) && defined(__EMSCRIPTEN__) #if defined(__EMSCRIPTEN__)
EM_ASM({ EM_ASM(
console.log(FS.readdir("/")); FS.mkdir('/games');
console.log(FS.readdir("/data")); FS.mkdir('/games/com.mojang');
console.log(FS.readdir("/data/images")); FS.mkdir('/games/com.mojang/minecraftWorlds');
}); FS.mount(IDBFS, {}, '/games');
FS.syncfs(true, function (err) {});
);
#endif #endif
glfwSetErrorCallback(error_callback); glfwSetErrorCallback(error_callback);