32 Commits

Author SHA1 Message Date
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
53 changed files with 2104 additions and 1214 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> html, body {
.emscripten { padding-right: 0; margin-left: auto; margin-right: auto; display: block; } margin: 0;
textarea.emscripten { font-family: monospace; width: 80%; } padding: 0;
div.emscripten { text-align: center; } height: 100%;
div.emscripten_border { border: 1px solid black; } background: black;
/* the canvas *must not* have any border or padding, or mouse coords will be wrong */ overflow: hidden;
canvas.emscripten { border: 0px none; background-color: black; } }
.spinner { #canvas {
height: 50px; width: 100vw;
width: 50px; height: 100vh;
margin: 0px auto; display: block;
-webkit-animation: rotation .8s linear infinite; }
-moz-animation: rotation .8s linear infinite; </style>
-o-animation: rotation .8s linear infinite; </head>
animation: rotation 0.8s linear infinite; <body>
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);}
}
</style> <canvas id="canvas"></canvas>
</head>
<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/> <script>
<textarea class="emscripten" id="output" rows="8"></textarea> var Module = {
<hr> canvas: document.getElementById('canvas'),
<script type='text/javascript'> onRuntimeInitialized: function () { resizeCanvas() }
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 function resizeCanvas() {
// application robust, you may want to override this behavior before shipping! const canvas = Module.canvas;
// See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2 canvas.width = window.innerWidth;
canvasElement.addEventListener("webglcontextlost", (e) => { canvas.height = window.innerHeight;
alert('WebGL context lost. You will need to reload the page.'); }
e.preventDefault();
}, false);
function setStatus(text) { window.addEventListener('resize', resizeCanvas);
if (!setStatus.last) setStatus.last = { time: Date.now(), text: '' }; window.addEventListener('onunload', () => {
if (text === setStatus.last.text) return; FS.syncfs(true, function (err) { console.log('Sync FS failed: ' + err) });
var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/); })
var now = Date.now(); </script>
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;
}
var Module = { <script src="MinecraftPE.js"></script>
print(...args) { </body>
// These replacements are necessary if you render to raw HTML
//text = text.replace(/&/g, "&amp;");
//text = text.replace(/</g, "&lt;");
//text = text.replace(/>/g, "&gt;");
//text = text.replace('\n', '<br>', 'g');
console.log(...args);
if (outputElement) {
var text = args.join(' ');
outputElement.value += text + "\n";
outputElement.scrollTop = outputElement.scrollHeight; // focus on bottom
}
},
canvas: canvasElement,
setStatus: setStatus,
totalDependencies: 0,
monitorRunDependencies(left) {
this.totalDependencies = Math.max(this.totalDependencies, left);
setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
}
};
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,155 +688,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 +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;
@@ -1129,6 +1125,7 @@ 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);
@@ -1228,7 +1225,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 +1238,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 +1563,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

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

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

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

