Compare commits
113 Commits
fe73853a64
...
a048a51300
| Author | SHA1 | Date | |
|---|---|---|---|
| a048a51300 | |||
| 365d8a10da | |||
| 3940c9ce1b | |||
| 156849eeb6 | |||
| 6a8b192024 | |||
| ce8ca15c56 | |||
| f7ad5acd33 | |||
| 444e826d1b | |||
| 6b6ad48617 | |||
| e43da17d66 | |||
| 3fcf3e3418 | |||
| 8955b6ea47 | |||
| 4f21343e3b | |||
| fcf7427fb2 | |||
| 50d1de49e0 | |||
| 3811964689 | |||
| 26e5376030 | |||
| d3d9b1a238 | |||
| f0df3fe257 | |||
| 3ebed84cdb | |||
|
|
d08948fb00 | ||
|
|
061d6db3a9 | ||
|
|
346ec7469e | ||
|
|
d7d887f882 | ||
| ce182b676f | |||
| b73f7f121d | |||
|
|
5e19ef778e | ||
|
|
4b69a1240a | ||
|
|
8f34fbc1ec | ||
|
|
890604256b | ||
| 5bc19c4ab2 | |||
| dfb3bf1da7 | |||
| 263118f2e0 | |||
|
|
792d4b32e7 | ||
| 1d0264a9c5 | |||
| 43f0d1f75f | |||
|
|
2da05d94c8 | ||
|
|
a0e99e2f03 | ||
|
|
b6ea0c7dc3 | ||
|
|
620b358ba7 | ||
| 70308d4151 | |||
| 830549791a | |||
| 27b22d8108 | |||
| 4047fd71e1 | |||
| 30dd344208 | |||
| 7e9de7a461 | |||
| 2465292473 | |||
| 26b2c196fa | |||
| 18793a6e05 | |||
|
|
edc6985a6b | ||
|
|
9cd91b1508 | ||
|
|
9c46d7094c | ||
|
|
52afff463b | ||
|
|
0d23fadc3e | ||
|
|
614e018dc6 | ||
|
|
e346df682c | ||
|
|
3e48c7fabd | ||
| de72a9a3b7 | |||
| 0645905fc6 | |||
|
|
31d80aedf8 | ||
|
|
bc82f5c091 | ||
| 8d7a1973e7 | |||
| 3a0f4c3647 | |||
|
|
d6a3e477c1 | ||
|
|
4d68c4dff8 | ||
|
|
e1c2210621 | ||
|
|
c188fa0ce2 | ||
|
|
9db9f469cc | ||
|
|
db7a889962 | ||
|
|
95a193323c | ||
|
|
f19c2d24a3 | ||
|
|
e1b81a7cc3 | ||
|
|
baeefae94d | ||
|
|
aa9fa659df | ||
|
|
6049239303 | ||
|
|
55d06f0590 | ||
|
|
58b7724ba2 | ||
| 6ae787b90d | |||
|
|
4023d70687 | ||
|
|
4dc7055d9d | ||
|
|
1ec347d5d5 | ||
|
|
5194575092 | ||
| 3cfa2d9ee7 | |||
| f016f00eab | |||
|
|
470c28d83a | ||
| 4363157cd9 | |||
| ba3ed3b4dd | |||
| 5783fb93f3 | |||
| 73fb2a2b3d | |||
| bcf48eb5e3 | |||
|
|
f5fecbc928 | ||
|
|
77d02fcca2 | ||
| 6d696af235 | |||
|
|
370363f792 | ||
|
|
61a2349b8b | ||
| eed3a6df61 | |||
| 97b0fb4d46 | |||
| 8be842a8ac | |||
| 6957f144e1 | |||
| f9d9a0f0f9 | |||
|
|
28febb4e63 | ||
|
|
aeef442f76 | ||
| 8098ab8906 | |||
| f0cb6d0b7c | |||
| d1672c0ee2 | |||
| c234abe3aa | |||
|
|
e4ff7728af | ||
|
|
41c5bdf243 | ||
| 96e8826f01 | |||
| db8993683f | |||
| 2c1b5e256e | |||
|
|
4beb5cb0f9 | ||
|
|
88ef7f3d17 |
46
.github/workflows/build.yml
vendored
46
.github/workflows/build.yml
vendored
@@ -60,13 +60,16 @@ jobs:
|
|||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
working-directory: ${{github.workspace}}/build
|
working-directory: ${{github.workspace}}/build
|
||||||
run: cmake --build . --config $BUILD_TYPE --target MinecraftPE --parallel
|
run: |
|
||||||
|
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
|
||||||
@@ -216,16 +219,6 @@ jobs:
|
|||||||
distribution: temurin
|
distribution: temurin
|
||||||
java-version: 25
|
java-version: 25
|
||||||
|
|
||||||
- name: Validate environment
|
|
||||||
run: |
|
|
||||||
echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT"
|
|
||||||
echo "ANDROID_NDK_PATH=$ANDROID_NDK_PATH"
|
|
||||||
echo "JAVA_HOME=$JAVA_HOME"
|
|
||||||
echo "MATRIX_ABI=$MATRIX_ABI"
|
|
||||||
$ANDROID_SDK_ROOT/platform-tools/adb version || true
|
|
||||||
java -version
|
|
||||||
javac -version
|
|
||||||
|
|
||||||
- name: Run Android build script
|
- name: Run Android build script
|
||||||
run: |
|
run: |
|
||||||
chmod +x ./build.sh
|
chmod +x ./build.sh
|
||||||
@@ -310,6 +303,12 @@ 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:
|
||||||
@@ -320,19 +319,12 @@ 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 }}.zip
|
dest: minecraftpe-server-${{ steps.ref.outputs.hash }}-linux.zip
|
||||||
|
|
||||||
- name: Zip Android arm64-v8a Artifact
|
- name: Rename Android Artifacts
|
||||||
uses: vimtor/action-zip@v1.2
|
run: |
|
||||||
with:
|
mv minecraftpe-apk-arm64-v8a/minecraftpe-v8a-debug.apk minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.apk
|
||||||
files: minecraftpe-apk-arm64-v8a/minecraftpe-v8a-debug.apk
|
mv minecraftpe-apk-armeabi-v7a/minecraftpe-v7a-debug.apk minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.apk
|
||||||
dest: minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.zip
|
|
||||||
|
|
||||||
- name: Zip Android armeabi-v7a Artifact
|
|
||||||
uses: vimtor/action-zip@v1.2
|
|
||||||
with:
|
|
||||||
files: minecraftpe-apk-armeabi-v7a/minecraftpe-v7a-debug.apk
|
|
||||||
dest: minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.zip
|
|
||||||
|
|
||||||
- name: Zip Web Artifact
|
- name: Zip Web Artifact
|
||||||
uses: vimtor/action-zip@v1.2
|
uses: vimtor/action-zip@v1.2
|
||||||
@@ -358,9 +350,13 @@ jobs:
|
|||||||
MinecraftPE development release for commit ${{ github.sha }}.
|
MinecraftPE development release for commit ${{ github.sha }}.
|
||||||
files: |
|
files: |
|
||||||
./data.zip
|
./data.zip
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-windows.zip
|
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-linux.zip
|
|
||||||
./minecraftpe-server-${{ steps.ref.outputs.hash }}.zip
|
./minecraftpe-server-${{ steps.ref.outputs.hash }}.zip
|
||||||
|
./minecraftpe-${{ steps.ref.outputs.hash }}-windows.zip
|
||||||
|
./minecraftpe-server-${{ steps.ref.outputs.hash }}-windows.zip
|
||||||
|
./minecraftpe-${{ steps.ref.outputs.hash }}-linux.zip
|
||||||
|
./minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.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-arm64-v8a.zip
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.zip
|
./minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.zip
|
||||||
./minecraftpe-${{ steps.ref.outputs.hash }}-web.zip
|
./minecraftpe-${{ steps.ref.outputs.hash }}-web.zip
|
||||||
|
|||||||
@@ -111,7 +111,6 @@ 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"
|
||||||
@@ -150,7 +149,6 @@ 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,6 +214,7 @@ 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
|
||||||
@@ -299,6 +298,8 @@ 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")
|
||||||
@@ -306,18 +307,16 @@ 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}/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})
|
target_link_libraries("${PROJECT_NAME}-server" ${CMAKE_THREAD_LIBS_INIT} ${EXTRA_LIBS})
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME} ${CLIENT_SOURCES})
|
add_executable(${PROJECT_NAME} ${CLIENT_SOURCES})
|
||||||
|
|
||||||
|
|||||||
44
README.md
44
README.md
@@ -1,6 +1,6 @@
|
|||||||
# MinecraftPE
|
# MinecraftPE
|
||||||
> [!Warning]
|
> [!Warning]
|
||||||
> 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).
|
> [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).
|
||||||
|
|
||||||
> [!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,23 +9,20 @@ 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.
|
||||||
|
|
||||||
# TODO / Roadmap
|
# Features
|
||||||
- [x] Add platform GLFW
|
- Support for modern IOS and Android, Linux, Web
|
||||||
- [x] Compile for Linux
|
- Improved Dedicated Server (Windows build, anticheat, commands, etc)
|
||||||
- [x] Compile for android aarch64
|
- Features from Beta version of Minecraft (Grass tint, Beta sky, Smooth lighting, etc) and other tweaks
|
||||||
- [x] Touch control improvements
|
|
||||||
- [ ] Screen fixes
|
# Screenshots
|
||||||
- [ ] Rewrite platform logic
|
<p align="center">
|
||||||
- [x] Fix sound
|
|
||||||
- [x] Do a server connection GUI
|
<img width="49%" alt="menu" src="https://sffempire.ru/mcpe-screenshots/menu.png" />
|
||||||
- [ ] Controller support
|
<img width="49%" alt="settings" src="https://sffempire.ru/mcpe-screenshots/settings.png" />
|
||||||
- [x] Minecraft server hosting
|
<img width="49%" alt="worlds" src="https://sffempire.ru/mcpe-screenshots/worlds.png" />
|
||||||
- [x] Screen fixess
|
<img width="49%" alt="gameplay" src="https://sffempire.ru/mcpe-screenshots/gameplay.png" />
|
||||||
- [x] Fix fog
|
|
||||||
- [x] Add sprinting
|
</p>
|
||||||
- [x] Chat (semi working) and commands
|
|
||||||
- [x] Implementing options
|
|
||||||
- [x] Better F3
|
|
||||||
|
|
||||||
# Build
|
# Build
|
||||||
|
|
||||||
@@ -79,8 +76,14 @@ 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):
|
||||||
|
|
||||||
3. Run the build script:
|
```powershell
|
||||||
|
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)
|
||||||
@@ -154,7 +157,6 @@ cmake --build .
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
35.0.0
|
35.0.0
|
||||||
33.0.2
|
|
||||||
```
|
```
|
||||||
|
|
||||||
6. Download **Android NDK r14b**:
|
6. Download **Android NDK r14b**:
|
||||||
@@ -200,7 +202,7 @@ cmake --build .
|
|||||||
```
|
```
|
||||||
## 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
|
||||||
|
|||||||
BIN
data/images/misc/water.png
Normal file
BIN
data/images/misc/water.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 306 B |
BIN
data/images/terrain/moon.png
Normal file
BIN
data/images/terrain/moon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 910 B |
BIN
data/images/terrain/sun.png
Normal file
BIN
data/images/terrain/sun.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 799 B |
@@ -153,7 +153,32 @@ options.group.tweaks=Tweaks
|
|||||||
options.allowSprint=Allow sprint
|
options.allowSprint=Allow sprint
|
||||||
options.barOnTop=HUD above inventory
|
options.barOnTop=HUD above inventory
|
||||||
options.rpiCursor=Show Raspberry PI cursor
|
options.rpiCursor=Show Raspberry PI cursor
|
||||||
options.foliageTint=Tint Grass and Leaves
|
options.foliagetint=Foliage Tinting
|
||||||
|
options.javaHud=Beta Java hotbar tweaks
|
||||||
|
options.blockOutline=Block Outline Selection
|
||||||
|
options.fogType=Fog/Sky Color
|
||||||
|
options.fogType.vanilla=Vanilla
|
||||||
|
options.fogType.java=Beta Java
|
||||||
|
options.fogType.unused=Unused
|
||||||
|
|
||||||
|
options.debugStyle=Debug Menu Style
|
||||||
|
options.debugStyle.javaBeta=Java Beta
|
||||||
|
options.debugStyle.custom=Custom
|
||||||
|
|
||||||
|
options.beautifulSky=Beautiful Skies
|
||||||
|
|
||||||
|
options.useVignette=Vignette Overlay
|
||||||
|
|
||||||
|
options.tintedSide=Tint Grass Sides
|
||||||
|
|
||||||
|
options.betaSky=Java Beta Sky
|
||||||
|
|
||||||
|
options.restoredAnims=Restored Animations
|
||||||
|
|
||||||
|
options.normalLighting=Java Beta/Normals Shading
|
||||||
|
|
||||||
|
options.isJoyTouchArea=Use Split Controls
|
||||||
|
|
||||||
options.autoJump=Auto Jump
|
options.autoJump=Auto Jump
|
||||||
options.thirdperson=Third Person
|
options.thirdperson=Third Person
|
||||||
options.servervisible=Server Visible
|
options.servervisible=Server Visible
|
||||||
@@ -204,6 +229,12 @@ options.fancyGraphics=Fancy graphics
|
|||||||
options.renderDebug=Debug render
|
options.renderDebug=Debug render
|
||||||
options.anaglyph3d=3D anaglyph
|
options.anaglyph3d=3D anaglyph
|
||||||
|
|
||||||
|
options.windowScale =Window Scaling
|
||||||
|
|
||||||
|
options.menuStyle =Menu Style
|
||||||
|
options.menuStyle.pocket =Pocket Edition
|
||||||
|
options.menuStyle.xperia =Xperia/Pi
|
||||||
|
options.menuStyle.java =Java Beta
|
||||||
|
|
||||||
performance.max=Max FPS
|
performance.max=Max FPS
|
||||||
performance.balanced=Balanced
|
performance.balanced=Balanced
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
|||||||
../../../src/client/player/RemotePlayer.cpp \
|
../../../src/client/player/RemotePlayer.cpp \
|
||||||
../../../src/client/player/input/KeyboardInput.cpp \
|
../../../src/client/player/input/KeyboardInput.cpp \
|
||||||
../../../src/client/player/input/touchscreen/TouchscreenInput.cpp \
|
../../../src/client/player/input/touchscreen/TouchscreenInput.cpp \
|
||||||
|
../../../src/client/renderer/Lighting.cpp \
|
||||||
../../../src/client/renderer/Chunk.cpp \
|
../../../src/client/renderer/Chunk.cpp \
|
||||||
../../../src/client/renderer/EntityTileRenderer.cpp \
|
../../../src/client/renderer/EntityTileRenderer.cpp \
|
||||||
../../../src/client/renderer/GameRenderer.cpp \
|
../../../src/client/renderer/GameRenderer.cpp \
|
||||||
@@ -109,6 +110,7 @@ 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 \
|
||||||
@@ -139,6 +141,12 @@ 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 \
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
|||||||
../../../src/client/player/RemotePlayer.cpp \
|
../../../src/client/player/RemotePlayer.cpp \
|
||||||
../../../src/client/player/input/KeyboardInput.cpp \
|
../../../src/client/player/input/KeyboardInput.cpp \
|
||||||
../../../src/client/player/input/touchscreen/TouchscreenInput.cpp \
|
../../../src/client/player/input/touchscreen/TouchscreenInput.cpp \
|
||||||
|
../../../src/client/renderer/Lighting.cpp \
|
||||||
../../../src/client/renderer/Chunk.cpp \
|
../../../src/client/renderer/Chunk.cpp \
|
||||||
../../../src/client/renderer/EntityTileRenderer.cpp \
|
../../../src/client/renderer/EntityTileRenderer.cpp \
|
||||||
../../../src/client/renderer/GameRenderer.cpp \
|
../../../src/client/renderer/GameRenderer.cpp \
|
||||||
@@ -231,6 +232,7 @@ 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)
|
||||||
|
|
||||||
|
|||||||
BIN
project/android_java/res/raw/burp1.ogg
Normal file
BIN
project/android_java/res/raw/burp1.ogg
Normal file
Binary file not shown.
@@ -129,6 +129,7 @@ public class SoundPlayer
|
|||||||
new SoundId(R.raw.eat1, "random.eat"),
|
new SoundId(R.raw.eat1, "random.eat"),
|
||||||
new SoundId(R.raw.eat2, "random.eat"),
|
new SoundId(R.raw.eat2, "random.eat"),
|
||||||
new SoundId(R.raw.eat3, "random.eat"),
|
new SoundId(R.raw.eat3, "random.eat"),
|
||||||
|
new SoundId(R.raw.burp1, "random.burp"),
|
||||||
new SoundId(R.raw.fuse, "random.fuse"),
|
new SoundId(R.raw.fuse, "random.fuse"),
|
||||||
|
|
||||||
new SoundId(R.raw.zpig1, "mob.zombiepig.zpig"),
|
new SoundId(R.raw.zpig1, "mob.zombiepig.zpig"),
|
||||||
|
|||||||
@@ -47,6 +47,8 @@
|
|||||||
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 */; };
|
||||||
@@ -1179,6 +1181,19 @@
|
|||||||
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 */; };
|
||||||
|
F9E5A775300E7AB700164066 /* CommandManager.hpp in Sources */ = {isa = PBXBuildFile; fileRef = F9E5A773300E7AB700164066 /* CommandManager.hpp */; };
|
||||||
|
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 */
|
||||||
@@ -1246,6 +1261,7 @@
|
|||||||
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>"; };
|
||||||
@@ -2466,6 +2482,19 @@
|
|||||||
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>"; };
|
||||||
|
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 */
|
||||||
@@ -3533,6 +3562,7 @@
|
|||||||
D5B50CF114CFF66F005F7284 /* TileRenderer.cpp */,
|
D5B50CF114CFF66F005F7284 /* TileRenderer.cpp */,
|
||||||
D5B50CF214CFF66F005F7284 /* TileRenderer.h */,
|
D5B50CF214CFF66F005F7284 /* TileRenderer.h */,
|
||||||
D5B50CF314CFF66F005F7284 /* VertecDecl.h */,
|
D5B50CF314CFF66F005F7284 /* VertecDecl.h */,
|
||||||
|
BEEF202614CFF670005F0001 /* Lighting.cpp */,
|
||||||
);
|
);
|
||||||
path = renderer;
|
path = renderer;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -4315,6 +4345,19 @@
|
|||||||
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 */,
|
||||||
@@ -5439,6 +5482,7 @@
|
|||||||
D5D8C4C41639341100FD35F0 /* Motive.cpp in Sources */,
|
D5D8C4C41639341100FD35F0 /* Motive.cpp in Sources */,
|
||||||
D5D8C4C8163934BB00FD35F0 /* HangingEntityItem.cpp in Sources */,
|
D5D8C4C8163934BB00FD35F0 /* HangingEntityItem.cpp in Sources */,
|
||||||
D5D8C4CC1639362F00FD35F0 /* NetherReactorPattern.cpp in Sources */,
|
D5D8C4CC1639362F00FD35F0 /* NetherReactorPattern.cpp in Sources */,
|
||||||
|
BEEF202614CFF670005F0002 /* Lighting.cpp in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -5446,6 +5490,19 @@
|
|||||||
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 */,
|
||||||
@@ -5821,6 +5878,7 @@
|
|||||||
042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */,
|
042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */,
|
||||||
042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */,
|
042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */,
|
||||||
042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */,
|
042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */,
|
||||||
|
BEEF202614CFF670005F0003 /* Lighting.cpp in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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, &mProcMask, &mSysMask);
|
GetProcessAffinityMask(mProc, (PDWORD_PTR)&mProcMask, (PDWORD_PTR)&mSysMask);
|
||||||
#endif
|
#endif
|
||||||
mThread = GetCurrentThread();
|
mThread = GetCurrentThread();
|
||||||
|
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ void NinecraftApp::teardown()
|
|||||||
Recipes ::teardownRecipes();
|
Recipes ::teardownRecipes();
|
||||||
TileEntity::teardownTileEntities();
|
TileEntity::teardownTileEntities();
|
||||||
#endif
|
#endif
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(STANDALONE_SERVER)
|
||||||
ItemRenderer::teardown_static();
|
ItemRenderer::teardown_static();
|
||||||
if (EntityTileRenderer::instance != NULL) {
|
if (EntityTileRenderer::instance != NULL) {
|
||||||
delete EntityTileRenderer::instance;
|
delete EntityTileRenderer::instance;
|
||||||
|
|||||||
@@ -2,18 +2,20 @@
|
|||||||
#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"
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
|
|
||||||
#if defined(APPLE_DEMO_PROMOTION)
|
#if defined(APPLE_DEMO_PROMOTION)
|
||||||
#define NO_NETWORK
|
#define NO_NETWORK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(RPI)
|
#if defined(RPI)
|
||||||
#define CREATORMODE
|
#define CREATORMODE
|
||||||
#endif
|
#endif
|
||||||
#include "../network/RakNetInstance.h"
|
#include "../network/RakNetInstance.h"
|
||||||
#include "../network/ClientSideNetworkHandler.h"
|
#include "../network/ClientSideNetworkHandler.h"
|
||||||
@@ -90,7 +92,14 @@
|
|||||||
#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 "particle/ParticleEngine.h"
|
||||||
|
#endif
|
||||||
|
#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) {
|
||||||
@@ -113,7 +122,7 @@ const char* Minecraft::progressMessages[] = {
|
|||||||
int Minecraft::customDebugId = Minecraft::CDI_NONE;
|
int Minecraft::customDebugId = Minecraft::CDI_NONE;
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal
|
#pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool Minecraft::useAmbientOcclusion = false;
|
bool Minecraft::useAmbientOcclusion = false;
|
||||||
@@ -176,9 +185,10 @@ 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
|
||||||
|
|
||||||
#if defined(NO_NETWORK)
|
#if defined(NO_NETWORK)
|
||||||
raknetInstance = new IRakNetInstance();
|
raknetInstance = new IRakNetInstance();
|
||||||
@@ -257,9 +267,10 @@ 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;
|
||||||
LOGI("Seed is %ld\n", level->getSeed());
|
|
||||||
|
|
||||||
if (level != NULL) {
|
if (level != NULL) {
|
||||||
|
LOGI("Seed is %ld\n", level->getSeed());
|
||||||
|
|
||||||
level->raknetInstance = raknetInstance;
|
level->raknetInstance = raknetInstance;
|
||||||
gameMode->initLevel(level);
|
gameMode->initLevel(level);
|
||||||
|
|
||||||
@@ -276,6 +287,11 @@ 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;
|
||||||
#ifdef STANDALONE_SERVER
|
#ifdef STANDALONE_SERVER
|
||||||
const bool threadedLevelCreation = false;
|
const bool threadedLevelCreation = false;
|
||||||
@@ -359,10 +375,10 @@ void Minecraft::prepareLevel(const std::string& title) {
|
|||||||
if (!level->isNew())
|
if (!level->isNew())
|
||||||
level->setUpdateLights(false);
|
level->setUpdateLights(false);
|
||||||
|
|
||||||
int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH;
|
int Max = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH;
|
||||||
int pp = 0;
|
int pp = 0;
|
||||||
for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) {
|
for (int x = 8; x < (LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_WIDTH); x += LevelConstants::CHUNK_WIDTH) {
|
||||||
for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) {
|
for (int z = 8; z < (LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_WIDTH); z += LevelConstants::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();
|
||||||
@@ -379,9 +395,9 @@ void Minecraft::prepareLevel(const std::string& title) {
|
|||||||
level->setUpdateLights(true);
|
level->setUpdateLights(true);
|
||||||
|
|
||||||
C.start();
|
C.start();
|
||||||
for (int x = 0; x < CHUNK_CACHE_WIDTH; x++)
|
for (int x = 0; x < LevelConstants::CHUNK_CACHE_WIDTH; x++)
|
||||||
{
|
{
|
||||||
for (int z = 0; z < CHUNK_CACHE_WIDTH; z++)
|
for (int z = 0; z < LevelConstants::CHUNK_CACHE_WIDTH; z++)
|
||||||
{
|
{
|
||||||
LevelChunk* chunk = level->getChunk(x, z);
|
LevelChunk* chunk = level->getChunk(x, z);
|
||||||
if (chunk && !chunk->createdFromSave)
|
if (chunk && !chunk->createdFromSave)
|
||||||
@@ -462,32 +478,33 @@ void Minecraft::update() {
|
|||||||
}
|
}
|
||||||
TIMER_POP();
|
TIMER_POP();
|
||||||
|
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
if (gameMode != NULL) gameMode->render(timer.a);
|
if (gameMode != NULL) gameMode->render(timer.a);
|
||||||
TIMER_PUSH("sound");
|
TIMER_PUSH("sound");
|
||||||
soundEngine->update(player, timer.a);
|
soundEngine->update(player, timer.a);
|
||||||
TIMER_POP_PUSH("render");
|
TIMER_POP_PUSH("render");
|
||||||
gameRenderer->render(timer.a);
|
gameRenderer->render(timer.a);
|
||||||
TIMER_POP();
|
TIMER_POP();
|
||||||
#else
|
#else
|
||||||
CThread::sleep(1);
|
CThread::sleep(1);
|
||||||
#endif
|
#endif
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
Multitouch::resetThisUpdate();
|
Multitouch::resetThisUpdate();
|
||||||
#endif
|
#endif
|
||||||
TIMER_POP();
|
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
|
TIMER_POP();
|
||||||
checkGlError("Update finished");
|
checkGlError("Update finished");
|
||||||
|
|
||||||
if (options.getBooleanValue(OPTIONS_RENDER_DEBUG)) {
|
if (options.getBooleanValue(OPTIONS_RENDER_DEBUG)) {
|
||||||
#ifndef PLATFORM_DESKTOP
|
//#ifndef PLATFORM_DESKTOP
|
||||||
if (!PerfTimer::enabled) {
|
if (!PerfTimer::enabled) {
|
||||||
PerfTimer::reset();
|
PerfTimer::reset();
|
||||||
PerfTimer::enabled = true;
|
PerfTimer::enabled = true;
|
||||||
}
|
}
|
||||||
_perfRenderer->renderFpsMeter(1);
|
_perfRenderer->renderFpsMeter(1);
|
||||||
checkGlError("render debug");
|
checkGlError("render debug");
|
||||||
#endif
|
//#endif
|
||||||
} else {
|
} else {
|
||||||
PerfTimer::enabled = false;
|
PerfTimer::enabled = false;
|
||||||
}
|
}
|
||||||
@@ -564,17 +581,17 @@ void Minecraft::tick(int nTick, int maxTick) {
|
|||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
textures->loadAndBindTexture("terrain.png");
|
textures->loadAndBindTexture("terrain.png");
|
||||||
if (!pause && !(screen && !screen->renderGameBehind())) {
|
if (!pause && !(screen && !screen->renderGameBehind())) {
|
||||||
#if !defined(RPI)
|
#if !defined(RPI)
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
if (isSuperFast())
|
if (isSuperFast())
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (nTick == maxTick) {
|
if (nTick == maxTick) {
|
||||||
TIMER_POP_PUSH("textures");
|
TIMER_POP_PUSH("textures");
|
||||||
textures->tick(true);
|
textures->tick(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
TIMER_POP_PUSH("particles");
|
TIMER_POP_PUSH("particles");
|
||||||
if (!pause) {
|
if (!pause) {
|
||||||
@@ -696,7 +713,7 @@ void Minecraft::tickInput() {
|
|||||||
if (slot >= 0 && slot < gui.getNumSlots())
|
if (slot >= 0 && slot < gui.getNumSlots())
|
||||||
player->inventory->selectSlot(slot);
|
player->inventory->selectSlot(slot);
|
||||||
|
|
||||||
#if defined(WIN32)
|
#if defined(WIN32)
|
||||||
if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) {
|
if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) {
|
||||||
// Set adventure settings here!
|
// Set adventure settings here!
|
||||||
AdventureSettingsPacket p(level->adventureSettings);
|
AdventureSettingsPacket p(level->adventureSettings);
|
||||||
@@ -709,7 +726,7 @@ void Minecraft::tickInput() {
|
|||||||
SetSpawnPositionPacket p(pos);
|
SetSpawnPositionPacket p(pos);
|
||||||
raknetInstance->send(p);
|
raknetInstance->send(p);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key == Keyboard::KEY_LEFT_CTRL) {
|
if (key == Keyboard::KEY_LEFT_CTRL) {
|
||||||
@@ -728,6 +745,21 @@ 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);
|
||||||
/*
|
/*
|
||||||
@@ -745,7 +777,8 @@ void Minecraft::tickInput() {
|
|||||||
int dst = options.getIntValue(OPTIONS_VIEW_DISTANCE);
|
int dst = options.getIntValue(OPTIONS_VIEW_DISTANCE);
|
||||||
options.set(OPTIONS_VIEW_DISTANCE, (dst + 1) % 4);
|
options.set(OPTIONS_VIEW_DISTANCE, (dst + 1) % 4);
|
||||||
}
|
}
|
||||||
#ifdef CHEATS
|
|
||||||
|
#ifdef CHEATS
|
||||||
if (key == Keyboard::KEY_U) {
|
if (key == Keyboard::KEY_U) {
|
||||||
onGraphicsReset();
|
onGraphicsReset();
|
||||||
player->heal(100);
|
player->heal(100);
|
||||||
@@ -826,32 +859,40 @@ void Minecraft::tickInput() {
|
|||||||
_perfRenderer->debugFpsMeterKeyPress(key - '0');
|
_perfRenderer->debugFpsMeterKeyPress(key - '0');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (options.getBooleanValue(OPTIONS_RENDER_DEBUG)) {
|
||||||
|
if (key >= '0' && key <= '9') {
|
||||||
|
_perfRenderer->debugFpsMeterKeyPress(key - '0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (key == Keyboard::KEY_ESCAPE)
|
if (key == Keyboard::KEY_ESCAPE)
|
||||||
pauseGame(false);
|
pauseGame(false);
|
||||||
|
|
||||||
#ifndef OPENGL_ES
|
#ifdef PLATFORM_DESKTOP
|
||||||
if (key == Keyboard::KEY_P) {
|
if (key == Keyboard::KEY_P) {
|
||||||
static bool isWireFrame = false;
|
static bool isWireFrame = false;
|
||||||
isWireFrame = !isWireFrame;
|
isWireFrame = !isWireFrame;
|
||||||
glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL);
|
glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL);
|
||||||
//glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL);
|
//glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
if (key == Keyboard::KEY_M) {
|
if (key == Keyboard::KEY_M) {
|
||||||
for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i)
|
for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i)
|
||||||
level->tick();
|
level->tick();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TIMER_POP_PUSH("handlemouse");
|
TIMER_POP_PUSH("handlemouse");
|
||||||
|
|
||||||
static bool prevMouseDownLeft = false;
|
static bool prevMouseDownLeft = false;
|
||||||
|
|
||||||
|
if (!useTouchscreen()) {
|
||||||
if (Mouse::getButtonState(MouseAction::ACTION_LEFT) == 0) {
|
if (Mouse::getButtonState(MouseAction::ACTION_LEFT) == 0) {
|
||||||
gameMode->stopDestroyBlock();
|
gameMode->stopDestroyBlock();
|
||||||
}
|
}
|
||||||
@@ -859,6 +900,7 @@ void Minecraft::tickInput() {
|
|||||||
if (!Mouse::isButtonDown(MouseAction::ACTION_RIGHT)) {
|
if (!Mouse::isButtonDown(MouseAction::ACTION_RIGHT)) {
|
||||||
gameMode->releaseUsingItem(player);
|
gameMode->releaseUsingItem(player);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (useTouchscreen()) {
|
if (useTouchscreen()) {
|
||||||
// Touch: gesture recognizer classifies the action type (turn/destroy/build)
|
// Touch: gesture recognizer classifies the action type (turn/destroy/build)
|
||||||
@@ -868,6 +910,9 @@ 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
|
||||||
@@ -973,10 +1018,10 @@ void Minecraft::handleBuildAction(BuildActionIntention* action) {
|
|||||||
if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) {
|
if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) {
|
||||||
mayUse = false;
|
mayUse = false;
|
||||||
player->swing();
|
player->swing();
|
||||||
#ifdef RPI
|
#ifdef RPI
|
||||||
} else if (item && item->id == ((Item*)Item::sword_iron)->id) {
|
} else if (item && item->id == ((Item*)Item::sword_iron)->id) {
|
||||||
player->swing();
|
player->swing();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (item && item->count <= 0) {
|
if (item && item->count <= 0) {
|
||||||
player->inventory->clearSlot(player->inventory->selected);
|
player->inventory->clearSlot(player->inventory->selected);
|
||||||
@@ -1118,6 +1163,7 @@ 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");
|
||||||
|
|
||||||
@@ -1128,7 +1174,10 @@ void Minecraft::init()
|
|||||||
textures = new Textures(&options, platform());
|
textures = new Textures(&options, platform());
|
||||||
textures->addDynamicTexture(new WaterTexture());
|
textures->addDynamicTexture(new WaterTexture());
|
||||||
textures->addDynamicTexture(new WaterSideTexture());
|
textures->addDynamicTexture(new WaterSideTexture());
|
||||||
textures->addDynamicTexture(new FireTexture());
|
textures->addDynamicTexture(new LavaTexture());
|
||||||
|
textures->addDynamicTexture(new LavaSideTexture());
|
||||||
|
textures->addDynamicTexture(new FireTexture(0));
|
||||||
|
textures->addDynamicTexture(new FireTexture(1));
|
||||||
gui.texturesLoaded(textures);
|
gui.texturesLoaded(textures);
|
||||||
|
|
||||||
levelRenderer = new LevelRenderer(this);
|
levelRenderer = new LevelRenderer(this);
|
||||||
@@ -1136,7 +1185,7 @@ void Minecraft::init()
|
|||||||
particleEngine = new ParticleEngine(level, textures);
|
particleEngine = new ParticleEngine(level, textures);
|
||||||
|
|
||||||
// 4j's code for reference
|
// 4j's code for reference
|
||||||
// FoliageColor::init(textures->loadTexturePixels(L"misc/foliagecolor.png"));
|
// FoliageColor::init(textures->loadTexturePixels(L"misc/foliagecolor.png"));
|
||||||
|
|
||||||
|
|
||||||
// my code
|
// my code
|
||||||
@@ -1145,14 +1194,18 @@ void Minecraft::init()
|
|||||||
// now i can finally initialize foliage color, probably not the best way to handle this but i cant be arsed rn
|
// now i can finally initialize foliage color, probably not the best way to handle this but i cant be arsed rn
|
||||||
FoliageColor::init(foliagePixels);
|
FoliageColor::init(foliagePixels);
|
||||||
|
|
||||||
TextureId grassId = (textures->loadTexture("misc/foliagecolor.png")); // loading the uh png for foliage color
|
TextureId grassId = (textures->loadTexture("misc/grasscolor.png")); // loading the uh png for foliage color
|
||||||
int* grassPixels = textures->loadTexturePixels(grassId, "misc/foliagecolor.png");
|
int* grassPixels = textures->loadTexturePixels(grassId, "misc/grasscolor.png");
|
||||||
GrassColor::init(grassPixels);
|
GrassColor::init(grassPixels);
|
||||||
|
|
||||||
bool tint = options.getBooleanValue(OPTIONS_FOLIAGE_TINT); // finally, toggleable foliage color
|
bool tint = options.getBooleanValue(OPTIONS_FOLIAGE_TINT); // finally, toggleable foliage color
|
||||||
FoliageColor::setUseTint(tint);
|
FoliageColor::setUseTint(tint);
|
||||||
GrassColor::setUseTint(tint);
|
GrassColor::setUseTint(tint);
|
||||||
|
|
||||||
|
bool sideTint = options.getBooleanValue(OPTIONS_TINTED_SIDE);
|
||||||
|
TileRenderer::setUseTint(sideTint);
|
||||||
|
|
||||||
|
|
||||||
// Platform specific initialization here
|
// Platform specific initialization here
|
||||||
font = new Font(&options, "font/default8.png", textures);
|
font = new Font(&options, "font/default8.png", textures);
|
||||||
|
|
||||||
@@ -1173,6 +1226,24 @@ void Minecraft::setSize(int w, int h) {
|
|||||||
|
|
||||||
width = w;
|
width = w;
|
||||||
height = h;
|
height = h;
|
||||||
|
int screenWidth;
|
||||||
|
int screenHeight;
|
||||||
|
//#ifdef PLATFORM_DESKTOP
|
||||||
|
if (options.getBooleanValue(OPTIONS_WINDOW_SCALE)){ // scales with resolution using a formula instead of having hardcoded if checks
|
||||||
|
int guiScale = options.getIntValue(OPTIONS_GUI_SCALE);
|
||||||
|
if (guiScale == 0) {
|
||||||
|
guiScale = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// determine gui scale, optionally overriding auto
|
||||||
|
|
||||||
|
|
||||||
|
Gui::GuiScale = (float)Mth::Min(guiScale, Mth::Max(1, Mth::Min(width / 320, height / 240)));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
|
||||||
int guiScale = options.getIntValue(OPTIONS_GUI_SCALE);
|
int guiScale = options.getIntValue(OPTIONS_GUI_SCALE);
|
||||||
|
|
||||||
@@ -1190,11 +1261,11 @@ void Minecraft::setSize(int w, int h) {
|
|||||||
} else {
|
} else {
|
||||||
// auto compute from resolution
|
// auto compute from resolution
|
||||||
if (width >= 1000) {
|
if (width >= 1000) {
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
Gui::GuiScale = (width > 2000)? 8.0f : 4.0f;
|
Gui::GuiScale = (width > 2000)? 8.0f : 4.0f;
|
||||||
#else
|
#else
|
||||||
Gui::GuiScale = 4.0f;
|
Gui::GuiScale = 4.0f;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (width >= 800) {
|
else if (width >= 800) {
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
@@ -1209,9 +1280,7 @@ void Minecraft::setSize(int w, int h) {
|
|||||||
Gui::GuiScale = 1.0f;
|
Gui::GuiScale = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
Gui::InvGuiScale = 1.0f / Gui::GuiScale;
|
|
||||||
int screenWidth = (int)(width * Gui::InvGuiScale);
|
|
||||||
int screenHeight = (int)(height * Gui::InvGuiScale);
|
|
||||||
|
|
||||||
// if (platform()) {
|
// if (platform()) {
|
||||||
// float pixelsPerMillimeter = options.getProgressValue(&Option::PIXELS_PER_MILLIMETER);
|
// float pixelsPerMillimeter = options.getProgressValue(&Option::PIXELS_PER_MILLIMETER);
|
||||||
@@ -1219,6 +1288,13 @@ void Minecraft::setSize(int w, int h) {
|
|||||||
// pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale);
|
// pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Gui::InvGuiScale = 1.0f / Gui::GuiScale;
|
||||||
|
screenWidth = (int)(width * Gui::InvGuiScale);
|
||||||
|
screenHeight = (int)(height * Gui::InvGuiScale);
|
||||||
|
|
||||||
Config config = createConfig(this);
|
Config config = createConfig(this);
|
||||||
gui.onConfigChanged(config);
|
gui.onConfigChanged(config);
|
||||||
|
|
||||||
@@ -1263,17 +1339,17 @@ void Minecraft::_reloadInput() {
|
|||||||
if (useTouchHolder) {
|
if (useTouchHolder) {
|
||||||
inputHolder = new TouchInputHolder(this, &options);
|
inputHolder = new TouchInputHolder(this, &options);
|
||||||
} else {
|
} else {
|
||||||
#if defined(ANDROID) || defined(__APPLE__)
|
#if defined(ANDROID) || defined(__APPLE__)
|
||||||
inputHolder = new CustomInputHolder(
|
inputHolder = new CustomInputHolder(
|
||||||
new XperiaPlayInput(&options),
|
new XperiaPlayInput(&options),
|
||||||
new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA),
|
new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA),
|
||||||
new IBuildInput());
|
new IBuildInput());
|
||||||
#else
|
#else
|
||||||
inputHolder = new CustomInputHolder(
|
inputHolder = new CustomInputHolder(
|
||||||
new KeyboardInput(&options),
|
new KeyboardInput(&options),
|
||||||
new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2),
|
new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2),
|
||||||
new MouseBuildInput());
|
new MouseBuildInput());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
mouseHandler.setTurnInput(inputHolder->getTurnInput());
|
mouseHandler.setTurnInput(inputHolder->getTurnInput());
|
||||||
@@ -1326,11 +1402,8 @@ 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);
|
||||||
}
|
}
|
||||||
@@ -1345,11 +1418,11 @@ void Minecraft::hostMultiplayer(int port) {
|
|||||||
|
|
||||||
#if !defined(NO_NETWORK)
|
#if !defined(NO_NETWORK)
|
||||||
netCallback = new ServerSideNetworkHandler(this, raknetInstance);
|
netCallback = new ServerSideNetworkHandler(this, raknetInstance);
|
||||||
#ifdef STANDALONE_SERVER
|
#ifdef STANDALONE_SERVER
|
||||||
raknetInstance->host("Server", port, 16);
|
raknetInstance->host("Server", port, 16);
|
||||||
#else
|
#else
|
||||||
raknetInstance->host(options.getStringValue(OPTIONS_USERNAME), port);
|
raknetInstance->host(options.getStringValue(OPTIONS_USERNAME), port);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1404,8 +1477,8 @@ void Minecraft::_levelGenerated()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (level && level->dimension) {
|
if (level && level->dimension) {
|
||||||
// For example, if you want FogType or any other option
|
|
||||||
level->dimension->FogType = options.getBooleanValue(OPTIONS_FOG_TYPE);
|
level->dimension->FogType = options.getIntValue(OPTIONS_FOG_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1434,6 +1507,34 @@ void Minecraft::_levelGenerated()
|
|||||||
_hasSignaledGeneratingLevelFinished = true;
|
_hasSignaledGeneratingLevelFinished = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Minecraft::gatherStats1() {
|
||||||
|
#ifndef STANDALONE_SERVER
|
||||||
|
return levelRenderer->gatherStats1();
|
||||||
|
#endif
|
||||||
|
return "Blank";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Minecraft::gatherStats2() {
|
||||||
|
#ifndef STANDALONE_SERVER
|
||||||
|
return levelRenderer->gatherStats2();
|
||||||
|
#endif
|
||||||
|
return "Blank";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Minecraft::gatherStats3() {
|
||||||
|
#ifndef STANDALONE_SERVER
|
||||||
|
return ("P: " + particleEngine->countParticles() + ". T: " + (level->gatherStats()));
|
||||||
|
#endif
|
||||||
|
return "Blank";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Minecraft::gatherStats4() {
|
||||||
|
return level->gatherChunkSourceStats();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Player* Minecraft::respawnPlayer(int playerId) {
|
Player* Minecraft::respawnPlayer(int playerId) {
|
||||||
for (unsigned int i = 0; i < level->players.size(); ++i) {
|
for (unsigned int i = 0; i < level->players.size(); ++i) {
|
||||||
if (level->players[i]->entityId == playerId) {
|
if (level->players[i]->entityId == playerId) {
|
||||||
@@ -1596,12 +1697,12 @@ void Minecraft::optionUpdated(OptionId option, bool value ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Minecraft::optionUpdated(OptionId option, float value ) {
|
void Minecraft::optionUpdated(OptionId option, float value ) {
|
||||||
// #ifndef STANDALONE_SERVER
|
// #ifndef STANDALONE_SERVER
|
||||||
// if(option == OPTIONS_PIXELS_PER_MILLIMETER) {
|
// if(option == OPTIONS_PIXELS_PER_MILLIMETER) {
|
||||||
// pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale);
|
// pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale);
|
||||||
// pixelCalc.setPixelsPerMillimeter(value);
|
// pixelCalc.setPixelsPerMillimeter(value);
|
||||||
// }
|
// }
|
||||||
// #endif
|
// #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Minecraft::optionUpdated(OptionId option, int value ) {
|
void Minecraft::optionUpdated(OptionId option, int value ) {
|
||||||
@@ -1610,3 +1711,11 @@ 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,6 +2,7 @@
|
|||||||
#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"
|
||||||
@@ -87,6 +88,14 @@ public:
|
|||||||
|
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
|
std::string gatherStats1();
|
||||||
|
|
||||||
|
std::string gatherStats2();
|
||||||
|
|
||||||
|
std::string gatherStats4();
|
||||||
|
|
||||||
|
std::string gatherStats3();
|
||||||
|
|
||||||
void tick(int nTick, int maxTick);
|
void tick(int nTick, int maxTick);
|
||||||
void tickInput();
|
void tickInput();
|
||||||
|
|
||||||
@@ -120,11 +129,17 @@ 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();
|
||||||
|
|
||||||
@@ -197,6 +212,7 @@ 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;
|
||||||
@@ -225,6 +241,8 @@ private:
|
|||||||
|
|
||||||
PerfRenderer* _perfRenderer;
|
PerfRenderer* _perfRenderer;
|
||||||
CommandServer* _commandServer;
|
CommandServer* _commandServer;
|
||||||
|
|
||||||
|
CommandManager m_commandManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/
|
#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/
|
||||||
|
|||||||
@@ -54,18 +54,38 @@ OptionBool limitFramerate("limitFramerate", false);
|
|||||||
OptionBool vsync("vsync", true);
|
OptionBool vsync("vsync", true);
|
||||||
OptionBool fancyGraphics("fancyGraphics", true);
|
OptionBool fancyGraphics("fancyGraphics", true);
|
||||||
OptionBool viewBobbing("viewBobbing", true);
|
OptionBool viewBobbing("viewBobbing", true);
|
||||||
OptionBool ambientOcclusion("ao", false);
|
OptionBool ambientOcclusion("ao", true);
|
||||||
|
|
||||||
|
OptionBool useNormalLighting("normalLighting", true);
|
||||||
|
|
||||||
|
OptionBool beautifulSky("beautifulSky", true);
|
||||||
|
|
||||||
|
OptionBool useVignette("useVignette", true);
|
||||||
|
|
||||||
OptionBool useTouchscreen("useTouchscreen", true);
|
OptionBool useTouchscreen("useTouchscreen", true);
|
||||||
|
|
||||||
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 tintedSide("tintedSide", false);
|
||||||
|
|
||||||
|
OptionBool blockOutline("blockOutline", false);
|
||||||
|
|
||||||
|
OptionBool restoredAnims("restoredAnims", true);
|
||||||
|
|
||||||
|
OptionInt debugStyle("debugStyle", 0, 0, 1);
|
||||||
|
|
||||||
|
OptionInt menuStyle("menuStyle",0, 0, 2);
|
||||||
|
|
||||||
|
OptionBool windowScale("windowScale", false);
|
||||||
|
|
||||||
OptionInt keyForward("key.forward", Keyboard::KEY_W);
|
OptionInt keyForward("key.forward", Keyboard::KEY_W);
|
||||||
OptionInt keyLeft("key.left", Keyboard::KEY_A);
|
OptionInt keyLeft("key.left", Keyboard::KEY_A);
|
||||||
OptionInt keyBack("key.back", Keyboard::KEY_S);
|
OptionInt keyBack("key.back", Keyboard::KEY_S);
|
||||||
@@ -118,6 +138,7 @@ void Options::initTable() {
|
|||||||
|
|
||||||
|
|
||||||
m_options[OPTIONS_GUI_SCALE] = &guiScale;
|
m_options[OPTIONS_GUI_SCALE] = &guiScale;
|
||||||
|
m_options[OPTIONS_WINDOW_SCALE] = &windowScale;
|
||||||
|
|
||||||
m_options[OPTIONS_SKIN] = &skin;
|
m_options[OPTIONS_SKIN] = &skin;
|
||||||
m_options[OPTIONS_USERNAME] = &username;
|
m_options[OPTIONS_USERNAME] = &username;
|
||||||
@@ -142,10 +163,20 @@ void Options::initTable() {
|
|||||||
|
|
||||||
m_options[OPTIONS_USE_TOUCHSCREEN] = &useTouchscreen;
|
m_options[OPTIONS_USE_TOUCHSCREEN] = &useTouchscreen;
|
||||||
|
|
||||||
|
m_options[OPTIONS_BLOCK_OUTLINE] = &blockOutline;
|
||||||
|
|
||||||
|
m_options[OPTIONS_VIGNETTE] = &useVignette;
|
||||||
|
|
||||||
|
m_options[OPTIONS_BEAUTIFUL_SKY] = &beautifulSky;
|
||||||
|
|
||||||
|
m_options[OPTIONS_NORMAL_LIGHTING] = &useNormalLighting;
|
||||||
|
|
||||||
|
m_options[OPTIONS_RESTORED_ANIMS] = &restoredAnims;
|
||||||
|
|
||||||
m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible;
|
m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible;
|
||||||
|
|
||||||
|
m_options[OPTIONS_MENU_STYLE] = &menuStyle;
|
||||||
|
|
||||||
m_options[OPTIONS_KEY_FORWARD] = &keyForward;
|
m_options[OPTIONS_KEY_FORWARD] = &keyForward;
|
||||||
m_options[OPTIONS_KEY_LEFT] = &keyLeft;
|
m_options[OPTIONS_KEY_LEFT] = &keyLeft;
|
||||||
m_options[OPTIONS_KEY_BACK] = &keyBack;
|
m_options[OPTIONS_KEY_BACK] = &keyBack;
|
||||||
@@ -173,6 +204,12 @@ void Options::initTable() {
|
|||||||
// 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_BETA_SKY] = &betaSky;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ enum OptionId {
|
|||||||
OPTIONS_BAR_ON_TOP,
|
OPTIONS_BAR_ON_TOP,
|
||||||
OPTIONS_ALLOW_SPRINT,
|
OPTIONS_ALLOW_SPRINT,
|
||||||
OPTIONS_AUTOJUMP,
|
OPTIONS_AUTOJUMP,
|
||||||
|
OPTIONS_WINDOW_SCALE,
|
||||||
|
|
||||||
// Graphics
|
// Graphics
|
||||||
OPTIONS_RENDER_DEBUG,
|
OPTIONS_RENDER_DEBUG,
|
||||||
@@ -49,6 +50,8 @@ enum OptionId {
|
|||||||
OPTIONS_LIMIT_FRAMERATE,
|
OPTIONS_LIMIT_FRAMERATE,
|
||||||
OPTIONS_VSYNC,
|
OPTIONS_VSYNC,
|
||||||
OPTIONS_FANCY_GRAPHICS,
|
OPTIONS_FANCY_GRAPHICS,
|
||||||
|
OPTIONS_NORMAL_LIGHTING,
|
||||||
|
|
||||||
|
|
||||||
// Cheats / debug
|
// Cheats / debug
|
||||||
OPTIONS_FLY_SPEED,
|
OPTIONS_FLY_SPEED,
|
||||||
@@ -56,6 +59,7 @@ enum OptionId {
|
|||||||
OPTIONS_IS_FLYING,
|
OPTIONS_IS_FLYING,
|
||||||
|
|
||||||
// Control
|
// Control
|
||||||
|
OPTIONS_BLOCK_OUTLINE,
|
||||||
OPTIONS_USE_MOUSE_FOR_DIGGING,
|
OPTIONS_USE_MOUSE_FOR_DIGGING,
|
||||||
OPTIONS_IS_LEFT_HANDED,
|
OPTIONS_IS_LEFT_HANDED,
|
||||||
OPTIONS_IS_JOY_TOUCH_AREA,
|
OPTIONS_IS_JOY_TOUCH_AREA,
|
||||||
@@ -87,6 +91,14 @@ enum OptionId {
|
|||||||
OPTIONS_FOLIAGE_TINT,
|
OPTIONS_FOLIAGE_TINT,
|
||||||
OPTIONS_FOG_TYPE,
|
OPTIONS_FOG_TYPE,
|
||||||
OPTIONS_JAVA_HUD,
|
OPTIONS_JAVA_HUD,
|
||||||
|
OPTIONS_RESTORED_ANIMS,
|
||||||
|
OPTIONS_TINTED_SIDE,
|
||||||
|
OPTIONS_BETA_SKY,
|
||||||
|
OPTIONS_BEAUTIFUL_SKY,
|
||||||
|
OPTIONS_VIGNETTE,
|
||||||
|
OPTIONS_DEBUG_STYLE,
|
||||||
|
OPTIONS_COMPLETE_LIGHTING,
|
||||||
|
OPTIONS_MENU_STYLE,
|
||||||
// Should be last!
|
// Should be last!
|
||||||
OPTIONS_COUNT
|
OPTIONS_COUNT
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -90,8 +90,12 @@ 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);
|
UseItemPacket packet(x, y, z, face, item, player->entityId, clickX, clickY, clickZ, player->x, player->y, player->z,
|
||||||
|
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);
|
||||||
@@ -100,7 +104,7 @@ bool GameMode::useItemOn(Player* player, Level* level, ItemInstance* item, int x
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (item == NULL) return false;
|
if (item == NULL) return false;
|
||||||
if(isCreativeType()) {
|
if (isCreativeType()) {
|
||||||
int aux = item->getAuxValue();
|
int aux = item->getAuxValue();
|
||||||
int count = item->count;
|
int count = item->count;
|
||||||
bool success = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
|
bool success = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ);
|
||||||
@@ -117,7 +121,8 @@ 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);
|
UseItemPacket packet(item, player->entityId, player->aimDirection, player->x, player->y, player->z,
|
||||||
|
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,6 +68,7 @@ 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);
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "screens/ConsoleScreen.h"
|
#include "screens/ConsoleScreen.h"
|
||||||
#include "../Minecraft.h"
|
#include "../Minecraft.h"
|
||||||
#include "../player/LocalPlayer.h"
|
#include "../player/LocalPlayer.h"
|
||||||
|
#include "../renderer/Chunk.h"
|
||||||
#include "../renderer/Tesselator.h"
|
#include "../renderer/Tesselator.h"
|
||||||
#include "../renderer/TileRenderer.h"
|
#include "../renderer/TileRenderer.h"
|
||||||
#include "../renderer/LevelRenderer.h"
|
#include "../renderer/LevelRenderer.h"
|
||||||
@@ -103,10 +104,10 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// @todo - Shredder: I added this here but currently viginette is broken so i cant do much about it.
|
// viginette has been fixed, was due to gl_blend not being enabled, my bad
|
||||||
// if (minecraft->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)){
|
if (minecraft->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS) && minecraft->options.getBooleanValue(OPTIONS_VIGNETTE)){
|
||||||
// this->renderVignette(this->minecraft->player->getBrightness(a), screenWidth, screenHeight);
|
renderVignette(this->minecraft->player->getBrightness(a), screenWidth, screenHeight);
|
||||||
// }
|
}
|
||||||
// shredder end
|
// shredder end
|
||||||
|
|
||||||
if(minecraft->player->getSleepTimer() > 0) {
|
if(minecraft->player->getSleepTimer() > 0) {
|
||||||
@@ -121,6 +122,9 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) {
|
|||||||
if (!minecraft->options.getBooleanValue(OPTIONS_HIDEGUI)) {
|
if (!minecraft->options.getBooleanValue(OPTIONS_HIDEGUI)) {
|
||||||
renderToolBar(a, ySlot, screenWidth);
|
renderToolBar(a, ySlot, screenWidth);
|
||||||
|
|
||||||
|
// font->drawShadow("Minecraft - Pocket Edition ", 2, 2, 0xffffffff);
|
||||||
|
// font->drawShadow("This is a demo, not the finished product", 2, 10 + 2, 0xffffffff);
|
||||||
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
bool isChatting = (minecraft->screen && (dynamic_cast<ChatScreen*>(minecraft->screen) || dynamic_cast<ConsoleScreen*>(minecraft->screen)));
|
bool isChatting = (minecraft->screen && (dynamic_cast<ChatScreen*>(minecraft->screen) || dynamic_cast<ConsoleScreen*>(minecraft->screen)));
|
||||||
unsigned int max = 10;
|
unsigned int max = 10;
|
||||||
@@ -220,8 +224,8 @@ void Gui::handleClick(int button, int x, int y) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gui::handleKeyPressed(int key)
|
void Gui::handleKeyPressed(int key)
|
||||||
{
|
{
|
||||||
bool isChatting = (minecraft->screen && (dynamic_cast<ChatScreen*>(minecraft->screen) || dynamic_cast<ConsoleScreen*>(minecraft->screen)));
|
bool isChatting = (minecraft->screen && (dynamic_cast<ChatScreen*>(minecraft->screen) || dynamic_cast<ConsoleScreen*>(minecraft->screen)));
|
||||||
if (isChatting) {
|
if (isChatting) {
|
||||||
// Allow scrolling the chat history with the mouse/keyboard when chat is open
|
// Allow scrolling the chat history with the mouse/keyboard when chat is open
|
||||||
@@ -271,7 +275,7 @@ void Gui::handleKeyPressed(int key)
|
|||||||
{
|
{
|
||||||
minecraft->player->inventory->dropSlot(minecraft->player->inventory->selected, false);
|
minecraft->player->inventory->dropSlot(minecraft->player->inventory->selected, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gui::scrollChat(int delta) {
|
void Gui::scrollChat(int delta) {
|
||||||
if (delta == 0)
|
if (delta == 0)
|
||||||
@@ -360,6 +364,7 @@ void Gui::renderVignette(float br, int w, int h) {
|
|||||||
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
glDepthMask(false);
|
glDepthMask(false);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc2(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
|
glBlendFunc2(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
|
||||||
glColor4f2(tbr, tbr, tbr, 1);
|
glColor4f2(tbr, tbr, tbr, 1);
|
||||||
|
|
||||||
@@ -376,6 +381,7 @@ void Gui::renderVignette(float br, int w, int h) {
|
|||||||
t.draw();
|
t.draw();
|
||||||
glDepthMask(true);
|
glDepthMask(true);
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
glColor4f2(1, 1, 1, 1);
|
glColor4f2(1, 1, 1, 1);
|
||||||
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
}
|
}
|
||||||
@@ -596,7 +602,8 @@ void Gui::renderProgressIndicator( const bool isTouchInterface, const int screen
|
|||||||
bool bowEquipped = currentItem != NULL ? currentItem->getItem() == Item::bow : false;
|
bool bowEquipped = currentItem != NULL ? currentItem->getItem() == Item::bow : false;
|
||||||
bool itemInUse = currentItem != NULL ? currentItem->getItem() == minecraft->player->getUseItem()->getItem() : false;
|
bool itemInUse = currentItem != NULL ? currentItem->getItem() == minecraft->player->getUseItem()->getItem() : false;
|
||||||
if ((!isTouchInterface || minecraft->options.getBooleanValue(OPTIONS_IS_JOY_TOUCH_AREA)
|
if ((!isTouchInterface || minecraft->options.getBooleanValue(OPTIONS_IS_JOY_TOUCH_AREA)
|
||||||
|| (bowEquipped && itemInUse)) && !minecraft->options.getBooleanValue(OPTIONS_HIDEGUI)) {
|
|| (bowEquipped && itemInUse)) && !minecraft->options.getBooleanValue(OPTIONS_HIDEGUI))
|
||||||
|
{
|
||||||
minecraft->textures->loadAndBindTexture("gui/icons.png");
|
minecraft->textures->loadAndBindTexture("gui/icons.png");
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc2(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR);
|
glBlendFunc2(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR);
|
||||||
@@ -620,7 +627,7 @@ void Gui::renderProgressIndicator( const bool isTouchInterface, const int screen
|
|||||||
const float x = InvGuiScale * minecraft->inputHolder->mousex;
|
const float x = InvGuiScale * minecraft->inputHolder->mousex;
|
||||||
const float y = InvGuiScale * minecraft->inputHolder->mousey;
|
const float y = InvGuiScale * minecraft->inputHolder->mousey;
|
||||||
glTranslatef2(x, y, 0);
|
glTranslatef2(x, y, 0);
|
||||||
drawArrayVT(rcFeedbackOuter.vboId, rcFeedbackOuter.vertexCount, 24);
|
drawArrayVT(rcFeedbackOuter.vboId, rcFeedbackOuter.vertexCount, 36);
|
||||||
glTranslatef2(-x, -y, 0);
|
glTranslatef2(-x, -y, 0);
|
||||||
|
|
||||||
glEnable2(GL_TEXTURE_2D);
|
glEnable2(GL_TEXTURE_2D);
|
||||||
@@ -641,12 +648,12 @@ void Gui::renderProgressIndicator( const bool isTouchInterface, const int screen
|
|||||||
const float y = InvGuiScale * minecraft->inputHolder->mousey;
|
const float y = InvGuiScale * minecraft->inputHolder->mousey;
|
||||||
glPushMatrix2();
|
glPushMatrix2();
|
||||||
glTranslatef2(x, y, 0);
|
glTranslatef2(x, y, 0);
|
||||||
drawArrayVT(rcFeedbackOuter.vboId, rcFeedbackOuter.vertexCount, 24);
|
drawArrayVT(rcFeedbackOuter.vboId, rcFeedbackOuter.vertexCount, 36);
|
||||||
glScalef2(0.5f + progress, 0.5f + progress, 1);
|
glScalef2(0.5f + progress, 0.5f + progress, 1);
|
||||||
//glDisable2(GL_CULL_FACE);
|
//glDisable2(GL_CULL_FACE);
|
||||||
glColor4f2(1, 1, 1, 1);
|
glColor4f2(1, 1, 1, 1);
|
||||||
glBlendFunc2(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR);
|
glBlendFunc2(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR);
|
||||||
drawArrayVT(rcFeedbackInner.vboId, rcFeedbackInner.vertexCount, 24, GL_TRIANGLE_FAN);
|
drawArrayVT(rcFeedbackInner.vboId, rcFeedbackInner.vertexCount, 36, GL_TRIANGLE_FAN);
|
||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
@@ -725,13 +732,20 @@ void Gui::onLevelGenerated() {
|
|||||||
|
|
||||||
void Gui::renderDebugInfo() {
|
void Gui::renderDebugInfo() {
|
||||||
// FPS counter (updates once per second)
|
// FPS counter (updates once per second)
|
||||||
static float fps = 0.0f;
|
static int fps = 0;
|
||||||
static float fpsLastTime = 0.0f;
|
static int fpsLastTime = 0;
|
||||||
static int fpsFrames = 0;
|
static int fpsFrames = 0;
|
||||||
|
static int displayChunkUpdates = 0;
|
||||||
float now = getTimeS();
|
float now = getTimeS();
|
||||||
fpsFrames++;
|
fpsFrames++;
|
||||||
if (now - fpsLastTime >= 1.0f) {
|
if (now - fpsLastTime >= 1) {
|
||||||
fps = fpsFrames / (now - fpsLastTime);
|
fps = fpsFrames / (now - fpsLastTime);
|
||||||
|
|
||||||
|
displayChunkUpdates = Chunk::updates;
|
||||||
|
|
||||||
|
// 3. RESET the actual game counter to 0 for the next second
|
||||||
|
Chunk::updates = 0;
|
||||||
|
|
||||||
fpsFrames = 0;
|
fpsFrames = 0;
|
||||||
fpsLastTime = now;
|
fpsLastTime = now;
|
||||||
}
|
}
|
||||||
@@ -741,7 +755,6 @@ 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;
|
||||||
|
|
||||||
@@ -768,7 +781,70 @@ 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;
|
||||||
|
|
||||||
|
// @todo - add our own debug screen as an option alongside the restored java one, why does renderdebug have to be so jank - shredder
|
||||||
|
|
||||||
|
// if java beta's restored debug menu is enabled
|
||||||
|
if (minecraft->options.getIntValue(OPTIONS_DEBUG_STYLE) == 0){
|
||||||
|
|
||||||
|
char buf[128];
|
||||||
|
|
||||||
|
sprintf(buf, "Minecraft - Pocket Edition (%d fps, %d chunk updates)", (int)fps, displayChunkUpdates);
|
||||||
|
font->drawShadow(buf, 2, 2, 0xffffff);
|
||||||
|
|
||||||
|
font->drawShadow(minecraft->gatherStats1(), 2, 12, 0xFFFFFF);
|
||||||
|
font->drawShadow(minecraft->gatherStats2(), 2, 22, 0xFFFFFF);
|
||||||
|
font->drawShadow(minecraft->gatherStats3(), 2, 32, 0xFFFFFF);
|
||||||
|
font->drawShadow(minecraft->gatherStats4(), 2, 42, 0xFFFFFF);
|
||||||
|
|
||||||
|
sprintf(buf, "x: %.8f", minecraft->player->x);
|
||||||
|
drawString(font, buf, 2, 64, 0xE0E0E0);
|
||||||
|
|
||||||
|
sprintf(buf, "y: %.8f", minecraft->player->y);
|
||||||
|
drawString(font, buf, 2, 72, 0xE0E0E0);
|
||||||
|
|
||||||
|
sprintf(buf, "z: %.8f", minecraft->player->z);
|
||||||
|
drawString(font, buf, 2, 80, 0xE0E0E0);
|
||||||
|
|
||||||
|
sprintf(buf, "f: %d",Mth::floor(minecraft->player->yRot * 4.0f / 360.0f + 0.5) & 0x3);
|
||||||
|
drawString(font, buf, 2, 88, 0xE0E0E0);
|
||||||
|
|
||||||
|
sprintf(buf, "Seed: %.ld", lvl->getSeed());
|
||||||
|
drawString(font, buf, 2, 104, 0xE0E0E0);
|
||||||
|
|
||||||
|
sprintf(buf, "Dimension: %d (%s)", lvl->dimension->id, lvl->dimension->getDimension().c_str());
|
||||||
|
drawString(font, buf, 2, 114, 0xE0E0E0);
|
||||||
|
|
||||||
|
sprintf(buf, "Biome: %s", biomeName);
|
||||||
|
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){
|
||||||
|
|
||||||
|
|
||||||
static char ln[8][96];
|
static char ln[8][96];
|
||||||
sprintf(ln[0], "Minecraft PE 0.6.1 alpha (mcpe64)");
|
sprintf(ln[0], "Minecraft PE 0.6.1 alpha (mcpe64)");
|
||||||
sprintf(ln[1], "%.1f fps", fps);
|
sprintf(ln[1], "%.1f fps", fps);
|
||||||
@@ -783,7 +859,7 @@ void Gui::renderDebugInfo() {
|
|||||||
const float LH = (float)Font::DefaultLineHeight; // 10 font-pixels
|
const float LH = (float)Font::DefaultLineHeight; // 10 font-pixels
|
||||||
const float MGN = 2.0f; // left/top margin in font-pixels
|
const float MGN = 2.0f; // left/top margin in font-pixels
|
||||||
const float PAD = 2.0f; // horizontal padding for background
|
const float PAD = 2.0f; // horizontal padding for background
|
||||||
Font* font = minecraft->font;
|
// Font* font = minecraft->font;
|
||||||
|
|
||||||
// 1) Draw semi-transparent background boxes behind each line
|
// 1) Draw semi-transparent background boxes behind each line
|
||||||
for (int i = 0; i < N; i++) {
|
for (int i = 0; i < N; i++) {
|
||||||
@@ -806,6 +882,7 @@ void Gui::renderDebugInfo() {
|
|||||||
font->draw(ln[i], MGN, y, col);
|
font->draw(ln[i], MGN, y, col);
|
||||||
}
|
}
|
||||||
t.endOverrideAndDraw();
|
t.endOverrideAndDraw();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gui::renderPlayerList(Font* font, int screenWidth, int screenHeight) {
|
void Gui::renderPlayerList(Font* font, int screenWidth, int screenHeight) {
|
||||||
@@ -1035,7 +1112,10 @@ void Gui::renderChatMessages( const int screenHeight, unsigned int max, bool isC
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Gui::renderToolBar( float a, int ySlot, const int screenWidth ) {
|
void Gui::renderToolBar( float a, int ySlot, const int screenWidth ) {
|
||||||
glColor4f2(1, 1, 1, .5);
|
glColor4f2(1, 1, 1, 1);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
minecraft->textures->loadAndBindTexture("gui/gui.png");
|
minecraft->textures->loadAndBindTexture("gui/gui.png");
|
||||||
|
|
||||||
Inventory* inventory = minecraft->player->inventory;
|
Inventory* inventory = minecraft->player->inventory;
|
||||||
|
|||||||
@@ -36,6 +36,48 @@ void OptionsItem::render( Minecraft* minecraft, int xm, int ym ) {
|
|||||||
}
|
}
|
||||||
text += ": " + scaleText;
|
text += ": " + scaleText;
|
||||||
}
|
}
|
||||||
|
if (m_optionId == OPTIONS_FOG_TYPE) {
|
||||||
|
int value = minecraft->options.getIntValue(OPTIONS_FOG_TYPE);
|
||||||
|
std::string scaleText;
|
||||||
|
switch (value) {
|
||||||
|
case 0: scaleText = I18n::get("options.fogType.vanilla"); break;
|
||||||
|
case 1: scaleText = I18n::get("options.fogType.java"); break;
|
||||||
|
case 2: scaleText = I18n::get("options.fogType.unused"); break;
|
||||||
|
}
|
||||||
|
text += ": " + scaleText;
|
||||||
|
}
|
||||||
|
if (m_optionId == OPTIONS_DEBUG_STYLE) {
|
||||||
|
int value = minecraft->options.getIntValue(OPTIONS_DEBUG_STYLE);
|
||||||
|
std::string scaleText;
|
||||||
|
switch (value) {
|
||||||
|
case 0: scaleText = I18n::get("options.debugStyle.javaBeta"); break;
|
||||||
|
case 1: scaleText = I18n::get("options.debugStyle.custom"); break;
|
||||||
|
case 2: scaleText = I18n::get("options.fogType.unused"); break;
|
||||||
|
}
|
||||||
|
text += ": " + scaleText;
|
||||||
|
}
|
||||||
|
if (m_optionId == OPTIONS_MENU_STYLE) {
|
||||||
|
int value = minecraft->options.getIntValue(OPTIONS_MENU_STYLE);
|
||||||
|
std::string scaleText;
|
||||||
|
switch (value) {
|
||||||
|
case 0: scaleText = I18n::get("options.menuStyle.pocket"); break;
|
||||||
|
case 1: scaleText = I18n::get("options.menuStyle.xperia"); break;
|
||||||
|
case 2: scaleText = I18n::get("options.menuStyle.java"); break;
|
||||||
|
}
|
||||||
|
text += ": " + scaleText;
|
||||||
|
}
|
||||||
|
if (m_optionId == OPTIONS_VIEW_DISTANCE) {
|
||||||
|
int value = minecraft->options.getIntValue(OPTIONS_VIEW_DISTANCE);
|
||||||
|
std::string scaleText;
|
||||||
|
switch (value) {
|
||||||
|
case 0: scaleText = I18n::get("options.renderDistance.far"); break;
|
||||||
|
case 1: scaleText = I18n::get("options.renderDistance.normal"); break;
|
||||||
|
case 2: scaleText = I18n::get("options.renderDistance.short"); break;
|
||||||
|
case 3: scaleText = I18n::get("options.renderDistance.tiny"); break;
|
||||||
|
default: scaleText = "Debug"; break;
|
||||||
|
}
|
||||||
|
text += ": " + scaleText;
|
||||||
|
}
|
||||||
|
|
||||||
minecraft->font->draw(text, (float)x, (float)y + yOffset, 0x909090, false);
|
minecraft->font->draw(text, (float)x, (float)y + yOffset, 0x909090, false);
|
||||||
super::render(minecraft, xm, ym);
|
super::render(minecraft, xm, ym);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "../../../network/ServerSideNetworkHandler.h"
|
#include "../../../network/ServerSideNetworkHandler.h"
|
||||||
#include "../../../network/packet/ChatPacket.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>
|
||||||
@@ -54,141 +55,37 @@ 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()) {
|
||||||
minecraft->setScreen(NULL);
|
return minecraft->setScreen(NULL);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_input[0] == '/') {
|
if (_input[0] == '/') {
|
||||||
// Command
|
// Command
|
||||||
std::string result = processCommand(_input);
|
_input = Util::stringTrim(_input.substr(1));
|
||||||
if (!result.empty())
|
|
||||||
minecraft->gui.addMessage(result);
|
std::istringstream iss(minecraft->commandManager().execute(*minecraft, *minecraft->player, _input));
|
||||||
|
for (std::string line; std::getline(iss, line); ) {
|
||||||
|
minecraft->gui.addMessage(line);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Chat message: <name> message
|
// @ai @rewrite
|
||||||
std::string msg = std::string("<") + minecraft->player->name + "> " + _input;
|
|
||||||
if (minecraft->netCallback && minecraft->raknetInstance->isServer()) {
|
if (minecraft->netCallback && minecraft->raknetInstance->isServer()) {
|
||||||
// Hosting a LAN game: displayGameMessage shows locally + broadcasts MessagePacket to clients
|
static_cast<ServerSideNetworkHandler*>(minecraft->netCallback)->displayGameMessage(_input);
|
||||||
static_cast<ServerSideNetworkHandler*>(minecraft->netCallback)->displayGameMessage(msg);
|
|
||||||
} else if (minecraft->netCallback) {
|
} else if (minecraft->netCallback) {
|
||||||
// Connected client: send ChatPacket to server; server echoes it back as MessagePacket
|
ChatPacket chatPkt(_input);
|
||||||
ChatPacket chatPkt(msg);
|
|
||||||
minecraft->raknetInstance->send(chatPkt);
|
minecraft->raknetInstance->send(chatPkt);
|
||||||
} else {
|
} else {
|
||||||
// Singleplayer: show locally only
|
minecraft->gui.addMessage("<" + minecraft->player->name + "> " + _input);
|
||||||
minecraft->gui.addMessage(msg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,7 +25,6 @@ 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
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ void CreditsScreen::init() {
|
|||||||
_lines.push_back("karson");
|
_lines.push_back("karson");
|
||||||
_lines.push_back("deepfriedwaffles");
|
_lines.push_back("deepfriedwaffles");
|
||||||
_lines.push_back("EpikIzCool");
|
_lines.push_back("EpikIzCool");
|
||||||
|
_lines.push_back("fileshredder");
|
||||||
_lines.push_back("");
|
_lines.push_back("");
|
||||||
// avoid color tags around the URL so it isn't mangled by the parser please
|
// avoid color tags around the URL so it isn't mangled by the parser please
|
||||||
_lines.push_back("Join our Discord server: https://discord.gg/c58YesBxve");
|
_lines.push_back("Join our Discord server: https://discord.gg/c58YesBxve");
|
||||||
|
|||||||
@@ -23,12 +23,15 @@ DeathScreen::~DeathScreen()
|
|||||||
|
|
||||||
void DeathScreen::init()
|
void DeathScreen::init()
|
||||||
{
|
{
|
||||||
if (/* minecraft->useTouchscreen() */ true) {
|
if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 0) {
|
||||||
bRespawn = new Touch::TButton(1, "Respawn!");
|
bRespawn = new Touch::TButton(1, "Respawn!");
|
||||||
bTitle = new Touch::TButton(2, "Main menu");
|
bTitle = new Touch::TButton(2, "Main menu");
|
||||||
} else {
|
} else if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 1) {
|
||||||
bRespawn = new Button(1, "Respawn!");
|
bRespawn = new Button(1, "Respawn!");
|
||||||
bTitle = new Button(2, "Main menu");
|
bTitle = new Button(2, "Main menu");
|
||||||
|
} else {
|
||||||
|
bRespawn = new Button(1, 0, 0, 200, 20, "Respawn");
|
||||||
|
bTitle = new Button(2, 0, 0, 200, 20, "Title menu");
|
||||||
}
|
}
|
||||||
buttons.push_back(bRespawn);
|
buttons.push_back(bRespawn);
|
||||||
buttons.push_back(bTitle);
|
buttons.push_back(bTitle);
|
||||||
@@ -39,13 +42,23 @@ void DeathScreen::init()
|
|||||||
|
|
||||||
void DeathScreen::setupPositions()
|
void DeathScreen::setupPositions()
|
||||||
{
|
{
|
||||||
bRespawn->width = bTitle->width = width / 4;
|
if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 2){
|
||||||
|
bRespawn->width = 200;
|
||||||
|
bTitle->width = 200;
|
||||||
|
|
||||||
|
int centerX = (width / 2) - (bRespawn->width / 2);
|
||||||
|
bRespawn->x = centerX;
|
||||||
|
bTitle->x = centerX;
|
||||||
|
|
||||||
|
bRespawn->y = (height / 2);
|
||||||
|
bTitle->y = bRespawn->y + 24;
|
||||||
|
} else {
|
||||||
|
bRespawn->width = bTitle->width = width / 4;
|
||||||
bRespawn->y = bTitle->y = height / 2;
|
bRespawn->y = bTitle->y = height / 2;
|
||||||
bRespawn->x = width/2 - bRespawn->width - 10;
|
bRespawn->x = width/2 - bRespawn->width - 10;
|
||||||
bTitle->x = width/2 + 10;
|
bTitle->x = width/2 + 10;
|
||||||
|
}
|
||||||
LOGI("xyz: %d, %d (%d, %d)\n", bTitle->x, bTitle->y, width, height);
|
// LOGI("xyz: %d, %d (%d, %d)\n", bTitle->x, bTitle->y, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeathScreen::tick() {
|
void DeathScreen::tick() {
|
||||||
@@ -56,10 +69,20 @@ void DeathScreen::render( int xm, int ym, float a )
|
|||||||
{
|
{
|
||||||
fillGradient(0, 0, width, height, 0x60500000, 0xa0803030);
|
fillGradient(0, 0, width, height, 0x60500000, 0xa0803030);
|
||||||
|
|
||||||
|
if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 2){
|
||||||
|
glPushMatrix2();
|
||||||
|
glScalef2(2, 2, 2);
|
||||||
|
drawCenteredString(font, "Game over!", width / 2 / 2, height / 8, 0xffffff);
|
||||||
|
glPopMatrix2();
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "Score: &e" << minecraft->player->getScore();
|
||||||
|
drawCenteredString(font, ss.str(), width / 2, (height / 4) + 32, 0xffffff);
|
||||||
|
} else {
|
||||||
glPushMatrix2();
|
glPushMatrix2();
|
||||||
glScalef2(2, 2, 2);
|
glScalef2(2, 2, 2);
|
||||||
drawCenteredString(font, "You died!", width / 2 / 2, height / 8, 0xffffff);
|
drawCenteredString(font, "You died!", width / 2 / 2, height / 8, 0xffffff);
|
||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
|
}
|
||||||
|
|
||||||
if (_tick >= WAIT_TICKS)
|
if (_tick >= WAIT_TICKS)
|
||||||
Screen::render(xm, ym, a);
|
Screen::render(xm, ym, a);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "IngameBlockSelectionScreen.h"
|
#include "IngameBlockSelectionScreen.h"
|
||||||
#include "../../renderer/TileRenderer.h"
|
#include "../../renderer/TileRenderer.h"
|
||||||
|
#include "../../renderer/Lighting.h"
|
||||||
#include "../../player/LocalPlayer.h"
|
#include "../../player/LocalPlayer.h"
|
||||||
#include "../../renderer/gles.h"
|
#include "../../renderer/gles.h"
|
||||||
#include "../../Minecraft.h"
|
#include "../../Minecraft.h"
|
||||||
@@ -11,6 +12,7 @@
|
|||||||
#include "../../renderer/Textures.h"
|
#include "../../renderer/Textures.h"
|
||||||
#include "../../gamemode/GameMode.h"
|
#include "../../gamemode/GameMode.h"
|
||||||
#include "ArmorScreen.h"
|
#include "ArmorScreen.h"
|
||||||
|
#include "crafting/WorkbenchScreen.h"
|
||||||
#include "../components/Button.h"
|
#include "../components/Button.h"
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
@@ -26,7 +28,8 @@ IngameBlockSelectionScreen::IngameBlockSelectionScreen()
|
|||||||
InventoryRows(1),
|
InventoryRows(1),
|
||||||
InventoryCols(1),
|
InventoryCols(1),
|
||||||
InventorySize(1),
|
InventorySize(1),
|
||||||
bArmor(1, "Armor")
|
bArmor(1, "Armor"),
|
||||||
|
bCrafting(1, "Crafting")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,6 +45,19 @@ void IngameBlockSelectionScreen::init()
|
|||||||
(float)getSlotPosX(InventoryCols) + 4,
|
(float)getSlotPosX(InventoryCols) + 4,
|
||||||
(float)getSlotPosY(InventoryRows) + 4);
|
(float)getSlotPosY(InventoryRows) + 4);
|
||||||
|
|
||||||
|
if (!minecraft->isCreativeMode()) {
|
||||||
|
bArmor.width = 42;
|
||||||
|
bCrafting.width = 42;
|
||||||
|
|
||||||
|
bArmor.x = 0;
|
||||||
|
bArmor.y = height - bArmor.height;
|
||||||
|
|
||||||
|
bCrafting.x = 0;
|
||||||
|
bCrafting.y = height - bCrafting.height - 30;
|
||||||
|
buttons.push_back(&bArmor);
|
||||||
|
buttons.push_back(&bCrafting);
|
||||||
|
}
|
||||||
|
|
||||||
ItemInstance* selected = inventory->getSelected();
|
ItemInstance* selected = inventory->getSelected();
|
||||||
if (!selected || selected->isNull()) {
|
if (!selected || selected->isNull()) {
|
||||||
selectedItem = 0;
|
selectedItem = 0;
|
||||||
@@ -57,13 +73,6 @@ void IngameBlockSelectionScreen::init()
|
|||||||
}
|
}
|
||||||
if (!isAllowed(selectedItem))
|
if (!isAllowed(selectedItem))
|
||||||
selectedItem = 0;
|
selectedItem = 0;
|
||||||
|
|
||||||
if (!minecraft->isCreativeMode()) {
|
|
||||||
bArmor.width = 42;
|
|
||||||
bArmor.x = 0;
|
|
||||||
bArmor.y = height - bArmor.height;
|
|
||||||
buttons.push_back(&bArmor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IngameBlockSelectionScreen::removed()
|
void IngameBlockSelectionScreen::removed()
|
||||||
@@ -80,10 +89,10 @@ void IngameBlockSelectionScreen::renderSlots()
|
|||||||
|
|
||||||
blitOffset = -90;
|
blitOffset = -90;
|
||||||
|
|
||||||
//glEnable2(GL_RESCALE_NORMAL);
|
glEnable2(GL_RESCALE_NORMAL);
|
||||||
//glPushMatrix2();
|
//glPushMatrix2();
|
||||||
//glRotatef2(180, 1, 0, 0);
|
//glRotatef2(180, 1, 0, 0);
|
||||||
//Lighting::turnOn();
|
Lighting::turnOn(minecraft);
|
||||||
//glPopMatrix2();
|
//glPopMatrix2();
|
||||||
|
|
||||||
minecraft->textures->loadAndBindTexture("gui/gui.png");
|
minecraft->textures->loadAndBindTexture("gui/gui.png");
|
||||||
@@ -122,8 +131,8 @@ void IngameBlockSelectionScreen::renderSlots()
|
|||||||
//w.stop();
|
//w.stop();
|
||||||
//w.printEvery(1000, "render-blocksel");
|
//w.printEvery(1000, "render-blocksel");
|
||||||
|
|
||||||
//glDisable2(GL_RESCALE_NORMAL);
|
glDisable2(GL_RESCALE_NORMAL);
|
||||||
//Lighting::turnOn();
|
Lighting::turnOff();
|
||||||
}
|
}
|
||||||
|
|
||||||
int IngameBlockSelectionScreen::getSlotPosX(int slotX) {
|
int IngameBlockSelectionScreen::getSlotPosX(int slotX) {
|
||||||
@@ -248,7 +257,7 @@ void IngameBlockSelectionScreen::mouseClicked(int x, int y, int buttonNum)
|
|||||||
//minecraft->soundEngine->playUI("random.click", 1, 1);
|
//minecraft->soundEngine->playUI("random.click", 1, 1);
|
||||||
} else {
|
} else {
|
||||||
_pendingQuit = !_area.isInside((float)x, (float)y)
|
_pendingQuit = !_area.isInside((float)x, (float)y)
|
||||||
&& !bArmor.isInside(x, y);
|
&& !bArmor.isInside(x, y) && !bCrafting.isInside(x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!_pendingQuit)
|
if (!_pendingQuit)
|
||||||
@@ -337,5 +346,8 @@ void IngameBlockSelectionScreen::buttonClicked( Button* button )
|
|||||||
if (button == &bArmor) {
|
if (button == &bArmor) {
|
||||||
minecraft->setScreen(new ArmorScreen());
|
minecraft->setScreen(new ArmorScreen());
|
||||||
}
|
}
|
||||||
|
if (button == &bCrafting) {
|
||||||
|
minecraft->setScreen(new WorkbenchScreen(Recipe::SIZE_2X2));
|
||||||
|
}
|
||||||
super::buttonClicked(button);
|
super::buttonClicked(button);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ private:
|
|||||||
bool _pendingQuit;
|
bool _pendingQuit;
|
||||||
|
|
||||||
Button bArmor;
|
Button bArmor;
|
||||||
|
Button bCrafting;
|
||||||
|
|
||||||
RectangleArea _area;
|
RectangleArea _area;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -197,6 +197,7 @@ void OptionsScreen::generateOptionScreens() {
|
|||||||
optionPanes[1]->addOptionItem(OPTIONS_DIFFICULTY, minecraft)
|
optionPanes[1]->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_GUI_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)
|
||||||
@@ -208,7 +209,9 @@ void OptionsScreen::generateOptionScreens() {
|
|||||||
// // Controls Pane
|
// // Controls Pane
|
||||||
optionPanes[2]->addOptionItem(OPTIONS_INVERT_Y_MOUSE, minecraft)
|
optionPanes[2]->addOptionItem(OPTIONS_INVERT_Y_MOUSE, minecraft)
|
||||||
.addOptionItem(OPTIONS_USE_TOUCHSCREEN, minecraft)
|
.addOptionItem(OPTIONS_USE_TOUCHSCREEN, minecraft)
|
||||||
.addOptionItem(OPTIONS_AUTOJUMP, minecraft);
|
.addOptionItem(OPTIONS_AUTOJUMP, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_BLOCK_OUTLINE, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_IS_JOY_TOUCH_AREA, minecraft);
|
||||||
|
|
||||||
for (int i = OPTIONS_KEY_FORWARD; i <= OPTIONS_KEY_USE; i++) {
|
for (int i = OPTIONS_KEY_FORWARD; i <= OPTIONS_KEY_USE; i++) {
|
||||||
optionPanes[2]->addOptionItem((OptionId)i, minecraft);
|
optionPanes[2]->addOptionItem((OptionId)i, minecraft);
|
||||||
@@ -221,17 +224,26 @@ void OptionsScreen::generateOptionScreens() {
|
|||||||
// .addOptionItem(&Option::ANAGLYPH, minecraft)
|
// .addOptionItem(&Option::ANAGLYPH, minecraft)
|
||||||
.addOptionItem(OPTIONS_LIMIT_FRAMERATE, minecraft)
|
.addOptionItem(OPTIONS_LIMIT_FRAMERATE, minecraft)
|
||||||
.addOptionItem(OPTIONS_VSYNC, minecraft)
|
.addOptionItem(OPTIONS_VSYNC, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_VIEW_DISTANCE, minecraft)
|
||||||
.addOptionItem(OPTIONS_RENDER_DEBUG, minecraft)
|
.addOptionItem(OPTIONS_RENDER_DEBUG, minecraft)
|
||||||
.addOptionItem(OPTIONS_ANAGLYPH_3D, minecraft)
|
.addOptionItem(OPTIONS_ANAGLYPH_3D, minecraft)
|
||||||
.addOptionItem(OPTIONS_VIEW_BOBBING, minecraft)
|
.addOptionItem(OPTIONS_VIEW_BOBBING, minecraft)
|
||||||
.addOptionItem(OPTIONS_AMBIENT_OCCLUSION, minecraft);
|
.addOptionItem(OPTIONS_AMBIENT_OCCLUSION, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_NORMAL_LIGHTING, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_BEAUTIFUL_SKY, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_VIGNETTE, minecraft);
|
||||||
|
|
||||||
optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft)
|
optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft)
|
||||||
.addOptionItem(OPTIONS_BAR_ON_TOP, minecraft)
|
.addOptionItem(OPTIONS_BAR_ON_TOP, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_MENU_STYLE, minecraft)
|
||||||
.addOptionItem(OPTIONS_RPI_CURSOR, minecraft)
|
.addOptionItem(OPTIONS_RPI_CURSOR, minecraft)
|
||||||
.addOptionItem(OPTIONS_FOLIAGE_TINT, minecraft)
|
.addOptionItem(OPTIONS_FOLIAGE_TINT, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_TINTED_SIDE, minecraft)
|
||||||
.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_RESTORED_ANIMS, minecraft)
|
||||||
|
.addOptionItem(OPTIONS_DEBUG_STYLE, minecraft);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,14 +10,14 @@
|
|||||||
#include "client/gui/screens/OptionsScreen.h"
|
#include "client/gui/screens/OptionsScreen.h"
|
||||||
|
|
||||||
PauseScreen::PauseScreen(bool wasBackPaused)
|
PauseScreen::PauseScreen(bool wasBackPaused)
|
||||||
: saveStep(0),
|
: saveStep(0),
|
||||||
visibleTime(0),
|
visibleTime(0),
|
||||||
bContinue(0),
|
bContinue(0),
|
||||||
bQuit(0),
|
bQuit(0),
|
||||||
bOptions(0),
|
bOptions(0),
|
||||||
bQuitAndSaveLocally(0),
|
bQuitAndSaveLocally(0),
|
||||||
bServerVisibility(0),
|
bServerVisibility(0),
|
||||||
// bThirdPerson(0),
|
// bThirdPerson(0),
|
||||||
wasBackPaused(wasBackPaused),
|
wasBackPaused(wasBackPaused),
|
||||||
// bSound(OPTIONS_SOUND_VOLUME, 1, 0),
|
// bSound(OPTIONS_SOUND_VOLUME, 1, 0),
|
||||||
bThirdPerson(OPTIONS_THIRD_PERSON_VIEW),
|
bThirdPerson(OPTIONS_THIRD_PERSON_VIEW),
|
||||||
@@ -44,24 +44,31 @@ PauseScreen::~PauseScreen() {
|
|||||||
delete bQuitAndSaveLocally;
|
delete bQuitAndSaveLocally;
|
||||||
delete bServerVisibility;
|
delete bServerVisibility;
|
||||||
delete bOptions;
|
delete bOptions;
|
||||||
// delete bThirdPerson;
|
// delete bThirdPerson;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PauseScreen::init() {
|
void PauseScreen::init() {
|
||||||
if (/* minecraft->useTouchscreen() */ true) {
|
if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 0) {
|
||||||
bContinue = new Touch::TButton(1, "Back to game");
|
bContinue = new Touch::TButton(1, "Back to game");
|
||||||
bOptions = new Touch::TButton(5, "Options");
|
bOptions = new Touch::TButton(5, "Options");
|
||||||
bQuit = new Touch::TButton(2, "Quit to title");
|
bQuit = new Touch::TButton(2, "Quit to title");
|
||||||
bQuitAndSaveLocally = new Touch::TButton(3, "Quit and copy map");
|
bQuitAndSaveLocally = new Touch::TButton(3, "Quit and copy map");
|
||||||
bServerVisibility = new Touch::TButton(4, "");
|
bServerVisibility = new Touch::TButton(4, "");
|
||||||
// bThirdPerson = new Touch::TButton(5, "Toggle 3:rd person view");
|
// bThirdPerson = new Touch::TButton(5, "Toggle 3:rd person view");
|
||||||
} else {
|
} else if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 1) {
|
||||||
bContinue = new Button(1, "Back to game");
|
bContinue = new Button(1, "Back to game");
|
||||||
bOptions = new Button(5, "Options");
|
bOptions = new Button(5, "Options");
|
||||||
bQuit = new Button(2, "Quit to title");
|
bQuit = new Button(2, "Quit to title");
|
||||||
bQuitAndSaveLocally = new Button(3, "Quit and copy map");
|
bQuitAndSaveLocally = new Button(3, "Quit and copy map");
|
||||||
bServerVisibility = new Button(4, "");
|
bServerVisibility = new Button(4, "");
|
||||||
// bThirdPerson = new Button(5, "Toggle 3:rd person view");
|
// bThirdPerson = new Button(5, "Toggle 3:rd person view");
|
||||||
|
} else {
|
||||||
|
bContinue = new Button(1, 0, 0, 200, 20, "Back to game");
|
||||||
|
bServerVisibility = new Button(4, 0, 0, 200, 20, "");
|
||||||
|
bOptions = new Button(5, 0, 0, 200, 20, "Options...");
|
||||||
|
bQuit = new Button(2, 0, 0, 200, 20, "Save and quit to title");
|
||||||
|
bQuitAndSaveLocally = new Button(3, 0, 0, 200, 20, "Copy and quit map");
|
||||||
|
// bThirdPerson = new Button(5, "Toggle 3:rd person view");
|
||||||
}
|
}
|
||||||
|
|
||||||
buttons.push_back(bContinue);
|
buttons.push_back(bContinue);
|
||||||
@@ -77,7 +84,7 @@ void PauseScreen::init() {
|
|||||||
// If Back wasn't pressed, set up additional items (more than Quit to menu
|
// If Back wasn't pressed, set up additional items (more than Quit to menu
|
||||||
// and Back to game) here
|
// and Back to game) here
|
||||||
|
|
||||||
#if !defined(APPLE_DEMO_PROMOTION) && !defined(RPI)
|
#if !defined(APPLE_DEMO_PROMOTION) && !defined(RPI)
|
||||||
if (true || !wasBackPaused) {
|
if (true || !wasBackPaused) {
|
||||||
if (minecraft->raknetInstance) {
|
if (minecraft->raknetInstance) {
|
||||||
if (minecraft->raknetInstance->isServer()) {
|
if (minecraft->raknetInstance->isServer()) {
|
||||||
@@ -85,14 +92,14 @@ void PauseScreen::init() {
|
|||||||
buttons.push_back(bServerVisibility);
|
buttons.push_back(bServerVisibility);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#if !defined(DEMO_MODE)
|
#if !defined(DEMO_MODE)
|
||||||
buttons.push_back(bQuitAndSaveLocally);
|
buttons.push_back(bQuitAndSaveLocally);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// buttons.push_back(bThirdPerson);
|
// buttons.push_back(bThirdPerson);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < buttons.size(); ++i) {
|
for (unsigned int i = 0; i < buttons.size(); ++i) {
|
||||||
// if (buttons[i] == &bSound) continue;
|
// if (buttons[i] == &bSound) continue;
|
||||||
@@ -105,7 +112,25 @@ void PauseScreen::init() {
|
|||||||
void PauseScreen::setupPositions() {
|
void PauseScreen::setupPositions() {
|
||||||
saveStep = 0;
|
saveStep = 0;
|
||||||
int yBase = 16;
|
int yBase = 16;
|
||||||
|
if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 2){
|
||||||
|
yBase = 50;
|
||||||
|
|
||||||
|
bContinue->width = bOptions->width = bQuit->width = /*bThirdPerson->w =*/ 200;
|
||||||
|
bQuitAndSaveLocally->width = bServerVisibility->width = 200;
|
||||||
|
|
||||||
|
bContinue->x = (width - bContinue->width) / 2;
|
||||||
|
bContinue->y = yBase + 24 * 1;
|
||||||
|
|
||||||
|
bQuitAndSaveLocally->x = bServerVisibility->x = (width - bQuitAndSaveLocally->width) / 2;
|
||||||
|
bQuitAndSaveLocally->y = bServerVisibility->y = yBase + 24 * 2;
|
||||||
|
|
||||||
|
bOptions->x = (width - bOptions->width) / 2;
|
||||||
|
bOptions->y = yBase + 24 * 3 + 24;
|
||||||
|
|
||||||
|
bQuit->x = (width - bQuit->width) / 2;
|
||||||
|
bQuit->y = yBase + 24 * 4 + 24;
|
||||||
|
|
||||||
|
} else {
|
||||||
bContinue->width = bOptions->width = bQuit->width = /*bThirdPerson->w =*/ 160;
|
bContinue->width = bOptions->width = bQuit->width = /*bThirdPerson->w =*/ 160;
|
||||||
bQuitAndSaveLocally->width = bServerVisibility->width = 160;
|
bQuitAndSaveLocally->width = bServerVisibility->width = 160;
|
||||||
|
|
||||||
@@ -124,6 +149,9 @@ void PauseScreen::setupPositions() {
|
|||||||
|
|
||||||
bQuitAndSaveLocally->x = bServerVisibility->x = (width - bQuitAndSaveLocally->width) / 2;
|
bQuitAndSaveLocally->x = bServerVisibility->x = (width - bQuitAndSaveLocally->width) / 2;
|
||||||
bQuitAndSaveLocally->y = bServerVisibility->y = yBase + 32 * 4;
|
bQuitAndSaveLocally->y = bServerVisibility->y = yBase + 32 * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// bSound.y = bThirdPerson.y = 8;
|
// bSound.y = bThirdPerson.y = 8;
|
||||||
// bSound.x = 4;
|
// bSound.x = 4;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ Screen* ScreenChooser::createScreen( ScreenId id )
|
|||||||
Screen* screen = NULL;
|
Screen* screen = NULL;
|
||||||
|
|
||||||
// :sob:
|
// :sob:
|
||||||
if (/* _mc->useTouchscreen() */ true) {
|
if (_mc->options.getIntValue(OPTIONS_MENU_STYLE) == 0) {
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case SCREEN_STARTMENU: screen = new Touch::StartMenuScreen(); break;
|
case SCREEN_STARTMENU: screen = new Touch::StartMenuScreen(); break;
|
||||||
case SCREEN_SELECTWORLD: screen = new Touch::SelectWorldScreen();break;
|
case SCREEN_SELECTWORLD: screen = new Touch::SelectWorldScreen();break;
|
||||||
|
|||||||
@@ -23,49 +23,62 @@
|
|||||||
|
|
||||||
// Some kind of default settings, might be overridden in ::init
|
// Some kind of default settings, might be overridden in ::init
|
||||||
StartMenuScreen::StartMenuScreen()
|
StartMenuScreen::StartMenuScreen()
|
||||||
: bHost( 2, 0, 0, 160, 24, "Start Game"),
|
|
||||||
bJoin( 3, 0, 0, 160, 24, "Join Game"),
|
|
||||||
bOptions( 4, 0, 0, 160, 24, "Options"),
|
|
||||||
bQuit( 5, "")
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
StartMenuScreen::~StartMenuScreen()
|
StartMenuScreen::~StartMenuScreen()
|
||||||
{
|
{
|
||||||
|
delete bHost;
|
||||||
|
delete bJoin;
|
||||||
|
delete bOptions;
|
||||||
|
delete bQuit;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartMenuScreen::init()
|
void StartMenuScreen::init()
|
||||||
{
|
{
|
||||||
bJoin.active = bHost.active = bOptions.active = true;
|
if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 2){
|
||||||
|
bHost = new Button( 2, 0, 0, 200, 20, "Singleplayer");
|
||||||
|
bJoin = new Button( 3, 0, 0, 200, 20, "Multiplayer");
|
||||||
|
bOptions = new Button( 4, 0, 0, 200, 20, "Options...");
|
||||||
|
bQuit = new Button( 5, 0, 0, 200, 20, "Ouit Game");
|
||||||
|
} else {
|
||||||
|
bHost = new Button( 2, 0, 0, 160, 24, "Start Game");
|
||||||
|
bJoin = new Button( 3, 0, 0, 160, 24, "Join Game");
|
||||||
|
bOptions = new Button( 4, 0, 0, 160, 24, "Options");
|
||||||
|
bQuit = new Button( 5, 0, 0, 160, 24, "Ouit Game");
|
||||||
|
}
|
||||||
|
bJoin->active = bHost->active = bOptions->active = true;
|
||||||
|
|
||||||
if (minecraft->options.getStringValue(OPTIONS_USERNAME).empty()) {
|
if (minecraft->options.getStringValue(OPTIONS_USERNAME).empty()) {
|
||||||
return; // tick() will redirect to UsernameScreen
|
return; // tick() will redirect to UsernameScreen
|
||||||
}
|
}
|
||||||
|
|
||||||
buttons.push_back(&bHost);
|
buttons.push_back(bHost);
|
||||||
buttons.push_back(&bJoin);
|
buttons.push_back(bJoin);
|
||||||
//buttons.push_back(&bTest);
|
//buttons.push_back(&bTest);
|
||||||
|
buttons.push_back(bQuit);
|
||||||
|
|
||||||
tabButtons.push_back(&bHost);
|
tabButtons.push_back(bHost);
|
||||||
tabButtons.push_back(&bJoin);
|
tabButtons.push_back(bJoin);
|
||||||
|
tabButtons.push_back(bQuit);
|
||||||
|
|
||||||
#ifndef RPI
|
#ifndef RPI
|
||||||
buttons.push_back(&bOptions);
|
buttons.push_back(bOptions);
|
||||||
tabButtons.push_back(&bOptions);
|
tabButtons.push_back(bOptions);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// add quit button (top right X icon) – match OptionsScreen style
|
//// add quit button (top right X icon) – match OptionsScreen style
|
||||||
{
|
//{
|
||||||
ImageDef def;
|
// ImageDef def;
|
||||||
def.name = "gui/touchgui.png";
|
// def.name = "gui/touchgui.png";
|
||||||
def.width = 34;
|
// def.width = 34;
|
||||||
def.height = 26;
|
// def.height = 26;
|
||||||
def.setSrc(IntRectangle(150, 0, (int)def.width, (int)def.height));
|
// def.setSrc(IntRectangle(150, 0, (int)def.width, (int)def.height));
|
||||||
bQuit.setImageDef(def, true);
|
// bQuit.setImageDef(def, true);
|
||||||
bQuit.scaleWhenPressed = false;
|
// bQuit.scaleWhenPressed = false;
|
||||||
buttons.push_back(&bQuit);
|
// buttons.push_back(&bQuit);
|
||||||
// don't include in tab navigation
|
// // don't include in tab navigation
|
||||||
}
|
//}
|
||||||
|
|
||||||
copyright = "\xffMojang AB";//. Do not distribute!";
|
copyright = "\xffMojang AB";//. Do not distribute!";
|
||||||
|
|
||||||
@@ -93,20 +106,30 @@ void StartMenuScreen::init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void StartMenuScreen::setupPositions() {
|
void StartMenuScreen::setupPositions() {
|
||||||
int yBase = height / 2;
|
if (minecraft->options.getIntValue(OPTIONS_MENU_STYLE) == 2){
|
||||||
|
int yBase = (height / 2) - 20;
|
||||||
|
|
||||||
bHost.y = yBase;
|
bHost->y = yBase;
|
||||||
bJoin.y = bHost.y + 24 + 4;
|
bJoin->y = bHost->y + 24;
|
||||||
bOptions.y = bJoin.y + 24 + 4;
|
bOptions->y = bJoin->y + 24;
|
||||||
|
bQuit->y = bOptions->y + 24;
|
||||||
|
} else {
|
||||||
|
int yBase = height / 2;
|
||||||
|
bHost->y = yBase;
|
||||||
|
bJoin->y = bHost->y + 24 + 4;
|
||||||
|
bOptions->y = bJoin->y + 24 + 4;
|
||||||
|
bQuit->y = bOptions->y + 24 + 4;
|
||||||
|
}
|
||||||
|
|
||||||
// Center buttons
|
// Center buttons
|
||||||
bHost.x = (width - bHost.width) / 2;
|
bHost->x = (width - bHost->width) / 2;
|
||||||
bJoin.x = (width - bJoin.width) / 2;
|
bJoin->x = (width - bJoin->width) / 2;
|
||||||
bOptions.x = (width - bOptions.width) / 2;
|
bOptions->x = (width - bOptions->width) / 2;
|
||||||
|
bQuit->x = (width - bQuit->width) / 2;
|
||||||
|
|
||||||
// position quit icon at top-right (use image-defined size)
|
//// position quit icon at top-right (use image-defined size)
|
||||||
bQuit.x = width - bQuit.width;
|
//bQuit.x = width - bQuit.width;
|
||||||
bQuit.y = 0;
|
//bQuit.y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartMenuScreen::tick() {
|
void StartMenuScreen::tick() {
|
||||||
@@ -114,7 +137,7 @@ void StartMenuScreen::tick() {
|
|||||||
|
|
||||||
void StartMenuScreen::buttonClicked(Button* button) {
|
void StartMenuScreen::buttonClicked(Button* button) {
|
||||||
|
|
||||||
if (button->id == bHost.id)
|
if (button->id == bHost->id)
|
||||||
{
|
{
|
||||||
#if defined(DEMO_MODE) || defined(APPLE_DEMO_PROMOTION)
|
#if defined(DEMO_MODE) || defined(APPLE_DEMO_PROMOTION)
|
||||||
minecraft->setScreen( new SimpleChooseLevelScreen("_DemoLevel") );
|
minecraft->setScreen( new SimpleChooseLevelScreen("_DemoLevel") );
|
||||||
@@ -122,16 +145,16 @@ void StartMenuScreen::buttonClicked(Button* button) {
|
|||||||
minecraft->screenChooser.setScreen(SCREEN_SELECTWORLD);
|
minecraft->screenChooser.setScreen(SCREEN_SELECTWORLD);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (button->id == bJoin.id)
|
if (button->id == bJoin->id)
|
||||||
{
|
{
|
||||||
minecraft->locateMultiplayer();
|
minecraft->locateMultiplayer();
|
||||||
minecraft->screenChooser.setScreen(SCREEN_JOINGAME);
|
minecraft->screenChooser.setScreen(SCREEN_JOINGAME);
|
||||||
}
|
}
|
||||||
if (button->id == bOptions.id)
|
if (button->id == bOptions->id)
|
||||||
{
|
{
|
||||||
minecraft->setScreen(new OptionsScreen());
|
minecraft->setScreen(new OptionsScreen());
|
||||||
}
|
}
|
||||||
if (button == &bQuit)
|
if (button->id == bQuit->id)
|
||||||
{
|
{
|
||||||
minecraft->quit();
|
minecraft->quit();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,10 +23,10 @@ public:
|
|||||||
bool isInGameScreen();
|
bool isInGameScreen();
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Button bHost;
|
Button* bHost;
|
||||||
Button bJoin;
|
Button* bJoin;
|
||||||
Button bOptions;
|
Button* bOptions;
|
||||||
ImageButton bQuit; // X button in top-right corner
|
Button* bQuit;
|
||||||
|
|
||||||
std::string copyright;
|
std::string copyright;
|
||||||
int copyrightPosX;
|
int copyrightPosX;
|
||||||
|
|||||||
@@ -16,7 +16,12 @@
|
|||||||
#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;
|
||||||
|
|
||||||
@@ -193,6 +198,26 @@ 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -439,6 +464,10 @@ 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];
|
||||||
|
|||||||
@@ -40,10 +40,9 @@ 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);
|
||||||
@@ -99,17 +98,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);
|
||||||
@@ -123,12 +122,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;
|
||||||
@@ -273,7 +272,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) {
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ void ModelPart::compile( float scale )
|
|||||||
void ModelPart::draw()
|
void ModelPart::draw()
|
||||||
{
|
{
|
||||||
#ifdef OPENGL_ES
|
#ifdef OPENGL_ES
|
||||||
drawArrayVT_NoState(vboId, cubes.size() * 2 * 3 * 6, 24);
|
drawArrayVTN_NoState(vboId, cubes.size() * 2 * 3 * 6, 36);
|
||||||
#else
|
#else
|
||||||
glCallList(list);
|
glCallList(list);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -43,6 +43,18 @@ void PolygonQuad::mirror() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PolygonQuad::render(Tesselator& t, float scale, int vboId /* = -1 */) {
|
void PolygonQuad::render(Tesselator& t, float scale, int vboId /* = -1 */) {
|
||||||
|
Vec3 v0 = vertices[0].pos - vertices[1].pos;
|
||||||
|
Vec3 v1 = vertices[2].pos - vertices[1].pos;
|
||||||
|
Vec3 n = v1.cross(v0).normalized();
|
||||||
|
if (_flipNormal == true)
|
||||||
|
{
|
||||||
|
t.normal(-n.x , -n.y , -n.z );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t.normal(n.x , n.y , n.z );
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
VertexPT& v = vertices[i];
|
VertexPT& v = vertices[i];
|
||||||
t.vertexUV(v.pos.x * scale, v.pos.y * scale, v.pos.z * scale, v.u, v.v);
|
t.vertexUV(v.pos.x * scale, v.pos.y * scale, v.pos.z * scale, v.u, v.v);
|
||||||
|
|||||||
@@ -355,7 +355,11 @@ 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();
|
||||||
@@ -456,7 +460,7 @@ void LocalPlayer::tick() {
|
|||||||
{
|
{
|
||||||
sentInventoryItemId = newItemId;
|
sentInventoryItemId = newItemId;
|
||||||
sentInventoryItemData = newItemData;
|
sentInventoryItemData = newItemData;
|
||||||
PlayerEquipmentPacket packet(entityId, newItemId, newItemData);
|
PlayerEquipmentPacket packet(entityId, newItemId, newItemData, inventory->selected, inventory->getSlot(newItemId, newItemData));
|
||||||
minecraft->raknetInstance->send(packet);
|
minecraft->raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -550,6 +554,10 @@ 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();
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ 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();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include "GameRenderer.h"
|
#include "GameRenderer.h"
|
||||||
#include "client/Options.h"
|
#include "client/Options.h"
|
||||||
#include "gles.h"
|
#include "gles.h"
|
||||||
|
#include "Lighting.h"
|
||||||
#include "../../util/PerfTimer.h"
|
#include "../../util/PerfTimer.h"
|
||||||
|
|
||||||
#include "LevelRenderer.h"
|
#include "LevelRenderer.h"
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
static int _shTicks = -1;
|
static int _shTicks = -1;
|
||||||
|
|
||||||
GameRenderer::GameRenderer( Minecraft* mc )
|
GameRenderer::GameRenderer( Minecraft* mc )
|
||||||
: mc(mc),
|
: mc(mc),
|
||||||
renderDistance(0),
|
renderDistance(0),
|
||||||
_tick(0),
|
_tick(0),
|
||||||
_lastTickT(0),
|
_lastTickT(0),
|
||||||
@@ -101,6 +101,15 @@ void GameRenderer::setupCamera(float a, int eye) {
|
|||||||
|
|
||||||
float stereoScale = 0.07f;
|
float stereoScale = 0.07f;
|
||||||
if (mc->options.getBooleanValue(OPTIONS_ANAGLYPH_3D)) glTranslatef2(-(eye * 2 - 1) * stereoScale, 0, 0);
|
if (mc->options.getBooleanValue(OPTIONS_ANAGLYPH_3D)) glTranslatef2(-(eye * 2 - 1) * stereoScale, 0, 0);
|
||||||
|
if (mc->options.getBooleanValue(OPTIONS_BETA_SKY)){
|
||||||
|
if (zoom != 1) {
|
||||||
|
glTranslatef2((float) zoom_x, (float) -zoom_y, 0);
|
||||||
|
glScalef2(zoom, zoom, 1);
|
||||||
|
gluPerspective(_setupCameraFov = getFov(a, true), mc->width / (float) mc->height, 0.05f, renderDistance * 2.0f);
|
||||||
|
} else {
|
||||||
|
gluPerspective(_setupCameraFov = getFov(a, true), mc->width / (float) mc->height, 0.05f, renderDistance * 2.0f);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (zoom != 1) {
|
if (zoom != 1) {
|
||||||
glTranslatef2((float) zoom_x, (float) -zoom_y, 0);
|
glTranslatef2((float) zoom_x, (float) -zoom_y, 0);
|
||||||
glScalef2(zoom, zoom, 1);
|
glScalef2(zoom, zoom, 1);
|
||||||
@@ -108,6 +117,7 @@ void GameRenderer::setupCamera(float a, int eye) {
|
|||||||
} else {
|
} else {
|
||||||
gluPerspective(_setupCameraFov = getFov(a, true), mc->width / (float) mc->height, 0.05f, renderDistance);
|
gluPerspective(_setupCameraFov = getFov(a, true), mc->width / (float) mc->height, 0.05f, renderDistance);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity2();
|
glLoadIdentity2();
|
||||||
@@ -272,17 +282,7 @@ void GameRenderer::renderLevel(float a) {
|
|||||||
screenScissorArea.w, screenScissorArea.h);
|
screenScissorArea.w, screenScissorArea.h);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)) {
|
|
||||||
setupFog(-1);
|
|
||||||
TIMER_POP_PUSH("sky");
|
|
||||||
glFogf(GL_FOG_START, renderDistance * 0.2f);
|
|
||||||
glFogf(GL_FOG_END, renderDistance *0.75);
|
|
||||||
levelRenderer->renderSky(a);
|
|
||||||
glFogf(GL_FOG_START, renderDistance * 0.6f);
|
|
||||||
glFogf(GL_FOG_END, renderDistance);
|
|
||||||
}
|
|
||||||
glEnable2(GL_FOG);
|
|
||||||
setupFog(1);
|
|
||||||
|
|
||||||
if (mc->options.getBooleanValue(OPTIONS_AMBIENT_OCCLUSION)) {
|
if (mc->options.getBooleanValue(OPTIONS_AMBIENT_OCCLUSION)) {
|
||||||
glShadeModel2(GL_SMOOTH);
|
glShadeModel2(GL_SMOOTH);
|
||||||
@@ -295,16 +295,39 @@ void GameRenderer::renderLevel(float a) {
|
|||||||
TIMER_POP_PUSH("culling");
|
TIMER_POP_PUSH("culling");
|
||||||
mc->levelRenderer->cull(&frustum, a);
|
mc->levelRenderer->cull(&frustum, a);
|
||||||
mc->levelRenderer->updateDirtyChunks(cameraEntity, false);
|
mc->levelRenderer->updateDirtyChunks(cameraEntity, false);
|
||||||
|
// this sky rendering code below was originally before the frustrum and culling stuff but sunset color breaks for some reason in that place, so i moved i after those two - shredder
|
||||||
|
// if(mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)) {
|
||||||
|
setupFog(-1);
|
||||||
|
TIMER_POP_PUSH("sky");
|
||||||
|
// @TODO - EXTREME JANK BELOW, it works but i have to do heavy cleanup here, also to test if the glfogf commands even affect fog in anyway.
|
||||||
|
if(mc->options.getBooleanValue(OPTIONS_BETA_SKY) && (mc->options.getIntValue(OPTIONS_VIEW_DISTANCE) < 2)){
|
||||||
|
levelRenderer->renderSky(a); // how java renders the sky instead of how pe doing prepareandrenderclouds.
|
||||||
|
} else if (!mc->options.getBooleanValue(OPTIONS_BETA_SKY)){
|
||||||
|
glFogf(GL_FOG_START, renderDistance * 0.2f);
|
||||||
|
glFogf(GL_FOG_END, renderDistance *0.75);
|
||||||
|
|
||||||
|
glFogf(GL_FOG_START, renderDistance * 0.6f);
|
||||||
|
glFogf(GL_FOG_END, renderDistance);
|
||||||
|
}
|
||||||
|
// }
|
||||||
|
glEnable2(GL_FOG);
|
||||||
|
setupFog(1);
|
||||||
|
// MCPE renders clouds using this, but this method breaks 3d clouds and also breaks 2d clouds transparency viewed from above, add as a Legacy Sky or Fast Sky option. - shredder
|
||||||
|
if(!mc->options.getBooleanValue(OPTIONS_BETA_SKY)){
|
||||||
if(mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)) {
|
if(mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)) {
|
||||||
prepareAndRenderClouds(levelRenderer, a);
|
prepareAndRenderClouds(levelRenderer, a);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setupFog(0);
|
setupFog(0);
|
||||||
glEnable2(GL_FOG);
|
glEnable2(GL_FOG);
|
||||||
|
|
||||||
mc->textures->loadAndBindTexture("terrain.png");
|
mc->textures->loadAndBindTexture("terrain.png");
|
||||||
glDisable2(GL_ALPHA_TEST);
|
Lighting::turnOff();
|
||||||
|
|
||||||
|
// glDisable2(GL_ALPHA_TEST); // vanilla pe disables alpha test here, i renable it so grass side textures dont become opaque - shredder
|
||||||
|
glEnable2(GL_ALPHA_TEST); //
|
||||||
|
|
||||||
glDisable2(GL_BLEND);
|
glDisable2(GL_BLEND);
|
||||||
glEnable2(GL_CULL_FACE);
|
glEnable2(GL_CULL_FACE);
|
||||||
TIMER_POP_PUSH("terrain-0");
|
TIMER_POP_PUSH("terrain-0");
|
||||||
@@ -315,20 +338,24 @@ void GameRenderer::renderLevel(float a) {
|
|||||||
levelRenderer->render(cameraEntity, 1, a);
|
levelRenderer->render(cameraEntity, 1, a);
|
||||||
|
|
||||||
glShadeModel2(GL_FLAT);
|
glShadeModel2(GL_FLAT);
|
||||||
|
Lighting::turnOn(mc);
|
||||||
TIMER_POP_PUSH("entities");
|
TIMER_POP_PUSH("entities");
|
||||||
mc->levelRenderer->renderEntities(cameraEntity->getPos(a), &frustum, a);
|
mc->levelRenderer->renderEntities(cameraEntity->getPos(a), &frustum, a);
|
||||||
// setupFog(0);
|
// setupFog(0);
|
||||||
TIMER_POP_PUSH("particles");
|
TIMER_POP_PUSH("particles");
|
||||||
particleEngine->render(cameraEntity, a);
|
particleEngine->render(cameraEntity, a);
|
||||||
|
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);
|
||||||
glDepthMask(GL_FALSE);
|
glDepthMask(GL_FALSE); // @TODO commenting this out fixes Ice transparency and clouds are no longer visilbe underwater like normal beta - shredder
|
||||||
glDisable2(GL_ALPHA_TEST);
|
glDisable2(GL_ALPHA_TEST);
|
||||||
mc->textures->loadAndBindTexture("terrain.png");
|
mc->textures->loadAndBindTexture("terrain.png");
|
||||||
|
// @TODO - below is a commented out double render system that fixes ice transparency, but probs harm performance, add it as an option - shredder
|
||||||
|
|
||||||
//if (mc->options.fancyGraphics) {
|
//if (mc->options.fancyGraphics) {
|
||||||
// glColorMask(false, false, false, false);
|
// glColorMask(false, false, false, false);
|
||||||
// int visibleWaterChunks = levelRenderer->render(cameraEntity, 1, a);
|
// int visibleWaterChunks = levelRenderer->render(cameraEntity, 1, a);
|
||||||
@@ -361,18 +388,24 @@ void GameRenderer::renderLevel(float a) {
|
|||||||
TIMER_POP_PUSH("select");
|
TIMER_POP_PUSH("select");
|
||||||
Player* player = (Player*) cameraEntity;
|
Player* player = (Player*) cameraEntity;
|
||||||
// if (mc->useTouchscreen()) {
|
// if (mc->useTouchscreen()) {
|
||||||
levelRenderer->renderHitSelect(player, mc->hitResult, 0, NULL, a); //player.inventory->getSelected(), a);
|
if (mc->options.getBooleanValue(OPTIONS_BLOCK_OUTLINE)){
|
||||||
// }
|
levelRenderer->renderHitOutline(player, mc->hitResult, 0, NULL, a); //player.inventory->getSelected(), a); // java block outline one
|
||||||
|
} else {
|
||||||
|
levelRenderer->renderHitSelect(player, mc->hitResult, 0, NULL, a); //player.inventory->getSelected(), a); // normal pe one - shredder
|
||||||
|
}
|
||||||
levelRenderer->renderHit(player, mc->hitResult, 0, NULL, a);//player->inventory.getSelected(), a);
|
levelRenderer->renderHit(player, mc->hitResult, 0, NULL, a);//player->inventory.getSelected(), a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glDisable2(GL_FOG);
|
glDisable2(GL_FOG);
|
||||||
//
|
// Normally this is commented out, but this is how java does it and should fix both 2d/3d clouds, a
|
||||||
// setupFog(0);
|
if(mc->options.getBooleanValue(OPTIONS_BETA_SKY)){
|
||||||
// glEnable2(GL_FOG);
|
setupFog(0);
|
||||||
//// levelRenderer->renderClouds(a);
|
glEnable2(GL_FOG);
|
||||||
// glDisable2(GL_FOG);
|
levelRenderer->renderClouds(a);
|
||||||
|
glDisable2(GL_FOG);
|
||||||
|
}
|
||||||
|
// SHREDDER END
|
||||||
setupFog(1);
|
setupFog(1);
|
||||||
|
|
||||||
if (zoom == 1 && !mc->options.getBooleanValue(OPTIONS_HIDEGUI)) {
|
if (zoom == 1 && !mc->options.getBooleanValue(OPTIONS_HIDEGUI)) {
|
||||||
@@ -551,35 +584,35 @@ void GameRenderer::setupFog(int i) {
|
|||||||
glFogx(GL_FOG_MODE, GL_EXP);
|
glFogx(GL_FOG_MODE, GL_EXP);
|
||||||
glFogf(GL_FOG_DENSITY, 0.1f); // was 0.06
|
glFogf(GL_FOG_DENSITY, 0.1f); // was 0.06
|
||||||
|
|
||||||
// float rr = 0.4f;
|
// float rr = 0.4f;
|
||||||
// float gg = 0.4f;
|
// float gg = 0.4f;
|
||||||
// float bb = 0.9f;
|
// float bb = 0.9f;
|
||||||
//
|
//
|
||||||
// if (mc->options.anaglyph3d) {
|
// if (mc->options.anaglyph3d) {
|
||||||
// float rrr = (rr * 30 + gg * 59 + bb * 11) / 100;
|
// float rrr = (rr * 30 + gg * 59 + bb * 11) / 100;
|
||||||
// float ggg = (rr * 30 + gg * 70) / (100);
|
// float ggg = (rr * 30 + gg * 70) / (100);
|
||||||
// float bbb = (rr * 30 + bb * 70) / (100);
|
// float bbb = (rr * 30 + bb * 70) / (100);
|
||||||
//
|
//
|
||||||
// rr = rrr;
|
// rr = rrr;
|
||||||
// gg = ggg;
|
// gg = ggg;
|
||||||
// bb = bbb;
|
// bb = bbb;
|
||||||
// }
|
// }
|
||||||
} else if (player->isUnderLiquid(Material::lava)) {
|
} else if (player->isUnderLiquid(Material::lava)) {
|
||||||
glFogx(GL_FOG_MODE, GL_EXP);
|
glFogx(GL_FOG_MODE, GL_EXP);
|
||||||
glFogf(GL_FOG_DENSITY, 2.f); // was 0.06
|
glFogf(GL_FOG_DENSITY, 2.f); // was 0.06
|
||||||
// float rr = 0.4f;
|
// float rr = 0.4f;
|
||||||
// float gg = 0.3f;
|
// float gg = 0.3f;
|
||||||
// float bb = 0.3f;
|
// float bb = 0.3f;
|
||||||
//
|
//
|
||||||
// if (mc->options.anaglyph3d) {
|
// if (mc->options.anaglyph3d) {
|
||||||
// float rrr = (rr * 30 + gg * 59 + bb * 11) / 100;
|
// float rrr = (rr * 30 + gg * 59 + bb * 11) / 100;
|
||||||
// float ggg = (rr * 30 + gg * 70) / (100);
|
// float ggg = (rr * 30 + gg * 70) / (100);
|
||||||
// float bbb = (rr * 30 + bb * 70) / (100);
|
// float bbb = (rr * 30 + bb * 70) / (100);
|
||||||
//
|
//
|
||||||
// rr = rrr;
|
// rr = rrr;
|
||||||
// gg = ggg;
|
// gg = ggg;
|
||||||
// bb = bbb;
|
// bb = bbb;
|
||||||
// }
|
// }
|
||||||
} else {
|
} else {
|
||||||
glFogx(GL_FOG_MODE, GL_LINEAR);
|
glFogx(GL_FOG_MODE, GL_LINEAR);
|
||||||
glFogf(GL_FOG_START, renderDistance * 0.6f);
|
glFogf(GL_FOG_START, renderDistance * 0.6f);
|
||||||
@@ -657,7 +690,7 @@ void GameRenderer::pick(float a) {
|
|||||||
float range = mc->gameMode->getPickRange();
|
float range = mc->gameMode->getPickRange();
|
||||||
bool isPicking = true;
|
bool isPicking = true;
|
||||||
|
|
||||||
bool freeform = mc->useTouchscreen(); //&& !mc->options.getBooleanValue(OPTIONS_IS_JOY_TOUCH_AREA);
|
bool freeform = mc->useTouchscreen() && !mc->options.getBooleanValue(OPTIONS_IS_JOY_TOUCH_AREA);
|
||||||
|
|
||||||
if (freeform) {
|
if (freeform) {
|
||||||
isPicking = updateFreeformPickDirection(a, pickDirection);
|
isPicking = updateFreeformPickDirection(a, pickDirection);
|
||||||
@@ -792,7 +825,7 @@ void GameRenderer::tick(int nTick, int maxTick) {
|
|||||||
_tick++;
|
_tick++;
|
||||||
|
|
||||||
itemInHandRenderer->tick();
|
itemInHandRenderer->tick();
|
||||||
// if (mc->isRaining) tickRain();
|
// if (mc->isRaining) tickRain();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*private*/
|
/*private*/
|
||||||
@@ -912,9 +945,9 @@ void GameRenderer::onGraphicsReset()
|
|||||||
|
|
||||||
void GameRenderer::saveMatrices()
|
void GameRenderer::saveMatrices()
|
||||||
{
|
{
|
||||||
#if defined(RPI)
|
#if defined(RPI)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool saved = false;
|
static bool saved = false;
|
||||||
//if (saved) return;
|
//if (saved) return;
|
||||||
|
|||||||
@@ -21,11 +21,12 @@
|
|||||||
#include "../../world/item/BowItem.h"
|
#include "../../world/item/BowItem.h"
|
||||||
#include "../../world/level/tile/LeafTile.h"
|
#include "../../world/level/tile/LeafTile.h"
|
||||||
#include "entity/HumanoidMobRenderer.h"
|
#include "entity/HumanoidMobRenderer.h"
|
||||||
|
#include "Lighting.h"
|
||||||
|
|
||||||
//static StopwatchHandler handler;
|
//static StopwatchHandler handler;
|
||||||
|
|
||||||
ItemInHandRenderer::ItemInHandRenderer( Minecraft* mc )
|
ItemInHandRenderer::ItemInHandRenderer( Minecraft* mc )
|
||||||
: mc(mc),
|
: mc(mc),
|
||||||
lastSlot(-1),
|
lastSlot(-1),
|
||||||
height(0),
|
height(0),
|
||||||
oHeight(0),
|
oHeight(0),
|
||||||
@@ -49,9 +50,34 @@ ItemInHandRenderer::ItemInHandRenderer( Minecraft* mc )
|
|||||||
void ItemInHandRenderer::tick()
|
void ItemInHandRenderer::tick()
|
||||||
{
|
{
|
||||||
oHeight = height;
|
oHeight = height;
|
||||||
item.id = 0;
|
//item.id = 0;
|
||||||
|
|
||||||
ItemInstance* itemInHand = mc->player->inventory->getSelected();
|
ItemInstance* itemInHand = mc->player->inventory->getSelected();
|
||||||
|
bool sameItem = (itemInHand && item.id == itemInHand->id && item.getAuxValue() == itemInHand->getAuxValue());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (mc->options.getBooleanValue(OPTIONS_RESTORED_ANIMS)) // if enabled, restores and fixes item switching animation
|
||||||
|
{
|
||||||
|
if (!itemInHand && item.id == 0) sameItem = true;
|
||||||
|
float max = 0.4f;
|
||||||
|
float tHeight = sameItem ? 1 : 0;
|
||||||
|
float dd = tHeight - height;
|
||||||
|
if (dd < -max) dd = -max;
|
||||||
|
if (dd > max) dd = max;
|
||||||
|
|
||||||
|
height += dd;
|
||||||
|
|
||||||
|
if (height < 0.1){
|
||||||
|
if (itemInHand && itemInHand->count > 0) {
|
||||||
|
item.id = itemInHand->id;
|
||||||
|
item.setAuxValue(itemInHand->getAuxValue());
|
||||||
|
} else {
|
||||||
|
item.id = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else // otherwise use vanilla broken behaviour where it instantly switches items/blocks
|
||||||
|
{
|
||||||
if (itemInHand && itemInHand->count > 0) {
|
if (itemInHand && itemInHand->count > 0) {
|
||||||
item.id = itemInHand->id;
|
item.id = itemInHand->id;
|
||||||
item.setAuxValue(itemInHand->getAuxValue());
|
item.setAuxValue(itemInHand->getAuxValue());
|
||||||
@@ -64,6 +90,7 @@ void ItemInHandRenderer::tick()
|
|||||||
if (dd > max) dd = max;
|
if (dd > max) dd = max;
|
||||||
|
|
||||||
height += dd;
|
height += dd;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemInHandRenderer::renderItem(Mob* mob, ItemInstance* item )
|
void ItemInHandRenderer::renderItem(Mob* mob, ItemInstance* item )
|
||||||
@@ -139,9 +166,9 @@ void ItemInHandRenderer::renderItem(Mob* mob, ItemInstance* item )
|
|||||||
float v1 = (vp * 16 + 15.99f) / 256.0f;
|
float v1 = (vp * 16 + 15.99f) / 256.0f;
|
||||||
|
|
||||||
float r = 1.0f;
|
float r = 1.0f;
|
||||||
// float xo = 0.0f;
|
// float xo = 0.0f;
|
||||||
// float yo = 0.3f;
|
// float yo = 0.3f;
|
||||||
/*
|
/*
|
||||||
//glEnable2(GL_RESCALE_NORMAL);
|
//glEnable2(GL_RESCALE_NORMAL);
|
||||||
glTranslatef2(-xo, -yo, 0);
|
glTranslatef2(-xo, -yo, 0);
|
||||||
float s = 1.5f;
|
float s = 1.5f;
|
||||||
@@ -150,19 +177,28 @@ void ItemInHandRenderer::renderItem(Mob* mob, ItemInstance* item )
|
|||||||
glRotatef2(50, 0, 1, 0);
|
glRotatef2(50, 0, 1, 0);
|
||||||
glRotatef2(45 + 290, 0, 0, 1);
|
glRotatef2(45 + 290, 0, 0, 1);
|
||||||
glTranslatef2(-15 / 16.0f, -1 / 16.0f, 0);
|
glTranslatef2(-15 / 16.0f, -1 / 16.0f, 0);
|
||||||
*/
|
*/
|
||||||
float dd = 1 / 16.0f;
|
float dd = 1 / 16.0f;
|
||||||
|
float col = 1.0f;
|
||||||
|
float br = mc->player->getBrightness(0);
|
||||||
|
|
||||||
|
|
||||||
|
t.color(col*br,col*br,col*br,1.0f);
|
||||||
|
t.normal(0.0f, 0.0f, 1.0f);
|
||||||
t.vertexUV(0, 0, 0, u0, v1);
|
t.vertexUV(0, 0, 0, u0, v1);
|
||||||
t.vertexUV(r, 0, 0, u1, v1);
|
t.vertexUV(r, 0, 0, u1, v1);
|
||||||
t.vertexUV(r, 1, 0, u1, v0);
|
t.vertexUV(r, 1, 0, u1, v0);
|
||||||
t.vertexUV(0, 1, 0, u0, v0);
|
t.vertexUV(0, 1, 0, u0, v0);
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, -1.0f);
|
||||||
t.vertexUV(0, 1, 0 - dd, u0, v0);
|
t.vertexUV(0, 1, 0 - dd, u0, v0);
|
||||||
t.vertexUV(r, 1, 0 - dd, u1, v0);
|
t.vertexUV(r, 1, 0 - dd, u1, v0);
|
||||||
t.vertexUV(r, 0, 0 - dd, u1, v1);
|
t.vertexUV(r, 0, 0 - dd, u1, v1);
|
||||||
t.vertexUV(0, 0, 0 - dd, u0, v1);
|
t.vertexUV(0, 0, 0 - dd, u0, v1);
|
||||||
|
|
||||||
|
col = 0.8f;
|
||||||
|
t.color(col*br,col*br,col*br,1.0f);
|
||||||
|
t.normal(-1.0f, 0.0f, 0.0f);
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
float p = i / 16.0f;
|
float p = i / 16.0f;
|
||||||
float uu = u0 + (u1 - u0) * p - 0.5f / 256.0f;
|
float uu = u0 + (u1 - u0) * p - 0.5f / 256.0f;
|
||||||
@@ -172,6 +208,7 @@ void ItemInHandRenderer::renderItem(Mob* mob, ItemInstance* item )
|
|||||||
t.vertexUV(xx, 1, 0, uu, v0);
|
t.vertexUV(xx, 1, 0, uu, v0);
|
||||||
t.vertexUV(xx, 1, 0 - dd, uu, v0);
|
t.vertexUV(xx, 1, 0 - dd, uu, v0);
|
||||||
}
|
}
|
||||||
|
t.normal(1.0f, 0.0f, 0.0f);
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
float p = i / 16.0f;
|
float p = i / 16.0f;
|
||||||
float uu = u0 + (u1 - u0) * p - 0.5f / 256.0f;
|
float uu = u0 + (u1 - u0) * p - 0.5f / 256.0f;
|
||||||
@@ -181,6 +218,10 @@ void ItemInHandRenderer::renderItem(Mob* mob, ItemInstance* item )
|
|||||||
t.vertexUV(xx, 0, 0, uu, v1);
|
t.vertexUV(xx, 0, 0, uu, v1);
|
||||||
t.vertexUV(xx, 0, 0 - dd, uu, v1);
|
t.vertexUV(xx, 0, 0 - dd, uu, v1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
col = 0.6f;
|
||||||
|
t.color(col*br,col*br,col*br,1.0f);
|
||||||
|
t.normal(0.0f, 1.0f, 0.0f);
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
float p = i / 16.0f;
|
float p = i / 16.0f;
|
||||||
float vv = v1 + (v0 - v1) * p - 0.5f / 256.0f;
|
float vv = v1 + (v0 - v1) * p - 0.5f / 256.0f;
|
||||||
@@ -190,6 +231,7 @@ void ItemInHandRenderer::renderItem(Mob* mob, ItemInstance* item )
|
|||||||
t.vertexUV(r, yy, 0 - dd, u1, vv);
|
t.vertexUV(r, yy, 0 - dd, u1, vv);
|
||||||
t.vertexUV(0, yy, 0 - dd, u0, vv);
|
t.vertexUV(0, yy, 0 - dd, u0, vv);
|
||||||
}
|
}
|
||||||
|
t.normal(0.0f, -1.0f, 0.0f);
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
float p = i / 16.0f;
|
float p = i / 16.0f;
|
||||||
float vv = v1 + (v0 - v1) * p - 0.5f / 256.0f;
|
float vv = v1 + (v0 - v1) * p - 0.5f / 256.0f;
|
||||||
@@ -219,7 +261,7 @@ void ItemInHandRenderer::renderItem(Mob* mob, ItemInstance* item )
|
|||||||
}
|
}
|
||||||
mc->textures->loadAndBindTexture(renderObject.texture);
|
mc->textures->loadAndBindTexture(renderObject.texture);
|
||||||
|
|
||||||
drawArrayVT_NoState(renderObject.chunk.vboId, renderObject.chunk.vertexCount);
|
drawArrayVTN_NoState(renderObject.chunk.vboId, renderObject.chunk.vertexCount);
|
||||||
if (renderObject.isFlat)
|
if (renderObject.isFlat)
|
||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
}
|
}
|
||||||
@@ -227,6 +269,7 @@ void ItemInHandRenderer::renderItem(Mob* mob, ItemInstance* item )
|
|||||||
//handler.printEvery(100);
|
//handler.printEvery(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ItemInHandRenderer::render( float a )
|
void ItemInHandRenderer::render( float a )
|
||||||
{
|
{
|
||||||
//return;
|
//return;
|
||||||
@@ -237,12 +280,27 @@ 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);
|
||||||
glRotatef2(player->yRotO + (player->yRot - player->yRotO) * a, 0, 1, 0);
|
glRotatef2(player->yRotO + (player->yRot - player->yRotO) * a, 0, 1, 0);
|
||||||
|
glEnable(GL_RESCALE_NORMAL);
|
||||||
|
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;
|
||||||
@@ -293,7 +351,7 @@ void ItemInHandRenderer::render( float a )
|
|||||||
glTranslatef2(0.7f * d, -0.65f * d - (1 - h) * 0.6f, -0.9f * d);
|
glTranslatef2(0.7f * d, -0.65f * d - (1 - h) * 0.6f, -0.9f * d);
|
||||||
|
|
||||||
glRotatef2(45, 0, 1, 0);
|
glRotatef2(45, 0, 1, 0);
|
||||||
//glEnable2(GL_RESCALE_NORMAL);
|
glEnable2(GL_RESCALE_NORMAL);
|
||||||
glRotatef2(-swing3 * 20, 0, 1, 0);
|
glRotatef2(-swing3 * 20, 0, 1, 0);
|
||||||
glRotatef2(-swing2 * 20, 0, 0, 1);
|
glRotatef2(-swing2 * 20, 0, 0, 1);
|
||||||
glRotatef2(-swing2 * 80, 1, 0, 0);
|
glRotatef2(-swing2 * 80, 1, 0, 0);
|
||||||
@@ -330,7 +388,9 @@ void ItemInHandRenderer::render( float a )
|
|||||||
}
|
}
|
||||||
glEnableClientState2(GL_VERTEX_ARRAY);
|
glEnableClientState2(GL_VERTEX_ARRAY);
|
||||||
glEnableClientState2(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState2(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
glEnableClientState2(GL_NORMAL_ARRAY);
|
||||||
renderItem(player, item);
|
renderItem(player, item);
|
||||||
|
glDisableClientState2(GL_NORMAL_ARRAY);
|
||||||
glDisableClientState2(GL_VERTEX_ARRAY);
|
glDisableClientState2(GL_VERTEX_ARRAY);
|
||||||
glDisableClientState2(GL_TEXTURE_COORD_ARRAY);
|
glDisableClientState2(GL_TEXTURE_COORD_ARRAY);
|
||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
@@ -349,7 +409,8 @@ void ItemInHandRenderer::render( float a )
|
|||||||
glTranslatef2(0.8f * d, -0.75f * d - (1 - h) * 0.6f, -0.9f * d);
|
glTranslatef2(0.8f * d, -0.75f * d - (1 - h) * 0.6f, -0.9f * d);
|
||||||
|
|
||||||
glRotatef2(45, 0, 1, 0);
|
glRotatef2(45, 0, 1, 0);
|
||||||
//glEnable2(GL_RESCALE_NORMAL);
|
// glEnable2(GL_RESCALE_NORMAL);
|
||||||
|
glEnable(GL_NORMALIZE);
|
||||||
glRotatef2(swing2 * 70, 0, 1, 0);
|
glRotatef2(swing2 * 70, 0, 1, 0);
|
||||||
glRotatef2(-swing3 * 20, 0, 0, 1);
|
glRotatef2(-swing3 * 20, 0, 0, 1);
|
||||||
// glRotatef2(-swing2 * 80, 1, 0, 0);
|
// glRotatef2(-swing2 * 80, 1, 0, 0);
|
||||||
@@ -369,8 +430,8 @@ void ItemInHandRenderer::render( float a )
|
|||||||
playerRenderer->renderHand();
|
playerRenderer->renderHand();
|
||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
}
|
}
|
||||||
//glDisable2(GL_RESCALE_NORMAL);
|
glDisable2(GL_RESCALE_NORMAL);
|
||||||
//Lighting.turnOff();
|
Lighting::turnOff();
|
||||||
//w.stop();
|
//w.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,10 +456,10 @@ void ItemInHandRenderer::renderScreenEffect( float a )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (mc->player->isUnderLiquid(Material::water)) {
|
if (mc->player->isUnderLiquid(Material::water)) {
|
||||||
//mc->textures->loadAndBindTexture("misc/water.png");
|
mc->textures->loadAndBindTexture("misc/water.png");
|
||||||
// renderWater(a);
|
renderWater(a);
|
||||||
// }
|
}
|
||||||
glEnable2(GL_ALPHA_TEST);
|
glEnable2(GL_ALPHA_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include "../../client/player/LocalPlayer.h"
|
#include "../../client/player/LocalPlayer.h"
|
||||||
|
|
||||||
#include "../../world/level/GrassColor.h"
|
#include "../../world/level/GrassColor.h"
|
||||||
|
#include "Lighting.h"
|
||||||
|
|
||||||
#ifdef GFX_SMALLER_CHUNKS
|
#ifdef GFX_SMALLER_CHUNKS
|
||||||
/* static */ const int LevelRenderer::CHUNK_SIZE = 8;
|
/* static */ const int LevelRenderer::CHUNK_SIZE = 8;
|
||||||
@@ -68,7 +69,7 @@ LevelRenderer::LevelRenderer( Minecraft* mc)
|
|||||||
destroyProgress(0)
|
destroyProgress(0)
|
||||||
{
|
{
|
||||||
#ifdef OPENGL_ES
|
#ifdef OPENGL_ES
|
||||||
int maxChunksWidth = 2 * LEVEL_WIDTH / CHUNK_SIZE + 1;
|
int maxChunksWidth = 2 * LevelConstants::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);
|
||||||
@@ -76,6 +77,9 @@ LevelRenderer::LevelRenderer( Minecraft* mc)
|
|||||||
//for (int i = 0; i < numListsOrBuffers; ++i) printf("bufId %d: %d\t", i, chunkBuffers[i]);
|
//for (int i = 0; i < numListsOrBuffers; ++i) printf("bufId %d: %d\t", i, chunkBuffers[i]);
|
||||||
|
|
||||||
glGenBuffers2(1, &skyBuffer);
|
glGenBuffers2(1, &skyBuffer);
|
||||||
|
glGenBuffers2(1, &voidBuffer);
|
||||||
|
glGenBuffers2(1, &starBuffer);
|
||||||
|
generateStars();
|
||||||
generateSky();
|
generateSky();
|
||||||
#else
|
#else
|
||||||
int maxChunksWidth = 1024 / CHUNK_SIZE;
|
int maxChunksWidth = 1024 / CHUNK_SIZE;
|
||||||
@@ -94,6 +98,8 @@ LevelRenderer::~LevelRenderer()
|
|||||||
#ifdef OPENGL_ES
|
#ifdef OPENGL_ES
|
||||||
glDeleteBuffers(numListsOrBuffers, chunkBuffers);
|
glDeleteBuffers(numListsOrBuffers, chunkBuffers);
|
||||||
glDeleteBuffers(1, &skyBuffer);
|
glDeleteBuffers(1, &skyBuffer);
|
||||||
|
glDeleteBuffers(1, &voidBuffer);
|
||||||
|
glDeleteBuffers(1, &starBuffer);
|
||||||
delete[] chunkBuffers;
|
delete[] chunkBuffers;
|
||||||
#else
|
#else
|
||||||
glDeleteLists(numListsOrBuffers, chunkLists);
|
glDeleteLists(numListsOrBuffers, chunkLists);
|
||||||
@@ -121,6 +127,25 @@ void LevelRenderer::generateSky() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
t.end(true, skyBuffer);
|
t.end(true, skyBuffer);
|
||||||
|
|
||||||
|
yy = (float) (-16);
|
||||||
|
t.begin();
|
||||||
|
|
||||||
|
// pretty much the same thing as the sky one above except uses inverted values to generate the void plane.
|
||||||
|
|
||||||
|
voidVertexCount = 0;
|
||||||
|
for (int xx = -s * d; xx <= s * d; xx += s) {
|
||||||
|
for (int zz = -s * d; zz <= s * d; zz += s) {
|
||||||
|
t.vertex((float) xx + 0, yy, (float) zz + s);
|
||||||
|
t.vertex((float)(xx + s), yy, (float) zz + s);
|
||||||
|
t.vertex((float)(xx + s), yy, (float)(zz + 0));
|
||||||
|
t.vertex((float) xx + 0, yy, (float)(zz + 0));
|
||||||
|
//LOGI("x, z: %d, %d\n", xx, zz);
|
||||||
|
voidVertexCount += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.end(true, voidBuffer);
|
||||||
//LOGI("skyvertexcount: %d\n", skyVertexCount);
|
//LOGI("skyvertexcount: %d\n", skyVertexCount);
|
||||||
//glEndList();
|
//glEndList();
|
||||||
}
|
}
|
||||||
@@ -146,10 +171,6 @@ void LevelRenderer::setLevel( Level* level )
|
|||||||
level->addListener(this);
|
level->addListener(this);
|
||||||
allChanged();
|
allChanged();
|
||||||
}
|
}
|
||||||
if (mc->options.getBooleanValue(OPTIONS_AMBIENT_OCCLUSION)) {
|
|
||||||
mc->useAmbientOcclusion = !mc->useAmbientOcclusion;
|
|
||||||
allChanged();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LevelRenderer::allChanged()
|
void LevelRenderer::allChanged()
|
||||||
@@ -168,6 +189,9 @@ void LevelRenderer::allChanged()
|
|||||||
FoliageColor::setUseTint(tint);
|
FoliageColor::setUseTint(tint);
|
||||||
GrassColor::setUseTint(tint);
|
GrassColor::setUseTint(tint);
|
||||||
|
|
||||||
|
bool sideTint = mc->options.getBooleanValue(OPTIONS_TINTED_SIDE);
|
||||||
|
TileRenderer::setUseTint(sideTint);
|
||||||
|
|
||||||
|
|
||||||
int dist = (512 >> 3) << (3 - lastViewDistance);
|
int dist = (512 >> 3) << (3 - lastViewDistance);
|
||||||
if (lastViewDistance <= 2 && mc->isPowerVR())
|
if (lastViewDistance <= 2 && mc->isPowerVR())
|
||||||
@@ -325,6 +349,37 @@ int LevelRenderer::render( Mob* player, int layer, float alpha )
|
|||||||
|
|
||||||
allChanged();
|
allChanged();
|
||||||
}
|
}
|
||||||
|
bool SmoothLightState = mc->options.getBooleanValue(OPTIONS_AMBIENT_OCCLUSION);
|
||||||
|
if (SmoothLightState != mc->useAmbientOcclusion){
|
||||||
|
mc->useAmbientOcclusion = SmoothLightState;
|
||||||
|
allChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool tint = mc->options.getBooleanValue(OPTIONS_FOLIAGE_TINT);
|
||||||
|
if (tint != LastTint) {
|
||||||
|
LastTint = tint;
|
||||||
|
|
||||||
|
|
||||||
|
FoliageColor::setUseTint(tint);
|
||||||
|
GrassColor::setUseTint(tint);
|
||||||
|
|
||||||
|
allChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool sideTint = mc->options.getBooleanValue(OPTIONS_TINTED_SIDE);
|
||||||
|
|
||||||
|
if (sideTint != LastSideTint) {
|
||||||
|
LastSideTint = sideTint;
|
||||||
|
|
||||||
|
|
||||||
|
TileRenderer::setUseTint(sideTint);
|
||||||
|
|
||||||
|
allChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TIMER_PUSH("sortchunks");
|
TIMER_PUSH("sortchunks");
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
@@ -513,15 +568,15 @@ void LevelRenderer::render(const AABB& b) const
|
|||||||
{
|
{
|
||||||
Tesselator& t = Tesselator::instance;
|
Tesselator& t = Tesselator::instance;
|
||||||
|
|
||||||
glColor4f2(1, 1, 1, 1);
|
// glColor4f2(1, 1, 1, 1);
|
||||||
|
|
||||||
textures->loadAndBindTexture("terrain.png");
|
// textures->loadAndBindTexture("terrain.png"); // uh need to check java - shredder
|
||||||
|
|
||||||
//t.begin();
|
//t.begin();
|
||||||
t.color(255, 255, 255, 255);
|
// t.color(255, 255, 255, 255); // again not needed, for some reason the vanilla source code tints it... white? maybe this was used for something else in MCPE's dev at one point? - shredder
|
||||||
|
|
||||||
t.offset(((Mob*)mc->player)->getPos(0).negated());
|
|
||||||
|
|
||||||
|
// t.offset(((Mob*)mc->player)->getPos(0).negated()); // why does this even exist normally, it just makes the thing... not render
|
||||||
|
glLineWidth(2.0f); // make it more thick - shredder
|
||||||
t.begin(GL_LINE_STRIP);
|
t.begin(GL_LINE_STRIP);
|
||||||
t.vertex(b.x0, b.y0, b.z0);
|
t.vertex(b.x0, b.y0, b.z0);
|
||||||
t.vertex(b.x1, b.y0, b.z0);
|
t.vertex(b.x1, b.y0, b.z0);
|
||||||
@@ -1009,13 +1064,66 @@ std::string LevelRenderer::gatherStats1() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// /*public*/ std::string gatherStats2() {
|
std::string LevelRenderer::gatherStats2() {
|
||||||
// return "E: " + renderedEntities + "/" + totalEntities + ". B: " + culledEntities + ", I: " + ((totalEntities - culledEntities) - renderedEntities);
|
std::stringstream ss;
|
||||||
// }
|
ss << "E: "<< renderedEntities << "/" << totalEntities << ". B: " << culledEntities << ", I: " << (totalEntities - culledEntities) - renderedEntities <<"\n";
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
//
|
//
|
||||||
// int[] toRender = new int[50000];
|
// int[] toRender = new int[50000];
|
||||||
// IntBuffer resultBuffer = MemoryTracker.createIntBuffer(64);
|
// IntBuffer resultBuffer = MemoryTracker.createIntBuffer(64);
|
||||||
|
|
||||||
|
void LevelRenderer::generateStars() {
|
||||||
|
// ported from java beta again,
|
||||||
|
// converted the doubles into floats to be consistent, shouldnt affect much - shredder
|
||||||
|
|
||||||
|
Random random = Random(10842L);
|
||||||
|
Tesselator& t = Tesselator::instance;
|
||||||
|
t.begin();
|
||||||
|
starVertexCount = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 1500; i++) {
|
||||||
|
float d = random.nextFloat() * 2.0F - 1.0F;
|
||||||
|
float e = random.nextFloat() * 2.0F - 1.0F;
|
||||||
|
float f = random.nextFloat() * 2.0F - 1.0F;
|
||||||
|
float g = 0.25F + random.nextFloat() * 0.25F;
|
||||||
|
float h = d * d + e * e + f * f;
|
||||||
|
if (h < 1.0 && h > 0.01) {
|
||||||
|
h = 1.0 / Mth::sqrt(h);
|
||||||
|
d *= h;
|
||||||
|
e *= h;
|
||||||
|
f *= h;
|
||||||
|
float j = d * 100.0;
|
||||||
|
float k = e * 100.0;
|
||||||
|
float l = f * 100.0;
|
||||||
|
float m = Mth::atan2(d, f);
|
||||||
|
float n = Mth::sin(m);
|
||||||
|
float o = Mth::cos(m);
|
||||||
|
float p = Mth::atan2(Mth::sqrt(d * d + f * f), e);
|
||||||
|
float q = Mth::sin(p);
|
||||||
|
float r = Mth::cos(p);
|
||||||
|
float s = random.nextDouble() * Mth::PI * 2.0;
|
||||||
|
float t2 = Mth::sin(s);
|
||||||
|
float u = Mth::cos(s);
|
||||||
|
|
||||||
|
for (int v = 0; v < 4; v++) {
|
||||||
|
float w = 0.0;
|
||||||
|
float x = ((v & 2) - 1) * g;
|
||||||
|
float y = ((v + 1 & 2) - 1) * g;
|
||||||
|
float aa = x * u - y * t2;
|
||||||
|
float ab = y * u + x * t2;
|
||||||
|
float ad = aa * q + w * r;
|
||||||
|
float ae = w * q - aa * r;
|
||||||
|
float af = ae * n - ab * o;
|
||||||
|
float ah = ab * n + ae * o;
|
||||||
|
t.vertex(j + af, k + ad, l + ah);
|
||||||
|
}
|
||||||
|
starVertexCount += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.end(true, starBuffer);
|
||||||
|
}
|
||||||
void LevelRenderer::renderSky(float alpha) {
|
void LevelRenderer::renderSky(float alpha) {
|
||||||
if (mc->level->dimension->foggy) return;
|
if (mc->level->dimension->foggy) return;
|
||||||
|
|
||||||
@@ -1036,19 +1144,125 @@ void LevelRenderer::renderSky(float alpha) {
|
|||||||
}
|
}
|
||||||
glColor4f2(sr, sg, Mth::Min(1.0f, sb), 1);
|
glColor4f2(sr, sg, Mth::Min(1.0f, sb), 1);
|
||||||
|
|
||||||
//Tesselator& t = Tesselator::instance;
|
Tesselator& t = Tesselator::instance;
|
||||||
|
// @TODO shredder - should not enable or disable depth mask if using legacy sky because mcpe sky rendering is awful and will render clouds above terrain
|
||||||
|
if(mc->options.getBooleanValue(OPTIONS_BETA_SKY)){
|
||||||
|
glDepthMask(false);
|
||||||
|
}
|
||||||
glEnable2(GL_FOG);
|
glEnable2(GL_FOG);
|
||||||
glColor4f2(sr, sg, sb, 1.0f);
|
glColor4f2(sr, sg, sb, 1.0f);
|
||||||
|
|
||||||
#ifdef OPENGL_ES
|
#ifdef OPENGL_ES
|
||||||
drawArrayVT(skyBuffer, skyVertexCount);
|
drawArrayVT(skyBuffer, skyVertexCount);
|
||||||
#endif
|
#endif
|
||||||
glEnable2(GL_TEXTURE_2D);
|
glDisable(GL_FOG);
|
||||||
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
|
||||||
|
// re ported this again from beta 1.6.6, thanks to the mcpe 0.1 decomp team's code for some bit of help about the void layer - shredder
|
||||||
|
|
||||||
|
// Sunrise
|
||||||
|
if (mc->options.getBooleanValue(OPTIONS_BEAUTIFUL_SKY)) {
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
Lighting::turnOff();
|
||||||
|
float* c = level->dimension->getSunriseColor(level->getTimeOfDay(alpha), alpha);
|
||||||
|
if (c != nullptr)
|
||||||
|
{
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
// glShadeModel(GL_SMOOTH); //
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
|
||||||
|
glRotatef(level->getTimeOfDay(alpha) > 0.5f ? 180 : 0, 0.0f, 0.0f, 1.0f);
|
||||||
|
t.begin(GL_TRIANGLE_FAN);
|
||||||
|
t.color(c[0], c[1], c[2], c[3]);
|
||||||
|
t.vertex(0.0f, 100.0f, 0.0f);
|
||||||
|
t.color(c[0], c[1], c[2], 0.0f);
|
||||||
|
|
||||||
|
int steps = 16;
|
||||||
|
for (int i = 0; i <= steps; i++)
|
||||||
|
{
|
||||||
|
float a = i * 3.1415927f * 2.0f / steps;
|
||||||
|
float sin = Mth::sin(a);
|
||||||
|
float cos = Mth::cos(a);
|
||||||
|
t.vertex((sin * 120.0f), (cos * 120.0f), (-cos * 40.0f * c[3]));
|
||||||
|
}
|
||||||
|
|
||||||
|
t.draw();
|
||||||
|
glPopMatrix();
|
||||||
|
// glShadeModel(GL_FLAT); //
|
||||||
|
}
|
||||||
|
|
||||||
|
// gets the time of day and rotates the sun and moon png based on the time
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
|
glTranslatef(sc.x, sc.y, sc.z);
|
||||||
|
glRotatef(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
glRotatef(level->getTimeOfDay(alpha) * 360.0f, 1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
float ss = 30.0f;
|
||||||
|
|
||||||
|
|
||||||
|
textures->loadAndBindTexture("terrain/sun.png");
|
||||||
|
t.begin();
|
||||||
|
t.vertexUV(-ss, 100.0f, -ss, 0.0f, 0.0f);
|
||||||
|
t.vertexUV(ss, 100.0f, -ss, 1.0f, 0.0f);
|
||||||
|
t.vertexUV(ss, 100.0f, ss, 1.0f, 1.0f);
|
||||||
|
t.vertexUV(-ss, 100.0f, ss, 0.0f, 1.0f);
|
||||||
|
t.draw();
|
||||||
|
|
||||||
|
ss = 20.0f;
|
||||||
|
textures->loadAndBindTexture("terrain/moon.png");
|
||||||
|
t.begin();
|
||||||
|
t.vertexUV(-ss, -100.0f, ss, 1.0f, 1.0f);
|
||||||
|
t.vertexUV(ss, -100.0f, ss, 0.0f, 1.0f);
|
||||||
|
t.vertexUV(ss, -100.0f, -ss, 0.0f, 0.0f);
|
||||||
|
t.vertexUV(-ss, -100.0f, -ss, 1.0f, 0.0f);
|
||||||
|
t.draw();
|
||||||
|
|
||||||
|
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
float a = level->getStarBrightness(alpha);
|
||||||
|
if (a > 0.0f)
|
||||||
|
{
|
||||||
|
glColor4f(a, a, a, a);
|
||||||
|
drawArrayVT(starBuffer, starVertexCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glEnable(GL_ALPHA_TEST);
|
||||||
|
glEnable(GL_FOG);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
// ported over void plane (the blue bottom plane seen in java) because pocket edition lacks it @TODO test if it's buggy - shredder
|
||||||
|
|
||||||
|
// glColor3f(sc.x * 0.2f + 0.04f, sc.y * 0.2f + 0.04f, sc.z * 0.6f + 0.1f);
|
||||||
|
glColor4f(sc.x * 0.2f + 0.04f, sc.y * 0.2f + 0.04f, sc.z * 0.6f + 0.1f, 1.0f);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
if(mc->options.getBooleanValue(OPTIONS_BETA_SKY)){
|
||||||
|
drawArrayVT(voidBuffer, voidVertexCount);
|
||||||
|
}
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
// @TODO shredder - should not enable or disable depth mask if using legacy sky because mcpe sky rendering is awful and will render clouds above terrain
|
||||||
|
if(mc->options.getBooleanValue(OPTIONS_BETA_SKY)){
|
||||||
|
glDepthMask(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LevelRenderer::renderClouds( float alpha ) {
|
void LevelRenderer::renderClouds( float alpha ) {
|
||||||
//if (!mc->level->dimension->isNaturalDimension()) return;
|
//if (!mc->level->dimension->isNaturalDimension()) return;
|
||||||
|
if (mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS) && mc->options.getBooleanValue(OPTIONS_BETA_SKY)){
|
||||||
|
renderAdvancedClouds(alpha);
|
||||||
|
return;
|
||||||
|
}
|
||||||
glEnable2(GL_TEXTURE_2D);
|
glEnable2(GL_TEXTURE_2D);
|
||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
float yOffs = (float) (mc->player->yOld + (mc->player->y - mc->player->yOld) * alpha);
|
float yOffs = (float) (mc->player->yOld + (mc->player->y - mc->player->yOld) * alpha);
|
||||||
@@ -1097,18 +1311,154 @@ void LevelRenderer::renderClouds( float alpha ) {
|
|||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LevelRenderer::renderAdvancedClouds(float alpha) {
|
||||||
|
|
||||||
|
// ported from java beta, tesselation code for the 3d clouds, renders broken if mcpe sky rendering option is used - shredder
|
||||||
|
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
|
||||||
|
float px = mc->player->xOld + (mc->player->x - mc->player->xOld) * alpha;
|
||||||
|
float py = mc->player->yOld + (mc->player->y - mc->player->yOld) * alpha;
|
||||||
|
float pz = mc->player->zOld + (mc->player->z - mc->player->zOld) * alpha;
|
||||||
|
|
||||||
|
Tesselator& t = Tesselator::instance;
|
||||||
|
float ss = 12.0f;
|
||||||
|
float h = 4.0f;
|
||||||
|
|
||||||
|
float cloudTime = (float)ticks + alpha;
|
||||||
|
|
||||||
|
float xo = (px + cloudTime * 0.03f) / ss;
|
||||||
|
float zo = pz / ss + 0.33f;
|
||||||
|
|
||||||
|
float yy = 108.0f - py + 0.33f;
|
||||||
|
|
||||||
|
int xWraps = Mth::floor(xo / 2048.0);
|
||||||
|
int zWraps = Mth::floor(zo / 2048.0);
|
||||||
|
xo -= xWraps * 2048;
|
||||||
|
zo -= zWraps * 2048;
|
||||||
|
|
||||||
|
textures->loadAndBindTexture("environment/clouds.png");
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
|
Vec3 cc = level->getCloudColor(alpha);
|
||||||
|
float cr = cc.x;
|
||||||
|
float cg = cc.y;
|
||||||
|
float cb = cc.z;
|
||||||
|
|
||||||
|
float uvScale = 1.0f / 256.0f;
|
||||||
|
float uo = (float)Mth::floor(xo) * uvScale;
|
||||||
|
float vo = (float)Mth::floor(zo) * uvScale;
|
||||||
|
|
||||||
|
float xOffs = (float)(xo - Mth::floor(xo));
|
||||||
|
float zOffs = (float)(zo - Mth::floor(zo));
|
||||||
|
|
||||||
|
int D = 8;
|
||||||
|
int radius = 3;
|
||||||
|
float e = 1.0f / 1024.0f;
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glScalef(ss, 1.0f, ss);
|
||||||
|
|
||||||
|
for (int pass = 0; pass < 2; pass++) {
|
||||||
|
|
||||||
|
if (pass == 0) glColorMask(false, false, false, false);
|
||||||
|
else glColorMask(true, true, true, true);
|
||||||
|
|
||||||
|
for (int xPos = -radius + 1; xPos <= radius; xPos++) {
|
||||||
|
for (int zPos = -radius + 1; zPos <= radius; zPos++) {
|
||||||
|
t.begin();
|
||||||
|
float xx = (float)(xPos * D);
|
||||||
|
float zz = (float)(zPos * D);
|
||||||
|
float xp = xx - xOffs;
|
||||||
|
float zp = zz - zOffs;
|
||||||
|
|
||||||
|
|
||||||
|
if (yy > -h - 1.0f) {
|
||||||
|
t.color(cr * 0.7f, cg * 0.7f, cb * 0.7f, 0.8f);
|
||||||
|
t.normal(0.0f, -1.0f, 0.0f);
|
||||||
|
t.vertexUV(xp + 0, yy + 0, zp + D, (xx + 0) * uvScale + uo, (zz + D) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + D, yy + 0, zp + D, (xx + D) * uvScale + uo, (zz + D) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + D, yy + 0, zp + 0, (xx + D) * uvScale + uo, (zz + 0) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + 0, yy + 0, zp + 0, (xx + 0) * uvScale + uo, (zz + 0) * uvScale + vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (yy <= h + 1.0f) {
|
||||||
|
t.color(cr, cg, cb, 0.8f);
|
||||||
|
t.normal(0.0f, 1.0f, 0.0f);
|
||||||
|
t.vertexUV(xp + 0, yy + h - e, zp + D, (xx + 0) * uvScale + uo, (zz + D) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + D, yy + h - e, zp + D, (xx + D) * uvScale + uo, (zz + D) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + D, yy + h - e, zp + 0, (xx + D) * uvScale + uo, (zz + 0) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + 0, yy + h - e, zp + 0, (xx + 0) * uvScale + uo, (zz + 0) * uvScale + vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
t.color(cr * 0.9f, cg * 0.9f, cb * 0.9f, 0.8f);
|
||||||
|
|
||||||
|
|
||||||
|
if (xPos > -1) {
|
||||||
|
t.normal(-1.0f, 0.0f, 0.0f);
|
||||||
|
for (int i = 0; i < D; i++) {
|
||||||
|
t.vertexUV(xp + i + 0, yy + 0, zp + D, (xx + i + 0.5f) * uvScale + uo, (zz + D) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + i + 0, yy + h, zp + D, (xx + i + 0.5f) * uvScale + uo, (zz + D) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + i + 0, yy + h, zp + 0, (xx + i + 0.5f) * uvScale + uo, (zz + 0) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + i + 0, yy + 0, zp + 0, (xx + i + 0.5f) * uvScale + uo, (zz + 0) * uvScale + vo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (xPos <= 1) {
|
||||||
|
t.normal(1.0f, 0.0f, 0.0f);
|
||||||
|
for (int i = 0; i < D; i++) {
|
||||||
|
t.vertexUV(xp + i + 1 - e, yy + 0, zp + D, (xx + i + 0.5f) * uvScale + uo, (zz + D) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + i + 1 - e, yy + h, zp + D, (xx + i + 0.5f) * uvScale + uo, (zz + D) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + i + 1 - e, yy + h, zp + 0, (xx + i + 0.5f) * uvScale + uo, (zz + 0) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + i + 1 - e, yy + 0, zp + 0, (xx + i + 0.5f) * uvScale + uo, (zz + 0) * uvScale + vo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.color(cr * 0.8f, cg * 0.8f, cb * 0.8f, 0.8f);
|
||||||
|
|
||||||
|
|
||||||
|
if (zPos > -1) {
|
||||||
|
t.normal(0.0f, 0.0f, -1.0f);
|
||||||
|
for (int i = 0; i < D; i++) {
|
||||||
|
t.vertexUV(xp + 0, yy + h, zp + i + 0, (xx + 0) * uvScale + uo, (zz + i + 0.5f) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + D, yy + h, zp + i + 0, (xx + D) * uvScale + uo, (zz + i + 0.5f) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + D, yy + 0, zp + i + 0, (xx + D) * uvScale + uo, (zz + i + 0.5f) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + 0, yy + 0, zp + i + 0, (xx + 0) * uvScale + uo, (zz + i + 0.5f) * uvScale + vo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (zPos <= 1) {
|
||||||
|
t.normal(0.0f, 0.0f, 1.0f);
|
||||||
|
for (int i = 0; i < D; i++) {
|
||||||
|
t.vertexUV(xp + 0, yy + h, zp + i + 1 - e, (xx + 0) * uvScale + uo, (zz + i + 0.5f) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + D, yy + h, zp + i + 1 - e, (xx + D) * uvScale + uo, (zz + i + 0.5f) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + D, yy + 0, zp + i + 1 - e, (xx + D) * uvScale + uo, (zz + i + 0.5f) * uvScale + vo);
|
||||||
|
t.vertexUV(xp + 0, yy + 0, zp + i + 1 - e, (xx + 0) * uvScale + uo, (zz + i + 0.5f) * uvScale + vo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t.endOverrideAndDraw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
}
|
||||||
|
|
||||||
void LevelRenderer::playSound(const std::string& name, float x, float y, float z, float volume, float pitch) {
|
void LevelRenderer::playSound(const std::string& name, float x, float y, float z, float volume, float pitch) {
|
||||||
// @todo: deny sounds here if sound is off (rather than waiting 'til SoundEngine)
|
// @todo: deny sounds here if sound is off (rather than waiting 'til SoundEngine)
|
||||||
float dd = 16;
|
float dd = 16;
|
||||||
|
|
||||||
if (volume > 1) dd *= volume;
|
if (volume > 1) dd *= volume;
|
||||||
if (mc->cameraTargetPlayer->distanceToSqr(x, y, z) < dd * dd) {
|
if (mc->cameraTargetPlayer != NULL && 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;
|
||||||
@@ -1149,6 +1499,7 @@ 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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1259,6 +1610,7 @@ void LevelRenderer::renderHitSelect( Player* player, const HitResult& h, int mod
|
|||||||
|
|
||||||
void LevelRenderer::onGraphicsReset()
|
void LevelRenderer::onGraphicsReset()
|
||||||
{
|
{
|
||||||
|
generateStars();
|
||||||
generateSky();
|
generateSky();
|
||||||
|
|
||||||
// Get new buffers
|
// Get new buffers
|
||||||
|
|||||||
@@ -43,7 +43,9 @@ public:
|
|||||||
void renderDebug(const AABB& b, float a) const;
|
void renderDebug(const AABB& b, float a) const;
|
||||||
|
|
||||||
void renderSky(float alpha);
|
void renderSky(float alpha);
|
||||||
|
void generateStars();
|
||||||
void renderClouds(float alpha);
|
void renderClouds(float alpha);
|
||||||
|
void renderAdvancedClouds(float alpha);
|
||||||
void renderEntities(Vec3 cam, Culler* culler, float a);
|
void renderEntities(Vec3 cam, Culler* culler, float a);
|
||||||
void renderSameAsLast(int layer, float alpha);
|
void renderSameAsLast(int layer, float alpha);
|
||||||
void renderHit(Player* player, const HitResult& h, int mode, /*ItemInstance*/void* inventoryItem, float a);
|
void renderHit(Player* player, const HitResult& h, int mode, /*ItemInstance*/void* inventoryItem, float a);
|
||||||
@@ -67,6 +69,7 @@ public:
|
|||||||
void levelEvent(Player* source, int type, int x, int y, int z, int data);
|
void levelEvent(Player* source, int type, int x, int y, int z, int data);
|
||||||
|
|
||||||
std::string gatherStats1();
|
std::string gatherStats1();
|
||||||
|
std::string gatherStats2();
|
||||||
|
|
||||||
void render(const AABB& b) const;
|
void render(const AABB& b) const;
|
||||||
void onGraphicsReset();
|
void onGraphicsReset();
|
||||||
@@ -116,6 +119,9 @@ private:
|
|||||||
// shredder added again...
|
// shredder added again...
|
||||||
int lastFogType;
|
int lastFogType;
|
||||||
|
|
||||||
|
bool LastTint;
|
||||||
|
bool LastSideTint;
|
||||||
|
|
||||||
int ticks;
|
int ticks;
|
||||||
int starList, skyList, darkList;
|
int starList, skyList, darkList;
|
||||||
|
|
||||||
@@ -124,6 +130,12 @@ private:
|
|||||||
GLuint skyBuffer;
|
GLuint skyBuffer;
|
||||||
int skyVertexCount;
|
int skyVertexCount;
|
||||||
|
|
||||||
|
GLuint voidBuffer;
|
||||||
|
int voidVertexCount;
|
||||||
|
|
||||||
|
GLuint starBuffer;
|
||||||
|
int starVertexCount;
|
||||||
|
|
||||||
// /*public*/ std::vector<TileEntity*> renderableTileEntities;
|
// /*public*/ std::vector<TileEntity*> renderableTileEntities;
|
||||||
Textures* textures;
|
Textures* textures;
|
||||||
// /*private*/ TileRenderer tileRenderer;
|
// /*private*/ TileRenderer tileRenderer;
|
||||||
|
|||||||
49
src/client/renderer/Lighting.cpp
Normal file
49
src/client/renderer/Lighting.cpp
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#include "Lighting.h"
|
||||||
|
#include "gles.h"
|
||||||
|
#include "../Minecraft.h"
|
||||||
|
|
||||||
|
void Lighting::turnOff() {
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
glDisable(GL_LIGHT0);
|
||||||
|
glDisable(GL_LIGHT1);
|
||||||
|
glDisable(GL_COLOR_MATERIAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Lighting::turnOn(Minecraft* minecraft) {
|
||||||
|
if (!minecraft->options.getBooleanValue(OPTIONS_NORMAL_LIGHTING)){ // if normal lighting is false, then just dont use the lighting system at all like in vanilla - shredder
|
||||||
|
turnOff();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
glEnable(GL_NORMALIZE);
|
||||||
|
// if normal lighting is true then enable GLES/OpenGL states to setup lighting
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
glEnable(GL_LIGHT0);
|
||||||
|
glEnable(GL_LIGHT1);
|
||||||
|
glEnable(GL_COLOR_MATERIAL);
|
||||||
|
// glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
|
||||||
|
|
||||||
|
constexpr float a = 0.4f;
|
||||||
|
constexpr float d = 0.6f;
|
||||||
|
constexpr float s = 0.0f;
|
||||||
|
|
||||||
|
|
||||||
|
//Vec3 l = world::phys::Vec3{0.2, 1.0, -0.7}.normalize();
|
||||||
|
constexpr float lightmodel_ambient[] = {a, a, a, 1.0f};
|
||||||
|
constexpr float diffuse[] = {d, d, d, 1.0f};
|
||||||
|
constexpr float ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
constexpr float specular[] = {s, s, s, 1.0f};
|
||||||
|
|
||||||
|
constexpr float pos0[] = {(float)(0.16169041989141428), (float)(0.8084520874101966), (float)(-0.5659164515496377), 0.0f};
|
||||||
|
glLightfv(GL_LIGHT0, GL_POSITION, pos0);
|
||||||
|
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
|
||||||
|
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
|
||||||
|
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
|
||||||
|
|
||||||
|
constexpr float pos1[] = {(float)(-0.16169041989141428), (float)(0.8084520874101966), (float)(0.5659164515496377), 0.0f};
|
||||||
|
glLightfv(GL_LIGHT1, GL_POSITION, pos1);
|
||||||
|
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
|
||||||
|
glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
|
||||||
|
glLightfv(GL_LIGHT1, GL_SPECULAR, specular);
|
||||||
|
glShadeModel(GL_FLAT);
|
||||||
|
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lightmodel_ambient);
|
||||||
|
}
|
||||||
12
src/client/renderer/Lighting.h
Normal file
12
src/client/renderer/Lighting.h
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#ifndef NET_MINECRAFT_CLIENT_RENDERER__Lighting_H__
|
||||||
|
#define NET_MINECRAFT_CLIENT_RENDERER__Lighting_H__
|
||||||
|
|
||||||
|
class Minecraft;
|
||||||
|
class Lighting
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void turnOff();
|
||||||
|
static void turnOn(Minecraft* minecraft);
|
||||||
|
|
||||||
|
};
|
||||||
|
#endif /*NET_MINECRAFT_CLIENT_RENDERER__Lighting_H__*/
|
||||||
@@ -8,7 +8,7 @@ Tesselator Tesselator::instance(sizeof(GLfloat) * MAX_FLOATS); // max size in by
|
|||||||
const int VertexSizeBytes = sizeof(VERTEX);
|
const int VertexSizeBytes = sizeof(VERTEX);
|
||||||
|
|
||||||
Tesselator::Tesselator( int size )
|
Tesselator::Tesselator( int size )
|
||||||
: size(size),
|
: size(size),
|
||||||
vertices(0),
|
vertices(0),
|
||||||
u(0), v(0),
|
u(0), v(0),
|
||||||
_color(0),
|
_color(0),
|
||||||
@@ -20,7 +20,7 @@ Tesselator::Tesselator( int size )
|
|||||||
_noColor(false),
|
_noColor(false),
|
||||||
mode(0),
|
mode(0),
|
||||||
xo(0), yo(0), zo(0),
|
xo(0), yo(0), zo(0),
|
||||||
_normal(0),
|
_nx(0), _ny(0), _nz(0),
|
||||||
_sx(1), _sy(1),
|
_sx(1), _sy(1),
|
||||||
|
|
||||||
tesselating(false),
|
tesselating(false),
|
||||||
@@ -112,7 +112,7 @@ RenderChunk Tesselator::end( bool useMine, int bufferId )
|
|||||||
glEnableClientState2(GL_COLOR_ARRAY);
|
glEnableClientState2(GL_COLOR_ARRAY);
|
||||||
}
|
}
|
||||||
if (hasNormal) {
|
if (hasNormal) {
|
||||||
glNormalPointer(GL_BYTE, VertexSizeBytes, (GLvoid*) (6 * 4));
|
glNormalPointer(GL_FLOAT, VertexSizeBytes, (GLvoid*) (6 * 4));
|
||||||
glEnableClientState2(GL_NORMAL_ARRAY);
|
glEnableClientState2(GL_NORMAL_ARRAY);
|
||||||
}
|
}
|
||||||
glVertexPointer2(3, GL_FLOAT, VertexSizeBytes, 0);
|
glVertexPointer2(3, GL_FLOAT, VertexSizeBytes, 0);
|
||||||
@@ -278,9 +278,11 @@ void Tesselator::vertex( float x, float y, float z )
|
|||||||
if (hasColor) {
|
if (hasColor) {
|
||||||
dst.color = src.color;
|
dst.color = src.color;
|
||||||
}
|
}
|
||||||
//if (hasNormal) {
|
if (hasNormal) {
|
||||||
// dst.normal = src.normal;
|
dst.nx = src.nx;
|
||||||
//}
|
dst.ny = src.ny;
|
||||||
|
dst.nz = src.nz;
|
||||||
|
}
|
||||||
|
|
||||||
dst.x = src.x;
|
dst.x = src.x;
|
||||||
dst.y = src.y;
|
dst.y = src.y;
|
||||||
@@ -301,9 +303,11 @@ void Tesselator::vertex( float x, float y, float z )
|
|||||||
if (hasColor) {
|
if (hasColor) {
|
||||||
vertex.color = _color;
|
vertex.color = _color;
|
||||||
}
|
}
|
||||||
//if (hasNormal) {
|
if (hasNormal) {
|
||||||
// vertex.normal = _normal;
|
vertex.nx = _nx;
|
||||||
//}
|
vertex.ny = _ny;
|
||||||
|
vertex.nz = _nz;
|
||||||
|
}
|
||||||
|
|
||||||
vertex.x = _sx * (x + xo);
|
vertex.x = _sx * (x + xo);
|
||||||
vertex.y = _sy * (y + yo);
|
vertex.y = _sy * (y + yo);
|
||||||
@@ -332,18 +336,22 @@ void Tesselator::setAccessMode(int mode)
|
|||||||
|
|
||||||
void Tesselator::normal( float x, float y, float z )
|
void Tesselator::normal( float x, float y, float z )
|
||||||
{
|
{
|
||||||
static int _warn_t = 0;
|
//static int _warn_t = 0;
|
||||||
if ((++_warn_t & 32767) == 1)
|
//if ((++_warn_t & 32767) == 1)
|
||||||
LOGI("WARNING: Can't use normals (Tesselator::normal)\n");
|
// LOGI("WARNING: Can't use normals (Tesselator::normal)\n");
|
||||||
return;
|
//return;
|
||||||
|
|
||||||
if (!tesselating) printf("But..");
|
if (!tesselating) printf("But..");
|
||||||
hasNormal = true;
|
hasNormal = true;
|
||||||
char xx = (char) (x * 128);
|
//char xx = (char) (x * 128);
|
||||||
char yy = (char) (y * 127);
|
//char yy = (char) (y * 127);
|
||||||
char zz = (char) (z * 127);
|
//char zz = (char) (z * 127);
|
||||||
|
|
||||||
_normal = xx | (yy << 8) | (zz << 16);
|
//_normal = xx | (yy << 8) | (zz << 16);
|
||||||
|
// trying a new thing hopefully works
|
||||||
|
this->_nx = x;
|
||||||
|
this->_ny = y;
|
||||||
|
this->_nz = z;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tesselator::offset( float xo, float yo, float zo ) {
|
void Tesselator::offset( float xo, float yo, float zo ) {
|
||||||
@@ -404,10 +412,10 @@ void Tesselator::draw()
|
|||||||
//glColorPointer2(4, GL_UNSIGNED_BYTE, VertexSizeBytes, (GLvoid*) &_varray->color);
|
//glColorPointer2(4, GL_UNSIGNED_BYTE, VertexSizeBytes, (GLvoid*) &_varray->color);
|
||||||
glEnableClientState2(GL_COLOR_ARRAY);
|
glEnableClientState2(GL_COLOR_ARRAY);
|
||||||
}
|
}
|
||||||
//if (hasNormal) {
|
if (hasNormal) {
|
||||||
// glNormalPointer(GL_BYTE, VertexSizeBytes, (GLvoid*) (6 * 4));
|
glNormalPointer(GL_FLOAT, VertexSizeBytes, (GLvoid*) (6 * 4));
|
||||||
// glEnableClientState2(GL_NORMAL_ARRAY);
|
glEnableClientState2(GL_NORMAL_ARRAY);
|
||||||
//}
|
}
|
||||||
//glVertexPointer2(3, GL_FLOAT, VertexSizeBytes, (GLvoid*)&_varray);
|
//glVertexPointer2(3, GL_FLOAT, VertexSizeBytes, (GLvoid*)&_varray);
|
||||||
glVertexPointer2(3, GL_FLOAT, VertexSizeBytes, 0);
|
glVertexPointer2(3, GL_FLOAT, VertexSizeBytes, 0);
|
||||||
glEnableClientState2(GL_VERTEX_ARRAY);
|
glEnableClientState2(GL_VERTEX_ARRAY);
|
||||||
@@ -421,7 +429,7 @@ void Tesselator::draw()
|
|||||||
glDisableClientState2(GL_VERTEX_ARRAY);
|
glDisableClientState2(GL_VERTEX_ARRAY);
|
||||||
if (hasTexture) glDisableClientState2(GL_TEXTURE_COORD_ARRAY);
|
if (hasTexture) glDisableClientState2(GL_TEXTURE_COORD_ARRAY);
|
||||||
if (hasColor) glDisableClientState2(GL_COLOR_ARRAY);
|
if (hasColor) glDisableClientState2(GL_COLOR_ARRAY);
|
||||||
//if (hasNormal) glDisableClientState2(GL_NORMAL_ARRAY);
|
if (hasNormal) glDisableClientState2(GL_NORMAL_ARRAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
extern const int VertexSizeBytes;
|
extern const int VertexSizeBytes;
|
||||||
|
|
||||||
typedef VertexDeclPTC VERTEX;
|
typedef VertexDeclPTCN VERTEX;
|
||||||
typedef std::map<GLuint, GLsizei> IntGLMap;
|
typedef std::map<GLuint, GLsizei> IntGLMap;
|
||||||
|
|
||||||
|
|
||||||
@@ -98,7 +98,9 @@ private:
|
|||||||
float xo, yo, zo;
|
float xo, yo, zo;
|
||||||
float u, v;
|
float u, v;
|
||||||
unsigned int _color;
|
unsigned int _color;
|
||||||
int _normal;
|
// int _normal; // trying a new thing
|
||||||
|
float _nx, _ny, _nz;
|
||||||
|
|
||||||
float _sx, _sy;
|
float _sx, _sy;
|
||||||
|
|
||||||
bool hasColor;
|
bool hasColor;
|
||||||
|
|||||||
@@ -19,8 +19,10 @@
|
|||||||
#include "tileentity/TileEntityRenderer.h"
|
#include "tileentity/TileEntityRenderer.h"
|
||||||
#include "EntityTileRenderer.h"
|
#include "EntityTileRenderer.h"
|
||||||
|
|
||||||
TileRenderer::TileRenderer( LevelSource* level /* = NULL */ )
|
bool TileRenderer::sideTinting = false;
|
||||||
: level(level),
|
|
||||||
|
TileRenderer::TileRenderer(LevelSource* level /* = NULL */ )
|
||||||
|
: level(level),
|
||||||
fixedTexture(-1),
|
fixedTexture(-1),
|
||||||
xFlipTexture(false),
|
xFlipTexture(false),
|
||||||
noCulling(false),
|
noCulling(false),
|
||||||
@@ -58,6 +60,11 @@ bool TileRenderer::tesselateBlockInWorld( Tile* tt, int x, int y, int z, float r
|
|||||||
float c2 = 0.8f;
|
float c2 = 0.8f;
|
||||||
float c3 = 0.6f;
|
float c3 = 0.6f;
|
||||||
|
|
||||||
|
// added these to get biome color and save it before its overriden - shredder
|
||||||
|
float biomeR = r;
|
||||||
|
float biomeG = g;
|
||||||
|
float biomeB = b;
|
||||||
|
|
||||||
|
|
||||||
float r11 = c11 * r;
|
float r11 = c11 * r;
|
||||||
float g11 = c11 * g;
|
float g11 = c11 * g;
|
||||||
@@ -101,6 +108,10 @@ bool TileRenderer::tesselateBlockInWorld( Tile* tt, int x, int y, int z, float r
|
|||||||
if (tt->zz0 > 0) br = centerBrightness;
|
if (tt->zz0 > 0) br = centerBrightness;
|
||||||
t.color(r2 * br, g2 * br, b2 * br);
|
t.color(r2 * br, g2 * br, b2 * br);
|
||||||
renderNorth(tt, xf, yf, zf, tt->getTexture(level, x, y, z, 2));
|
renderNorth(tt, xf, yf, zf, tt->getTexture(level, x, y, z, 2));
|
||||||
|
if ((tt->getTexture(level, x, y, z, 2) == 3) && sideTinting) { // checking if the texture from terrain.png is the normal grass side texture
|
||||||
|
t.color(c2 * br * biomeR, c2 * br * biomeG, c2 * br * biomeB);
|
||||||
|
renderNorth(tt, xf, yf, zf, 38); // rendering an extra face over the side of the cube that is a grayscale grass fringe tinted by t.color using biome colors, kinda inefficient
|
||||||
|
}
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,6 +120,10 @@ bool TileRenderer::tesselateBlockInWorld( Tile* tt, int x, int y, int z, float r
|
|||||||
if (tt->zz1 < 1) br = centerBrightness;
|
if (tt->zz1 < 1) br = centerBrightness;
|
||||||
t.color(r2 * br, g2 * br, b2 * br);
|
t.color(r2 * br, g2 * br, b2 * br);
|
||||||
renderSouth(tt, xf, yf, zf, tt->getTexture(level, x, y, z, 3));
|
renderSouth(tt, xf, yf, zf, tt->getTexture(level, x, y, z, 3));
|
||||||
|
if ((tt->getTexture(level, x, y, z, 3) == 3) && sideTinting){ // checking if the texture from terrain.png is the normal grass side texture
|
||||||
|
t.color(c2 * br * biomeR, c2 * br * biomeG, c2 * br * biomeB);
|
||||||
|
renderSouth(tt, xf, yf, zf, 38); // rendering an extra face over the side of the cube that is a grayscale grass fringe tinted by t.color using biome colors, kinda inefficient
|
||||||
|
}
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,6 +132,10 @@ bool TileRenderer::tesselateBlockInWorld( Tile* tt, int x, int y, int z, float r
|
|||||||
if (tt->xx0 > 0) br = centerBrightness;
|
if (tt->xx0 > 0) br = centerBrightness;
|
||||||
t.color(r3 * br, g3 * br, b3 * br);
|
t.color(r3 * br, g3 * br, b3 * br);
|
||||||
renderWest(tt, xf, yf, zf, tt->getTexture(level, x, y, z, 4));
|
renderWest(tt, xf, yf, zf, tt->getTexture(level, x, y, z, 4));
|
||||||
|
if ((tt->getTexture(level, x, y, z, 4) == 3) && sideTinting) { // checking if the texture from terrain.png is the normal grass side texture
|
||||||
|
t.color(c2 * br * biomeR, c2 * br * biomeG, c2 * br * biomeB);
|
||||||
|
renderWest(tt, xf, yf, zf, 38); // rendering an extra face over the side of the cube that is a grayscale grass fringe tinted by t.color using biome colors, kinda inefficient
|
||||||
|
}
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,6 +144,10 @@ bool TileRenderer::tesselateBlockInWorld( Tile* tt, int x, int y, int z, float r
|
|||||||
if (tt->xx1 < 1) br = centerBrightness;
|
if (tt->xx1 < 1) br = centerBrightness;
|
||||||
t.color(r3 * br, g3 * br, b3 * br);
|
t.color(r3 * br, g3 * br, b3 * br);
|
||||||
renderEast(tt, xf, yf, zf, tt->getTexture(level, x, y, z, 5));
|
renderEast(tt, xf, yf, zf, tt->getTexture(level, x, y, z, 5));
|
||||||
|
if ((tt->getTexture(level, x, y, z, 5) == 3) && sideTinting) { // checking if the texture from terrain.png is the normal grass side texture
|
||||||
|
t.color(c2 * br * biomeR, c2 * br * biomeG, c2 * br * biomeB);
|
||||||
|
renderEast(tt, xf, yf, zf, 38); // rendering an extra face over the side of the cube that is a grayscale grass fringe tinted by t.color using biome colors, kinda inefficient
|
||||||
|
}
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,7 +248,7 @@ bool TileRenderer::tesselateTorchInWorld( Tile* tt, int x, int y, int z )
|
|||||||
|
|
||||||
bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
||||||
{
|
{
|
||||||
// @todo: fire alpha transparency seems to be scuffed, also it seems i might have messed up the second layer while porting from lce/java , need to look into it - shredder
|
// fire transparency has been fixed - shredder
|
||||||
|
|
||||||
Tesselator& t = Tesselator::instance;
|
Tesselator& t = Tesselator::instance;
|
||||||
|
|
||||||
@@ -1197,6 +1220,15 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusion( Tile* tt, int pX,
|
|||||||
c4g *= ll4;
|
c4g *= ll4;
|
||||||
c4b *= ll4;
|
c4b *= ll4;
|
||||||
renderNorth(tt, (float) pX, (float) pY, (float) pZ, tt->getTexture(level, pX, pY, pZ, 2));
|
renderNorth(tt, (float) pX, (float) pY, (float) pZ, tt->getTexture(level, pX, pY, pZ, 2));
|
||||||
|
if (tt->getTexture(level, pX, pY, pZ, 2) == 3 && sideTinting)
|
||||||
|
{
|
||||||
|
c1r *= pBaseRed; c1g *= pBaseGreen; c1b *= pBaseBlue;
|
||||||
|
c2r *= pBaseRed; c2g *= pBaseGreen; c2b *= pBaseBlue;
|
||||||
|
c3r *= pBaseRed; c3g *= pBaseGreen; c3b *= pBaseBlue;
|
||||||
|
c4r *= pBaseRed; c4g *= pBaseGreen; c4b *= pBaseBlue;
|
||||||
|
|
||||||
|
renderNorth(tt, (float) pX, (float) pY, (float) pZ, 38);
|
||||||
|
}
|
||||||
i = true;
|
i = true;
|
||||||
}
|
}
|
||||||
if ((noCulling) || (tt->shouldRenderFace(level, pX, pY, pZ + 1, 3))) {
|
if ((noCulling) || (tt->shouldRenderFace(level, pX, pY, pZ + 1, 3))) {
|
||||||
@@ -1250,6 +1282,15 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusion( Tile* tt, int pX,
|
|||||||
c4g *= ll4;
|
c4g *= ll4;
|
||||||
c4b *= ll4;
|
c4b *= ll4;
|
||||||
renderSouth(tt, (float) pX, (float) pY, (float) pZ, tt->getTexture(level, pX, pY, pZ, 3));
|
renderSouth(tt, (float) pX, (float) pY, (float) pZ, tt->getTexture(level, pX, pY, pZ, 3));
|
||||||
|
if (tt->getTexture(level, pX, pY, pZ, 3) == 3 && sideTinting)
|
||||||
|
{
|
||||||
|
c1r *= pBaseRed; c1g *= pBaseGreen; c1b *= pBaseBlue;
|
||||||
|
c2r *= pBaseRed; c2g *= pBaseGreen; c2b *= pBaseBlue;
|
||||||
|
c3r *= pBaseRed; c3g *= pBaseGreen; c3b *= pBaseBlue;
|
||||||
|
c4r *= pBaseRed; c4g *= pBaseGreen; c4b *= pBaseBlue;
|
||||||
|
|
||||||
|
renderSouth(tt, (float) pX, (float) pY, (float) pZ, 38);
|
||||||
|
}
|
||||||
i = true;
|
i = true;
|
||||||
}
|
}
|
||||||
if ((noCulling) || (tt->shouldRenderFace(level, pX - 1, pY, pZ, 4))) {
|
if ((noCulling) || (tt->shouldRenderFace(level, pX - 1, pY, pZ, 4))) {
|
||||||
@@ -1302,6 +1343,15 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusion( Tile* tt, int pX,
|
|||||||
c4g *= ll4;
|
c4g *= ll4;
|
||||||
c4b *= ll4;
|
c4b *= ll4;
|
||||||
renderWest(tt, (float) pX, (float) pY, (float) pZ, tt->getTexture(level, pX, pY, pZ, 4));
|
renderWest(tt, (float) pX, (float) pY, (float) pZ, tt->getTexture(level, pX, pY, pZ, 4));
|
||||||
|
if (tt->getTexture(level, pX, pY, pZ, 4) == 3 && sideTinting)
|
||||||
|
{
|
||||||
|
c1r *= pBaseRed; c1g *= pBaseGreen; c1b *= pBaseBlue;
|
||||||
|
c2r *= pBaseRed; c2g *= pBaseGreen; c2b *= pBaseBlue;
|
||||||
|
c3r *= pBaseRed; c3g *= pBaseGreen; c3b *= pBaseBlue;
|
||||||
|
c4r *= pBaseRed; c4g *= pBaseGreen; c4b *= pBaseBlue;
|
||||||
|
|
||||||
|
renderWest(tt, (float) pX, (float) pY, (float) pZ, 38);
|
||||||
|
}
|
||||||
i = true;
|
i = true;
|
||||||
}
|
}
|
||||||
if ((noCulling) || (tt->shouldRenderFace(level, pX + 1, pY, pZ, 5))) {
|
if ((noCulling) || (tt->shouldRenderFace(level, pX + 1, pY, pZ, 5))) {
|
||||||
@@ -1355,6 +1405,15 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusion( Tile* tt, int pX,
|
|||||||
c4b *= ll4;
|
c4b *= ll4;
|
||||||
|
|
||||||
renderEast(tt, (float) pX, (float) pY, (float) pZ, tt->getTexture(level, pX, pY, pZ, 5));
|
renderEast(tt, (float) pX, (float) pY, (float) pZ, tt->getTexture(level, pX, pY, pZ, 5));
|
||||||
|
if (tt->getTexture(level, pX, pY, pZ, 5) == 3 && sideTinting)
|
||||||
|
{
|
||||||
|
c1r *= pBaseRed; c1g *= pBaseGreen; c1b *= pBaseBlue;
|
||||||
|
c2r *= pBaseRed; c2g *= pBaseGreen; c2b *= pBaseBlue;
|
||||||
|
c3r *= pBaseRed; c3g *= pBaseGreen; c3b *= pBaseBlue;
|
||||||
|
c4r *= pBaseRed; c4g *= pBaseGreen; c4b *= pBaseBlue;
|
||||||
|
|
||||||
|
renderEast(tt, (float) pX, (float) pY, (float) pZ, 38);
|
||||||
|
}
|
||||||
i = true;
|
i = true;
|
||||||
}
|
}
|
||||||
applyAmbienceOcclusion = false;
|
applyAmbienceOcclusion = false;
|
||||||
@@ -1403,7 +1462,7 @@ bool TileRenderer::tesselateCactusInWorld(Tile* tt, int x, int y, int z, float r
|
|||||||
if (noCulling || tt->shouldRenderFace(level, x, y - 1, z, 0)) {
|
if (noCulling || tt->shouldRenderFace(level, x, y - 1, z, 0)) {
|
||||||
float br = tt->getBrightness(level, x, y - 1, z);
|
float br = tt->getBrightness(level, x, y - 1, z);
|
||||||
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
||||||
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
||||||
t.color(r10 * br, g10 * br, b10 * br);
|
t.color(r10 * br, g10 * br, b10 * br);
|
||||||
renderFaceDown(tt, X, Y, Z, tt->getTexture(level, x, y, z, 0));
|
renderFaceDown(tt, X, Y, Z, tt->getTexture(level, x, y, z, 0));
|
||||||
changed = true;
|
changed = true;
|
||||||
@@ -1413,7 +1472,7 @@ bool TileRenderer::tesselateCactusInWorld(Tile* tt, int x, int y, int z, float r
|
|||||||
float br = tt->getBrightness(level, x, y + 1, z);
|
float br = tt->getBrightness(level, x, y + 1, z);
|
||||||
if (tt->yy1 != 1 && !tt->material->isLiquid()) br = centerBrightness;
|
if (tt->yy1 != 1 && !tt->material->isLiquid()) br = centerBrightness;
|
||||||
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
||||||
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
||||||
t.color(r11 * br, g11 * br, b11 * br);
|
t.color(r11 * br, g11 * br, b11 * br);
|
||||||
renderFaceUp(tt, X, Y, Z, tt->getTexture(level, x, y, z, 1));
|
renderFaceUp(tt, X, Y, Z, tt->getTexture(level, x, y, z, 1));
|
||||||
changed = true;
|
changed = true;
|
||||||
@@ -1423,7 +1482,7 @@ bool TileRenderer::tesselateCactusInWorld(Tile* tt, int x, int y, int z, float r
|
|||||||
float br = tt->getBrightness(level, x, y, z - 1);
|
float br = tt->getBrightness(level, x, y, z - 1);
|
||||||
if (tt->zz0 > 0) br = centerBrightness;
|
if (tt->zz0 > 0) br = centerBrightness;
|
||||||
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
||||||
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
||||||
t.color(r2 * br, g2 * br, b2 * br);
|
t.color(r2 * br, g2 * br, b2 * br);
|
||||||
t.addOffset(0, 0, s);
|
t.addOffset(0, 0, s);
|
||||||
renderNorth(tt, X, Y, Z, tt->getTexture(level, x, y, z, 2));
|
renderNorth(tt, X, Y, Z, tt->getTexture(level, x, y, z, 2));
|
||||||
@@ -1435,7 +1494,7 @@ bool TileRenderer::tesselateCactusInWorld(Tile* tt, int x, int y, int z, float r
|
|||||||
float br = tt->getBrightness(level, x, y, z + 1);
|
float br = tt->getBrightness(level, x, y, z + 1);
|
||||||
if (tt->zz1 < 1) br = centerBrightness;
|
if (tt->zz1 < 1) br = centerBrightness;
|
||||||
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
||||||
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
||||||
t.color(r2 * br, g2 * br, b2 * br);
|
t.color(r2 * br, g2 * br, b2 * br);
|
||||||
t.addOffset(0, 0, -s);
|
t.addOffset(0, 0, -s);
|
||||||
renderSouth(tt, X, Y, Z, tt->getTexture(level, x, y, z, 3));
|
renderSouth(tt, X, Y, Z, tt->getTexture(level, x, y, z, 3));
|
||||||
@@ -1447,7 +1506,7 @@ bool TileRenderer::tesselateCactusInWorld(Tile* tt, int x, int y, int z, float r
|
|||||||
float br = tt->getBrightness(level, x - 1, y, z);
|
float br = tt->getBrightness(level, x - 1, y, z);
|
||||||
if (tt->xx0 > 0) br = centerBrightness;
|
if (tt->xx0 > 0) br = centerBrightness;
|
||||||
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
||||||
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
||||||
t.color(r3 * br, g3 * br, b3 * br);
|
t.color(r3 * br, g3 * br, b3 * br);
|
||||||
t.addOffset(s, 0, 0);
|
t.addOffset(s, 0, 0);
|
||||||
renderWest(tt, X, Y, Z, tt->getTexture(level, x, y, z, 4));
|
renderWest(tt, X, Y, Z, tt->getTexture(level, x, y, z, 4));
|
||||||
@@ -1459,7 +1518,7 @@ bool TileRenderer::tesselateCactusInWorld(Tile* tt, int x, int y, int z, float r
|
|||||||
float br = tt->getBrightness(level, x + 1, y, z);
|
float br = tt->getBrightness(level, x + 1, y, z);
|
||||||
if (tt->xx1 < 1) br = centerBrightness;
|
if (tt->xx1 < 1) br = centerBrightness;
|
||||||
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
// if (Tile::lightEmission[tt->id] > br*Level.MAX_BRIGHTNESS) br =
|
||||||
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
// Tile::lightEmission[tt->id]/Level.MAX_BRIGHTNESS;
|
||||||
t.color(r3 * br, g3 * br, b3 * br);
|
t.color(r3 * br, g3 * br, b3 * br);
|
||||||
t.addOffset(-s, 0, 0);
|
t.addOffset(-s, 0, 0);
|
||||||
renderEast(tt, X, Y, Z, tt->getTexture(level, x, y, z, 5));
|
renderEast(tt, X, Y, Z, tt->getTexture(level, x, y, z, 5));
|
||||||
@@ -2309,29 +2368,53 @@ void TileRenderer::renderTile( Tile* tile, int data )
|
|||||||
{
|
{
|
||||||
Tesselator& t = Tesselator::instance;
|
Tesselator& t = Tesselator::instance;
|
||||||
|
|
||||||
t.color(0xff, 0xff, 0xff);
|
t.color(0xff, 0xff, 0xff); // i disabled this, this is normally enabled in normal mcpe see if this fits OPTION_NORMAL_LIGHTING - shredder
|
||||||
int shape = tile->getRenderShape();
|
int shape = tile->getRenderShape();
|
||||||
|
|
||||||
if (shape == Tile::SHAPE_BLOCK) {
|
if (shape == Tile::SHAPE_BLOCK) {
|
||||||
tile->updateDefaultShape();
|
tile->updateDefaultShape();
|
||||||
t.addOffset(-0.5f, -0.5f, -0.5f);
|
t.addOffset(-0.5f, -0.5f, -0.5f);
|
||||||
t.begin();
|
t.begin();
|
||||||
|
|
||||||
|
t.normal(0.0f, -1.0f, 0.0f);// most normal calls in this file has been added me since they existed in java - shredder
|
||||||
|
|
||||||
renderFaceDown(tile, 0, 0, 0, tile->getTexture(0, data));
|
renderFaceDown(tile, 0, 0, 0, tile->getTexture(0, data));
|
||||||
|
|
||||||
|
t.normal(0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
renderFaceUp(tile, 0, 0, 0, tile->getTexture(1, data));
|
renderFaceUp(tile, 0, 0, 0, tile->getTexture(1, data));
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, -1.0f);
|
||||||
|
|
||||||
renderNorth(tile, 0, 0, 0, tile->getTexture(2, data));
|
renderNorth(tile, 0, 0, 0, tile->getTexture(2, data));
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
renderSouth(tile, 0, 0, 0, tile->getTexture(3, data));
|
renderSouth(tile, 0, 0, 0, tile->getTexture(3, data));
|
||||||
|
|
||||||
|
t.normal(-1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
renderWest(tile, 0, 0, 0, tile->getTexture(4, data));
|
renderWest(tile, 0, 0, 0, tile->getTexture(4, data));
|
||||||
|
|
||||||
|
t.normal(1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
renderEast(tile, 0, 0, 0, tile->getTexture(5, data));
|
renderEast(tile, 0, 0, 0, tile->getTexture(5, data));
|
||||||
t.draw();
|
t.draw();
|
||||||
|
|
||||||
t.addOffset(0.5f, 0.5f, 0.5f);
|
t.addOffset(0.5f, 0.5f, 0.5f);
|
||||||
|
|
||||||
} else if (shape == Tile::SHAPE_CROSS_TEXTURE) {
|
} else if (shape == Tile::SHAPE_CROSS_TEXTURE) { // uhh java has this but is this even ever used??? - shredder
|
||||||
t.begin();
|
t.begin();
|
||||||
|
|
||||||
|
t.normal(0.0f, -1.0f, 0.0f);
|
||||||
|
|
||||||
tesselateCrossTexture(tile, data, -0.5f, -0.5f, -0.5f);
|
tesselateCrossTexture(tile, data, -0.5f, -0.5f, -0.5f);
|
||||||
t.draw();
|
t.draw();
|
||||||
} else if(shape == Tile::SHAPE_STEM) {
|
} else if(shape == Tile::SHAPE_STEM) {
|
||||||
t.begin();
|
t.begin();
|
||||||
|
|
||||||
|
t.normal(0.0f, -1.0f, 0.0f);
|
||||||
|
|
||||||
tile->updateDefaultShape();
|
tile->updateDefaultShape();
|
||||||
tesselateStemTexture(tile, data, tile->yy1, -0.5f, -0.5f, -0.5f);
|
tesselateStemTexture(tile, data, tile->yy1, -0.5f, -0.5f, -0.5f);
|
||||||
t.draw();
|
t.draw();
|
||||||
@@ -2340,16 +2423,39 @@ void TileRenderer::renderTile( Tile* tile, int data )
|
|||||||
t.offset(-0.5f, -0.5f, -0.5f);
|
t.offset(-0.5f, -0.5f, -0.5f);
|
||||||
float s = 1 / 16.0f;
|
float s = 1 / 16.0f;
|
||||||
t.begin();
|
t.begin();
|
||||||
|
|
||||||
|
t.normal(0.0f, -1.0f, 0.0f);
|
||||||
|
|
||||||
renderFaceDown(tile, 0, 0, 0, tile->getTexture(0));
|
renderFaceDown(tile, 0, 0, 0, tile->getTexture(0));
|
||||||
|
|
||||||
|
t.normal(0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
renderFaceUp(tile, 0, 0, 0, tile->getTexture(1));
|
renderFaceUp(tile, 0, 0, 0, tile->getTexture(1));
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, -1.0f);
|
||||||
|
|
||||||
t.addOffset(0, 0, s);
|
t.addOffset(0, 0, s);
|
||||||
|
|
||||||
|
|
||||||
renderNorth(tile, 0, 0, 0, tile->getTexture(2));
|
renderNorth(tile, 0, 0, 0, tile->getTexture(2));
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
t.addOffset(0, 0, -s);
|
t.addOffset(0, 0, -s);
|
||||||
t.addOffset(0, 0, -s);
|
t.addOffset(0, 0, -s);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
renderSouth(tile, 0, 0, 0, tile->getTexture(3));
|
renderSouth(tile, 0, 0, 0, tile->getTexture(3));
|
||||||
|
|
||||||
|
t.normal(-1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
t.addOffset(0, 0, s);
|
t.addOffset(0, 0, s);
|
||||||
t.addOffset(s, 0, 0);
|
t.addOffset(s, 0, 0);
|
||||||
renderWest(tile, 0, 0, 0, tile->getTexture(4));
|
renderWest(tile, 0, 0, 0, tile->getTexture(4));
|
||||||
|
|
||||||
|
t.normal(1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
t.addOffset(-s, 0, 0);
|
t.addOffset(-s, 0, 0);
|
||||||
t.addOffset(-s, 0, 0);
|
t.addOffset(-s, 0, 0);
|
||||||
renderEast(tile, 0, 0, 0, tile->getTexture(5));
|
renderEast(tile, 0, 0, 0, tile->getTexture(5));
|
||||||
@@ -2363,7 +2469,7 @@ void TileRenderer::renderTile( Tile* tile, int data )
|
|||||||
//} else if (shape == Tile::SHAPE_TORCH) {
|
//} else if (shape == Tile::SHAPE_TORCH) {
|
||||||
//// t.begin();
|
//// t.begin();
|
||||||
//// t.normal(0, -1, 0);
|
//// t.normal(0, -1, 0);
|
||||||
//// tesselateTorch(tile, -0.5f, -0.5f, -0.5f, 0, 0);
|
/// tesselateTorch(tile, -0.5f, -0.5f, -0.5f, 0, 0);
|
||||||
//// t.end();
|
//// t.end();
|
||||||
} else if (shape == Tile::SHAPE_ENTITYTILE_ANIMATED) {
|
} else if (shape == Tile::SHAPE_ENTITYTILE_ANIMATED) {
|
||||||
EntityTileRenderer::instance->render(tile, data, 1.0f);
|
EntityTileRenderer::instance->render(tile, data, 1.0f);
|
||||||
@@ -2375,11 +2481,23 @@ void TileRenderer::renderTile( Tile* tile, int data )
|
|||||||
if (i == 0) tile->setShape(0, 0, 0, 1, 1, 0.5f);
|
if (i == 0) tile->setShape(0, 0, 0, 1, 1, 0.5f);
|
||||||
if (i == 1) tile->setShape(0, 0, 0.5f, 1, 0.5f, 1);
|
if (i == 1) tile->setShape(0, 0, 0.5f, 1, 0.5f, 1);
|
||||||
|
|
||||||
|
|
||||||
|
t.normal(0.0f, -1.0f, 0.0f);
|
||||||
renderFaceDown(tile, 0, 0, 0, tile->getTexture(0));
|
renderFaceDown(tile, 0, 0, 0, tile->getTexture(0));
|
||||||
|
|
||||||
|
t.normal(0.0f, 1.0f, 0.0f);
|
||||||
renderFaceUp(tile, 0, 0, 0, tile->getTexture(1));
|
renderFaceUp(tile, 0, 0, 0, tile->getTexture(1));
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, -1.0f);
|
||||||
renderNorth(tile, 0, 0, 0, tile->getTexture(2));
|
renderNorth(tile, 0, 0, 0, tile->getTexture(2));
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, 1.0f);
|
||||||
renderSouth(tile, 0, 0, 0, tile->getTexture(3));
|
renderSouth(tile, 0, 0, 0, tile->getTexture(3));
|
||||||
|
|
||||||
|
t.normal(-1.0f, 0.0f, 0.0f);
|
||||||
renderWest(tile, 0, 0, 0, tile->getTexture(4));
|
renderWest(tile, 0, 0, 0, tile->getTexture(4));
|
||||||
|
|
||||||
|
t.normal(1.0f, 0.0f, 0.0f);
|
||||||
renderEast(tile, 0, 0, 0, tile->getTexture(5));
|
renderEast(tile, 0, 0, 0, tile->getTexture(5));
|
||||||
}
|
}
|
||||||
t.draw();
|
t.draw();
|
||||||
@@ -2396,11 +2514,22 @@ void TileRenderer::renderTile( Tile* tile, int data )
|
|||||||
if (i == 2) tile->setShape(0.5f - w, 1 - w * 3, -w * 2, 0.5f + w, 1 - w, 1 + w * 2);
|
if (i == 2) tile->setShape(0.5f - w, 1 - w * 3, -w * 2, 0.5f + w, 1 - w, 1 + w * 2);
|
||||||
if (i == 3) tile->setShape(0.5f - w, 0.5f - w * 3, -w * 2, 0.5f + w, 0.5f - w, 1 + w * 2);
|
if (i == 3) tile->setShape(0.5f - w, 0.5f - w * 3, -w * 2, 0.5f + w, 0.5f - w, 1 + w * 2);
|
||||||
|
|
||||||
|
t.normal(0.0f, -1.0f, 0.0f);
|
||||||
renderFaceDown(tile, 0, 0, 0, tile->getTexture(0));
|
renderFaceDown(tile, 0, 0, 0, tile->getTexture(0));
|
||||||
|
|
||||||
|
t.normal(0.0f, 1.0f, 0.0f);
|
||||||
renderFaceUp(tile, 0, 0, 0, tile->getTexture(1));
|
renderFaceUp(tile, 0, 0, 0, tile->getTexture(1));
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, -1.0f);
|
||||||
renderNorth(tile, 0, 0, 0, tile->getTexture(2));
|
renderNorth(tile, 0, 0, 0, tile->getTexture(2));
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, 1.0f);
|
||||||
renderSouth(tile, 0, 0, 0, tile->getTexture(3));
|
renderSouth(tile, 0, 0, 0, tile->getTexture(3));
|
||||||
|
|
||||||
|
t.normal(-1.0f, 0.0f, 0.0f);
|
||||||
renderWest(tile, 0, 0, 0, tile->getTexture(4));
|
renderWest(tile, 0, 0, 0, tile->getTexture(4));
|
||||||
|
|
||||||
|
t.normal(1.0f, 0.0f, 0.0f);
|
||||||
renderEast(tile, 0, 0, 0, tile->getTexture(5));
|
renderEast(tile, 0, 0, 0, tile->getTexture(5));
|
||||||
}
|
}
|
||||||
t.draw();
|
t.draw();
|
||||||
@@ -2415,11 +2544,22 @@ void TileRenderer::renderTile( Tile* tile, int data )
|
|||||||
if (i == 1) tile->setShape(0.5f - w, .3f, 1 - w * 2, 0.5f + w, 1, 1);
|
if (i == 1) tile->setShape(0.5f - w, .3f, 1 - w * 2, 0.5f + w, 1, 1);
|
||||||
if (i == 2) tile->setShape(0.5f - w, .5f, w * 2, 0.5f + w, 1 - w, 1 - w * 2);
|
if (i == 2) tile->setShape(0.5f - w, .5f, w * 2, 0.5f + w, 1 - w, 1 - w * 2);
|
||||||
|
|
||||||
renderFaceUp(tile, 0, 0, 0, tile->getTexture(0));
|
t.normal(0.0f, -1.0f, 0.0f);
|
||||||
renderFaceDown(tile, 0, 0, 0, tile->getTexture(1));
|
renderFaceDown(tile, 0, 0, 0, tile->getTexture(0));
|
||||||
|
|
||||||
|
t.normal(0.0f, 1.0f, 0.0f);
|
||||||
|
renderFaceUp(tile, 0, 0, 0, tile->getTexture(1));
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, -1.0f);
|
||||||
renderNorth(tile, 0, 0, 0, tile->getTexture(2));
|
renderNorth(tile, 0, 0, 0, tile->getTexture(2));
|
||||||
|
|
||||||
|
t.normal(0.0f, 0.0f, 1.0f);
|
||||||
renderSouth(tile, 0, 0, 0, tile->getTexture(3));
|
renderSouth(tile, 0, 0, 0, tile->getTexture(3));
|
||||||
|
|
||||||
|
t.normal(-1.0f, 0.0f, 0.0f);
|
||||||
renderWest(tile, 0, 0, 0, tile->getTexture(4));
|
renderWest(tile, 0, 0, 0, tile->getTexture(4));
|
||||||
|
|
||||||
|
t.normal(1.0f, 0.0f, 0.0f);
|
||||||
renderEast(tile, 0, 0, 0, tile->getTexture(5));
|
renderEast(tile, 0, 0, 0, tile->getTexture(5));
|
||||||
}
|
}
|
||||||
t.draw();
|
t.draw();
|
||||||
@@ -2469,7 +2609,7 @@ void TileRenderer::renderGuiTile( Tile* tile, int data )
|
|||||||
|
|
||||||
} else if (shape == Tile::SHAPE_CROSS_TEXTURE) {
|
} else if (shape == Tile::SHAPE_CROSS_TEXTURE) {
|
||||||
t.begin();
|
t.begin();
|
||||||
//t.normal(0, -1, 0);
|
t.normal(0, -1, 0);
|
||||||
tesselateCrossTexture(tile, data, -0.5f, -0.5f, -0.5f);
|
tesselateCrossTexture(tile, data, -0.5f, -0.5f, -0.5f);
|
||||||
//t.end();
|
//t.end();
|
||||||
t.draw();
|
t.draw();
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ class ThinFenceTile;
|
|||||||
class StairTile;
|
class StairTile;
|
||||||
class LevelSource;
|
class LevelSource;
|
||||||
class Material;
|
class Material;
|
||||||
|
class Minecraft;
|
||||||
|
|
||||||
class TileRenderer
|
class TileRenderer
|
||||||
{
|
{
|
||||||
@@ -60,6 +61,10 @@ public:
|
|||||||
void renderTile(Tile* tile, int data);
|
void renderTile(Tile* tile, int data);
|
||||||
void renderGuiTile(Tile* tile, int data);
|
void renderGuiTile(Tile* tile, int data);
|
||||||
|
|
||||||
|
static void setUseTint(bool value) {
|
||||||
|
sideTinting = value;
|
||||||
|
}
|
||||||
|
|
||||||
static bool canRender(int renderShape);
|
static bool canRender(int renderShape);
|
||||||
private:
|
private:
|
||||||
float getWaterHeight(int x, int y, int z, const Material* m);
|
float getWaterHeight(int x, int y, int z, const Material* m);
|
||||||
@@ -68,6 +73,7 @@ private:
|
|||||||
int fixedTexture;
|
int fixedTexture;
|
||||||
bool xFlipTexture;
|
bool xFlipTexture;
|
||||||
bool noCulling;
|
bool noCulling;
|
||||||
|
static bool sideTinting;
|
||||||
|
|
||||||
bool applyAmbienceOcclusion;
|
bool applyAmbienceOcclusion;
|
||||||
float ll000, llx00, ll0y0, ll00z, llX00, ll0Y0, ll00Z;
|
float ll000, llx00, ll0y0, ll00z, llX00, ll0Y0, ll00Z;
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ typedef struct VertexDeclPTCN
|
|||||||
GLfloat x, y, z;
|
GLfloat x, y, z;
|
||||||
GLfloat u, v;
|
GLfloat u, v;
|
||||||
GLuint color;
|
GLuint color;
|
||||||
GLuint normal;
|
// GLuint normal; // trying a new thing
|
||||||
|
GLfloat nx, ny, nz;
|
||||||
|
|
||||||
} VertexDeclPTCN;
|
} VertexDeclPTCN;
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include "../../Minecraft.h"
|
#include "../../Minecraft.h"
|
||||||
#include "../../Option.h"
|
#include "../../Option.h"
|
||||||
|
|
||||||
|
#include "../Lighting.h"
|
||||||
EntityRenderDispatcher* EntityRenderer::entityRenderDispatcher = NULL;
|
EntityRenderDispatcher* EntityRenderer::entityRenderDispatcher = NULL;
|
||||||
|
|
||||||
EntityRenderer::EntityRenderer()
|
EntityRenderer::EntityRenderer()
|
||||||
@@ -129,12 +130,13 @@ void EntityRenderer::postRender(Entity* entity, float x, float y, float z, float
|
|||||||
if (pow > 0) {
|
if (pow > 0) {
|
||||||
renderShadow(entity, x, y, z, pow, a);
|
renderShadow(entity, x, y, z, pow, a);
|
||||||
}
|
}
|
||||||
//}
|
|
||||||
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);
|
||||||
int tex = ((Tile*)Tile::fire)->tex;
|
int tex = ((Tile*)Tile::fire)->tex;
|
||||||
|
|
||||||
int xt = (tex & 0xf) << 4;
|
int xt = (tex & 0xf) << 4;
|
||||||
@@ -176,7 +178,76 @@ void EntityRenderer::renderFlame(Entity* e, float x, float y, float z, float a)
|
|||||||
}
|
}
|
||||||
t.draw();
|
t.draw();
|
||||||
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) { //
|
||||||
@@ -186,11 +257,14 @@ 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->bind(textures->loadTexture("/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);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Level* level = getLevel();
|
Level* level = getLevel();
|
||||||
|
|
||||||
glDepthMask(false);
|
glDepthMask(false);
|
||||||
@@ -224,8 +298,11 @@ 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() {
|
||||||
@@ -239,7 +316,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, 1, 1, (float) a);
|
// t.color(1.f, 1.f, 1.f, (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;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ void ItemRenderer::render(Entity* itemEntity_, float x, float y, float z, float
|
|||||||
else if (item->count > 1) count = 2;
|
else if (item->count > 1) count = 2;
|
||||||
|
|
||||||
glTranslatef2((float) x, (float) y + bob, (float) z);
|
glTranslatef2((float) x, (float) y + bob, (float) z);
|
||||||
//glEnable2(GL_RESCALE_NORMAL);
|
glEnable2(GL_RESCALE_NORMAL);
|
||||||
if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) {
|
if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) {
|
||||||
glRotatef2(spin, 0, 1, 0);
|
glRotatef2(spin, 0, 1, 0);
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ void ItemRenderer::render(Entity* itemEntity_, float x, float y, float z, float
|
|||||||
}
|
}
|
||||||
glRotatef2(180 - entityRenderDispatcher->playerRotY, 0, 1, 0);
|
glRotatef2(180 - entityRenderDispatcher->playerRotY, 0, 1, 0);
|
||||||
t.begin();
|
t.begin();
|
||||||
//t.normal(0, 1, 0);
|
t.normal(0, 1, 0);
|
||||||
t.vertexUV(0 - xo, 0 - yo, 0, u0, v1);
|
t.vertexUV(0 - xo, 0 - yo, 0, u0, v1);
|
||||||
t.vertexUV(r - xo, 0 - yo, 0, u1, v1);
|
t.vertexUV(r - xo, 0 - yo, 0, u1, v1);
|
||||||
t.vertexUV(r - xo, 1 - yo, 0, u1, v0);
|
t.vertexUV(r - xo, 1 - yo, 0, u1, v0);
|
||||||
@@ -118,7 +118,7 @@ void ItemRenderer::render(Entity* itemEntity_, float x, float y, float z, float
|
|||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//glDisable2(GL_RESCALE_NORMAL);
|
glDisable2(GL_RESCALE_NORMAL);
|
||||||
glPopMatrix2();
|
glPopMatrix2();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -187,10 +187,12 @@ void MobRenderer::scale(Mob* mob, float a) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MobRenderer::renderName(Mob* mob, float x, float y, float z) {
|
void MobRenderer::renderName(Mob* mob, float x, float y, float z) {
|
||||||
/*
|
|
||||||
std::stringstream ss; ss << mob->entityId;
|
std::stringstream ss; ss << mob->entityId;
|
||||||
|
if (entityRenderDispatcher->minecraft->options.getBooleanValue(OPTIONS_RENDER_DEBUG)) {
|
||||||
renderNameTag(mob, ss.str(), x, y, z, 64);
|
renderNameTag(mob, ss.str(), x, y, z, 64);
|
||||||
*/
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MobRenderer::renderNameTag(Mob* mob, const std::string& name, float x, float y, float z, int maxDist) {
|
void MobRenderer::renderNameTag(Mob* mob, const std::string& name, float x, float y, float z, int maxDist) {
|
||||||
@@ -205,13 +207,19 @@ void MobRenderer::renderNameTag(Mob* mob, const std::string& name, float x, floa
|
|||||||
float s = 1 / 60.0f * size;
|
float s = 1 / 60.0f * size;
|
||||||
|
|
||||||
glPushMatrix2();
|
glPushMatrix2();
|
||||||
glTranslatef2((float) x + 0, (float) y + 1.0f /*2.3f*/, (float) z);
|
if (mob->isPlayer()){
|
||||||
|
glTranslatef2((float) x + 0, (float) y + 1.0f, (float) z);
|
||||||
|
} else {
|
||||||
|
glTranslatef2((float) x + 0, (float) y + 2.3f, (float) z);
|
||||||
|
}
|
||||||
|
|
||||||
glRotatef2(-entityRenderDispatcher->playerRotY, 0, 1, 0);
|
glRotatef2(-entityRenderDispatcher->playerRotY, 0, 1, 0);
|
||||||
glRotatef2(entityRenderDispatcher->playerRotX, 1, 0, 0);
|
glRotatef2(entityRenderDispatcher->playerRotX, 1, 0, 0);
|
||||||
|
|
||||||
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);
|
||||||
@@ -235,6 +243,7 @@ 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();
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ void PaintingRenderer::render( Entity* entity, float x, float y, float z, float
|
|||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(float(x), float(y), float(z));
|
glTranslatef(float(x), float(y), float(z));
|
||||||
glRotatef(rot, 0, 1.0f, 0);
|
glRotatef(rot, 0, 1.0f, 0);
|
||||||
//glEnable(GL_RESCALE_NORMAL);
|
glEnable(GL_RESCALE_NORMAL);
|
||||||
bindTexture("art/kz.png");
|
bindTexture("art/kz.png");
|
||||||
Painting* painting = (Painting*)entity;
|
Painting* painting = (Painting*)entity;
|
||||||
const Motive* motive = painting->motive;
|
const Motive* motive = painting->motive;
|
||||||
@@ -17,7 +17,7 @@ void PaintingRenderer::render( Entity* entity, float x, float y, float z, float
|
|||||||
float s = 1.0f / 16.0f;
|
float s = 1.0f / 16.0f;
|
||||||
glScalef(s, s, s);
|
glScalef(s, s, s);
|
||||||
renderPainting(painting, motive->w, motive->h, motive->uo, motive->vo, a);
|
renderPainting(painting, motive->w, motive->h, motive->uo, motive->vo, a);
|
||||||
//glDisable(GL_RESCALE_NORMAL);
|
glDisable(GL_RESCALE_NORMAL);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,10 +77,10 @@ void PlayerRenderer::render(Entity* mob_, float x, float y, float z, float rot,
|
|||||||
model = desired;
|
model = desired;
|
||||||
humanoidModel = desired;
|
humanoidModel = desired;
|
||||||
}
|
}
|
||||||
LOGI("[PlayerRenderer] %s: skin=%s, modelTex=%dx%d, desired=%s\n",
|
/* LOGI("[PlayerRenderer] %s: skin=%s, modelTex=%dx%d, desired=%s\n",
|
||||||
((Player*)mob)->name.c_str(), mob->getTexture().c_str(),
|
((Player*)mob)->name.c_str(), mob->getTexture().c_str(),
|
||||||
humanoidModel->texWidth, humanoidModel->texHeight,
|
humanoidModel->texWidth, humanoidModel->texHeight,
|
||||||
(desired == playerModel64 ? "64" : "32"));
|
(desired == playerModel64 ? "64" : "32")); */
|
||||||
HumanoidMobRenderer::render(mob_, x, y, z, rot, a);
|
HumanoidMobRenderer::render(mob_, x, y, z, rot, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -115,6 +115,41 @@ void drawArrayVTC_NoState(int bufferId, int vertices, int vertexSize /* = 24 */)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void drawArrayVTN(int bufferId, int vertices, int vertexSize /* = 24 */) {
|
||||||
|
//if (Options::debugGl) LOGI("drawArray\n");
|
||||||
|
//LOGI("draw-vtc: %d, %d, %d\n", bufferId, vertices, vertexSize);
|
||||||
|
glEnableClientState2(GL_VERTEX_ARRAY);
|
||||||
|
glEnableClientState2(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
//glEnableClientState2(GL_COLOR_ARRAY);
|
||||||
|
glEnableClientState2(GL_NORMAL_ARRAY);
|
||||||
|
|
||||||
|
glBindBuffer2(GL_ARRAY_BUFFER, bufferId);
|
||||||
|
|
||||||
|
glVertexPointer2( 3, GL_FLOAT, vertexSize, 0);
|
||||||
|
glTexCoordPointer2(2, GL_FLOAT, vertexSize, (GLvoid*) (3 * 4));
|
||||||
|
//glColorPointer2(4, GL_UNSIGNED_BYTE, vertexSize, (GLvoid*) (5*4));
|
||||||
|
glNormalPointer(GL_FLOAT, vertexSize, (GLvoid*) (6 * 4));
|
||||||
|
|
||||||
|
glDrawArrays2(GL_TRIANGLES, 0, vertices);
|
||||||
|
|
||||||
|
glDisableClientState2(GL_VERTEX_ARRAY);
|
||||||
|
glDisableClientState2(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
//glDisableClientState2(GL_COLOR_ARRAY);
|
||||||
|
glDisableClientState2(GL_NORMAL_ARRAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef drawArrayVTN_NoState
|
||||||
|
void drawArrayVTCN_NoState(int bufferId, int vertices, int vertexSize /* = 24 */) {
|
||||||
|
glBindBuffer2(GL_ARRAY_BUFFER, bufferId);
|
||||||
|
|
||||||
|
glVertexPointer2( 3, GL_FLOAT, vertexSize, 0);
|
||||||
|
glTexCoordPointer2(2, GL_FLOAT, vertexSize, (GLvoid*) (3 * 4));
|
||||||
|
//glColorPointer2(4, GL_UNSIGNED_BYTE, vertexSize, (GLvoid*) (5*4));
|
||||||
|
glNormalPointer(GL_FLOAT, vertexSize, (GLvoid*) (6 * 4));
|
||||||
|
|
||||||
|
glDrawArrays2(GL_TRIANGLES, 0, vertices);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,15 @@
|
|||||||
#include "../../platform/log.h"
|
#include "../../platform/log.h"
|
||||||
#include "../Options.h"
|
#include "../Options.h"
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
#define GLES_SILENCE_DEPRECATION
|
||||||
|
#endif
|
||||||
|
|
||||||
// Android should always run OPENGL_ES
|
// Android should always run OPENGL_ES
|
||||||
#if defined(ANDROID) || defined(__APPLE__) || defined(RPI)
|
#if defined(ANDROID) || defined(__APPLE__) || defined(RPI)
|
||||||
#define OPENGL_ES
|
#define OPENGL_ES
|
||||||
#endif
|
#endif
|
||||||
|
#define GLES_SILENCE_DEPRECATION
|
||||||
// Other systems might run it, if they #define OPENGL_ES
|
// Other systems might run it, if they #define OPENGL_ES
|
||||||
// #if defined(OPENGL_ES) // || defined(ANDROID)
|
// #if defined(OPENGL_ES) // || defined(ANDROID)
|
||||||
#define USE_VBO
|
#define USE_VBO
|
||||||
@@ -55,13 +59,18 @@ void anGenBuffers(GLsizei n, GLuint* buffer);
|
|||||||
#ifdef USE_VBO
|
#ifdef USE_VBO
|
||||||
#define drawArrayVT_NoState drawArrayVT
|
#define drawArrayVT_NoState drawArrayVT
|
||||||
#define drawArrayVTC_NoState drawArrayVTC
|
#define drawArrayVTC_NoState drawArrayVTC
|
||||||
void drawArrayVT(int bufferId, int vertices, int vertexSize = 24, unsigned int mode = GL_TRIANGLES);
|
#define drawArrayVTN_NoState drawArrayVTN
|
||||||
|
void drawArrayVT(int bufferId, int vertices, int vertexSize = 36, unsigned int mode = GL_TRIANGLES);
|
||||||
#ifndef drawArrayVT_NoState
|
#ifndef drawArrayVT_NoState
|
||||||
//void drawArrayVT_NoState(int bufferId, int vertices, int vertexSize = 24);
|
//void drawArrayVT_NoState(int bufferId, int vertices, int vertexSize = 36);
|
||||||
#endif
|
#endif
|
||||||
void drawArrayVTC(int bufferId, int vertices, int vertexSize = 24);
|
void drawArrayVTC(int bufferId, int vertices, int vertexSize = 36);
|
||||||
#ifndef drawArrayVTC_NoState
|
#ifndef drawArrayVTC_NoState
|
||||||
void drawArrayVTC_NoState(int bufferId, int vertices, int vertexSize = 24);
|
void drawArrayVTC_NoState(int bufferId, int vertices, int vertexSize = 36);
|
||||||
|
#endif
|
||||||
|
void drawArrayVTN(int bufferId, int vertices, int vertexSize = 36);
|
||||||
|
#ifndef drawArrayVTN_NoState
|
||||||
|
void drawArrayVTCN_NoState(int bufferId, int vertices, int vertexSize = 36);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -114,6 +123,7 @@ int glhUnProjectf( float winx, float winy, float winz,
|
|||||||
#define glVertexPointer2 glVertexPointer
|
#define glVertexPointer2 glVertexPointer
|
||||||
#define glColorPointer2 glColorPointer
|
#define glColorPointer2 glColorPointer
|
||||||
#define glTexCoordPointer2 glTexCoordPointer
|
#define glTexCoordPointer2 glTexCoordPointer
|
||||||
|
#define glNormalPointer2 glNormalPointer
|
||||||
#define glEnableClientState2 glEnableClientState
|
#define glEnableClientState2 glEnableClientState
|
||||||
#define glDisableClientState2 glDisableClientState
|
#define glDisableClientState2 glDisableClientState
|
||||||
#define glDrawArrays2 glDrawArrays
|
#define glDrawArrays2 glDrawArrays
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
// DynamicTexture
|
// DynamicTexture
|
||||||
//
|
//
|
||||||
DynamicTexture::DynamicTexture(int tex_)
|
DynamicTexture::DynamicTexture(int tex_)
|
||||||
: tex(tex_),
|
: tex(tex_),
|
||||||
replicate(1)
|
replicate(1)
|
||||||
{
|
{
|
||||||
memset(pixels, 0, 16*16*4);
|
memset(pixels, 0, 16*16*4);
|
||||||
@@ -29,8 +29,8 @@ void DynamicTexture::bindTexture(Textures* tex) {
|
|||||||
/*
|
/*
|
||||||
WaterTexture::WaterTexture()
|
WaterTexture::WaterTexture()
|
||||||
: super(Tile::water->tex),
|
: super(Tile::water->tex),
|
||||||
_tick(0),
|
_tick(0),
|
||||||
_frame(0)
|
_frame(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ void WaterTexture::tick() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
WaterTexture::WaterTexture()
|
WaterTexture::WaterTexture()
|
||||||
: super(Tile::water->tex),
|
: super(Tile::water->tex),
|
||||||
_tick(0),
|
_tick(0),
|
||||||
_frame(0)
|
_frame(0)
|
||||||
{
|
{
|
||||||
@@ -124,7 +124,7 @@ void WaterTexture::tick()
|
|||||||
// WaterSideTexture
|
// WaterSideTexture
|
||||||
//
|
//
|
||||||
WaterSideTexture::WaterSideTexture()
|
WaterSideTexture::WaterSideTexture()
|
||||||
: super(Tile::water->tex + 1),
|
: super(Tile::water->tex + 1),
|
||||||
_tick(0),
|
_tick(0),
|
||||||
_frame(0),
|
_frame(0),
|
||||||
_tickCount(0)
|
_tickCount(0)
|
||||||
@@ -207,8 +207,194 @@ void WaterSideTexture::tick() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FireTexture::FireTexture()
|
///
|
||||||
: super(((Tile*)Tile::fire)->tex),
|
/// Lava Texture
|
||||||
|
///
|
||||||
|
|
||||||
|
LavaTexture::LavaTexture()
|
||||||
|
: super(Tile::lava->tex),
|
||||||
|
_tick(0),
|
||||||
|
_frame(0)
|
||||||
|
{
|
||||||
|
current = new float[16*16];
|
||||||
|
next = new float[16*16];
|
||||||
|
heat = new float[16*16];
|
||||||
|
heata = new float[16*16];
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; ++i) {
|
||||||
|
current[i] = 0;
|
||||||
|
next[i] = 0;
|
||||||
|
heat[i] = 0;
|
||||||
|
heata[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LavaTexture::~LavaTexture() {
|
||||||
|
delete[] current;
|
||||||
|
delete[] next;
|
||||||
|
delete[] heat;
|
||||||
|
delete[] heata;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LavaTexture::tick()
|
||||||
|
{
|
||||||
|
for (int x = 0; x < 16; x++)
|
||||||
|
for (int y = 0; y < 16; y++) {
|
||||||
|
float pow = 0;
|
||||||
|
int xxo = (int)(Mth::sin((float)(y) * (float)(Mth::PI) * 2.0f / 16.0f) * 1.2f);
|
||||||
|
int yyo = (int)(Mth::sin((float)(x) * (float)(Mth::PI) * 2.0f / 16.0f) * 1.2f);
|
||||||
|
for (int xx = x - 1; xx <= x + 1; xx++) {
|
||||||
|
for (int yy = y - 1; yy <= y + 1; yy++) {
|
||||||
|
int xi = xx + xxo & 15;
|
||||||
|
int yi = yy + yyo & 15;
|
||||||
|
pow += current[xi + yi * 16];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
next[x + y * 16] = pow / 10.0f + (heat[(x + 0 & 15) + (y + 0 & 15) * 16] + heat[(x + 1 & 15) + (y + 0 & 15) * 16] + heat[(x + 1 & 15) + (y + 1 & 15) * 16] + heat[(x + 0 & 15) + (y + 1 & 15) * 16]) / 4.0f * 0.8f;
|
||||||
|
heat[x + y * 16] = heat[x + y * 16] + heata[x + y * 16] * 0.01f;
|
||||||
|
if (heat[x + y * 16] < 0.0f) {
|
||||||
|
heat[x + y * 16] = 0.0f;
|
||||||
|
}
|
||||||
|
heata[x + y * 16] = heata[x + y * 16] - 0.06f;
|
||||||
|
if (Mth::random() < 0.005) {
|
||||||
|
heata[x + y * 16] = 1.5f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float* tmp = next;
|
||||||
|
next = current;
|
||||||
|
current = tmp;
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++) {
|
||||||
|
float pow = current[i] * 2.0f;
|
||||||
|
if (pow > 1) pow = 1;
|
||||||
|
if (pow < 0) pow = 0;
|
||||||
|
|
||||||
|
float pp = pow * pow;
|
||||||
|
|
||||||
|
int r = (int) (pow * 100.0f + 155.0f);
|
||||||
|
int g = (int) (pp * 255.0f);
|
||||||
|
int b = (int) (pp * pp * 128.0f);
|
||||||
|
|
||||||
|
//if (anaglyph3d) {
|
||||||
|
// int rr = (r * 30 + g * 59 + b * 11) / 100;
|
||||||
|
// int gg = (r * 30 + g * 70) / (100);
|
||||||
|
// int bb = (r * 30 + b * 70) / (100);
|
||||||
|
|
||||||
|
// r = rr;
|
||||||
|
// g = gg;
|
||||||
|
// b = bb;
|
||||||
|
//}
|
||||||
|
|
||||||
|
pixels[i * 4 + 0] = r;
|
||||||
|
pixels[i * 4 + 1] = g;
|
||||||
|
pixels[i * 4 + 2] = b;
|
||||||
|
pixels[i * 4 + 3] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Lava Side Texture
|
||||||
|
///
|
||||||
|
|
||||||
|
LavaSideTexture::LavaSideTexture()
|
||||||
|
: super(Tile::lava->tex + 1),
|
||||||
|
_tick(0),
|
||||||
|
_frame(0),
|
||||||
|
_tickCount(0)
|
||||||
|
{
|
||||||
|
replicate = 2;
|
||||||
|
|
||||||
|
current = new float[16*16];
|
||||||
|
next = new float[16*16];
|
||||||
|
heat = new float[16*16];
|
||||||
|
heata = new float[16*16];
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; ++i) {
|
||||||
|
current[i] = 0;
|
||||||
|
next[i] = 0;
|
||||||
|
heat[i] = 0;
|
||||||
|
heata[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LavaSideTexture::~LavaSideTexture() {
|
||||||
|
delete[] current;
|
||||||
|
delete[] next;
|
||||||
|
delete[] heat;
|
||||||
|
delete[] heata;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LavaSideTexture::tick() {
|
||||||
|
++_tickCount;
|
||||||
|
for (int x = 0; x < 16; x++)
|
||||||
|
for (int y = 0; y < 16; y++) {
|
||||||
|
float pow = 0;
|
||||||
|
int yl = (int)(Mth::sin((float)(y) * (float)(Mth::PI)* 2.0f / 16.0f) * 1.2f); // var2 is y
|
||||||
|
int xl = (int)(Mth::sin((float)(x) * (float)(Mth::PI)* 2.0f / 16.0f) * 1.2f); // var1 is x
|
||||||
|
for (int yy = x - 1; yy <= x + 1; yy++) {
|
||||||
|
for (int xx = y - 1; xx <= y + 1; xx++) {
|
||||||
|
int xi = (yy + yl) & 15; // var8
|
||||||
|
int yi = (xx + xl) & 15; //var9
|
||||||
|
pow += current[xi + yi * 16];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
next[x + y * 16] =
|
||||||
|
next[x + y * 16] =
|
||||||
|
pow / 10.0f + (
|
||||||
|
heat[(x + 0 & 15) + (y + 0 & 15) *
|
||||||
|
16] + heat[
|
||||||
|
(x + 1 & 15) + (y + 0 & 15) * 16] + heat[(x + 1 & 15) + (y + 1 & 15) *
|
||||||
|
16] + heat[
|
||||||
|
(x + 0 & 15) + (y + 1 & 15) * 16]) / 4.0f
|
||||||
|
* 0.8f;
|
||||||
|
heat[x + y * 16] = heat[x + y * 16] + heata[x + y * 16] * 0.01f;
|
||||||
|
|
||||||
|
if (heat[x + y * 16] < 0.0f) {
|
||||||
|
heat[x + y * 16] = 0.0f;
|
||||||
|
}
|
||||||
|
heata[x + y * 16] = heata[x + y * 16] - 0.06f;
|
||||||
|
|
||||||
|
if (Mth::random() < 0.005) {
|
||||||
|
heata[x + y * 16] = 1.5f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
float* tmp = next;
|
||||||
|
next = current;
|
||||||
|
current = tmp;
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++) {
|
||||||
|
float pow = current[(i - _tickCount / 3 * 16) & 255] * 2.0f;
|
||||||
|
if (pow > 1) pow = 1;
|
||||||
|
if (pow < 0) pow = 0;
|
||||||
|
|
||||||
|
float pp = pow * pow;
|
||||||
|
|
||||||
|
int r = (int) (pow * 100.0f + 155.0f);
|
||||||
|
int g = (int) (pow * pow * 255.0f);
|
||||||
|
int b = (int) (pow * pow * pow * pow * 128.0f);
|
||||||
|
// int a = (int) (146 + pp * 50);
|
||||||
|
|
||||||
|
//if (anaglyph3d) {
|
||||||
|
// int rr = (r * 30 + g * 59 + b * 11) / 100;
|
||||||
|
// int gg = (r * 30 + g * 70) / (100);
|
||||||
|
// int bb = (r * 30 + b * 70) / (100);
|
||||||
|
|
||||||
|
// r = rr;
|
||||||
|
// g = gg;
|
||||||
|
// b = bb;
|
||||||
|
//}
|
||||||
|
|
||||||
|
pixels[i * 4 + 0] = r;
|
||||||
|
pixels[i * 4 + 1] = g;
|
||||||
|
pixels[i * 4 + 2] = b;
|
||||||
|
pixels[i * 4 + 3] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FireTexture::FireTexture(int id)
|
||||||
|
: super(((Tile*)Tile::fire)->tex + id * 16),
|
||||||
_tick(0),
|
_tick(0),
|
||||||
_frame(0)
|
_frame(0)
|
||||||
{
|
{
|
||||||
@@ -236,7 +422,7 @@ FireTexture::~FireTexture() {
|
|||||||
// oh boy time to implement fire textures, i am so fucked - shredder
|
// oh boy time to implement fire textures, i am so fucked - shredder
|
||||||
|
|
||||||
void FireTexture::tick() {
|
void FireTexture::tick() {
|
||||||
// loop generates fire texture on the empty texture grid, hopefully shouldnt be too taxing on older hardware - shredder
|
// loop generates fire texture on the empty texture grid, hopefully shouldnt be too taxing on older hardware - shredder
|
||||||
for (int x = 0; x < 16; x++) {
|
for (int x = 0; x < 16; x++) {
|
||||||
for (int y = 0; y < 20; y++) {
|
for (int y = 0; y < 20; y++) {
|
||||||
int count = 18;
|
int count = 18;
|
||||||
|
|||||||
@@ -56,6 +56,44 @@ public:
|
|||||||
void tick();
|
void tick();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class LavaTexture: public DynamicTexture
|
||||||
|
{
|
||||||
|
typedef DynamicTexture super;
|
||||||
|
int _tick;
|
||||||
|
int _frame;
|
||||||
|
|
||||||
|
float* current;
|
||||||
|
float* next;
|
||||||
|
float* heat;
|
||||||
|
float* heata;
|
||||||
|
|
||||||
|
public:
|
||||||
|
LavaTexture();
|
||||||
|
~LavaTexture();
|
||||||
|
|
||||||
|
void tick();
|
||||||
|
};
|
||||||
|
|
||||||
|
class LavaSideTexture: public DynamicTexture
|
||||||
|
{
|
||||||
|
typedef DynamicTexture super;
|
||||||
|
int _tick;
|
||||||
|
int _frame;
|
||||||
|
int _tickCount;
|
||||||
|
|
||||||
|
float* current;
|
||||||
|
float* next;
|
||||||
|
float* heat;
|
||||||
|
float* heata;
|
||||||
|
|
||||||
|
public:
|
||||||
|
LavaSideTexture();
|
||||||
|
~LavaSideTexture();
|
||||||
|
|
||||||
|
void tick();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class FireTexture: public DynamicTexture
|
class FireTexture: public DynamicTexture
|
||||||
{
|
{
|
||||||
typedef DynamicTexture super;
|
typedef DynamicTexture super;
|
||||||
@@ -68,7 +106,7 @@ class FireTexture: public DynamicTexture
|
|||||||
float* heata;
|
float* heata;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FireTexture();
|
FireTexture(int id);
|
||||||
~FireTexture();
|
~FireTexture();
|
||||||
|
|
||||||
void tick();
|
void tick();
|
||||||
|
|||||||
@@ -111,6 +111,7 @@
|
|||||||
#include "data/eat1.pcm"
|
#include "data/eat1.pcm"
|
||||||
#include "data/eat2.pcm"
|
#include "data/eat2.pcm"
|
||||||
#include "data/eat3.pcm"
|
#include "data/eat3.pcm"
|
||||||
|
#include "data/burp1.pcm"
|
||||||
#include "data/fuse.pcm"
|
#include "data/fuse.pcm"
|
||||||
|
|
||||||
SoundDesc SA_cloth1((char*)PCM_cloth1);
|
SoundDesc SA_cloth1((char*)PCM_cloth1);
|
||||||
@@ -221,6 +222,7 @@ SoundDesc SA_creeperdeath((char*)PCM_creeperdeath);
|
|||||||
SoundDesc SA_eat1((char*)PCM_eat1);
|
SoundDesc SA_eat1((char*)PCM_eat1);
|
||||||
SoundDesc SA_eat2((char*)PCM_eat2);
|
SoundDesc SA_eat2((char*)PCM_eat2);
|
||||||
SoundDesc SA_eat3((char*)PCM_eat3);
|
SoundDesc SA_eat3((char*)PCM_eat3);
|
||||||
|
SoundDesc SA_burp1((char*)PCM_burp1);
|
||||||
SoundDesc SA_fuse((char*)PCM_fuse);
|
SoundDesc SA_fuse((char*)PCM_fuse);
|
||||||
|
|
||||||
#endif /*!PRE_ANDROID23 && !__APPLE__*/
|
#endif /*!PRE_ANDROID23 && !__APPLE__*/
|
||||||
|
|||||||
@@ -172,6 +172,7 @@ extern SoundDesc SA_creeperdeath;
|
|||||||
extern SoundDesc SA_eat1;
|
extern SoundDesc SA_eat1;
|
||||||
extern SoundDesc SA_eat2;
|
extern SoundDesc SA_eat2;
|
||||||
extern SoundDesc SA_eat3;
|
extern SoundDesc SA_eat3;
|
||||||
|
extern SoundDesc SA_burp1;
|
||||||
extern SoundDesc SA_fuse;
|
extern SoundDesc SA_fuse;
|
||||||
|
|
||||||
#endif /*!PRE_ANDROID23 && !__APPLE__*/
|
#endif /*!PRE_ANDROID23 && !__APPLE__*/
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ void SoundEngine::init( Minecraft* mc, Options* options )
|
|||||||
sounds.add("random.eat", SA_eat1);
|
sounds.add("random.eat", SA_eat1);
|
||||||
sounds.add("random.eat", SA_eat2);
|
sounds.add("random.eat", SA_eat2);
|
||||||
sounds.add("random.eat", SA_eat3);
|
sounds.add("random.eat", SA_eat3);
|
||||||
|
sounds.add("random.burp", SA_burp1);
|
||||||
sounds.add("random.fuse", SA_fuse);
|
sounds.add("random.fuse", SA_fuse);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -227,6 +227,7 @@ void SoundEngine::init( Minecraft* mc, Options* options )
|
|||||||
sounds.add( "random.eat", _pp("eat1"));
|
sounds.add( "random.eat", _pp("eat1"));
|
||||||
sounds.add( "random.eat", _pp("eat2"));
|
sounds.add( "random.eat", _pp("eat2"));
|
||||||
sounds.add( "random.eat", _pp("eat3"));
|
sounds.add( "random.eat", _pp("eat3"));
|
||||||
|
sounds.add( "random.burp", _pp("burp1"));
|
||||||
sounds.add( "random.fuse", _pp("fuse"));
|
sounds.add( "random.fuse", _pp("fuse"));
|
||||||
|
|
||||||
sounds.add( "step.cloth", _pp("cloth1"));
|
sounds.add( "step.cloth", _pp("cloth1"));
|
||||||
|
|||||||
2413
src/client/sound/data/burp1.pcm
Normal file
2413
src/client/sound/data/burp1.pcm
Normal file
File diff suppressed because it is too large
Load Diff
10
src/commands/Command.cpp
Normal file
10
src/commands/Command.cpp
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#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();
|
||||||
|
}
|
||||||
28
src/commands/Command.hpp
Normal file
28
src/commands/Command.hpp
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
enum CommandFlags {
|
||||||
|
COMMAND_FLAG_SINGLEPLAYER_ONLY = (1 << 1),
|
||||||
|
COMMAND_FLAG_NO_ARGS = (1 << 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
class Minecraft;
|
||||||
|
class Player;
|
||||||
|
|
||||||
|
class Command {
|
||||||
|
public:
|
||||||
|
const std::string& getName() { return m_name; }
|
||||||
|
const CommandFlags getFlags() { return m_flags; }
|
||||||
|
|
||||||
|
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, CommandFlags flags = (CommandFlags)0) : m_name(name), m_flags(flags) {}
|
||||||
|
|
||||||
|
const std::string m_name;
|
||||||
|
const CommandFlags m_flags;
|
||||||
|
};
|
||||||
52
src/commands/CommandBan.cpp
Normal file
52
src/commands/CommandBan.cpp
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#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->bannedPpl) {
|
||||||
|
if (nicknameLower == banned) {
|
||||||
|
return args[0] + "already banned!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mc.level->bannedPpl.insert(nicknameLower);
|
||||||
|
return "ban: successfully banned player " + args[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CommandBan::help(Minecraft& mc) {
|
||||||
|
return "Usage: /ban <player>";
|
||||||
|
}
|
||||||
9
src/commands/CommandBan.hpp
Normal file
9
src/commands/CommandBan.hpp
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#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);
|
||||||
|
};
|
||||||
35
src/commands/CommandHelp.cpp
Normal file
35
src/commands/CommandHelp.cpp
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#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>";
|
||||||
|
}
|
||||||
9
src/commands/CommandHelp.hpp
Normal file
9
src/commands/CommandHelp.hpp
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#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);
|
||||||
|
};
|
||||||
46
src/commands/CommandKick.cpp
Normal file
46
src/commands/CommandKick.cpp
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#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>";
|
||||||
|
}
|
||||||
9
src/commands/CommandKick.hpp
Normal file
9
src/commands/CommandKick.hpp
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#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);
|
||||||
|
};
|
||||||
75
src/commands/CommandManager.cpp
Normal file
75
src/commands/CommandManager.cpp
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#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 "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());
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (!mc.level->isClientSide || (*it)->getFlags() & CommandFlags::COMMAND_FLAG_SINGLEPLAYER_ONLY) {
|
||||||
|
return (*it)->execute(mc, player, args);
|
||||||
|
} else {
|
||||||
|
ChatPacket packet("/" + input);
|
||||||
|
mc.raknetInstance->send(packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
21
src/commands/CommandManager.hpp
Normal file
21
src/commands/CommandManager.hpp
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#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;
|
||||||
|
};
|
||||||
31
src/commands/CommandOp.cpp
Normal file
31
src/commands/CommandOp.cpp
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#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>";
|
||||||
|
}
|
||||||
9
src/commands/CommandOp.hpp
Normal file
9
src/commands/CommandOp.hpp
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#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,16 +1,20 @@
|
|||||||
|
#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;
|
||||||
@@ -27,36 +31,175 @@ void signal_callback_handler(int signum) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int numArguments, char* pszArgs[]) {
|
std::string findStringInConfig(std::string line, std::string config) {
|
||||||
ArgumentsSettings aSettings(numArguments, pszArgs);
|
auto valuePos = config.find(line);
|
||||||
if(aSettings.getShowHelp()) {
|
|
||||||
ArgumentsSettings defaultSettings(0, NULL);
|
if (line.empty()) {
|
||||||
printf("Minecraft Pockect Edition Server %s\n", Common::getGameVersionString("").c_str());
|
throw std::runtime_error("Key cannot be empty");
|
||||||
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());
|
|
||||||
printf("--externalpath - The path to the place where the server should store the levels. [default: \"%s\"]\n", defaultSettings.getExternalPath().c_str());
|
|
||||||
printf("--levelname - The name of the server [default: \"%s\"]\n", defaultSettings.getLevelName().c_str());
|
|
||||||
printf("--leveldir - The name of the server [default: \"%s\"]\n", defaultSettings.getLevelDir().c_str());
|
|
||||||
printf("--help - Shows this message.\n");
|
|
||||||
printf("--port - The port to run the server on. [default: %d]\n", defaultSettings.getPort());
|
|
||||||
printf("--serverkey - The key that the server should use for API calls. [default: \"%s\"]\n", defaultSettings.getServerKey().c_str());
|
|
||||||
printf("-------------------------------------------------------\n");
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
printf("Level Name: %s\n", aSettings.getLevelName().c_str());
|
|
||||||
|
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[]) {
|
||||||
|
std::ifstream serverProperties("server.properties");
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
std::stringstream buffer;
|
||||||
|
|
||||||
|
buffer << "// MCPE Server properties" << std::endl;
|
||||||
|
buffer << "port=" << defaultSettings.getPort() << std::endl;
|
||||||
|
buffer << "level-dir=" << defaultSettings.getLevelDir() << std::endl;
|
||||||
|
buffer << "level-cachepath=" << defaultSettings.getCachePath() << std::endl;
|
||||||
|
buffer << "level-externalpath=" << defaultSettings.getExternalPath() << std::endl;
|
||||||
|
buffer << "gamemode=survival" << std::endl;
|
||||||
|
buffer << "level-name=" << defaultSettings.getLevelName() << std::endl;
|
||||||
|
buffer << "world-size=16" << std::endl;
|
||||||
|
|
||||||
|
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", 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 = aSettings.getExternalPath();
|
((MAIN_CLASS*)g_app)->externalStoragePath = externalPath;
|
||||||
((MAIN_CLASS*)g_app)->externalCacheStoragePath = aSettings.getCachePath();
|
((MAIN_CLASS*)g_app)->externalCacheStoragePath = cachePath;
|
||||||
|
|
||||||
g_app->init(appContext);
|
g_app->init(appContext);
|
||||||
LevelSettings settings(getEpochTimeS(), GameType::Creative);
|
LevelSettings settings(getEpochTimeS(), gamemode);
|
||||||
float startTime = getTimeS();
|
float startTime = getTimeS();
|
||||||
((MAIN_CLASS*)g_app)->selectLevel(aSettings.getLevelDir(), aSettings.getLevelName(), settings);
|
((MAIN_CLASS*)g_app)->selectLevel(levelDir, levelName, settings);
|
||||||
((MAIN_CLASS*)g_app)->hostMultiplayer(aSettings.getPort());
|
((MAIN_CLASS*)g_app)->hostMultiplayer(port);
|
||||||
|
|
||||||
|
// 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->bannedPpl.insert(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
std::ofstream bannedPpl("banned-players.txt");
|
||||||
|
|
||||||
|
if (!bannedPpl.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();
|
||||||
@@ -67,7 +210,31 @@ 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->bannedPpl) {
|
||||||
|
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;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
#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"
|
||||||
@@ -10,6 +11,9 @@
|
|||||||
#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
|
||||||
@@ -42,6 +46,9 @@ 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +66,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 % CHUNK_CACHE_WIDTH, requestNextChunkPosition / CHUNK_CACHE_WIDTH));
|
//raknetInstance->send(new RequestChunkPacket(requestNextChunkPosition % LevelConstants::CHUNK_CACHE_WIDTH, requestNextChunkPosition / LevelConstants::CHUNK_CACHE_WIDTH));
|
||||||
requestNextChunkIndex++;
|
requestNextChunkIndex++;
|
||||||
requestNextChunkPosition++;
|
requestNextChunkPosition++;
|
||||||
}
|
}
|
||||||
@@ -67,16 +74,16 @@ void ClientSideNetworkHandler::requestNextChunk()
|
|||||||
|
|
||||||
bool ClientSideNetworkHandler::areAllChunksLoaded()
|
bool ClientSideNetworkHandler::areAllChunksLoaded()
|
||||||
{
|
{
|
||||||
return (requestNextChunkPosition >= (CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH));
|
return (requestNextChunkPosition >= (LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientSideNetworkHandler::isChunkLoaded(int x, int z)
|
bool ClientSideNetworkHandler::isChunkLoaded(int x, int z)
|
||||||
{
|
{
|
||||||
if (x < 0 || x >= CHUNK_CACHE_WIDTH || z < 0 || z >= CHUNK_CACHE_WIDTH) {
|
if (x < 0 || x >= LevelConstants::CHUNK_CACHE_WIDTH || z < 0 || z >= LevelConstants::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 * CHUNK_CACHE_WIDTH + z];
|
return chunksLoaded[x * LevelConstants::CHUNK_CACHE_WIDTH + z];
|
||||||
//return areAllChunksLoaded();
|
//return areAllChunksLoaded();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +93,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);
|
LoginPacket packet(minecraft->options.getStringValue(OPTIONS_USERNAME).c_str(), SharedConstants::NetworkProtocolVersion, true);
|
||||||
raknetInstance->send(packet);
|
raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,6 +104,11 @@ 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)
|
||||||
{
|
{
|
||||||
@@ -109,9 +121,13 @@ void ClientSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& guid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifndef STANDALONE_SERVER
|
minecraft->leaveGame();
|
||||||
minecraft->gui.addMessage("Disconnected from server");
|
// minecraft->setLevel(NULL);
|
||||||
#endif
|
// #ifndef STANDALONE_SERVER
|
||||||
|
// 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) {
|
||||||
@@ -130,6 +146,18 @@ 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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,6 +174,19 @@ 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);
|
||||||
@@ -182,7 +223,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,7 +279,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");
|
||||||
@@ -324,7 +365,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);
|
||||||
@@ -344,6 +385,7 @@ 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);
|
||||||
@@ -386,6 +428,54 @@ 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)
|
||||||
@@ -475,19 +565,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 = LEVEL_HEIGHT / 8;
|
const int setSize = LevelConstants::LEVEL_HEIGHT / 8;
|
||||||
const int setShift = 4; // power of LEVEL_HEIGHT / 8
|
const int setShift = 4; // power of LevelConstants::LEVEL_HEIGHT / 8
|
||||||
|
|
||||||
bool recalcHeight = false;
|
bool recalcHeight = false;
|
||||||
|
|
||||||
int x0 = 16, x1 = 0, z0 = 16, z1 = 0, y0 = LEVEL_HEIGHT, y1 = 0;
|
int x0 = 16, x1 = 0, z0 = 16, z1 = 0, y0 = LevelConstants::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[setSize];
|
unsigned char* readBlockBuffer = new unsigned char[setSize];
|
||||||
unsigned char readDataBuffer[setSize / 2];
|
unsigned char* readDataBuffer = new unsigned char[setSize / 2];
|
||||||
|
|
||||||
for (int i = 0; i < CHUNK_COLUMNS; i++)
|
for (int i = 0; i < LevelConstants::CHUNK_COLUMNS; i++)
|
||||||
{
|
{
|
||||||
unsigned char updateBits = 0;
|
unsigned char updateBits = 0;
|
||||||
packet->chunkData.Read(updateBits);
|
packet->chunkData.Read(updateBits);
|
||||||
@@ -496,8 +586,8 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
|||||||
{
|
{
|
||||||
recalcHeight = true;
|
recalcHeight = true;
|
||||||
|
|
||||||
int colX = (i % CHUNK_WIDTH);
|
int colX = (i % LevelConstants::CHUNK_WIDTH);
|
||||||
int colZ = (i / CHUNK_WIDTH);
|
int colZ = (i / LevelConstants::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++)
|
||||||
@@ -531,30 +621,33 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
|||||||
{
|
{
|
||||||
y0 = ((1 << set) << setShift);
|
y0 = ((1 << set) << setShift);
|
||||||
}
|
}
|
||||||
if (((1 << set) << setShift) + (LEVEL_HEIGHT / 8) - 1 > y1)
|
if (((1 << set) << setShift) + (LevelConstants::LEVEL_HEIGHT / 8) - 1 > y1)
|
||||||
{
|
{
|
||||||
y1 = ((1 << set) << setShift) + (LEVEL_HEIGHT / 8) - 1;
|
y1 = ((1 << set) << setShift) + (LevelConstants::LEVEL_HEIGHT / 8) - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((i % CHUNK_WIDTH) < x0)
|
if ((i % LevelConstants::CHUNK_WIDTH) < x0)
|
||||||
{
|
{
|
||||||
x0 = (i % CHUNK_WIDTH);
|
x0 = (i % LevelConstants::CHUNK_WIDTH);
|
||||||
}
|
}
|
||||||
if ((i % CHUNK_WIDTH) > x1)
|
if ((i % LevelConstants::CHUNK_WIDTH) > x1)
|
||||||
{
|
{
|
||||||
x1 = (i % CHUNK_WIDTH);
|
x1 = (i % LevelConstants::CHUNK_WIDTH);
|
||||||
}
|
}
|
||||||
if ((i / CHUNK_WIDTH) < z0)
|
if ((i / LevelConstants::CHUNK_WIDTH) < z0)
|
||||||
{
|
{
|
||||||
z0 = (i / CHUNK_WIDTH);
|
z0 = (i / LevelConstants::CHUNK_WIDTH);
|
||||||
}
|
}
|
||||||
if ((i / CHUNK_WIDTH) > z1)
|
if ((i / LevelConstants::CHUNK_WIDTH) > z1)
|
||||||
{
|
{
|
||||||
z1 = (i / CHUNK_WIDTH);
|
z1 = (i / LevelConstants::CHUNK_WIDTH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete[] readBlockBuffer;
|
||||||
|
delete[] readDataBuffer;
|
||||||
|
|
||||||
if (recalcHeight)
|
if (recalcHeight)
|
||||||
{
|
{
|
||||||
// chunk->recalcHeightmap();
|
// chunk->recalcHeightmap();
|
||||||
@@ -579,7 +672,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
|||||||
//chunk->terrainPopulated = true;
|
//chunk->terrainPopulated = true;
|
||||||
chunk->unsaved = false;
|
chunk->unsaved = false;
|
||||||
|
|
||||||
chunksLoaded[packet->x * CHUNK_CACHE_WIDTH + packet->z] = true;
|
chunksLoaded[packet->x * LevelConstants::CHUNK_CACHE_WIDTH + packet->z] = true;
|
||||||
|
|
||||||
if (areAllChunksLoaded())
|
if (areAllChunksLoaded())
|
||||||
{
|
{
|
||||||
@@ -627,18 +720,18 @@ void ClientSideNetworkHandler::arrangeRequestChunkOrder() {
|
|||||||
clearChunksLoaded();
|
clearChunksLoaded();
|
||||||
|
|
||||||
// Default sort is around center of the world
|
// Default sort is around center of the world
|
||||||
int cx = CHUNK_CACHE_WIDTH / 2;
|
int cx = LevelConstants::CHUNK_CACHE_WIDTH / 2;
|
||||||
int cz = CHUNK_CACHE_WIDTH / 2;
|
int cz = LevelConstants::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)CHUNK_WIDTH);
|
cx = Mth::floor(p->x / (float)LevelConstants::CHUNK_WIDTH);
|
||||||
cz = Mth::floor(p->z / (float)CHUNK_DEPTH);
|
cz = Mth::floor(p->z / (float)LevelConstants::CHUNK_DEPTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
_ChunkSorter sorter(cx, cz);
|
_ChunkSorter sorter(cx, cz);
|
||||||
std::sort(requestNextChunkIndexList, requestNextChunkIndexList + NumRequestChunks, sorter);
|
std::sort(requestNextChunkIndexList.begin(), requestNextChunkIndexList.end(), sorter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientSideNetworkHandler::levelGenerated(Level* level)
|
void ClientSideNetworkHandler::levelGenerated(Level* level)
|
||||||
@@ -728,7 +821,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) {
|
||||||
@@ -782,6 +875,10 @@ 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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -791,6 +888,7 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -886,7 +984,11 @@ 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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -919,8 +1021,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/CHUNK_WIDTH;
|
requestNextChunkIndexList[i].x = i / LevelConstants::CHUNK_WIDTH;
|
||||||
requestNextChunkIndexList[i].y = i%CHUNK_WIDTH;
|
requestNextChunkIndexList[i].y = i % LevelConstants::CHUNK_WIDTH;
|
||||||
chunksLoaded[i] = false;
|
chunksLoaded[i] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,6 +77,11 @@ 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();
|
||||||
@@ -97,11 +102,11 @@ private:
|
|||||||
BlockUpdateList bufferedBlockUpdates;
|
BlockUpdateList bufferedBlockUpdates;
|
||||||
int requestNextChunkPosition;
|
int requestNextChunkPosition;
|
||||||
|
|
||||||
static const int NumRequestChunks = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH;
|
int NumRequestChunks;
|
||||||
|
|
||||||
int requestNextChunkIndex;
|
int requestNextChunkIndex;
|
||||||
IntPair requestNextChunkIndexList[NumRequestChunks];
|
std::vector<IntPair> requestNextChunkIndexList;
|
||||||
bool chunksLoaded[NumRequestChunks];
|
std::vector<bool> chunksLoaded;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
#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() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
#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,6 +18,8 @@ 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;
|
||||||
@@ -48,6 +50,7 @@ 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;
|
||||||
@@ -119,6 +122,9 @@ 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,6 +2,7 @@
|
|||||||
#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()
|
||||||
@@ -41,6 +42,12 @@ 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;
|
||||||
@@ -68,6 +75,9 @@ 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,6 +33,9 @@ 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,
|
||||||
|
|||||||
@@ -5,6 +5,16 @@
|
|||||||
#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"
|
||||||
@@ -13,6 +23,17 @@
|
|||||||
#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
|
||||||
@@ -53,11 +74,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()) {
|
||||||
|
|
||||||
@@ -136,7 +157,18 @@ void ServerSideNetworkHandler::displayGameMessage(const std::string& message)
|
|||||||
|
|
||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChatPacket* packet)
|
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChatPacket* packet)
|
||||||
{
|
{
|
||||||
displayGameMessage(packet->message);
|
auto player = getPlayer(source);
|
||||||
|
|
||||||
|
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)
|
||||||
@@ -156,6 +188,8 @@ 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);
|
||||||
@@ -186,8 +220,32 @@ 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)
|
if (oldClient || oldServer || !packet->newProto)
|
||||||
loginStatus = oldClient? LoginStatus::Failed_ClientOld : LoginStatus::Failed_ServerOld;
|
loginStatus = oldClient || !packet->newProto? 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->bannedPpl) {
|
||||||
|
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);
|
||||||
@@ -199,13 +257,16 @@ 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);
|
||||||
@@ -228,7 +289,8 @@ 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);
|
||||||
@@ -244,6 +306,8 @@ 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)
|
||||||
@@ -301,6 +365,36 @@ 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
|
||||||
/*
|
/*
|
||||||
@@ -339,14 +433,31 @@ 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);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,12 +479,29 @@ 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)) {
|
||||||
//oldTile->spawnResources(level, x, y, z, data, 1); //@todo
|
// 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->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)
|
||||||
@@ -403,6 +531,8 @@ 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 )
|
||||||
@@ -429,23 +559,31 @@ 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) {
|
if (slot >= 0 && slot != packet->inventorySlot && packet->itemId != 0) {
|
||||||
if (packet->itemId == 0) {
|
LOGW("PlayerEquipmentPacket: Item in player inventory but slots doesn't match!");
|
||||||
player->inventory->clearSlot(slot);
|
packet->inventorySlot = 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) {
|
||||||
@@ -455,6 +593,8 @@ 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);
|
||||||
}
|
}
|
||||||
@@ -466,6 +606,8 @@ 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();
|
||||||
@@ -506,14 +648,75 @@ 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\n");
|
LOGI("UseItemPacket: id %i data %i\n", packet->itemId, packet->itemData);
|
||||||
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)];
|
||||||
@@ -522,7 +725,41 @@ 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* item = &packet->item;
|
ItemInstance* packetItem = &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
|
||||||
@@ -534,6 +771,10 @@ 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
|
||||||
@@ -544,6 +785,8 @@ 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);
|
||||||
}
|
}
|
||||||
@@ -577,6 +820,11 @@ 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;
|
||||||
@@ -592,15 +840,27 @@ 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;
|
||||||
@@ -612,6 +872,16 @@ 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;
|
||||||
|
|
||||||
@@ -619,12 +889,80 @@ 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);
|
||||||
@@ -635,6 +973,8 @@ 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 )
|
||||||
@@ -657,6 +997,8 @@ 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;
|
||||||
@@ -713,3 +1055,9 @@ 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,6 +58,7 @@ 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, WantCreatePacket* packet);
|
||||||
|
|
||||||
bool allowsIncomingConnections() { return _allowIncoming; }
|
bool allowsIncomingConnections() { return _allowIncoming; }
|
||||||
void allowIncomingConnections(bool doAllow);
|
void allowIncomingConnections(bool doAllow);
|
||||||
@@ -70,6 +71,12 @@ 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 >= LEVEL_WIDTH ) x1 = LEVEL_WIDTH - 1;
|
if (x1 >= LevelConstants::LEVEL_WIDTH ) x1 = LevelConstants::LEVEL_WIDTH - 1;
|
||||||
if (y1 >= LEVEL_HEIGHT) y1 = LEVEL_HEIGHT - 1;
|
if (y1 >= LevelConstants::LEVEL_HEIGHT) y1 = LevelConstants::LEVEL_HEIGHT - 1;
|
||||||
if (z1 >= LEVEL_DEPTH ) z1 = LEVEL_DEPTH - 1;
|
if (z1 >= LevelConstants::LEVEL_DEPTH ) z1 = LevelConstants::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 = CHUNK_CACHE_WIDTH;
|
const int CSize = LevelConstants::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 = CHUNK_CACHE_WIDTH;
|
const int CSize = LevelConstants::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 = LEVEL_HEIGHT / 8;
|
const int setSize = LevelConstants::LEVEL_HEIGHT / 8;
|
||||||
const int setShift = 4; // power of LEVEL_HEIGHT / 8
|
const int setShift = 4; // power of LevelConstants::LEVEL_HEIGHT / 8
|
||||||
|
|
||||||
chunkData.Reset();
|
chunkData.Reset();
|
||||||
for (int i = 0; i < CHUNK_COLUMNS; i++)
|
for (int i = 0; i < LevelConstants::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 % CHUNK_WIDTH) << 11 | (i / CHUNK_WIDTH) << 7;
|
int colDataPosition = (i % LevelConstants::CHUNK_WIDTH) << 11 | (i / LevelConstants::CHUNK_WIDTH) << 7;
|
||||||
|
|
||||||
for (int set = 0; set < 8; set++)
|
for (int set = 0; set < 8; set++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,17 +9,20 @@ 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)
|
LoginPacket(const RakNet::RakString& clientName, int clientVersion, bool newProto)
|
||||||
: clientName(clientName),
|
: clientName(clientName),
|
||||||
clientNetworkVersion(clientVersion),
|
clientNetworkVersion(clientVersion),
|
||||||
clientNetworkLowestSupportedVersion(clientVersion)
|
clientNetworkLowestSupportedVersion(clientVersion),
|
||||||
|
newProto(newProto)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,6 +32,7 @@ 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)
|
||||||
@@ -39,6 +43,11 @@ 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,10 +3,13 @@
|
|||||||
|
|
||||||
#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,5 +50,7 @@
|
|||||||
#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,15 +9,19 @@ 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)
|
PlayerEquipmentPacket(int entityId, int itemId, int data, int selSlot, int invSlot)
|
||||||
: entityId(entityId),
|
: entityId(entityId),
|
||||||
itemId(itemId),
|
itemId(itemId),
|
||||||
itemAuxValue(data)
|
itemAuxValue(data),
|
||||||
|
selectedSlot(selSlot),
|
||||||
|
inventorySlot(invSlot)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,6 +32,8 @@ 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)
|
||||||
@@ -35,6 +41,8 @@ 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)
|
||||||
|
|||||||
54
src/network/packet/RemoveItemPacket.h
Normal file
54
src/network/packet/RemoveItemPacket.h
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#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,13 +2,14 @@
|
|||||||
#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),
|
||||||
@@ -21,10 +22,15 @@ 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)
|
||||||
@@ -39,6 +45,13 @@ 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)
|
||||||
@@ -50,6 +63,12 @@ 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)
|
||||||
@@ -62,6 +81,8 @@ 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,6 +2,7 @@
|
|||||||
#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
|
||||||
@@ -14,18 +15,20 @@ 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)
|
StartGamePacket(long seed, int levelGeneratorVersion, int gameType, int entityId, float x, float y, float z, int chunkCacheWidth)
|
||||||
: 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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,6 +43,7 @@ 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)
|
||||||
@@ -51,6 +55,10 @@ 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)
|
||||||
|
|||||||
54
src/network/packet/TakeItemPacket.h
Normal file
54
src/network/packet/TakeItemPacket.h
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#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,10 +16,14 @@ 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),
|
||||||
@@ -29,17 +33,36 @@ 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)
|
UseItemPacket(const ItemInstance* item, int entityId, const Vec3& aim, float plrX, float plrY, float plrZ,
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,6 +80,15 @@ 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)
|
||||||
@@ -74,7 +106,15 @@ 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)
|
||||||
|
|||||||
54
src/network/packet/WantCreatePacket.h
Normal file
54
src/network/packet/WantCreatePacket.h
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#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__*/
|
||||||
@@ -17,6 +17,11 @@ 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]);
|
||||||
@@ -51,6 +56,9 @@ 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,20 +4,27 @@
|
|||||||
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user