Compare commits
7 Commits
0.6.1-alph
...
web-change
| Author | SHA1 | Date | |
|---|---|---|---|
| 676fd54982 | |||
| 084607cc86 | |||
| bbd81665a6 | |||
| 06398e98e2 | |||
| 7d9328b865 | |||
| f1111d06c2 | |||
| ba9f1da758 |
17
.github/workflows/build.yml
vendored
17
.github/workflows/build.yml
vendored
@@ -60,16 +60,13 @@ jobs:
|
|||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
working-directory: ${{github.workspace}}/build
|
working-directory: ${{github.workspace}}/build
|
||||||
run: |
|
run: cmake --build . --config $BUILD_TYPE --target MinecraftPE --parallel
|
||||||
cmake --build . --config $BUILD_TYPE --target MinecraftPE --parallel
|
|
||||||
cmake --build . --config $BUILD_TYPE --target MinecraftPE-server --parallel
|
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: mcpe-windows
|
name: mcpe-windows
|
||||||
path: |
|
path: |
|
||||||
${{github.workspace}}/build/MinecraftPE-server.exe
|
|
||||||
${{github.workspace}}/build/MinecraftPE.exe
|
${{github.workspace}}/build/MinecraftPE.exe
|
||||||
${{github.workspace}}/build/libpng16.dll
|
${{github.workspace}}/build/libpng16.dll
|
||||||
${{github.workspace}}/build/OpenAL32.dll
|
${{github.workspace}}/build/OpenAL32.dll
|
||||||
@@ -303,12 +300,6 @@ jobs:
|
|||||||
files: mcpe-windows/MinecraftPE.exe mcpe-windows/libpng16.dll mcpe-windows/OpenAL32.dll mcpe-windows/libz.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 Windows Server Artifacts
|
|
||||||
uses: vimtor/action-zip@v1.2
|
|
||||||
with:
|
|
||||||
files: mcpe-windows/MinecraftPE-server.exe
|
|
||||||
dest: minecraftpe-server-${{ 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:
|
||||||
@@ -319,7 +310,7 @@ jobs:
|
|||||||
uses: vimtor/action-zip@v1.2
|
uses: vimtor/action-zip@v1.2
|
||||||
with:
|
with:
|
||||||
files: mcpe-linux/MinecraftPE-server
|
files: mcpe-linux/MinecraftPE-server
|
||||||
dest: minecraftpe-server-${{ steps.ref.outputs.hash }}-linux.zip
|
dest: minecraftpe-server-${{ steps.ref.outputs.hash }}.zip
|
||||||
|
|
||||||
- name: Rename Android Artifacts
|
- name: Rename Android Artifacts
|
||||||
run: |
|
run: |
|
||||||
@@ -352,11 +343,7 @@ jobs:
|
|||||||
./data.zip
|
./data.zip
|
||||||
./minecraftpe-server-${{ steps.ref.outputs.hash }}.zip
|
./minecraftpe-server-${{ steps.ref.outputs.hash }}.zip
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-windows.zip
|
./minecraftpe-${{ steps.ref.outputs.hash }}-windows.zip
|
||||||
./minecraftpe-server-${{ steps.ref.outputs.hash }}-windows.zip
|
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-linux.zip
|
./minecraftpe-${{ steps.ref.outputs.hash }}-linux.zip
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.apk
|
./minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.apk
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.apk
|
./minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.apk
|
||||||
./minecraftpe-server-${{ steps.ref.outputs.hash }}-linux.zip
|
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.zip
|
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.zip
|
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-web.zip
|
./minecraftpe-${{ steps.ref.outputs.hash }}-web.zip
|
||||||
|
|||||||
@@ -16,9 +16,7 @@ endif()
|
|||||||
|
|
||||||
enum_option(PLATFORM "Desktop;Web" "Platform to build for.")
|
enum_option(PLATFORM "Desktop;Web" "Platform to build for.")
|
||||||
|
|
||||||
if(NOT EMSCRIPTEN)
|
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
endif()
|
|
||||||
find_package(OpenSSL)
|
find_package(OpenSSL)
|
||||||
|
|
||||||
if (${PLATFORM} STREQUAL "Desktop")
|
if (${PLATFORM} STREQUAL "Desktop")
|
||||||
@@ -113,6 +111,7 @@ CPMAddPackage(
|
|||||||
"ALSOFT_STATIC_LIBGCC ON"
|
"ALSOFT_STATIC_LIBGCC ON"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# TODO: Clear this paths with *
|
||||||
file(GLOB SERVER_SOURCES
|
file(GLOB SERVER_SOURCES
|
||||||
"project/lib_projects/raknet/jni/RaknetSources/*.cpp"
|
"project/lib_projects/raknet/jni/RaknetSources/*.cpp"
|
||||||
"src/NinecraftApp.cpp"
|
"src/NinecraftApp.cpp"
|
||||||
@@ -151,6 +150,7 @@ file(GLOB SERVER_SOURCES
|
|||||||
|
|
||||||
"src/platform/CThread.cpp"
|
"src/platform/CThread.cpp"
|
||||||
"src/platform/HttpClient.cpp"
|
"src/platform/HttpClient.cpp"
|
||||||
|
"src/platform/PngLoader.cpp"
|
||||||
"src/platform/time.cpp"
|
"src/platform/time.cpp"
|
||||||
|
|
||||||
"src/platform/input/Controller.cpp"
|
"src/platform/input/Controller.cpp"
|
||||||
@@ -216,7 +216,6 @@ file(GLOB SERVER_SOURCES
|
|||||||
"src/world/level/tile/entity/*.cpp"
|
"src/world/level/tile/entity/*.cpp"
|
||||||
|
|
||||||
"src/world/phys/HitResult.cpp"
|
"src/world/phys/HitResult.cpp"
|
||||||
"src/commands/*.cpp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
file(GLOB CLIENT_SOURCES
|
file(GLOB CLIENT_SOURCES
|
||||||
@@ -300,8 +299,6 @@ file(GLOB CLIENT_SOURCES
|
|||||||
|
|
||||||
"src/AppPlatform_glfw.cpp"
|
"src/AppPlatform_glfw.cpp"
|
||||||
"src/main.cpp"
|
"src/main.cpp"
|
||||||
|
|
||||||
"src/commands/*.cpp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (${PLATFORM} STREQUAL "Desktop")
|
if (${PLATFORM} STREQUAL "Desktop")
|
||||||
@@ -309,23 +306,22 @@ if (${PLATFORM} STREQUAL "Desktop")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Server
|
# Server
|
||||||
|
if(UNIX)
|
||||||
add_executable("${PROJECT_NAME}-server" ${SERVER_SOURCES})
|
add_executable("${PROJECT_NAME}-server" ${SERVER_SOURCES})
|
||||||
|
|
||||||
target_compile_definitions("${PROJECT_NAME}-server" PUBLIC "STANDALONE_SERVER" "SERVER_PROFILER")
|
target_compile_definitions("${PROJECT_NAME}-server" PUBLIC "STANDALONE_SERVER" "SERVER_PROFILER")
|
||||||
|
|
||||||
target_include_directories("${PROJECT_NAME}-server" PUBLIC
|
target_include_directories("${PROJECT_NAME}-server" PUBLIC
|
||||||
|
"${CMAKE_SOURCE_DIR}/glad/include/"
|
||||||
"${CMAKE_SOURCE_DIR}/src/"
|
"${CMAKE_SOURCE_DIR}/src/"
|
||||||
"project/lib_projects/raknet/jni/RaknetSources"
|
"project/lib_projects/raknet/jni/RaknetSources"
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries("${PROJECT_NAME}-server" ${CMAKE_THREAD_LIBS_INIT} ${EXTRA_LIBS})
|
target_link_libraries("${PROJECT_NAME}-server" ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
endif()
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME} ${CLIENT_SOURCES})
|
add_executable(${PROJECT_NAME} ${CLIENT_SOURCES})
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
target_sources(${PROJECT_NAME} PRIVATE data/images/pe.rc)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_compile_definitions(${PROJECT_NAME} PUBLIC ${PLATFORM_CPP})
|
target_compile_definitions(${PROJECT_NAME} PUBLIC ${PLATFORM_CPP})
|
||||||
|
|
||||||
target_include_directories(${PROJECT_NAME} PUBLIC
|
target_include_directories(${PROJECT_NAME} PUBLIC
|
||||||
@@ -343,7 +339,11 @@ if(${PLATFORM} MATCHES "Web")
|
|||||||
|
|
||||||
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")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EM_FLAGS} --preload-file \"${CMAKE_SOURCE_DIR}/data@/data\"")
|
||||||
|
set_target_properties(${PROJECT_NAME} PROPERTIES RULE_LAUNCH_LINK "set EMCC_WASM_OPT=0 &&")
|
||||||
|
# Remove -g (DWARF) to prevent wasm-opt post-link optimizations from running
|
||||||
|
string(REPLACE "-g" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
||||||
|
string(REPLACE "-g" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
|
||||||
|
|
||||||
target_compile_options(${PROJECT_NAME} PUBLIC
|
target_compile_options(${PROJECT_NAME} PUBLIC
|
||||||
"-Os"
|
"-Os"
|
||||||
@@ -359,7 +359,7 @@ if(${PLATFORM} MATCHES "Web")
|
|||||||
"-sFORCE_FILESYSTEM=1"
|
"-sFORCE_FILESYSTEM=1"
|
||||||
"-sLEGACY_GL_EMULATION=1"
|
"-sLEGACY_GL_EMULATION=1"
|
||||||
"-sGL_UNSAFE_OPTS=0"
|
"-sGL_UNSAFE_OPTS=0"
|
||||||
"-sEMULATE_FUNCTION_POINTER_CASTS=1"
|
"-sEMULATE_FUNCTION_POINTER_CASTS=0"
|
||||||
"-sALLOW_TABLE_GROWTH=1"
|
"-sALLOW_TABLE_GROWTH=1"
|
||||||
"-sEXPORTED_RUNTIME_METHODS=['FS','stringToUTF8','UTF8ToString','cwrap','ccall','HEAP8','HEAPU8','HEAP32','HEAPU32']"
|
"-sEXPORTED_RUNTIME_METHODS=['FS','stringToUTF8','UTF8ToString','cwrap','ccall','HEAP8','HEAPU8','HEAP32','HEAPU32']"
|
||||||
"-sEXPORTED_FUNCTIONS=['_main']"
|
"-sEXPORTED_FUNCTIONS=['_main']"
|
||||||
@@ -408,6 +408,10 @@ else()
|
|||||||
TARGET ${PROJECT_NAME}
|
TARGET ${PROJECT_NAME}
|
||||||
POST_BUILD
|
POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/index.html" $<TARGET_FILE_DIR:${PROJECT_NAME}>
|
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/index.html" $<TARGET_FILE_DIR:${PROJECT_NAME}>
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/coi-serviceworker.js" $<TARGET_FILE_DIR:${PROJECT_NAME}>
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/manifest.json" $<TARGET_FILE_DIR:${PROJECT_NAME}>
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/icon-192.png" $<TARGET_FILE_DIR:${PROJECT_NAME}>
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/icon-512.png" $<TARGET_FILE_DIR:${PROJECT_NAME}>
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
46
README.md
46
README.md
@@ -1,6 +1,6 @@
|
|||||||
# MinecraftPE
|
# MinecraftPE
|
||||||
> [!Warning]
|
> [!Warning]
|
||||||
> [Github repository](https://github.com/Minecraft-PE-0-6-1/minecraft-pe-0.6.1-on-all) **isnt main**. All issues and pull requests should be send in [Gitea Repository](https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1).
|
> Github repository **isnt main**. All issues and pull requests should be send in [Gitea Repository](https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1).
|
||||||
|
|
||||||
> [!Important]
|
> [!Important]
|
||||||
> We have a discord server, where you can report bugs or send feedback https://discord.gg/c58YesBxve
|
> We have a discord server, where you can report bugs or send feedback https://discord.gg/c58YesBxve
|
||||||
@@ -9,20 +9,23 @@ Source code for **Minecraft Pocket Edition 0.6.1 alpha** with various fixes and
|
|||||||
|
|
||||||
This project aims to preserve and improve this early version of Minecraft PE.
|
This project aims to preserve and improve this early version of Minecraft PE.
|
||||||
|
|
||||||
# Features
|
# TODO / Roadmap
|
||||||
- Support for modern IOS and Android, Linux, Web
|
- [x] Add platform GLFW
|
||||||
- Improved Dedicated Server (Windows build, anticheat, commands, etc)
|
- [x] Compile for Linux
|
||||||
- Features from Beta version of Minecraft (Grass tint, Beta sky, Smooth lighting, etc) and other tweaks
|
- [x] Compile for android aarch64
|
||||||
|
- [x] Touch control improvements
|
||||||
# Screenshots
|
- [ ] Screen fixes
|
||||||
<p align="center">
|
- [ ] Rewrite platform logic
|
||||||
|
- [x] Fix sound
|
||||||
<img width="49%" alt="menu" src="https://sffempire.ru/mcpe-screenshots/menu.png" />
|
- [x] Do a server connection GUI
|
||||||
<img width="49%" alt="settings" src="https://sffempire.ru/mcpe-screenshots/settings.png" />
|
- [ ] Controller support
|
||||||
<img width="49%" alt="worlds" src="https://sffempire.ru/mcpe-screenshots/worlds.png" />
|
- [x] Minecraft server hosting
|
||||||
<img width="49%" alt="gameplay" src="https://sffempire.ru/mcpe-screenshots/gameplay.png" />
|
- [x] Screen fixess
|
||||||
|
- [x] Fix fog
|
||||||
</p>
|
- [x] Add sprinting
|
||||||
|
- [x] Chat (semi working) and commands
|
||||||
|
- [x] Implementing options
|
||||||
|
- [x] Better F3
|
||||||
|
|
||||||
# Build
|
# Build
|
||||||
|
|
||||||
@@ -76,14 +79,8 @@ cmake --build .
|
|||||||
```
|
```
|
||||||
C:\android-ndk-r14b
|
C:\android-ndk-r14b
|
||||||
```
|
```
|
||||||
3. Install **Build tools 35** with [SDKManager](https://dl.google.com/android/repository/commandlinetools-win-15859902_latest.zip) (build-tools should be in AppData):
|
|
||||||
|
|
||||||
```powershell
|
3. Run the build script:
|
||||||
sdkmanager "build-tools;35.0.0" --sdk_root="%LocalAppData%\Android\Sdk"
|
|
||||||
sdkmanager "build-tools;android-36" --sdk_root="%LocalAppData%\Android\Sdk"
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Run the build script:
|
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
# Full build (NDK + Java + APK + install)
|
# Full build (NDK + Java + APK + install)
|
||||||
@@ -157,6 +154,7 @@ sdkmanager "build-tools;android-36" --sdk_root="%LocalAppData%\Android\Sdk"
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
35.0.0
|
35.0.0
|
||||||
|
33.0.2
|
||||||
```
|
```
|
||||||
|
|
||||||
6. Download **Android NDK r14b**:
|
6. Download **Android NDK r14b**:
|
||||||
@@ -178,7 +176,7 @@ sdkmanager "build-tools;android-36" --sdk_root="%LocalAppData%\Android\Sdk"
|
|||||||
2. Configure and build project:
|
2. Configure and build project:
|
||||||
```
|
```
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
cmake .. -B . -G Ninja "-DCMAKE_TOOLCHAIN_FILE=$EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
|
cmake .. -G Ninja -DCMAKE_TOOLCHAIN_FILE="$env:EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
|
||||||
cmake --build . --target MinecraftPE
|
cmake --build . --target MinecraftPE
|
||||||
```
|
```
|
||||||
> [!Note]
|
> [!Note]
|
||||||
@@ -202,7 +200,7 @@ sdkmanager "build-tools;android-36" --sdk_root="%LocalAppData%\Android\Sdk"
|
|||||||
```
|
```
|
||||||
## iOS
|
## iOS
|
||||||
### Xcode
|
### Xcode
|
||||||
> [!Note]
|
> [Note!]
|
||||||
> There's a precompiled IPA artifact in the GitHub mirror under Actions for those who either don't have Macs or don't want to build themself. But if you want to build youself, you'll need a Mac with Xcode. Download Xcode from the Mac App Store.
|
> There's a precompiled IPA artifact in the GitHub mirror under Actions for those who either don't have Macs or don't want to build themself. But if you want to build youself, you'll need a Mac with Xcode. Download Xcode from the Mac App Store.
|
||||||
|
|
||||||
### 1. Clone
|
### 1. Clone
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 63 KiB |
@@ -1 +0,0 @@
|
|||||||
IDI_ICON1 ICON "pe.ico"
|
|
||||||
@@ -207,6 +207,7 @@ options.graphics.fancy=Fancy
|
|||||||
options.graphics.fast=Fast
|
options.graphics.fast=Fast
|
||||||
options.guiScale=GUI Scale
|
options.guiScale=GUI Scale
|
||||||
options.guiScale.auto=Auto
|
options.guiScale.auto=Auto
|
||||||
|
options.guiScale.tiny=Tiny
|
||||||
options.guiScale.small=Small
|
options.guiScale.small=Small
|
||||||
options.guiScale.medium=Medium
|
options.guiScale.medium=Medium
|
||||||
options.guiScale.large=Large
|
options.guiScale.large=Large
|
||||||
@@ -225,6 +226,7 @@ options.smoothCamera=Smooth camera
|
|||||||
options.destroyVibration=Destroy vibration
|
options.destroyVibration=Destroy vibration
|
||||||
options.isLeftHanded=Left handed
|
options.isLeftHanded=Left handed
|
||||||
options.useTouchscreen=Use touchscreen
|
options.useTouchscreen=Use touchscreen
|
||||||
|
options.touchOverride=Touch Mode Override
|
||||||
options.fancyGraphics=Fancy graphics
|
options.fancyGraphics=Fancy graphics
|
||||||
options.renderDebug=Debug render
|
options.renderDebug=Debug render
|
||||||
options.anaglyph3d=3D anaglyph
|
options.anaglyph3d=3D anaglyph
|
||||||
@@ -1020,5 +1022,5 @@ desc.netherbrickitem=Used to form blocks of Nether bricks.
|
|||||||
desc.netherquartz=Quartz from the Nether, used to create Blocks of Quartz.
|
desc.netherquartz=Quartz from the Nether, used to create Blocks of Quartz.
|
||||||
desc.quartzblock=Decorative block, used to create other kinds of Quartz blocks.
|
desc.quartzblock=Decorative block, used to create other kinds of Quartz blocks.
|
||||||
desc.stonecutter=For crafting stoneblocks.
|
desc.stonecutter=For crafting stoneblocks.
|
||||||
desc.seeds_melon=Allows for more melons.
|
desc.seedsmelon=Allows for more melons.
|
||||||
desc.tile.melon=Can be cut up and eaten.
|
desc.tile.melon=Can be cut up and eaten.
|
||||||
|
|||||||
26
misc/web/coi-serviceworker.js
Normal file
26
misc/web/coi-serviceworker.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/* coi-serviceworker.js - Cross-Origin Isolation + PWA support */
|
||||||
|
|
||||||
|
// Service Worker context
|
||||||
|
self.addEventListener("install", () => self.skipWaiting());
|
||||||
|
|
||||||
|
self.addEventListener("activate", (event) =>
|
||||||
|
event.waitUntil(self.clients.claim())
|
||||||
|
);
|
||||||
|
|
||||||
|
self.addEventListener("fetch", (event) => {
|
||||||
|
if (event.request.method !== "GET") return;
|
||||||
|
event.respondWith(
|
||||||
|
fetch(event.request).then((response) => {
|
||||||
|
if (response.status === 0 || response.type === "opaque") return response;
|
||||||
|
const headers = new Headers(response.headers);
|
||||||
|
headers.set("Cross-Origin-Embedder-Policy", "require-corp");
|
||||||
|
headers.set("Cross-Origin-Opener-Policy", "same-origin");
|
||||||
|
headers.set("Cross-Origin-Resource-Policy", "cross-origin");
|
||||||
|
return new Response(response.body, {
|
||||||
|
status: response.status,
|
||||||
|
statusText: response.statusText,
|
||||||
|
headers,
|
||||||
|
});
|
||||||
|
}).catch(() => fetch(event.request))
|
||||||
|
);
|
||||||
|
});
|
||||||
BIN
misc/web/icon-192.png
Normal file
BIN
misc/web/icon-192.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
BIN
misc/web/icon-512.png
Normal file
BIN
misc/web/icon-512.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
@@ -2,6 +2,12 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<meta name="theme-color" content="#000000">
|
||||||
|
<meta name="mobile-web-app-capable" content="yes">
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
|
<link rel="apple-touch-icon" href="icon-192.png">
|
||||||
<title>MCPE 0.6.1</title>
|
<title>MCPE 0.6.1</title>
|
||||||
<style>
|
<style>
|
||||||
html, body {
|
html, body {
|
||||||
@@ -16,6 +22,10 @@
|
|||||||
width: 100vw;
|
width: 100vw;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
display: block;
|
display: block;
|
||||||
|
touch-action: none;
|
||||||
|
user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
@@ -23,6 +33,40 @@
|
|||||||
|
|
||||||
<canvas id="canvas"></canvas>
|
<canvas id="canvas"></canvas>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
if ('serviceWorker' in navigator) {
|
||||||
|
var reloadedForSw = false;
|
||||||
|
navigator.serviceWorker.register('./coi-serviceworker.js', { scope: './' }).then(function () {
|
||||||
|
navigator.serviceWorker.addEventListener('controllerchange', function () {
|
||||||
|
if (reloadedForSw) return;
|
||||||
|
reloadedForSw = true;
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
}).catch(function (error) {
|
||||||
|
console.warn('Service worker registration failed:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function isAndroid() {
|
||||||
|
return /Android/i.test(navigator.userAgent || '');
|
||||||
|
}
|
||||||
|
|
||||||
|
function lockLandscapeOnAndroid() {
|
||||||
|
if (!isAndroid()) return;
|
||||||
|
|
||||||
|
var orientation = screen.orientation;
|
||||||
|
if (!orientation || typeof orientation.lock !== 'function') return;
|
||||||
|
|
||||||
|
orientation.lock('landscape').catch(function () {});
|
||||||
|
}
|
||||||
|
|
||||||
|
lockLandscapeOnAndroid();
|
||||||
|
window.addEventListener('pointerdown', lockLandscapeOnAndroid, { once: true });
|
||||||
|
window.addEventListener('touchstart', lockLandscapeOnAndroid, { once: true, passive: true });
|
||||||
|
</script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var Module = {
|
var Module = {
|
||||||
canvas: document.getElementById('canvas'),
|
canvas: document.getElementById('canvas'),
|
||||||
|
|||||||
25
misc/web/manifest.json
Normal file
25
misc/web/manifest.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "MCPE 0.6.1",
|
||||||
|
"short_name": "MCPE 0.6.1",
|
||||||
|
"description": "Minecraft Pocket Edition 0.6.1 Alpha - Web Build",
|
||||||
|
"id": "./",
|
||||||
|
"start_url": "./",
|
||||||
|
"scope": "./",
|
||||||
|
"display_override": ["standalone"],
|
||||||
|
"display": "standalone",
|
||||||
|
"orientation": "landscape",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#000000",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "icon-192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "icon-512.png",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -167,6 +167,7 @@ options.graphics.fancy=Fancy
|
|||||||
options.graphics.fast=Fast
|
options.graphics.fast=Fast
|
||||||
options.guiScale=GUI Scale
|
options.guiScale=GUI Scale
|
||||||
options.guiScale.auto=Auto
|
options.guiScale.auto=Auto
|
||||||
|
options.guiScale.tiny=Tiny
|
||||||
options.guiScale.small=Small
|
options.guiScale.small=Small
|
||||||
options.guiScale.medium=Medium
|
options.guiScale.medium=Medium
|
||||||
options.guiScale.large=Large
|
options.guiScale.large=Large
|
||||||
@@ -965,5 +966,5 @@ desc.netherbrickitem=Used to form blocks of Nether bricks.
|
|||||||
desc.netherquartz=Quartz from the Nether, used to create Blocks of Quartz.
|
desc.netherquartz=Quartz from the Nether, used to create Blocks of Quartz.
|
||||||
desc.quartzblock=Decorative block, used to create other kinds of Quartz blocks.
|
desc.quartzblock=Decorative block, used to create other kinds of Quartz blocks.
|
||||||
desc.stonecutter=For crafting stoneblocks.
|
desc.stonecutter=For crafting stoneblocks.
|
||||||
desc.seeds_melon=Allows for more melons.
|
desc.seedsmelon=Allows for more melons.
|
||||||
desc.tile.melon=Can be cut up and eaten.
|
desc.tile.melon=Can be cut up and eaten.
|
||||||
|
|||||||
@@ -110,7 +110,6 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
|||||||
../../../src/client/renderer/Textures.cpp \
|
../../../src/client/renderer/Textures.cpp \
|
||||||
../../../src/client/renderer/TileRenderer.cpp \
|
../../../src/client/renderer/TileRenderer.cpp \
|
||||||
../../../src/client/renderer/gles.cpp \
|
../../../src/client/renderer/gles.cpp \
|
||||||
../../../src/world/level/LevelConstants.cpp \
|
|
||||||
../../../src/client/renderer/culling/Frustum.cpp \
|
../../../src/client/renderer/culling/Frustum.cpp \
|
||||||
../../../src/client/renderer/entity/ArrowRenderer.cpp \
|
../../../src/client/renderer/entity/ArrowRenderer.cpp \
|
||||||
../../../src/client/renderer/entity/ChickenRenderer.cpp \
|
../../../src/client/renderer/entity/ChickenRenderer.cpp \
|
||||||
@@ -141,12 +140,6 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
|||||||
../../../src/network/Packet.cpp \
|
../../../src/network/Packet.cpp \
|
||||||
../../../src/network/RakNetInstance.cpp \
|
../../../src/network/RakNetInstance.cpp \
|
||||||
../../../src/network/ServerSideNetworkHandler.cpp \
|
../../../src/network/ServerSideNetworkHandler.cpp \
|
||||||
../../../src/commands/Command.cpp \
|
|
||||||
../../../src/commands/CommandHelp.cpp \
|
|
||||||
../../../src/commands/CommandKick.cpp \
|
|
||||||
../../../src/commands/CommandBan.cpp \
|
|
||||||
../../../src/commands/CommandManager.cpp \
|
|
||||||
../../../src/commands/CommandOp.cpp \
|
|
||||||
../../../src/server/ServerLevel.cpp \
|
../../../src/server/ServerLevel.cpp \
|
||||||
../../../src/server/ServerPlayer.cpp \
|
../../../src/server/ServerPlayer.cpp \
|
||||||
../../../src/util/DataIO.cpp \
|
../../../src/util/DataIO.cpp \
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ options.graphics.fancy=Fancy
|
|||||||
options.graphics.fast=Fast
|
options.graphics.fast=Fast
|
||||||
options.guiScale=GUI Scale
|
options.guiScale=GUI Scale
|
||||||
options.guiScale.auto=Auto
|
options.guiScale.auto=Auto
|
||||||
|
options.guiScale.tiny=Tiny
|
||||||
options.guiScale.small=Small
|
options.guiScale.small=Small
|
||||||
options.guiScale.medium=Medium
|
options.guiScale.medium=Medium
|
||||||
options.guiScale.large=Large
|
options.guiScale.large=Large
|
||||||
|
|||||||
@@ -232,7 +232,6 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
|||||||
../../../src/world/level/tile/entity/TileEntity.cpp \
|
../../../src/world/level/tile/entity/TileEntity.cpp \
|
||||||
../../../src/world/level/tile/entity/FurnaceTileEntity.cpp \
|
../../../src/world/level/tile/entity/FurnaceTileEntity.cpp \
|
||||||
../../../src/world/phys/HitResult.cpp
|
../../../src/world/phys/HitResult.cpp
|
||||||
../../../src/world/level/LevelConstants.cpp
|
|
||||||
|
|
||||||
LOCAL_CFLAGS := -Wno-psabi $(LOCAL_CFLAGS)
|
LOCAL_CFLAGS := -Wno-psabi $(LOCAL_CFLAGS)
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -47,8 +47,6 @@
|
|||||||
9D293CE816071C08000305C8 /* CreateNewWorld_iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */; };
|
9D293CE816071C08000305C8 /* CreateNewWorld_iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */; };
|
||||||
9D293CEB160720D6000305C8 /* worldname_iphone5_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CEA160720D6000305C8 /* worldname_iphone5_3.png */; };
|
9D293CEB160720D6000305C8 /* worldname_iphone5_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CEA160720D6000305C8 /* worldname_iphone5_3.png */; };
|
||||||
9D293CEC160720D6000305C8 /* worldname_iphone5_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CEA160720D6000305C8 /* worldname_iphone5_3.png */; };
|
9D293CEC160720D6000305C8 /* worldname_iphone5_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CEA160720D6000305C8 /* worldname_iphone5_3.png */; };
|
||||||
BEEF202614CFF670005F0002 /* Lighting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BEEF202614CFF670005F0001 /* Lighting.cpp */; };
|
|
||||||
BEEF202614CFF670005F0003 /* Lighting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BEEF202614CFF670005F0001 /* Lighting.cpp */; };
|
|
||||||
D506D3E2161288BD0099FA65 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */; };
|
D506D3E2161288BD0099FA65 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */; };
|
||||||
D51DC73614581D4E00E3D761 /* itemframe.png in Resources */ = {isa = PBXBuildFile; fileRef = D51DC73514581D4E00E3D761 /* itemframe.png */; };
|
D51DC73614581D4E00E3D761 /* itemframe.png in Resources */ = {isa = PBXBuildFile; fileRef = D51DC73514581D4E00E3D761 /* itemframe.png */; };
|
||||||
D51DC74314592B8B00E3D761 /* PVRTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = D51DC74214592B8A00E3D761 /* PVRTexture.m */; };
|
D51DC74314592B8B00E3D761 /* PVRTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = D51DC74214592B8A00E3D761 /* PVRTexture.m */; };
|
||||||
@@ -1181,19 +1179,8 @@
|
|||||||
F99F0FAD2F8436CE00F2B29A /* FoliageColor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FAB2F8436CE00F2B29A /* FoliageColor.cpp */; };
|
F99F0FAD2F8436CE00F2B29A /* FoliageColor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FAB2F8436CE00F2B29A /* FoliageColor.cpp */; };
|
||||||
F99F0FAF2F8436EB00F2B29A /* Color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FAE2F8436EB00F2B29A /* Color.cpp */; };
|
F99F0FAF2F8436EB00F2B29A /* Color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FAE2F8436EB00F2B29A /* Color.cpp */; };
|
||||||
F99F0FB02F8436EB00F2B29A /* Color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FAE2F8436EB00F2B29A /* Color.cpp */; };
|
F99F0FB02F8436EB00F2B29A /* Color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FAE2F8436EB00F2B29A /* Color.cpp */; };
|
||||||
F9E5A772300E7A8700164066 /* LevelConstants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A771300E7A8700164066 /* LevelConstants.cpp */; };
|
BEEF202614CFF670005F0002 /* Lighting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BEEF202614CFF670005F0001 /* Lighting.cpp */; };
|
||||||
F9E5A775300E7AB700164066 /* CommandManager.hpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A773300E7AB700164066 /* CommandManager.hpp */; };
|
BEEF202614CFF670005F0003 /* Lighting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BEEF202614CFF670005F0001 /* Lighting.cpp */; };
|
||||||
F9E5A776300E7AB700164066 /* CommandManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A774300E7AB700164066 /* CommandManager.cpp */; };
|
|
||||||
F9E5A779300E7AD500164066 /* CommandBan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A777300E7AD500164066 /* CommandBan.cpp */; };
|
|
||||||
F9E5A77A300E7AD500164066 /* CommandBan.hpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A778300E7AD500164066 /* CommandBan.hpp */; };
|
|
||||||
F9E5A77D300E7AF400164066 /* CommandHelp.hpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A77B300E7AF400164066 /* CommandHelp.hpp */; };
|
|
||||||
F9E5A77E300E7AF400164066 /* CommandHelp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A77C300E7AF400164066 /* CommandHelp.cpp */; };
|
|
||||||
F9E5A783300E7B0B00164066 /* CommandKick.hpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A77F300E7B0A00164066 /* CommandKick.hpp */; };
|
|
||||||
F9E5A784300E7B0B00164066 /* CommandOp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A780300E7B0A00164066 /* CommandOp.cpp */; };
|
|
||||||
F9E5A785300E7B0B00164066 /* CommandKick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A781300E7B0B00164066 /* CommandKick.cpp */; };
|
|
||||||
F9E5A786300E7B0B00164066 /* CommandOp.hpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A782300E7B0B00164066 /* CommandOp.hpp */; };
|
|
||||||
F9E5A789300E7B3400164066 /* Command.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A787300E7B3400164066 /* Command.cpp */; };
|
|
||||||
F9E5A78A300E7B3400164066 /* Command.hpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A788300E7B3400164066 /* Command.hpp */; };
|
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
@@ -1261,7 +1248,6 @@
|
|||||||
9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CreateNewWorld_iphone.xib; path = minecraftpe/dialogs/CreateNewWorld_iphone.xib; sourceTree = "<group>"; };
|
9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CreateNewWorld_iphone.xib; path = minecraftpe/dialogs/CreateNewWorld_iphone.xib; sourceTree = "<group>"; };
|
||||||
9D293CEA160720D6000305C8 /* worldname_iphone5_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = worldname_iphone5_3.png; sourceTree = "<group>"; };
|
9D293CEA160720D6000305C8 /* worldname_iphone5_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = worldname_iphone5_3.png; sourceTree = "<group>"; };
|
||||||
9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
|
9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
|
||||||
BEEF202614CFF670005F0001 /* Lighting.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Lighting.cpp; sourceTree = "<group>"; };
|
|
||||||
D51A8B01146A200000E5D720 /* minecraftpedemo-info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "minecraftpedemo-info.plist"; sourceTree = "<group>"; };
|
D51A8B01146A200000E5D720 /* minecraftpedemo-info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "minecraftpedemo-info.plist"; sourceTree = "<group>"; };
|
||||||
D51DC73514581D4E00E3D761 /* itemframe.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = itemframe.png; sourceTree = "<group>"; };
|
D51DC73514581D4E00E3D761 /* itemframe.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = itemframe.png; sourceTree = "<group>"; };
|
||||||
D51DC74114592B8A00E3D761 /* PVRTexture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVRTexture.h; sourceTree = "<group>"; };
|
D51DC74114592B8A00E3D761 /* PVRTexture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVRTexture.h; sourceTree = "<group>"; };
|
||||||
@@ -2482,19 +2468,7 @@
|
|||||||
F99F0FA82F84369F00F2B29A /* GrassColor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = GrassColor.cpp; sourceTree = "<group>"; };
|
F99F0FA82F84369F00F2B29A /* GrassColor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = GrassColor.cpp; sourceTree = "<group>"; };
|
||||||
F99F0FAB2F8436CE00F2B29A /* FoliageColor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FoliageColor.cpp; sourceTree = "<group>"; };
|
F99F0FAB2F8436CE00F2B29A /* FoliageColor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FoliageColor.cpp; sourceTree = "<group>"; };
|
||||||
F99F0FAE2F8436EB00F2B29A /* Color.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Color.cpp; sourceTree = "<group>"; };
|
F99F0FAE2F8436EB00F2B29A /* Color.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Color.cpp; sourceTree = "<group>"; };
|
||||||
F9E5A771300E7A8700164066 /* LevelConstants.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LevelConstants.cpp; path = ../../src/world/level/LevelConstants.cpp; sourceTree = "<group>"; };
|
BEEF202614CFF670005F0001 /* Lighting.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Lighting.cpp; path = Lighting.cpp; sourceTree = "<group>"; };
|
||||||
F9E5A773300E7AB700164066 /* CommandManager.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = CommandManager.hpp; path = ../../src/commands/CommandManager.hpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A774300E7AB700164066 /* CommandManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CommandManager.cpp; path = ../../src/commands/CommandManager.cpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A777300E7AD500164066 /* CommandBan.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CommandBan.cpp; path = ../../src/commands/CommandBan.cpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A778300E7AD500164066 /* CommandBan.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = CommandBan.hpp; path = ../../src/commands/CommandBan.hpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A77B300E7AF400164066 /* CommandHelp.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = CommandHelp.hpp; path = ../../src/commands/CommandHelp.hpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A77C300E7AF400164066 /* CommandHelp.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CommandHelp.cpp; path = ../../src/commands/CommandHelp.cpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A77F300E7B0A00164066 /* CommandKick.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = CommandKick.hpp; path = ../../src/commands/CommandKick.hpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A780300E7B0A00164066 /* CommandOp.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CommandOp.cpp; path = ../../src/commands/CommandOp.cpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A781300E7B0B00164066 /* CommandKick.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CommandKick.cpp; path = ../../src/commands/CommandKick.cpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A782300E7B0B00164066 /* CommandOp.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = CommandOp.hpp; path = ../../src/commands/CommandOp.hpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A787300E7B3400164066 /* Command.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Command.cpp; path = ../../src/commands/Command.cpp; sourceTree = "<group>"; };
|
|
||||||
F9E5A788300E7B3400164066 /* Command.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = Command.hpp; path = ../../src/commands/Command.hpp; sourceTree = "<group>"; };
|
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@@ -4345,19 +4319,6 @@
|
|||||||
D5CF9C37144C225000E4244F = {
|
D5CF9C37144C225000E4244F = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
F9E5A788300E7B3400164066 /* Command.hpp */,
|
|
||||||
F9E5A787300E7B3400164066 /* Command.cpp */,
|
|
||||||
F9E5A77F300E7B0A00164066 /* CommandKick.hpp */,
|
|
||||||
F9E5A781300E7B0B00164066 /* CommandKick.cpp */,
|
|
||||||
F9E5A782300E7B0B00164066 /* CommandOp.hpp */,
|
|
||||||
F9E5A780300E7B0A00164066 /* CommandOp.cpp */,
|
|
||||||
F9E5A77B300E7AF400164066 /* CommandHelp.hpp */,
|
|
||||||
F9E5A77C300E7AF400164066 /* CommandHelp.cpp */,
|
|
||||||
F9E5A778300E7AD500164066 /* CommandBan.hpp */,
|
|
||||||
F9E5A777300E7AD500164066 /* CommandBan.cpp */,
|
|
||||||
F9E5A773300E7AB700164066 /* CommandManager.hpp */,
|
|
||||||
F9E5A774300E7AB700164066 /* CommandManager.cpp */,
|
|
||||||
F9E5A771300E7A8700164066 /* LevelConstants.cpp */,
|
|
||||||
F99D344D2F7372A100DC153E /* Launch Screen.storyboard */,
|
F99D344D2F7372A100DC153E /* Launch Screen.storyboard */,
|
||||||
D5E1BA9A1451C8A0007DCC4F /* Default@2x.png */,
|
D5E1BA9A1451C8A0007DCC4F /* Default@2x.png */,
|
||||||
9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */,
|
9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */,
|
||||||
@@ -5490,19 +5451,6 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
F9E5A789300E7B3400164066 /* Command.cpp in Sources */,
|
|
||||||
F9E5A78A300E7B3400164066 /* Command.hpp in Sources */,
|
|
||||||
F9E5A783300E7B0B00164066 /* CommandKick.hpp in Sources */,
|
|
||||||
F9E5A784300E7B0B00164066 /* CommandOp.cpp in Sources */,
|
|
||||||
F9E5A785300E7B0B00164066 /* CommandKick.cpp in Sources */,
|
|
||||||
F9E5A786300E7B0B00164066 /* CommandOp.hpp in Sources */,
|
|
||||||
F9E5A77D300E7AF400164066 /* CommandHelp.hpp in Sources */,
|
|
||||||
F9E5A77E300E7AF400164066 /* CommandHelp.cpp in Sources */,
|
|
||||||
F9E5A779300E7AD500164066 /* CommandBan.cpp in Sources */,
|
|
||||||
F9E5A77A300E7AD500164066 /* CommandBan.hpp in Sources */,
|
|
||||||
F9E5A775300E7AB700164066 /* CommandManager.hpp in Sources */,
|
|
||||||
F9E5A776300E7AB700164066 /* CommandManager.cpp in Sources */,
|
|
||||||
F9E5A772300E7A8700164066 /* LevelConstants.cpp in Sources */,
|
|
||||||
F912B8CF2F6C3D5200BC60DF /* TextBox.h in Sources */,
|
F912B8CF2F6C3D5200BC60DF /* TextBox.h in Sources */,
|
||||||
D5CF9C57144C225000E4244F /* main.mm in Sources */,
|
D5CF9C57144C225000E4244F /* main.mm in Sources */,
|
||||||
D5CF9C5B144C225000E4244F /* minecraftpeAppDelegate.mm in Sources */,
|
D5CF9C5B144C225000E4244F /* minecraftpeAppDelegate.mm in Sources */,
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ RakNet::TimeUS GetTimeUS_Windows( void )
|
|||||||
#if _MSC_VER >= 1400 && defined (_M_X64)
|
#if _MSC_VER >= 1400 && defined (_M_X64)
|
||||||
GetProcessAffinityMask(mProc, (PDWORD_PTR)&mProcMask, (PDWORD_PTR)&mSysMask);
|
GetProcessAffinityMask(mProc, (PDWORD_PTR)&mProcMask, (PDWORD_PTR)&mSysMask);
|
||||||
#else
|
#else
|
||||||
GetProcessAffinityMask(mProc, (PDWORD_PTR)&mProcMask, (PDWORD_PTR)&mSysMask);
|
GetProcessAffinityMask(mProc, &mProcMask, &mSysMask);
|
||||||
#endif
|
#endif
|
||||||
mThread = GetCurrentThread();
|
mThread = GetCurrentThread();
|
||||||
|
|
||||||
|
|||||||
@@ -115,10 +115,11 @@ void NinecraftApp::init()
|
|||||||
LOGI("This: %p\n", this);
|
LOGI("This: %p\n", this);
|
||||||
screenChooser.setScreen(SCREEN_STARTMENU);
|
screenChooser.setScreen(SCREEN_STARTMENU);
|
||||||
|
|
||||||
if (options.getBooleanValue(OPTIONS_FIRST_LAUNCH)) {
|
// Disabled: Show username screen on first launch
|
||||||
options.toggle(OPTIONS_FIRST_LAUNCH);
|
// if (options.getBooleanValue(OPTIONS_FIRST_LAUNCH)) {
|
||||||
setScreen(new UsernameScreen());
|
// options.toggle(OPTIONS_FIRST_LAUNCH);
|
||||||
}
|
// setScreen(new UsernameScreen());
|
||||||
|
// }
|
||||||
#else
|
#else
|
||||||
hostMultiplayer();
|
hostMultiplayer();
|
||||||
#endif
|
#endif
|
||||||
@@ -136,7 +137,7 @@ void NinecraftApp::teardown()
|
|||||||
Recipes ::teardownRecipes();
|
Recipes ::teardownRecipes();
|
||||||
TileEntity::teardownTileEntities();
|
TileEntity::teardownTileEntities();
|
||||||
#endif
|
#endif
|
||||||
#if defined(WIN32) && !defined(STANDALONE_SERVER)
|
#ifdef WIN32
|
||||||
ItemRenderer::teardown_static();
|
ItemRenderer::teardown_static();
|
||||||
if (EntityTileRenderer::instance != NULL) {
|
if (EntityTileRenderer::instance != NULL) {
|
||||||
delete EntityTileRenderer::instance;
|
delete EntityTileRenderer::instance;
|
||||||
|
|||||||
@@ -4,11 +4,12 @@ namespace Common {
|
|||||||
|
|
||||||
std::string getGameVersionString(const std::string& versionSuffix /* = "" */)
|
std::string getGameVersionString(const std::string& versionSuffix /* = "" */)
|
||||||
{
|
{
|
||||||
std::string result = std::string("v0.1.0 (forked from v0.6.1 alpha)") + versionSuffix;
|
std::string result = std::string("v0.6.1") + versionSuffix;
|
||||||
// append 64-bit port marker only on Android 64‑bit targets
|
// append 64-bit port marker only on Android 64‑bit targets
|
||||||
#if defined(ANDROID) && (defined(__aarch64__) || defined(__x86_64__))
|
#if defined(ANDROID) && (defined(__aarch64__) || defined(__x86_64__))
|
||||||
result += " (64-bit)";
|
result += " (64-bit port)";
|
||||||
#endif
|
#endif
|
||||||
|
result += " alpha";
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
#include "Options.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 "commands/CommandManager.hpp"
|
|
||||||
#include "platform/input/Keyboard.h"
|
#include "platform/input/Keyboard.h"
|
||||||
#include "world/item/Item.h"
|
#include "world/item/Item.h"
|
||||||
#include "world/item/ItemInstance.h"
|
#include "world/item/ItemInstance.h"
|
||||||
@@ -92,14 +91,10 @@
|
|||||||
#include "../network/command/CommandServer.h"
|
#include "../network/command/CommandServer.h"
|
||||||
#include "gamemode/CreatorMode.h"
|
#include "gamemode/CreatorMode.h"
|
||||||
|
|
||||||
|
|
||||||
#ifndef STANDALONE_SERVER
|
|
||||||
#include "../world/level/GrassColor.h"
|
#include "../world/level/GrassColor.h"
|
||||||
#include "renderer/LevelRenderer.h"
|
#include "renderer/LevelRenderer.h"
|
||||||
#include "particle/ParticleEngine.h"
|
#include "particle/ParticleEngine.h"
|
||||||
#endif
|
|
||||||
#include "../world/level/Level.h"
|
#include "../world/level/Level.h"
|
||||||
|
|
||||||
static void checkGlError(const char* tag) {
|
static void checkGlError(const char* tag) {
|
||||||
#ifdef GLDEBUG
|
#ifdef GLDEBUG
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -185,8 +180,7 @@ Minecraft::Minecraft() :
|
|||||||
_powerVr(false),
|
_powerVr(false),
|
||||||
commandPort(4711),
|
commandPort(4711),
|
||||||
reserved_d1(0),reserved_d2(0),
|
reserved_d1(0),reserved_d2(0),
|
||||||
reserved_f1(0),reserved_f2(0), options(this),
|
reserved_f1(0),reserved_f2(0), options(this)
|
||||||
m_commandManager()
|
|
||||||
{
|
{
|
||||||
//#ifdef ANDROID
|
//#ifdef ANDROID
|
||||||
|
|
||||||
@@ -267,10 +261,9 @@ void Minecraft::selectLevel( const std::string& levelId, const std::string& leve
|
|||||||
|
|
||||||
void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) {
|
void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) {
|
||||||
cameraTargetPlayer = NULL;
|
cameraTargetPlayer = NULL;
|
||||||
|
|
||||||
if (level != NULL) {
|
|
||||||
LOGI("Seed is %ld\n", level->getSeed());
|
LOGI("Seed is %ld\n", level->getSeed());
|
||||||
|
|
||||||
|
if (level != NULL) {
|
||||||
level->raknetInstance = raknetInstance;
|
level->raknetInstance = raknetInstance;
|
||||||
gameMode->initLevel(level);
|
gameMode->initLevel(level);
|
||||||
|
|
||||||
@@ -287,13 +280,8 @@ void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, Loc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this->level = level;
|
this->level = level;
|
||||||
// So uhhh
|
|
||||||
std::string op = options.getStringValue(OPTIONS_USERNAME);
|
|
||||||
std::transform(op.begin(), op.end(), op.begin(), ::tolower);
|
|
||||||
|
|
||||||
level->ops.emplace(op);
|
|
||||||
_hasSignaledGeneratingLevelFinished = false;
|
_hasSignaledGeneratingLevelFinished = false;
|
||||||
#if defined(STANDALONE_SERVER) || defined(PLATFORM_WEB)
|
#ifdef STANDALONE_SERVER
|
||||||
const bool threadedLevelCreation = false;
|
const bool threadedLevelCreation = false;
|
||||||
#else
|
#else
|
||||||
const bool threadedLevelCreation = true;
|
const bool threadedLevelCreation = true;
|
||||||
@@ -375,10 +363,10 @@ void Minecraft::prepareLevel(const std::string& title) {
|
|||||||
if (!level->isNew())
|
if (!level->isNew())
|
||||||
level->setUpdateLights(false);
|
level->setUpdateLights(false);
|
||||||
|
|
||||||
int Max = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH;
|
int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH;
|
||||||
int pp = 0;
|
int pp = 0;
|
||||||
for (int x = 8; x < (LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_WIDTH); x += LevelConstants::CHUNK_WIDTH) {
|
for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) {
|
||||||
for (int z = 8; z < (LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_WIDTH); z += LevelConstants::CHUNK_WIDTH) {
|
for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) {
|
||||||
progressStagePercentage = 100 * pp++ / Max;
|
progressStagePercentage = 100 * pp++ / Max;
|
||||||
//printf("level generation progress %d\n", progressStagePercentage);
|
//printf("level generation progress %d\n", progressStagePercentage);
|
||||||
B.start();
|
B.start();
|
||||||
@@ -395,9 +383,9 @@ void Minecraft::prepareLevel(const std::string& title) {
|
|||||||
level->setUpdateLights(true);
|
level->setUpdateLights(true);
|
||||||
|
|
||||||
C.start();
|
C.start();
|
||||||
for (int x = 0; x < LevelConstants::CHUNK_CACHE_WIDTH; x++)
|
for (int x = 0; x < CHUNK_CACHE_WIDTH; x++)
|
||||||
{
|
{
|
||||||
for (int z = 0; z < LevelConstants::CHUNK_CACHE_WIDTH; z++)
|
for (int z = 0; z < CHUNK_CACHE_WIDTH; z++)
|
||||||
{
|
{
|
||||||
LevelChunk* chunk = level->getChunk(x, z);
|
LevelChunk* chunk = level->getChunk(x, z);
|
||||||
if (chunk && !chunk->createdFromSave)
|
if (chunk && !chunk->createdFromSave)
|
||||||
@@ -516,7 +504,7 @@ void Minecraft::tick(int nTick, int maxTick) {
|
|||||||
if (missTime > 0) missTime--;
|
if (missTime > 0) missTime--;
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
if (!screen && player) {
|
if (!screen && player) {
|
||||||
if (player->hasDied()) {
|
if (player->health <= 0) {
|
||||||
setScreen(new DeathScreen());
|
setScreen(new DeathScreen());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -745,21 +733,6 @@ void Minecraft::tickInput() {
|
|||||||
options.toggle(OPTIONS_RENDER_DEBUG);
|
options.toggle(OPTIONS_RENDER_DEBUG);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: replace it with client /give command :face_vomiting:
|
|
||||||
// if (key == Keyboard::KEY_F4) {
|
|
||||||
// player->inventory->add(new ItemInstance(Tile::redBrick));
|
|
||||||
// player->inventory->add(new ItemInstance(Item::ironIngot, 64));
|
|
||||||
// player->inventory->add(new ItemInstance(Item::ironIngot, 34));
|
|
||||||
// player->inventory->add(new ItemInstance(Tile::stonecutterBench));
|
|
||||||
// player->inventory->add(new ItemInstance(Tile::workBench));
|
|
||||||
// player->inventory->add(new ItemInstance(Tile::furnace));
|
|
||||||
// player->inventory->add(new ItemInstance(Tile::wood, 54));
|
|
||||||
// player->inventory->add(new ItemInstance(Item::stick, 14));
|
|
||||||
// player->inventory->add(new ItemInstance(Item::coal, 31));
|
|
||||||
// player->inventory->add(new ItemInstance(Tile::sand, 6));
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (key == Keyboard::KEY_F5) {
|
if (key == Keyboard::KEY_F5) {
|
||||||
options.toggle(OPTIONS_THIRD_PERSON_VIEW);
|
options.toggle(OPTIONS_THIRD_PERSON_VIEW);
|
||||||
/*
|
/*
|
||||||
@@ -884,7 +857,6 @@ void Minecraft::tickInput() {
|
|||||||
for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i)
|
for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i)
|
||||||
level->tick();
|
level->tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -910,9 +882,6 @@ void Minecraft::tickInput() {
|
|||||||
handleBuildAction(&bai);
|
handleBuildAction(&bai);
|
||||||
} else {
|
} else {
|
||||||
gameMode->stopDestroyBlock();
|
gameMode->stopDestroyBlock();
|
||||||
if (player && player->isUsingItem()) {
|
|
||||||
gameMode->releaseUsingItem(player);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Desktop: left mouse = destroy/attack
|
// Desktop: left mouse = destroy/attack
|
||||||
@@ -1156,6 +1125,9 @@ bool Minecraft::useTouchscreen() {
|
|||||||
#elif defined(RPI)
|
#elif defined(RPI)
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
if (options.getBooleanValue(OPTIONS_TOUCH_OVERRIDE)) {
|
||||||
|
return options.getBooleanValue(OPTIONS_USE_TOUCHSCREEN);
|
||||||
|
}
|
||||||
return options.getBooleanValue(OPTIONS_USE_TOUCHSCREEN) && !_supportsNonTouchscreen;
|
return options.getBooleanValue(OPTIONS_USE_TOUCHSCREEN) && !_supportsNonTouchscreen;
|
||||||
}
|
}
|
||||||
bool Minecraft::supportNonTouchScreen() {
|
bool Minecraft::supportNonTouchScreen() {
|
||||||
@@ -1163,7 +1135,6 @@ bool Minecraft::supportNonTouchScreen() {
|
|||||||
}
|
}
|
||||||
void Minecraft::init()
|
void Minecraft::init()
|
||||||
{
|
{
|
||||||
LevelChunk::ChunkBlockCount = LevelConstants::CHUNK_BLOCK_COUNT;
|
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
checkGlError("Init enter");
|
checkGlError("Init enter");
|
||||||
|
|
||||||
@@ -1249,13 +1220,14 @@ void Minecraft::setSize(int w, int h) {
|
|||||||
|
|
||||||
// determine gui scale, optionally overriding auto
|
// determine gui scale, optionally overriding auto
|
||||||
if (guiScale != 0) {
|
if (guiScale != 0) {
|
||||||
// manual selection: 1->small, 2->medium, 3->large, 4->larger, 5->largest
|
// manual selection: 1->tiny, 2->small, 3->medium, 4->large, 5->larger, 6->largest
|
||||||
switch (guiScale) {
|
switch (guiScale) {
|
||||||
case 1: Gui::GuiScale = 2.0f; break;
|
case 1: Gui::GuiScale = 1.0f; break;
|
||||||
case 2: Gui::GuiScale = 3.0f; break;
|
case 2: Gui::GuiScale = 2.0f; break;
|
||||||
case 3: Gui::GuiScale = 4.0f; break;
|
case 3: Gui::GuiScale = 3.0f; break;
|
||||||
case 4: Gui::GuiScale = 5.0f; break;
|
case 4: Gui::GuiScale = 4.0f; break;
|
||||||
case 5: Gui::GuiScale = 6.0f; break;
|
case 5: Gui::GuiScale = 5.0f; break;
|
||||||
|
case 6: Gui::GuiScale = 6.0f; break;
|
||||||
default: Gui::GuiScale = 1.0f; break; // auto
|
default: Gui::GuiScale = 1.0f; break; // auto
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1315,16 +1287,15 @@ void Minecraft::setSize(int w, int h) {
|
|||||||
|
|
||||||
void Minecraft::reloadOptions() {
|
void Minecraft::reloadOptions() {
|
||||||
options.save();
|
options.save();
|
||||||
bool wasTouchscreen = options.getBooleanValue(OPTIONS_USE_TOUCHSCREEN);
|
|
||||||
options.set(OPTIONS_USE_TOUCHSCREEN, useTouchscreen());
|
|
||||||
options.save();
|
|
||||||
|
|
||||||
if ((wasTouchscreen != useTouchscreen()) || (inputHolder == 0))
|
bool useTouch = useTouchscreen();
|
||||||
_reloadInput();
|
_reloadInput();
|
||||||
|
|
||||||
|
gui.refreshTouchState();
|
||||||
|
|
||||||
// user->name = options.username;
|
// user->name = options.username;
|
||||||
|
|
||||||
LOGI("Reloading-options\n");
|
LOGI("Reloading-options (touch=%d)\n", useTouch);
|
||||||
|
|
||||||
// @todo @fix Android and iOS behaves a bit differently when leaving
|
// @todo @fix Android and iOS behaves a bit differently when leaving
|
||||||
// an options screen (Android recreates OpenGL surface)
|
// an options screen (Android recreates OpenGL surface)
|
||||||
@@ -1402,8 +1373,11 @@ bool Minecraft::joinMultiplayerFromString( const std::string& server )
|
|||||||
ip = server;
|
ip = server;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("%s \n", port.c_str());
|
||||||
|
|
||||||
if (isLookingForMultiplayer && netCallback) {
|
if (isLookingForMultiplayer && netCallback) {
|
||||||
isLookingForMultiplayer = false;
|
isLookingForMultiplayer = false;
|
||||||
|
printf("test");
|
||||||
int portNum = atoi(port.c_str());
|
int portNum = atoi(port.c_str());
|
||||||
return raknetInstance->connect(ip.c_str(), portNum);
|
return raknetInstance->connect(ip.c_str(), portNum);
|
||||||
}
|
}
|
||||||
@@ -1711,11 +1685,3 @@ void Minecraft::optionUpdated(OptionId option, int value ) {
|
|||||||
setSize(width, height);
|
setSize(width, height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Minecraft::addMessage(const std::string& msg) {
|
|
||||||
#ifndef STANDALONE_SERVER
|
|
||||||
gui.addMessage(msg);
|
|
||||||
#else
|
|
||||||
LOGI("%s \n", msg.c_str());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
#define NET_MINECRAFT_CLIENT__Minecraft_H__
|
#define NET_MINECRAFT_CLIENT__Minecraft_H__
|
||||||
|
|
||||||
#include "Options.h"
|
#include "Options.h"
|
||||||
#include "commands/CommandManager.hpp"
|
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
#include "MouseHandler.h"
|
#include "MouseHandler.h"
|
||||||
#include "gui/Gui.h"
|
#include "gui/Gui.h"
|
||||||
@@ -129,17 +128,11 @@ public:
|
|||||||
void optionUpdated(OptionId option, bool value);
|
void optionUpdated(OptionId option, bool value);
|
||||||
void optionUpdated(OptionId option, float value);
|
void optionUpdated(OptionId option, float value);
|
||||||
void optionUpdated(OptionId option, int value);
|
void optionUpdated(OptionId option, int value);
|
||||||
|
|
||||||
int getTicks() { return ticks; }
|
|
||||||
|
|
||||||
void addMessage(const std::string& msg);
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
bool _isSuperFast;
|
bool _isSuperFast;
|
||||||
bool isSuperFast() { return _isSuperFast; }
|
bool isSuperFast() { return _isSuperFast; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CommandManager& commandManager() { return m_commandManager; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void _levelGenerated();
|
void _levelGenerated();
|
||||||
|
|
||||||
@@ -212,7 +205,6 @@ public:
|
|||||||
std::string externalCacheStoragePath;
|
std::string externalCacheStoragePath;
|
||||||
protected:
|
protected:
|
||||||
Timer timer;
|
Timer timer;
|
||||||
|
|
||||||
// @note @attn @warn: this is dangerous as fuck!
|
// @note @attn @warn: this is dangerous as fuck!
|
||||||
volatile bool isGeneratingLevel;
|
volatile bool isGeneratingLevel;
|
||||||
bool _hasSignaledGeneratingLevelFinished;
|
bool _hasSignaledGeneratingLevelFinished;
|
||||||
@@ -241,8 +233,6 @@ private:
|
|||||||
|
|
||||||
PerfRenderer* _perfRenderer;
|
PerfRenderer* _perfRenderer;
|
||||||
CommandServer* _commandServer;
|
CommandServer* _commandServer;
|
||||||
|
|
||||||
CommandManager m_commandManager;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/
|
#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/
|
||||||
|
|||||||
@@ -22,3 +22,5 @@ const char* OptionStrings::Controls_AutoJump = "ctrl_autojump";
|
|||||||
|
|
||||||
const char* OptionStrings::Game_DifficultyLevel = "game_difficulty";
|
const char* OptionStrings::Game_DifficultyLevel = "game_difficulty";
|
||||||
|
|
||||||
|
const char* OptionStrings::Tweaks_TouchOverride = "options.touchOverride";
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ public:
|
|||||||
|
|
||||||
static const char* Tweaks_Sprint;
|
static const char* Tweaks_Sprint;
|
||||||
static const char* Tweaks_BarOnTop;
|
static const char* Tweaks_BarOnTop;
|
||||||
|
static const char* Tweaks_TouchOverride;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -27,14 +27,14 @@ OptionBool autoJump("autoJump", true);
|
|||||||
OptionFloat flySpeed("flySpeed", 1.f);
|
OptionFloat flySpeed("flySpeed", 1.f);
|
||||||
OptionFloat cameraSpeed("cameraSpeed", 1.f);
|
OptionFloat cameraSpeed("cameraSpeed", 1.f);
|
||||||
|
|
||||||
OptionInt guiScale("guiScale", 0, 0, 5);
|
OptionInt guiScale("guiScale", 0, 0, 6);
|
||||||
|
|
||||||
OptionString skin("skin", "Default");
|
OptionString skin("skin", "Default");
|
||||||
|
|
||||||
#ifdef RPI
|
#ifdef RPI
|
||||||
OptionString username("username", "StevePi");
|
OptionString username("username", "test");
|
||||||
#else
|
#else
|
||||||
OptionString username("username", "Steve");
|
OptionString username("username", "test");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
OptionBool destroyVibration("destroyVibration", true);
|
OptionBool destroyVibration("destroyVibration", true);
|
||||||
@@ -64,14 +64,20 @@ OptionBool useVignette("useVignette", true);
|
|||||||
|
|
||||||
OptionBool useTouchscreen("useTouchscreen", true);
|
OptionBool useTouchscreen("useTouchscreen", true);
|
||||||
|
|
||||||
|
OptionBool touchOverride("touchOverride", false);
|
||||||
|
|
||||||
OptionBool serverVisible("servervisible", true);
|
OptionBool serverVisible("servervisible", true);
|
||||||
OptionBool foliageTint("foliagetint", false);
|
|
||||||
|
OptionBool foliageTint("foliagetint", true);
|
||||||
|
|
||||||
OptionInt fogType("fogType", 0, 0, 2);
|
OptionInt fogType("fogType", 0, 0, 2);
|
||||||
|
|
||||||
OptionBool javaHud("javaHud", false);
|
OptionBool javaHud("javaHud", false);
|
||||||
|
|
||||||
OptionBool betaSky("betaSky", false);
|
OptionBool betaSky("betaSky", false);
|
||||||
|
|
||||||
OptionBool tintedSide("tintedSide", false);
|
OptionBool tintedSide("tintedSide", false);
|
||||||
|
|
||||||
OptionBool blockOutline("blockOutline", false);
|
OptionBool blockOutline("blockOutline", false);
|
||||||
|
|
||||||
OptionBool restoredAnims("restoredAnims", true);
|
OptionBool restoredAnims("restoredAnims", true);
|
||||||
@@ -169,6 +175,8 @@ void Options::initTable() {
|
|||||||
|
|
||||||
m_options[OPTIONS_RESTORED_ANIMS] = &restoredAnims;
|
m_options[OPTIONS_RESTORED_ANIMS] = &restoredAnims;
|
||||||
|
|
||||||
|
m_options[OPTIONS_TOUCH_OVERRIDE] = &touchOverride;
|
||||||
|
|
||||||
m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible;
|
m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible;
|
||||||
|
|
||||||
m_options[OPTIONS_MENU_STYLE] = &menuStyle;
|
m_options[OPTIONS_MENU_STYLE] = &menuStyle;
|
||||||
@@ -196,13 +204,16 @@ void Options::initTable() {
|
|||||||
m_options[OPTIONS_ALLOW_SPRINT] = &allowSprint;
|
m_options[OPTIONS_ALLOW_SPRINT] = &allowSprint;
|
||||||
m_options[OPTIONS_RPI_CURSOR] = &rpiCursor;
|
m_options[OPTIONS_RPI_CURSOR] = &rpiCursor;
|
||||||
m_options[OPTIONS_FOLIAGE_TINT] = &foliageTint;
|
m_options[OPTIONS_FOLIAGE_TINT] = &foliageTint;
|
||||||
|
|
||||||
// more options yay
|
// more options yay
|
||||||
m_options[OPTIONS_FOG_TYPE] = &fogType;
|
m_options[OPTIONS_FOG_TYPE] = &fogType;
|
||||||
|
|
||||||
m_options[OPTIONS_DEBUG_STYLE] = &debugStyle;
|
m_options[OPTIONS_DEBUG_STYLE] = &debugStyle;
|
||||||
|
|
||||||
m_options[OPTIONS_BETA_SKY] = &betaSky;
|
m_options[OPTIONS_BETA_SKY] = &betaSky;
|
||||||
|
|
||||||
m_options[OPTIONS_TINTED_SIDE] = &tintedSide;
|
m_options[OPTIONS_TINTED_SIDE] = &tintedSide;
|
||||||
|
|
||||||
m_options[OPTIONS_JAVA_HUD] = &javaHud;
|
m_options[OPTIONS_JAVA_HUD] = &javaHud;
|
||||||
|
|
||||||
m_options[OPTIONS_AUTOJUMP] = &autoJump;
|
m_options[OPTIONS_AUTOJUMP] = &autoJump;
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ enum OptionId {
|
|||||||
OPTIONS_FOG_TYPE,
|
OPTIONS_FOG_TYPE,
|
||||||
OPTIONS_JAVA_HUD,
|
OPTIONS_JAVA_HUD,
|
||||||
OPTIONS_RESTORED_ANIMS,
|
OPTIONS_RESTORED_ANIMS,
|
||||||
|
OPTIONS_TOUCH_OVERRIDE,
|
||||||
OPTIONS_TINTED_SIDE,
|
OPTIONS_TINTED_SIDE,
|
||||||
OPTIONS_BETA_SKY,
|
OPTIONS_BETA_SKY,
|
||||||
OPTIONS_BEAUTIFUL_SKY,
|
OPTIONS_BEAUTIFUL_SKY,
|
||||||
|
|||||||
@@ -90,12 +90,8 @@ bool GameMode::useItemOn(Player* player, Level* level, ItemInstance* item, int x
|
|||||||
float clickY = hit.y - y;
|
float clickY = hit.y - y;
|
||||||
float clickZ = hit.z - z;
|
float clickZ = hit.z - z;
|
||||||
if (level->isClientSide) {
|
if (level->isClientSide) {
|
||||||
LOGI("%f %f %f \n", player->x, player->y, player->z);
|
|
||||||
|
|
||||||
item = player->inventory->getSelected();
|
item = player->inventory->getSelected();
|
||||||
UseItemPacket packet(x, y, z, face, item, player->entityId, clickX, clickY, clickZ, player->x, player->y, player->z,
|
UseItemPacket packet(x, y, z, face, item, player->entityId, clickX, clickY, clickZ);
|
||||||
player->bb.x0, player->bb.y0, player->bb.z0, player->bb.x1, player->bb.y1, player->bb.z1);
|
|
||||||
|
|
||||||
minecraft->raknetInstance->send(packet);
|
minecraft->raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
int t = level->getTile(x, y, z);
|
int t = level->getTile(x, y, z);
|
||||||
@@ -121,8 +117,7 @@ bool GameMode::useItem( Player* player, Level* level, ItemInstance* item ) {
|
|||||||
|
|
||||||
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, player->x, player->y, player->z,
|
UseItemPacket packet(item, player->entityId, player->aimDirection);
|
||||||
player->bb.x0, player->bb.y0, player->bb.z0, player->bb.x1, player->bb.y1, player->bb.z1);
|
|
||||||
minecraft->raknetInstance->send(packet);
|
minecraft->raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
if (itemInstance != item || (itemInstance != NULL && itemInstance->count != oldCount)) {
|
if (itemInstance != item || (itemInstance != NULL && itemInstance->count != oldCount)) {
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ bool SurvivalMode::destroyBlock( int x, int y, int z, int face ) {
|
|||||||
minecraft->player->inventory->clearSlot(minecraft->player->inventory->selected);
|
minecraft->player->inventory->clearSlot(minecraft->player->inventory->selected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed && couldDestroy) {
|
if (changed && couldDestroy) {
|
||||||
ItemInstance instance(t, 1, data);
|
ItemInstance instance(t, 1, data);
|
||||||
Tile::tiles[t]->playerDestroy(minecraft->level, minecraft->player, x, y, z, data);
|
Tile::tiles[t]->playerDestroy(minecraft->level, minecraft->player, x, y, z, data);
|
||||||
|
|||||||
@@ -423,6 +423,10 @@ void Gui::inventoryUpdated() {
|
|||||||
_inventoryNeedsUpdate = true;
|
_inventoryNeedsUpdate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Gui::refreshTouchState() {
|
||||||
|
_openInventorySlot = minecraft->useTouchscreen();
|
||||||
|
}
|
||||||
|
|
||||||
void Gui::onGraphicsReset() {
|
void Gui::onGraphicsReset() {
|
||||||
inventoryUpdated();
|
inventoryUpdated();
|
||||||
}
|
}
|
||||||
@@ -755,6 +759,7 @@ void Gui::renderDebugInfo() {
|
|||||||
|
|
||||||
// Position
|
// Position
|
||||||
float px = p->x, py = p->y - p->heightOffset, pz = p->z;
|
float px = p->x, py = p->y - p->heightOffset, pz = p->z;
|
||||||
|
posTranslator.to(px, py, pz);
|
||||||
int bx = (int)floorf(px), by = (int)floorf(py), bz = (int)floorf(pz);
|
int bx = (int)floorf(px), by = (int)floorf(py), bz = (int)floorf(pz);
|
||||||
int cx = bx >> 4, cz = bz >> 4;
|
int cx = bx >> 4, cz = bz >> 4;
|
||||||
|
|
||||||
@@ -781,25 +786,6 @@ void Gui::renderDebugInfo() {
|
|||||||
long day = worldTime / Level::TICKS_PER_DAY;
|
long day = worldTime / Level::TICKS_PER_DAY;
|
||||||
long seed = lvl ? lvl->getSeed() : 0;
|
long seed = lvl ? lvl->getSeed() : 0;
|
||||||
|
|
||||||
// Block looking at
|
|
||||||
std::string CurrentTile = "Air";
|
|
||||||
if (minecraft->hitResult.type == TILE) {
|
|
||||||
int LookingX = minecraft->hitResult.x;
|
|
||||||
int LookingY = minecraft->hitResult.y;
|
|
||||||
int LookingZ = minecraft->hitResult.z;
|
|
||||||
|
|
||||||
int tileID = minecraft->level->getTile(LookingX, LookingY, LookingZ);
|
|
||||||
if (tileID > 0 && tileID < 256){
|
|
||||||
Tile* LookingTile = Tile::tiles[tileID];
|
|
||||||
if (LookingTile != NULL) {
|
|
||||||
CurrentTile = LookingTile->getDescriptionId();
|
|
||||||
} else {
|
|
||||||
CurrentTile = "Unknown Tile";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
CurrentTile = "Air";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Build lines (NULL entry = blank gap)
|
// Build lines (NULL entry = blank gap)
|
||||||
Font* font = minecraft->font;
|
Font* font = minecraft->font;
|
||||||
|
|
||||||
@@ -838,9 +824,6 @@ void Gui::renderDebugInfo() {
|
|||||||
|
|
||||||
sprintf(buf, "Biome: %s", biomeName);
|
sprintf(buf, "Biome: %s", biomeName);
|
||||||
drawString(font, buf, 2, 124, 0xE0E0E0);
|
drawString(font, buf, 2, 124, 0xE0E0E0);
|
||||||
|
|
||||||
sprintf(buf, "Looking at: %s", CurrentTile.c_str());
|
|
||||||
drawString(font, buf, 2, 134, 0xE0E0E0);
|
|
||||||
}
|
}
|
||||||
else if (minecraft->options.getIntValue(OPTIONS_DEBUG_STYLE) == 1){
|
else if (minecraft->options.getIntValue(OPTIONS_DEBUG_STYLE) == 1){
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ public:
|
|||||||
|
|
||||||
void onGraphicsReset();
|
void onGraphicsReset();
|
||||||
void inventoryUpdated();
|
void inventoryUpdated();
|
||||||
|
void refreshTouchState();
|
||||||
|
|
||||||
void setNowPlaying(const std::string& string);
|
void setNowPlaying(const std::string& string);
|
||||||
void displayClientMessage(const std::string& messageId);
|
void displayClientMessage(const std::string& messageId);
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ void GuiElementContainer::removeChild( GuiElement* element ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool GuiElementContainer::containsPointInChildren(int x, int y) const {
|
bool GuiElementContainer::containsPointInChildren(int x, int y) const {
|
||||||
for (auto it = children.begin(); it != children.end(); ++it) {
|
for (std::vector<GuiElement*>::const_iterator it = children.begin(); it != children.end(); ++it) {
|
||||||
GuiElement* child = *it;
|
GuiElement* child = *it;
|
||||||
if (child == NULL || !child->visible) continue;
|
if (child == NULL || !child->visible) continue;
|
||||||
if (child->pointInside(x, y)) return true;
|
if (child->pointInside(x, y)) return true;
|
||||||
|
|||||||
@@ -12,7 +12,18 @@
|
|||||||
#include "../../../platform/input/Mouse.h"
|
#include "../../../platform/input/Mouse.h"
|
||||||
#include "../../../util/Mth.h"
|
#include "../../../util/Mth.h"
|
||||||
|
|
||||||
OptionsGroup::OptionsGroup( std::string labelID ) {
|
OptionsGroup::OptionsGroup( std::string labelID )
|
||||||
|
: contentHeight(0),
|
||||||
|
scrollOffsetY(0.0f),
|
||||||
|
maxScrollOffsetY(0.0f),
|
||||||
|
trackingScrollGesture(false),
|
||||||
|
scrollingGesture(false),
|
||||||
|
touchDispatched(false),
|
||||||
|
dragStartX(0),
|
||||||
|
dragStartY(0),
|
||||||
|
lastDragY(0),
|
||||||
|
touchStartX(0),
|
||||||
|
touchStartY(0) {
|
||||||
label = I18n::get(labelID);
|
label = I18n::get(labelID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,7 +36,7 @@ void OptionsGroup::setupPositions() {
|
|||||||
const int contentStartY = y + labelHeight;
|
const int contentStartY = y + labelHeight;
|
||||||
|
|
||||||
// First we write the header and then we add the items
|
// First we write the header and then we add the items
|
||||||
for(auto it = children.begin(); it != children.end(); ++it) {
|
for(std::vector<GuiElement*>::iterator it = children.begin(); it != children.end(); ++it) {
|
||||||
(*it)->width = width - 5;
|
(*it)->width = width - 5;
|
||||||
|
|
||||||
(*it)->y = curY;
|
(*it)->y = curY;
|
||||||
|
|||||||
@@ -32,17 +32,17 @@ protected:
|
|||||||
void createKey(OptionId optId, Minecraft* minecraft);
|
void createKey(OptionId optId, Minecraft* minecraft);
|
||||||
|
|
||||||
std::string label;
|
std::string label;
|
||||||
int contentHeight = 0;
|
int contentHeight;
|
||||||
float scrollOffsetY = 0.f;
|
float scrollOffsetY;
|
||||||
float maxScrollOffsetY = 0.f;
|
float maxScrollOffsetY;
|
||||||
bool trackingScrollGesture = false;
|
bool trackingScrollGesture;
|
||||||
bool scrollingGesture = false;
|
bool scrollingGesture;
|
||||||
bool touchDispatched = false;
|
bool touchDispatched;
|
||||||
int dragStartX = 0;
|
int dragStartX;
|
||||||
int dragStartY = 0;
|
int dragStartY;
|
||||||
int lastDragY = 0;
|
int lastDragY;
|
||||||
int touchStartX = 0;
|
int touchStartX;
|
||||||
int touchStartY = 0;
|
int touchStartY;
|
||||||
static const int ScrollStartThreshold = 5;
|
static const int ScrollStartThreshold = 5;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -27,11 +27,12 @@ void OptionsItem::render( Minecraft* minecraft, int xm, int ym ) {
|
|||||||
std::string scaleText;
|
std::string scaleText;
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case 0: scaleText = I18n::get("options.guiScale.auto"); break;
|
case 0: scaleText = I18n::get("options.guiScale.auto"); break;
|
||||||
case 1: scaleText = I18n::get("options.guiScale.small"); break;
|
case 1: scaleText = I18n::get("options.guiScale.tiny"); break;
|
||||||
case 2: scaleText = I18n::get("options.guiScale.medium"); break;
|
case 2: scaleText = I18n::get("options.guiScale.small"); break;
|
||||||
case 3: scaleText = I18n::get("options.guiScale.large"); break;
|
case 3: scaleText = I18n::get("options.guiScale.medium"); break;
|
||||||
case 4: scaleText = I18n::get("options.guiScale.larger"); break;
|
case 4: scaleText = I18n::get("options.guiScale.large"); break;
|
||||||
case 5: scaleText = I18n::get("options.guiScale.largest"); break;
|
case 5: scaleText = I18n::get("options.guiScale.larger"); break;
|
||||||
|
case 6: scaleText = I18n::get("options.guiScale.largest"); break;
|
||||||
default: scaleText = I18n::get("options.guiScale.auto"); break;
|
default: scaleText = I18n::get("options.guiScale.auto"); break;
|
||||||
}
|
}
|
||||||
text += ": " + scaleText;
|
text += ": " + scaleText;
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ void ScrollingPane::render( int xm, int ym, float alpha ) {
|
|||||||
|
|
||||||
const float bxx = bbox.x - (fpx /*+ dx*alpha*/) + (nw.xf - nw.x);
|
const float bxx = bbox.x - (fpx /*+ dx*alpha*/) + (nw.xf - nw.x);
|
||||||
const float byy = bbox.y - (fpy /*+ dy*alpha*/) + (nw.yf - nw.y);
|
const float byy = bbox.y - (fpy /*+ dy*alpha*/) + (nw.yf - nw.y);
|
||||||
for (int y = nw.y; y <= se.y; ++y) {
|
for (int y = nw.y; y <= se.y; ++y)
|
||||||
for (int x = nw.x; x <= se.x; ++x) {
|
for (int x = nw.x; x <= se.x; ++x) {
|
||||||
int id = y * columns + x;
|
int id = y * columns + x;
|
||||||
if (y <0 || id < 0 || id >= numItems) continue; // @todo: break rather
|
if (y <0 || id < 0 || id >= numItems) continue; // @todo: break rather
|
||||||
@@ -221,7 +221,6 @@ void ScrollingPane::render( int xm, int ym, float alpha ) {
|
|||||||
|
|
||||||
itemsToRender.push_back(item);
|
itemsToRender.push_back(item);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
renderBatch(itemsToRender, alpha);
|
renderBatch(itemsToRender, alpha);
|
||||||
|
|
||||||
//if (isSet(SF_Scissor))
|
//if (isSet(SF_Scissor))
|
||||||
|
|||||||
@@ -329,10 +329,7 @@ bool ChestScreen::handleAddItem(FillingContainer* from, FillingContainer* to, in
|
|||||||
added = (takenItem.count != wantedCount);
|
added = (takenItem.count != wantedCount);
|
||||||
|
|
||||||
if (added) {
|
if (added) {
|
||||||
if (!minecraft->isCreativeMode()) {
|
|
||||||
item->count -= (wantedCount - takenItem.count);
|
item->count -= (wantedCount - takenItem.count);
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<int> changed;
|
std::vector<int> changed;
|
||||||
std::vector<const ItemInstance*> items = getItems(toPane);
|
std::vector<const ItemInstance*> items = getItems(toPane);
|
||||||
differ.getDiff(items, changed);
|
differ.getDiff(items, changed);
|
||||||
|
|||||||
@@ -6,9 +6,8 @@
|
|||||||
#include "../../../world/level/Level.h"
|
#include "../../../world/level/Level.h"
|
||||||
#include "../../../network/RakNetInstance.h"
|
#include "../../../network/RakNetInstance.h"
|
||||||
#include "../../../network/ServerSideNetworkHandler.h"
|
#include "../../../network/ServerSideNetworkHandler.h"
|
||||||
#include "../../../network/packet/MessagePacket.h"
|
#include "../../../network/packet/ChatPacket.h"
|
||||||
#include "../../../platform/log.h"
|
#include "../../../platform/log.h"
|
||||||
#include "util/StringUtils.h"
|
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
@@ -55,40 +54,141 @@ void ConsoleScreen::charPressed(char inputChar)
|
|||||||
_input += inputChar;
|
_input += inputChar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// execute: run _input as a command, print result, close screen
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
void ConsoleScreen::execute()
|
void ConsoleScreen::execute()
|
||||||
{
|
{
|
||||||
if (!minecraft->level) return;
|
|
||||||
|
|
||||||
if (_input.empty()) {
|
if (_input.empty()) {
|
||||||
return minecraft->setScreen(NULL);
|
minecraft->setScreen(NULL);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (minecraft->netCallback && !minecraft->raknetInstance->isServer()) {
|
if (_input[0] == '/') {
|
||||||
MessagePacket packet(_input.c_str());
|
// Command
|
||||||
minecraft->raknetInstance->send(&packet);
|
std::string result = processCommand(_input);
|
||||||
} else if (_input[0] == '/') {
|
if (!result.empty())
|
||||||
_input = Util::stringTrim(_input.substr(1));
|
minecraft->gui.addMessage(result);
|
||||||
|
} else {
|
||||||
std::istringstream iss(
|
// Chat message: <name> message
|
||||||
minecraft->commandManager().execute(*minecraft, *minecraft->player, _input)
|
std::string msg = std::string("<") + minecraft->player->name + "> " + _input;
|
||||||
);
|
if (minecraft->netCallback && minecraft->raknetInstance->isServer()) {
|
||||||
|
// Hosting a LAN game: displayGameMessage shows locally + broadcasts MessagePacket to clients
|
||||||
for (std::string line; std::getline(iss, line);) {
|
static_cast<ServerSideNetworkHandler*>(minecraft->netCallback)->displayGameMessage(msg);
|
||||||
minecraft->gui.addMessage(line);
|
} else if (minecraft->netCallback) {
|
||||||
|
// Connected client: send ChatPacket to server; server echoes it back as MessagePacket
|
||||||
|
ChatPacket chatPkt(msg);
|
||||||
|
minecraft->raknetInstance->send(chatPkt);
|
||||||
|
} else {
|
||||||
|
// Singleplayer: show locally only
|
||||||
|
minecraft->gui.addMessage(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if (minecraft->raknetInstance->isServer()) {
|
|
||||||
MessagePacket packet(_input.c_str());
|
|
||||||
minecraft->raknetInstance->send(&packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
minecraft->gui.addMessage("<" + minecraft->player->name + "> " + _input);
|
|
||||||
}
|
|
||||||
|
|
||||||
minecraft->setScreen(NULL);
|
minecraft->setScreen(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// processCommand
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
static std::string trim(const std::string& s) {
|
||||||
|
size_t a = s.find_first_not_of(" \t");
|
||||||
|
if (a == std::string::npos) return "";
|
||||||
|
size_t b = s.find_last_not_of(" \t");
|
||||||
|
return s.substr(a, b - a + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ConsoleScreen::processCommand(const std::string& raw)
|
||||||
|
{
|
||||||
|
// strip leading '/'
|
||||||
|
std::string line = raw;
|
||||||
|
if (!line.empty() && line[0] == '/') line = line.substr(1);
|
||||||
|
line = trim(line);
|
||||||
|
|
||||||
|
// tokenise
|
||||||
|
std::vector<std::string> args;
|
||||||
|
{
|
||||||
|
std::istringstream ss(line);
|
||||||
|
std::string tok;
|
||||||
|
while (ss >> tok) args.push_back(tok);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.empty()) return "";
|
||||||
|
|
||||||
|
Level* level = minecraft->level;
|
||||||
|
if (!level) return "No level loaded.";
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------
|
||||||
|
// /time ...
|
||||||
|
// -----------------------------------------------------------------------
|
||||||
|
if (args[0] == "time") {
|
||||||
|
if (args.size() < 2)
|
||||||
|
return "Usage: /time <add|set|query> ...";
|
||||||
|
|
||||||
|
const std::string& sub = args[1];
|
||||||
|
|
||||||
|
// -- time add <value> -----------------------------------------------
|
||||||
|
if (sub == "add") {
|
||||||
|
if (args.size() < 3) return "Usage: /time add <value>";
|
||||||
|
long delta = std::atol(args[2].c_str());
|
||||||
|
long newTime = level->getTime() + delta;
|
||||||
|
level->setTime(newTime);
|
||||||
|
std::ostringstream out;
|
||||||
|
out << "Set the time to " << (newTime % Level::TICKS_PER_DAY);
|
||||||
|
return out.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- time set <value|day|night|noon|midnight> -----------------------
|
||||||
|
if (sub == "set") {
|
||||||
|
if (args.size() < 3) return "Usage: /time set <value|day|night|noon|midnight>";
|
||||||
|
const std::string& val = args[2];
|
||||||
|
|
||||||
|
long t = -1;
|
||||||
|
if (val == "day") t = 1000;
|
||||||
|
else if (val == "noon") t = 6000;
|
||||||
|
else if (val == "night") t = 13000;
|
||||||
|
else if (val == "midnight") t = 18000;
|
||||||
|
else {
|
||||||
|
// numeric — accept positive integers only
|
||||||
|
bool numeric = true;
|
||||||
|
for (char c : val)
|
||||||
|
if (!std::isdigit((unsigned char)c)) { numeric = false; break; }
|
||||||
|
if (!numeric) return std::string("Unknown value: ") + val;
|
||||||
|
t = std::atol(val.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Preserve the total day count so only the time-of-day changes
|
||||||
|
long dayCount = level->getTime() / Level::TICKS_PER_DAY;
|
||||||
|
long newTime = dayCount * Level::TICKS_PER_DAY + (t % Level::TICKS_PER_DAY);
|
||||||
|
level->setTime(newTime);
|
||||||
|
std::ostringstream out;
|
||||||
|
out << "Set the time to " << t;
|
||||||
|
return out.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- time query <daytime|gametime|day> ------------------------------
|
||||||
|
if (sub == "query") {
|
||||||
|
if (args.size() < 3) return "Usage: /time query <daytime|gametime|day>";
|
||||||
|
const std::string& what = args[2];
|
||||||
|
|
||||||
|
long total = level->getTime();
|
||||||
|
long daytime = total % Level::TICKS_PER_DAY;
|
||||||
|
long day = total / Level::TICKS_PER_DAY;
|
||||||
|
|
||||||
|
std::ostringstream out;
|
||||||
|
if (what == "daytime") { out << "The time of day is " << daytime; }
|
||||||
|
else if (what == "gametime") { out << "The game time is " << total; }
|
||||||
|
else if (what == "day") { out << "The day is " << day; }
|
||||||
|
else return std::string("Unknown query: ") + what;
|
||||||
|
return out.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown sub-command. Usage: /time <add|set|query> ...";
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::string("Unknown command: /") + args[0];
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// render
|
// render
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void execute();
|
void execute();
|
||||||
|
std::string processCommand(const std::string& cmd);
|
||||||
|
|
||||||
std::string _input;
|
std::string _input;
|
||||||
int _cursorBlink; // tick counter for cursor blink
|
int _cursorBlink; // tick counter for cursor blink
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ void DeathScreen::render( int xm, int ym, float a )
|
|||||||
if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 2){
|
if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 2){
|
||||||
glPushMatrix2();
|
glPushMatrix2();
|
||||||
glScalef2(2, 2, 2);
|
glScalef2(2, 2, 2);
|
||||||
drawCenteredString(font, I18n::get("deathScreen.title.hardcore"), width / 4, height / 8, 0xffffff);
|
drawCenteredString(font, "Game over!", width / 2 / 2, height / 8, 0xffffff);
|
||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "Score: &e" << minecraft->player->getScore();
|
ss << "Score: &e" << minecraft->player->getScore();
|
||||||
@@ -80,7 +80,7 @@ if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 2){
|
|||||||
} else {
|
} else {
|
||||||
glPushMatrix2();
|
glPushMatrix2();
|
||||||
glScalef2(2, 2, 2);
|
glScalef2(2, 2, 2);
|
||||||
drawCenteredString(font, I18n::get("deathScreen.title"), width / 4, height / 8, 0xffffff);
|
drawCenteredString(font, "You died!", width / 2 / 2, height / 8, 0xffffff);
|
||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -500,8 +500,6 @@ ItemInstance FurnaceScreen::moveOver(const ItemInstance* item, int maxCount) {
|
|||||||
setIfNotSet(doRecreatePane, newSize != oldSize);
|
setIfNotSet(doRecreatePane, newSize != oldSize);
|
||||||
return removed;
|
return removed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return ItemInstance();
|
return ItemInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ void OptionsScreen::removed() {
|
|||||||
|
|
||||||
void OptionsScreen::buttonClicked(Button* button) {
|
void OptionsScreen::buttonClicked(Button* button) {
|
||||||
if (button == btnClose) {
|
if (button == btnClose) {
|
||||||
minecraft->options.save();
|
minecraft->reloadOptions();
|
||||||
if (minecraft->screen != NULL) {
|
if (minecraft->screen != NULL) {
|
||||||
minecraft->setScreen(NULL);
|
minecraft->setScreen(NULL);
|
||||||
} else {
|
} else {
|
||||||
@@ -195,11 +195,11 @@ void OptionsScreen::generateOptionScreens() {
|
|||||||
.addOptionItem(OPTIONS_SENSITIVITY, minecraft);
|
.addOptionItem(OPTIONS_SENSITIVITY, minecraft);
|
||||||
|
|
||||||
// Game Pane
|
// Game Pane
|
||||||
optionPanes[1]->addOptionItem(OPTIONS_DIFFICULTY, minecraft)
|
optionPanes[1]->addOptionItem(OPTIONS_GUI_SCALE, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_DIFFICULTY, minecraft)
|
||||||
.addOptionItem(OPTIONS_SERVER_VISIBLE, minecraft)
|
.addOptionItem(OPTIONS_SERVER_VISIBLE, minecraft)
|
||||||
.addOptionItem(OPTIONS_THIRD_PERSON_VIEW, minecraft)
|
.addOptionItem(OPTIONS_THIRD_PERSON_VIEW, minecraft)
|
||||||
.addOptionItem(OPTIONS_WINDOW_SCALE, minecraft)
|
.addOptionItem(OPTIONS_WINDOW_SCALE, minecraft)
|
||||||
.addOptionItem(OPTIONS_GUI_SCALE, minecraft)
|
|
||||||
.addOptionItem(OPTIONS_SENSITIVITY, minecraft)
|
.addOptionItem(OPTIONS_SENSITIVITY, minecraft)
|
||||||
.addOptionItem(OPTIONS_MUSIC_VOLUME, minecraft)
|
.addOptionItem(OPTIONS_MUSIC_VOLUME, minecraft)
|
||||||
.addOptionItem(OPTIONS_SOUND_VOLUME, minecraft)
|
.addOptionItem(OPTIONS_SOUND_VOLUME, minecraft)
|
||||||
@@ -234,14 +234,13 @@ void OptionsScreen::generateOptionScreens() {
|
|||||||
.addOptionItem(OPTIONS_BEAUTIFUL_SKY, minecraft)
|
.addOptionItem(OPTIONS_BEAUTIFUL_SKY, minecraft)
|
||||||
.addOptionItem(OPTIONS_VIGNETTE, minecraft);
|
.addOptionItem(OPTIONS_VIGNETTE, minecraft);
|
||||||
|
|
||||||
optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft)
|
optionPanes[4]->addOptionItem(OPTIONS_TOUCH_OVERRIDE, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft)
|
||||||
.addOptionItem(OPTIONS_BAR_ON_TOP, minecraft)
|
.addOptionItem(OPTIONS_BAR_ON_TOP, minecraft)
|
||||||
.addOptionItem(OPTIONS_MENU_STYLE, minecraft)
|
.addOptionItem(OPTIONS_MENU_STYLE, minecraft)
|
||||||
.addOptionItem(OPTIONS_RPI_CURSOR, minecraft)
|
.addOptionItem(OPTIONS_RPI_CURSOR, minecraft)
|
||||||
#ifndef __APPLE__
|
|
||||||
.addOptionItem(OPTIONS_FOLIAGE_TINT, minecraft)
|
.addOptionItem(OPTIONS_FOLIAGE_TINT, minecraft)
|
||||||
.addOptionItem(OPTIONS_TINTED_SIDE, minecraft)
|
.addOptionItem(OPTIONS_TINTED_SIDE, minecraft)
|
||||||
#endif
|
|
||||||
.addOptionItem(OPTIONS_JAVA_HUD, minecraft)
|
.addOptionItem(OPTIONS_JAVA_HUD, minecraft)
|
||||||
.addOptionItem(OPTIONS_FOG_TYPE, minecraft)
|
.addOptionItem(OPTIONS_FOG_TYPE, minecraft)
|
||||||
.addOptionItem(OPTIONS_BETA_SKY, minecraft)
|
.addOptionItem(OPTIONS_BETA_SKY, minecraft)
|
||||||
@@ -274,7 +273,7 @@ void OptionsScreen::keyPressed(int eventKey) {
|
|||||||
if (currentOptionsGroup != NULL)
|
if (currentOptionsGroup != NULL)
|
||||||
currentOptionsGroup->keyPressed(minecraft, eventKey);
|
currentOptionsGroup->keyPressed(minecraft, eventKey);
|
||||||
if (eventKey == Keyboard::KEY_ESCAPE)
|
if (eventKey == Keyboard::KEY_ESCAPE)
|
||||||
minecraft->options.save();
|
minecraft->reloadOptions();
|
||||||
|
|
||||||
super::keyPressed(eventKey);
|
super::keyPressed(eventKey);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,14 +8,13 @@
|
|||||||
#include "../../../platform/time.h"
|
#include "../../../platform/time.h"
|
||||||
#include "../../../platform/input/Keyboard.h"
|
#include "../../../platform/input/Keyboard.h"
|
||||||
#include "../../../platform/log.h"
|
#include "../../../platform/log.h"
|
||||||
#include <locale/I18n.h>
|
|
||||||
|
|
||||||
SimpleChooseLevelScreen::SimpleChooseLevelScreen(const std::string& levelName)
|
SimpleChooseLevelScreen::SimpleChooseLevelScreen(const std::string& levelName)
|
||||||
: bHeader(nullptr),
|
: bHeader(0),
|
||||||
bGamemode(nullptr),
|
bGamemode(0),
|
||||||
bCheats(nullptr),
|
bCheats(0),
|
||||||
bBack(nullptr),
|
bBack(0),
|
||||||
bCreate(nullptr),
|
bCreate(0),
|
||||||
levelName(levelName),
|
levelName(levelName),
|
||||||
hasChosen(false),
|
hasChosen(false),
|
||||||
gamemode(GameType::Survival),
|
gamemode(GameType::Survival),
|
||||||
@@ -43,10 +42,10 @@ void SimpleChooseLevelScreen::init()
|
|||||||
// first") when the name already existed.
|
// first") when the name already existed.
|
||||||
ChooseLevelScreen::init();
|
ChooseLevelScreen::init();
|
||||||
|
|
||||||
tLevelName.text = I18n::get("selectWorld.newWorld");
|
tLevelName.text = "New world";
|
||||||
|
|
||||||
// header + close button
|
// header + close button
|
||||||
bHeader = new Touch::THeader(0, I18n::get("selectWorld.create"));
|
bHeader = new Touch::THeader(0, "Create World");
|
||||||
// create the back/X button as ImageButton like CreditsScreen
|
// create the back/X button as ImageButton like CreditsScreen
|
||||||
bBack = new ImageButton(2, "");
|
bBack = new ImageButton(2, "");
|
||||||
{
|
{
|
||||||
@@ -57,14 +56,14 @@ 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->options.getIntValue(OPTIONS_MENU_STYLE) != 2) {
|
if (/* minecraft->useTouchscreen() */ true) {
|
||||||
bGamemode = new Touch::TButton(1, I18n::get("selectWorld.gameMode.survival"));
|
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, I18n::get("selectWorld.create"));
|
bCreate = new Touch::TButton(3, "Create");
|
||||||
} else {
|
} else {
|
||||||
bGamemode = new Button(1, I18n::get("selectWorld.gameMode.survival"));
|
bGamemode = new Button(1, "Survival mode");
|
||||||
bCheats = new Button(4, "Cheats: Off");
|
bCheats = new Button(4, "Cheats: Off");
|
||||||
bCreate = new Button(3, I18n::get("Create"));
|
bCreate = new Button(3, "Create");
|
||||||
}
|
}
|
||||||
|
|
||||||
buttons.push_back(bHeader);
|
buttons.push_back(bHeader);
|
||||||
@@ -119,22 +118,15 @@ void SimpleChooseLevelScreen::setupPositions()
|
|||||||
bGamemode->x = centerX - totalButtonWidth / 2;
|
bGamemode->x = centerX - totalButtonWidth / 2;
|
||||||
bCheats->x = bGamemode->x + buttonWidth + buttonSpacing;
|
bCheats->x = bGamemode->x + buttonWidth + buttonSpacing;
|
||||||
|
|
||||||
// compute vertical centre for buttons in remaining space
|
// position Survival/Cheats buttons below the seed field
|
||||||
{
|
int buttonY = tSeed.y + tSeed.height + 20;
|
||||||
int bottomPad = 20;
|
bGamemode->y = buttonY;
|
||||||
int availTop = buttonHeight + 20 + 30 + 10; // just below seed
|
bCheats->y = buttonY;
|
||||||
int availBottom = height - bottomPad - bCreate->height - 10; // leave some gap before create
|
|
||||||
int availHeight = availBottom - availTop;
|
|
||||||
if (availHeight < 0) availHeight = 0;
|
|
||||||
int y = availTop + (availHeight - bGamemode->height) / 2;
|
|
||||||
bGamemode->y = y;
|
|
||||||
bCheats->y = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// position Create button just below with a small gap
|
||||||
bCreate->width = 100;
|
bCreate->width = 100;
|
||||||
bCreate->x = centerX - bCreate->width / 2;
|
bCreate->x = centerX - bCreate->width / 2;
|
||||||
int bottomPadding = 20;
|
bCreate->y = buttonY + bGamemode->height + 40;
|
||||||
bCreate->y = height - bottomPadding - bCreate->height;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SimpleChooseLevelScreen::tick()
|
void SimpleChooseLevelScreen::tick()
|
||||||
|
|||||||
@@ -16,12 +16,7 @@
|
|||||||
#include "../../../../world/level/Level.h"
|
#include "../../../../world/level/Level.h"
|
||||||
#include "../../../../world/item/DyePowderItem.h"
|
#include "../../../../world/item/DyePowderItem.h"
|
||||||
#include "../../../../world/item/crafting/Recipe.h"
|
#include "../../../../world/item/crafting/Recipe.h"
|
||||||
#include "network/RakNetInstance.h"
|
|
||||||
#include "network/packet/WantCreatePacket.h"
|
|
||||||
#include "platform/input/Keyboard.h"
|
#include "platform/input/Keyboard.h"
|
||||||
#include <cstdint>
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
static NinePatchLayer* guiPaneFrame = NULL;
|
static NinePatchLayer* guiPaneFrame = NULL;
|
||||||
|
|
||||||
@@ -198,26 +193,6 @@ void PaneCraftingScreen::setupPositions() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PaneCraftingScreen::tick() {
|
void PaneCraftingScreen::tick() {
|
||||||
if (minecraft->isOnline()) {
|
|
||||||
// TODO: Make better algorithm
|
|
||||||
static std::map<uint8_t, uint16_t> oldMap = {};
|
|
||||||
std::map<uint8_t, uint16_t> newMap = {};
|
|
||||||
|
|
||||||
for (int i = Inventory::MAX_SELECTION_SIZE; i < minecraft->player->inventory->getContainerSize(); ++i) {
|
|
||||||
auto itm = minecraft->player->inventory->getItem(i);
|
|
||||||
|
|
||||||
if (itm != NULL) {
|
|
||||||
newMap[itm->id] += itm->count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oldMap != newMap) {
|
|
||||||
oldMap = newMap;
|
|
||||||
newMap = {};
|
|
||||||
recheckRecipes();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pane) pane->tick();
|
if (pane) pane->tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,10 +439,6 @@ void PaneCraftingScreen::craftSelectedItem()
|
|||||||
ItemInstance resultItem = currentItem->item;
|
ItemInstance resultItem = currentItem->item;
|
||||||
|
|
||||||
if (minecraft->player) {
|
if (minecraft->player) {
|
||||||
if (minecraft->isOnline()) {
|
|
||||||
WantCreatePacket packet(minecraft->player->entityId, resultItem.count, resultItem.getAuxValue(), resultItem.id);
|
|
||||||
minecraft->raknetInstance->send(packet);
|
|
||||||
}
|
|
||||||
// Remove all items required for the recipe and ...
|
// Remove all items required for the recipe and ...
|
||||||
for (unsigned int i = 0; i < currentItem->neededItems.size(); ++i) {
|
for (unsigned int i = 0; i < currentItem->neededItems.size(); ++i) {
|
||||||
CItem::ReqItem& req = currentItem->neededItems[i];
|
CItem::ReqItem& req = currentItem->neededItems[i];
|
||||||
|
|||||||
@@ -21,9 +21,6 @@ HumanoidModel::HumanoidModel( float g /*= 0*/, float yOffset /*= 0*/, int texW /
|
|||||||
texWidth = texW;
|
texWidth = texW;
|
||||||
texHeight = texH;
|
texHeight = texH;
|
||||||
|
|
||||||
// texWidth = 64;
|
|
||||||
// texHeight = 32;
|
|
||||||
|
|
||||||
head.setModel(this);
|
head.setModel(this);
|
||||||
hair.setModel(this);
|
hair.setModel(this);
|
||||||
body.setModel(this);
|
body.setModel(this);
|
||||||
@@ -43,9 +40,10 @@ HumanoidModel::HumanoidModel( float g /*= 0*/, float yOffset /*= 0*/, int texW /
|
|||||||
head.addBox(-4, -8, -4, 8, 8, 8, g); // Head
|
head.addBox(-4, -8, -4, 8, 8, 8, g); // Head
|
||||||
head.setPos(0, 0 + yOffset, 0);
|
head.setPos(0, 0 + yOffset, 0);
|
||||||
|
|
||||||
|
if (modernSkin) {
|
||||||
hair.addBox(-4, -8, -4, 8, 8, 8, g + 0.5f); // Outer head layer (hat)
|
hair.addBox(-4, -8, -4, 8, 8, 8, g + 0.5f); // Outer head layer (hat)
|
||||||
hair.setPos(0, 0 + yOffset, 0);
|
hair.setPos(0, 0 + yOffset, 0);
|
||||||
|
}
|
||||||
|
|
||||||
body.addBox(-4, 0, -2, 8, 12, 4, g); // Body
|
body.addBox(-4, 0, -2, 8, 12, 4, g); // Body
|
||||||
body.setPos(0, 0 + yOffset, 0);
|
body.setPos(0, 0 + yOffset, 0);
|
||||||
@@ -101,17 +99,17 @@ void HumanoidModel::render(Entity* e, float time, float r, float bob, float yRot
|
|||||||
setupAnim(time, r, bob, yRot, xRot, scale);
|
setupAnim(time, r, bob, yRot, xRot, scale);
|
||||||
|
|
||||||
// Sync overlay with head rotation/position
|
// Sync overlay with head rotation/position
|
||||||
|
if (texWidth == 64 && texHeight == 64) {
|
||||||
hair.xRot = head.xRot;
|
hair.xRot = head.xRot;
|
||||||
hair.yRot = head.yRot;
|
hair.yRot = head.yRot;
|
||||||
hair.zRot = head.zRot;
|
hair.zRot = head.zRot;
|
||||||
hair.y = head.y;
|
hair.y = head.y;
|
||||||
|
}
|
||||||
|
|
||||||
head.render(scale);
|
head.render(scale);
|
||||||
|
if (texWidth == 64 && texHeight == 64) {
|
||||||
hair.render(scale);
|
hair.render(scale);
|
||||||
|
}
|
||||||
body.render(scale);
|
body.render(scale);
|
||||||
arm0.render(scale);
|
arm0.render(scale);
|
||||||
arm1.render(scale);
|
arm1.render(scale);
|
||||||
@@ -125,12 +123,12 @@ void HumanoidModel::render( HumanoidModel* model, float scale )
|
|||||||
head.yRot = model->head.yRot;
|
head.yRot = model->head.yRot;
|
||||||
head.y = model->head.y;
|
head.y = model->head.y;
|
||||||
head.xRot = model->head.xRot;
|
head.xRot = model->head.xRot;
|
||||||
|
if (texWidth == 64 && texHeight == 64) {
|
||||||
hair.yRot = head.yRot;
|
hair.yRot = head.yRot;
|
||||||
hair.xRot = head.xRot;
|
hair.xRot = head.xRot;
|
||||||
hair.zRot = head.zRot;
|
hair.zRot = head.zRot;
|
||||||
hair.y = head.y;
|
hair.y = head.y;
|
||||||
|
}
|
||||||
|
|
||||||
arm0.xRot = model->arm0.xRot;
|
arm0.xRot = model->arm0.xRot;
|
||||||
arm0.zRot = model->arm0.zRot;
|
arm0.zRot = model->arm0.zRot;
|
||||||
@@ -275,7 +273,7 @@ void HumanoidModel::onGraphicsReset()
|
|||||||
arm1.onGraphicsReset();
|
arm1.onGraphicsReset();
|
||||||
leg0.onGraphicsReset();
|
leg0.onGraphicsReset();
|
||||||
leg1.onGraphicsReset();
|
leg1.onGraphicsReset();
|
||||||
hair.onGraphicsReset();
|
//hair.onGraphicsReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
//void renderHair(float scale) {
|
//void renderHair(float scale) {
|
||||||
|
|||||||
@@ -355,11 +355,7 @@ LocalPlayer::LocalPlayer(Minecraft* minecraft, Level* level, const std::string&
|
|||||||
armorTypeHash(0),
|
armorTypeHash(0),
|
||||||
sprinting(false),
|
sprinting(false),
|
||||||
sprintDoubleTapTimer(0),
|
sprintDoubleTapTimer(0),
|
||||||
prevForwardHeld(false),
|
prevForwardHeld(false)
|
||||||
xBob(0.0f),
|
|
||||||
yBob(0.0f),
|
|
||||||
xBobO(0.0f),
|
|
||||||
yBobO(0.0f)
|
|
||||||
{
|
{
|
||||||
this->dimension = dimension;
|
this->dimension = dimension;
|
||||||
_init();
|
_init();
|
||||||
@@ -460,7 +456,7 @@ void LocalPlayer::tick() {
|
|||||||
{
|
{
|
||||||
sentInventoryItemId = newItemId;
|
sentInventoryItemId = newItemId;
|
||||||
sentInventoryItemData = newItemData;
|
sentInventoryItemData = newItemData;
|
||||||
PlayerEquipmentPacket packet(entityId, newItemId, newItemData, inventory->selected, inventory->getSlot(newItemId, newItemData));
|
PlayerEquipmentPacket packet(entityId, newItemId, newItemData);
|
||||||
minecraft->raknetInstance->send(packet);
|
minecraft->raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -554,10 +550,6 @@ void LocalPlayer::aiStep() {
|
|||||||
|
|
||||||
//if (onGround && abilities.flying)
|
//if (onGround && abilities.flying)
|
||||||
// abilities.flying = false;
|
// abilities.flying = false;
|
||||||
yBobO = yBob;
|
|
||||||
xBobO = xBob;
|
|
||||||
xBob += (xRot - xBob) * 0.5;
|
|
||||||
yBob += (yRot - yBob) * 0.5;
|
|
||||||
|
|
||||||
if (interpolateOnly())
|
if (interpolateOnly())
|
||||||
updateAi();
|
updateAi();
|
||||||
@@ -774,18 +766,21 @@ void LocalPlayer::startCrafting(int x, int y, int z, int tableSize) {
|
|||||||
|
|
||||||
void LocalPlayer::startStonecutting(int x, int y, int z) {
|
void LocalPlayer::startStonecutting(int x, int y, int z) {
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
|
if (!minecraft->isCreativeMode())
|
||||||
minecraft->setScreen( new StonecutterScreen() );
|
minecraft->setScreen( new StonecutterScreen() );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalPlayer::openFurnace( FurnaceTileEntity* e ) {
|
void LocalPlayer::openFurnace( FurnaceTileEntity* e ) {
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
|
if (!minecraft->isCreativeMode())
|
||||||
minecraft->setScreen( new FurnaceScreen(this, e) );
|
minecraft->setScreen( new FurnaceScreen(this, e) );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalPlayer::openContainer( ChestTileEntity* container ) {
|
void LocalPlayer::openContainer( ChestTileEntity* container ) {
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
|
if (!minecraft->isCreativeMode())
|
||||||
minecraft->setScreen( new ChestScreen(this, container) );
|
minecraft->setScreen( new ChestScreen(this, container) );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,10 +22,6 @@ public:
|
|||||||
virtual void reset();
|
virtual void reset();
|
||||||
|
|
||||||
void tick();
|
void tick();
|
||||||
|
|
||||||
float yBob, xBob; // shredder added from b1.8/4j for the hand swaying animation
|
|
||||||
float yBobO, xBobO; // shredder added from b1.8/4j for the hand swaying animation
|
|
||||||
|
|
||||||
void move(float xa, float ya, float za);
|
void move(float xa, float ya, float za);
|
||||||
|
|
||||||
void aiStep();
|
void aiStep();
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "../../../gui/Gui.h"
|
#include "../../../gui/Gui.h"
|
||||||
#include "../../../renderer/Tesselator.h"
|
#include "../../../renderer/Tesselator.h"
|
||||||
#include "../../../../world/entity/player/Player.h"
|
#include "../../../../world/entity/player/Player.h"
|
||||||
|
#include "../../../../util/Mth.h"
|
||||||
|
|
||||||
#include "../../../Minecraft.h"
|
#include "../../../Minecraft.h"
|
||||||
#include "../../../../platform/log.h"
|
#include "../../../../platform/log.h"
|
||||||
@@ -125,48 +126,80 @@ void TouchscreenInput_TestFps::onConfigChanged(const Config& c) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Code for "D-pad with jump in center"
|
// Code for "D-pad with jump in center"
|
||||||
float Bw = w * 0.11f;//0.08f;
|
// Calculate button size so the full 3x3 grid fits on screen with margins
|
||||||
float Bh = Bw;//0.15f;
|
const float margin = 12.0f;
|
||||||
|
float availW = w - margin * 2; // horizontal space available
|
||||||
|
float availH = h - margin * 2; // vertical space available
|
||||||
|
// Each button: 3 wide, 3 tall
|
||||||
|
float Bw = availW / 3.0f;
|
||||||
|
float Bh = availH / 3.0f;
|
||||||
|
// Use the smaller of the two to maintain square buttons
|
||||||
|
float btnSize = Mth::Min(Bw, Bh);
|
||||||
|
|
||||||
// If too large (like playing on Tablet)
|
// Scale down to 65% of max available for a more comfortable, non-obtrusive size
|
||||||
|
btnSize *= 0.65f;
|
||||||
|
|
||||||
|
// Clamp to physical millimeters for consistency across DPIs
|
||||||
PixelCalc& pc = _minecraft->pixelCalc;
|
PixelCalc& pc = _minecraft->pixelCalc;
|
||||||
if (pc.pixelsToMillimeters(Bw) > 200) { //14
|
float minBtnPx = pc.millimetersToPixels(35); // minimum touch target
|
||||||
Bw = Bh = pc.millimetersToPixels(200); //14
|
float maxBtnPx = pc.millimetersToPixels(90); // maximum
|
||||||
}
|
if (btnSize < minBtnPx) btnSize = minBtnPx;
|
||||||
|
if (btnSize > maxBtnPx) btnSize = maxBtnPx;
|
||||||
|
|
||||||
|
float Bw2 = btnSize;
|
||||||
|
float Bh2 = btnSize;
|
||||||
|
|
||||||
// temp data
|
// temp data
|
||||||
float xx;
|
float xx;
|
||||||
float yy;
|
float yy;
|
||||||
|
|
||||||
const float BaseY = -8 + h - 3.0f * Bh;
|
// Position from top-left (or top-right for left-handed)
|
||||||
const float BaseX = _options->getBooleanValue(OPTIONS_IS_LEFT_HANDED)? -8 + w - 3 * Bw
|
float dpadTotalW = 3.0f * Bw2;
|
||||||
: 8 + 0;
|
float dpadTotalH = 3.0f * Bh2;
|
||||||
|
|
||||||
|
// Place at top of screen instead of bottom
|
||||||
|
float BaseY = margin;
|
||||||
|
if (BaseY + dpadTotalH > h - margin) BaseY = h - dpadTotalH - margin;
|
||||||
|
|
||||||
|
float BaseX = _options->getBooleanValue(OPTIONS_IS_LEFT_HANDED) ? w - dpadTotalW - margin : margin;
|
||||||
|
if (BaseX < margin) BaseX = margin;
|
||||||
|
if (BaseX + dpadTotalW > w - margin) BaseX = w - dpadTotalW - margin;
|
||||||
|
|
||||||
// Setup the bounding rectangle
|
// Setup the bounding rectangle
|
||||||
_boundingRectangle = RectangleArea(BaseX, BaseY, BaseX + 3 * Bw, BaseY + 3 * Bh);
|
_boundingRectangle = RectangleArea(BaseX, BaseY, BaseX + dpadTotalW, BaseY + dpadTotalH);
|
||||||
|
|
||||||
xx = BaseX + Bw; yy = BaseY;
|
xx = BaseX + Bw2; yy = BaseY;
|
||||||
_model.addArea(AREA_DPAD_N, aUp = new RectangleArea(xx, yy, xx+Bw, yy+Bh));
|
_model.addArea(AREA_DPAD_N, aUp = new RectangleArea(xx, yy, xx+Bw2, yy+Bh2));
|
||||||
xx = BaseX;
|
xx = BaseX;
|
||||||
aUpLeft = new RectangleArea(xx, yy, xx+Bw, yy+Bh);
|
aUpLeft = new RectangleArea(xx, yy, xx+Bw2, yy+Bh2);
|
||||||
xx = BaseX + 2 * Bw;
|
xx = BaseX + 2 * Bw2;
|
||||||
aUpRight = new RectangleArea(xx, yy, xx+Bw, yy+Bh);
|
aUpRight = new RectangleArea(xx, yy, xx+Bw2, yy+Bh2);
|
||||||
|
|
||||||
xx = BaseX + Bw; yy = BaseY + Bh;
|
xx = BaseX + Bw2; yy = BaseY + Bh2;
|
||||||
_model.addArea(AREA_DPAD_C, aJump = new RectangleArea(xx, yy, xx+Bw, yy+Bh));
|
_model.addArea(AREA_DPAD_C, aJump = new RectangleArea(xx, yy, xx+Bw2, yy+Bh2));
|
||||||
|
|
||||||
xx = BaseX + Bw; yy = BaseY + 2 * Bh;
|
xx = BaseX + Bw2; yy = BaseY + 2 * Bh2;
|
||||||
_model.addArea(AREA_DPAD_S, aDown = new RectangleArea(xx, yy, xx+Bw, yy+Bh));
|
_model.addArea(AREA_DPAD_S, aDown = new RectangleArea(xx, yy, xx+Bw2, yy+Bh2));
|
||||||
|
|
||||||
xx = BaseX; yy = BaseY + Bh;
|
xx = BaseX; yy = BaseY + Bh2;
|
||||||
_model.addArea(AREA_DPAD_W, aLeft = new RectangleArea(xx, yy, xx+Bw, yy+Bh));
|
_model.addArea(AREA_DPAD_W, aLeft = new RectangleArea(xx, yy, xx+Bw2, yy+Bh2));
|
||||||
|
|
||||||
xx = BaseX + 2 * Bw; yy = BaseY + Bh;
|
xx = BaseX + 2 * Bw2; yy = BaseY + Bh2;
|
||||||
_model.addArea(AREA_DPAD_E, aRight = new RectangleArea(xx, yy, xx+Bw, yy+Bh));
|
_model.addArea(AREA_DPAD_E, aRight = new RectangleArea(xx, yy, xx+Bw2, yy+Bh2));
|
||||||
|
|
||||||
float maxPixels = _minecraft->pixelCalc.millimetersToPixels(10);
|
// Pause and chat buttons - sized relative to D-pad buttons, with bounds checking
|
||||||
// float btnSize = Mth::Min(18 * Gui::GuiScale, maxPixels);
|
float actionBtnSize = Bw2 * 0.7f;
|
||||||
float btnSize = pc.millimetersToPixels(18 * Gui::GuiScale);
|
float actionBtnMargin = 8.0f;
|
||||||
_model.addArea(AREA_PAUSE, aPause = new RectangleArea(w - 4 - btnSize, 4, w - 4, 4 + btnSize));
|
// Clamp action button size
|
||||||
_model.addArea(AREA_CHAT, aChat = new RectangleArea(w - 8 - btnSize * 2, 4, w - 8 - btnSize, 4 + btnSize));
|
if (actionBtnSize < pc.millimetersToPixels(30)) actionBtnSize = pc.millimetersToPixels(30);
|
||||||
|
if (actionBtnSize > pc.millimetersToPixels(120)) actionBtnSize = pc.millimetersToPixels(120);
|
||||||
|
|
||||||
|
_model.addArea(AREA_PAUSE, aPause = new RectangleArea(
|
||||||
|
w - actionBtnMargin - actionBtnSize, actionBtnMargin,
|
||||||
|
w - actionBtnMargin, actionBtnMargin + actionBtnSize));
|
||||||
|
_model.addArea(AREA_CHAT, aChat = new RectangleArea(
|
||||||
|
w - actionBtnMargin * 2 - actionBtnSize * 2, actionBtnMargin,
|
||||||
|
w - actionBtnMargin * 2 - actionBtnSize, actionBtnMargin + actionBtnSize));
|
||||||
|
|
||||||
//rebuild();
|
//rebuild();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -347,7 +347,6 @@ void GameRenderer::renderLevel(float a) {
|
|||||||
Lighting::turnOff();
|
Lighting::turnOff();
|
||||||
glDisable2(GL_BLEND);
|
glDisable2(GL_BLEND);
|
||||||
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
Lighting::turnOff();
|
|
||||||
setupFog(0);
|
setupFog(0);
|
||||||
glEnable2(GL_BLEND);
|
glEnable2(GL_BLEND);
|
||||||
glDisable2(GL_CULL_FACE);
|
glDisable2(GL_CULL_FACE);
|
||||||
@@ -440,7 +439,7 @@ float GameRenderer::getFov(float a, bool applyEffects) {
|
|||||||
fov *= this->oFov + (this->fov - this->oFov) * a;
|
fov *= this->oFov + (this->fov - this->oFov) * a;
|
||||||
|
|
||||||
if (player->isUnderLiquid(Material::water)) fov = 60;
|
if (player->isUnderLiquid(Material::water)) fov = 60;
|
||||||
if (player->hasDied()) {
|
if (player->health <= 0) {
|
||||||
float duration = player->deathTime + a;
|
float duration = player->deathTime + a;
|
||||||
|
|
||||||
fov /= ((1 - 500 / (duration + 500)) * 2.0f + 1);
|
fov /= ((1 - 500 / (duration + 500)) * 2.0f + 1);
|
||||||
@@ -537,7 +536,7 @@ void GameRenderer::bobHurt(float a) {
|
|||||||
|
|
||||||
float hurt = player->hurtTime - a;
|
float hurt = player->hurtTime - a;
|
||||||
|
|
||||||
if (player->hasDied()) {
|
if (player->health <= 0) {
|
||||||
float duration = player->deathTime + a;
|
float duration = player->deathTime + a;
|
||||||
glRotatef2(40 - (40 * 200) / (duration + 200), 0, 0, 1);
|
glRotatef2(40 - (40 * 200) / (duration + 200), 0, 0, 1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -280,9 +280,6 @@ void ItemInHandRenderer::render( float a )
|
|||||||
float h = oHeight + (height - oHeight) * a;
|
float h = oHeight + (height - oHeight) * a;
|
||||||
Player* player = mc->player;
|
Player* player = mc->player;
|
||||||
// if (selectedTile==NULL) return;
|
// if (selectedTile==NULL) return;
|
||||||
LocalPlayer* localPlayer = (LocalPlayer*)(player);
|
|
||||||
|
|
||||||
float xr = player->xRotO + (player->xRot - player->xRotO) * a; // shredder added for hand swaying
|
|
||||||
|
|
||||||
glPushMatrix2();
|
glPushMatrix2();
|
||||||
glRotatef2(player->xRotO + (player->xRot - player->xRotO) * a, 1, 0, 0);
|
glRotatef2(player->xRotO + (player->xRot - player->xRotO) * a, 1, 0, 0);
|
||||||
@@ -291,15 +288,6 @@ void ItemInHandRenderer::render( float a )
|
|||||||
Lighting::turnOn(mc);
|
Lighting::turnOn(mc);
|
||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
|
|
||||||
if (localPlayer) { // shredder added, basically does the hand swaying animation from b1.8
|
|
||||||
float xrr = localPlayer->xBobO + (localPlayer->xBob - localPlayer->xBobO) * a;
|
|
||||||
float yrr = localPlayer->yBobO + (localPlayer->yBob - localPlayer->yBobO) * a;
|
|
||||||
// 4J - was using player->xRot and yRot directly here rather than interpolating between old & current with a
|
|
||||||
float yr = player->yRotO + (player->yRot - player->yRotO) * a;
|
|
||||||
glRotatef((xr - xrr) * 0.1f, 1, 0, 0);
|
|
||||||
glRotatef((yr - yrr) * 0.1f, 0, 1, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
float br = mc->level->getBrightness(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z));
|
float br = mc->level->getBrightness(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z));
|
||||||
|
|
||||||
ItemInstance* item;// = selectedItem;
|
ItemInstance* item;// = selectedItem;
|
||||||
@@ -424,8 +412,6 @@ void ItemInHandRenderer::render( float a )
|
|||||||
|
|
||||||
EntityRenderer* er = EntityRenderDispatcher::getInstance()->getRenderer(mc->player);
|
EntityRenderer* er = EntityRenderDispatcher::getInstance()->getRenderer(mc->player);
|
||||||
HumanoidMobRenderer* playerRenderer = (HumanoidMobRenderer*) er;
|
HumanoidMobRenderer* playerRenderer = (HumanoidMobRenderer*) er;
|
||||||
EntityRenderDispatcher::getInstance()->setModernSkin((Entity*)(player));
|
|
||||||
|
|
||||||
float ss = 1;
|
float ss = 1;
|
||||||
glScalef2(ss, ss, ss);
|
glScalef2(ss, ss, ss);
|
||||||
playerRenderer->renderHand();
|
playerRenderer->renderHand();
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ LevelRenderer::LevelRenderer( Minecraft* mc)
|
|||||||
destroyProgress(0)
|
destroyProgress(0)
|
||||||
{
|
{
|
||||||
#ifdef OPENGL_ES
|
#ifdef OPENGL_ES
|
||||||
int maxChunksWidth = 2 * LevelConstants::LEVEL_WIDTH / CHUNK_SIZE + 1;
|
int maxChunksWidth = 2 * LEVEL_WIDTH / CHUNK_SIZE + 1;
|
||||||
numListsOrBuffers = maxChunksWidth * maxChunksWidth * (128/CHUNK_SIZE) * 3;
|
numListsOrBuffers = maxChunksWidth * maxChunksWidth * (128/CHUNK_SIZE) * 3;
|
||||||
chunkBuffers = new GLuint[numListsOrBuffers];
|
chunkBuffers = new GLuint[numListsOrBuffers];
|
||||||
glGenBuffers2(numListsOrBuffers, chunkBuffers);
|
glGenBuffers2(numListsOrBuffers, chunkBuffers);
|
||||||
@@ -185,14 +185,11 @@ void LevelRenderer::allChanged()
|
|||||||
|
|
||||||
lastFogType = mc->options.getIntValue(OPTIONS_FOG_TYPE);
|
lastFogType = mc->options.getIntValue(OPTIONS_FOG_TYPE);
|
||||||
|
|
||||||
#ifndef __APPLE__
|
|
||||||
bool tint = mc->options.getBooleanValue(OPTIONS_FOLIAGE_TINT);
|
bool tint = mc->options.getBooleanValue(OPTIONS_FOLIAGE_TINT);
|
||||||
bool sideTint = mc->options.getBooleanValue(OPTIONS_TINTED_SIDE);
|
|
||||||
#else
|
|
||||||
bool tint = false, sideTint = false;
|
|
||||||
#endif
|
|
||||||
FoliageColor::setUseTint(tint);
|
FoliageColor::setUseTint(tint);
|
||||||
GrassColor::setUseTint(tint);
|
GrassColor::setUseTint(tint);
|
||||||
|
|
||||||
|
bool sideTint = mc->options.getBooleanValue(OPTIONS_TINTED_SIDE);
|
||||||
TileRenderer::setUseTint(sideTint);
|
TileRenderer::setUseTint(sideTint);
|
||||||
|
|
||||||
|
|
||||||
@@ -1455,13 +1452,13 @@ void LevelRenderer::playSound(const std::string& name, float x, float y, float z
|
|||||||
float dd = 16;
|
float dd = 16;
|
||||||
|
|
||||||
if (volume > 1) dd *= volume;
|
if (volume > 1) dd *= volume;
|
||||||
if (mc->cameraTargetPlayer != NULL && mc->cameraTargetPlayer->distanceToSqr(x, y, z) < dd * dd) {
|
if (mc->cameraTargetPlayer->distanceToSqr(x, y, z) < dd * dd) {
|
||||||
mc->soundEngine->play(name, x, y, z, volume, pitch);
|
mc->soundEngine->play(name, x, y, z, volume, pitch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LevelRenderer::addParticle(const std::string& name, float x, float y, float z, float xa, float ya, float za, int data) {
|
void LevelRenderer::addParticle(const std::string& name, float x, float y, float z, float xa, float ya, float za, int data) {
|
||||||
if (mc->cameraTargetPlayer != NULL) {
|
|
||||||
float xd = mc->cameraTargetPlayer->x - x;
|
float xd = mc->cameraTargetPlayer->x - x;
|
||||||
float yd = mc->cameraTargetPlayer->y - y;
|
float yd = mc->cameraTargetPlayer->y - y;
|
||||||
float zd = mc->cameraTargetPlayer->z - z;
|
float zd = mc->cameraTargetPlayer->z - z;
|
||||||
@@ -1503,7 +1500,6 @@ void LevelRenderer::addParticle(const std::string& name, float x, float y, float
|
|||||||
//sw.stop();
|
//sw.stop();
|
||||||
//sw.printEvery(50, "add-particle-string");
|
//sw.printEvery(50, "add-particle-string");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
void LevelRenderer::addParticle(ParticleType::Id name, float x, float y, float z, float xa, float ya, float za, int data) {
|
void LevelRenderer::addParticle(ParticleType::Id name, float x, float y, float z, float xa, float ya, float za, int data) {
|
||||||
|
|||||||
@@ -137,11 +137,6 @@ void EntityRenderDispatcher::render( Entity* entity, float x, float y, float z,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityRenderDispatcher::setModernSkin(Entity* player) {
|
|
||||||
PlayerRenderer* rend = (PlayerRenderer*)(getRenderer(player));
|
|
||||||
rend->setModernSkin((Mob*)player);
|
|
||||||
}
|
|
||||||
|
|
||||||
EntityRenderer* EntityRenderDispatcher::getRenderer( Entity* entity )
|
EntityRenderer* EntityRenderDispatcher::getRenderer( Entity* entity )
|
||||||
{
|
{
|
||||||
EntityRendererId rendererId = entity->entityRendererId;
|
EntityRendererId rendererId = entity->entityRendererId;
|
||||||
|
|||||||
@@ -45,8 +45,6 @@ public:
|
|||||||
Font* getFont();
|
Font* getFont();
|
||||||
|
|
||||||
void onGraphicsReset();
|
void onGraphicsReset();
|
||||||
|
|
||||||
void setModernSkin(Entity* player);
|
|
||||||
private:
|
private:
|
||||||
void assign(EntityRendererId id, EntityRenderer* renderer);
|
void assign(EntityRendererId id, EntityRenderer* renderer);
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -133,8 +133,6 @@ void EntityRenderer::postRender(Entity* entity, float x, float y, float z, float
|
|||||||
}
|
}
|
||||||
if (entity->isOnFire()) renderFlame(entity, x, y, z, a);
|
if (entity->isOnFire()) renderFlame(entity, x, y, z, a);
|
||||||
}
|
}
|
||||||
// duplicate renderflame below is the pre b1.6.6 way flame rendered on player and mobs, probs gonna make it an option. - shredder
|
|
||||||
/*
|
|
||||||
void EntityRenderer::renderFlame(Entity* e, float x, float y, float z, float a) {
|
void EntityRenderer::renderFlame(Entity* e, float x, float y, float z, float a) {
|
||||||
glDisable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
int tex = ((Tile*)Tile::fire)->tex;
|
int tex = ((Tile*)Tile::fire)->tex;
|
||||||
@@ -180,75 +178,6 @@ void EntityRenderer::renderFlame(Entity* e, float x, float y, float z, float a)
|
|||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
glEnable2(GL_LIGHTING);
|
glEnable2(GL_LIGHTING);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
// new renderflame ported from b1.6.6, fixes player height offset and also uses the newer style - shredder
|
|
||||||
void EntityRenderer::renderFlame(Entity* e, float x, float y, float z, float a) {
|
|
||||||
glDisable(GL_LIGHTING);
|
|
||||||
int tex = ((Tile*)Tile::fire)->tex;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
glPushMatrix2();
|
|
||||||
glTranslatef2((float) x, (float) y, (float) z);
|
|
||||||
|
|
||||||
float s = e->bbWidth * 1.4f;
|
|
||||||
glScalef2(s, s, s);
|
|
||||||
bindTexture("terrain.png");
|
|
||||||
Tesselator& t = Tesselator::instance;
|
|
||||||
|
|
||||||
float r = 0.5f;
|
|
||||||
float xo = 0.0f;
|
|
||||||
|
|
||||||
float h = e->bbHeight / s;
|
|
||||||
float yo = (float)(e->y - e->bb.y0) / s;
|
|
||||||
|
|
||||||
glRotatef2(-entityRenderDispatcher->playerRotY, 0, 1, 0);
|
|
||||||
glTranslatef2(0, 0, -0.3f + ((int) h) * 0.02f);
|
|
||||||
glColor4f2(1, 1, 1, 1);
|
|
||||||
|
|
||||||
float zo = 0.0f;
|
|
||||||
int cycle_counter = 0;
|
|
||||||
|
|
||||||
t.begin();
|
|
||||||
while (h > 0.0f) {
|
|
||||||
float current_u0 = u0;
|
|
||||||
float current_u1 = u1;
|
|
||||||
float current_v0 = v0;
|
|
||||||
float current_v1 = v1;
|
|
||||||
|
|
||||||
if (cycle_counter % 2 != 0) {
|
|
||||||
current_v0 = (yt + 16) / 256.0f;
|
|
||||||
current_v1 = (yt + 16 + 15.99f) / 256.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((cycle_counter / 2) % 2 == 0) {
|
|
||||||
float tmp = current_u1;
|
|
||||||
current_u1 = current_u0;
|
|
||||||
current_u0 = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
t.vertexUV(r - xo, 0.0f - yo, zo, current_u1, current_v1);
|
|
||||||
t.vertexUV(-r - xo, 0.0f - yo, zo, current_u0, current_v1);
|
|
||||||
t.vertexUV(-r - xo, 1.4f - yo, zo, current_u0, current_v0);
|
|
||||||
t.vertexUV(r - xo, 1.4f - yo, zo, current_u1, current_v0);
|
|
||||||
|
|
||||||
h -= 0.45f;
|
|
||||||
yo -= 0.45f;
|
|
||||||
r *= 0.9f;
|
|
||||||
zo += 0.03f;
|
|
||||||
cycle_counter++;
|
|
||||||
}
|
|
||||||
t.draw();
|
|
||||||
|
|
||||||
glPopMatrix2();
|
|
||||||
glEnable2(GL_LIGHTING);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EntityRenderer::renderShadow(Entity* e, float x, float y, float z, float pow, float a) { //
|
void EntityRenderer::renderShadow(Entity* e, float x, float y, float z, float pow, float a) { //
|
||||||
glEnable2(GL_BLEND);
|
glEnable2(GL_BLEND);
|
||||||
@@ -257,7 +186,7 @@ void EntityRenderer::renderShadow(Entity* e, float x, float y, float z, float po
|
|||||||
//Textures* textures = entityRenderDispatcher->textures;
|
//Textures* textures = entityRenderDispatcher->textures;
|
||||||
//textures->bind(textures->loadTexture("%clamp%/environment/shadow.png"));
|
//textures->bind(textures->loadTexture("%clamp%/environment/shadow.png"));
|
||||||
Textures* textures = entityRenderDispatcher->textures;
|
Textures* textures = entityRenderDispatcher->textures;
|
||||||
textures->loadAndBindTexture("misc/shadow.png");
|
textures->loadAndBindTexture("/misc/shadow.png");
|
||||||
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
@@ -298,11 +227,8 @@ void EntityRenderer::renderShadow(Entity* e, float x, float y, float z, float po
|
|||||||
tt.draw();
|
tt.draw();
|
||||||
|
|
||||||
glColor4f2(1, 1, 1, 1);
|
glColor4f2(1, 1, 1, 1);
|
||||||
// tt.color(1.f, 1.f, 1.f, 1.f);
|
|
||||||
glDisable2(GL_BLEND);
|
glDisable2(GL_BLEND);
|
||||||
glDepthMask(true);
|
glDepthMask(true);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Level* EntityRenderer::getLevel() {
|
Level* EntityRenderer::getLevel() {
|
||||||
@@ -316,7 +242,7 @@ void EntityRenderer::renderTileShadow(Tile* tt, float x, float y, float z, int x
|
|||||||
float a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel()->getBrightness(xt, yt, zt);
|
float a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel()->getBrightness(xt, yt, zt);
|
||||||
if (a < 0) return;
|
if (a < 0) return;
|
||||||
if (a > 1) a = 1;
|
if (a > 1) a = 1;
|
||||||
// t.color(1.f, 1.f, 1.f, (float) a);
|
// t.color(1, 1, 1, (float) a);
|
||||||
glColor4f2(1, 1, 1, (float) a);
|
glColor4f2(1, 1, 1, (float) a);
|
||||||
|
|
||||||
float x0 = xt + tt->xx0 + xo;
|
float x0 = xt + tt->xx0 + xo;
|
||||||
|
|||||||
@@ -189,9 +189,9 @@ void ItemRenderer::renderGuiItem(Font* font, Textures* textures, const ItemInsta
|
|||||||
// it we're batching for saving the
|
// it we're batching for saving the
|
||||||
// buffer, this will fail miserably
|
// buffer, this will fail miserably
|
||||||
t.endOverrideAndDraw();
|
t.endOverrideAndDraw();
|
||||||
// glDisable2(GL_TEXTURE_2D);
|
glDisable2(GL_TEXTURE_2D);
|
||||||
// fillRect(t, x, y, w, h, 0xff0000);
|
fillRect(t, x, y, w, h, 0xff0000);
|
||||||
// glEnable2(GL_TEXTURE_2D);
|
glEnable2(GL_TEXTURE_2D);
|
||||||
renderGuiItemCorrect(font, textures, item, int(x), int(y));
|
renderGuiItemCorrect(font, textures, item, int(x), int(y));
|
||||||
t.beginOverride();
|
t.beginOverride();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -218,8 +218,6 @@ void MobRenderer::renderNameTag(Mob* mob, const std::string& name, float x, floa
|
|||||||
|
|
||||||
glScalef2(-s, -s, s);
|
glScalef2(-s, -s, s);
|
||||||
|
|
||||||
glDisable(GL_LIGHTING);
|
|
||||||
|
|
||||||
glDepthMask(false);
|
glDepthMask(false);
|
||||||
glDisable2(GL_DEPTH_TEST);
|
glDisable2(GL_DEPTH_TEST);
|
||||||
glEnable2(GL_BLEND);
|
glEnable2(GL_BLEND);
|
||||||
@@ -243,7 +241,6 @@ void MobRenderer::renderNameTag(Mob* mob, const std::string& name, float x, floa
|
|||||||
|
|
||||||
glDepthMask(true);
|
glDepthMask(true);
|
||||||
font->draw(name, (float) fnameWidth, 0, 0xffffffff);
|
font->draw(name, (float) fnameWidth, 0, 0xffffffff);
|
||||||
glEnable(GL_LIGHTING);
|
|
||||||
glDisable2(GL_BLEND);
|
glDisable2(GL_BLEND);
|
||||||
glColor4f2(1, 1, 1, 1);
|
glColor4f2(1, 1, 1, 1);
|
||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
|
|||||||
@@ -70,22 +70,17 @@ void PlayerRenderer::renderName( Mob* mob, float x, float y, float z ){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// @note fix player skin system
|
void PlayerRenderer::render(Entity* mob_, float x, float y, float z, float rot, float a) {
|
||||||
void PlayerRenderer::setModernSkin(Mob* mob) {
|
Mob* mob = (Mob*) mob_;
|
||||||
HumanoidModel* desired = isModernPlayerSkin(mob) ? playerModel64 : playerModel32;
|
HumanoidModel* desired = isModernPlayerSkin(mob) ? playerModel64 : playerModel32;
|
||||||
if (model != desired || humanoidModel != desired) {
|
if (model != desired || humanoidModel != desired) {
|
||||||
model = desired;
|
model = desired;
|
||||||
humanoidModel = desired;
|
humanoidModel = desired;
|
||||||
}
|
}
|
||||||
}
|
// LOGI("[PlayerRenderer] %s: skin=%s, modelTex=%dx%d, desired=%s\n", // don't log it always, only for debug - shredder
|
||||||
|
// ((Player*)mob)->name.c_str(), mob->getTexture().c_str(),
|
||||||
void PlayerRenderer::render(Entity* mob_, float x, float y, float z, float rot, float a) {
|
// humanoidModel->texWidth, humanoidModel->texHeight,
|
||||||
Mob* mob = (Mob*) mob_;
|
// (desired == playerModel64 ? "64" : "32"));
|
||||||
setModernSkin(mob);
|
|
||||||
/* LOGI("[PlayerRenderer] %s: skin=%s, modelTex=%dx%d, desired=%s\n",
|
|
||||||
((Player*)mob)->name.c_str(), mob->getTexture().c_str(),
|
|
||||||
humanoidModel->texWidth, humanoidModel->texHeight,
|
|
||||||
(desired == playerModel64 ? "64" : "32")); */
|
|
||||||
HumanoidMobRenderer::render(mob_, x, y, z, rot, a);
|
HumanoidMobRenderer::render(mob_, x, y, z, rot, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,6 @@ public:
|
|||||||
|
|
||||||
virtual void renderName(Mob* mob, float x, float y, float z);
|
virtual void renderName(Mob* mob, float x, float y, float z);
|
||||||
virtual void onGraphicsReset();
|
virtual void onGraphicsReset();
|
||||||
|
|
||||||
void setModernSkin(Mob* mob);
|
|
||||||
private:
|
private:
|
||||||
HumanoidModel* playerModel32;
|
HumanoidModel* playerModel32;
|
||||||
HumanoidModel* playerModel64;
|
HumanoidModel* playerModel64;
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
#include "Command.hpp"
|
|
||||||
#include "world/level/Level.h"
|
|
||||||
#include <client/Minecraft.h>
|
|
||||||
|
|
||||||
bool Command::isPlayerOp(Minecraft& mc, Player& player) {
|
|
||||||
std::string nicknameLower = player.name;
|
|
||||||
std::transform(nicknameLower.begin(), nicknameLower.end(), nicknameLower.begin(), ::tolower);
|
|
||||||
|
|
||||||
return mc.level->ops.find(nicknameLower) != mc.level->ops.end();
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
class Minecraft;
|
|
||||||
class Player;
|
|
||||||
|
|
||||||
class Command {
|
|
||||||
public:
|
|
||||||
const std::string& getName() { return m_name; }
|
|
||||||
|
|
||||||
bool isPlayerOp(Minecraft& mc, Player& player);
|
|
||||||
|
|
||||||
virtual std::string execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) = 0;
|
|
||||||
virtual std::string help(Minecraft& mc) = 0;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Command(const std::string& name) : m_name(name) {}
|
|
||||||
|
|
||||||
const std::string m_name;
|
|
||||||
};
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
#include "CommandBan.hpp"
|
|
||||||
#include "commands/Command.hpp"
|
|
||||||
#include "network/RakNetInstance.h"
|
|
||||||
#include "raknet/RakPeerInterface.h"
|
|
||||||
#include "world/level/Level.h"
|
|
||||||
#include <algorithm>
|
|
||||||
#include <client/Minecraft.h>
|
|
||||||
|
|
||||||
CommandBan::CommandBan() : Command("ban") {}
|
|
||||||
|
|
||||||
std::string CommandBan::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
|
||||||
if (!isPlayerOp(mc, player)) {
|
|
||||||
return "You aren't enough priveleged to run this command";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.empty()) {
|
|
||||||
return help(mc);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string nicknameLower = args[0];
|
|
||||||
std::transform(nicknameLower.begin(), nicknameLower.end(), nicknameLower.begin(), ::tolower);
|
|
||||||
|
|
||||||
auto it = std::find_if(mc.level->players.begin(), mc.level->players.end(), [args, nicknameLower] (auto& it) -> bool {
|
|
||||||
std::string lower = it->name;
|
|
||||||
std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
|
|
||||||
|
|
||||||
return lower == nicknameLower;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (*it == (Player*)mc.player) {
|
|
||||||
return "ban: you can't ban urself lol";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (it != mc.level->players.end()) {
|
|
||||||
mc.level->removePlayer(*it);
|
|
||||||
(*it)->remove();
|
|
||||||
mc.raknetInstance->getPeer()->CloseConnection((*it)->owner, true);
|
|
||||||
} else {
|
|
||||||
for (auto& banned : mc.level->bannedPlayers) {
|
|
||||||
if (nicknameLower == banned) {
|
|
||||||
return args[0] + "already banned!";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mc.level->bannedPlayers.insert(nicknameLower);
|
|
||||||
return "ban: successfully banned player " + args[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CommandBan::help(Minecraft& mc) {
|
|
||||||
return "Usage: /ban <player>";
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#include "Command.hpp"
|
|
||||||
|
|
||||||
class CommandBan : public Command {
|
|
||||||
public:
|
|
||||||
CommandBan();
|
|
||||||
|
|
||||||
std::string execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
|
||||||
std::string help(Minecraft& mc);
|
|
||||||
};
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#include "CommandGimmieItems.hpp"
|
|
||||||
#include <client/Minecraft.h>
|
|
||||||
#include <world/level/Level.h>
|
|
||||||
#include <world/item/DyePowderItem.h>
|
|
||||||
|
|
||||||
CommandGimmieItems::CommandGimmieItems() : Command("gimmieitems") {}
|
|
||||||
|
|
||||||
std::string CommandGimmieItems::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
|
||||||
if (mc.level != nullptr) {
|
|
||||||
if (mc.level->getLevelData()->getAllowCheats()) {
|
|
||||||
player.inventory->add(new ItemInstance(Item::ironIngot, 64));
|
|
||||||
player.inventory->add(new ItemInstance(Item::ironIngot, 34));
|
|
||||||
player.inventory->add(new ItemInstance(Tile::stonecutterBench));
|
|
||||||
player.inventory->add(new ItemInstance(Tile::workBench));
|
|
||||||
player.inventory->add(new ItemInstance(Tile::furnace));
|
|
||||||
player.inventory->add(new ItemInstance(Tile::wood, 54));
|
|
||||||
player.inventory->add(new ItemInstance(Item::stick, 14));
|
|
||||||
player.inventory->add(new ItemInstance(Item::coal, 31));
|
|
||||||
player.inventory->add(new ItemInstance(Tile::sand, 6));
|
|
||||||
player.inventory->add(new ItemInstance(Item::dye_powder, 23, DyePowderItem::PURPLE));
|
|
||||||
|
|
||||||
return "Grant debug items. Have fun!";
|
|
||||||
} else {
|
|
||||||
return "Cheats are not allowed!";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "World not loaded";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CommandGimmieItems::help(Minecraft& mc) {
|
|
||||||
return "Usage: /gimmieitems";
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#include "Command.hpp"
|
|
||||||
|
|
||||||
class CommandGimmieItems : public Command {
|
|
||||||
public:
|
|
||||||
CommandGimmieItems();
|
|
||||||
|
|
||||||
std::string execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
|
||||||
std::string help(Minecraft& mc);
|
|
||||||
};
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
#include "CommandHelp.hpp"
|
|
||||||
#include "commands/Command.hpp"
|
|
||||||
#include "CommandManager.hpp"
|
|
||||||
#include <client/Minecraft.h>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
CommandHelp::CommandHelp() : Command("help") {}
|
|
||||||
|
|
||||||
std::string CommandHelp::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
|
||||||
if (args.empty()) {
|
|
||||||
auto cmds = mc.commandManager().getListAllCommands();
|
|
||||||
|
|
||||||
std::ostringstream output;
|
|
||||||
|
|
||||||
output << "List of all commands:" << std::endl;
|
|
||||||
|
|
||||||
for (auto& cmd : cmds) {
|
|
||||||
output << " - " + cmd << std::endl;;
|
|
||||||
}
|
|
||||||
|
|
||||||
return output.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
Command* cmd = mc.commandManager().getCommand(args[0]);
|
|
||||||
|
|
||||||
if (cmd != nullptr) {
|
|
||||||
return cmd->help(mc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return "help: command " + args[0] + " not found";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CommandHelp::help(Minecraft& mc) {
|
|
||||||
return "Usage: /help <command>";
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#include "Command.hpp"
|
|
||||||
|
|
||||||
class CommandHelp : public Command {
|
|
||||||
public:
|
|
||||||
CommandHelp();
|
|
||||||
|
|
||||||
std::string execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
|
||||||
std::string help(Minecraft& mc);
|
|
||||||
};
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
#include "CommandKick.hpp"
|
|
||||||
#include "commands/Command.hpp"
|
|
||||||
#include "network/RakNetInstance.h"
|
|
||||||
#include "raknet/RakPeerInterface.h"
|
|
||||||
#include "world/level/Level.h"
|
|
||||||
#include <algorithm>
|
|
||||||
#include <client/Minecraft.h>
|
|
||||||
|
|
||||||
CommandKick::CommandKick() : Command("kick") {}
|
|
||||||
|
|
||||||
std::string CommandKick::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
|
||||||
if (!isPlayerOp(mc, player)) {
|
|
||||||
return "You aren't enough priveleged to run this command";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.empty()) {
|
|
||||||
return help(mc);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string nicknameLower = args[0];
|
|
||||||
std::transform(nicknameLower.begin(), nicknameLower.end(), nicknameLower.begin(), ::tolower);
|
|
||||||
|
|
||||||
auto it = std::find_if(mc.level->players.begin(), mc.level->players.end(), [args, nicknameLower] (auto& it) -> bool {
|
|
||||||
std::string lower = it->name;
|
|
||||||
std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
|
|
||||||
|
|
||||||
return lower == nicknameLower;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (it == mc.level->players.end()) {
|
|
||||||
return "kick: can't find player with name " + args[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*it == (Player*)mc.player) {
|
|
||||||
return "kick: you can't kick urself lol";
|
|
||||||
}
|
|
||||||
|
|
||||||
mc.level->removePlayer(*it);
|
|
||||||
(*it)->remove();
|
|
||||||
mc.raknetInstance->getPeer()->CloseConnection((*it)->owner, true);
|
|
||||||
return "kick: successfully kicked player " + args[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CommandKick::help(Minecraft& mc) {
|
|
||||||
return "Usage: /kick <player>";
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#include "Command.hpp"
|
|
||||||
|
|
||||||
class CommandKick : public Command {
|
|
||||||
public:
|
|
||||||
CommandKick();
|
|
||||||
|
|
||||||
std::string execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
|
||||||
std::string help(Minecraft& mc);
|
|
||||||
};
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
#include "CommandManager.hpp"
|
|
||||||
#include <algorithm>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include "client/Minecraft.h"
|
|
||||||
#include "commands/Command.hpp"
|
|
||||||
#include "commands/CommandHelp.hpp"
|
|
||||||
#include "commands/CommandKick.hpp"
|
|
||||||
#include "commands/CommandOp.hpp"
|
|
||||||
#include "commands/CommandBan.hpp"
|
|
||||||
#include "commands/CommandGimmieItems.hpp"
|
|
||||||
#include "network/packet/ChatPacket.h"
|
|
||||||
#include "network/RakNetInstance.h"
|
|
||||||
#include "world/level/Level.h"
|
|
||||||
|
|
||||||
CommandManager::CommandManager() {
|
|
||||||
registerAllCommands();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CommandManager::registerAllCommands() {
|
|
||||||
m_commands.push_back(new CommandHelp());
|
|
||||||
m_commands.push_back(new CommandKick());
|
|
||||||
m_commands.push_back(new CommandOp());
|
|
||||||
m_commands.push_back(new CommandBan());
|
|
||||||
// m_commands.push_back(new CommandGimmieItems());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> CommandManager::getListAllCommands() {
|
|
||||||
std::vector<std::string> ret;
|
|
||||||
|
|
||||||
for (auto& cmd : m_commands) {
|
|
||||||
ret.push_back(cmd->getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CommandManager::execute(Minecraft& mc, Player& player, const std::string& input) {
|
|
||||||
std::istringstream ss(input);
|
|
||||||
std::string cmd;
|
|
||||||
|
|
||||||
ss >> cmd;
|
|
||||||
|
|
||||||
auto it = std::find_if(m_commands.begin(), m_commands.end(), [cmd](auto& it) -> bool {
|
|
||||||
return it->getName() == cmd;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (it == m_commands.end()) {
|
|
||||||
return "Command /" + cmd + " not found";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> args;
|
|
||||||
|
|
||||||
std::string tok;
|
|
||||||
while (ss >> tok) args.push_back(tok);
|
|
||||||
|
|
||||||
return (*it)->execute(mc, player, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
Command* CommandManager::getCommand(const std::string& name) {
|
|
||||||
auto it = std::find_if(m_commands.begin(), m_commands.end(), [name](auto& it) -> bool {
|
|
||||||
return it->getName() == name;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (it == m_commands.end()) {
|
|
||||||
return *it;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "Command.hpp"
|
|
||||||
|
|
||||||
class CommandManager {
|
|
||||||
public:
|
|
||||||
CommandManager();
|
|
||||||
|
|
||||||
std::vector<std::string> getListAllCommands();
|
|
||||||
|
|
||||||
std::string execute(Minecraft& mc, Player& player, const std::string& input);
|
|
||||||
|
|
||||||
Command* getCommand(const std::string& name);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void registerAllCommands();
|
|
||||||
|
|
||||||
std::vector<Command*> m_commands;
|
|
||||||
};
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
#include "CommandOp.hpp"
|
|
||||||
#include "commands/Command.hpp"
|
|
||||||
#include "world/level/Level.h"
|
|
||||||
#include <algorithm>
|
|
||||||
#include <client/Minecraft.h>
|
|
||||||
|
|
||||||
CommandOp::CommandOp() : Command("op") {}
|
|
||||||
|
|
||||||
std::string CommandOp::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
|
||||||
if (!isPlayerOp(mc, player)) {
|
|
||||||
return "You aren't enough priveleged to run this command";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.empty()) {
|
|
||||||
return help(mc);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string nicknameLower = args[0];
|
|
||||||
std::transform(nicknameLower.begin(), nicknameLower.end(), nicknameLower.begin(), ::tolower);
|
|
||||||
|
|
||||||
if (mc.level->ops.find(nicknameLower) != mc.level->ops.end()) {
|
|
||||||
return "op: player " + args[0] + " already opped";
|
|
||||||
}
|
|
||||||
|
|
||||||
mc.level->ops.emplace(nicknameLower);
|
|
||||||
return "op: successfully opped player " + args[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CommandOp::help(Minecraft& mc) {
|
|
||||||
return "Usage: /op <player>";
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#include "Command.hpp"
|
|
||||||
|
|
||||||
class CommandOp : public Command {
|
|
||||||
public:
|
|
||||||
CommandOp();
|
|
||||||
|
|
||||||
std::string execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
|
||||||
std::string help(Minecraft& mc);
|
|
||||||
};
|
|
||||||
@@ -1,20 +1,16 @@
|
|||||||
#include <fstream>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "NinecraftApp.h"
|
#include "NinecraftApp.h"
|
||||||
#include "AppPlatform.h"
|
#include "AppPlatform.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#ifdef __linux__
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "world/level/LevelSettings.h"
|
#include "world/level/LevelSettings.h"
|
||||||
#include "world/level/Level.h"
|
#include "world/level/Level.h"
|
||||||
#include "server/ArgumentsSettings.h"
|
#include "server/ArgumentsSettings.h"
|
||||||
#include "platform/time.h"
|
#include "platform/time.h"
|
||||||
#include "SharedConstants.h"
|
#include "SharedConstants.h"
|
||||||
#include "world/level/LevelConstants.h"
|
|
||||||
|
|
||||||
#define MAIN_CLASS NinecraftApp
|
#define MAIN_CLASS NinecraftApp
|
||||||
static App* g_app = 0;
|
static App* g_app = 0;
|
||||||
@@ -31,175 +27,36 @@ void signal_callback_handler(int signum) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string findStringInConfig(std::string line, std::string config) {
|
|
||||||
auto valuePos = config.find(line);
|
|
||||||
|
|
||||||
if (line.empty()) {
|
|
||||||
throw std::runtime_error("Key cannot be empty");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valuePos == std::string::npos) {
|
|
||||||
throw std::runtime_error("Cannot find value");
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string valueStr = "";
|
|
||||||
|
|
||||||
valuePos += 1 + line.size();
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
auto sym = config.at(valuePos);
|
|
||||||
|
|
||||||
if (sym == '\n') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valuePos == config.size()) {
|
|
||||||
throw std::runtime_error("Cannot find end of the line");
|
|
||||||
}
|
|
||||||
|
|
||||||
valueStr += sym;
|
|
||||||
valuePos++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return valueStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int numArguments, char* pszArgs[]) {
|
int main(int numArguments, char* pszArgs[]) {
|
||||||
std::ifstream serverProperties("server.properties");
|
ArgumentsSettings aSettings(numArguments, pszArgs);
|
||||||
|
if(aSettings.getShowHelp()) {
|
||||||
int port = 0;
|
|
||||||
int gamemode = 0;
|
|
||||||
int worldSize = 0;
|
|
||||||
|
|
||||||
std::string levelDir = "";
|
|
||||||
std::string cachePath = "";
|
|
||||||
std::string externalPath = "";
|
|
||||||
std::string levelName = "";
|
|
||||||
|
|
||||||
if (serverProperties.is_open()) {
|
|
||||||
std::string propString;
|
|
||||||
std::string line;
|
|
||||||
|
|
||||||
while (std::getline(serverProperties, line)) {
|
|
||||||
propString += line;
|
|
||||||
propString += "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (propString.empty()) {
|
|
||||||
throw std::runtime_error("Config cannot be empty");
|
|
||||||
}
|
|
||||||
|
|
||||||
port = std::stoi(findStringInConfig("port", propString));
|
|
||||||
worldSize = std::stoi(findStringInConfig("world-size", propString));
|
|
||||||
|
|
||||||
if (worldSize < 16 || worldSize > 32) {
|
|
||||||
throw std::runtime_error("Incorrect world size.");
|
|
||||||
}
|
|
||||||
|
|
||||||
LevelConstants::CHUNK_CACHE_WIDTH = worldSize;
|
|
||||||
LevelConstants::LEVEL_WIDTH = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_WIDTH;
|
|
||||||
LevelConstants::LEVEL_DEPTH = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_DEPTH;
|
|
||||||
|
|
||||||
cachePath = findStringInConfig("level-cachepath", propString);
|
|
||||||
externalPath = findStringInConfig("level-externalpath", propString);
|
|
||||||
levelName = findStringInConfig("level-name", propString);
|
|
||||||
levelDir = findStringInConfig("level-dir", propString);
|
|
||||||
|
|
||||||
std::string gamemodeStr = findStringInConfig("gamemode", propString);
|
|
||||||
|
|
||||||
if (gamemodeStr == "survival") {
|
|
||||||
gamemode = GameType::Survival;
|
|
||||||
} else if (gamemodeStr == "creative") {
|
|
||||||
gamemode = GameType::Creative;
|
|
||||||
} else {
|
|
||||||
gamemode = GameType::Survival;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%d %s %s %d %d\n", port, cachePath.c_str(), externalPath.c_str(), gamemode, LevelConstants::CHUNK_CACHE_WIDTH);
|
|
||||||
} else {
|
|
||||||
std::ofstream defaultProperties("server.properties");
|
|
||||||
|
|
||||||
if (defaultProperties.is_open()) {
|
|
||||||
ArgumentsSettings defaultSettings(0, NULL);
|
ArgumentsSettings defaultSettings(0, NULL);
|
||||||
|
printf("Minecraft Pockect Edition Server %s\n", Common::getGameVersionString("").c_str());
|
||||||
std::stringstream buffer;
|
printf("-------------------------------------------------------\n");
|
||||||
|
printf("--cachepath - Path to where the server can store temp stuff (not sure if this is used) [default: \"%s\"]\n", defaultSettings.getCachePath().c_str());
|
||||||
buffer << "// MCPE Server properties" << std::endl;
|
printf("--externalpath - The path to the place where the server should store the levels. [default: \"%s\"]\n", defaultSettings.getExternalPath().c_str());
|
||||||
buffer << "port=" << defaultSettings.getPort() << std::endl;
|
printf("--levelname - The name of the server [default: \"%s\"]\n", defaultSettings.getLevelName().c_str());
|
||||||
buffer << "level-dir=" << defaultSettings.getLevelDir() << std::endl;
|
printf("--leveldir - The name of the server [default: \"%s\"]\n", defaultSettings.getLevelDir().c_str());
|
||||||
buffer << "level-cachepath=" << defaultSettings.getCachePath() << std::endl;
|
printf("--help - Shows this message.\n");
|
||||||
buffer << "level-externalpath=" << defaultSettings.getExternalPath() << std::endl;
|
printf("--port - The port to run the server on. [default: %d]\n", defaultSettings.getPort());
|
||||||
buffer << "gamemode=survival" << std::endl;
|
printf("--serverkey - The key that the server should use for API calls. [default: \"%s\"]\n", defaultSettings.getServerKey().c_str());
|
||||||
buffer << "level-name=" << defaultSettings.getLevelName() << std::endl;
|
printf("-------------------------------------------------------\n");
|
||||||
buffer << "world-size=16" << std::endl;
|
return 0;
|
||||||
|
|
||||||
defaultProperties << buffer.str();
|
|
||||||
|
|
||||||
printf("%s \n", buffer.str().c_str());
|
|
||||||
|
|
||||||
printf("Edit a config file first!\n");
|
|
||||||
|
|
||||||
defaultProperties.close();
|
|
||||||
exit(0);
|
|
||||||
} else {
|
|
||||||
throw std::runtime_error("Cannot create default config.");
|
|
||||||
}
|
}
|
||||||
}
|
printf("Level Name: %s\n", aSettings.getLevelName().c_str());
|
||||||
|
|
||||||
printf("Level Name: %s\n", levelName.c_str());
|
|
||||||
|
|
||||||
AppContext appContext;
|
AppContext appContext;
|
||||||
appContext.platform = new AppPlatform();
|
appContext.platform = new AppPlatform();
|
||||||
App* app = new MAIN_CLASS();
|
App* app = new MAIN_CLASS();
|
||||||
signal(SIGINT, signal_callback_handler);
|
signal(SIGINT, signal_callback_handler);
|
||||||
g_app = app;
|
g_app = app;
|
||||||
((MAIN_CLASS*)g_app)->externalStoragePath = externalPath;
|
((MAIN_CLASS*)g_app)->externalStoragePath = aSettings.getExternalPath();
|
||||||
((MAIN_CLASS*)g_app)->externalCacheStoragePath = cachePath;
|
((MAIN_CLASS*)g_app)->externalCacheStoragePath = aSettings.getCachePath();
|
||||||
|
|
||||||
g_app->init(appContext);
|
g_app->init(appContext);
|
||||||
LevelSettings settings(getEpochTimeS(), gamemode);
|
LevelSettings settings(getEpochTimeS(), GameType::Creative);
|
||||||
float startTime = getTimeS();
|
float startTime = getTimeS();
|
||||||
((MAIN_CLASS*)g_app)->selectLevel(levelDir, levelName, settings);
|
((MAIN_CLASS*)g_app)->selectLevel(aSettings.getLevelDir(), aSettings.getLevelName(), settings);
|
||||||
((MAIN_CLASS*)g_app)->hostMultiplayer(port);
|
((MAIN_CLASS*)g_app)->hostMultiplayer(aSettings.getPort());
|
||||||
|
|
||||||
// Reading ops
|
|
||||||
std::ifstream ops("ops.txt");
|
|
||||||
|
|
||||||
if (ops.is_open()) {
|
|
||||||
std::string line;
|
|
||||||
|
|
||||||
while (std::getline(ops, line)) {
|
|
||||||
if (!line.empty()) {
|
|
||||||
((MAIN_CLASS*)g_app)->level->ops.insert(line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
std::ofstream opsDefault("ops.txt");
|
|
||||||
|
|
||||||
if (!opsDefault.is_open()) {
|
|
||||||
throw std::runtime_error("Cannot create ops list.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reading banned ppl
|
|
||||||
std::ifstream banned("banned-players.txt");
|
|
||||||
|
|
||||||
if (banned.is_open()) {
|
|
||||||
std::string line;
|
|
||||||
|
|
||||||
while (std::getline(banned, line)) {
|
|
||||||
if (!line.empty()) {
|
|
||||||
((MAIN_CLASS*)g_app)->level->bannedPlayers.insert(line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
std::ofstream bannedPlayers("banned-players.txt");
|
|
||||||
|
|
||||||
if (!bannedPlayers.is_open()) {
|
|
||||||
throw std::runtime_error("Cannot create banned players list.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "Level has been generated in " << getTimeS() - startTime << std::endl;
|
std::cout << "Level has been generated in " << getTimeS() - startTime << std::endl;
|
||||||
((MAIN_CLASS*)g_app)->level->saveLevelData();
|
((MAIN_CLASS*)g_app)->level->saveLevelData();
|
||||||
@@ -210,31 +67,7 @@ int main(int numArguments, char* pszArgs[]) {
|
|||||||
//pthread_yield();
|
//pthread_yield();
|
||||||
sleepMs(20);
|
sleepMs(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ofstream opsWrite("ops.txt");
|
|
||||||
|
|
||||||
if (opsWrite.is_open()) {
|
|
||||||
for (auto& op : ((MAIN_CLASS*)g_app)->level->ops) {
|
|
||||||
opsWrite << op << std::endl;
|
|
||||||
}
|
|
||||||
opsWrite.close();
|
|
||||||
} else {
|
|
||||||
throw std::runtime_error("Cannot open ops list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ofstream bannedWrite("banned-players.txt");
|
|
||||||
|
|
||||||
if (bannedWrite.is_open()) {
|
|
||||||
for (auto& banned : ((MAIN_CLASS*)g_app)->level->bannedPlayers) {
|
|
||||||
bannedWrite << banned << std::endl;
|
|
||||||
}
|
|
||||||
bannedWrite.close();
|
|
||||||
} else {
|
|
||||||
throw std::runtime_error("Cannot open banned players list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
((MAIN_CLASS*)g_app)->level->saveLevelData();
|
((MAIN_CLASS*)g_app)->level->saveLevelData();
|
||||||
|
|
||||||
delete app;
|
delete app;
|
||||||
appContext.platform->finish();
|
appContext.platform->finish();
|
||||||
delete appContext.platform;
|
delete appContext.platform;
|
||||||
|
|||||||
@@ -18,6 +18,87 @@
|
|||||||
#endif
|
#endif
|
||||||
static App* g_app = 0;
|
static App* g_app = 0;
|
||||||
|
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
static int g_touchPointerIds[Multitouch::MAX_POINTERS];
|
||||||
|
|
||||||
|
static void resetTouchPointerIds() {
|
||||||
|
for (int i = 0; i < Multitouch::MAX_POINTERS; ++i) {
|
||||||
|
g_touchPointerIds[i] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getTouchPointerSlot(int touchId) {
|
||||||
|
for (int i = 0; i < Multitouch::MAX_POINTERS; ++i) {
|
||||||
|
if (g_touchPointerIds[i] == touchId) return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int allocateTouchPointerSlot(int touchId) {
|
||||||
|
int slot = getTouchPointerSlot(touchId);
|
||||||
|
if (slot >= 0) return slot;
|
||||||
|
|
||||||
|
for (int i = 0; i < Multitouch::MAX_POINTERS; ++i) {
|
||||||
|
if (g_touchPointerIds[i] < 0) {
|
||||||
|
g_touchPointerIds[i] = touchId;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void releaseTouchPointerSlot(int touchId) {
|
||||||
|
for (int i = 0; i < Multitouch::MAX_POINTERS; ++i) {
|
||||||
|
if (g_touchPointerIds[i] == touchId) {
|
||||||
|
g_touchPointerIds[i] = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static EM_BOOL touch_callback(int eventType, const EmscriptenTouchEvent* touchEvent, void* userData) {
|
||||||
|
if (!touchEvent) return 0;
|
||||||
|
|
||||||
|
const bool isStart = eventType == EMSCRIPTEN_EVENT_TOUCHSTART;
|
||||||
|
const bool isMove = eventType == EMSCRIPTEN_EVENT_TOUCHMOVE;
|
||||||
|
const bool isEnd = eventType == EMSCRIPTEN_EVENT_TOUCHEND;
|
||||||
|
const bool isCancel = eventType == EMSCRIPTEN_EVENT_TOUCHCANCEL;
|
||||||
|
|
||||||
|
if (isCancel) {
|
||||||
|
for (int i = 0; i < Multitouch::MAX_POINTERS; ++i) {
|
||||||
|
if (g_touchPointerIds[i] >= 0) {
|
||||||
|
Multitouch::feed(1, 0, Multitouch::getX(i), Multitouch::getY(i), i);
|
||||||
|
g_touchPointerIds[i] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < touchEvent->numTouches; ++i) {
|
||||||
|
const EmscriptenTouchPoint& touch = touchEvent->touches[i];
|
||||||
|
if (!touch.isChanged) continue;
|
||||||
|
|
||||||
|
const int slot = isEnd ? getTouchPointerSlot(touch.identifier) : allocateTouchPointerSlot(touch.identifier);
|
||||||
|
if (slot < 0) continue;
|
||||||
|
|
||||||
|
const short x = (short)touch.targetX;
|
||||||
|
const short y = (short)touch.targetY;
|
||||||
|
|
||||||
|
if (isStart) {
|
||||||
|
Multitouch::feed(1, 1, x, y, slot);
|
||||||
|
} else if (isMove) {
|
||||||
|
Multitouch::feed(0, 0, x, y, slot);
|
||||||
|
} else if (isEnd) {
|
||||||
|
Multitouch::feed(1, 0, x, y, slot);
|
||||||
|
releaseTouchPointerSlot(touch.identifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int transformKey(int glfwkey) {
|
int transformKey(int glfwkey) {
|
||||||
if (glfwkey >= GLFW_KEY_F1 && glfwkey <= GLFW_KEY_F12) {
|
if (glfwkey >= GLFW_KEY_F1 && glfwkey <= GLFW_KEY_F12) {
|
||||||
return glfwkey - 178;
|
return glfwkey - 178;
|
||||||
@@ -180,6 +261,13 @@ int main(void) {
|
|||||||
glfwSetMouseButtonCallback(platform->window, mouse_button_callback);
|
glfwSetMouseButtonCallback(platform->window, mouse_button_callback);
|
||||||
glfwSetScrollCallback(platform->window, scroll_callback);
|
glfwSetScrollCallback(platform->window, scroll_callback);
|
||||||
glfwSetWindowSizeCallback(platform->window, window_size_callback);
|
glfwSetWindowSizeCallback(platform->window, window_size_callback);
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
resetTouchPointerIds();
|
||||||
|
emscripten_set_touchstart_callback("#canvas", 0, 1, touch_callback);
|
||||||
|
emscripten_set_touchmove_callback("#canvas", 0, 1, touch_callback);
|
||||||
|
emscripten_set_touchend_callback("#canvas", 0, 1, touch_callback);
|
||||||
|
emscripten_set_touchcancel_callback("#canvas", 0, 1, touch_callback);
|
||||||
|
#endif
|
||||||
|
|
||||||
glfwMakeContextCurrent(platform->window);
|
glfwMakeContextCurrent(platform->window);
|
||||||
#ifndef __EMSCRIPTEN__
|
#ifndef __EMSCRIPTEN__
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
|
|
||||||
#include "ClientSideNetworkHandler.h"
|
#include "ClientSideNetworkHandler.h"
|
||||||
#include "client/Options.h"
|
#include "client/Options.h"
|
||||||
#include "network/packet/LoginStatusPacket.h"
|
|
||||||
#include "packet/PacketInclude.h"
|
#include "packet/PacketInclude.h"
|
||||||
#include "RakNetInstance.h"
|
#include "RakNetInstance.h"
|
||||||
#include "../world/level/chunk/ChunkSource.h"
|
#include "../world/level/chunk/ChunkSource.h"
|
||||||
@@ -11,9 +10,6 @@
|
|||||||
#include "../world/entity/player/Inventory.h"
|
#include "../world/entity/player/Inventory.h"
|
||||||
#include "../client/Minecraft.h"
|
#include "../client/Minecraft.h"
|
||||||
#include "../client/gamemode/GameMode.h"
|
#include "../client/gamemode/GameMode.h"
|
||||||
#include "world/item/ItemInstance.h"
|
|
||||||
#include "world/level/LevelConstants.h"
|
|
||||||
#include <cstddef>
|
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
#include "../client/gui/screens/DisconnectionScreen.h"
|
#include "../client/gui/screens/DisconnectionScreen.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -46,9 +42,6 @@ ClientSideNetworkHandler::ClientSideNetworkHandler(Minecraft* minecraft, IRakNet
|
|||||||
requestNextChunkPosition(0),
|
requestNextChunkPosition(0),
|
||||||
requestNextChunkIndex(0)
|
requestNextChunkIndex(0)
|
||||||
{
|
{
|
||||||
NumRequestChunks = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH;
|
|
||||||
requestNextChunkIndexList.resize(NumRequestChunks);
|
|
||||||
chunksLoaded.resize(NumRequestChunks);
|
|
||||||
rakPeer = raknetInstance->getPeer();
|
rakPeer = raknetInstance->getPeer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +59,7 @@ void ClientSideNetworkHandler::requestNextChunk()
|
|||||||
|
|
||||||
//LOGI("requesting chunks @ (%d, %d)\n", chunk.x, chunk.y);
|
//LOGI("requesting chunks @ (%d, %d)\n", chunk.x, chunk.y);
|
||||||
|
|
||||||
//raknetInstance->send(new RequestChunkPacket(requestNextChunkPosition % LevelConstants::CHUNK_CACHE_WIDTH, requestNextChunkPosition / LevelConstants::CHUNK_CACHE_WIDTH));
|
//raknetInstance->send(new RequestChunkPacket(requestNextChunkPosition % CHUNK_CACHE_WIDTH, requestNextChunkPosition / CHUNK_CACHE_WIDTH));
|
||||||
requestNextChunkIndex++;
|
requestNextChunkIndex++;
|
||||||
requestNextChunkPosition++;
|
requestNextChunkPosition++;
|
||||||
}
|
}
|
||||||
@@ -74,16 +67,16 @@ void ClientSideNetworkHandler::requestNextChunk()
|
|||||||
|
|
||||||
bool ClientSideNetworkHandler::areAllChunksLoaded()
|
bool ClientSideNetworkHandler::areAllChunksLoaded()
|
||||||
{
|
{
|
||||||
return (requestNextChunkPosition >= (LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH));
|
return (requestNextChunkPosition >= (CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientSideNetworkHandler::isChunkLoaded(int x, int z)
|
bool ClientSideNetworkHandler::isChunkLoaded(int x, int z)
|
||||||
{
|
{
|
||||||
if (x < 0 || x >= LevelConstants::CHUNK_CACHE_WIDTH || z < 0 || z >= LevelConstants::CHUNK_CACHE_WIDTH) {
|
if (x < 0 || x >= CHUNK_CACHE_WIDTH || z < 0 || z >= CHUNK_CACHE_WIDTH) {
|
||||||
LOGE("Error: Tried to request chunk (%d, %d)\n", x, z);
|
LOGE("Error: Tried to request chunk (%d, %d)\n", x, z);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return chunksLoaded[x * LevelConstants::CHUNK_CACHE_WIDTH + z];
|
return chunksLoaded[x * CHUNK_CACHE_WIDTH + z];
|
||||||
//return areAllChunksLoaded();
|
//return areAllChunksLoaded();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +86,7 @@ void ClientSideNetworkHandler::onConnect(const RakNet::RakNetGUID& hostGuid)
|
|||||||
serverGuid = hostGuid;
|
serverGuid = hostGuid;
|
||||||
|
|
||||||
clearChunksLoaded();
|
clearChunksLoaded();
|
||||||
LoginPacket packet(minecraft->options.getStringValue(OPTIONS_USERNAME).c_str(), SharedConstants::NetworkProtocolVersion, true);
|
LoginPacket packet(minecraft->options.getStringValue(OPTIONS_USERNAME).c_str(), SharedConstants::NetworkProtocolVersion);
|
||||||
raknetInstance->send(packet);
|
raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,11 +97,6 @@ void ClientSideNetworkHandler::onUnableToConnect()
|
|||||||
|
|
||||||
void ClientSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& guid)
|
void ClientSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& guid)
|
||||||
{
|
{
|
||||||
LevelConstants::CHUNK_CACHE_WIDTH = 16;
|
|
||||||
LevelConstants::LEVEL_WIDTH = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_WIDTH;
|
|
||||||
LevelConstants::LEVEL_DEPTH = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_DEPTH;
|
|
||||||
|
|
||||||
// TODO: Good disconnecting
|
|
||||||
LOGI("onDisconnect\n");
|
LOGI("onDisconnect\n");
|
||||||
if (level)
|
if (level)
|
||||||
{
|
{
|
||||||
@@ -121,13 +109,9 @@ void ClientSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& guid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
minecraft->leaveGame();
|
#ifndef STANDALONE_SERVER
|
||||||
// minecraft->setLevel(NULL);
|
minecraft->gui.addMessage("Disconnected from server");
|
||||||
// #ifndef STANDALONE_SERVER
|
#endif
|
||||||
// minecraft->gui.addMessage("Disconnected from server");
|
|
||||||
// // TODO: screen with error
|
|
||||||
// minecraft->screenChooser.setScreen(SCREEN_STARTMENU);
|
|
||||||
// #endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginStatusPacket* packet) {
|
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginStatusPacket* packet) {
|
||||||
@@ -146,18 +130,6 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginSta
|
|||||||
LOGI("Disconnect! Server is outdated!\n");
|
LOGI("Disconnect! Server is outdated!\n");
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
minecraft->setScreen(new DisconnectionScreen("Could not connect: Outdated server!"));
|
minecraft->setScreen(new DisconnectionScreen("Could not connect: Outdated server!"));
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (packet->status == LoginStatus::Failed_TakenNickname) {
|
|
||||||
LOGI("Disconnect! Nickname is taken!\n");
|
|
||||||
#ifndef STANDALONE_SERVER
|
|
||||||
minecraft->setScreen(new DisconnectionScreen("Could not connect: Nickname is taken!"));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (packet->status == LoginStatus::Failed_Banned) {
|
|
||||||
LOGI("Disconnect! You're banned from this server!\n");
|
|
||||||
#ifndef STANDALONE_SERVER
|
|
||||||
minecraft->setScreen(new DisconnectionScreen("Could not connect: You're banned from this server!"));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -174,19 +146,6 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, StartGam
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @todo @note i think its trash
|
|
||||||
// we can put it directly to selectLevel?
|
|
||||||
if (packet->chunkCacheWidth != 0) {
|
|
||||||
printf("lol \n");
|
|
||||||
LevelConstants::CHUNK_CACHE_WIDTH = packet->chunkCacheWidth;
|
|
||||||
LevelConstants::LEVEL_WIDTH = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_WIDTH;
|
|
||||||
LevelConstants::LEVEL_DEPTH = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_DEPTH;
|
|
||||||
LevelChunk::ChunkBlockCount = LevelConstants::CHUNK_BLOCK_COUNT;
|
|
||||||
}
|
|
||||||
NumRequestChunks = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH;
|
|
||||||
requestNextChunkIndexList.resize(NumRequestChunks);
|
|
||||||
chunksLoaded.resize(NumRequestChunks);
|
|
||||||
|
|
||||||
const std::string& levelId = LevelStorageSource::TempLevelId;
|
const std::string& levelId = LevelStorageSource::TempLevelId;
|
||||||
LevelStorageSource* storageSource = minecraft->getLevelSource();
|
LevelStorageSource* storageSource = minecraft->getLevelSource();
|
||||||
storageSource->deleteLevel(levelId);
|
storageSource->deleteLevel(levelId);
|
||||||
@@ -223,7 +182,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, SetTimeP
|
|||||||
if (!level)
|
if (!level)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// LOGI("SetTimePacket\n");
|
LOGI("SetTimePacket\n");
|
||||||
level->setTime(packet->time);
|
level->setTime(packet->time);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,7 +238,7 @@ void ClientSideNetworkHandler::handle( const RakNet::RakNetGUID& source, AddPain
|
|||||||
}
|
}
|
||||||
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, AddMobPacket* packet)
|
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, AddMobPacket* packet)
|
||||||
{
|
{
|
||||||
// LOGI("AddMobPacket (%p)\n", level);
|
LOGI("AddMobPacket (%p)\n", level);
|
||||||
|
|
||||||
if (!level) {
|
if (!level) {
|
||||||
LOGW("Trying to add a mob with no level!\n");
|
LOGW("Trying to add a mob with no level!\n");
|
||||||
@@ -365,7 +324,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RemoveEn
|
|||||||
if (!level) return;
|
if (!level) return;
|
||||||
|
|
||||||
Entity* entity = level->getEntity(packet->entityId);
|
Entity* entity = level->getEntity(packet->entityId);
|
||||||
// LOGI("RemoveEntityPacket %p %p, %d\n", entity, minecraft->player, entity?(int)(entity->isPlayer()): -1);
|
LOGI("RemoveEntityPacket %p %p, %d\n", entity, minecraft->player, entity?(int)(entity->isPlayer()): -1);
|
||||||
if (!entity) return;
|
if (!entity) return;
|
||||||
|
|
||||||
level->removeEntity(entity);
|
level->removeEntity(entity);
|
||||||
@@ -385,7 +344,6 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, AddItemE
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, TakeItemEntityPacket* packet) {
|
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, TakeItemEntityPacket* packet) {
|
||||||
// printf("TakeItemEntityPacket \n");
|
|
||||||
if (!level) return;
|
if (!level) return;
|
||||||
|
|
||||||
Entity* e = level->getEntity(packet->itemId);
|
Entity* e = level->getEntity(packet->itemId);
|
||||||
@@ -428,54 +386,6 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, MovePlay
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, SendInventoryPacket* packet) {
|
|
||||||
if (!level) return;
|
|
||||||
|
|
||||||
if (packet->entityId == minecraft->player->entityId) {
|
|
||||||
auto items = packet->items;
|
|
||||||
|
|
||||||
minecraft->player->inventory->replace(items);
|
|
||||||
|
|
||||||
for (int i = 0; i < packet->linkedSlot.size(); i++) {
|
|
||||||
minecraft->player->inventory->linkSlot(i, packet->linkedSlot[i].inventorySlot, true);
|
|
||||||
LOGI("%i -> %i\n", packet->linkedSlot[i].inventorySlot, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, TakeItemPacket* packet) {
|
|
||||||
if (!level) return;
|
|
||||||
|
|
||||||
LOGI("TakeItemPacket\n");
|
|
||||||
|
|
||||||
ItemInstance* item;
|
|
||||||
|
|
||||||
item->count = packet->count;
|
|
||||||
item->id = packet->itemId;
|
|
||||||
item->setAuxValue(packet->auxValue);
|
|
||||||
|
|
||||||
// if (minecraft->player->entityId == packet->playerId) {
|
|
||||||
if (!minecraft->player->inventory->add(item)) {
|
|
||||||
minecraft->player->drop(new ItemInstance(*item), false);
|
|
||||||
}
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RemoveItemPacket* packet) {
|
|
||||||
// Idk how it works...
|
|
||||||
if (!level) return;
|
|
||||||
|
|
||||||
ItemInstance item;
|
|
||||||
|
|
||||||
item.count = packet->count;
|
|
||||||
item.id = packet->itemId;
|
|
||||||
item.setAuxValue(packet->auxValue);
|
|
||||||
|
|
||||||
// if (minecraft->player->entityId == packet->playerId) {
|
|
||||||
minecraft->player->inventory->removeResource(item);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, MoveEntityPacket* packet)
|
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, MoveEntityPacket* packet)
|
||||||
{
|
{
|
||||||
if (!level)
|
if (!level)
|
||||||
@@ -565,19 +475,19 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
|||||||
//unsigned char* blockIds = chunk->getBlockData();
|
//unsigned char* blockIds = chunk->getBlockData();
|
||||||
DataLayer& blockData = chunk->data;
|
DataLayer& blockData = chunk->data;
|
||||||
|
|
||||||
const int setSize = LevelConstants::LEVEL_HEIGHT / 8;
|
const int setSize = LEVEL_HEIGHT / 8;
|
||||||
const int setShift = 4; // power of LevelConstants::LEVEL_HEIGHT / 8
|
const int setShift = 4; // power of LEVEL_HEIGHT / 8
|
||||||
|
|
||||||
bool recalcHeight = false;
|
bool recalcHeight = false;
|
||||||
|
|
||||||
int x0 = 16, x1 = 0, z0 = 16, z1 = 0, y0 = LevelConstants::LEVEL_HEIGHT, y1 = 0;
|
int x0 = 16, x1 = 0, z0 = 16, z1 = 0, y0 = LEVEL_HEIGHT, y1 = 0;
|
||||||
int rx = packet->x << 4;
|
int rx = packet->x << 4;
|
||||||
int rz = packet->z << 4;
|
int rz = packet->z << 4;
|
||||||
|
|
||||||
unsigned char* readBlockBuffer = new unsigned char[setSize];
|
unsigned char readBlockBuffer[setSize];
|
||||||
unsigned char* readDataBuffer = new unsigned char[setSize / 2];
|
unsigned char readDataBuffer[setSize / 2];
|
||||||
|
|
||||||
for (int i = 0; i < LevelConstants::CHUNK_COLUMNS; i++)
|
for (int i = 0; i < CHUNK_COLUMNS; i++)
|
||||||
{
|
{
|
||||||
unsigned char updateBits = 0;
|
unsigned char updateBits = 0;
|
||||||
packet->chunkData.Read(updateBits);
|
packet->chunkData.Read(updateBits);
|
||||||
@@ -586,8 +496,8 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
|||||||
{
|
{
|
||||||
recalcHeight = true;
|
recalcHeight = true;
|
||||||
|
|
||||||
int colX = (i % LevelConstants::CHUNK_WIDTH);
|
int colX = (i % CHUNK_WIDTH);
|
||||||
int colZ = (i / LevelConstants::CHUNK_WIDTH);
|
int colZ = (i / CHUNK_WIDTH);
|
||||||
int colDataPosition = colX << 11 | colZ << 7;
|
int colDataPosition = colX << 11 | colZ << 7;
|
||||||
|
|
||||||
for (int set = 0; set < 8; set++)
|
for (int set = 0; set < 8; set++)
|
||||||
@@ -621,33 +531,30 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
|||||||
{
|
{
|
||||||
y0 = ((1 << set) << setShift);
|
y0 = ((1 << set) << setShift);
|
||||||
}
|
}
|
||||||
if (((1 << set) << setShift) + (LevelConstants::LEVEL_HEIGHT / 8) - 1 > y1)
|
if (((1 << set) << setShift) + (LEVEL_HEIGHT / 8) - 1 > y1)
|
||||||
{
|
{
|
||||||
y1 = ((1 << set) << setShift) + (LevelConstants::LEVEL_HEIGHT / 8) - 1;
|
y1 = ((1 << set) << setShift) + (LEVEL_HEIGHT / 8) - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((i % LevelConstants::CHUNK_WIDTH) < x0)
|
if ((i % CHUNK_WIDTH) < x0)
|
||||||
{
|
{
|
||||||
x0 = (i % LevelConstants::CHUNK_WIDTH);
|
x0 = (i % CHUNK_WIDTH);
|
||||||
}
|
}
|
||||||
if ((i % LevelConstants::CHUNK_WIDTH) > x1)
|
if ((i % CHUNK_WIDTH) > x1)
|
||||||
{
|
{
|
||||||
x1 = (i % LevelConstants::CHUNK_WIDTH);
|
x1 = (i % CHUNK_WIDTH);
|
||||||
}
|
}
|
||||||
if ((i / LevelConstants::CHUNK_WIDTH) < z0)
|
if ((i / CHUNK_WIDTH) < z0)
|
||||||
{
|
{
|
||||||
z0 = (i / LevelConstants::CHUNK_WIDTH);
|
z0 = (i / CHUNK_WIDTH);
|
||||||
}
|
}
|
||||||
if ((i / LevelConstants::CHUNK_WIDTH) > z1)
|
if ((i / CHUNK_WIDTH) > z1)
|
||||||
{
|
{
|
||||||
z1 = (i / LevelConstants::CHUNK_WIDTH);
|
z1 = (i / CHUNK_WIDTH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] readBlockBuffer;
|
|
||||||
delete[] readDataBuffer;
|
|
||||||
|
|
||||||
if (recalcHeight)
|
if (recalcHeight)
|
||||||
{
|
{
|
||||||
// chunk->recalcHeightmap();
|
// chunk->recalcHeightmap();
|
||||||
@@ -672,7 +579,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
|||||||
//chunk->terrainPopulated = true;
|
//chunk->terrainPopulated = true;
|
||||||
chunk->unsaved = false;
|
chunk->unsaved = false;
|
||||||
|
|
||||||
chunksLoaded[packet->x * LevelConstants::CHUNK_CACHE_WIDTH + packet->z] = true;
|
chunksLoaded[packet->x * CHUNK_CACHE_WIDTH + packet->z] = true;
|
||||||
|
|
||||||
if (areAllChunksLoaded())
|
if (areAllChunksLoaded())
|
||||||
{
|
{
|
||||||
@@ -720,18 +627,18 @@ void ClientSideNetworkHandler::arrangeRequestChunkOrder() {
|
|||||||
clearChunksLoaded();
|
clearChunksLoaded();
|
||||||
|
|
||||||
// Default sort is around center of the world
|
// Default sort is around center of the world
|
||||||
int cx = LevelConstants::CHUNK_CACHE_WIDTH / 2;
|
int cx = CHUNK_CACHE_WIDTH / 2;
|
||||||
int cz = LevelConstants::CHUNK_CACHE_WIDTH / 2;
|
int cz = CHUNK_CACHE_WIDTH / 2;
|
||||||
|
|
||||||
// If player exists, let's sort around him
|
// If player exists, let's sort around him
|
||||||
Player* p = minecraft? minecraft->player : NULL;
|
Player* p = minecraft? minecraft->player : NULL;
|
||||||
if (p) {
|
if (p) {
|
||||||
cx = Mth::floor(p->x / (float)LevelConstants::CHUNK_WIDTH);
|
cx = Mth::floor(p->x / (float)CHUNK_WIDTH);
|
||||||
cz = Mth::floor(p->z / (float)LevelConstants::CHUNK_DEPTH);
|
cz = Mth::floor(p->z / (float)CHUNK_DEPTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
_ChunkSorter sorter(cx, cz);
|
_ChunkSorter sorter(cx, cz);
|
||||||
std::sort(requestNextChunkIndexList.begin(), requestNextChunkIndexList.end(), sorter);
|
std::sort(requestNextChunkIndexList, requestNextChunkIndexList + NumRequestChunks, sorter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientSideNetworkHandler::levelGenerated(Level* level)
|
void ClientSideNetworkHandler::levelGenerated(Level* level)
|
||||||
@@ -821,7 +728,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, SetEntit
|
|||||||
if (!level)
|
if (!level)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// LOGI("SetEntityDataPacket\n");
|
LOGI("SetEntityDataPacket\n");
|
||||||
|
|
||||||
Entity* e = level->getEntity(packet->id);
|
Entity* e = level->getEntity(packet->id);
|
||||||
if (e) {
|
if (e) {
|
||||||
@@ -875,10 +782,6 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, AnimateP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemPacket* packet)
|
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemPacket* packet)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -888,7 +791,6 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, SetHealt
|
|||||||
if (!level || !minecraft->player)
|
if (!level || !minecraft->player)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
printf("SetHealthPacket \n");
|
|
||||||
minecraft->player->hurtTo(packet->health);
|
minecraft->player->hurtTo(packet->health);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -984,11 +886,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
|
|||||||
void ClientSideNetworkHandler::handle( const RakNet::RakNetGUID& source, ChatPacket* packet )
|
void ClientSideNetworkHandler::handle( const RakNet::RakNetGUID& source, ChatPacket* packet )
|
||||||
{
|
{
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
// minecraft->gui.displayClientMessage(packet->message);
|
minecraft->gui.displayClientMessage(packet->message);
|
||||||
std::istringstream iss(packet->message);
|
|
||||||
for (std::string line; std::getline(iss, line); ) {
|
|
||||||
minecraft->gui.addMessage(line);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1021,8 +919,8 @@ void ClientSideNetworkHandler::clearChunksLoaded()
|
|||||||
{
|
{
|
||||||
// Init the chunk positions
|
// Init the chunk positions
|
||||||
for (int i = 0; i < NumRequestChunks; ++i) {
|
for (int i = 0; i < NumRequestChunks; ++i) {
|
||||||
requestNextChunkIndexList[i].x = i / LevelConstants::CHUNK_WIDTH;
|
requestNextChunkIndexList[i].x = i/CHUNK_WIDTH;
|
||||||
requestNextChunkIndexList[i].y = i % LevelConstants::CHUNK_WIDTH;
|
requestNextChunkIndexList[i].y = i%CHUNK_WIDTH;
|
||||||
chunksLoaded[i] = false;
|
chunksLoaded[i] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,11 +77,6 @@ public:
|
|||||||
virtual void handle(const RakNet::RakNetGUID& source, ChatPacket* packet);
|
virtual void handle(const RakNet::RakNetGUID& source, ChatPacket* packet);
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, AdventureSettingsPacket* packet);
|
virtual void handle(const RakNet::RakNetGUID& source, AdventureSettingsPacket* packet);
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet);
|
virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet);
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, RemoveItemPacket* packet);
|
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, TakeItemPacket* packet);
|
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet);
|
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, SendInventoryPacket* packet);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void requestNextChunk();
|
void requestNextChunk();
|
||||||
@@ -102,11 +97,11 @@ private:
|
|||||||
BlockUpdateList bufferedBlockUpdates;
|
BlockUpdateList bufferedBlockUpdates;
|
||||||
int requestNextChunkPosition;
|
int requestNextChunkPosition;
|
||||||
|
|
||||||
int NumRequestChunks;
|
static const int NumRequestChunks = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH;
|
||||||
|
|
||||||
int requestNextChunkIndex;
|
int requestNextChunkIndex;
|
||||||
std::vector<IntPair> requestNextChunkIndexList;
|
IntPair requestNextChunkIndexList[NumRequestChunks];
|
||||||
std::vector<bool> chunksLoaded;
|
bool chunksLoaded[NumRequestChunks];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
33
src/network/NATPunchHandler.cpp
Executable file
33
src/network/NATPunchHandler.cpp
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#include "NATPunchHandler.h"
|
||||||
|
#include "../raknet/TCPInterface.h"
|
||||||
|
#include "../raknet/HTTPConnection.h"
|
||||||
|
#include "PHPDirectoryServer2.h"
|
||||||
|
|
||||||
|
using namespace RakNet;
|
||||||
|
NATPuchHandler::NATPuchHandler() {
|
||||||
|
tcpInterface = new TCPInterface;
|
||||||
|
}
|
||||||
|
NATPuchHandler::~NATPuchHandler() {
|
||||||
|
delete tcpInterface;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NATPuchHandler::initialize() {
|
||||||
|
tcpInterface->Start(0, 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NATPuchHandler::registerToGameList(const RakNet::RakString& serverName, int port) {
|
||||||
|
HTTPConnection httpConnection;
|
||||||
|
httpConnection.Init(tcpInterface, "johanbernhardsson.se");
|
||||||
|
PHPDirectoryServer2 directoryServer;
|
||||||
|
directoryServer.Init(&httpConnection, "/DirectoryServer.php");
|
||||||
|
directoryServer.UploadTable("", serverName, port, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NATPuchHandler::removeFromGameList() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void NATPuchHandler::close() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
24
src/network/NATPunchHandler.h
Executable file
24
src/network/NATPunchHandler.h
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
#ifndef _MINECRAFT_NETWORK_NATPUNCHHANDLER_H_
|
||||||
|
#define _MINECRAFT_NETWORK_NATPUNCHHANDLER_H_
|
||||||
|
#include "../raknet/TCPInterface.h"
|
||||||
|
#include "../raknet/RakString.h"
|
||||||
|
class NATPuchHandler {
|
||||||
|
public:
|
||||||
|
enum NATPuchHandlerStatus {
|
||||||
|
NATPuchInitilized = 0,
|
||||||
|
NATPuchFetchingServerList = 1,
|
||||||
|
NATPuchConnecting = 2,
|
||||||
|
NATPuchConnected = 3,
|
||||||
|
NATPuchDissconnected = 4
|
||||||
|
};
|
||||||
|
NATPuchHandler();
|
||||||
|
~NATPuchHandler();
|
||||||
|
void initialize();
|
||||||
|
void registerToGameList(const RakNet::RakString& serverName, int port);
|
||||||
|
void removeFromGameList();
|
||||||
|
void close();
|
||||||
|
private:
|
||||||
|
RakNet::TCPInterface *tcpInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _MINECRAFT_NETWORK_NATPUNCHHANDLER_H_ */
|
||||||
@@ -18,8 +18,6 @@ class RemovePlayerPacket;
|
|||||||
class RemoveEntityPacket;
|
class RemoveEntityPacket;
|
||||||
class MoveEntityPacket;
|
class MoveEntityPacket;
|
||||||
//class TeleportEntityPacket;
|
//class TeleportEntityPacket;
|
||||||
class RemoveItemPacket;
|
|
||||||
class TakeItemPacket;
|
|
||||||
class MovePlayerPacket;
|
class MovePlayerPacket;
|
||||||
class PlaceBlockPacket;
|
class PlaceBlockPacket;
|
||||||
class RemoveBlockPacket;
|
class RemoveBlockPacket;
|
||||||
@@ -50,7 +48,6 @@ class ContainerClosePacket;
|
|||||||
class ContainerSetSlotPacket;
|
class ContainerSetSlotPacket;
|
||||||
class ContainerSetDataPacket;
|
class ContainerSetDataPacket;
|
||||||
class ContainerSetContentPacket;
|
class ContainerSetContentPacket;
|
||||||
class WantCreatePacket;
|
|
||||||
class ChatPacket;
|
class ChatPacket;
|
||||||
class SignUpdatePacket;
|
class SignUpdatePacket;
|
||||||
class Minecraft;
|
class Minecraft;
|
||||||
@@ -122,9 +119,6 @@ public:
|
|||||||
virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet) {}
|
virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet) {}
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, AdventureSettingsPacket* packet) {}
|
virtual void handle(const RakNet::RakNetGUID& source, AdventureSettingsPacket* packet) {}
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, AnimatePacket* packet) {}
|
virtual void handle(const RakNet::RakNetGUID& source, AnimatePacket* packet) {}
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, RemoveItemPacket* packet) {}
|
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, TakeItemPacket* packet) {}
|
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet) {}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Common implementation for Client and Server
|
// Common implementation for Client and Server
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
#include "Packet.h"
|
#include "Packet.h"
|
||||||
#include "../world/level/chunk/LevelChunk.h"
|
#include "../world/level/chunk/LevelChunk.h"
|
||||||
|
|
||||||
#include "network/packet/TakeItemPacket.h"
|
|
||||||
#include "packet/PacketInclude.h"
|
#include "packet/PacketInclude.h"
|
||||||
|
|
||||||
Packet::Packet()
|
Packet::Packet()
|
||||||
@@ -42,12 +41,6 @@ Packet* MinecraftPackets::createPacket(int id)
|
|||||||
case PACKET_ADDITEMENTITY:
|
case PACKET_ADDITEMENTITY:
|
||||||
packet = new AddItemEntityPacket();
|
packet = new AddItemEntityPacket();
|
||||||
break;
|
break;
|
||||||
case PACKET_REMOVEITEM:
|
|
||||||
packet = new RemoveItemPacket();
|
|
||||||
break;
|
|
||||||
case PACKET_TAKEITEM:
|
|
||||||
packet = new TakeItemPacket();
|
|
||||||
break;
|
|
||||||
case PACKET_TAKEITEMENTITY:
|
case PACKET_TAKEITEMENTITY:
|
||||||
packet = new TakeItemEntityPacket();
|
packet = new TakeItemEntityPacket();
|
||||||
break;
|
break;
|
||||||
@@ -75,9 +68,6 @@ Packet* MinecraftPackets::createPacket(int id)
|
|||||||
case PACKET_RESPAWN:
|
case PACKET_RESPAWN:
|
||||||
packet = new RespawnPacket();
|
packet = new RespawnPacket();
|
||||||
break;
|
break;
|
||||||
case PACKET_WANTCREATEITEM:
|
|
||||||
packet = new WantCreatePacket();
|
|
||||||
break;
|
|
||||||
case PACKET_REMOVEENTITY:
|
case PACKET_REMOVEENTITY:
|
||||||
packet = new RemoveEntityPacket();
|
packet = new RemoveEntityPacket();
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -33,9 +33,6 @@ enum MinecraftPacketIds
|
|||||||
PACKET_REMOVEENTITY,
|
PACKET_REMOVEENTITY,
|
||||||
PACKET_ADDITEMENTITY,
|
PACKET_ADDITEMENTITY,
|
||||||
PACKET_TAKEITEMENTITY,
|
PACKET_TAKEITEMENTITY,
|
||||||
PACKET_TAKEITEM,
|
|
||||||
PACKET_REMOVEITEM,
|
|
||||||
PACKET_WANTCREATEITEM,
|
|
||||||
|
|
||||||
PACKET_MOVEENTITY,
|
PACKET_MOVEENTITY,
|
||||||
PACKET_MOVEENTITY_POS,
|
PACKET_MOVEENTITY_POS,
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ void RakNetInstance::runEvents(NetEventCallback* callback)
|
|||||||
case ID_DISCONNECTION_NOTIFICATION:
|
case ID_DISCONNECTION_NOTIFICATION:
|
||||||
case ID_CONNECTION_LOST:
|
case ID_CONNECTION_LOST:
|
||||||
callback->onDisconnect(currentEvent->guid);
|
callback->onDisconnect(currentEvent->guid);
|
||||||
return;
|
break;
|
||||||
case ID_UNCONNECTED_PONG:
|
case ID_UNCONNECTED_PONG:
|
||||||
{
|
{
|
||||||
RakNet::TimeMS time;
|
RakNet::TimeMS time;
|
||||||
|
|||||||
@@ -5,16 +5,6 @@
|
|||||||
#include "../world/entity/player/Inventory.h"
|
#include "../world/entity/player/Inventory.h"
|
||||||
#include "../world/Container.h"
|
#include "../world/Container.h"
|
||||||
#include "../world/inventory/BaseContainerMenu.h"
|
#include "../world/inventory/BaseContainerMenu.h"
|
||||||
#include "network/packet/ChatPacket.h"
|
|
||||||
#include "network/packet/ContainerSetSlotPacket.h"
|
|
||||||
#include "network/packet/LoginStatusPacket.h"
|
|
||||||
#include "network/packet/MovePlayerPacket.h"
|
|
||||||
#include "network/packet/RemoveBlockPacket.h"
|
|
||||||
#include "network/packet/SendInventoryPacket.h"
|
|
||||||
#include "network/packet/UpdateBlockPacket.h"
|
|
||||||
#include "network/packet/RemoveItemPacket.h"
|
|
||||||
#include "network/packet/TakeItemPacket.h"
|
|
||||||
#include "network/packet/WantCreatePacket.h"
|
|
||||||
#include "packet/PacketInclude.h"
|
#include "packet/PacketInclude.h"
|
||||||
|
|
||||||
#include "RakNetInstance.h"
|
#include "RakNetInstance.h"
|
||||||
@@ -23,17 +13,6 @@
|
|||||||
#include "../client/gamemode/GameMode.h"
|
#include "../client/gamemode/GameMode.h"
|
||||||
#include "../raknet/RakPeerInterface.h"
|
#include "../raknet/RakPeerInterface.h"
|
||||||
#include "../raknet/PacketPriority.h"
|
#include "../raknet/PacketPriority.h"
|
||||||
#include "platform/log.h"
|
|
||||||
#include "util/Mth.h"
|
|
||||||
#include "util/StringUtils.h"
|
|
||||||
#include "world/item/ItemInstance.h"
|
|
||||||
#include "world/level/LevelConstants.h"
|
|
||||||
#include "world/level/storage/LevelStorage.h"
|
|
||||||
#include "world/phys/Vec3.h"
|
|
||||||
#include "world/item/crafting/Recipe.h"
|
|
||||||
#include "world/item/crafting/Recipes.h"
|
|
||||||
#include <cstddef>
|
|
||||||
#include <cstdio>
|
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
#include "../client/sound/SoundEngine.h"
|
#include "../client/sound/SoundEngine.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -74,11 +53,11 @@ void ServerSideNetworkHandler::tileChanged(int x, int y, int z)
|
|||||||
|
|
||||||
Packet* ServerSideNetworkHandler::getAddPacketFromEntity( Entity* entity ) {
|
Packet* ServerSideNetworkHandler::getAddPacketFromEntity( Entity* entity ) {
|
||||||
if (entity->isMob() && !entity->isPlayer()) { //@fix: This code is duplicated. See if it can be unified.
|
if (entity->isMob() && !entity->isPlayer()) { //@fix: This code is duplicated. See if it can be unified.
|
||||||
// if (minecraft->player) {
|
if (minecraft->player) {
|
||||||
// I guess this should always be true, but it crashed somewhere in this
|
// I guess this should always be true, but it crashed somewhere in this
|
||||||
// function once and I only see this one as a potential problem
|
// function once and I only see this one as a potential problem
|
||||||
return new AddMobPacket((Mob*)entity);
|
return new AddMobPacket((Mob*)entity);
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
else if (entity->isPlayer()) {
|
else if (entity->isPlayer()) {
|
||||||
|
|
||||||
@@ -155,37 +134,9 @@ void ServerSideNetworkHandler::displayGameMessage(const std::string& message)
|
|||||||
raknetInstance->send(packet);
|
raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, MessagePacket* packet)
|
|
||||||
{
|
|
||||||
auto player = getPlayer(source);
|
|
||||||
|
|
||||||
if (player == nullptr) return; // @todo maybe kick?
|
|
||||||
std::string msg = packet->message.C_String();
|
|
||||||
|
|
||||||
if (msg[0] == '/') {
|
|
||||||
// This is a command
|
|
||||||
|
|
||||||
ChatPacket resp(minecraft->commandManager().execute(*minecraft, *player, Util::stringTrim(msg.substr(1))));
|
|
||||||
return sendPrivate(resp, source);
|
|
||||||
}
|
|
||||||
|
|
||||||
displayGameMessage("<" + player->name + "> " + msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChatPacket* packet)
|
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChatPacket* packet)
|
||||||
{
|
{
|
||||||
auto player = getPlayer(source);
|
displayGameMessage(packet->message);
|
||||||
|
|
||||||
if (player == nullptr) return; // @todo maybe kick?
|
|
||||||
|
|
||||||
if (packet->message[0] == '/') {
|
|
||||||
// This is a command
|
|
||||||
|
|
||||||
ChatPacket resp(minecraft->commandManager().execute(*minecraft, *player, Util::stringTrim(packet->message.substr(1))));
|
|
||||||
return sendPrivate(resp, source);
|
|
||||||
}
|
|
||||||
|
|
||||||
displayGameMessage("<" + player->name + "> " + packet->message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSideNetworkHandler::onNewClient(const RakNet::RakNetGUID& clientGuid)
|
void ServerSideNetworkHandler::onNewClient(const RakNet::RakNetGUID& clientGuid)
|
||||||
@@ -205,8 +156,6 @@ void ServerSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& guid)
|
|||||||
|
|
||||||
if (player->owner == guid)
|
if (player->owner == guid)
|
||||||
{
|
{
|
||||||
minecraft->level->getLevelStorage()->savePlayer(*player);
|
|
||||||
|
|
||||||
std::string message = player->name;
|
std::string message = player->name;
|
||||||
message += " disconnected from the game";
|
message += " disconnected from the game";
|
||||||
displayGameMessage(message);
|
displayGameMessage(message);
|
||||||
@@ -237,32 +186,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginPac
|
|||||||
//
|
//
|
||||||
bool oldClient = packet->clientNetworkVersion < SharedConstants::NetworkProtocolLowestSupportedVersion;
|
bool oldClient = packet->clientNetworkVersion < SharedConstants::NetworkProtocolLowestSupportedVersion;
|
||||||
bool oldServer = packet->clientNetworkLowestSupportedVersion > SharedConstants::NetworkProtocolVersion;
|
bool oldServer = packet->clientNetworkLowestSupportedVersion > SharedConstants::NetworkProtocolVersion;
|
||||||
if (oldClient || oldServer || !packet->newProto)
|
if (oldClient || oldServer)
|
||||||
loginStatus = oldClient || !packet->newProto? LoginStatus::Failed_ClientOld : LoginStatus::Failed_ServerOld;
|
loginStatus = oldClient? LoginStatus::Failed_ClientOld : LoginStatus::Failed_ServerOld;
|
||||||
|
|
||||||
std::string nicknameLower = packet->clientName.C_String();
|
|
||||||
std::transform(nicknameLower.begin(), nicknameLower.end(), nicknameLower.begin(), ::tolower);
|
|
||||||
|
|
||||||
printf("%s lower \n", nicknameLower.c_str());
|
|
||||||
for (int i = 0; i < level->players.size(); i++) {
|
|
||||||
ServerPlayer* player = (ServerPlayer*) level->players.at(i);
|
|
||||||
|
|
||||||
std::string clientLower = player->name;
|
|
||||||
std::transform(clientLower.begin(), clientLower.end(), clientLower.begin(), ::tolower);
|
|
||||||
|
|
||||||
// @todo to lower case
|
|
||||||
if (nicknameLower == clientLower) {
|
|
||||||
loginStatus = packet->newProto ? LoginStatus::Failed_TakenNickname : LoginStatus::Failed_ClientOld;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto& banned : level->bannedPlayers) {
|
|
||||||
if (nicknameLower == banned) {
|
|
||||||
loginStatus = packet->newProto ? LoginStatus::Failed_Banned : LoginStatus::Failed_ClientOld;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RakNet::BitStream bitStream;
|
RakNet::BitStream bitStream;
|
||||||
LoginStatusPacket(loginStatus).write(&bitStream);
|
LoginStatusPacket(loginStatus).write(&bitStream);
|
||||||
@@ -274,16 +199,13 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginPac
|
|||||||
//
|
//
|
||||||
// Valid client version
|
// Valid client version
|
||||||
//
|
//
|
||||||
|
Player* newPlayer = new ServerPlayer(minecraft, level);
|
||||||
Player* newPlayer = new ServerPlayer(minecraft, level, packet->newProto);
|
|
||||||
|
|
||||||
minecraft->gameMode->initAbilities(newPlayer->abilities);
|
minecraft->gameMode->initAbilities(newPlayer->abilities);
|
||||||
newPlayer->owner = source;
|
newPlayer->owner = source;
|
||||||
newPlayer->name = packet->clientName.C_String();
|
newPlayer->name = packet->clientName.C_String();
|
||||||
_pendingPlayers.push_back(newPlayer);
|
_pendingPlayers.push_back(newPlayer);
|
||||||
|
|
||||||
LOGI("Adding new player... isCreative: %i\n", minecraft->isCreativeMode());
|
|
||||||
|
|
||||||
// Reset the player so he doesn't spawn inside blocks
|
// Reset the player so he doesn't spawn inside blocks
|
||||||
while (newPlayer->y > 0) {
|
while (newPlayer->y > 0) {
|
||||||
newPlayer->setPos(newPlayer->x, newPlayer->y, newPlayer->z);
|
newPlayer->setPos(newPlayer->x, newPlayer->y, newPlayer->z);
|
||||||
@@ -306,8 +228,7 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginPac
|
|||||||
level->getLevelData()->getGeneratorVersion(),
|
level->getLevelData()->getGeneratorVersion(),
|
||||||
gameType,
|
gameType,
|
||||||
newPlayer->entityId,
|
newPlayer->entityId,
|
||||||
newPlayer->x, newPlayer->y - newPlayer->heightOffset, newPlayer->z,
|
newPlayer->x, newPlayer->y - newPlayer->heightOffset, newPlayer->z
|
||||||
LevelConstants::CHUNK_CACHE_WIDTH
|
|
||||||
).write(&bitStream);
|
).write(&bitStream);
|
||||||
|
|
||||||
rakPeer->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, 0, source, false);
|
rakPeer->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, 0, source, false);
|
||||||
@@ -323,8 +244,6 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ReadyPac
|
|||||||
|
|
||||||
if (packet->type == ReadyPacket::READY_REQUESTEDCHUNKS)
|
if (packet->type == ReadyPacket::READY_REQUESTEDCHUNKS)
|
||||||
onReady_RequestedChunks(source);
|
onReady_RequestedChunks(source);
|
||||||
|
|
||||||
LOGI("Ready player two ready ready player two!!\n ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSideNetworkHandler::onReady_ClientGeneration(const RakNet::RakNetGUID& source)
|
void ServerSideNetworkHandler::onReady_ClientGeneration(const RakNet::RakNetGUID& source)
|
||||||
@@ -382,36 +301,6 @@ void ServerSideNetworkHandler::onReady_ClientGeneration(const RakNet::RakNetGUID
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!minecraft->level->getLevelStorage()->loadPlayer(*newPlayer)) {
|
|
||||||
LOGW("Failed to load %s data\n", newPlayer->name.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Credits to EpikIzCool
|
|
||||||
bitStream.Reset();
|
|
||||||
MovePlayerPacket mv(newPlayer->entityId, newPlayer->x, newPlayer->y - newPlayer->heightOffset,
|
|
||||||
newPlayer->z, newPlayer->xRot, newPlayer->yRot);
|
|
||||||
mv.write(&bitStream);
|
|
||||||
|
|
||||||
rakPeer->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, 0, source, false);
|
|
||||||
|
|
||||||
bitStream.Reset();
|
|
||||||
SetHealthPacket hp(newPlayer->health);
|
|
||||||
hp.write(&bitStream);
|
|
||||||
|
|
||||||
rakPeer->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, 0, source, false);
|
|
||||||
|
|
||||||
if (newPlayer->hasRespawnPosition()) {
|
|
||||||
bitStream.Reset();
|
|
||||||
SetSpawnPositionPacket sp(newPlayer->getRespawnPosition());
|
|
||||||
sp.write(&bitStream);
|
|
||||||
rakPeer->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, 0, source, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
bitStream.Reset();
|
|
||||||
SendInventoryPacket(newPlayer, false).write(&bitStream);
|
|
||||||
rakPeer->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, 0, source, false);
|
|
||||||
|
|
||||||
|
|
||||||
// Additional packets
|
// Additional packets
|
||||||
// * set spawn
|
// * set spawn
|
||||||
/*
|
/*
|
||||||
@@ -451,30 +340,13 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, MovePlay
|
|||||||
if (!level) return;
|
if (!level) return;
|
||||||
|
|
||||||
//LOGI("MovePlayerPacket\n");
|
//LOGI("MovePlayerPacket\n");
|
||||||
if (Entity* entity = level->getEntity(packet->entityId)) {
|
if (Entity* entity = level->getEntity(packet->entityId))
|
||||||
ServerPlayer* player = (ServerPlayer*) getPlayer(source);
|
{
|
||||||
|
|
||||||
// int timeElapsed = minecraft->getTicks() - player->getLastMoveTicks();
|
|
||||||
|
|
||||||
// if (timeElapsed > 0) {
|
|
||||||
// float dist = player->distanceTo(packet->x, player->y, packet->z);
|
|
||||||
// float speed = dist / (minecraft->getTicks() - player->getLastMoveTicks());
|
|
||||||
// player->setLastMoveTicks(minecraft->getTicks());
|
|
||||||
|
|
||||||
// float maxSpeed = (minecraft->isCreativeMode()) ? 1.65f : 1.f;
|
|
||||||
|
|
||||||
// if (speed > maxSpeed) {
|
|
||||||
// MovePlayerPacket refuse(player->entityId, player->x, player->y, player->z, player->xRot, player->yRot);
|
|
||||||
// return raknetInstance->send(refuse);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
entity->xd = entity->yd = entity->zd = 0;
|
entity->xd = entity->yd = entity->zd = 0;
|
||||||
entity->lerpTo(packet->x, packet->y, packet->z, packet->yRot, packet->xRot, 3);
|
entity->lerpTo(packet->x, packet->y, packet->z, packet->yRot, packet->xRot, 3);
|
||||||
|
|
||||||
// broadcast this packet to other clients
|
// broadcast this packet to other clients
|
||||||
redistributePacket(packet, source);
|
redistributePacket(packet, source);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -496,29 +368,12 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RemoveBl
|
|||||||
if (oldTile != NULL && changed) {
|
if (oldTile != NULL && changed) {
|
||||||
level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, oldTile->soundType->getBreakSound(), (oldTile->soundType->getVolume() + 1) / 2, oldTile->soundType->getPitch() * 0.8f);
|
level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, oldTile->soundType->getBreakSound(), (oldTile->soundType->getVolume() + 1) / 2, oldTile->soundType->getPitch() * 0.8f);
|
||||||
|
|
||||||
if (minecraft->gameMode->isSurvivalType() && player->canDestroy(oldTile)) {
|
if (minecraft->gameMode->isSurvivalType() && player->canDestroy(oldTile))
|
||||||
// From SurvivalMode.cpp
|
|
||||||
// Why tf i have to copy this shit from SurvivalMode class
|
|
||||||
// Why SurvivalMode class locked to LOCAL MINECRAFT PLAYER :sob: :sob: :sob: :sob: :sob: :sob: :sob: :sob:
|
|
||||||
// @fix @warn @ahtung @alert
|
|
||||||
ItemInstance* item = player->inventory->getSelected();
|
|
||||||
if (item != NULL) {
|
|
||||||
item->mineBlock(oldTile->id, x, y, z);
|
|
||||||
if (item->count == 0) {
|
|
||||||
//item->snap(minecraft->player);
|
|
||||||
player->inventory->clearSlot(player->inventory->selected);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//oldTile->spawnResources(level, x, y, z, data, 1); //@todo
|
//oldTile->spawnResources(level, x, y, z, data, 1); //@todo
|
||||||
oldTile->playerDestroy(level, player, x, y, z, data);
|
oldTile->playerDestroy(level, player, x, y, z, data);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
oldTile->destroy(level, x, y, z, data);
|
oldTile->destroy(level, x, y, z, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGI("Remove block [%i, %i, %i]\n", packet->x, packet->y, packet->z);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RequestChunkPacket* packet)
|
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RequestChunkPacket* packet)
|
||||||
@@ -548,8 +403,6 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RequestC
|
|||||||
raknetInstance->send(source, p);
|
raknetInstance->send(source, p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// LOGI("Requested chunk [%i, %i]\n", packet->x, packet->z);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSideNetworkHandler::levelGenerated( Level* level )
|
void ServerSideNetworkHandler::levelGenerated( Level* level )
|
||||||
@@ -576,31 +429,23 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, PlayerEq
|
|||||||
if (!player) return;
|
if (!player) return;
|
||||||
if (rakPeer->GetMyGUID() == player->owner) return;
|
if (rakPeer->GetMyGUID() == player->owner) return;
|
||||||
|
|
||||||
LOGI("Equip item: id %i aux %i\n", packet->itemId, packet->itemAuxValue);
|
|
||||||
|
|
||||||
// override the player's inventory
|
// override the player's inventory
|
||||||
int slot = player->inventory->getSlot(packet->itemId, packet->itemAuxValue);
|
//int slot = player->inventory->getSlot(packet->itemId, packet->itemAuxValue);
|
||||||
|
int slot = Inventory::MAX_SELECTION_SIZE;
|
||||||
if (slot >= 0 && slot != packet->inventorySlot && packet->itemId != 0) {
|
if (slot >= 0) {
|
||||||
LOGW("PlayerEquipmentPacket: Item in player inventory but slots doesn't match!");
|
if (packet->itemId == 0) {
|
||||||
packet->inventorySlot = slot;
|
player->inventory->clearSlot(slot);
|
||||||
|
} else {
|
||||||
|
// @note: 128 is an ugly hack for depletable items.
|
||||||
|
// @todo: fix
|
||||||
|
ItemInstance newItem(packet->itemId, 128, packet->itemAuxValue);
|
||||||
|
player->inventory->replaceSlot(slot, &newItem);
|
||||||
}
|
}
|
||||||
|
player->inventory->moveToSelectedSlot(slot, true);
|
||||||
if (slot < 0 && packet->itemId != 0) {
|
|
||||||
LOGW("PlayerEquipmentPacket: Remote player doesn't have his thing (or crafted it)!\n");
|
|
||||||
|
|
||||||
SendInventoryPacket newInventory (player, false);
|
|
||||||
raknetInstance->send(newInventory);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
player->inventory->selectSlot(packet->selectedSlot);
|
|
||||||
player->inventory->linkSlot(packet->selectedSlot, packet->inventorySlot, true);
|
|
||||||
|
|
||||||
player->inventory->print();
|
|
||||||
|
|
||||||
redistributePacket(packet, source);
|
redistributePacket(packet, source);
|
||||||
|
} else {
|
||||||
|
LOGW("Warning: Remote player doesn't have his thing, Odd!\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, PlayerArmorEquipmentPacket* packet) {
|
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, PlayerArmorEquipmentPacket* packet) {
|
||||||
@@ -610,8 +455,6 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, PlayerAr
|
|||||||
if (!player) return;
|
if (!player) return;
|
||||||
if (rakPeer->GetMyGUID() == player->owner) return;
|
if (rakPeer->GetMyGUID() == player->owner) return;
|
||||||
|
|
||||||
// LOGI("Equip armor: %i %i %i %i\n", packet->head, packet->torso, packet->legs, packet->feet);
|
|
||||||
|
|
||||||
packet->fillIn(player);
|
packet->fillIn(player);
|
||||||
redistributePacket(packet, source);
|
redistributePacket(packet, source);
|
||||||
}
|
}
|
||||||
@@ -623,8 +466,6 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Interact
|
|||||||
Entity* entity = level->getEntity(packet->targetId);
|
Entity* entity = level->getEntity(packet->targetId);
|
||||||
if (src && entity && src->isPlayer())
|
if (src && entity && src->isPlayer())
|
||||||
{
|
{
|
||||||
LOGI("Interact: source %i target %i\n", packet->sourceId, packet->targetId);
|
|
||||||
|
|
||||||
Player* player = (Player*) src;
|
Player* player = (Player*) src;
|
||||||
if (InteractPacket::Attack == packet->action) {
|
if (InteractPacket::Attack == packet->action) {
|
||||||
player->swing();
|
player->swing();
|
||||||
@@ -665,75 +506,14 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, AnimateP
|
|||||||
}
|
}
|
||||||
redistributePacket(packet, source);
|
redistributePacket(packet, source);
|
||||||
}
|
}
|
||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet) {
|
|
||||||
LOGI("WantCreatePacket\n");
|
|
||||||
Entity* entity = level->getEntity(packet->playerId);
|
|
||||||
|
|
||||||
if (entity && entity->isPlayer()) {
|
|
||||||
Player* p = (Player*)entity;
|
|
||||||
|
|
||||||
auto playerInv = p->inventory;
|
|
||||||
|
|
||||||
ItemInstance wantCreate;
|
|
||||||
|
|
||||||
wantCreate.id = packet->itemId;
|
|
||||||
wantCreate.count = packet->count;
|
|
||||||
wantCreate.setAuxValue(packet->auxValue);
|
|
||||||
|
|
||||||
Recipe* recipe = Recipes::getInstance()->getRecipeFor(wantCreate);
|
|
||||||
|
|
||||||
std::vector<ItemInstance> items = recipe->getItemPack().getItemInstances();
|
|
||||||
|
|
||||||
std::vector<int> checkForExists = {};
|
|
||||||
|
|
||||||
for (int i = Inventory::MAX_SELECTION_SIZE; i < p->inventory->getContainerSize(); ++i) {
|
|
||||||
auto itm = p->inventory->getItem(i);
|
|
||||||
|
|
||||||
if (itm != NULL) {
|
|
||||||
for (int y = 0; y < items.size(); y++) {
|
|
||||||
auto itmRecipe = items.at(y);
|
|
||||||
|
|
||||||
if (itmRecipe.id == itm->id && itm->count >= itmRecipe.count) {
|
|
||||||
checkForExists.push_back(itm->id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (checkForExists.empty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < items.size(); i++) {
|
|
||||||
auto item = items.at(i);
|
|
||||||
|
|
||||||
auto it = std::find(checkForExists.begin(), checkForExists.end(), item.id);
|
|
||||||
|
|
||||||
if (it == checkForExists.end() && checkForExists.size() > 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < items.size(); i++) {
|
|
||||||
p->inventory->removeResource(ItemInstance(items.at(i).id, items.at(i).count, items.at(i).getAuxValue()));
|
|
||||||
}
|
|
||||||
// TakeItemPacket itemAdd(p->entityId, wantCreate.count, wantCreate.getAuxValue(), wantCreate.id);
|
|
||||||
// raknetInstance->send(source, itemAdd);
|
|
||||||
|
|
||||||
p->inventory->add(new ItemInstance(wantCreate.id, wantCreate.count, wantCreate.getAuxValue()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemPacket* packet)
|
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemPacket* packet)
|
||||||
{
|
{
|
||||||
if (!level) return;
|
if (!level) return;
|
||||||
|
|
||||||
LOGI("UseItemPacket: id %i data %i\n", packet->itemId, packet->itemData);
|
LOGI("UseItemPacket\n");
|
||||||
Entity* entity = level->getEntity(packet->entityId);
|
Entity* entity = level->getEntity(packet->entityId);
|
||||||
|
|
||||||
if (entity && entity->isPlayer()) {
|
if (entity && entity->isPlayer()) {
|
||||||
LOGI("%f %f %f \n", entity->x, entity->y, entity->z);
|
|
||||||
|
|
||||||
Player* player = (Player*) entity;
|
Player* player = (Player*) entity;
|
||||||
int x = packet->x, y = packet->y, z = packet->z;
|
int x = packet->x, y = packet->y, z = packet->z;
|
||||||
Tile* t = Tile::tiles[level->getTile(x, y, z)];
|
Tile* t = Tile::tiles[level->getTile(x, y, z)];
|
||||||
@@ -742,41 +522,7 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemP
|
|||||||
if (t && t->use(level, x, y, z, player)) return;
|
if (t && t->use(level, x, y, z, player)) return;
|
||||||
if (packet->item.isNull()) return;
|
if (packet->item.isNull()) return;
|
||||||
|
|
||||||
ItemInstance* packetItem = &packet->item;
|
ItemInstance* item = &packet->item;
|
||||||
|
|
||||||
int slot = player->inventory->getSlot(packet->itemId, packet->itemData);
|
|
||||||
|
|
||||||
if (slot < 0) {
|
|
||||||
LOGW("UseItemPacket: Player doesn't have this item!\n");
|
|
||||||
|
|
||||||
auto pos = Vec3(packet->x, packet->y, packet->z);
|
|
||||||
|
|
||||||
if (ItemInstance::isBlock(packetItem)) {
|
|
||||||
LOGI("UseItemPacket: This is even block!!!\n");
|
|
||||||
|
|
||||||
pos.x += packet->clickX;
|
|
||||||
pos.y += packet->clickY;
|
|
||||||
pos.z += packet->clickZ;
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateBlockPacket refuse(pos.x, pos.y, pos.z, level->getTile(pos.x, pos.y, pos.z), level->getData(pos.x, pos.y, pos.z));
|
|
||||||
raknetInstance->send(refuse);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemInstance* item = player->inventory->getItem(slot);
|
|
||||||
player->x = packet->playerX;
|
|
||||||
player->y = packet->playerY;
|
|
||||||
player->z = packet->playerZ;
|
|
||||||
|
|
||||||
player->bb.x0 = packet->playerX0;
|
|
||||||
player->bb.y0 = packet->playerY0;
|
|
||||||
player->bb.z0 = packet->playerZ0;
|
|
||||||
|
|
||||||
player->bb.x1 = packet->playerX1;
|
|
||||||
player->bb.y1 = packet->playerY1;
|
|
||||||
player->bb.z1 = packet->playerZ1;
|
|
||||||
|
|
||||||
if(packet->face == 255) {
|
if(packet->face == 255) {
|
||||||
// Special case: x,y,z means direction-of-action
|
// Special case: x,y,z means direction-of-action
|
||||||
@@ -788,10 +534,6 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemP
|
|||||||
Vec3(packet->clickX + packet->x, packet->clickY + packet->y, packet->clickZ + packet->z));
|
Vec3(packet->clickX + packet->x, packet->clickY + packet->y, packet->clickZ + packet->z));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item && item->count <= 0) {
|
|
||||||
player->inventory->clearSlot(slot);
|
|
||||||
}
|
|
||||||
|
|
||||||
//LOGW("Use Item not working! Out of synch?\n");
|
//LOGW("Use Item not working! Out of synch?\n");
|
||||||
|
|
||||||
// Don't have to redistribute (ugg.. this will mess up), cause tileUpdated is sent
|
// Don't have to redistribute (ugg.. this will mess up), cause tileUpdated is sent
|
||||||
@@ -802,8 +544,6 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemP
|
|||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, EntityEventPacket* packet) {
|
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, EntityEventPacket* packet) {
|
||||||
if (!level) return;
|
if (!level) return;
|
||||||
|
|
||||||
LOGI("EntityEventPacket: id %i\n", packet->eventId);
|
|
||||||
|
|
||||||
if (Entity* e = level->getEntity(packet->entityId))
|
if (Entity* e = level->getEntity(packet->entityId))
|
||||||
e->handleEntityEvent(packet->eventId);
|
e->handleEntityEvent(packet->eventId);
|
||||||
}
|
}
|
||||||
@@ -837,11 +577,6 @@ void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, SendInv
|
|||||||
{
|
{
|
||||||
if (!level) return;
|
if (!level) return;
|
||||||
|
|
||||||
LOGI("SendInventoryPacket:\n");
|
|
||||||
for (int i = 0; i < packet->numItems; i++) {
|
|
||||||
LOGI("\t %i: %s (%i)\n", i, packet->items.at(i).getName().c_str(), packet->items.at(i).count);
|
|
||||||
}
|
|
||||||
|
|
||||||
Entity* entity = level->getEntity(packet->entityId);
|
Entity* entity = level->getEntity(packet->entityId);
|
||||||
if (entity && entity->isPlayer()) {
|
if (entity && entity->isPlayer()) {
|
||||||
Player* p = (Player*)entity;
|
Player* p = (Player*)entity;
|
||||||
@@ -857,27 +592,15 @@ void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, DropIte
|
|||||||
{
|
{
|
||||||
if (!level) return;
|
if (!level) return;
|
||||||
|
|
||||||
LOGI("DropItemPacket\n");
|
|
||||||
|
|
||||||
Entity* entity = level->getEntity(packet->entityId);
|
Entity* entity = level->getEntity(packet->entityId);
|
||||||
if (entity && entity->isPlayer()) {
|
if (entity && entity->isPlayer()) {
|
||||||
Player* p = (Player*)entity;
|
Player* p = (Player*)entity;
|
||||||
// p->drop(new ItemInstance(packet->item), packet->dropType != 0);
|
p->drop(new ItemInstance(packet->item), packet->dropType != 0);
|
||||||
|
|
||||||
int slot = p->inventory->getSlot(packet->item.id, packet->item.getAuxValue());
|
|
||||||
|
|
||||||
if (slot < 0) {
|
|
||||||
LOGW("DropItemPacket: player doesn't have these items!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
p->inventory->dropSlot(slot, false, packet->dropType != 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ContainerClosePacket* packet) {
|
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ContainerClosePacket* packet) {
|
||||||
if (!level) return;
|
if (!level) return;
|
||||||
LOGI("ContainerClosePacket\n");
|
|
||||||
|
|
||||||
Player* p = findPlayer(level, &source);
|
Player* p = findPlayer(level, &source);
|
||||||
if (!p) return;
|
if (!p) return;
|
||||||
@@ -889,16 +612,6 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
|
|||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ContainerSetSlotPacket* packet) {
|
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ContainerSetSlotPacket* packet) {
|
||||||
if (!level) return;
|
if (!level) return;
|
||||||
|
|
||||||
const char* type = "unknown";
|
|
||||||
|
|
||||||
switch (packet->setType) {
|
|
||||||
case ContainerSetSlotPacket::SETTYPE_ADD: type = "add"; break;
|
|
||||||
case ContainerSetSlotPacket::SETTYPE_SET: type = "set"; break;
|
|
||||||
case ContainerSetSlotPacket::SETTYPE_TAKE: type = "take"; break;
|
|
||||||
};
|
|
||||||
|
|
||||||
LOGI("ContainerSetSlot: slot %i item %s type %s\n", packet->slot, packet->item.getName().c_str(), type);
|
|
||||||
|
|
||||||
Player* p = findPlayer(level, &source);
|
Player* p = findPlayer(level, &source);
|
||||||
if (!p) return;
|
if (!p) return;
|
||||||
|
|
||||||
@@ -906,80 +619,12 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
|
|||||||
LOGW("User has no container!\n");
|
LOGW("User has no container!\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (p->containerMenu->containerId != packet->containerId)
|
||||||
if (p->containerMenu->containerId != packet->containerId) {
|
{
|
||||||
LOGW("Wrong container id: %d vs %d\n", p->containerMenu->containerId, packet->containerId);
|
LOGW("Wrong container id: %d vs %d\n", p->containerMenu->containerId, packet->containerId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet->item.count > 64) {
|
|
||||||
LOGW("ContainerSetSlotPacket: player tried to put more than 64");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto contItems = p->containerMenu->getItems();
|
|
||||||
|
|
||||||
// find same item in player inventory (used not in all cases)
|
|
||||||
int invSlot = p->inventory->getSlot(packet->item.id, packet->item.getAuxValue());
|
|
||||||
auto invItem = p->inventory->getItem(invSlot);
|
|
||||||
|
|
||||||
if (contItems.at(packet->slot).id == 0 && packet->item.id != 0) {
|
|
||||||
LOGI("ContainerSetSlotPacket: player tried to put items to slot %i\n", packet->slot);
|
|
||||||
|
|
||||||
if (invSlot < 0) {
|
|
||||||
LOGW("ContainerSetSlotPacket: player doesn't have this item\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (invItem->count < packet->item.count) {
|
|
||||||
LOGW("ContainerSetSlotPacket: player tried to put more than he have\n");
|
|
||||||
packet->item.count = invItem->count;
|
|
||||||
}
|
|
||||||
|
|
||||||
invItem->count -= packet->item.count;
|
|
||||||
|
|
||||||
if (invItem->count <= 0) {
|
|
||||||
p->inventory->removeItem(invItem);
|
|
||||||
}
|
|
||||||
} else if(contItems.at(packet->slot).id == packet->item.id) {
|
|
||||||
int deltaItem = packet->item.count - contItems.at(packet->slot).count;
|
|
||||||
|
|
||||||
if (deltaItem > 0) {
|
|
||||||
LOGI("ContainerSetSlotPacket: player tried to add %i items to slot %i\n", deltaItem, packet->slot);
|
|
||||||
|
|
||||||
auto invItem = p->inventory->getItem(invSlot);
|
|
||||||
|
|
||||||
if (invSlot < 0) {
|
|
||||||
LOGW("ContainerSetSlotPacket: player doesn't have this item\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (invItem->count < deltaItem) {
|
|
||||||
LOGW("ContainerSetSlotPacket: player tried to put more than he have");
|
|
||||||
packet->item.count -= (deltaItem - invItem->count);
|
|
||||||
deltaItem = invItem->count;
|
|
||||||
}
|
|
||||||
|
|
||||||
invItem->count -= deltaItem;
|
|
||||||
|
|
||||||
if (invItem->count <= 0) {
|
|
||||||
p->inventory->removeItem(invItem);
|
|
||||||
}
|
|
||||||
} else if (deltaItem < 0) {
|
|
||||||
LOGW("ContainerSetSlotPacket: player tried to take %i items from slot %i\n", -deltaItem, packet->slot);
|
|
||||||
p->inventory->add(new ItemInstance(packet->item.getItem(), -deltaItem, contItems.at(packet->slot).getAuxValue()));
|
|
||||||
}
|
|
||||||
} else if(contItems.at(packet->slot).id && !packet->item.id) {
|
|
||||||
LOGI("ContainerSetSlotPacket: player tried to take all items from slot %i\n", packet->slot);
|
|
||||||
packet->item.count = 0;
|
|
||||||
packet->item.setAuxValue(0);
|
|
||||||
|
|
||||||
p->inventory->add(new ItemInstance(contItems.at(packet->slot).getItem(), contItems.at(packet->slot).count, contItems.at(packet->slot).getAuxValue()));
|
|
||||||
} else {
|
|
||||||
LOGW("ContainerSetSlotPacket: illegal container operation in slot %i\n", packet->slot);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ContainerType::FURNACE == p->containerMenu->containerType) {
|
if (ContainerType::FURNACE == p->containerMenu->containerType) {
|
||||||
//LOGI("Server:Setting slot %d: %s\n", packet->slot, packet->item.toString().c_str());
|
//LOGI("Server:Setting slot %d: %s\n", packet->slot, packet->item.toString().c_str());
|
||||||
p->containerMenu->setSlot(packet->slot, &packet->item);
|
p->containerMenu->setSlot(packet->slot, &packet->item);
|
||||||
@@ -990,8 +635,6 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
|
|||||||
p->containerMenu->setSlot(packet->slot, &packet->item);
|
p->containerMenu->setSlot(packet->slot, &packet->item);
|
||||||
//p->containerMenu->setSlot(packet->slot, packet->item.isNull()? NULL : &packet->item);
|
//p->containerMenu->setSlot(packet->slot, packet->item.isNull()? NULL : &packet->item);
|
||||||
}
|
}
|
||||||
|
|
||||||
p->inventory->print();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, SetHealthPacket* packet )
|
void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, SetHealthPacket* packet )
|
||||||
@@ -1014,8 +657,6 @@ void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, SignUpd
|
|||||||
if (!level)
|
if (!level)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LOGI("SignUpdate: [%i, %i, %i]\n", packet->x, packet->y, packet->z);
|
|
||||||
|
|
||||||
TileEntity* te = level->getTileEntity(packet->x, packet->y, packet->z);
|
TileEntity* te = level->getTileEntity(packet->x, packet->y, packet->z);
|
||||||
if (TileEntity::isType(te, TileEntityType::Sign)) {
|
if (TileEntity::isType(te, TileEntityType::Sign)) {
|
||||||
SignTileEntity* ste = (SignTileEntity*) te;
|
SignTileEntity* ste = (SignTileEntity*) te;
|
||||||
@@ -1072,9 +713,3 @@ Player* ServerSideNetworkHandler::getPlayer( const RakNet::RakNetGUID& source )
|
|||||||
if (source == level->players[i]->owner) return level->players[i];
|
if (source == level->players[i]->owner) return level->players[i];
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSideNetworkHandler::sendPrivate(Packet& packet, const RakNet::RakNetGUID& source) {
|
|
||||||
RakNet::BitStream bitStream;
|
|
||||||
packet.write(&bitStream);
|
|
||||||
rakPeer->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, 0, source, false);
|
|
||||||
}
|
|
||||||
@@ -58,9 +58,6 @@ public:
|
|||||||
virtual void handle(const RakNet::RakNetGUID& source, ContainerClosePacket* packet);
|
virtual void handle(const RakNet::RakNetGUID& source, ContainerClosePacket* packet);
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet);
|
virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet);
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, ChatPacket* packet);
|
virtual void handle(const RakNet::RakNetGUID& source, ChatPacket* packet);
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, MessagePacket* packet);
|
|
||||||
|
|
||||||
virtual void handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet);
|
|
||||||
|
|
||||||
bool allowsIncomingConnections() { return _allowIncoming; }
|
bool allowsIncomingConnections() { return _allowIncoming; }
|
||||||
void allowIncomingConnections(bool doAllow);
|
void allowIncomingConnections(bool doAllow);
|
||||||
@@ -73,12 +70,6 @@ private:
|
|||||||
* @brief Send packet to all players
|
* @brief Send packet to all players
|
||||||
*/
|
*/
|
||||||
void redistributePacket(Packet* packet, const RakNet::RakNetGUID& fromPlayer);
|
void redistributePacket(Packet* packet, const RakNet::RakNetGUID& fromPlayer);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Send packer private with GUID
|
|
||||||
*/
|
|
||||||
void sendPrivate(Packet& packet, const RakNet::RakNetGUID& source);
|
|
||||||
|
|
||||||
Player* getPlayer(const RakNet::RakNetGUID& source);
|
Player* getPlayer(const RakNet::RakNetGUID& source);
|
||||||
|
|
||||||
Minecraft* minecraft;
|
Minecraft* minecraft;
|
||||||
|
|||||||
@@ -236,9 +236,9 @@ std::string CommandServer::parse(ConnectedClient& client, const std::string& s)
|
|||||||
if (x0 < 0) x0 = 0;
|
if (x0 < 0) x0 = 0;
|
||||||
if (y0 < 0) y0 = 0;
|
if (y0 < 0) y0 = 0;
|
||||||
if (z0 < 0) z0 = 0;
|
if (z0 < 0) z0 = 0;
|
||||||
if (x1 >= LevelConstants::LEVEL_WIDTH ) x1 = LevelConstants::LEVEL_WIDTH - 1;
|
if (x1 >= LEVEL_WIDTH ) x1 = LEVEL_WIDTH - 1;
|
||||||
if (y1 >= LevelConstants::LEVEL_HEIGHT) y1 = LevelConstants::LEVEL_HEIGHT - 1;
|
if (y1 >= LEVEL_HEIGHT) y1 = LEVEL_HEIGHT - 1;
|
||||||
if (z1 >= LevelConstants::LEVEL_DEPTH ) z1 = LevelConstants::LEVEL_DEPTH - 1;
|
if (z1 >= LEVEL_DEPTH ) z1 = LEVEL_DEPTH - 1;
|
||||||
|
|
||||||
for (int y = y0; y <= y1; ++y)
|
for (int y = y0; y <= y1; ++y)
|
||||||
for (int z = z0; z <= z1; ++z)
|
for (int z = z0; z <= z1; ++z)
|
||||||
@@ -456,7 +456,7 @@ std::string CommandServer::parse(ConnectedClient& client, const std::string& s)
|
|||||||
sw.start();
|
sw.start();
|
||||||
|
|
||||||
// Save a cuboid around the player
|
// Save a cuboid around the player
|
||||||
const int CSize = LevelConstants::CHUNK_CACHE_WIDTH;
|
const int CSize = CHUNK_CACHE_WIDTH;
|
||||||
int cx = (int)e->x / CSize;
|
int cx = (int)e->x / CSize;
|
||||||
int cz = (int)e->z / CSize;
|
int cz = (int)e->z / CSize;
|
||||||
|
|
||||||
@@ -504,7 +504,7 @@ bool CommandServer::handleCheckpoint(bool doRestore ) {
|
|||||||
const int cz = restorePos.z;
|
const int cz = restorePos.z;
|
||||||
const int y0 = restorePos.y;
|
const int y0 = restorePos.y;
|
||||||
const int y1 = y0 + RestoreHeight;
|
const int y1 = y0 + RestoreHeight;
|
||||||
const int CSize = LevelConstants::CHUNK_CACHE_WIDTH;
|
const int CSize = CHUNK_CACHE_WIDTH;
|
||||||
const int numChunkBytes = RestoreHeight * CSize * CSize * 20 / 8;
|
const int numChunkBytes = RestoreHeight * CSize * CSize * 20 / 8;
|
||||||
|
|
||||||
if (!restoreBuffer) {
|
if (!restoreBuffer) {
|
||||||
|
|||||||
@@ -33,18 +33,18 @@ public:
|
|||||||
unsigned char* blockIds = chunk->getBlockData();
|
unsigned char* blockIds = chunk->getBlockData();
|
||||||
DataLayer& blockData = chunk->data;
|
DataLayer& blockData = chunk->data;
|
||||||
|
|
||||||
const int setSize = LevelConstants::LEVEL_HEIGHT / 8;
|
const int setSize = LEVEL_HEIGHT / 8;
|
||||||
const int setShift = 4; // power of LevelConstants::LEVEL_HEIGHT / 8
|
const int setShift = 4; // power of LEVEL_HEIGHT / 8
|
||||||
|
|
||||||
chunkData.Reset();
|
chunkData.Reset();
|
||||||
for (int i = 0; i < LevelConstants::CHUNK_COLUMNS; i++)
|
for (int i = 0; i < CHUNK_COLUMNS; i++)
|
||||||
{
|
{
|
||||||
unsigned char updateBits = chunk->updateMap[i];
|
unsigned char updateBits = chunk->updateMap[i];
|
||||||
chunkData.Write(updateBits);
|
chunkData.Write(updateBits);
|
||||||
|
|
||||||
if (updateBits > 0)
|
if (updateBits > 0)
|
||||||
{
|
{
|
||||||
int colDataPosition = (i % LevelConstants::CHUNK_WIDTH) << 11 | (i / LevelConstants::CHUNK_WIDTH) << 7;
|
int colDataPosition = (i % CHUNK_WIDTH) << 11 | (i / CHUNK_WIDTH) << 7;
|
||||||
|
|
||||||
for (int set = 0; set < 8; set++)
|
for (int set = 0; set < 8; set++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,20 +9,17 @@ public:
|
|||||||
RakNet::RakString clientName;
|
RakNet::RakString clientName;
|
||||||
int clientNetworkVersion;
|
int clientNetworkVersion;
|
||||||
int clientNetworkLowestSupportedVersion;
|
int clientNetworkLowestSupportedVersion;
|
||||||
bool newProto;
|
|
||||||
|
|
||||||
LoginPacket()
|
LoginPacket()
|
||||||
: clientNetworkVersion(-1),
|
: clientNetworkVersion(-1),
|
||||||
clientNetworkLowestSupportedVersion(-1),
|
clientNetworkLowestSupportedVersion(-1)
|
||||||
newProto(false)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
LoginPacket(const RakNet::RakString& clientName, int clientVersion, bool newProto)
|
LoginPacket(const RakNet::RakString& clientName, int clientVersion)
|
||||||
: clientName(clientName),
|
: clientName(clientName),
|
||||||
clientNetworkVersion(clientVersion),
|
clientNetworkVersion(clientVersion),
|
||||||
clientNetworkLowestSupportedVersion(clientVersion),
|
clientNetworkLowestSupportedVersion(clientVersion)
|
||||||
newProto(newProto)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,7 +29,6 @@ public:
|
|||||||
bitStream->Write(clientName);
|
bitStream->Write(clientName);
|
||||||
bitStream->Write(clientNetworkVersion);
|
bitStream->Write(clientNetworkVersion);
|
||||||
bitStream->Write(clientNetworkLowestSupportedVersion);
|
bitStream->Write(clientNetworkLowestSupportedVersion);
|
||||||
bitStream->Write(newProto);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void read(RakNet::BitStream* bitStream)
|
void read(RakNet::BitStream* bitStream)
|
||||||
@@ -43,11 +39,6 @@ public:
|
|||||||
if (bitStream->GetNumberOfUnreadBits() > 0) {
|
if (bitStream->GetNumberOfUnreadBits() > 0) {
|
||||||
bitStream->Read(clientNetworkVersion);
|
bitStream->Read(clientNetworkVersion);
|
||||||
bitStream->Read(clientNetworkLowestSupportedVersion);
|
bitStream->Read(clientNetworkLowestSupportedVersion);
|
||||||
|
|
||||||
// Checking for new proto
|
|
||||||
if (bitStream->GetNumberOfUnreadBits() > 0) {
|
|
||||||
bitStream->Read(newProto);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,10 @@
|
|||||||
|
|
||||||
#include "../Packet.h"
|
#include "../Packet.h"
|
||||||
|
|
||||||
// wtf why not enum
|
|
||||||
namespace LoginStatus {
|
namespace LoginStatus {
|
||||||
const int Success = 0;
|
const int Success = 0;
|
||||||
const int Failed_ClientOld = 1;
|
const int Failed_ClientOld = 1;
|
||||||
const int Failed_ServerOld = 2;
|
const int Failed_ServerOld = 2;
|
||||||
const int Failed_TakenNickname = 3;
|
|
||||||
const int Failed_Banned = 4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class LoginStatusPacket : public Packet {
|
class LoginStatusPacket : public Packet {
|
||||||
|
|||||||
@@ -50,7 +50,5 @@
|
|||||||
#include "TileEventPacket.h"
|
#include "TileEventPacket.h"
|
||||||
#include "UpdateBlockPacket.h"
|
#include "UpdateBlockPacket.h"
|
||||||
#include "UseItemPacket.h"
|
#include "UseItemPacket.h"
|
||||||
#include "RemoveItemPacket.h"
|
|
||||||
#include "WantCreatePacket.h"
|
|
||||||
#include "TakeItemPacket.h"
|
|
||||||
#endif /*NET_MINECRAFT_NETWORK_PACKET__PacketInclude_H__*/
|
#endif /*NET_MINECRAFT_NETWORK_PACKET__PacketInclude_H__*/
|
||||||
|
|||||||
@@ -9,19 +9,15 @@ public:
|
|||||||
int entityId;
|
int entityId;
|
||||||
unsigned short itemId;
|
unsigned short itemId;
|
||||||
unsigned short itemAuxValue;
|
unsigned short itemAuxValue;
|
||||||
unsigned char selectedSlot;
|
|
||||||
unsigned char inventorySlot;
|
|
||||||
|
|
||||||
PlayerEquipmentPacket()
|
PlayerEquipmentPacket()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerEquipmentPacket(int entityId, int itemId, int data, int selSlot, int invSlot)
|
PlayerEquipmentPacket(int entityId, int itemId, int data)
|
||||||
: entityId(entityId),
|
: entityId(entityId),
|
||||||
itemId(itemId),
|
itemId(itemId),
|
||||||
itemAuxValue(data),
|
itemAuxValue(data)
|
||||||
selectedSlot(selSlot),
|
|
||||||
inventorySlot(invSlot)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,8 +28,6 @@ public:
|
|||||||
bitStream->Write(entityId);
|
bitStream->Write(entityId);
|
||||||
bitStream->Write(itemId);
|
bitStream->Write(itemId);
|
||||||
bitStream->Write(itemAuxValue);
|
bitStream->Write(itemAuxValue);
|
||||||
bitStream->Write(selectedSlot);
|
|
||||||
bitStream->Write(inventorySlot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void read(RakNet::BitStream* bitStream)
|
void read(RakNet::BitStream* bitStream)
|
||||||
@@ -41,8 +35,6 @@ public:
|
|||||||
bitStream->Read(entityId);
|
bitStream->Read(entityId);
|
||||||
bitStream->Read(itemId);
|
bitStream->Read(itemId);
|
||||||
bitStream->Read(itemAuxValue);
|
bitStream->Read(itemAuxValue);
|
||||||
bitStream->Read(selectedSlot);
|
|
||||||
bitStream->Read(inventorySlot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
#ifndef NET_MINECRAFT_NETWORK_PACKET__RemoveItemPacket_H__
|
|
||||||
#define NET_MINECRAFT_NETWORK_PACKET__RemoveItemPacket_H__
|
|
||||||
|
|
||||||
//package net.minecraft.network.packet;
|
|
||||||
|
|
||||||
#include "../Packet.h"
|
|
||||||
|
|
||||||
class RemoveItemPacket: public Packet
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
RemoveItemPacket() {
|
|
||||||
}
|
|
||||||
|
|
||||||
RemoveItemPacket(int playerId, int count, int auxValue, int itemId)
|
|
||||||
:
|
|
||||||
playerId(playerId),
|
|
||||||
count(count),
|
|
||||||
auxValue(auxValue),
|
|
||||||
itemId(itemId)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void write(RakNet::BitStream* bitStream)
|
|
||||||
{
|
|
||||||
bitStream->Write((RakNet::MessageID)(ID_USER_PACKET_ENUM + PACKET_REMOVEITEM));
|
|
||||||
bitStream->Write(itemId);
|
|
||||||
bitStream->Write(count);
|
|
||||||
bitStream->Write(auxValue);
|
|
||||||
|
|
||||||
bitStream->Write(playerId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void read(RakNet::BitStream* bitStream)
|
|
||||||
{
|
|
||||||
bitStream->Read(itemId);
|
|
||||||
bitStream->Read(count);
|
|
||||||
bitStream->Read(auxValue);
|
|
||||||
|
|
||||||
bitStream->Read(playerId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
|
||||||
{
|
|
||||||
callback->handle(source, (RemoveItemPacket*)this);
|
|
||||||
}
|
|
||||||
|
|
||||||
int playerId;
|
|
||||||
|
|
||||||
int itemId;
|
|
||||||
int count;
|
|
||||||
int auxValue;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*NET_MINECRAFT_NETWORK_PACKET__RemoveItemPacket_H__*/
|
|
||||||
@@ -2,14 +2,13 @@
|
|||||||
#define NET_MINECRAFT_NETWORK_PACKET__SendInventoryPacket_H__
|
#define NET_MINECRAFT_NETWORK_PACKET__SendInventoryPacket_H__
|
||||||
|
|
||||||
#include "../Packet.h"
|
#include "../Packet.h"
|
||||||
#include "world/entity/player/Inventory.h"
|
|
||||||
#include "world/inventory/FillingContainer.h"
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
class SendInventoryPacket: public Packet
|
class SendInventoryPacket: public Packet
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SendInventoryPacket() {}
|
SendInventoryPacket()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
SendInventoryPacket(Player* player, bool dropItems)
|
SendInventoryPacket(Player* player, bool dropItems)
|
||||||
: entityId(player->entityId),
|
: entityId(player->entityId),
|
||||||
@@ -22,15 +21,10 @@ public:
|
|||||||
ItemInstance* item = inv->getItem(i);
|
ItemInstance* item = inv->getItem(i);
|
||||||
items.push_back(item? *item : ItemInstance());
|
items.push_back(item? *item : ItemInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < NumArmorItems; ++i) {
|
for (int i = 0; i < NumArmorItems; ++i) {
|
||||||
ItemInstance* item = player->getArmor(i);
|
ItemInstance* item = player->getArmor(i);
|
||||||
items.push_back(item? *item : ItemInstance());
|
items.push_back(item? *item : ItemInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < inv->numLinkedSlots; ++i) {
|
|
||||||
linkedSlot[i] = inv->linkedSlots[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void write(RakNet::BitStream* bitStream)
|
void write(RakNet::BitStream* bitStream)
|
||||||
@@ -45,13 +39,6 @@ public:
|
|||||||
// Armor
|
// Armor
|
||||||
for (int i = 0; i < NumArmorItems; ++i)
|
for (int i = 0; i < NumArmorItems; ++i)
|
||||||
PacketUtil::writeItemInstance(items[i + numItems], bitStream);
|
PacketUtil::writeItemInstance(items[i + numItems], bitStream);
|
||||||
|
|
||||||
int lSlots = Inventory::MAX_SELECTION_SIZE;
|
|
||||||
|
|
||||||
// Linked slots
|
|
||||||
bitStream->Write(lSlots);
|
|
||||||
for (int i = 0; i < lSlots; ++i)
|
|
||||||
bitStream->Write(linkedSlot[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void read(RakNet::BitStream* bitStream)
|
void read(RakNet::BitStream* bitStream)
|
||||||
@@ -63,12 +50,6 @@ public:
|
|||||||
// Inventory, Armor
|
// Inventory, Armor
|
||||||
for (int i = 0; i < numItems + NumArmorItems; ++i)
|
for (int i = 0; i < numItems + NumArmorItems; ++i)
|
||||||
items.push_back(PacketUtil::readItemInstance(bitStream));
|
items.push_back(PacketUtil::readItemInstance(bitStream));
|
||||||
|
|
||||||
// Linked slots
|
|
||||||
int lSlots = 0;
|
|
||||||
bitStream->Read(lSlots);
|
|
||||||
for (int i = 0; i < lSlots; ++i)
|
|
||||||
bitStream->Read(linkedSlot[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
||||||
@@ -81,8 +62,6 @@ public:
|
|||||||
short numItems;
|
short numItems;
|
||||||
unsigned char extra;
|
unsigned char extra;
|
||||||
|
|
||||||
std::array<FillingContainer::LinkedSlot, Inventory::MAX_SELECTION_SIZE> linkedSlot;
|
|
||||||
|
|
||||||
static const int ExtraDrop = 1;
|
static const int ExtraDrop = 1;
|
||||||
static const int NumArmorItems = 4;
|
static const int NumArmorItems = 4;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
#define NET_MINECRAFT_NETWORK_PACKET__StartGamePacket_H__
|
#define NET_MINECRAFT_NETWORK_PACKET__StartGamePacket_H__
|
||||||
|
|
||||||
#include "../Packet.h"
|
#include "../Packet.h"
|
||||||
#include "world/level/LevelConstants.h"
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
class StartGamePacket : public Packet
|
class StartGamePacket : public Packet
|
||||||
@@ -15,20 +14,18 @@ public:
|
|||||||
int entityId;
|
int entityId;
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
|
|
||||||
int chunkCacheWidth = 0;
|
|
||||||
StartGamePacket()
|
StartGamePacket()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
StartGamePacket(long seed, int levelGeneratorVersion, int gameType, int entityId, float x, float y, float z, int chunkCacheWidth)
|
StartGamePacket(long seed, int levelGeneratorVersion, int gameType, int entityId, float x, float y, float z)
|
||||||
: levelSeed((int32_t)seed),
|
: levelSeed((int32_t)seed),
|
||||||
levelGeneratorVersion(levelGeneratorVersion),
|
levelGeneratorVersion(levelGeneratorVersion),
|
||||||
gameType(gameType),
|
gameType(gameType),
|
||||||
entityId(entityId),
|
entityId(entityId),
|
||||||
x(x),
|
x(x),
|
||||||
y(y),
|
y(y),
|
||||||
z(z),
|
z(z)
|
||||||
chunkCacheWidth(chunkCacheWidth)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +40,6 @@ public:
|
|||||||
bitStream->Write(x);
|
bitStream->Write(x);
|
||||||
bitStream->Write(y);
|
bitStream->Write(y);
|
||||||
bitStream->Write(z);
|
bitStream->Write(z);
|
||||||
bitStream->Write(LevelConstants::CHUNK_CACHE_WIDTH);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void read(RakNet::BitStream* bitStream)
|
void read(RakNet::BitStream* bitStream)
|
||||||
@@ -55,10 +51,6 @@ public:
|
|||||||
bitStream->Read(x);
|
bitStream->Read(x);
|
||||||
bitStream->Read(y);
|
bitStream->Read(y);
|
||||||
bitStream->Read(z);
|
bitStream->Read(z);
|
||||||
|
|
||||||
if (bitStream->GetNumberOfUnreadBits() > 0) {
|
|
||||||
bitStream->Read(chunkCacheWidth);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
#ifndef NET_MINECRAFT_NETWORK_PACKET__TakeItemPacket_H__
|
|
||||||
#define NET_MINECRAFT_NETWORK_PACKET__TakeItemPacket_H__
|
|
||||||
|
|
||||||
//package net.minecraft.network.packet;
|
|
||||||
|
|
||||||
#include "../Packet.h"
|
|
||||||
|
|
||||||
class TakeItemPacket: public Packet
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TakeItemPacket() {
|
|
||||||
}
|
|
||||||
|
|
||||||
TakeItemPacket(int playerId, int count, int auxValue, int itemId)
|
|
||||||
:
|
|
||||||
playerId(playerId),
|
|
||||||
count(count),
|
|
||||||
auxValue(auxValue),
|
|
||||||
itemId(itemId)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void write(RakNet::BitStream* bitStream)
|
|
||||||
{
|
|
||||||
bitStream->Write((RakNet::MessageID)(ID_USER_PACKET_ENUM + PACKET_TAKEITEM));
|
|
||||||
bitStream->Write(itemId);
|
|
||||||
bitStream->Write(count);
|
|
||||||
bitStream->Write(auxValue);
|
|
||||||
|
|
||||||
bitStream->Write(playerId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void read(RakNet::BitStream* bitStream)
|
|
||||||
{
|
|
||||||
bitStream->Read(itemId);
|
|
||||||
bitStream->Read(count);
|
|
||||||
bitStream->Read(auxValue);
|
|
||||||
|
|
||||||
bitStream->Read(playerId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
|
||||||
{
|
|
||||||
callback->handle(source, (TakeItemPacket*)this);
|
|
||||||
}
|
|
||||||
|
|
||||||
int playerId;
|
|
||||||
|
|
||||||
int itemId;
|
|
||||||
int count;
|
|
||||||
int auxValue;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*NET_MINECRAFT_NETWORK_PACKET__TakeItemPacket_H__*/
|
|
||||||
@@ -16,14 +16,10 @@ public:
|
|||||||
short itemId;
|
short itemId;
|
||||||
unsigned char itemData;
|
unsigned char itemData;
|
||||||
ItemInstance item;
|
ItemInstance item;
|
||||||
float playerX, playerY, playerZ;
|
|
||||||
float playerX0, playerY0, playerZ0;
|
|
||||||
float playerX1, playerY1, playerZ1;
|
|
||||||
|
|
||||||
UseItemPacket() {}
|
UseItemPacket() {}
|
||||||
|
|
||||||
UseItemPacket(int x, int y, int z, int face, const ItemInstance* item, int entityId, float clickX, float clickY, float clickZ,
|
UseItemPacket(int x, int y, int z, int face, const ItemInstance* item, int entityId, float clickX, float clickY, float clickZ)
|
||||||
float plrX, float plrY, float plrZ, float plrX0, float plrY0, float plrZ0, float plrX1, float plrY1, float plrZ1)
|
|
||||||
: x(x),
|
: x(x),
|
||||||
y(y),
|
y(y),
|
||||||
z(z),
|
z(z),
|
||||||
@@ -33,36 +29,17 @@ public:
|
|||||||
entityId(entityId),
|
entityId(entityId),
|
||||||
clickX(clickX),
|
clickX(clickX),
|
||||||
clickY(clickY),
|
clickY(clickY),
|
||||||
clickZ(clickZ),
|
clickZ(clickZ)
|
||||||
playerX(plrX),
|
|
||||||
playerY(plrY),
|
|
||||||
playerZ(plrZ),
|
|
||||||
playerX0(plrX0),
|
|
||||||
playerY0(plrY0),
|
|
||||||
playerZ0(plrZ0),
|
|
||||||
playerX1(plrX1),
|
|
||||||
playerY1(plrY1),
|
|
||||||
playerZ1(plrZ1)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
UseItemPacket(const ItemInstance* item, int entityId, const Vec3& aim, float plrX, float plrY, float plrZ,
|
UseItemPacket(const ItemInstance* item, int entityId, const Vec3& aim)
|
||||||
float plrX0, float plrY0, float plrZ0, float plrX1, float plrY1, float plrZ1)
|
|
||||||
: face(255),
|
: face(255),
|
||||||
itemId(item? item->id : 0),
|
itemId(item? item->id : 0),
|
||||||
itemData(item? item->getAuxValue() : 0),
|
itemData(item? item->getAuxValue() : 0),
|
||||||
entityId(entityId),
|
entityId(entityId),
|
||||||
x((int)(aim.x * 32768.0f)),
|
x((int)(aim.x * 32768.0f)),
|
||||||
y((int)(aim.y * 32768.0f)),
|
y((int)(aim.y * 32768.0f)),
|
||||||
z((int)(aim.z * 32768.0f)),
|
z((int)(aim.z * 32768.0f))
|
||||||
playerX(plrX),
|
|
||||||
playerY(plrY),
|
|
||||||
playerZ(plrZ),
|
|
||||||
playerX0(plrX0),
|
|
||||||
playerY0(plrY0),
|
|
||||||
playerZ0(plrZ0),
|
|
||||||
playerX1(plrX1),
|
|
||||||
playerY1(plrY1),
|
|
||||||
playerZ1(plrZ1)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,15 +57,6 @@ public:
|
|||||||
bitStream->Write(clickX);
|
bitStream->Write(clickX);
|
||||||
bitStream->Write(clickY);
|
bitStream->Write(clickY);
|
||||||
bitStream->Write(clickZ);
|
bitStream->Write(clickZ);
|
||||||
bitStream->Write(playerX);
|
|
||||||
bitStream->Write(playerY);
|
|
||||||
bitStream->Write(playerZ);
|
|
||||||
bitStream->Write(playerX0);
|
|
||||||
bitStream->Write(playerY0);
|
|
||||||
bitStream->Write(playerZ0);
|
|
||||||
bitStream->Write(playerX1);
|
|
||||||
bitStream->Write(playerY1);
|
|
||||||
bitStream->Write(playerZ1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void read(RakNet::BitStream* bitStream)
|
void read(RakNet::BitStream* bitStream)
|
||||||
@@ -106,15 +74,7 @@ public:
|
|||||||
item.id = itemId;
|
item.id = itemId;
|
||||||
item.setAuxValue(itemData);
|
item.setAuxValue(itemData);
|
||||||
item.count = (itemId == 0 && itemData == 0)? 0 : 1;
|
item.count = (itemId == 0 && itemData == 0)? 0 : 1;
|
||||||
bitStream->Read(playerX);
|
|
||||||
bitStream->Read(playerY);
|
|
||||||
bitStream->Read(playerZ);
|
|
||||||
bitStream->Read(playerX0);
|
|
||||||
bitStream->Read(playerY0);
|
|
||||||
bitStream->Read(playerZ0);
|
|
||||||
bitStream->Read(playerX1);
|
|
||||||
bitStream->Read(playerY1);
|
|
||||||
bitStream->Read(playerZ1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
#ifndef NET_MINECRAFT_NETWORK_PACKET__WantCreatePacket_H__
|
|
||||||
#define NET_MINECRAFT_NETWORK_PACKET__WantCreatePacket_H__
|
|
||||||
|
|
||||||
//package net.minecraft.network.packet;
|
|
||||||
|
|
||||||
#include "../Packet.h"
|
|
||||||
|
|
||||||
class WantCreatePacket: public Packet
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
WantCreatePacket() {
|
|
||||||
}
|
|
||||||
|
|
||||||
WantCreatePacket(int playerId, int count, int auxValue, int itemId)
|
|
||||||
:
|
|
||||||
playerId(playerId),
|
|
||||||
count(count),
|
|
||||||
auxValue(auxValue),
|
|
||||||
itemId(itemId)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void write(RakNet::BitStream* bitStream)
|
|
||||||
{
|
|
||||||
bitStream->Write((RakNet::MessageID)(ID_USER_PACKET_ENUM + PACKET_WANTCREATEITEM));
|
|
||||||
bitStream->Write(itemId);
|
|
||||||
bitStream->Write(count);
|
|
||||||
bitStream->Write(auxValue);
|
|
||||||
|
|
||||||
bitStream->Write(playerId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void read(RakNet::BitStream* bitStream)
|
|
||||||
{
|
|
||||||
bitStream->Read(itemId);
|
|
||||||
bitStream->Read(count);
|
|
||||||
bitStream->Read(auxValue);
|
|
||||||
|
|
||||||
bitStream->Read(playerId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle(const RakNet::RakNetGUID& source, NetEventCallback* callback)
|
|
||||||
{
|
|
||||||
callback->handle(source, (WantCreatePacket*)this);
|
|
||||||
}
|
|
||||||
|
|
||||||
int playerId;
|
|
||||||
|
|
||||||
int itemId;
|
|
||||||
int count;
|
|
||||||
int auxValue;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*NET_MINECRAFT_NETWORK_PACKET__WantCreatePacket_H__*/
|
|
||||||
@@ -10,11 +10,14 @@
|
|||||||
static const char* errIdString = 0;
|
static const char* errIdString = 0;
|
||||||
|
|
||||||
void checkError() {
|
void checkError() {
|
||||||
|
|
||||||
|
while (1) {
|
||||||
ALenum err = alGetError();
|
ALenum err = alGetError();
|
||||||
if(err == AL_NO_ERROR) return;
|
if(err == AL_NO_ERROR) return;
|
||||||
|
|
||||||
LOGI("### SoundSystemAL error: %d ####: %s\n", err, errIdString==0?"(none)":errIdString);
|
LOGI("### SoundSystemAL error: %d ####: %s\n", err, errIdString==0?"(none)":errIdString);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//typedef ALvoid AL_APIENTRY (*alBufferDataStaticProcPtr) (const ALint bid, ALenum format, ALvoid *data, ALsizei size, ALsizei freq);
|
//typedef ALvoid AL_APIENTRY (*alBufferDataStaticProcPtr) (const ALint bid, ALenum format, ALvoid *data, ALsizei size, ALsizei freq);
|
||||||
//ALvoid alBufferDataStaticProc(const ALint bid, ALenum format, ALvoid* data, ALsizei size, ALsizei freq)
|
//ALvoid alBufferDataStaticProc(const ALint bid, ALenum format, ALvoid* data, ALsizei size, ALsizei freq)
|
||||||
|
|||||||
@@ -17,11 +17,6 @@ ArgumentsSettings::ArgumentsSettings(int numArguments, char** arguments)
|
|||||||
levelName = std::string(arguments[a+1]);
|
levelName = std::string(arguments[a+1]);
|
||||||
a++; // Skip the next argument since it's part of this one.
|
a++; // Skip the next argument since it's part of this one.
|
||||||
}
|
}
|
||||||
} else if(strcmp(arguments[a], "--gamemode") == 0) {
|
|
||||||
if(a + 1 < numArguments) {
|
|
||||||
gamemode = std::string(arguments[a+1]);
|
|
||||||
a++; // Skip the next argument since it's part of this one.
|
|
||||||
}
|
|
||||||
} else if(strcmp(arguments[a], "--leveldir") == 0) {
|
} else if(strcmp(arguments[a], "--leveldir") == 0) {
|
||||||
if(a + 1 < numArguments) {
|
if(a + 1 < numArguments) {
|
||||||
levelDir = std::string(arguments[a+1]);
|
levelDir = std::string(arguments[a+1]);
|
||||||
@@ -56,9 +51,6 @@ std::string ArgumentsSettings::getServerKey() {
|
|||||||
std::string ArgumentsSettings::getCachePath() {
|
std::string ArgumentsSettings::getCachePath() {
|
||||||
return cachePath;
|
return cachePath;
|
||||||
}
|
}
|
||||||
std::string ArgumentsSettings::getGamemode() {
|
|
||||||
return gamemode;
|
|
||||||
}
|
|
||||||
std::string ArgumentsSettings::getLevelDir() {
|
std::string ArgumentsSettings::getLevelDir() {
|
||||||
return levelDir;
|
return levelDir;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,27 +4,20 @@
|
|||||||
class ArgumentsSettings {
|
class ArgumentsSettings {
|
||||||
public:
|
public:
|
||||||
ArgumentsSettings(int numArguments, char** arguments);
|
ArgumentsSettings(int numArguments, char** arguments);
|
||||||
|
|
||||||
std::string getExternalPath();
|
std::string getExternalPath();
|
||||||
std::string getLevelName();
|
std::string getLevelName();
|
||||||
std::string getServerKey();
|
std::string getServerKey();
|
||||||
std::string getCachePath();
|
std::string getCachePath();
|
||||||
std::string getLevelDir();
|
std::string getLevelDir();
|
||||||
std::string getGamemode();
|
|
||||||
|
|
||||||
bool getShowHelp();
|
bool getShowHelp();
|
||||||
|
|
||||||
int getPort();
|
int getPort();
|
||||||
private:
|
private:
|
||||||
std::string cachePath;
|
std::string cachePath;
|
||||||
std::string externalPath;
|
std::string externalPath;
|
||||||
std::string levelName;
|
std::string levelName;
|
||||||
std::string gamemode;
|
|
||||||
std::string levelDir;
|
std::string levelDir;
|
||||||
std::string serverKey;
|
std::string serverKey;
|
||||||
|
|
||||||
bool showHelp;
|
bool showHelp;
|
||||||
|
|
||||||
int port;
|
int port;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,8 @@ ServerLevel::ServerLevel(LevelStorage* levelStorage, const std::string& levelNam
|
|||||||
void ServerLevel::updateSleepingPlayerList() {
|
void ServerLevel::updateSleepingPlayerList() {
|
||||||
bool allPlayersWasSleeping = allPlayersAreSleeping;
|
bool allPlayersWasSleeping = allPlayersAreSleeping;
|
||||||
allPlayersAreSleeping = !players.empty();
|
allPlayersAreSleeping = !players.empty();
|
||||||
|
|
||||||
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||||
Player* player = *it;
|
Player* player = *it;
|
||||||
|
|
||||||
if(!player->isSleeping()) {
|
if(!player->isSleeping()) {
|
||||||
allPlayersAreSleeping = false;
|
allPlayersAreSleeping = false;
|
||||||
break;
|
break;
|
||||||
@@ -23,7 +21,6 @@ void ServerLevel::updateSleepingPlayerList() {
|
|||||||
}
|
}
|
||||||
if(!allPlayersWasSleeping && allPlayersAreSleeping) {
|
if(!allPlayersWasSleeping && allPlayersAreSleeping) {
|
||||||
levelEvent(NULL, LevelEvent::ALL_PLAYERS_SLEEPING, 0, 0, 0, 0);
|
levelEvent(NULL, LevelEvent::ALL_PLAYERS_SLEEPING, 0, 0, 0, 0);
|
||||||
|
|
||||||
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||||
(*it)->setAllPlayersSleeping();
|
(*it)->setAllPlayersSleeping();
|
||||||
}
|
}
|
||||||
@@ -32,17 +29,14 @@ void ServerLevel::updateSleepingPlayerList() {
|
|||||||
|
|
||||||
void ServerLevel::awakenAllPlayers() {
|
void ServerLevel::awakenAllPlayers() {
|
||||||
allPlayersAreSleeping = false;
|
allPlayersAreSleeping = false;
|
||||||
|
|
||||||
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||||
Player* player = *it;
|
Player* player = *it;
|
||||||
|
|
||||||
if(player->isSleeping()) {
|
if(player->isSleeping()) {
|
||||||
player->stopSleepInBed(false, false, true);
|
player->stopSleepInBed(false, false, true);
|
||||||
player->health = Player::MAX_HEALTH;
|
player->health = Player::MAX_HEALTH;
|
||||||
player->lastHealth = Player::MAX_HEALTH;
|
player->lastHealth = Player::MAX_HEALTH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SetHealthPacket packet(Player::MAX_HEALTH);
|
SetHealthPacket packet(Player::MAX_HEALTH);
|
||||||
raknetInstance->send(packet);
|
raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
@@ -63,15 +57,11 @@ bool ServerLevel::allPlayersSleeping() {
|
|||||||
|
|
||||||
void ServerLevel::tick(){
|
void ServerLevel::tick(){
|
||||||
super::tick();
|
super::tick();
|
||||||
|
|
||||||
if(allPlayersSleeping()) {
|
if(allPlayersSleeping()) {
|
||||||
long newTime = levelData.getTime() + TICKS_PER_DAY;
|
long newTime = levelData.getTime() + TICKS_PER_DAY;
|
||||||
|
|
||||||
levelData.setTime(newTime - (newTime % TICKS_PER_DAY));
|
levelData.setTime(newTime - (newTime % TICKS_PER_DAY));
|
||||||
|
|
||||||
SetTimePacket packet(levelData.getTime());
|
SetTimePacket packet(levelData.getTime());
|
||||||
raknetInstance->send(packet);
|
raknetInstance->send(packet);
|
||||||
|
|
||||||
awakenAllPlayers();
|
awakenAllPlayers();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,17 +19,14 @@
|
|||||||
#include "../network/packet/AnimatePacket.h"
|
#include "../network/packet/AnimatePacket.h"
|
||||||
#include "../world/level/tile/entity/ChestTileEntity.h"
|
#include "../world/level/tile/entity/ChestTileEntity.h"
|
||||||
#include "../network/packet/HurtArmorPacket.h"
|
#include "../network/packet/HurtArmorPacket.h"
|
||||||
#include "network/packet/SendInventoryPacket.h"
|
|
||||||
#include "world/entity/player/Inventory.h"
|
|
||||||
|
|
||||||
ServerPlayer::ServerPlayer( Minecraft* minecraft, Level* level, bool proto)
|
ServerPlayer::ServerPlayer( Minecraft* minecraft, Level* level )
|
||||||
: super(level, minecraft->isCreativeMode()),
|
: super(level, minecraft->isCreativeMode()),
|
||||||
_mc(minecraft),
|
_mc(minecraft),
|
||||||
_prevHealth(-999),
|
_prevHealth(-999),
|
||||||
_containerCounter(0),
|
_containerCounter(0)
|
||||||
isNewProto(proto)
|
|
||||||
{
|
{
|
||||||
// hasFakeInventory = true;
|
hasFakeInventory = true;
|
||||||
footSize = 0;
|
footSize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,16 +67,7 @@ void ServerPlayer::tick() {
|
|||||||
|
|
||||||
void ServerPlayer::take( Entity* e, int orgCount ) {
|
void ServerPlayer::take( Entity* e, int orgCount ) {
|
||||||
TakeItemEntityPacket packet(e->entityId, entityId);
|
TakeItemEntityPacket packet(e->entityId, entityId);
|
||||||
// SendInventoryPacket packet(this, false);
|
|
||||||
_mc->raknetInstance->send(packet);
|
_mc->raknetInstance->send(packet);
|
||||||
printf("TakeItemEntityPacket \n");
|
|
||||||
|
|
||||||
LOGI("Inventory:\n");
|
|
||||||
for (int i = 0; i < inventory->numLinkedSlots; i++) {
|
|
||||||
auto item = inventory->getItem(i);
|
|
||||||
if (item)
|
|
||||||
LOGI("\t %i: %s (%i)\n", i, item->getName().c_str(), item->count);
|
|
||||||
}
|
|
||||||
|
|
||||||
super::take(e, orgCount);
|
super::take(e, orgCount);
|
||||||
}
|
}
|
||||||
@@ -130,20 +118,20 @@ bool ServerPlayer::hasResource( int id ) {
|
|||||||
void ServerPlayer::setContainerData( BaseContainerMenu* menu, int id, int value ) {
|
void ServerPlayer::setContainerData( BaseContainerMenu* menu, int id, int value ) {
|
||||||
ContainerSetDataPacket p(menu->containerId, id, value);
|
ContainerSetDataPacket p(menu->containerId, id, value);
|
||||||
_mc->raknetInstance->send(owner, p);
|
_mc->raknetInstance->send(owner, p);
|
||||||
LOGI("Setting container data for id %d: %d\n", id, value);
|
//LOGI("Setting container data for id %d: %d\n", id, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerPlayer::slotChanged( BaseContainerMenu* menu, int slot, const ItemInstance& item, bool isResultSlot ) {
|
void ServerPlayer::slotChanged( BaseContainerMenu* menu, int slot, const ItemInstance& item, bool isResultSlot ) {
|
||||||
if (isResultSlot) return;
|
if (isResultSlot) return;
|
||||||
ContainerSetSlotPacket p(menu->containerId, slot, item);
|
ContainerSetSlotPacket p(menu->containerId, slot, item);
|
||||||
_mc->raknetInstance->send(owner, p);
|
_mc->raknetInstance->send(owner, p);
|
||||||
LOGI("Slot %d changed\n", slot);
|
//LOGI("Slot %d changed\n", slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerPlayer::refreshContainer( BaseContainerMenu* menu, const std::vector<ItemInstance>& items ) {
|
void ServerPlayer::refreshContainer( BaseContainerMenu* menu, const std::vector<ItemInstance>& items ) {
|
||||||
ContainerSetContentPacket p(menu->containerId, menu->getItems());
|
ContainerSetContentPacket p(menu->containerId, menu->getItems());
|
||||||
_mc->raknetInstance->send(owner, p);
|
_mc->raknetInstance->send(owner, p);
|
||||||
LOGI("Refreshing container with %zu items\n", items.size());
|
//LOGI("Refreshing container with %d items\n", items.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerPlayer::nextContainerCounter() {
|
void ServerPlayer::nextContainerCounter() {
|
||||||
@@ -175,12 +163,3 @@ void ServerPlayer::displayClientMessage( const std::string& messageId ) {
|
|||||||
ChatPacket package(messageId);
|
ChatPacket package(messageId);
|
||||||
_mc->raknetInstance->send(owner, package);
|
_mc->raknetInstance->send(owner, package);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerPlayer::causeFallDamage(float distance) {
|
|
||||||
int dmg = (int) ceil((distance - 3));
|
|
||||||
if (dmg > 0) {
|
|
||||||
SetHealthPacket packet(SetHealthPacket::HEALTH_MODIFY_OFFSET + dmg);
|
|
||||||
_mc->raknetInstance->send(owner, packet);
|
|
||||||
}
|
|
||||||
super::causeFallDamage(distance);
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user