@@ -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");
@@ -39,6 +40,7 @@ void CreditsScreen::init() {
_lines.push_back("Kolyah35"); _lines.push_back("Kolyah35");
_lines.push_back("karson"); _lines.push_back("karson");
_lines.push_back("deepfriedwaffles"); _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

@@ -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,10 +146,13 @@ 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;
@@ -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

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

@@ -388,6 +388,12 @@ 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 * flySpeed; if (Keyboard::isKeyDown(103)) ya = .2f * flySpeed;
if (Keyboard::isKeyDown(102)) ya = -.2f * flySpeed; if (Keyboard::isKeyDown(102)) ya = -.2f * flySpeed;
@@ -506,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

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

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

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

@@ -206,3 +206,93 @@ void WaterSideTexture::tick() {
pixels[i * 4 + 3] = a; pixels[i * 4 + 3] = a;
} }
} }
FireTexture::FireTexture()
: super(((Tile*)Tile::fire)->tex),
_tick(0),
_frame(0)
{
current = new float[16*20];
next = new float[16*20];
heat = new float[16*20];
heata = new float[16*20];
for (int i = 0; i < 256; ++i) {
current[i] = 0;
next[i] = 0;
heat[i] = 0;
heata[i] = 0;
}
}
FireTexture::~FireTexture() {
delete[] current;
delete[] next;
delete[] heat;
delete[] heata;
}
// oh boy time to implement fire textures, i am so fucked - shredder
void FireTexture::tick() {
// loop generates fire texture on the empty texture grid, hopefully shouldnt be too taxing on older hardware - shredder
for (int x = 0; x < 16; x++) {
for (int y = 0; y < 20; y++) {
int count = 18;
float pow = this->current[x + (y + 1) % 20 * 16] * (float)(count);
for (int xx = x - 1; xx <= x + 1; xx++) {
for (int yy = y; yy <= y + 1; yy++) {
if (xx >= 0 && yy >= 0 && xx < 16 && yy < 20) {
pow += this->current[xx + yy * 16];
}
count++;
}
}
this->next[x + y * 16] = pow / (float(count) * 1.06f);
if (y >= 19) {
this->next[x + y * 16] = float(Mth::random() * Mth::random() * Mth::random() * 4.0 + Mth::random() * 0.1f + 0.2f);
}
}
}
// hopefully this doesn't cause any mysterious issues - shredder
float* tmp = next;
next = current;
current = tmp;
for (int i = 0; i < 256; i++) {
float pow = this->current[i] * 1.8f;
if (pow > 1.0f) {
pow = 1.0f;
}
if (pow < 0.0f) {
pow = 0.0f;
}
int r = (int) (pow * 155.0f + 100.0f);
int g = (int)(pow * pow * 255.0f);
int b = (int)(pow * pow * pow * pow * pow * pow * pow * pow * pow * pow * 255.0f);
int a = 255;
if (pow < 0.5f) {
a = 0;
}
// @TODO: cant be arsed rn to implement the anaglyph3d check would be nice to check if it does - shredder
//if (this->anaglyph3d) {
// float rr = (r * 30 + g * 59 + b * 11) / 100;
// float gg = (r * 30 + g * 70) / 100;
// float bb = (r * 30 + b * 70) / 100;
// r = rr;
// g = gg;
// b = bb;
//}
pixels[i * 4 + 0] = r;
pixels[i * 4 + 1] = g;
pixels[i * 4 + 2] = b;
pixels[i * 4 + 3] = a;
}
}

View File

@@ -56,4 +56,21 @@ public:
void tick(); void tick();
}; };
class FireTexture: public DynamicTexture
{
typedef DynamicTexture super;
int _tick;
int _frame;
float* current;
float* next;
float* heat;
float* heata;
public:
FireTexture();
~FireTexture();
void tick();
};
#endif /*NET_MINECRAFT_CLIENT_RENDERER_PTEXTURE__DynamicTexture_H__*/ #endif /*NET_MINECRAFT_CLIENT_RENDERER_PTEXTURE__DynamicTexture_H__*/

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);

View File

@@ -19,7 +19,7 @@ public:
setMaxDamage(64); setMaxDamage(64);
} }
/*
bool useOn(ItemInstance* instance, Player* player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ) { bool useOn(ItemInstance* instance, Player* player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ) {
if (face == 0) y--; if (face == 0) y--;
if (face == 1) y++; if (face == 1) y++;
@@ -30,14 +30,14 @@ public:
int targetType = level->getTile(x, y, z); int targetType = level->getTile(x, y, z);
if (targetType == 0) { if (targetType == 0) {
level->playSound(x + 0.5, y + 0.5, z + 0.5, "fire.ignite", 1, sharedRandom.nextFloat() * 0.4f + 0.8f); level->playSound(x + 0.5, y + 0.5, z + 0.5, "fire.ignite", 1, random.nextFloat() * 0.4f + 0.8f);
level->setTile(x, y, z, Tile::fire->id); level->setTile(x, y, z, ((Tile*)Tile::fire)->id);
} }
instance->hurt(1); instance->hurt(1);
return true; return true;
} }
*/
}; };
#endif /*NET_MINECRAFT_WORLD_ITEM__FlintAndSteelItem_H__*/ #endif /*NET_MINECRAFT_WORLD_ITEM__FlintAndSteelItem_H__*/

View File

@@ -1599,8 +1599,8 @@ bool Level::containsFireTile(const AABB& box) {
for (int z = z0; z < z1; z++) { for (int z = z0; z < z1; z++) {
int t = getTile(x, y, z); int t = getTile(x, y, z);
if (/*t == ((Tile*)(Tile::fire))->id if (t == ((Tile*)(Tile::fire))->id
||*/ t == Tile::lava->id || t == Tile::lava->id
|| t == Tile::calmLava->id) { || t == Tile::calmLava->id) {
return true; return true;
} }

View File

@@ -2,6 +2,7 @@
#include "../levelgen/feature/TreeFeature.h" #include "../levelgen/feature/TreeFeature.h"
#include "../levelgen/feature/TallgrassFeature.h" #include "../levelgen/feature/TallgrassFeature.h"
#include "../levelgen/feature/BasicTree.h"
#include "../../entity/EntityTypes.h" #include "../../entity/EntityTypes.h"
#include "../../entity/MobCategory.h" #include "../../entity/MobCategory.h"
@@ -140,7 +141,7 @@ void Biome::teardownBiomes() {
Feature* Biome::getTreeFeature( Random* random ) Feature* Biome::getTreeFeature( Random* random )
{ {
if (random->nextInt(10) == 0) { if (random->nextInt(10) == 0) {
//return /*new*/ BasicTree(); return new BasicTree(false);
} }
return new TreeFeature(false); return new TreeFeature(false);
} }
@@ -148,6 +149,15 @@ Feature* Biome::getGrassFeature( Random* random ) {
return new TallgrassFeature(Tile::tallgrass->id, TallGrass::TALL_GRASS); return new TallgrassFeature(Tile::tallgrass->id, TallGrass::TALL_GRASS);
} }
Feature* Biome::getBasicTreeFeature( Random* random )
{
if (random->nextInt(10) == 0) {
return new BasicTree(false);
}
}
Biome* Biome::getBiome( float temperature, float downfall ) Biome* Biome::getBiome( float temperature, float downfall )
{ {
int a = (int) (temperature * 63); int a = (int) (temperature * 63);

View File

@@ -71,6 +71,7 @@ public:
virtual Feature* getTreeFeature(Random* random); virtual Feature* getTreeFeature(Random* random);
virtual Feature* getGrassFeature(Random* random); virtual Feature* getGrassFeature(Random* random);
virtual Feature* getBasicTreeFeature(Random* random);
static Biome* getBiome(float temperature, float downfall); static Biome* getBiome(float temperature, float downfall);
static Biome* _getBiome(float temperature, float downfall); static Biome* _getBiome(float temperature, float downfall);

View File

@@ -6,6 +6,7 @@
#include "Biome.h" #include "Biome.h"
#include "../levelgen/feature/TreeFeature.h" #include "../levelgen/feature/TreeFeature.h"
#include "../levelgen/feature/BirchFeature.h" #include "../levelgen/feature/BirchFeature.h"
#include "../levelgen/feature/BasicTree.h"
class ForestBiome: public Biome class ForestBiome: public Biome
{ {
@@ -15,7 +16,7 @@ public:
return new BirchFeature(); return new BirchFeature();
} }
if (random->nextInt(3) == 0) { if (random->nextInt(3) == 0) {
//return new BasicTree(); return new BasicTree(false);
} }
return new TreeFeature(false); return new TreeFeature(false);
} }

View File

@@ -6,13 +6,14 @@
#include "Biome.h" #include "Biome.h"
#include "../../../util/Random.h" #include "../../../util/Random.h"
#include "../levelgen/feature/TreeFeature.h" #include "../levelgen/feature/TreeFeature.h"
#include "../levelgen/feature/BasicTree.h"
class RainforestBiome: public Biome class RainforestBiome: public Biome
{ {
public: public:
Feature* getTreeFeature(Random* random) { Feature* getTreeFeature(Random* random) {
if (random->nextInt(3) == 0) { if (random->nextInt(3) == 0) {
//return new BasicTree(); return new BasicTree(false);
} }
return new TreeFeature(false); return new TreeFeature(false);
} }

View File

@@ -370,6 +370,18 @@ void RandomLevelSource::postProcess(ChunkSource* parent, int xt, int zt) {
} }
//printf("placing tree at %d, %d, %d\n", x, y, z); //printf("placing tree at %d, %d, %d\n", x, y, z);
} }
// for (int i = 0; i < forests; i++) {
// int x = xo + random.nextInt(16) + 8;
// int z = zo + random.nextInt(16) + 8;
//int y = level->getHeightmap(x, z);
// Feature* tree = biome->getBasicTreeFeature(&random);
//if (tree) {
// tree->init(1, 1, 1);
// tree->place(level, &random, x, y, z);
// delete tree;
//}
////printf("placing tree at %d, %d, %d\n", x, y, z);
// }
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
int x = xo + random.nextInt(16) + 8; int x = xo + random.nextInt(16) + 8;

View File

@@ -0,0 +1,446 @@
#ifndef NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__
#define NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__
//package net.minecraft.world.level.levelgen.feature;
#include "Feature.h"
#include "../../../../util/Random.h"
#include "../../Level.h"
#include "../../tile/TreeTile.h"
class Level;
class BasicTree : public Feature
{
typedef Feature super;
private:
unsigned char axisConversionArray[6];
Random *rnd;
Level *thisLevel;
int origin[3];
int height;
int trunkHeight;
double trunkHeightScale;
double branchDensity;
double branchSlope;
double widthScale;
double foliageDensity;
int trunkWidth;
int heightVariance;
int foliageHeight;
int **foliageCoords;
int foliageCoordsLength;
void prepare(){
trunkHeight = (int) (height * trunkHeightScale);
if (trunkHeight >= height) trunkHeight = height - 1;
int clustersPerY = (int) (1.382 + pow(foliageDensity * height / 13.0, 2));
if (clustersPerY < 1) clustersPerY = 1;
int **tempFoliageCoords = new int *[clustersPerY * height];
for( int i = 0; i < clustersPerY * height; i++ )
{
tempFoliageCoords[i] = new int[4];
}
int y = origin[1] + height - foliageHeight;
int clusterCount = 1;
int trunkTop = origin[1] + trunkHeight;
int relativeY = y - origin[1];
tempFoliageCoords[0][0] = origin[0];
tempFoliageCoords[0][1] = y;
tempFoliageCoords[0][2] = origin[2];
tempFoliageCoords[0][3] = trunkTop;
y--;
while (relativeY >= 0)
{
int num = 0;
float shapefac = treeShape(relativeY);
if (shapefac < 0)
{
y--;
relativeY--;
continue;
}
double originOffset = 0.5;
while (num < clustersPerY)
{
double radius = widthScale * (shapefac * (rnd->nextFloat() + 0.328));
double angle = rnd->nextFloat() * 2.0 * 3.14159;
int x = Mth::floor(radius * sin(angle) + origin[0] + originOffset);
int z = Mth::floor(radius * cos(angle) + origin[2] + originOffset);
int checkStart[] = { x, y, z };
int checkEnd[] = { x, y + foliageHeight, z };
if (checkLine(checkStart, checkEnd) == -1) {
int checkBranchBase[] = { origin[0], origin[1], origin[2] };
double distance = sqrt(pow(abs(origin[0] - checkStart[0]), 2.0) + pow(abs(origin[2] - checkStart[2]), 2.0));
double branchHeight = distance * branchSlope;
if ((checkStart[1] - branchHeight) > trunkTop)
{
checkBranchBase[1] = trunkTop;
}
else
{
checkBranchBase[1] = (int) (checkStart[1] - branchHeight);
}
if (checkLine(checkBranchBase, checkStart) == -1)
{
tempFoliageCoords[clusterCount][0] = x;
tempFoliageCoords[clusterCount][1] = y;
tempFoliageCoords[clusterCount][2] = z;
tempFoliageCoords[clusterCount][3] = checkBranchBase[1];
clusterCount++;
}
}
num++;
}
y--;
relativeY--;
}
foliageCoordsLength = clusterCount;
foliageCoords = tempFoliageCoords;
for( int i = clusterCount; i < clustersPerY * height; i++ )
{
delete [] tempFoliageCoords[i];
tempFoliageCoords[i] = NULL;
}
}
void crossection(int x, int y, int z, float radius, unsigned char direction, int material)
{
int rad = (int) (radius + 0.618);
unsigned char secidx1 = axisConversionArray[direction];
unsigned char secidx2 = axisConversionArray[direction + 3];
int center[] = { x, y, z };
int position[] = { 0, 0, 0 };
int offset1 = -rad;
int offset2 = -rad;
int thismat;
position[direction] = center[direction];
while (offset1 <= rad)
{
position[secidx1] = center[secidx1] + offset1;
offset2 = -rad;
while (offset2 <= rad)
{
double thisdistance = pow(abs(offset1) + 0.5, 2) + pow(abs(offset2) + 0.5, 2);
if (thisdistance > radius * radius)
{
offset2++;
continue;
}
position[secidx2] = center[secidx2] + offset2;
thismat = thisLevel->getTile(position[0], position[1], position[2]);
if (!((thismat == 0) || (thismat == Tile::leaves->id)))
{
offset2++;
continue;
}
placeBlock(thisLevel, position[0], position[1], position[2], material, 0);
offset2++;
}
offset1++;
}
}
float treeShape(int y){
if (y < (((float) height) * 0.3)) return (float) -1.618;
float radius = ((float) height) / ((float) 2.0);
float adjacent = (((float) height) / ((float) 2.0)) - y;
float distance;
if (adjacent == 0) distance = radius;
else if (abs(adjacent) >= radius) distance = (float) 0.0;
else distance = (float) sqrt(pow(abs(radius), 2) - pow(abs(adjacent), 2));
distance *= (float) 0.5;
return distance;
}
float foliageShape(int y){
if ((y < 0) || (y >= foliageHeight)) return (float) -1;
else if ((y == 0) || (y == (foliageHeight - 1))) return (float) 2;
else return (float) 3;
}
void foliageCluster(int x, int y, int z){
int topy = y + foliageHeight;
int cury = topy - 1;
float radius;
while (cury >= y)
{
radius = foliageShape(cury - y);
crossection(x, cury, z, radius, (unsigned char) 1, Tile::leaves->id);
cury--;
}
}
void limb(int *start, int *end, int material)
{
int delta[] = { 0, 0, 0 };
unsigned char idx = 0;
unsigned char primidx = 0;
while (idx < 3)
{
delta[idx] = end[idx] - start[idx];
if (abs(delta[idx]) > abs(delta[primidx]))
{
primidx = idx;
}
idx++;
}
if (delta[primidx] == 0) return;
unsigned char secidx1 = axisConversionArray[primidx];
unsigned char secidx2 = axisConversionArray[primidx + 3];
char primsign;
if (delta[primidx] > 0) primsign = 1;
else primsign = -1;
double secfac1 = ((double) delta[secidx1]) / ((double) delta[primidx]);
double secfac2 = ((double) delta[secidx2]) / ((double) delta[primidx]);
int coordinate[] = { 0, 0, 0 };
int primoffset = 0;
int endoffset = delta[primidx] + primsign;
while (primoffset != endoffset)
{
coordinate[primidx] = Mth::floor(start[primidx] + primoffset + 0.5);
coordinate[secidx1] = Mth::floor(start[secidx1] + (primoffset * secfac1) + 0.5);
coordinate[secidx2] = Mth::floor(start[secidx2] + (primoffset * secfac2) + 0.5);
int dir = 0;
int xdiff = abs(coordinate[0] - start[0]);
int zdiff = abs(coordinate[2] - start[2]);
int maxdiff = (std::max)(xdiff, zdiff);
if (maxdiff > 0)
{
if (xdiff == maxdiff)
{
dir = 0;
}
else if (zdiff == maxdiff)
{
dir = 0;
}
}
placeBlock(thisLevel, coordinate[0], coordinate[1], coordinate[2], material, dir);
primoffset += primsign;
}
}
void makeFoliage(){
int idx = 0;
int finish = foliageCoordsLength;
while (idx < finish)
{
int x = foliageCoords[idx][0];
int y = foliageCoords[idx][1];
int z = foliageCoords[idx][2];
foliageCluster(x, y, z);
idx++;
}
}
bool trimBranches(int localY){
if (localY < (height * 0.2)) return false;
else return true;
}
void makeTrunk(){
int x = origin[0];
int startY = origin[1];
int topY = origin[1] + trunkHeight;
int z = origin[2];
int startCoord[] = { x, startY, z };
int endCoord[] = { x, topY, z };
limb(startCoord, endCoord, Tile::treeTrunk->id);
if (trunkWidth == 2)
{
startCoord[0] += 1;
endCoord[0] += 1;
limb(startCoord, endCoord, Tile::treeTrunk->id);
startCoord[2] += 1;
endCoord[2] += 1;
limb(startCoord, endCoord, Tile::treeTrunk->id);
startCoord[0] += -1;
endCoord[0] += -1;
limb(startCoord, endCoord, Tile::treeTrunk->id);
}
}
void makeBranches(){
int idx = 0;
int finish = foliageCoordsLength;
int baseCoord[] = { origin[0], origin[1], origin[2] };
while (idx < finish)
{
int *coordValues = foliageCoords[idx];
int endCoord[] = { coordValues[0], coordValues[1], coordValues[2] };
baseCoord[1] = coordValues[3];
int localY = baseCoord[1] - origin[1];
if (trimBranches(localY))
{
limb(baseCoord, endCoord, Tile::treeTrunk->id);
}
idx++;
}
}
int checkLine(int *start, int *end){
int delta[] = { 0, 0, 0 };
unsigned char idx = 0;
unsigned char primidx = 0;
while (idx < 3)
{
delta[idx] = end[idx] - start[idx];
if (abs(delta[idx]) > abs(delta[primidx]))
{
primidx = idx;
}
idx++;
}
if (delta[primidx] == 0) return -1;
unsigned char secidx1 = axisConversionArray[primidx];
unsigned char secidx2 = axisConversionArray[primidx + 3];
char primsign;
if (delta[primidx] > 0) primsign = 1;
else primsign = -1;
double secfac1 = ((double) delta[secidx1]) / ((double) delta[primidx]);
double secfac2 = ((double) delta[secidx2]) / ((double) delta[primidx]);
int coordinate[] = { 0, 0, 0 };
int primoffset = 0;
int endoffset = delta[primidx] + primsign;
int thismat;
while (primoffset != endoffset)
{
coordinate[primidx] = start[primidx] + primoffset;
coordinate[secidx1] = Mth::floor(start[secidx1] + (primoffset * secfac1));
coordinate[secidx2] = Mth::floor(start[secidx2] + (primoffset * secfac2));
thismat = thisLevel->getTile(coordinate[0], coordinate[1], coordinate[2]);
if (!((thismat == 0) || (thismat == Tile::leaves->id)))
{
break;
}
primoffset += primsign;
}
if (primoffset == endoffset)
{
return -1;
}
else
{
return abs(primoffset);
}
}
bool checkLocation(){
int startPosition[] = { origin[0], origin[1], origin[2] };
int endPosition[] = { origin[0], origin[1] + height - 1, origin[2] };
int baseMaterial = thisLevel->getTile(origin[0], origin[1] - 1, origin[2]);
if (!((baseMaterial == 2) || (baseMaterial == 3)))
{
return false;
}
int allowedHeight = checkLine(startPosition, endPosition);
if (allowedHeight == -1)
{
return true;
}
else if (allowedHeight < 6)
{
return false;
}
else
{
height = allowedHeight;
return true;
}
}
public:
BasicTree(bool doUpdate){
axisConversionArray[0] = 2;
axisConversionArray[1] = 0;
axisConversionArray[2] = 0;
axisConversionArray[3] = 1;
axisConversionArray[4] = 2;
axisConversionArray[5] = 1;
rnd = new Random();
origin[0] = 0;
origin[1] = 0;
origin[2] = 0;
height = 0;
trunkHeight = 0;
trunkHeightScale = 0.618;
branchDensity = 1.0;
branchSlope = 0.381;
widthScale = 1.0;
foliageDensity = 1.0;
trunkWidth = 1;
heightVariance = 12;
foliageHeight = 4;
foliageCoords = NULL;
foliageCoordsLength = 0;
}
virtual ~BasicTree(){
delete rnd;
for( int i = 0; i < foliageCoordsLength; i++ )
{
delete [] foliageCoords[i];
}
delete [] foliageCoords;
}
virtual void init(double heightInit, double widthInit, double foliageDensityInit){
heightVariance = (int) (heightInit * 12);
if (heightInit > 0.5) foliageHeight = 5;
widthScale = widthInit;
foliageDensity = foliageDensityInit;
}
virtual bool place(Level *level, Random *random, int x, int y, int z){
thisLevel = level;
int seed = random->nextLong();
rnd->setSeed(seed);
origin[0] = x;
origin[1] = y;
origin[2] = z;
if (height == 0)
{
height = 5 + rnd->nextInt(heightVariance);
}
if (!(checkLocation()))
{
return false;
}
prepare();
makeFoliage();
makeTrunk();
makeBranches();
return true;
}
};
#endif /*NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__*/

View File

@@ -38,7 +38,7 @@ public:
setFlammable(Tile::tnt->id, FLAME_MEDIUM, BURN_INSTANT); setFlammable(Tile::tnt->id, FLAME_MEDIUM, BURN_INSTANT);
setFlammable(Tile::cloth->id, FLAME_EASY, BURN_EASY); setFlammable(Tile::cloth->id, FLAME_EASY, BURN_EASY);
//setTicking(true); //@fire setTicking(true); //@fire
} }
AABB* getAABB(Level* level, int x, int y, int z) { AABB* getAABB(Level* level, int x, int y, int z) {
@@ -70,9 +70,9 @@ public:
} }
void tick(Level* level, int x, int y, int z, Random* random) { void tick(Level* level, int x, int y, int z, Random* random) {
return; //@fire
bool infiniBurn = false;//level->getTile(x, y - 1, z) == Tile::hellRock->id; bool infiniBurn = level->getTile(x, y - 1, z) == Tile::netherrack->id;
int age = level->getData(x, y, z); int age = level->getData(x, y, z);
if (age < 15) { if (age < 15) {
@@ -148,7 +148,6 @@ public:
} }
void neighborChanged(Level* level, int x, int y, int z, int type) { void neighborChanged(Level* level, int x, int y, int z, int type) {
return; //@fire
if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) { if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) {
level->setTile(x, y, z, 0); level->setTile(x, y, z, 0);
return; return;
@@ -156,7 +155,6 @@ public:
} }
void onPlace(Level* level, int x, int y, int z) { void onPlace(Level* level, int x, int y, int z) {
return; //@fire
if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) { if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) {
level->setTile(x, y, z, 0); level->setTile(x, y, z, 0);
return; return;
@@ -169,7 +167,6 @@ public:
} }
void ignite(Level* level, int x, int y, int z) { void ignite(Level* level, int x, int y, int z) {
return; //@fire
bool lit = false; bool lit = false;
if (!lit) lit = tryIgnite(level, x, y + 1, z); if (!lit) lit = tryIgnite(level, x, y + 1, z);
@@ -184,11 +181,10 @@ public:
} }
void animateTick(Level* level, int x, int y, int z, Random* random) { void animateTick(Level* level, int x, int y, int z, Random* random) {
return; //@fire
//if (random.nextInt(24) == 0) { if (random->nextInt(24) == 0) {
// level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, "fire.fire", 1 + random.nextFloat(), random.nextFloat() * 0.7f + 0.3f); level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, "fire.fire", 1 + random->nextFloat(), random->nextFloat() * 0.7f + 0.3f);
//} }
if (level->isSolidBlockingTile(x, y - 1, z) || Tile::fire->canBurn(level, x, y - 1, z)) { if (level->isSolidBlockingTile(x, y - 1, z) || Tile::fire->canBurn(level, x, y - 1, z)) {
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
@@ -248,7 +244,6 @@ private:
} }
void checkBurn(Level* level, int x, int y, int z, int chance, Random* random) { void checkBurn(Level* level, int x, int y, int z, int chance, Random* random) {
return; //@fire
int odds = burnOdds[level->getTile(x, y, z)]; int odds = burnOdds[level->getTile(x, y, z)];
if (random->nextInt(chance) < odds) { if (random->nextInt(chance) < odds) {
@@ -265,7 +260,6 @@ private:
} }
bool isValidFireLocation(Level* level, int x, int y, int z) { bool isValidFireLocation(Level* level, int x, int y, int z) {
return false; //@fire
if (canBurn(level, x + 1, y, z)) return true; if (canBurn(level, x + 1, y, z)) return true;
if (canBurn(level, x - 1, y, z)) return true; if (canBurn(level, x - 1, y, z)) return true;
@@ -278,7 +272,6 @@ private:
} }
int getFireOdds(Level* level, int x, int y, int z) { int getFireOdds(Level* level, int x, int y, int z) {
return 0; //@fire
int odds = 0; int odds = 0;
if (!level->isEmptyTile(x, y, z)) return 0; if (!level->isEmptyTile(x, y, z)) return 0;
@@ -294,7 +287,6 @@ private:
} }
bool tryIgnite(Level* level, int x, int y, int z) { bool tryIgnite(Level* level, int x, int y, int z) {
return false; //@fire
int t = level->getTile(x, y, z); int t = level->getTile(x, y, z);
if (t == Tile::fire->id) return true; if (t == Tile::fire->id) return true;