Compare commits
57 Commits
561e8a3691
...
dedicated-
| Author | SHA1 | Date | |
|---|---|---|---|
| 26e5376030 | |||
| d3d9b1a238 | |||
| f0df3fe257 | |||
| 3ebed84cdb | |||
| b73f7f121d | |||
|
|
5e19ef778e | ||
| 5bc19c4ab2 | |||
| dfb3bf1da7 | |||
| 263118f2e0 | |||
| 1d0264a9c5 | |||
| 43f0d1f75f | |||
| 70308d4151 | |||
| 830549791a | |||
| 27b22d8108 | |||
| 4047fd71e1 | |||
| 30dd344208 | |||
| 7e9de7a461 | |||
| 2465292473 | |||
| 26b2c196fa | |||
| 18793a6e05 | |||
|
|
3e48c7fabd | ||
| de72a9a3b7 | |||
| 0645905fc6 | |||
|
|
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 |
29
.github/workflows/build.yml
vendored
29
.github/workflows/build.yml
vendored
@@ -72,30 +72,6 @@ jobs:
|
||||
${{github.workspace}}/build/OpenAL32.dll
|
||||
${{github.workspace}}/build/libz.dll
|
||||
|
||||
build-ios:
|
||||
# credit to pengubow from deepfriedwaffles repo
|
||||
name: Build iOS
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@main
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cd project/iosproj
|
||||
xcodebuild -scheme minecraftpe -derivedDataPath build -destination 'generic/platform=iOS' CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
|
||||
mkdir -p Payload
|
||||
cp -R build/Build/Products/Debug-iphoneos/minecraftpe.app Payload/
|
||||
zip -r minecraftpe.ipa Payload
|
||||
rm -rf Payload
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@main
|
||||
with:
|
||||
name: minecraftpe-ios
|
||||
path: project/iosproj/minecraftpe.ipa
|
||||
|
||||
build-linux:
|
||||
name: Build Linux
|
||||
runs-on: ubuntu-latest
|
||||
@@ -290,7 +266,8 @@ jobs:
|
||||
publish:
|
||||
name: Publish
|
||||
runs-on: ubuntu-latest
|
||||
needs: [ build-windows, build-ios, build-linux, build-android, build-web ]
|
||||
needs: [ build-windows, build-linux, build-android, build-web ]
|
||||
if: github.ref == 'refs/heads/main'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -363,4 +340,4 @@ jobs:
|
||||
./minecraftpe-server-${{ steps.ref.outputs.hash }}.zip
|
||||
./minecraftpe-${{ steps.ref.outputs.hash }}-android-arm64-v8a.zip
|
||||
./minecraftpe-${{ steps.ref.outputs.hash }}-android-armeabi-v7a.zip
|
||||
./minecraftpe-${{ steps.ref.outputs.hash }}-web.zip
|
||||
./minecraftpe-${{ steps.ref.outputs.hash }}-web.zip
|
||||
@@ -111,7 +111,6 @@ CPMAddPackage(
|
||||
"ALSOFT_STATIC_LIBGCC ON"
|
||||
)
|
||||
|
||||
# TODO: Clear this paths with *
|
||||
file(GLOB SERVER_SOURCES
|
||||
"project/lib_projects/raknet/jni/RaknetSources/*.cpp"
|
||||
"src/NinecraftApp.cpp"
|
||||
@@ -150,7 +149,6 @@ file(GLOB SERVER_SOURCES
|
||||
|
||||
"src/platform/CThread.cpp"
|
||||
"src/platform/HttpClient.cpp"
|
||||
"src/platform/PngLoader.cpp"
|
||||
"src/platform/time.cpp"
|
||||
|
||||
"src/platform/input/Controller.cpp"
|
||||
@@ -212,6 +210,7 @@ file(GLOB SERVER_SOURCES
|
||||
"src/world/level/tile/entity/*.cpp"
|
||||
|
||||
"src/world/phys/HitResult.cpp"
|
||||
"src/commands/*.cpp"
|
||||
)
|
||||
|
||||
file(GLOB CLIENT_SOURCES
|
||||
@@ -293,6 +292,8 @@ file(GLOB CLIENT_SOURCES
|
||||
|
||||
"src/AppPlatform_glfw.cpp"
|
||||
"src/main.cpp"
|
||||
|
||||
"src/commands/*.cpp"
|
||||
)
|
||||
|
||||
if (${PLATFORM} STREQUAL "Desktop")
|
||||
@@ -300,18 +301,16 @@ if (${PLATFORM} STREQUAL "Desktop")
|
||||
endif()
|
||||
|
||||
# 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
|
||||
"${CMAKE_SOURCE_DIR}/src/"
|
||||
"project/lib_projects/raknet/jni/RaknetSources"
|
||||
)
|
||||
target_include_directories("${PROJECT_NAME}-server" PUBLIC
|
||||
"${CMAKE_SOURCE_DIR}/src/"
|
||||
"project/lib_projects/raknet/jni/RaknetSources"
|
||||
)
|
||||
|
||||
target_link_libraries("${PROJECT_NAME}-server" ${CMAKE_THREAD_LIBS_INIT})
|
||||
endif()
|
||||
target_link_libraries("${PROJECT_NAME}-server" ${CMAKE_THREAD_LIBS_INIT})
|
||||
|
||||
add_executable(${PROJECT_NAME} ${CLIENT_SOURCES})
|
||||
|
||||
|
||||
37
README.md
37
README.md
@@ -197,39 +197,4 @@ cmake --build .
|
||||
3. Run game:
|
||||
```
|
||||
emrun --port 8080 .
|
||||
```
|
||||
## iOS
|
||||
### Xcode
|
||||
> [Note!]
|
||||
> There's a precompiled IPA artifact in the GitHub mirror under Actions for those who either don't have Macs or don't want to build themself. But if you want to build youself, you'll need a Mac with Xcode. Download Xcode from the Mac App Store.
|
||||
|
||||
### 1. Clone
|
||||
Open your terminal and clone the repository
|
||||
```bash
|
||||
git clone https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
|
||||
cd minecraft-pe-0.6.1
|
||||
```
|
||||
You can also build from the ios-support branch by checking out to it
|
||||
```
|
||||
git checkout ios-support
|
||||
```
|
||||
|
||||
### 2. Open in Xcode
|
||||
|
||||
The project file is in `minecraft-pe-0.6.1/project/iosproj/minecraftpe.xcodeproj`. Open it.
|
||||
|
||||
### 3. Configure Code Signing
|
||||
|
||||
Before you can deploy to an iPhone, you must sign the app with your own Apple Developer account:
|
||||
|
||||
1. Select the **minecraftpe** project in the left sidebar.
|
||||
2. Go to **Signing & Capabilities**.
|
||||
3. Change the **Bundle Identifier** to something unique (e.g., `com.yourname.mcpe`).
|
||||
4. Select your **Team** from the dropdown menu.
|
||||
|
||||
### 4. Build and Run
|
||||
|
||||
1. Connect your iPhone via USB or LAN.
|
||||
2. Select your device from the run destination menu at the top of Xcode.
|
||||
3. Press **Cmd + R** (or the Play button).
|
||||
4. **Note:** If you encounter a "Developer Mode" or "Untrusted Developer" error on your phone, go to **Settings > General > VPN & Device Management** to trust your certificate.
|
||||
```
|
||||
@@ -109,6 +109,7 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
||||
../../../src/client/renderer/Textures.cpp \
|
||||
../../../src/client/renderer/TileRenderer.cpp \
|
||||
../../../src/client/renderer/gles.cpp \
|
||||
../../../src/world/level/LevelConstants.cpp \
|
||||
../../../src/client/renderer/culling/Frustum.cpp \
|
||||
../../../src/client/renderer/entity/ArrowRenderer.cpp \
|
||||
../../../src/client/renderer/entity/ChickenRenderer.cpp \
|
||||
@@ -139,6 +140,12 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
||||
../../../src/network/Packet.cpp \
|
||||
../../../src/network/RakNetInstance.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/ServerPlayer.cpp \
|
||||
../../../src/util/DataIO.cpp \
|
||||
|
||||
@@ -228,6 +228,7 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
|
||||
../../../src/world/level/tile/entity/TileEntity.cpp \
|
||||
../../../src/world/level/tile/entity/FurnaceTileEntity.cpp \
|
||||
../../../src/world/phys/HitResult.cpp
|
||||
../../../src/world/level/LevelConstants.cpp
|
||||
|
||||
LOCAL_CFLAGS := -Wno-psabi $(LOCAL_CFLAGS)
|
||||
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
|
||||
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="EHf-IW-A2E">
|
||||
<objects>
|
||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="obG-Y5-kRd">
|
||||
<rect key="frame" x="0.0" y="626.5" width="375" height="20.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="minecraftpe" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="GJd-Yh-RWb">
|
||||
<rect key="frame" x="0.0" y="202" width="375" height="43"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Bcu-3y-fUS" firstAttribute="centerX" secondItem="obG-Y5-kRd" secondAttribute="centerX" id="5cz-MP-9tL"/>
|
||||
<constraint firstItem="Bcu-3y-fUS" firstAttribute="centerX" secondItem="GJd-Yh-RWb" secondAttribute="centerX" id="Q3B-4B-g5h"/>
|
||||
<constraint firstItem="obG-Y5-kRd" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" constant="20" symbolic="YES" id="SfN-ll-jLj"/>
|
||||
<constraint firstAttribute="bottom" secondItem="obG-Y5-kRd" secondAttribute="bottom" constant="20" id="Y44-ml-fuU"/>
|
||||
<constraint firstItem="GJd-Yh-RWb" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="bottom" multiplier="1/3" constant="1" id="moa-c2-u7t"/>
|
||||
<constraint firstItem="GJd-Yh-RWb" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" constant="20" symbolic="YES" id="x7j-FC-K8j"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="53" y="375"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
@@ -41,6 +41,7 @@
|
||||
042A91AE16B17517007ABBC6 /* GuiElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A316B17517007ABBC6 /* GuiElement.cpp */; };
|
||||
042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A516B17517007ABBC6 /* NinePatch.cpp */; };
|
||||
042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A716B17517007ABBC6 /* OptionsGroup.cpp */; };
|
||||
042A91B116B17517007ABBC6 /* OptionsPane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A916B17517007ABBC6 /* OptionsPane.cpp */; };
|
||||
042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91AB16B17517007ABBC6 /* TextBox.cpp */; };
|
||||
044129071682FF9600B70EE6 /* MouseHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 044129061682FF9600B70EE6 /* MouseHandler.cpp */; };
|
||||
9D293CE716071C08000305C8 /* CreateNewWorld_iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */; };
|
||||
@@ -1146,33 +1147,6 @@
|
||||
D5F3B7DD14548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C814548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib */; };
|
||||
D5F3B7DE14548E7900D25470 /* IASKSpecifierValuesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C914548E7900D25470 /* IASKSpecifierValuesView.xib */; };
|
||||
D5F3B7E51454930400D25470 /* InAppSettings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7E41454930400D25470 /* InAppSettings.bundle */; };
|
||||
F912B8CF2F6C3D5200BC60DF /* TextBox.h in Sources */ = {isa = PBXBuildFile; fileRef = 042A91AC16B17517007ABBC6 /* TextBox.h */; };
|
||||
F99D341F2F736AA100DC153E /* HttpClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D341E2F736AA100DC153E /* HttpClient.cpp */; };
|
||||
F99D34202F736AA100DC153E /* HttpClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D341E2F736AA100DC153E /* HttpClient.cpp */; };
|
||||
F99D34232F736AD400DC153E /* TextOption.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34222F736AD400DC153E /* TextOption.cpp */; };
|
||||
F99D34242F736AD400DC153E /* TextOption.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34222F736AD400DC153E /* TextOption.cpp */; };
|
||||
F99D34272F736AFB00DC153E /* OptionsFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34262F736AFB00DC153E /* OptionsFile.cpp */; };
|
||||
F99D34282F736AFB00DC153E /* OptionsFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34262F736AFB00DC153E /* OptionsFile.cpp */; };
|
||||
F99D342B2F736B6F00DC153E /* OptionsItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D342A2F736B6F00DC153E /* OptionsItem.cpp */; };
|
||||
F99D342C2F736B6F00DC153E /* OptionsItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D342A2F736B6F00DC153E /* OptionsItem.cpp */; };
|
||||
F99D342F2F736BAD00DC153E /* ConsoleScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D342E2F736BAD00DC153E /* ConsoleScreen.cpp */; };
|
||||
F99D34302F736BAD00DC153E /* ConsoleScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D342E2F736BAD00DC153E /* ConsoleScreen.cpp */; };
|
||||
F99D34332F736BDA00DC153E /* CreditsScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34322F736BDA00DC153E /* CreditsScreen.cpp */; };
|
||||
F99D34342F736BDA00DC153E /* CreditsScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34322F736BDA00DC153E /* CreditsScreen.cpp */; };
|
||||
F99D34372F736C1000DC153E /* JoinByIPScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34362F736C1000DC153E /* JoinByIPScreen.cpp */; };
|
||||
F99D34382F736C1000DC153E /* JoinByIPScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34362F736C1000DC153E /* JoinByIPScreen.cpp */; };
|
||||
F99D343B2F736C3B00DC153E /* UsernameScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D343A2F736C3B00DC153E /* UsernameScreen.cpp */; };
|
||||
F99D343C2F736C3B00DC153E /* UsernameScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D343A2F736C3B00DC153E /* UsernameScreen.cpp */; };
|
||||
F99D343F2F736C8400DC153E /* GuiElementContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D343E2F736C8400DC153E /* GuiElementContainer.cpp */; };
|
||||
F99D34402F736C8400DC153E /* GuiElementContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D343E2F736C8400DC153E /* GuiElementContainer.cpp */; };
|
||||
F99D34432F736F9400DC153E /* Option.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34422F736F9400DC153E /* Option.cpp */; };
|
||||
F99D34442F736F9400DC153E /* Option.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34422F736F9400DC153E /* Option.cpp */; };
|
||||
F99D34472F736FE800DC153E /* KeyOption.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34462F736FE800DC153E /* KeyOption.cpp */; };
|
||||
F99D34482F736FE800DC153E /* KeyOption.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D34462F736FE800DC153E /* KeyOption.cpp */; };
|
||||
F99D344B2F7370CF00DC153E /* Slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D344A2F7370CF00DC153E /* Slider.cpp */; };
|
||||
F99D344C2F7370CF00DC153E /* Slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D344A2F7370CF00DC153E /* Slider.cpp */; };
|
||||
F99D344E2F7372A100DC153E /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F99D344D2F7372A100DC153E /* Launch Screen.storyboard */; };
|
||||
F99D344F2F7372A100DC153E /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F99D344D2F7372A100DC153E /* Launch Screen.storyboard */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
@@ -1234,8 +1208,10 @@
|
||||
042A91A616B17517007ABBC6 /* NinePatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NinePatch.h; sourceTree = "<group>"; };
|
||||
042A91A716B17517007ABBC6 /* OptionsGroup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OptionsGroup.cpp; sourceTree = "<group>"; };
|
||||
042A91A816B17517007ABBC6 /* OptionsGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OptionsGroup.h; sourceTree = "<group>"; };
|
||||
042A91A916B17517007ABBC6 /* OptionsPane.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OptionsPane.cpp; sourceTree = "<group>"; };
|
||||
042A91AA16B17517007ABBC6 /* OptionsPane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OptionsPane.h; sourceTree = "<group>"; };
|
||||
042A91AB16B17517007ABBC6 /* TextBox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextBox.cpp; sourceTree = "<group>"; };
|
||||
042A91AC16B17517007ABBC6 /* TextBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TextBox.h; path = ../../src/client/gui/components/TextBox.h; sourceTree = SOURCE_ROOT; };
|
||||
042A91AC16B17517007ABBC6 /* TextBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextBox.h; sourceTree = "<group>"; };
|
||||
044129061682FF9600B70EE6 /* MouseHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseHandler.cpp; 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>"; };
|
||||
@@ -2041,7 +2017,7 @@
|
||||
D5B50D6914CFF66F005F7284 /* Multitouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Multitouch.h; sourceTree = "<group>"; };
|
||||
D5B50D6A14CFF66F005F7284 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
|
||||
D5B50D6B14CFF66F005F7284 /* time.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = time.cpp; sourceTree = "<group>"; };
|
||||
D5B50D6C14CFF66F005F7284 /* time.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 4; path = time.h; sourceTree = "<group>"; };
|
||||
D5B50D6C14CFF66F005F7284 /* time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time.h; sourceTree = "<group>"; };
|
||||
D5B50E5614CFF66F005F7284 /* SharedConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedConstants.h; sourceTree = "<group>"; };
|
||||
D5B50E5714CFF66F005F7284 /* terrain_4444.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = terrain_4444.h; sourceTree = "<group>"; };
|
||||
D5B50E5814CFF66F005F7284 /* terrain_5551.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = terrain_5551.h; sourceTree = "<group>"; };
|
||||
@@ -2432,31 +2408,6 @@
|
||||
D5F3B7C814548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSToggleSwitchSpecifierViewCell.xib; sourceTree = "<group>"; };
|
||||
D5F3B7C914548E7900D25470 /* IASKSpecifierValuesView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKSpecifierValuesView.xib; sourceTree = "<group>"; };
|
||||
D5F3B7E41454930400D25470 /* InAppSettings.bundle */ = {isa = PBXFileReference; explicitFileType = "wrapper.installer-pkg"; path = InAppSettings.bundle; sourceTree = "<group>"; };
|
||||
F99D341D2F736AA100DC153E /* HttpClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HttpClient.h; path = ../../src/platform/HttpClient.h; sourceTree = "<group>"; };
|
||||
F99D341E2F736AA100DC153E /* HttpClient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HttpClient.cpp; path = ../../src/platform/HttpClient.cpp; sourceTree = "<group>"; };
|
||||
F99D34212F736AD400DC153E /* TextOption.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TextOption.h; path = ../../src/client/gui/components/TextOption.h; sourceTree = "<group>"; };
|
||||
F99D34222F736AD400DC153E /* TextOption.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TextOption.cpp; path = ../../src/client/gui/components/TextOption.cpp; };
|
||||
F99D34252F736AFB00DC153E /* OptionsFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionsFile.h; path = ../../src/client/OptionsFile.h; sourceTree = "<group>"; sourceTree = "<group>"; };
|
||||
F99D34262F736AFB00DC153E /* OptionsFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OptionsFile.cpp; path = ../../src/client/OptionsFile.cpp; sourceTree = "<group>"; };
|
||||
F99D34292F736B6F00DC153E /* OptionsItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionsItem.h; path = ../../src/client/gui/components/OptionsItem.h; sourceTree = "<group>"; };
|
||||
F99D342A2F736B6F00DC153E /* OptionsItem.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OptionsItem.cpp; path = ../../src/client/gui/components/OptionsItem.cpp; sourceTree = "<group>"; };
|
||||
F99D342D2F736BAD00DC153E /* ConsoleScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ConsoleScreen.h; path = ../../src/client/gui/screens/ConsoleScreen.h; sourceTree = "<group>"; };
|
||||
F99D342E2F736BAD00DC153E /* ConsoleScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ConsoleScreen.cpp; path = ../../src/client/gui/screens/ConsoleScreen.cpp; sourceTree = "<group>"; };
|
||||
F99D34312F736BDA00DC153E /* CreditsScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CreditsScreen.h; path = ../../src/client/gui/screens/CreditsScreen.h; sourceTree = "<group>"; };
|
||||
F99D34322F736BDA00DC153E /* CreditsScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CreditsScreen.cpp; path = ../../src/client/gui/screens/CreditsScreen.cpp; sourceTree = "<group>"; };
|
||||
F99D34352F736C1000DC153E /* JoinByIPScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JoinByIPScreen.h; path = ../../src/client/gui/screens/JoinByIPScreen.h; sourceTree = "<group>"; };
|
||||
F99D34362F736C1000DC153E /* JoinByIPScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JoinByIPScreen.cpp; path = ../../src/client/gui/screens/JoinByIPScreen.cpp; sourceTree = "<group>"; };
|
||||
F99D34392F736C3B00DC153E /* UsernameScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = UsernameScreen.h; path = ../../src/client/gui/screens/UsernameScreen.h; sourceTree = "<group>"; };
|
||||
F99D343A2F736C3B00DC153E /* UsernameScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UsernameScreen.cpp; path = ../../src/client/gui/screens/UsernameScreen.cpp; sourceTree = "<group>"; };
|
||||
F99D343D2F736C8400DC153E /* GuiElementContainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GuiElementContainer.h; path = ../../src/client/gui/components/GuiElementContainer.h; sourceTree = "<group>"; };
|
||||
F99D343E2F736C8400DC153E /* GuiElementContainer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GuiElementContainer.cpp; path = ../../src/client/gui/components/GuiElementContainer.cpp; sourceTree = "<group>"; };
|
||||
F99D34412F736F9400DC153E /* Option.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Option.h; path = ../../src/client/Option.h; sourceTree = "<group>"; };
|
||||
F99D34422F736F9400DC153E /* Option.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Option.cpp; path = ../../src/client/Option.cpp; sourceTree = "<group>"; };
|
||||
F99D34452F736FE800DC153E /* KeyOption.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = KeyOption.h; path = ../../src/client/gui/components/KeyOption.h; sourceTree = "<group>"; };
|
||||
F99D34462F736FE800DC153E /* KeyOption.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = KeyOption.cpp; path = ../../src/client/gui/components/KeyOption.cpp; sourceTree = "<group>"; };
|
||||
F99D34492F7370CF00DC153E /* Slider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Slider.h; path = ../../src/client/gui/components/Slider.h; sourceTree = "<group>"; };
|
||||
F99D344A2F7370CF00DC153E /* Slider.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Slider.cpp; path = ../../src/client/gui/components/Slider.cpp; sourceTree = "<group>"; };
|
||||
F99D344D2F7372A100DC153E /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -3275,6 +3226,8 @@
|
||||
042A91A616B17517007ABBC6 /* NinePatch.h */,
|
||||
042A91A716B17517007ABBC6 /* OptionsGroup.cpp */,
|
||||
042A91A816B17517007ABBC6 /* OptionsGroup.h */,
|
||||
042A91A916B17517007ABBC6 /* OptionsPane.cpp */,
|
||||
042A91AA16B17517007ABBC6 /* OptionsPane.h */,
|
||||
042A91AB16B17517007ABBC6 /* TextBox.cpp */,
|
||||
042A91AC16B17517007ABBC6 /* TextBox.h */,
|
||||
D5B50C2814CFF66F005F7284 /* Button.cpp */,
|
||||
@@ -4303,7 +4256,6 @@
|
||||
D5CF9C37144C225000E4244F = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F99D344D2F7372A100DC153E /* Launch Screen.storyboard */,
|
||||
D5E1BA9A1451C8A0007DCC4F /* Default@2x.png */,
|
||||
9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */,
|
||||
D5F07744145EF79B00EC30FB /* Default-Landscape~ipad.png */,
|
||||
@@ -4315,30 +4267,6 @@
|
||||
D5CF9C45144C225000E4244F /* Frameworks */,
|
||||
D5CF9C43144C225000E4244F /* Products */,
|
||||
D5B50C1614CFF66F005F7284 /* src */,
|
||||
F99D341D2F736AA100DC153E /* HttpClient.h */,
|
||||
F99D341E2F736AA100DC153E /* HttpClient.cpp */,
|
||||
F99D34212F736AD400DC153E /* TextOption.h */,
|
||||
F99D34222F736AD400DC153E /* TextOption.cpp */,
|
||||
F99D34252F736AFB00DC153E /* OptionsFile.h */,
|
||||
F99D34262F736AFB00DC153E /* OptionsFile.cpp */,
|
||||
F99D34292F736B6F00DC153E /* OptionsItem.h */,
|
||||
F99D342A2F736B6F00DC153E /* OptionsItem.cpp */,
|
||||
F99D342D2F736BAD00DC153E /* ConsoleScreen.h */,
|
||||
F99D342E2F736BAD00DC153E /* ConsoleScreen.cpp */,
|
||||
F99D34312F736BDA00DC153E /* CreditsScreen.h */,
|
||||
F99D34322F736BDA00DC153E /* CreditsScreen.cpp */,
|
||||
F99D34352F736C1000DC153E /* JoinByIPScreen.h */,
|
||||
F99D34362F736C1000DC153E /* JoinByIPScreen.cpp */,
|
||||
F99D34392F736C3B00DC153E /* UsernameScreen.h */,
|
||||
F99D343A2F736C3B00DC153E /* UsernameScreen.cpp */,
|
||||
F99D343D2F736C8400DC153E /* GuiElementContainer.h */,
|
||||
F99D343E2F736C8400DC153E /* GuiElementContainer.cpp */,
|
||||
F99D34412F736F9400DC153E /* Option.h */,
|
||||
F99D34422F736F9400DC153E /* Option.cpp */,
|
||||
F99D34452F736FE800DC153E /* KeyOption.h */,
|
||||
F99D34462F736FE800DC153E /* KeyOption.cpp */,
|
||||
F99D34492F7370CF00DC153E /* Slider.h */,
|
||||
F99D344A2F7370CF00DC153E /* Slider.cpp */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -4599,16 +4527,10 @@
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0420;
|
||||
TargetAttributes = {
|
||||
D5CF9C41144C225000E4244F = {
|
||||
DevelopmentTeam = PZUVNW8F2U;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = D5CF9C3C144C225000E4244F /* Build configuration list for PBXProject "minecraftpe" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = en;
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
@@ -4677,7 +4599,6 @@
|
||||
D5B50A5614CFF492005F7284 /* pig.png in Resources */,
|
||||
D5B50A5814CFF492005F7284 /* sheep_fur.png in Resources */,
|
||||
D5B50A5A14CFF492005F7284 /* sheep.png in Resources */,
|
||||
F99D344F2F7372A100DC153E /* Launch Screen.storyboard in Resources */,
|
||||
D5B50A5C14CFF492005F7284 /* skeleton.png in Resources */,
|
||||
D5B50A5E14CFF492005F7284 /* spider.png in Resources */,
|
||||
D5B50A6014CFF492005F7284 /* zombie.png in Resources */,
|
||||
@@ -5014,7 +4935,6 @@
|
||||
D5ACF26F15C03DBF00E21C22 /* sand2.m4a in Resources */,
|
||||
D5ACF27115C03DBF00E21C22 /* sand3.m4a in Resources */,
|
||||
D5ACF27315C03DBF00E21C22 /* sand4.m4a in Resources */,
|
||||
F99D344E2F7372A100DC153E /* Launch Screen.storyboard in Resources */,
|
||||
D5ACF27515C03DBF00E21C22 /* snow1.m4a in Resources */,
|
||||
D5ACF27715C03DBF00E21C22 /* snow2.m4a in Resources */,
|
||||
D5ACF27915C03DBF00E21C22 /* snow3.m4a in Resources */,
|
||||
@@ -5091,22 +5011,18 @@
|
||||
D58BB544146A0B910002C9F5 /* IASKSettingsStore.m in Sources */,
|
||||
D58BB545146A0B910002C9F5 /* IASKSettingsStoreFile.m in Sources */,
|
||||
D58BB546146A0B910002C9F5 /* IASKSettingsStoreUserDefaults.m in Sources */,
|
||||
F99D34232F736AD400DC153E /* TextOption.cpp in Sources */,
|
||||
D58BB547146A0B910002C9F5 /* IASKSpecifier.m in Sources */,
|
||||
D58BB548146A0B910002C9F5 /* IASKPSSliderSpecifierViewCell.m in Sources */,
|
||||
D58BB549146A0B910002C9F5 /* IASKPSTextFieldSpecifierViewCell.m in Sources */,
|
||||
D58BB54A146A0B910002C9F5 /* IASKPSTitleValueSpecifierViewCell.m in Sources */,
|
||||
D58BB54B146A0B910002C9F5 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */,
|
||||
F99D343B2F736C3B00DC153E /* UsernameScreen.cpp in Sources */,
|
||||
D58BB54C146A0B910002C9F5 /* IASKSlider.m in Sources */,
|
||||
D58BB54D146A0B910002C9F5 /* IASKSwitch.m in Sources */,
|
||||
F99D34302F736BAD00DC153E /* ConsoleScreen.cpp in Sources */,
|
||||
D58BB54E146A0B910002C9F5 /* IASKTextField.m in Sources */,
|
||||
D58BB550146A0B910002C9F5 /* PVRTexture.m in Sources */,
|
||||
D5D43CC9146AF4B4002ED842 /* RenameMPWorldViewController.mm in Sources */,
|
||||
D5B50F7014CFF670005F7284 /* AppPlatform_iOS.mm in Sources */,
|
||||
D5B50F7414CFF670005F7284 /* CreativeMode.cpp in Sources */,
|
||||
F99D34432F736F9400DC153E /* Option.cpp in Sources */,
|
||||
D5B50F7614CFF670005F7284 /* GameMode.cpp in Sources */,
|
||||
D5B50F7814CFF670005F7284 /* Button.cpp in Sources */,
|
||||
D5B50F7A14CFF670005F7284 /* ImageButton.cpp in Sources */,
|
||||
@@ -5151,7 +5067,6 @@
|
||||
D5B50FC814CFF670005F7284 /* KeyboardInput.cpp in Sources */,
|
||||
D5B50FCA14CFF670005F7284 /* TouchscreenInput.cpp in Sources */,
|
||||
D5B50FCC14CFF670005F7284 /* LocalPlayer.cpp in Sources */,
|
||||
F99D34482F736FE800DC153E /* KeyOption.cpp in Sources */,
|
||||
D5B50FCE14CFF670005F7284 /* Chunk.cpp in Sources */,
|
||||
D5B50FD014CFF670005F7284 /* Frustum.cpp in Sources */,
|
||||
D5B50FD214CFF670005F7284 /* ChickenRenderer.cpp in Sources */,
|
||||
@@ -5210,7 +5125,6 @@
|
||||
D5B5113014CFF670005F7284 /* TripodCamera.cpp in Sources */,
|
||||
D5B5113214CFF670005F7284 /* Mob.cpp in Sources */,
|
||||
D5B5113414CFF670005F7284 /* MobCategory.cpp in Sources */,
|
||||
F99D34282F736AFB00DC153E /* OptionsFile.cpp in Sources */,
|
||||
D5B5113814CFF670005F7284 /* PathFinderMob.cpp in Sources */,
|
||||
D5B5113A14CFF670005F7284 /* Inventory.cpp in Sources */,
|
||||
D5B5113C14CFF670005F7284 /* Player.cpp in Sources */,
|
||||
@@ -5222,7 +5136,6 @@
|
||||
D5B5114814CFF670005F7284 /* Item.cpp in Sources */,
|
||||
D5B5114A14CFF670005F7284 /* ItemInstance.cpp in Sources */,
|
||||
D5B5114C14CFF670005F7284 /* PickaxeItem.cpp in Sources */,
|
||||
F99D344B2F7370CF00DC153E /* Slider.cpp in Sources */,
|
||||
D5B5114E14CFF670005F7284 /* ShovelItem.cpp in Sources */,
|
||||
D5B5115014CFF670005F7284 /* Biome.cpp in Sources */,
|
||||
D5B5115214CFF670005F7284 /* BiomeSource.cpp in Sources */,
|
||||
@@ -5273,7 +5186,6 @@
|
||||
D5251DBA1538192700FC82C8 /* CloudServer.cpp in Sources */,
|
||||
D5251DBE1538192700FC82C8 /* CommandParserInterface.cpp in Sources */,
|
||||
D5251DC01538192700FC82C8 /* ConnectionGraph2.cpp in Sources */,
|
||||
F99D34402F736C8400DC153E /* GuiElementContainer.cpp in Sources */,
|
||||
D5251DC21538192700FC82C8 /* ConsoleServer.cpp in Sources */,
|
||||
D5251DC41538192700FC82C8 /* DataCompressor.cpp in Sources */,
|
||||
D5251DC61538192700FC82C8 /* DirectoryDeltaTransfer.cpp in Sources */,
|
||||
@@ -5298,8 +5210,6 @@
|
||||
D5251DEC1538192700FC82C8 /* HTTPConnection.cpp in Sources */,
|
||||
D5251DEE1538192700FC82C8 /* IncrementalReadInterface.cpp in Sources */,
|
||||
D5251DF01538192700FC82C8 /* Itoa.cpp in Sources */,
|
||||
F99D34202F736AA100DC153E /* HttpClient.cpp in Sources */,
|
||||
F99D34382F736C1000DC153E /* JoinByIPScreen.cpp in Sources */,
|
||||
D5251DF21538192700FC82C8 /* LinuxStrings.cpp in Sources */,
|
||||
D5251DF41538192700FC82C8 /* LocklessTypes.cpp in Sources */,
|
||||
D5251DF61538192700FC82C8 /* LogCommandParser.cpp in Sources */,
|
||||
@@ -5328,7 +5238,6 @@
|
||||
D5251E2A1538192700FC82C8 /* RakSleep.cpp in Sources */,
|
||||
D5251E2C1538192700FC82C8 /* RakString.cpp in Sources */,
|
||||
D5251E2E1538192700FC82C8 /* RakThread.cpp in Sources */,
|
||||
F99D34332F736BDA00DC153E /* CreditsScreen.cpp in Sources */,
|
||||
D5251E301538192700FC82C8 /* RakWString.cpp in Sources */,
|
||||
D5251E321538192700FC82C8 /* Rand.cpp in Sources */,
|
||||
D5251E341538192700FC82C8 /* rdlmalloc.cpp in Sources */,
|
||||
@@ -5371,7 +5280,6 @@
|
||||
D5951EEB159349100043A12A /* TileEntity.cpp in Sources */,
|
||||
D5951EEF159349680043A12A /* FurnaceScreen.cpp in Sources */,
|
||||
D5951EF215934A2D0043A12A /* Feature.cpp in Sources */,
|
||||
F99D342C2F736B6F00DC153E /* OptionsItem.cpp in Sources */,
|
||||
D5951EF815934AC50043A12A /* BaseContainerMenu.cpp in Sources */,
|
||||
D5951EFA15934AC50043A12A /* FurnaceMenu.cpp in Sources */,
|
||||
D5D381F315A1A1CF00B6C50E /* FillingContainer.cpp in Sources */,
|
||||
@@ -5431,10 +5339,8 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F912B8CF2F6C3D5200BC60DF /* TextBox.h in Sources */,
|
||||
D5CF9C57144C225000E4244F /* main.mm in Sources */,
|
||||
D5CF9C5B144C225000E4244F /* minecraftpeAppDelegate.mm in Sources */,
|
||||
F99D343C2F736C3B00DC153E /* UsernameScreen.cpp in Sources */,
|
||||
D5CF9C65144C225000E4244F /* EAGLView.m in Sources */,
|
||||
D5CFA01D144C453900E4244F /* minecraftpeViewController.mm in Sources */,
|
||||
D5A55E4914500EDE00A7571B /* CreateNewWorldViewController.mm in Sources */,
|
||||
@@ -5448,7 +5354,6 @@
|
||||
D5F3B7D014548E7900D25470 /* IASKSettingsStoreUserDefaults.m in Sources */,
|
||||
D5F3B7D114548E7900D25470 /* IASKSpecifier.m in Sources */,
|
||||
D5F3B7D214548E7900D25470 /* IASKPSSliderSpecifierViewCell.m in Sources */,
|
||||
F99D34472F736FE800DC153E /* KeyOption.cpp in Sources */,
|
||||
D5F3B7D314548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.m in Sources */,
|
||||
D5F3B7D414548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.m in Sources */,
|
||||
D5F3B7D514548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */,
|
||||
@@ -5560,13 +5465,11 @@
|
||||
D5B5112D14CFF670005F7284 /* PrimedTnt.cpp in Sources */,
|
||||
D5B5112F14CFF670005F7284 /* TripodCamera.cpp in Sources */,
|
||||
D5B5113114CFF670005F7284 /* Mob.cpp in Sources */,
|
||||
F99D34442F736F9400DC153E /* Option.cpp in Sources */,
|
||||
D5B5113314CFF670005F7284 /* MobCategory.cpp in Sources */,
|
||||
D5B5113714CFF670005F7284 /* PathFinderMob.cpp in Sources */,
|
||||
D5B5113914CFF670005F7284 /* Inventory.cpp in Sources */,
|
||||
D5B5113B14CFF670005F7284 /* Player.cpp in Sources */,
|
||||
D5B5113D14CFF670005F7284 /* Arrow.cpp in Sources */,
|
||||
F99D343F2F736C8400DC153E /* GuiElementContainer.cpp in Sources */,
|
||||
D5B5113F14CFF670005F7284 /* Recipes.cpp in Sources */,
|
||||
D5B5114114CFF670005F7284 /* ToolRecipes.cpp in Sources */,
|
||||
D5B5114314CFF670005F7284 /* WeaponRecipes.cpp in Sources */,
|
||||
@@ -5604,12 +5507,10 @@
|
||||
D5B5118514CFF670005F7284 /* HitResult.cpp in Sources */,
|
||||
D5B5118B14D03342005F7284 /* SynchedEntityData.cpp in Sources */,
|
||||
D5B5118E14DEA27F005F7284 /* DeathScreen.cpp in Sources */,
|
||||
F99D34242F736AD400DC153E /* TextOption.cpp in Sources */,
|
||||
D5B5119114DEA2B7005F7284 /* LevelData.cpp in Sources */,
|
||||
D5B5119414DEA2EF005F7284 /* DyePowderItem.cpp in Sources */,
|
||||
D584926D14FD234400741128 /* SharedConstants.cpp in Sources */,
|
||||
D584927314FD236700741128 /* MoveControl.cpp in Sources */,
|
||||
F99D344C2F7370CF00DC153E /* Slider.cpp in Sources */,
|
||||
D584928614FD240D00741128 /* IConfigListener.cpp in Sources */,
|
||||
D584928914FD2FAF00741128 /* Path.cpp in Sources */,
|
||||
D5B86281153810BD00F3238A /* I18n.cpp in Sources */,
|
||||
@@ -5661,7 +5562,6 @@
|
||||
D5251E011538192700FC82C8 /* NatTypeDetectionServer.cpp in Sources */,
|
||||
D5251E031538192700FC82C8 /* NetworkIDManager.cpp in Sources */,
|
||||
D5251E051538192700FC82C8 /* NetworkIDObject.cpp in Sources */,
|
||||
F99D34372F736C1000DC153E /* JoinByIPScreen.cpp in Sources */,
|
||||
D5251E071538192700FC82C8 /* PacketConsoleLogger.cpp in Sources */,
|
||||
D5251E091538192700FC82C8 /* PacketFileLogger.cpp in Sources */,
|
||||
D5251E0B1538192700FC82C8 /* PacketizedTCP.cpp in Sources */,
|
||||
@@ -5691,13 +5591,11 @@
|
||||
D5251E411538192700FC82C8 /* SendToThread.cpp in Sources */,
|
||||
D5251E431538192700FC82C8 /* SHA1.cpp in Sources */,
|
||||
D5251E451538192700FC82C8 /* SignaledEvent.cpp in Sources */,
|
||||
F99D34342F736BDA00DC153E /* CreditsScreen.cpp in Sources */,
|
||||
D5251E471538192700FC82C8 /* SimpleMutex.cpp in Sources */,
|
||||
D5251E491538192700FC82C8 /* SocketLayer.cpp in Sources */,
|
||||
D5251E4B1538192700FC82C8 /* StringCompressor.cpp in Sources */,
|
||||
D5251E4D1538192700FC82C8 /* StringTable.cpp in Sources */,
|
||||
D5251E4F1538192700FC82C8 /* SuperFastHash.cpp in Sources */,
|
||||
F99D342B2F736B6F00DC153E /* OptionsItem.cpp in Sources */,
|
||||
D5251E511538192700FC82C8 /* TableSerializer.cpp in Sources */,
|
||||
D5251E531538192700FC82C8 /* TCPInterface.cpp in Sources */,
|
||||
D5251E551538192700FC82C8 /* TeamBalancer.cpp in Sources */,
|
||||
@@ -5720,7 +5618,6 @@
|
||||
D5951EDD159348C50043A12A /* ItemPane.cpp in Sources */,
|
||||
D5951EE3159349000043A12A /* FurnaceTile.cpp in Sources */,
|
||||
D5951EE8159349100043A12A /* FurnaceTileEntity.cpp in Sources */,
|
||||
F99D342F2F736BAD00DC153E /* ConsoleScreen.cpp in Sources */,
|
||||
D5951EEA159349100043A12A /* TileEntity.cpp in Sources */,
|
||||
D5951EEE159349680043A12A /* FurnaceScreen.cpp in Sources */,
|
||||
D5951EF115934A2D0043A12A /* Feature.cpp in Sources */,
|
||||
@@ -5757,7 +5654,6 @@
|
||||
D544941E15D13F45005FA9B0 /* PlayerRenderer.cpp in Sources */,
|
||||
D544942215D13F5E005FA9B0 /* RemotePlayer.cpp in Sources */,
|
||||
D5B17ED515E226F50056E751 /* Throwable.cpp in Sources */,
|
||||
F99D341F2F736AA100DC153E /* HttpClient.cpp in Sources */,
|
||||
D5B17ED915E2273F0056E751 /* SurvivalMode.cpp in Sources */,
|
||||
D5B17EDD15E227670056E751 /* TrapDoorTile.cpp in Sources */,
|
||||
D5B17EE115E260910056E751 /* MoveFolder.mm in Sources */,
|
||||
@@ -5793,7 +5689,6 @@
|
||||
0400453A16A4125C003EB6FA /* FallingTileRenderer.cpp in Sources */,
|
||||
0413970716A82E1E008A9F1A /* ArmorItem.cpp in Sources */,
|
||||
0413970D16A82E6B008A9F1A /* CraftingFilters.cpp in Sources */,
|
||||
F99D34272F736AFB00DC153E /* OptionsFile.cpp in Sources */,
|
||||
0413970E16A82E6B008A9F1A /* StonecutterScreen.cpp in Sources */,
|
||||
0413971116A82E7B008A9F1A /* ArmorScreen.cpp in Sources */,
|
||||
0413971516A82EB9008A9F1A /* ArmorRecipes.cpp in Sources */,
|
||||
@@ -5802,6 +5697,7 @@
|
||||
042A91AE16B17517007ABBC6 /* GuiElement.cpp in Sources */,
|
||||
042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */,
|
||||
042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */,
|
||||
042A91B116B17517007ABBC6 /* OptionsPane.cpp in Sources */,
|
||||
042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -5839,29 +5735,25 @@
|
||||
D50BE20815EE05B8008AA75E /* Ad-Hoc */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = YES;
|
||||
ARCHS = "$(ARCHS_STANDARD)";
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = PUBLISH;
|
||||
GCC_VERSION = "";
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
||||
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "C93D3524-5C6F-466E-B12B-833663B7EAE0";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SDKROOT = iphoneos6.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
USE_HEADERMAP = NO;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = "Ad-Hoc";
|
||||
@@ -5873,26 +5765,15 @@
|
||||
GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch";
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "";
|
||||
"GCC_THUMB_SUPPORT[arch=armv7]" = NO;
|
||||
GCC_VERSION = "";
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/../../src",
|
||||
"$(SRCROOT)/../../src/client/gui/components",
|
||||
"$(SRCROOT)/../../src/world",
|
||||
"$(SRCROOT)/../../src/platform/input",
|
||||
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
|
||||
);
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.mojang.mcpe-arm64";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SYSTEM_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../lib_projects/InAppSettingsKit/Models $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USE_HEADERMAP = NO;
|
||||
SDKROOT = iphoneos6.0;
|
||||
VALID_ARCHS = "i386 armv6 armv7";
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = "Ad-Hoc";
|
||||
@@ -5965,28 +5846,24 @@
|
||||
D5A20ADB146AAD9C00A52FEC /* AppStore */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = YES;
|
||||
ARCHS = "$(ARCHS_STANDARD)";
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_VERSION = "";
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
||||
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "64BA8967-1A9A-4980-972C-42E75AD5E023";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SDKROOT = iphoneos6.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
USE_HEADERMAP = NO;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = AppStore;
|
||||
@@ -5999,19 +5876,11 @@
|
||||
GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch";
|
||||
GCC_PREPROCESSOR_DEFINITIONS = PUBLISH;
|
||||
"GCC_THUMB_SUPPORT[arch=armv7]" = NO;
|
||||
GCC_VERSION = "";
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/../../src",
|
||||
"$(SRCROOT)/../../src/client/gui/components",
|
||||
"$(SRCROOT)/../../src/world",
|
||||
"$(SRCROOT)/../../src/platform/input",
|
||||
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
|
||||
);
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
||||
OTHER_CFLAGS = (
|
||||
"-DNS_BLOCK_ASSERTIONS=1",
|
||||
"-DANDROID_PUBLISH",
|
||||
@@ -6019,10 +5888,8 @@
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "1B194957-98CF-49B7-A0E7-76692B4B722D";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SYSTEM_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../lib_projects/InAppSettingsKit/Models $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USE_HEADERMAP = NO;
|
||||
SDKROOT = iphoneos6.0;
|
||||
VALID_ARCHS = "i386 armv6 armv7";
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = AppStore;
|
||||
@@ -6055,8 +5922,8 @@
|
||||
D5CF9C6C144C225000E4244F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = YES;
|
||||
ARCHS = "$(ARCHS_STANDARD)";
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
@@ -6068,50 +5935,41 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_VERSION = "";
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SDKROOT = iphoneos6.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
USE_HEADERMAP = NO;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
D5CF9C6D144C225000E4244F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = YES;
|
||||
ARCHS = "$(ARCHS_STANDARD)";
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = PUBLISH;
|
||||
GCC_VERSION = "";
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
||||
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SDKROOT = iphoneos6.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
|
||||
USE_HEADERMAP = NO;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
@@ -6119,34 +5977,19 @@
|
||||
D5CF9C6F144C225000E4244F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = PZUVNW8F2U;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch";
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
|
||||
"GCC_THUMB_SUPPORT[arch=armv7]" = NO;
|
||||
GCC_VERSION = "";
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/../../src",
|
||||
"$(SRCROOT)/../../src/client/gui/components",
|
||||
"$(SRCROOT)/../../src/world",
|
||||
"$(SRCROOT)/../../src/platform/input",
|
||||
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
|
||||
);
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.mojang.mcpe-arm64";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SYSTEM_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../lib_projects/InAppSettingsKit/Models $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USE_HEADERMAP = NO;
|
||||
SDKROOT = iphoneos6.0;
|
||||
VALID_ARCHS = "i386 armv6 armv7";
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Debug;
|
||||
@@ -6154,34 +5997,19 @@
|
||||
D5CF9C70144C225000E4244F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = PZUVNW8F2U;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch";
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "";
|
||||
"GCC_THUMB_SUPPORT[arch=armv7]" = NO;
|
||||
GCC_VERSION = "";
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(SRCROOT)/../../src",
|
||||
"$(SRCROOT)/../../src/client/gui/components",
|
||||
"$(SRCROOT)/../../src/world",
|
||||
"$(SRCROOT)/../../src/platform/input",
|
||||
"$(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views",
|
||||
);
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.mojang.mcpe-arm64";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
RUN_CLANG_STATIC_ANALYZER = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SYSTEM_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src $(SRCROOT)/../lib_projects/InAppSettingsKit/Models $(SRCROOT)/../../src/client/gui/components $(SRCROOT)/../../src/world $(SRCROOT)/../../src/platform/input $(SRCROOT)/../../project/lib_projects/InAppSettingsKit/Views";
|
||||
USE_HEADERMAP = NO;
|
||||
SDKROOT = iphoneos6.0;
|
||||
VALID_ARCHS = "i386 armv6 armv7";
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Release;
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
</dict>
|
||||
</dict>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<string>com.mojang.${PRODUCT_NAME:rfc1034identifier}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
@@ -58,8 +58,6 @@
|
||||
<array>
|
||||
<string>minecraft.ttf</string>
|
||||
</array>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>Launch Screen</string>
|
||||
<key>UIPrerenderedIcon</key>
|
||||
<true/>
|
||||
<key>UIRequiresPersistentWiFi</key>
|
||||
|
||||
@@ -52,10 +52,11 @@ public:
|
||||
|
||||
virtual StringVector getOptionStrings();
|
||||
|
||||
virtual bool isPowerVR();
|
||||
virtual bool isPowerVR() { return false; }
|
||||
virtual bool isSuperFast();
|
||||
virtual void showKeyboard();
|
||||
virtual void hideKeyboard();
|
||||
virtual void isPowerVR();
|
||||
private:
|
||||
|
||||
std::string _basePath;
|
||||
|
||||
@@ -275,10 +275,8 @@ void AppPlatform_iOS::hideKeyboard() {
|
||||
[_viewController hideKeyboard];
|
||||
super::hideKeyboard();
|
||||
}
|
||||
|
||||
// this was originally void but i changed it to bool because void cant return values
|
||||
bool AppPlatform_iOS::isPowerVR() {
|
||||
void AppPlatform_iOS::isPowerVR() {
|
||||
const char* s = (const char*)glGetString(GL_RENDERER);
|
||||
if (!s) return false;
|
||||
return strstr(s, "SGX") != NULL;
|
||||
}
|
||||
}
|
||||
@@ -136,7 +136,7 @@ void NinecraftApp::teardown()
|
||||
Recipes ::teardownRecipes();
|
||||
TileEntity::teardownTileEntities();
|
||||
#endif
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(STANDALONE_SERVER)
|
||||
ItemRenderer::teardown_static();
|
||||
if (EntityTileRenderer::instance != NULL) {
|
||||
delete EntityTileRenderer::instance;
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#ifndef NET_MINECRAFT_CLIENT__KeyMapping_H__
|
||||
#define NET_MINECRAFT_CLIENT__KeyMapping_H__
|
||||
|
||||
//package net.minecraft.client;
|
||||
#include <string>
|
||||
|
||||
class KeyMapping
|
||||
{
|
||||
public:
|
||||
std::string name;
|
||||
int key;
|
||||
|
||||
KeyMapping() {}
|
||||
|
||||
KeyMapping(const std::string& name_, int key_)
|
||||
: name(name_),
|
||||
key(key_)
|
||||
{}
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT__KeyMapping_H__*/
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "Options.h"
|
||||
#include "client/Options.h"
|
||||
#include "client/player/input/IBuildInput.h"
|
||||
#include "commands/CommandManager.hpp"
|
||||
#include "platform/input/Keyboard.h"
|
||||
#include "world/item/Item.h"
|
||||
#include "world/item/ItemInstance.h"
|
||||
@@ -175,7 +176,8 @@ Minecraft::Minecraft() :
|
||||
_powerVr(false),
|
||||
commandPort(4711),
|
||||
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
|
||||
|
||||
@@ -256,9 +258,10 @@ void Minecraft::selectLevel( const std::string& levelId, const std::string& leve
|
||||
|
||||
void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) {
|
||||
cameraTargetPlayer = NULL;
|
||||
LOGI("Seed is %ld\n", level->getSeed());
|
||||
|
||||
if (level != NULL) {
|
||||
LOGI("Seed is %ld\n", level->getSeed());
|
||||
|
||||
level->raknetInstance = raknetInstance;
|
||||
gameMode->initLevel(level);
|
||||
|
||||
@@ -275,6 +278,11 @@ void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, Loc
|
||||
}
|
||||
}
|
||||
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;
|
||||
#ifdef STANDALONE_SERVER
|
||||
const bool threadedLevelCreation = false;
|
||||
@@ -358,10 +366,10 @@ void Minecraft::prepareLevel(const std::string& title) {
|
||||
if (!level->isNew())
|
||||
level->setUpdateLights(false);
|
||||
|
||||
int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH;
|
||||
int Max = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH;
|
||||
int pp = 0;
|
||||
for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) {
|
||||
for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) {
|
||||
for (int x = 8; x < (LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_WIDTH); x += LevelConstants::CHUNK_WIDTH) {
|
||||
for (int z = 8; z < (LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_WIDTH); z += LevelConstants::CHUNK_WIDTH) {
|
||||
progressStagePercentage = 100 * pp++ / Max;
|
||||
//printf("level generation progress %d\n", progressStagePercentage);
|
||||
B.start();
|
||||
@@ -378,9 +386,9 @@ void Minecraft::prepareLevel(const std::string& title) {
|
||||
level->setUpdateLights(true);
|
||||
|
||||
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);
|
||||
if (chunk && !chunk->createdFromSave)
|
||||
@@ -553,7 +561,7 @@ void Minecraft::tick(int nTick, int maxTick) {
|
||||
level->tickEntities();
|
||||
level->tick();
|
||||
#ifndef STANDALONE_SERVER
|
||||
TIMER_POP_PUSH("animateTick");
|
||||
TIMER_POP_PUSH("animateTick");
|
||||
if (player) {
|
||||
level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z));
|
||||
}
|
||||
@@ -726,6 +734,21 @@ void Minecraft::tickInput() {
|
||||
if (key == Keyboard::KEY_F3) {
|
||||
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) {
|
||||
options.toggle(OPTIONS_THIRD_PERSON_VIEW);
|
||||
@@ -1105,9 +1128,7 @@ void Minecraft::releaseMouse()
|
||||
}
|
||||
|
||||
bool Minecraft::useTouchscreen() {
|
||||
#if TARGET_OS_IPHONE
|
||||
return true;
|
||||
#elif RPI
|
||||
#ifdef RPI
|
||||
return false;
|
||||
#endif
|
||||
return options.getBooleanValue(OPTIONS_USE_TOUCHSCREEN) && !_supportsNonTouchscreen;
|
||||
@@ -1117,6 +1138,7 @@ bool Minecraft::supportNonTouchScreen() {
|
||||
}
|
||||
void Minecraft::init()
|
||||
{
|
||||
LevelChunk::ChunkBlockCount = LevelConstants::CHUNK_BLOCK_COUNT;
|
||||
#ifndef STANDALONE_SERVER
|
||||
checkGlError("Init enter");
|
||||
|
||||
@@ -1194,7 +1216,7 @@ void Minecraft::setSize(int w, int h) {
|
||||
int screenHeight = (int)(height * Gui::InvGuiScale);
|
||||
|
||||
// if (platform()) {
|
||||
// float pixelsPerMillimeter = options.getProgressValue(&Option::PIXELS_PER_MILLIMETER);
|
||||
// float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER);
|
||||
// pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter);
|
||||
// pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale);
|
||||
// }
|
||||
@@ -1305,12 +1327,9 @@ bool Minecraft::joinMultiplayerFromString( const std::string& server )
|
||||
} else {
|
||||
ip = server;
|
||||
}
|
||||
|
||||
printf("%s \n", port.c_str());
|
||||
|
||||
if (isLookingForMultiplayer && netCallback) {
|
||||
isLookingForMultiplayer = false;
|
||||
printf("test");
|
||||
int portNum = atoi(port.c_str());
|
||||
return raknetInstance->connect(ip.c_str(), portNum);
|
||||
}
|
||||
@@ -1584,3 +1603,11 @@ void Minecraft::optionUpdated(OptionId option, int value ) {
|
||||
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__
|
||||
|
||||
#include "Options.h"
|
||||
#include "commands/CommandManager.hpp"
|
||||
#ifndef STANDALONE_SERVER
|
||||
#include "MouseHandler.h"
|
||||
#include "gui/Gui.h"
|
||||
@@ -120,11 +121,17 @@ public:
|
||||
void optionUpdated(OptionId option, bool value);
|
||||
void optionUpdated(OptionId option, float value);
|
||||
void optionUpdated(OptionId option, int value);
|
||||
|
||||
int getTicks() { return ticks; }
|
||||
|
||||
void addMessage(const std::string& msg);
|
||||
#ifdef __APPLE__
|
||||
bool _isSuperFast;
|
||||
bool isSuperFast() { return _isSuperFast; }
|
||||
#endif
|
||||
|
||||
CommandManager& commandManager() { return m_commandManager; }
|
||||
|
||||
protected:
|
||||
void _levelGenerated();
|
||||
|
||||
@@ -197,7 +204,8 @@ public:
|
||||
std::string externalCacheStoragePath;
|
||||
protected:
|
||||
Timer timer;
|
||||
// @note @attn @warn: this is dangerous as fuck!
|
||||
|
||||
// @note @attn @warn: this is dangerous as fuck!
|
||||
volatile bool isGeneratingLevel;
|
||||
bool _hasSignaledGeneratingLevelFinished;
|
||||
|
||||
@@ -221,10 +229,11 @@ private:
|
||||
bool _isCreativeMode;
|
||||
//int _respawnPlayerTicks;
|
||||
Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour
|
||||
// shit* lmao
|
||||
|
||||
PerfRenderer* _perfRenderer;
|
||||
CommandServer* _commandServer;
|
||||
|
||||
CommandManager m_commandManager;
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/
|
||||
|
||||
@@ -104,4 +104,4 @@ public:
|
||||
|
||||
private:
|
||||
std::string m_value;
|
||||
};
|
||||
};
|
||||
@@ -94,10 +94,6 @@ typedef std::vector<std::string> StringVector;
|
||||
class Options
|
||||
{
|
||||
public:
|
||||
// deepfriedwaffles: for iOS, was getting compile errors saying: No member named 'sound' in 'Options' and No member named 'music' in 'Options' so I floated them here. 1.0f means full volume out of the box, but if everything is too loud, you might want to try adjusting this
|
||||
float sound = 1.0f;
|
||||
float music = 1.0f;
|
||||
|
||||
static bool debugGl;
|
||||
|
||||
Options(Minecraft* minecraft, const std::string& workingDirectory = "")
|
||||
|
||||
@@ -68,6 +68,7 @@ bool SurvivalMode::destroyBlock( int x, int y, int z, int face ) {
|
||||
minecraft->player->inventory->clearSlot(minecraft->player->inventory->selected);
|
||||
}
|
||||
}
|
||||
|
||||
if (changed && couldDestroy) {
|
||||
ItemInstance instance(t, 1, data);
|
||||
Tile::tiles[t]->playerDestroy(minecraft->level, minecraft->player, x, y, z, data);
|
||||
|
||||
@@ -730,7 +730,6 @@ void Gui::renderDebugInfo() {
|
||||
|
||||
// Position
|
||||
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 cx = bx >> 4, cz = bz >> 4;
|
||||
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
#include "OptionsPane.h"
|
||||
#include "OptionsGroup.h"
|
||||
#include "OptionsItem.h"
|
||||
#include "ImageButton.h"
|
||||
#include "Slider.h"
|
||||
#include "../../Minecraft.h"
|
||||
#include "client/Options.h"
|
||||
|
||||
OptionsPane::OptionsPane() {
|
||||
|
||||
}
|
||||
|
||||
void OptionsPane::setupPositions() {
|
||||
int currentHeight = y + 1;
|
||||
for(std::vector<GuiElement*>::iterator it = children.begin(); it != children.end(); ++it ) {
|
||||
(*it)->width = width;
|
||||
(*it)->y = currentHeight;
|
||||
(*it)->x = x;
|
||||
currentHeight += (*it)->height + 1;
|
||||
}
|
||||
height = currentHeight;
|
||||
super::setupPositions();
|
||||
}
|
||||
|
||||
OptionsGroup& OptionsPane::createOptionsGroup( std::string label ) {
|
||||
OptionsGroup* newGroup = new OptionsGroup(label);
|
||||
children.push_back(newGroup);
|
||||
// create and return a new group index
|
||||
return *newGroup;
|
||||
}
|
||||
|
||||
void OptionsPane::createToggle( unsigned int group, std::string label, OptionId option ) {
|
||||
if(group > children.size()) return;
|
||||
ImageDef def;
|
||||
def.setSrc(IntRectangle(160, 206, 39, 20));
|
||||
def.name = "gui/touchgui.png";
|
||||
def.width = 39 * 0.7f;
|
||||
def.height = 20 * 0.7f;
|
||||
OptionButton* element = new OptionButton(option);
|
||||
element->setImageDef(def, true);
|
||||
OptionsItem* item = new OptionsItem(option, label, element);
|
||||
((OptionsGroup*)children[group])->addChild(item);
|
||||
setupPositions();
|
||||
}
|
||||
|
||||
void OptionsPane::createProgressSlider( Minecraft* minecraft, unsigned int group, std::string label, OptionId option, float progressMin/*=1.0f*/, float progressMax/*=1.0f */ ) {
|
||||
if(group > children.size()) return;
|
||||
Slider* element = new SliderFloat(minecraft, option);
|
||||
element->width = 100;
|
||||
element->height = 20;
|
||||
OptionsItem* item = new OptionsItem(option, label, element);
|
||||
((OptionsGroup*)children[group])->addChild(item);
|
||||
setupPositions();
|
||||
}
|
||||
|
||||
void OptionsPane::createStepSlider( Minecraft* minecraft, unsigned int group, std::string label, OptionId option, const std::vector<int>& stepVec ) {
|
||||
if(group > children.size()) return;
|
||||
Slider* element = new SliderInt(minecraft, option);
|
||||
element->width = 100;
|
||||
element->height = 20;
|
||||
OptionsItem* item = new OptionsItem(option, label, element);
|
||||
((OptionsGroup*)children[group])->addChild(item);
|
||||
setupPositions();
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#ifndef ITEMPANE_H__
|
||||
#define ITEMPANE_H__
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "GuiElementContainer.h"
|
||||
#include "../../../world/item/ItemInstance.h"
|
||||
#include "../../../client/Options.h"
|
||||
class Font;
|
||||
class Textures;
|
||||
class NinePatchLayer;
|
||||
class ItemPane;
|
||||
class OptionButton;
|
||||
class Button;
|
||||
class OptionsGroup;
|
||||
class Slider;
|
||||
class Minecraft;
|
||||
class OptionsPane: public GuiElementContainer
|
||||
{
|
||||
typedef GuiElementContainer super;
|
||||
public:
|
||||
OptionsPane();
|
||||
OptionsGroup& createOptionsGroup( std::string label );
|
||||
void createToggle( unsigned int group, std::string label, OptionId option );
|
||||
void createProgressSlider(Minecraft* minecraft, unsigned int group, std::string label, OptionId option, float progressMin=1.0f, float progressMax=1.0f );
|
||||
void createStepSlider(Minecraft* minecraft, unsigned int group, std::string label, OptionId option, const std::vector<int>& stepVec );
|
||||
void setupPositions();
|
||||
};
|
||||
|
||||
#endif /*ITEMPANE_H__*/
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "GuiElement.h"
|
||||
#include "../../../client/Options.h"
|
||||
#include <client/Option.h>
|
||||
|
||||
class Slider : public GuiElement {
|
||||
typedef GuiElement super;
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
#include "SmallButton.h"
|
||||
|
||||
SmallButton::SmallButton( int id, int x, int y, const std::string& msg )
|
||||
: super(id, x, y, 150, 20, msg),
|
||||
option(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
SmallButton::SmallButton( int id, int x, int y, int width, int height, const std::string& msg )
|
||||
: super(id, x, y, width, height, msg),
|
||||
option(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
SmallButton::SmallButton( int id, int x, int y, Option* item, const std::string& msg )
|
||||
: super(id, x, y, 150, 20, msg),
|
||||
option(item)
|
||||
{
|
||||
}
|
||||
|
||||
Option* SmallButton::getOption()
|
||||
{
|
||||
return option;
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__SmallButton_H__
|
||||
#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__SmallButton_H__
|
||||
|
||||
//package net.minecraft.client.gui;
|
||||
|
||||
#include <string>
|
||||
#include "Button.h"
|
||||
#include "../../Options.h"
|
||||
|
||||
class SmallButton: public Button
|
||||
{
|
||||
typedef Button super;
|
||||
public:
|
||||
SmallButton(int id, int x, int y, const std::string& msg);
|
||||
SmallButton(int id, int x, int y, int width, int height, const std::string& msg);
|
||||
SmallButton(int id, int x, int y, Option* item, const std::string& msg);
|
||||
|
||||
Option* getOption();
|
||||
private:
|
||||
Option* option;
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__SmallButton_H__*/
|
||||
@@ -1,26 +0,0 @@
|
||||
#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS__BuyGameScreen_H__
|
||||
#define NET_MINECRAFT_CLIENT_GUI_SCREENS__BuyGameScreen_H__
|
||||
|
||||
#include "../Screen.h"
|
||||
#include "../components/Button.h"
|
||||
|
||||
class BuyGameScreen: public Screen
|
||||
{
|
||||
public:
|
||||
BuyGameScreen() {}
|
||||
virtual ~BuyGameScreen() {}
|
||||
|
||||
void init();
|
||||
|
||||
void render(int xm, int ym, float a);
|
||||
|
||||
void buttonClicked(Button* button) {
|
||||
//if (button->id == bQuit.id)
|
||||
}
|
||||
|
||||
private:
|
||||
//Button bQuit;
|
||||
//Button bBuyGame;
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS__BuyGameScreen_H__*/
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "../../../network/ServerSideNetworkHandler.h"
|
||||
#include "../../../network/packet/ChatPacket.h"
|
||||
#include "../../../platform/log.h"
|
||||
#include "util/StringUtils.h"
|
||||
|
||||
#include <sstream>
|
||||
#include <cstdlib>
|
||||
@@ -54,141 +55,37 @@ void ConsoleScreen::charPressed(char inputChar)
|
||||
_input += inputChar;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// execute: run _input as a command, print result, close screen
|
||||
// ---------------------------------------------------------------------------
|
||||
void ConsoleScreen::execute()
|
||||
{
|
||||
if (!minecraft->level) return;
|
||||
|
||||
if (_input.empty()) {
|
||||
minecraft->setScreen(NULL);
|
||||
return;
|
||||
return minecraft->setScreen(NULL);
|
||||
}
|
||||
|
||||
if (_input[0] == '/') {
|
||||
// Command
|
||||
std::string result = processCommand(_input);
|
||||
if (!result.empty())
|
||||
minecraft->gui.addMessage(result);
|
||||
_input = Util::stringTrim(_input.substr(1));
|
||||
|
||||
std::istringstream iss(minecraft->commandManager().execute(*minecraft, *minecraft->player, _input));
|
||||
for (std::string line; std::getline(iss, line); ) {
|
||||
minecraft->gui.addMessage(line);
|
||||
}
|
||||
} else {
|
||||
// Chat message: <name> message
|
||||
std::string msg = std::string("<") + minecraft->player->name + "> " + _input;
|
||||
// @ai @rewrite
|
||||
if (minecraft->netCallback && minecraft->raknetInstance->isServer()) {
|
||||
// Hosting a LAN game: displayGameMessage shows locally + broadcasts MessagePacket to clients
|
||||
static_cast<ServerSideNetworkHandler*>(minecraft->netCallback)->displayGameMessage(msg);
|
||||
static_cast<ServerSideNetworkHandler*>(minecraft->netCallback)->displayGameMessage(_input);
|
||||
} else if (minecraft->netCallback) {
|
||||
// Connected client: send ChatPacket to server; server echoes it back as MessagePacket
|
||||
ChatPacket chatPkt(msg);
|
||||
ChatPacket chatPkt(_input);
|
||||
minecraft->raknetInstance->send(chatPkt);
|
||||
} else {
|
||||
// Singleplayer: show locally only
|
||||
minecraft->gui.addMessage(msg);
|
||||
minecraft->gui.addMessage("<" + minecraft->player->name + "> " + _input);
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@@ -25,7 +25,6 @@ public:
|
||||
|
||||
private:
|
||||
void execute();
|
||||
std::string processCommand(const std::string& cmd);
|
||||
|
||||
std::string _input;
|
||||
int _cursorBlink; // tick counter for cursor blink
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS__InvalidLicenseScreen_H__
|
||||
#define NET_MINECRAFT_CLIENT_GUI_SCREENS__InvalidLicenseScreen_H__
|
||||
|
||||
#include "../Screen.h"
|
||||
#include "../components/Button.h"
|
||||
#include "../../Minecraft.h"
|
||||
#include "../../../LicenseCodes.h"
|
||||
|
||||
class InvalidLicenseScreen: public Screen
|
||||
{
|
||||
public:
|
||||
InvalidLicenseScreen(int id, bool hasBuyButton)
|
||||
: _id(id),
|
||||
_hasBuyButton(hasBuyButton),
|
||||
_baseY(0),
|
||||
bOk(0),
|
||||
bBuy(0)
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~InvalidLicenseScreen() {
|
||||
delete bOk;
|
||||
delete bBuy;
|
||||
}
|
||||
|
||||
void init() {
|
||||
if (minecraft->useTouchscreen()) {
|
||||
bOk = new Touch::TButton(1, "Ok");
|
||||
bBuy = new Touch::TButton(2, "Buy");
|
||||
} else {
|
||||
bOk = new Button(1, "Ok");
|
||||
bBuy = new Button(2, "Buy");
|
||||
}
|
||||
|
||||
if (_hasBuyButton)
|
||||
bOk->msg = "Quit";
|
||||
|
||||
if (!LicenseCodes::isOk(_id)) {
|
||||
char buf[20] = {0};
|
||||
sprintf(buf, "%d", _id);
|
||||
|
||||
desc1 = "License verification failed (error ";
|
||||
desc1 += buf;
|
||||
desc1 += ")";
|
||||
desc2 = "Try again later.";
|
||||
hint = "You need to be connected to the internet\n";
|
||||
hint += "once while you start the game.";
|
||||
}
|
||||
|
||||
buttons.push_back(bOk);
|
||||
tabButtons.push_back(bOk);
|
||||
|
||||
if (_hasBuyButton) {
|
||||
buttons.push_back(bBuy);
|
||||
tabButtons.push_back(bBuy);
|
||||
}
|
||||
}
|
||||
|
||||
void setupPositions() {
|
||||
_baseY = height/5 + 6;
|
||||
//if (_hasBuyButton)
|
||||
_baseY -= 24;
|
||||
|
||||
bOk->width = bBuy->width = 200;
|
||||
bOk->x = bBuy->x = (width - bOk->width) / 2;
|
||||
bBuy->y = _baseY + 84;
|
||||
bOk->y = bBuy->y + bBuy->height + 4;
|
||||
|
||||
if (!_hasBuyButton)
|
||||
bOk->y -= 24;
|
||||
}
|
||||
|
||||
void tick() {}
|
||||
|
||||
//void keyPressed(int eventKey) {}
|
||||
|
||||
void render(int xm, int ym, float a) {
|
||||
renderDirtBackground(0);
|
||||
drawCenteredString(minecraft->font, desc1, width/2, _baseY, 0xffffff);
|
||||
drawCenteredString(minecraft->font, desc2, width/2, _baseY + 24, 0xffffff);
|
||||
|
||||
drawCenteredString(minecraft->font, hint, width/2, _baseY + 60, 0xffffff);
|
||||
|
||||
Screen::render(xm, ym, a);
|
||||
}
|
||||
|
||||
void buttonClicked(Button* button) {
|
||||
if (button->id == bOk->id) {
|
||||
minecraft->quit();
|
||||
}
|
||||
if (button->id == bBuy->id) {
|
||||
minecraft->platform()->buyGame();
|
||||
}
|
||||
};
|
||||
private:
|
||||
int _id;
|
||||
std::string desc1;
|
||||
std::string desc2;
|
||||
std::string hint;
|
||||
|
||||
Button* bOk;
|
||||
Button* bBuy;
|
||||
bool _hasBuyButton;
|
||||
int _baseY;
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS__InvalidLicenseScreen_H__*/
|
||||
@@ -2,8 +2,8 @@
|
||||
#include "../Screen.h"
|
||||
#include "../components/Button.h"
|
||||
#include "../../Minecraft.h"
|
||||
#include "../components/ImageButton.h"
|
||||
#include "../components/TextBox.h"
|
||||
#include "client/gui/components/ImageButton.h"
|
||||
#include "client/gui/components/TextBox.h"
|
||||
|
||||
class JoinByIPScreen: public Screen
|
||||
{
|
||||
@@ -25,4 +25,4 @@ private:
|
||||
Touch::THeader bHeader;
|
||||
Touch::TButton bJoin;
|
||||
ImageButton bBack;
|
||||
};
|
||||
};
|
||||
@@ -216,9 +216,6 @@ void OptionsScreen::generateOptionScreens() {
|
||||
|
||||
// // Graphics Pane
|
||||
optionPanes[3]->addOptionItem(OPTIONS_FANCY_GRAPHICS, minecraft)
|
||||
// .addOptionItem(&Option::VIEW_BOBBING, minecraft)
|
||||
// .addOptionItem(&Option::AMBIENT_OCCLUSION, minecraft)
|
||||
// .addOptionItem(&Option::ANAGLYPH, minecraft)
|
||||
.addOptionItem(OPTIONS_LIMIT_FRAMERATE, minecraft)
|
||||
.addOptionItem(OPTIONS_VSYNC, minecraft)
|
||||
.addOptionItem(OPTIONS_RENDER_DEBUG, minecraft)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "../../Minecraft.h"
|
||||
|
||||
#include "UsernameScreen.h"
|
||||
#include <client/gui/screens/UsernameScreen.h>
|
||||
|
||||
Screen* ScreenChooser::createScreen( ScreenId id )
|
||||
{
|
||||
|
||||
@@ -35,8 +35,8 @@ void UsernameScreen::setupPositions()
|
||||
// Make the done button match the touch-style option tabs
|
||||
_btnDone.width = 66;
|
||||
_btnDone.height = 26;
|
||||
_btnDone.x = cx - (_btnDone.width / 2);
|
||||
_btnDone.y = cy + 52;
|
||||
_btnDone.x = (width - _btnDone.width) / 2;
|
||||
_btnDone.y = height / 2 + 52;
|
||||
|
||||
tUsername.width = 120;
|
||||
tUsername.height = 20;
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
|
||||
#include "../Screen.h"
|
||||
#include "../components/Button.h"
|
||||
// this is cursed lol
|
||||
#include "../../../client/gui/components/TextBox.h"
|
||||
#include "client/gui/components/TextBox.h"
|
||||
#include <string>
|
||||
|
||||
class UsernameScreen : public Screen
|
||||
|
||||
@@ -16,7 +16,12 @@
|
||||
#include "../../../../world/level/Level.h"
|
||||
#include "../../../../world/item/DyePowderItem.h"
|
||||
#include "../../../../world/item/crafting/Recipe.h"
|
||||
#include "network/RakNetInstance.h"
|
||||
#include "network/packet/WantCreatePacket.h"
|
||||
#include "platform/input/Keyboard.h"
|
||||
#include <cstdint>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
static NinePatchLayer* guiPaneFrame = NULL;
|
||||
|
||||
@@ -193,6 +198,26 @@ void PaneCraftingScreen::setupPositions() {
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -439,25 +464,29 @@ void PaneCraftingScreen::craftSelectedItem()
|
||||
ItemInstance resultItem = currentItem->item;
|
||||
|
||||
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 ...
|
||||
for (unsigned int i = 0; i < currentItem->neededItems.size(); ++i) {
|
||||
CItem::ReqItem& req = currentItem->neededItems[i];
|
||||
|
||||
// If the recipe allows any aux-value as ingredients, first deplete
|
||||
// aux == 0 from inventory. Since I'm not sure if this always is
|
||||
// correct, let's only do it for ingredient sandstone for now.
|
||||
ItemInstance toRemove = req.item;
|
||||
// If the recipe allows any aux-value as ingredients, first deplete
|
||||
// aux == 0 from inventory. Since I'm not sure if this always is
|
||||
// correct, let's only do it for ingredient sandstone for now.
|
||||
ItemInstance toRemove = req.item;
|
||||
|
||||
if (Tile::sandStone->id == req.item.id
|
||||
&& Recipe::ANY_AUX_VALUE == req.item.getAuxValue()) {
|
||||
toRemove.setAuxValue(0);
|
||||
toRemove.count = minecraft->player->inventory->removeResource(toRemove, true);
|
||||
toRemove.setAuxValue(Recipe::ANY_AUX_VALUE);
|
||||
}
|
||||
if (Tile::sandStone->id == req.item.id
|
||||
&& Recipe::ANY_AUX_VALUE == req.item.getAuxValue()) {
|
||||
toRemove.setAuxValue(0);
|
||||
toRemove.count = minecraft->player->inventory->removeResource(toRemove, true);
|
||||
toRemove.setAuxValue(Recipe::ANY_AUX_VALUE);
|
||||
}
|
||||
|
||||
if (toRemove.count > 0) {
|
||||
minecraft->player->inventory->removeResource(toRemove);
|
||||
}
|
||||
if (toRemove.count > 0) {
|
||||
minecraft->player->inventory->removeResource(toRemove);
|
||||
}
|
||||
}
|
||||
// ... add the new one! (in this order, to fill empty slots better)
|
||||
// if it doesn't fit, throw it on the ground!
|
||||
|
||||
@@ -456,7 +456,7 @@ void LocalPlayer::tick() {
|
||||
{
|
||||
sentInventoryItemId = newItemId;
|
||||
sentInventoryItemData = newItemData;
|
||||
PlayerEquipmentPacket packet(entityId, newItemId, newItemData);
|
||||
PlayerEquipmentPacket packet(entityId, newItemId, newItemData, inventory->selected, inventory->getSlot(newItemId, newItemData));
|
||||
minecraft->raknetInstance->send(packet);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ LevelRenderer::LevelRenderer( Minecraft* mc)
|
||||
destroyProgress(0)
|
||||
{
|
||||
#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;
|
||||
chunkBuffers = new GLuint[numListsOrBuffers];
|
||||
glGenBuffers2(numListsOrBuffers, chunkBuffers);
|
||||
@@ -1077,53 +1077,54 @@ void LevelRenderer::playSound(const std::string& name, float x, float y, float z
|
||||
float dd = 16;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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 yd = mc->cameraTargetPlayer->y - y;
|
||||
float zd = mc->cameraTargetPlayer->z - z;
|
||||
float distanceSquared = xd * xd + yd * yd + zd * zd;
|
||||
|
||||
float xd = mc->cameraTargetPlayer->x - x;
|
||||
float yd = mc->cameraTargetPlayer->y - y;
|
||||
float zd = mc->cameraTargetPlayer->z - z;
|
||||
float distanceSquared = xd * xd + yd * yd + zd * zd;
|
||||
//Particle* p = NULL;
|
||||
//if (name == "hugeexplosion") p = new HugeExplosionSeedParticle(level, x, y, z, xa, ya, za);
|
||||
//else if (name == "largeexplode") p = new HugeExplosionParticle(textures, level, x, y, z, xa, ya, za);
|
||||
|
||||
//Particle* p = NULL;
|
||||
//if (name == "hugeexplosion") p = new HugeExplosionSeedParticle(level, x, y, z, xa, ya, za);
|
||||
//else if (name == "largeexplode") p = new HugeExplosionParticle(textures, level, x, y, z, xa, ya, za);
|
||||
//if (p) {
|
||||
// if (distanceSquared < 32 * 32) {
|
||||
// mc->particleEngine->add(p);
|
||||
// } else { delete p; }
|
||||
// return;
|
||||
//}
|
||||
|
||||
//if (p) {
|
||||
// if (distanceSquared < 32 * 32) {
|
||||
// mc->particleEngine->add(p);
|
||||
// } else { delete p; }
|
||||
// return;
|
||||
//}
|
||||
const float particleDistance = 16;
|
||||
if (distanceSquared > particleDistance * particleDistance) return;
|
||||
|
||||
const float particleDistance = 16;
|
||||
if (distanceSquared > particleDistance * particleDistance) return;
|
||||
//static Stopwatch sw;
|
||||
//sw.start();
|
||||
|
||||
//static Stopwatch sw;
|
||||
//sw.start();
|
||||
if (name == "bubble") mc->particleEngine->add(new BubbleParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "crit") mc->particleEngine->add(new CritParticle2(level, x, y, z, xa, ya, za));
|
||||
else if (name == "smoke") mc->particleEngine->add(new SmokeParticle(level, x, y, z, xa, ya, za));
|
||||
//else if (name == "note") mc->particleEngine->add(new NoteParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "explode") mc->particleEngine->add(new ExplodeParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "flame") mc->particleEngine->add(new FlameParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "lava") mc->particleEngine->add(new LavaParticle(level, x, y, z));
|
||||
//else if (name == "splash") mc->particleEngine->add(new SplashParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "largesmoke") mc->particleEngine->add(new SmokeParticle(level, x, y, z, xa, ya, za, 2.5f));
|
||||
else if (name == "reddust") mc->particleEngine->add(new RedDustParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "iconcrack") mc->particleEngine->add(new BreakingItemParticle(level, x, y, z, xa, ya, za, Item::items[data]));
|
||||
else if (name == "snowballpoof") mc->particleEngine->add(new BreakingItemParticle(level, x, y, z, Item::snowBall));
|
||||
//else if (name == "snowballpoof") mc->particleEngine->add(new BreakingItemParticle(level, x, y, z, Item::snowBall));
|
||||
//else if (name == "slime") mc->particleEngine->add(new BreakingItemParticle(level, x, y, z, Item::slimeBall));
|
||||
//else if (name == "heart") mc->particleEngine->add(new HeartParticle(level, x, y, z, xa, ya, za));
|
||||
|
||||
if (name == "bubble") mc->particleEngine->add(new BubbleParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "crit") mc->particleEngine->add(new CritParticle2(level, x, y, z, xa, ya, za));
|
||||
else if (name == "smoke") mc->particleEngine->add(new SmokeParticle(level, x, y, z, xa, ya, za));
|
||||
//else if (name == "note") mc->particleEngine->add(new NoteParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "explode") mc->particleEngine->add(new ExplodeParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "flame") mc->particleEngine->add(new FlameParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "lava") mc->particleEngine->add(new LavaParticle(level, x, y, z));
|
||||
//else if (name == "splash") mc->particleEngine->add(new SplashParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "largesmoke") mc->particleEngine->add(new SmokeParticle(level, x, y, z, xa, ya, za, 2.5f));
|
||||
else if (name == "reddust") mc->particleEngine->add(new RedDustParticle(level, x, y, z, xa, ya, za));
|
||||
else if (name == "iconcrack") mc->particleEngine->add(new BreakingItemParticle(level, x, y, z, xa, ya, za, Item::items[data]));
|
||||
else if (name == "snowballpoof") mc->particleEngine->add(new BreakingItemParticle(level, x, y, z, Item::snowBall));
|
||||
//else if (name == "snowballpoof") mc->particleEngine->add(new BreakingItemParticle(level, x, y, z, Item::snowBall));
|
||||
//else if (name == "slime") mc->particleEngine->add(new BreakingItemParticle(level, x, y, z, Item::slimeBall));
|
||||
//else if (name == "heart") mc->particleEngine->add(new HeartParticle(level, x, y, z, xa, ya, za));
|
||||
|
||||
//sw.stop();
|
||||
//sw.printEvery(50, "add-particle-string");
|
||||
//sw.stop();
|
||||
//sw.printEvery(50, "add-particle-string");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -77,10 +77,10 @@ void PlayerRenderer::render(Entity* mob_, float x, float y, float z, float rot,
|
||||
model = 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(),
|
||||
humanoidModel->texWidth, humanoidModel->texHeight,
|
||||
(desired == playerModel64 ? "64" : "32"));
|
||||
(desired == playerModel64 ? "64" : "32")); */
|
||||
HumanoidMobRenderer::render(mob_, x, y, z, rot, a);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,11 +14,11 @@
|
||||
#define USE_VBO
|
||||
#define GL_QUADS 0x0007
|
||||
#if defined(__APPLE__)
|
||||
#import <OpenGLES/ES1/gl.h>
|
||||
#import <OpenGLES/ES1/glext.h>
|
||||
#import <OpenGLES/ES1/gl.height>
|
||||
#import <OpenGLES/ES1/glext.height>
|
||||
#elif defined(ANDROID) || defined(__EMSCRIPTEN__)
|
||||
#import <GLES/gl.h>
|
||||
#import <GLES/glext.h>
|
||||
#include <GLES/gl.h>
|
||||
#include <GLES/glext.h>
|
||||
#else
|
||||
#include <glad/glad.h>
|
||||
|
||||
|
||||
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 "NinecraftApp.h"
|
||||
#include "AppPlatform.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#ifdef __linux__
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "world/level/LevelSettings.h"
|
||||
#include "world/level/Level.h"
|
||||
#include "server/ArgumentsSettings.h"
|
||||
#include "platform/time.h"
|
||||
#include "SharedConstants.h"
|
||||
#include "world/level/LevelConstants.h"
|
||||
|
||||
#define MAIN_CLASS NinecraftApp
|
||||
static App* g_app = 0;
|
||||
@@ -27,36 +31,175 @@ void signal_callback_handler(int signum) {
|
||||
}
|
||||
}
|
||||
|
||||
int main(int numArguments, char* pszArgs[]) {
|
||||
ArgumentsSettings aSettings(numArguments, pszArgs);
|
||||
if(aSettings.getShowHelp()) {
|
||||
ArgumentsSettings defaultSettings(0, NULL);
|
||||
printf("Minecraft Pockect Edition Server %s\n", Common::getGameVersionString("").c_str());
|
||||
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;
|
||||
std::string findStringInConfig(std::string line, std::string config) {
|
||||
auto valuePos = config.find(line);
|
||||
|
||||
if (line.empty()) {
|
||||
throw std::runtime_error("Key cannot be empty");
|
||||
}
|
||||
|
||||
if (valuePos == std::string::npos) {
|
||||
throw std::runtime_error("Cannot find value");
|
||||
}
|
||||
|
||||
std::string valueStr = "";
|
||||
|
||||
valuePos += 1 + line.size();
|
||||
|
||||
while (true) {
|
||||
auto sym = config.at(valuePos);
|
||||
|
||||
if (sym == '\n') {
|
||||
break;
|
||||
}
|
||||
|
||||
if (valuePos == config.size()) {
|
||||
throw std::runtime_error("Cannot find end of the line");
|
||||
}
|
||||
|
||||
valueStr += sym;
|
||||
valuePos++;
|
||||
}
|
||||
|
||||
return valueStr;
|
||||
}
|
||||
|
||||
|
||||
int main(int numArguments, char* pszArgs[]) {
|
||||
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", aSettings.getLevelName().c_str());
|
||||
|
||||
printf("Level Name: %s\n", levelName.c_str());
|
||||
|
||||
AppContext appContext;
|
||||
appContext.platform = new AppPlatform();
|
||||
App* app = new MAIN_CLASS();
|
||||
signal(SIGINT, signal_callback_handler);
|
||||
g_app = app;
|
||||
((MAIN_CLASS*)g_app)->externalStoragePath = aSettings.getExternalPath();
|
||||
((MAIN_CLASS*)g_app)->externalCacheStoragePath = aSettings.getCachePath();
|
||||
((MAIN_CLASS*)g_app)->externalStoragePath = externalPath;
|
||||
((MAIN_CLASS*)g_app)->externalCacheStoragePath = cachePath;
|
||||
|
||||
g_app->init(appContext);
|
||||
LevelSettings settings(getEpochTimeS(), GameType::Creative);
|
||||
LevelSettings settings(getEpochTimeS(), gamemode);
|
||||
float startTime = getTimeS();
|
||||
((MAIN_CLASS*)g_app)->selectLevel(aSettings.getLevelDir(), aSettings.getLevelName(), settings);
|
||||
((MAIN_CLASS*)g_app)->hostMultiplayer(aSettings.getPort());
|
||||
((MAIN_CLASS*)g_app)->selectLevel(levelDir, levelName, settings);
|
||||
((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;
|
||||
((MAIN_CLASS*)g_app)->level->saveLevelData();
|
||||
@@ -67,7 +210,31 @@ int main(int numArguments, char* pszArgs[]) {
|
||||
//pthread_yield();
|
||||
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();
|
||||
|
||||
delete app;
|
||||
appContext.platform->finish();
|
||||
delete appContext.platform;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
|
||||
#include "ClientSideNetworkHandler.h"
|
||||
#include "client/Options.h"
|
||||
#include "network/packet/LoginStatusPacket.h"
|
||||
#include "packet/PacketInclude.h"
|
||||
#include "RakNetInstance.h"
|
||||
#include "../world/level/chunk/ChunkSource.h"
|
||||
@@ -10,6 +11,9 @@
|
||||
#include "../world/entity/player/Inventory.h"
|
||||
#include "../client/Minecraft.h"
|
||||
#include "../client/gamemode/GameMode.h"
|
||||
#include "world/item/ItemInstance.h"
|
||||
#include "world/level/LevelConstants.h"
|
||||
#include <cstddef>
|
||||
#ifndef STANDALONE_SERVER
|
||||
#include "../client/gui/screens/DisconnectionScreen.h"
|
||||
#endif
|
||||
@@ -42,6 +46,9 @@ ClientSideNetworkHandler::ClientSideNetworkHandler(Minecraft* minecraft, IRakNet
|
||||
requestNextChunkPosition(0),
|
||||
requestNextChunkIndex(0)
|
||||
{
|
||||
NumRequestChunks = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH;
|
||||
requestNextChunkIndexList.resize(NumRequestChunks);
|
||||
chunksLoaded.resize(NumRequestChunks);
|
||||
rakPeer = raknetInstance->getPeer();
|
||||
}
|
||||
|
||||
@@ -59,7 +66,7 @@ void ClientSideNetworkHandler::requestNextChunk()
|
||||
|
||||
//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++;
|
||||
requestNextChunkPosition++;
|
||||
}
|
||||
@@ -67,16 +74,16 @@ void ClientSideNetworkHandler::requestNextChunk()
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
return chunksLoaded[x * CHUNK_CACHE_WIDTH + z];
|
||||
return chunksLoaded[x * LevelConstants::CHUNK_CACHE_WIDTH + z];
|
||||
//return areAllChunksLoaded();
|
||||
}
|
||||
|
||||
@@ -86,7 +93,7 @@ void ClientSideNetworkHandler::onConnect(const RakNet::RakNetGUID& hostGuid)
|
||||
serverGuid = hostGuid;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -97,6 +104,11 @@ void ClientSideNetworkHandler::onUnableToConnect()
|
||||
|
||||
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");
|
||||
if (level)
|
||||
{
|
||||
@@ -108,9 +120,12 @@ void ClientSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& guid)
|
||||
level->removeEntity(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
minecraft->setLevel(NULL);
|
||||
#ifndef STANDALONE_SERVER
|
||||
minecraft->gui.addMessage("Disconnected from server");
|
||||
// TODO: screen with error
|
||||
minecraft->screenChooser.setScreen(SCREEN_STARTMENU);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -130,6 +145,18 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginSta
|
||||
LOGI("Disconnect! Server is outdated!\n");
|
||||
#ifndef STANDALONE_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
|
||||
}
|
||||
}
|
||||
@@ -146,6 +173,19 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, StartGam
|
||||
}
|
||||
#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;
|
||||
LevelStorageSource* storageSource = minecraft->getLevelSource();
|
||||
storageSource->deleteLevel(levelId);
|
||||
@@ -324,7 +364,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RemoveEn
|
||||
if (!level) return;
|
||||
|
||||
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;
|
||||
|
||||
level->removeEntity(entity);
|
||||
@@ -344,6 +384,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, AddItemE
|
||||
}
|
||||
|
||||
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, TakeItemEntityPacket* packet) {
|
||||
printf("TakeItemEntityPacket \n");
|
||||
if (!level) return;
|
||||
|
||||
Entity* e = level->getEntity(packet->itemId);
|
||||
@@ -386,6 +427,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)
|
||||
{
|
||||
if (!level)
|
||||
@@ -475,19 +564,19 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
||||
//unsigned char* blockIds = chunk->getBlockData();
|
||||
DataLayer& blockData = chunk->data;
|
||||
|
||||
const int setSize = LEVEL_HEIGHT / 8;
|
||||
const int setShift = 4; // power of LEVEL_HEIGHT / 8
|
||||
const int setSize = LevelConstants::LEVEL_HEIGHT / 8;
|
||||
const int setShift = 4; // power of LevelConstants::LEVEL_HEIGHT / 8
|
||||
|
||||
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 rz = packet->z << 4;
|
||||
|
||||
unsigned char readBlockBuffer[setSize];
|
||||
unsigned char readDataBuffer[setSize / 2];
|
||||
unsigned char* readBlockBuffer = new unsigned char[setSize];
|
||||
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;
|
||||
packet->chunkData.Read(updateBits);
|
||||
@@ -496,8 +585,8 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
||||
{
|
||||
recalcHeight = true;
|
||||
|
||||
int colX = (i % CHUNK_WIDTH);
|
||||
int colZ = (i / CHUNK_WIDTH);
|
||||
int colX = (i % LevelConstants::CHUNK_WIDTH);
|
||||
int colZ = (i / LevelConstants::CHUNK_WIDTH);
|
||||
int colDataPosition = colX << 11 | colZ << 7;
|
||||
|
||||
for (int set = 0; set < 8; set++)
|
||||
@@ -531,30 +620,33 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
||||
{
|
||||
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)
|
||||
{
|
||||
// chunk->recalcHeightmap();
|
||||
@@ -579,7 +671,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChunkDat
|
||||
//chunk->terrainPopulated = true;
|
||||
chunk->unsaved = false;
|
||||
|
||||
chunksLoaded[packet->x * CHUNK_CACHE_WIDTH + packet->z] = true;
|
||||
chunksLoaded[packet->x * LevelConstants::CHUNK_CACHE_WIDTH + packet->z] = true;
|
||||
|
||||
if (areAllChunksLoaded())
|
||||
{
|
||||
@@ -627,18 +719,18 @@ void ClientSideNetworkHandler::arrangeRequestChunkOrder() {
|
||||
clearChunksLoaded();
|
||||
|
||||
// Default sort is around center of the world
|
||||
int cx = CHUNK_CACHE_WIDTH / 2;
|
||||
int cz = CHUNK_CACHE_WIDTH / 2;
|
||||
int cx = LevelConstants::CHUNK_CACHE_WIDTH / 2;
|
||||
int cz = LevelConstants::CHUNK_CACHE_WIDTH / 2;
|
||||
|
||||
// If player exists, let's sort around him
|
||||
Player* p = minecraft? minecraft->player : NULL;
|
||||
if (p) {
|
||||
cx = Mth::floor(p->x / (float)CHUNK_WIDTH);
|
||||
cz = Mth::floor(p->z / (float)CHUNK_DEPTH);
|
||||
cx = Mth::floor(p->x / (float)LevelConstants::CHUNK_WIDTH);
|
||||
cz = Mth::floor(p->z / (float)LevelConstants::CHUNK_DEPTH);
|
||||
}
|
||||
|
||||
_ChunkSorter sorter(cx, cz);
|
||||
std::sort(requestNextChunkIndexList, requestNextChunkIndexList + NumRequestChunks, sorter);
|
||||
std::sort(requestNextChunkIndexList.begin(), requestNextChunkIndexList.end(), sorter);
|
||||
}
|
||||
|
||||
void ClientSideNetworkHandler::levelGenerated(Level* level)
|
||||
@@ -782,6 +874,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)
|
||||
{
|
||||
}
|
||||
@@ -791,6 +887,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, SetHealt
|
||||
if (!level || !minecraft->player)
|
||||
return;
|
||||
|
||||
printf("SetHealthPacket \n");
|
||||
minecraft->player->hurtTo(packet->health);
|
||||
}
|
||||
|
||||
@@ -886,7 +983,11 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
|
||||
void ClientSideNetworkHandler::handle( const RakNet::RakNetGUID& source, ChatPacket* packet )
|
||||
{
|
||||
#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
|
||||
}
|
||||
|
||||
@@ -919,8 +1020,8 @@ void ClientSideNetworkHandler::clearChunksLoaded()
|
||||
{
|
||||
// Init the chunk positions
|
||||
for (int i = 0; i < NumRequestChunks; ++i) {
|
||||
requestNextChunkIndexList[i].x = i/CHUNK_WIDTH;
|
||||
requestNextChunkIndexList[i].y = i%CHUNK_WIDTH;
|
||||
requestNextChunkIndexList[i].x = i / LevelConstants::CHUNK_WIDTH;
|
||||
requestNextChunkIndexList[i].y = i % LevelConstants::CHUNK_WIDTH;
|
||||
chunksLoaded[i] = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,6 +77,11 @@ public:
|
||||
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, 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:
|
||||
|
||||
void requestNextChunk();
|
||||
@@ -97,11 +102,11 @@ private:
|
||||
BlockUpdateList bufferedBlockUpdates;
|
||||
int requestNextChunkPosition;
|
||||
|
||||
static const int NumRequestChunks = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH;
|
||||
int NumRequestChunks;
|
||||
|
||||
int requestNextChunkIndex;
|
||||
IntPair requestNextChunkIndexList[NumRequestChunks];
|
||||
bool chunksLoaded[NumRequestChunks];
|
||||
std::vector<IntPair> requestNextChunkIndexList;
|
||||
std::vector<bool> chunksLoaded;
|
||||
};
|
||||
|
||||
#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 MoveEntityPacket;
|
||||
//class TeleportEntityPacket;
|
||||
class RemoveItemPacket;
|
||||
class TakeItemPacket;
|
||||
class MovePlayerPacket;
|
||||
class PlaceBlockPacket;
|
||||
class RemoveBlockPacket;
|
||||
@@ -48,6 +50,7 @@ class ContainerClosePacket;
|
||||
class ContainerSetSlotPacket;
|
||||
class ContainerSetDataPacket;
|
||||
class ContainerSetContentPacket;
|
||||
class WantCreatePacket;
|
||||
class ChatPacket;
|
||||
class SignUpdatePacket;
|
||||
class Minecraft;
|
||||
@@ -119,6 +122,9 @@ public:
|
||||
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, 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
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "Packet.h"
|
||||
#include "../world/level/chunk/LevelChunk.h"
|
||||
|
||||
#include "network/packet/TakeItemPacket.h"
|
||||
#include "packet/PacketInclude.h"
|
||||
|
||||
Packet::Packet()
|
||||
@@ -41,10 +42,16 @@ Packet* MinecraftPackets::createPacket(int id)
|
||||
case PACKET_ADDITEMENTITY:
|
||||
packet = new AddItemEntityPacket();
|
||||
break;
|
||||
case PACKET_REMOVEITEM:
|
||||
packet = new RemoveItemPacket();
|
||||
break;
|
||||
case PACKET_TAKEITEM:
|
||||
packet = new TakeItemPacket();
|
||||
break;
|
||||
case PACKET_TAKEITEMENTITY:
|
||||
packet = new TakeItemEntityPacket();
|
||||
break;
|
||||
case PACKET_ADDMOB:
|
||||
case PACKET_ADDMOB:
|
||||
packet = new AddMobPacket();
|
||||
break;
|
||||
case PACKET_ADDPLAYER:
|
||||
@@ -68,6 +75,9 @@ Packet* MinecraftPackets::createPacket(int id)
|
||||
case PACKET_RESPAWN:
|
||||
packet = new RespawnPacket();
|
||||
break;
|
||||
case PACKET_WANTCREATEITEM:
|
||||
packet = new WantCreatePacket();
|
||||
break;
|
||||
case PACKET_REMOVEENTITY:
|
||||
packet = new RemoveEntityPacket();
|
||||
break;
|
||||
|
||||
@@ -33,7 +33,10 @@ enum MinecraftPacketIds
|
||||
PACKET_REMOVEENTITY,
|
||||
PACKET_ADDITEMENTITY,
|
||||
PACKET_TAKEITEMENTITY,
|
||||
|
||||
PACKET_TAKEITEM,
|
||||
PACKET_REMOVEITEM,
|
||||
PACKET_WANTCREATEITEM,
|
||||
|
||||
PACKET_MOVEENTITY,
|
||||
PACKET_MOVEENTITY_POS,
|
||||
PACKET_MOVEENTITY_ROT,
|
||||
|
||||
@@ -5,6 +5,16 @@
|
||||
#include "../world/entity/player/Inventory.h"
|
||||
#include "../world/Container.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 "RakNetInstance.h"
|
||||
@@ -13,6 +23,17 @@
|
||||
#include "../client/gamemode/GameMode.h"
|
||||
#include "../raknet/RakPeerInterface.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
|
||||
#include "../client/sound/SoundEngine.h"
|
||||
#endif
|
||||
@@ -53,11 +74,11 @@ void ServerSideNetworkHandler::tileChanged(int x, int y, int z)
|
||||
|
||||
Packet* ServerSideNetworkHandler::getAddPacketFromEntity( Entity* entity ) {
|
||||
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
|
||||
// function once and I only see this one as a potential problem
|
||||
return new AddMobPacket((Mob*)entity);
|
||||
}
|
||||
// }
|
||||
}
|
||||
else if (entity->isPlayer()) {
|
||||
|
||||
@@ -136,7 +157,18 @@ void ServerSideNetworkHandler::displayGameMessage(const std::string& message)
|
||||
|
||||
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)
|
||||
@@ -156,6 +188,8 @@ void ServerSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& guid)
|
||||
|
||||
if (player->owner == guid)
|
||||
{
|
||||
minecraft->level->getLevelStorage()->savePlayer(*player);
|
||||
|
||||
std::string message = player->name;
|
||||
message += " disconnected from the game";
|
||||
displayGameMessage(message);
|
||||
@@ -179,15 +213,39 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginPac
|
||||
if (!_allowIncoming) return;
|
||||
|
||||
LOGI("LoginPacket\n");
|
||||
|
||||
|
||||
int loginStatus = LoginStatus::Success;
|
||||
//
|
||||
// Bad/incompatible client version
|
||||
//
|
||||
bool oldClient = packet->clientNetworkVersion < SharedConstants::NetworkProtocolLowestSupportedVersion;
|
||||
bool oldServer = packet->clientNetworkLowestSupportedVersion > SharedConstants::NetworkProtocolVersion;
|
||||
if (oldClient || oldServer)
|
||||
loginStatus = oldClient? LoginStatus::Failed_ClientOld : LoginStatus::Failed_ServerOld;
|
||||
if (oldClient || oldServer || !packet->newProto)
|
||||
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;
|
||||
LoginStatusPacket(loginStatus).write(&bitStream);
|
||||
@@ -199,13 +257,16 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginPac
|
||||
//
|
||||
// Valid client version
|
||||
//
|
||||
Player* newPlayer = new ServerPlayer(minecraft, level);
|
||||
|
||||
|
||||
Player* newPlayer = new ServerPlayer(minecraft, level, packet->newProto);
|
||||
|
||||
minecraft->gameMode->initAbilities(newPlayer->abilities);
|
||||
newPlayer->owner = source;
|
||||
newPlayer->name = packet->clientName.C_String();
|
||||
_pendingPlayers.push_back(newPlayer);
|
||||
|
||||
LOGI("Adding new player... isCreative: %i\n", minecraft->isCreativeMode());
|
||||
|
||||
// Reset the player so he doesn't spawn inside blocks
|
||||
while (newPlayer->y > 0) {
|
||||
newPlayer->setPos(newPlayer->x, newPlayer->y, newPlayer->z);
|
||||
@@ -228,7 +289,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginPac
|
||||
level->getLevelData()->getGeneratorVersion(),
|
||||
gameType,
|
||||
newPlayer->entityId,
|
||||
newPlayer->x, newPlayer->y - newPlayer->heightOffset, newPlayer->z
|
||||
newPlayer->x, newPlayer->y - newPlayer->heightOffset, newPlayer->z,
|
||||
LevelConstants::CHUNK_CACHE_WIDTH
|
||||
).write(&bitStream);
|
||||
|
||||
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)
|
||||
onReady_RequestedChunks(source);
|
||||
|
||||
LOGI("Ready player two ready ready player two!!\n ");
|
||||
}
|
||||
|
||||
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
|
||||
// * set spawn
|
||||
/*
|
||||
@@ -338,15 +432,32 @@ void ServerSideNetworkHandler::onReady_RequestedChunks(const RakNet::RakNetGUID&
|
||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, MovePlayerPacket* packet)
|
||||
{
|
||||
if (!level) return;
|
||||
|
||||
LOGI("MovePlayerPacket\n");
|
||||
if (Entity* entity = level->getEntity(packet->entityId)) {
|
||||
ServerPlayer* player = (ServerPlayer*) getPlayer(source);
|
||||
|
||||
//LOGI("MovePlayerPacket\n");
|
||||
if (Entity* entity = level->getEntity(packet->entityId))
|
||||
{
|
||||
entity->xd = entity->yd = entity->zd = 0;
|
||||
// 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->lerpTo(packet->x, packet->y, packet->z, packet->yRot, packet->xRot, 3);
|
||||
|
||||
|
||||
// broadcast this packet to other clients
|
||||
redistributePacket(packet, source);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -368,12 +479,29 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RemoveBl
|
||||
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);
|
||||
|
||||
if (minecraft->gameMode->isSurvivalType() && player->canDestroy(oldTile))
|
||||
//oldTile->spawnResources(level, x, y, z, data, 1); //@todo
|
||||
if (minecraft->gameMode->isSurvivalType() && player->canDestroy(oldTile)) {
|
||||
// From SurvivalMode.cpp
|
||||
// Why tf i have to copy this shit from SurvivalMode class
|
||||
// Why SurvivalMode class locked to LOCAL MINECRAFT PLAYER :sob: :sob: :sob: :sob: :sob: :sob: :sob: :sob:
|
||||
// @fix @warn @ahtung @alert
|
||||
ItemInstance* item = player->inventory->getSelected();
|
||||
if (item != NULL) {
|
||||
item->mineBlock(oldTile->id, x, y, z);
|
||||
if (item->count == 0) {
|
||||
//item->snap(minecraft->player);
|
||||
player->inventory->clearSlot(player->inventory->selected);
|
||||
}
|
||||
}
|
||||
|
||||
// oldTile->spawnResources(level, x, y, z, data, 1); //@todo
|
||||
oldTile->playerDestroy(level, player, 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)
|
||||
@@ -403,6 +531,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RequestC
|
||||
raknetInstance->send(source, p);
|
||||
}
|
||||
}
|
||||
|
||||
// LOGI("Requested chunk [%i, %i]\n", packet->x, packet->z);
|
||||
}
|
||||
|
||||
void ServerSideNetworkHandler::levelGenerated( Level* level )
|
||||
@@ -429,23 +559,31 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, PlayerEq
|
||||
if (!player) return;
|
||||
if (rakPeer->GetMyGUID() == player->owner) return;
|
||||
|
||||
LOGI("Equip item: id %i aux %i\n", packet->itemId, packet->itemAuxValue);
|
||||
|
||||
// override the player's inventory
|
||||
//int slot = player->inventory->getSlot(packet->itemId, packet->itemAuxValue);
|
||||
int slot = Inventory::MAX_SELECTION_SIZE;
|
||||
if (slot >= 0) {
|
||||
if (packet->itemId == 0) {
|
||||
player->inventory->clearSlot(slot);
|
||||
} else {
|
||||
// @note: 128 is an ugly hack for depletable items.
|
||||
// @todo: fix
|
||||
ItemInstance newItem(packet->itemId, 128, packet->itemAuxValue);
|
||||
player->inventory->replaceSlot(slot, &newItem);
|
||||
}
|
||||
player->inventory->moveToSelectedSlot(slot, true);
|
||||
redistributePacket(packet, source);
|
||||
} else {
|
||||
LOGW("Warning: Remote player doesn't have his thing, Odd!\n");
|
||||
int slot = player->inventory->getSlot(packet->itemId, packet->itemAuxValue);
|
||||
|
||||
if (slot >= 0 && slot != packet->inventorySlot && packet->itemId != 0) {
|
||||
LOGW("PlayerEquipmentPacket: Item in player inventory but slots doesn't match!");
|
||||
packet->inventorySlot = slot;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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 (rakPeer->GetMyGUID() == player->owner) return;
|
||||
|
||||
// LOGI("Equip armor: %i %i %i %i\n", packet->head, packet->torso, packet->legs, packet->feet);
|
||||
|
||||
packet->fillIn(player);
|
||||
redistributePacket(packet, source);
|
||||
}
|
||||
@@ -466,6 +606,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Interact
|
||||
Entity* entity = level->getEntity(packet->targetId);
|
||||
if (src && entity && src->isPlayer())
|
||||
{
|
||||
LOGI("Interact: source %i target %i\n", packet->sourceId, packet->targetId);
|
||||
|
||||
Player* player = (Player*) src;
|
||||
if (InteractPacket::Attack == packet->action) {
|
||||
player->swing();
|
||||
@@ -506,12 +648,70 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, AnimateP
|
||||
}
|
||||
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)
|
||||
{
|
||||
if (!level) return;
|
||||
|
||||
LOGI("UseItemPacket\n");
|
||||
LOGI("UseItemPacket: id %i data %i\n", packet->itemId, packet->itemData);
|
||||
Entity* entity = level->getEntity(packet->entityId);
|
||||
if (entity && entity->isPlayer()) {
|
||||
Player* player = (Player*) entity;
|
||||
@@ -522,7 +722,30 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemP
|
||||
if (t && t->use(level, x, y, z, player)) 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);
|
||||
|
||||
if(packet->face == 255) {
|
||||
// Special case: x,y,z means direction-of-action
|
||||
@@ -533,6 +756,10 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemP
|
||||
minecraft->gameMode->useItemOn(player, level, item, packet->x, packet->y, packet->z, packet->face,
|
||||
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");
|
||||
|
||||
@@ -544,6 +771,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, UseItemP
|
||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, EntityEventPacket* packet) {
|
||||
if (!level) return;
|
||||
|
||||
LOGI("EntityEventPacket: id %i\n", packet->eventId);
|
||||
|
||||
if (Entity* e = level->getEntity(packet->entityId))
|
||||
e->handleEntityEvent(packet->eventId);
|
||||
}
|
||||
@@ -577,6 +806,11 @@ void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, SendInv
|
||||
{
|
||||
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);
|
||||
if (entity && entity->isPlayer()) {
|
||||
Player* p = (Player*)entity;
|
||||
@@ -592,15 +826,27 @@ void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, DropIte
|
||||
{
|
||||
if (!level) return;
|
||||
|
||||
LOGI("DropItemPacket\n");
|
||||
|
||||
Entity* entity = level->getEntity(packet->entityId);
|
||||
if (entity && entity->isPlayer()) {
|
||||
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) {
|
||||
if (!level) return;
|
||||
LOGI("ContainerClosePacket\n");
|
||||
|
||||
Player* p = findPlayer(level, &source);
|
||||
if (!p) return;
|
||||
@@ -612,6 +858,16 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
|
||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ContainerSetSlotPacket* packet) {
|
||||
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);
|
||||
if (!p) return;
|
||||
|
||||
@@ -619,11 +875,79 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
|
||||
LOGW("User has no container!\n");
|
||||
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);
|
||||
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) {
|
||||
//LOGI("Server:Setting slot %d: %s\n", packet->slot, packet->item.toString().c_str());
|
||||
@@ -635,6 +959,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
|
||||
p->containerMenu->setSlot(packet->slot, &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 )
|
||||
@@ -657,6 +983,8 @@ void ServerSideNetworkHandler::handle( const RakNet::RakNetGUID& source, SignUpd
|
||||
if (!level)
|
||||
return;
|
||||
|
||||
LOGI("SignUpdate: [%i, %i, %i]\n", packet->x, packet->y, packet->z);
|
||||
|
||||
TileEntity* te = level->getTileEntity(packet->x, packet->y, packet->z);
|
||||
if (TileEntity::isType(te, TileEntityType::Sign)) {
|
||||
SignTileEntity* ste = (SignTileEntity*) te;
|
||||
@@ -713,3 +1041,9 @@ Player* ServerSideNetworkHandler::getPlayer( const RakNet::RakNetGUID& source )
|
||||
if (source == level->players[i]->owner) return level->players[i];
|
||||
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,7 +58,8 @@ public:
|
||||
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, ChatPacket* packet);
|
||||
|
||||
virtual void handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet);
|
||||
|
||||
bool allowsIncomingConnections() { return _allowIncoming; }
|
||||
void allowIncomingConnections(bool doAllow);
|
||||
|
||||
@@ -70,6 +71,12 @@ private:
|
||||
* @brief Send packet to all players
|
||||
*/
|
||||
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);
|
||||
|
||||
Minecraft* minecraft;
|
||||
|
||||
@@ -236,9 +236,9 @@ std::string CommandServer::parse(ConnectedClient& client, const std::string& s)
|
||||
if (x0 < 0) x0 = 0;
|
||||
if (y0 < 0) y0 = 0;
|
||||
if (z0 < 0) z0 = 0;
|
||||
if (x1 >= LEVEL_WIDTH ) x1 = LEVEL_WIDTH - 1;
|
||||
if (y1 >= LEVEL_HEIGHT) y1 = LEVEL_HEIGHT - 1;
|
||||
if (z1 >= LEVEL_DEPTH ) z1 = LEVEL_DEPTH - 1;
|
||||
if (x1 >= LevelConstants::LEVEL_WIDTH ) x1 = LevelConstants::LEVEL_WIDTH - 1;
|
||||
if (y1 >= LevelConstants::LEVEL_HEIGHT) y1 = LevelConstants::LEVEL_HEIGHT - 1;
|
||||
if (z1 >= LevelConstants::LEVEL_DEPTH ) z1 = LevelConstants::LEVEL_DEPTH - 1;
|
||||
|
||||
for (int y = y0; y <= y1; ++y)
|
||||
for (int z = z0; z <= z1; ++z)
|
||||
@@ -456,7 +456,7 @@ std::string CommandServer::parse(ConnectedClient& client, const std::string& s)
|
||||
sw.start();
|
||||
|
||||
// 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 cz = (int)e->z / CSize;
|
||||
|
||||
@@ -504,7 +504,7 @@ bool CommandServer::handleCheckpoint(bool doRestore ) {
|
||||
const int cz = restorePos.z;
|
||||
const int y0 = restorePos.y;
|
||||
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;
|
||||
|
||||
if (!restoreBuffer) {
|
||||
|
||||
@@ -33,18 +33,18 @@ public:
|
||||
unsigned char* blockIds = chunk->getBlockData();
|
||||
DataLayer& blockData = chunk->data;
|
||||
|
||||
const int setSize = LEVEL_HEIGHT / 8;
|
||||
const int setShift = 4; // power of LEVEL_HEIGHT / 8
|
||||
const int setSize = LevelConstants::LEVEL_HEIGHT / 8;
|
||||
const int setShift = 4; // power of LevelConstants::LEVEL_HEIGHT / 8
|
||||
|
||||
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];
|
||||
chunkData.Write(updateBits);
|
||||
|
||||
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++)
|
||||
{
|
||||
|
||||
@@ -9,17 +9,20 @@ public:
|
||||
RakNet::RakString clientName;
|
||||
int clientNetworkVersion;
|
||||
int clientNetworkLowestSupportedVersion;
|
||||
bool newProto;
|
||||
|
||||
LoginPacket()
|
||||
: 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),
|
||||
clientNetworkVersion(clientVersion),
|
||||
clientNetworkLowestSupportedVersion(clientVersion)
|
||||
clientNetworkLowestSupportedVersion(clientVersion),
|
||||
newProto(newProto)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -29,6 +32,7 @@ public:
|
||||
bitStream->Write(clientName);
|
||||
bitStream->Write(clientNetworkVersion);
|
||||
bitStream->Write(clientNetworkLowestSupportedVersion);
|
||||
bitStream->Write(newProto);
|
||||
}
|
||||
|
||||
void read(RakNet::BitStream* bitStream)
|
||||
@@ -39,6 +43,11 @@ public:
|
||||
if (bitStream->GetNumberOfUnreadBits() > 0) {
|
||||
bitStream->Read(clientNetworkVersion);
|
||||
bitStream->Read(clientNetworkLowestSupportedVersion);
|
||||
|
||||
// Checking for new proto
|
||||
if (bitStream->GetNumberOfUnreadBits() > 0) {
|
||||
bitStream->Read(newProto);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,10 +3,13 @@
|
||||
|
||||
#include "../Packet.h"
|
||||
|
||||
// wtf why not enum
|
||||
namespace LoginStatus {
|
||||
const int Success = 0;
|
||||
const int Failed_ClientOld = 1;
|
||||
const int Failed_ServerOld = 2;
|
||||
const int Failed_TakenNickname = 3;
|
||||
const int Failed_Banned = 4;
|
||||
}
|
||||
|
||||
class LoginStatusPacket : public Packet {
|
||||
|
||||
@@ -50,5 +50,7 @@
|
||||
#include "TileEventPacket.h"
|
||||
#include "UpdateBlockPacket.h"
|
||||
#include "UseItemPacket.h"
|
||||
|
||||
#include "RemoveItemPacket.h"
|
||||
#include "WantCreatePacket.h"
|
||||
#include "TakeItemPacket.h"
|
||||
#endif /*NET_MINECRAFT_NETWORK_PACKET__PacketInclude_H__*/
|
||||
|
||||
@@ -9,15 +9,19 @@ public:
|
||||
int entityId;
|
||||
unsigned short itemId;
|
||||
unsigned short itemAuxValue;
|
||||
unsigned char selectedSlot;
|
||||
unsigned char inventorySlot;
|
||||
|
||||
PlayerEquipmentPacket()
|
||||
{
|
||||
}
|
||||
|
||||
PlayerEquipmentPacket(int entityId, int itemId, int data)
|
||||
PlayerEquipmentPacket(int entityId, int itemId, int data, int selSlot, int invSlot)
|
||||
: entityId(entityId),
|
||||
itemId(itemId),
|
||||
itemAuxValue(data)
|
||||
itemAuxValue(data),
|
||||
selectedSlot(selSlot),
|
||||
inventorySlot(invSlot)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -28,6 +32,8 @@ public:
|
||||
bitStream->Write(entityId);
|
||||
bitStream->Write(itemId);
|
||||
bitStream->Write(itemAuxValue);
|
||||
bitStream->Write(selectedSlot);
|
||||
bitStream->Write(inventorySlot);
|
||||
}
|
||||
|
||||
void read(RakNet::BitStream* bitStream)
|
||||
@@ -35,6 +41,8 @@ public:
|
||||
bitStream->Read(entityId);
|
||||
bitStream->Read(itemId);
|
||||
bitStream->Read(itemAuxValue);
|
||||
bitStream->Read(selectedSlot);
|
||||
bitStream->Read(inventorySlot);
|
||||
}
|
||||
|
||||
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__
|
||||
|
||||
#include "../Packet.h"
|
||||
#include "world/entity/player/Inventory.h"
|
||||
#include "world/inventory/FillingContainer.h"
|
||||
#include <array>
|
||||
|
||||
class SendInventoryPacket: public Packet
|
||||
{
|
||||
public:
|
||||
SendInventoryPacket()
|
||||
{
|
||||
}
|
||||
SendInventoryPacket() {}
|
||||
|
||||
SendInventoryPacket(Player* player, bool dropItems)
|
||||
: entityId(player->entityId),
|
||||
@@ -21,10 +22,15 @@ public:
|
||||
ItemInstance* item = inv->getItem(i);
|
||||
items.push_back(item? *item : ItemInstance());
|
||||
}
|
||||
|
||||
for (int i = 0; i < NumArmorItems; ++i) {
|
||||
ItemInstance* item = player->getArmor(i);
|
||||
items.push_back(item? *item : ItemInstance());
|
||||
}
|
||||
|
||||
for (int i = 0; i < inv->numLinkedSlots; ++i) {
|
||||
linkedSlot[i] = inv->linkedSlots[i];
|
||||
}
|
||||
}
|
||||
|
||||
void write(RakNet::BitStream* bitStream)
|
||||
@@ -39,6 +45,13 @@ public:
|
||||
// Armor
|
||||
for (int i = 0; i < NumArmorItems; ++i)
|
||||
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)
|
||||
@@ -50,6 +63,12 @@ public:
|
||||
// Inventory, Armor
|
||||
for (int i = 0; i < numItems + NumArmorItems; ++i)
|
||||
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)
|
||||
@@ -62,6 +81,8 @@ public:
|
||||
short numItems;
|
||||
unsigned char extra;
|
||||
|
||||
std::array<FillingContainer::LinkedSlot, Inventory::MAX_SELECTION_SIZE> linkedSlot;
|
||||
|
||||
static const int ExtraDrop = 1;
|
||||
static const int NumArmorItems = 4;
|
||||
};
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define NET_MINECRAFT_NETWORK_PACKET__StartGamePacket_H__
|
||||
|
||||
#include "../Packet.h"
|
||||
#include "world/level/LevelConstants.h"
|
||||
#include <cstdint>
|
||||
|
||||
class StartGamePacket : public Packet
|
||||
@@ -14,18 +15,20 @@ public:
|
||||
int entityId;
|
||||
float x, y, z;
|
||||
|
||||
int chunkCacheWidth = 0;
|
||||
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),
|
||||
levelGeneratorVersion(levelGeneratorVersion),
|
||||
gameType(gameType),
|
||||
entityId(entityId),
|
||||
x(x),
|
||||
y(y),
|
||||
z(z)
|
||||
z(z),
|
||||
chunkCacheWidth(chunkCacheWidth)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -40,6 +43,7 @@ public:
|
||||
bitStream->Write(x);
|
||||
bitStream->Write(y);
|
||||
bitStream->Write(z);
|
||||
bitStream->Write(LevelConstants::CHUNK_CACHE_WIDTH);
|
||||
}
|
||||
|
||||
void read(RakNet::BitStream* bitStream)
|
||||
@@ -51,6 +55,10 @@ public:
|
||||
bitStream->Read(x);
|
||||
bitStream->Read(y);
|
||||
bitStream->Read(z);
|
||||
|
||||
if (bitStream->GetNumberOfUnreadBits() > 0) {
|
||||
bitStream->Read(chunkCacheWidth);
|
||||
}
|
||||
}
|
||||
|
||||
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__*/
|
||||
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__*/
|
||||
@@ -3,14 +3,8 @@
|
||||
|
||||
#include "SoundSystem.h"
|
||||
|
||||
// If audio breaks for other platforms, this is probably why. Here, I'm just calling where Apple's OpenAL headers live (they arent in just "AL"
|
||||
#if defined(__APPLE__)
|
||||
#include <OpenAL/al.h>
|
||||
#include <OpenAL/alc.h>
|
||||
#else
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
#endif
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
|
||||
#include <vector>
|
||||
#include <list>
|
||||
|
||||
@@ -17,6 +17,11 @@ ArgumentsSettings::ArgumentsSettings(int numArguments, char** arguments)
|
||||
levelName = std::string(arguments[a+1]);
|
||||
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) {
|
||||
if(a + 1 < numArguments) {
|
||||
levelDir = std::string(arguments[a+1]);
|
||||
@@ -51,6 +56,9 @@ std::string ArgumentsSettings::getServerKey() {
|
||||
std::string ArgumentsSettings::getCachePath() {
|
||||
return cachePath;
|
||||
}
|
||||
std::string ArgumentsSettings::getGamemode() {
|
||||
return gamemode;
|
||||
}
|
||||
std::string ArgumentsSettings::getLevelDir() {
|
||||
return levelDir;
|
||||
}
|
||||
|
||||
@@ -4,20 +4,27 @@
|
||||
class ArgumentsSettings {
|
||||
public:
|
||||
ArgumentsSettings(int numArguments, char** arguments);
|
||||
|
||||
std::string getExternalPath();
|
||||
std::string getLevelName();
|
||||
std::string getServerKey();
|
||||
std::string getCachePath();
|
||||
std::string getLevelDir();
|
||||
std::string getGamemode();
|
||||
|
||||
bool getShowHelp();
|
||||
|
||||
int getPort();
|
||||
private:
|
||||
std::string cachePath;
|
||||
std::string externalPath;
|
||||
std::string levelName;
|
||||
std::string gamemode;
|
||||
std::string levelDir;
|
||||
std::string serverKey;
|
||||
|
||||
bool showHelp;
|
||||
|
||||
int port;
|
||||
};
|
||||
|
||||
|
||||
@@ -12,16 +12,19 @@ ServerLevel::ServerLevel(LevelStorage* levelStorage, const std::string& levelNam
|
||||
void ServerLevel::updateSleepingPlayerList() {
|
||||
bool allPlayersWasSleeping = allPlayersAreSleeping;
|
||||
allPlayersAreSleeping = !players.empty();
|
||||
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||
|
||||
for (PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||
Player* player = *it;
|
||||
if(!player->isSleeping()) {
|
||||
|
||||
if (!player->isSleeping()) {
|
||||
allPlayersAreSleeping = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!allPlayersWasSleeping && allPlayersAreSleeping) {
|
||||
if (!allPlayersWasSleeping && allPlayersAreSleeping) {
|
||||
levelEvent(NULL, LevelEvent::ALL_PLAYERS_SLEEPING, 0, 0, 0, 0);
|
||||
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||
|
||||
for (PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||
(*it)->setAllPlayersSleeping();
|
||||
}
|
||||
}
|
||||
@@ -29,23 +32,26 @@ void ServerLevel::updateSleepingPlayerList() {
|
||||
|
||||
void ServerLevel::awakenAllPlayers() {
|
||||
allPlayersAreSleeping = false;
|
||||
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||
|
||||
for (PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||
Player* player = *it;
|
||||
if(player->isSleeping()) {
|
||||
|
||||
if (player->isSleeping()) {
|
||||
player->stopSleepInBed(false, false, true);
|
||||
player->health = Player::MAX_HEALTH;
|
||||
player->lastHealth = Player::MAX_HEALTH;
|
||||
}
|
||||
}
|
||||
|
||||
SetHealthPacket packet(Player::MAX_HEALTH);
|
||||
raknetInstance->send(packet);
|
||||
}
|
||||
|
||||
bool ServerLevel::allPlayersSleeping() {
|
||||
if(allPlayersAreSleeping && !isClientSide) {
|
||||
if (allPlayersAreSleeping && !isClientSide) {
|
||||
// all players are sleeping, but have they slept long enough?
|
||||
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||
if(!(*it)->isSleepingLongEnough()) {
|
||||
for (PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
||||
if (!(*it)->isSleepingLongEnough()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -55,13 +61,17 @@ bool ServerLevel::allPlayersSleeping() {
|
||||
return false;
|
||||
}
|
||||
|
||||
void ServerLevel::tick(){
|
||||
void ServerLevel::tick() {
|
||||
super::tick();
|
||||
if(allPlayersSleeping()) {
|
||||
|
||||
if (allPlayersSleeping()) {
|
||||
long newTime = levelData.getTime() + TICKS_PER_DAY;
|
||||
|
||||
levelData.setTime(newTime - (newTime % TICKS_PER_DAY));
|
||||
|
||||
SetTimePacket packet(levelData.getTime());
|
||||
raknetInstance->send(packet);
|
||||
|
||||
awakenAllPlayers();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,14 +19,17 @@
|
||||
#include "../network/packet/AnimatePacket.h"
|
||||
#include "../world/level/tile/entity/ChestTileEntity.h"
|
||||
#include "../network/packet/HurtArmorPacket.h"
|
||||
#include "network/packet/SendInventoryPacket.h"
|
||||
#include "world/entity/player/Inventory.h"
|
||||
|
||||
ServerPlayer::ServerPlayer( Minecraft* minecraft, Level* level )
|
||||
ServerPlayer::ServerPlayer( Minecraft* minecraft, Level* level, bool proto)
|
||||
: super(level, minecraft->isCreativeMode()),
|
||||
_mc(minecraft),
|
||||
_prevHealth(-999),
|
||||
_containerCounter(0)
|
||||
_containerCounter(0),
|
||||
isNewProto(proto)
|
||||
{
|
||||
hasFakeInventory = true;
|
||||
// hasFakeInventory = true;
|
||||
footSize = 0;
|
||||
}
|
||||
|
||||
@@ -67,7 +70,16 @@ void ServerPlayer::tick() {
|
||||
|
||||
void ServerPlayer::take( Entity* e, int orgCount ) {
|
||||
TakeItemEntityPacket packet(e->entityId, entityId);
|
||||
// SendInventoryPacket packet(this, false);
|
||||
_mc->raknetInstance->send(packet);
|
||||
printf("TakeItemEntityPacket \n");
|
||||
|
||||
LOGI("Inventory:\n");
|
||||
for (int i = 0; i < inventory->numLinkedSlots; i++) {
|
||||
auto item = inventory->getItem(i);
|
||||
if (item)
|
||||
LOGI("\t %i: %s (%i)\n", i, item->getName().c_str(), item->count);
|
||||
}
|
||||
|
||||
super::take(e, orgCount);
|
||||
}
|
||||
@@ -118,20 +130,20 @@ bool ServerPlayer::hasResource( int id ) {
|
||||
void ServerPlayer::setContainerData( BaseContainerMenu* menu, int id, int value ) {
|
||||
ContainerSetDataPacket p(menu->containerId, id, value);
|
||||
_mc->raknetInstance->send(owner, p);
|
||||
//LOGI("Setting container data for id %d: %d\n", id, value);
|
||||
LOGI("Setting container data for id %d: %d\n", id, value);
|
||||
}
|
||||
|
||||
void ServerPlayer::slotChanged( BaseContainerMenu* menu, int slot, const ItemInstance& item, bool isResultSlot ) {
|
||||
if (isResultSlot) return;
|
||||
ContainerSetSlotPacket p(menu->containerId, slot, item);
|
||||
_mc->raknetInstance->send(owner, p);
|
||||
//LOGI("Slot %d changed\n", slot);
|
||||
LOGI("Slot %d changed\n", slot);
|
||||
}
|
||||
|
||||
void ServerPlayer::refreshContainer( BaseContainerMenu* menu, const std::vector<ItemInstance>& items ) {
|
||||
ContainerSetContentPacket p(menu->containerId, menu->getItems());
|
||||
_mc->raknetInstance->send(owner, p);
|
||||
//LOGI("Refreshing container with %d items\n", items.size());
|
||||
LOGI("Refreshing container with %zu items\n", items.size());
|
||||
}
|
||||
|
||||
void ServerPlayer::nextContainerCounter() {
|
||||
@@ -163,3 +175,12 @@ void ServerPlayer::displayClientMessage( const std::string& messageId ) {
|
||||
ChatPacket package(messageId);
|
||||
_mc->raknetInstance->send(owner, package);
|
||||
}
|
||||
|
||||
void ServerPlayer::causeFallDamage(float distance) {
|
||||
int dmg = (int) ceil((distance - 3));
|
||||
if (dmg > 0) {
|
||||
SetHealthPacket packet(SetHealthPacket::HEALTH_MODIFY_OFFSET + dmg);
|
||||
_mc->raknetInstance->send(owner, packet);
|
||||
}
|
||||
super::causeFallDamage(distance);
|
||||
}
|
||||
@@ -15,7 +15,7 @@ class ServerPlayer: public Player,
|
||||
{
|
||||
typedef Player super;
|
||||
public:
|
||||
ServerPlayer(Minecraft* minecraft, Level* level);
|
||||
ServerPlayer(Minecraft* minecraft, Level* level, bool proto);
|
||||
|
||||
~ServerPlayer();
|
||||
|
||||
@@ -43,6 +43,17 @@ public:
|
||||
virtual void stopSleepInBed(bool forcefulWakeUp, bool updateLevelList, bool saveRespawnPoint);
|
||||
|
||||
void completeUsingItem();
|
||||
|
||||
void setLastMoveTicks(int lastMoveTicks) { this->lastMoveTicks = lastMoveTicks; }
|
||||
int getLastMoveTicks() { return lastMoveTicks; }
|
||||
|
||||
void setTicksInAir(int ticksInAir) { this->ticksInAir = ticksInAir; }
|
||||
int getTicksInAir() { return ticksInAir; }
|
||||
|
||||
void setNewProto(bool proto) { isNewProto = proto; }
|
||||
bool getProto() { return isNewProto; }
|
||||
|
||||
virtual void causeFallDamage(float distance);
|
||||
private:
|
||||
void nextContainerCounter();
|
||||
void setContainerMenu( BaseContainerMenu* menu );
|
||||
@@ -50,6 +61,11 @@ private:
|
||||
Minecraft* _mc;
|
||||
int _prevHealth;
|
||||
int _containerCounter;
|
||||
|
||||
int lastMoveTicks = 0;
|
||||
int ticksInAir = 0;
|
||||
|
||||
bool isNewProto = false;
|
||||
};
|
||||
|
||||
#endif /*ServerPlayer_H__*/
|
||||
|
||||
@@ -871,8 +871,8 @@ bool Entity::load( CompoundTag* tag )
|
||||
|
||||
// Add a small padding if standing next to the world edges
|
||||
const float padding = bbWidth * 0.5f + 0.001f;
|
||||
xx = Mth::clamp(xx, padding, (float)LEVEL_WIDTH - padding);
|
||||
zz = Mth::clamp(zz, padding, (float)LEVEL_DEPTH - padding);
|
||||
xx = Mth::clamp(xx, padding, (float)LevelConstants::LEVEL_WIDTH - padding);
|
||||
zz = Mth::clamp(zz, padding, (float)LevelConstants::LEVEL_DEPTH - padding);
|
||||
|
||||
xo = xOld = x = xx;
|
||||
yo = yOld = y = yy;
|
||||
|
||||
@@ -129,6 +129,7 @@ public:
|
||||
virtual bool isHangingEntity();
|
||||
|
||||
virtual int getAuxData();
|
||||
virtual void checkFallDamage(float ya, bool onGround);
|
||||
|
||||
protected:
|
||||
virtual void setRot(float yRot, float xRot);
|
||||
@@ -137,7 +138,6 @@ protected:
|
||||
virtual void resetPos(bool clearMore);
|
||||
virtual void outOfWorld();
|
||||
|
||||
virtual void checkFallDamage(float ya, bool onGround);
|
||||
virtual void causeFallDamage(float fallDamage2);
|
||||
virtual void markHurt();
|
||||
|
||||
|
||||
@@ -729,7 +729,6 @@ bool Mob::isWaterMob()
|
||||
void Mob::aiStep()
|
||||
{
|
||||
//@todo? 30 lines of code here in java version
|
||||
|
||||
TIMER_PUSH("ai");
|
||||
if (isImmobile()) {
|
||||
jumping = false;
|
||||
|
||||
@@ -223,6 +223,9 @@ protected:
|
||||
double xc, yc, zc;
|
||||
|
||||
public:
|
||||
void setxxa(float xxa) { this->xxa = xxa; }
|
||||
void setyya(float yya) { this->yya = yya; }
|
||||
|
||||
// Cape position accessors (for renderers)
|
||||
double getCapeX() const { return xCape; }
|
||||
double getCapeY() const { return yCape; }
|
||||
|
||||
@@ -357,3 +357,12 @@ bool Inventory::removeItem( const ItemInstance* samePtr ) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Inventory::print() {
|
||||
LOGI("%s's Inventory:\n", player->name.c_str());
|
||||
|
||||
for (int i = 0; i < numTotalSlots; i++) {
|
||||
auto item = getItem(i);
|
||||
if (item) LOGI("\t %i: %s (%i) %s\n", i, item->getName().c_str(), item->count, (player->inventory->getLinked(i))? "(Linked)" : "");
|
||||
}
|
||||
}
|
||||
@@ -45,6 +45,8 @@ public:
|
||||
int getAttackDamage(Entity* entity);
|
||||
float getDestroySpeed(Tile* tile);
|
||||
bool canDestroy(Tile* tile);
|
||||
|
||||
void print();
|
||||
private:
|
||||
void setupDefault();
|
||||
public:
|
||||
|
||||
@@ -141,6 +141,11 @@ bool FillingContainer::add( ItemInstance* item )
|
||||
// // silently destroy the item when having a full inventory
|
||||
// item->count = 0;
|
||||
// return true;
|
||||
|
||||
LOGI("Inventory:\n");
|
||||
for (int i = 0; i < numTotalSlots; i++) {
|
||||
LOGI("\t %i: %s (%i)\n", i, items.at(i)->getName().c_str(), items.at(i)->count);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -290,3 +290,7 @@ bool ItemInstance::isArmorItem( const ItemInstance* instance ) {
|
||||
|
||||
return item->isArmor();
|
||||
}
|
||||
|
||||
bool ItemInstance::isBlock(const ItemInstance* instance) {
|
||||
return instance->id < 256;
|
||||
}
|
||||
@@ -81,6 +81,8 @@ public:
|
||||
|
||||
static bool isArmorItem(const ItemInstance* instance);
|
||||
|
||||
static bool isBlock(const ItemInstance* instance);
|
||||
|
||||
/**
|
||||
* Checks if this item is the same item as the other one, disregarding the
|
||||
* 'count' value.
|
||||
|
||||
@@ -29,6 +29,9 @@
|
||||
#include "../Difficulty.h"
|
||||
#include "../../network/packet/ExplodePacket.h"
|
||||
|
||||
const int Level::DEPTH = LevelConstants::LEVEL_HEIGHT;
|
||||
const int Level::SEA_LEVEL = Level::DEPTH / 2 - 1;
|
||||
|
||||
Level::Level(LevelStorage* levelStorage, const std::string& levelName, const LevelSettings& settings, int generatorVersion, Dimension* fixedDimension /* = NULL */)
|
||||
: levelStorage(levelStorage),
|
||||
isClientSide(false),
|
||||
@@ -278,8 +281,8 @@ void Level::tickTiles() {
|
||||
for (int i = 0; i < pollChunkOffsetsSize; i += 2) {
|
||||
const int xp = xx + pollChunkOffsets[i];
|
||||
const int zp = zz + pollChunkOffsets[i+1];
|
||||
if (xp >= 0 && xp < CHUNK_CACHE_WIDTH &&
|
||||
zp >= 0 && zp < CHUNK_CACHE_WIDTH)
|
||||
if (xp >= 0 && xp < LevelConstants::CHUNK_CACHE_WIDTH &&
|
||||
zp >= 0 && zp < LevelConstants::CHUNK_CACHE_WIDTH)
|
||||
_chunksToPoll.insert(ChunkPos(xp, zp));
|
||||
}
|
||||
}
|
||||
@@ -428,17 +431,17 @@ bool Level::findPath(Path* path, Entity* from, int xBest, int yBest, int zBest,
|
||||
/*protected*/
|
||||
void Level::setInitialSpawn() {
|
||||
isFindingSpawn = true;
|
||||
int xSpawn = CHUNK_CACHE_WIDTH * CHUNK_WIDTH / 2; // (Level.MAX_LEVEL_SIZE - 100) * 0;
|
||||
int xSpawn = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_WIDTH / 2; // (Level.MAX_LEVEL_SIZE - 100) * 0;
|
||||
int ySpawn = 64;
|
||||
int zSpawn = CHUNK_CACHE_WIDTH * CHUNK_DEPTH / 2; // (Level.MAX_LEVEL_SIZE - 100) * 0;
|
||||
int zSpawn = LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_DEPTH / 2; // (Level.MAX_LEVEL_SIZE - 100) * 0;
|
||||
while (!dimension->isValidSpawn(xSpawn, zSpawn)) {
|
||||
xSpawn += random.nextInt(32) - random.nextInt(32);
|
||||
zSpawn += random.nextInt(32) - random.nextInt(32);
|
||||
|
||||
if (xSpawn < 4) xSpawn += 32;
|
||||
if (xSpawn >= LEVEL_WIDTH-4) xSpawn -= 32;
|
||||
if (xSpawn >= LevelConstants::LEVEL_WIDTH-4) xSpawn -= 32;
|
||||
if (zSpawn < 4) zSpawn += 32;
|
||||
if (zSpawn >= LEVEL_DEPTH-4) zSpawn -= 32;
|
||||
if (zSpawn >= LevelConstants::LEVEL_DEPTH-4) zSpawn -= 32;
|
||||
}
|
||||
levelData.setSpawn(xSpawn, ySpawn, zSpawn);
|
||||
isFindingSpawn = false;
|
||||
@@ -456,9 +459,9 @@ void Level::validateSpawn() {
|
||||
zSpawn += random.nextInt(8) - random.nextInt(8);
|
||||
|
||||
if (xSpawn < 4) xSpawn += 8;
|
||||
if (xSpawn >= LEVEL_WIDTH-4) xSpawn -= 8;
|
||||
if (xSpawn >= LevelConstants::LEVEL_WIDTH-4) xSpawn -= 8;
|
||||
if (zSpawn < 4) zSpawn += 8;
|
||||
if (zSpawn >= LEVEL_DEPTH-4) zSpawn -= 8;
|
||||
if (zSpawn >= LevelConstants::LEVEL_DEPTH-4) zSpawn -= 8;
|
||||
}
|
||||
levelData.setXSpawn(xSpawn);
|
||||
levelData.setZSpawn(zSpawn);
|
||||
@@ -944,7 +947,7 @@ HitResult Level::clip(const Vec3& A, const Vec3& b, bool liquid /*= false*/, boo
|
||||
if (solidOnly && tile != NULL && tile->getAABB(this, xTile0, yTile0, zTile0) == NULL) {
|
||||
// No collision
|
||||
} else if (t > 0 && tile->mayPick(data, liquid)) {
|
||||
if(xTile0 >= 0 && zTile0 >= 0 && xTile0 < LEVEL_WIDTH && zTile0 < LEVEL_WIDTH) {
|
||||
if(xTile0 >= 0 && zTile0 >= 0 && xTile0 < LevelConstants::LEVEL_WIDTH && zTile0 < LevelConstants::LEVEL_WIDTH) {
|
||||
HitResult r = tile->clip(this, xTile0, yTile0, zTile0, a, b);
|
||||
if (r.isHit()) return r;
|
||||
}
|
||||
@@ -2222,9 +2225,9 @@ void Level::setNightMode( bool isNightMode ) {
|
||||
}
|
||||
|
||||
bool Level::inRange( int x, int y, int z ) {
|
||||
return x >= 0 && x < LEVEL_WIDTH
|
||||
&& y >= 0 && y < LEVEL_HEIGHT
|
||||
&& z >= 0 && z < LEVEL_DEPTH;
|
||||
return x >= 0 && x < LevelConstants::LEVEL_WIDTH
|
||||
&& y >= 0 && y < LevelConstants::LEVEL_HEIGHT
|
||||
&& z >= 0 && z < LevelConstants::LEVEL_DEPTH;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -67,8 +67,8 @@ class Level: public LevelSource
|
||||
|
||||
public:
|
||||
static const int MAX_LEVEL_SIZE = 32000000;
|
||||
static const short DEPTH = LEVEL_HEIGHT;
|
||||
static const short SEA_LEVEL = DEPTH / 2 - 1;
|
||||
static const int DEPTH;
|
||||
static const int SEA_LEVEL;
|
||||
|
||||
static const int MAX_BRIGHTNESS = 15;
|
||||
static const int TICKS_PER_DAY = SharedConstants::TicksPerSecond * 60 * 16;// SharedConstants::TicksPerSecond * 60 * 12; // ORG:20*60*20
|
||||
@@ -307,6 +307,9 @@ public:
|
||||
Dimension* dimension;
|
||||
IRakNetInstance* raknetInstance;
|
||||
Random random;
|
||||
|
||||
std::set<std::string> ops;
|
||||
std::set<std::string> bannedPpl;
|
||||
protected:
|
||||
bool isFindingSpawn;
|
||||
|
||||
|
||||
10
src/world/level/LevelConstants.cpp
Normal file
10
src/world/level/LevelConstants.cpp
Normal file
@@ -0,0 +1,10 @@
|
||||
#include "LevelConstants.h"
|
||||
|
||||
int LevelConstants::LEVEL_HEIGHT = 128;
|
||||
int LevelConstants::CHUNK_CACHE_WIDTH = 16; // in chunks
|
||||
int LevelConstants::CHUNK_WIDTH = 16; // in blocks
|
||||
int LevelConstants::CHUNK_DEPTH = 16;
|
||||
int LevelConstants::LEVEL_WIDTH = LevelConstants::CHUNK_CACHE_WIDTH * CHUNK_WIDTH;
|
||||
int LevelConstants::LEVEL_DEPTH = LevelConstants::CHUNK_CACHE_WIDTH * CHUNK_DEPTH;
|
||||
int LevelConstants::CHUNK_COLUMNS = LevelConstants::CHUNK_WIDTH * LevelConstants::CHUNK_DEPTH;
|
||||
int LevelConstants::CHUNK_BLOCK_COUNT = LevelConstants::CHUNK_COLUMNS * LevelConstants::LEVEL_HEIGHT;
|
||||
@@ -1,14 +1,14 @@
|
||||
#ifndef _MINECRAFT_WORLD_LEVELCONSTANTS_H_
|
||||
#define _MINECRAFT_WORLD_LEVELCONSTANTS_H_
|
||||
#pragma once
|
||||
|
||||
|
||||
const int LEVEL_HEIGHT = 128;
|
||||
const int CHUNK_CACHE_WIDTH = 16; // in chunks
|
||||
const int CHUNK_WIDTH = 16; // in blocks
|
||||
const int CHUNK_DEPTH = 16;
|
||||
const int LEVEL_WIDTH = CHUNK_CACHE_WIDTH * CHUNK_WIDTH;
|
||||
const int LEVEL_DEPTH = CHUNK_CACHE_WIDTH * CHUNK_DEPTH;
|
||||
const int CHUNK_COLUMNS = CHUNK_WIDTH * CHUNK_DEPTH;
|
||||
const int CHUNK_BLOCK_COUNT = CHUNK_COLUMNS * LEVEL_HEIGHT;
|
||||
|
||||
#endif
|
||||
class LevelConstants {
|
||||
public:
|
||||
static int CHUNK_CACHE_WIDTH; // in chunks
|
||||
static int LEVEL_WIDTH;
|
||||
static int LEVEL_DEPTH;
|
||||
static int LEVEL_HEIGHT;
|
||||
|
||||
static int CHUNK_WIDTH; // in blocks
|
||||
static int CHUNK_DEPTH;
|
||||
static int CHUNK_COLUMNS;
|
||||
static int CHUNK_BLOCK_COUNT;
|
||||
};
|
||||
@@ -10,7 +10,7 @@
|
||||
#include "../LevelConstants.h"
|
||||
|
||||
class ChunkCache: public ChunkSource {
|
||||
//static const int CHUNK_CACHE_WIDTH = CHUNK_CACHE_WIDTH; // WAS 32;
|
||||
//static const int LevelConstants::CHUNK_CACHE_WIDTH = LevelConstants::CHUNK_CACHE_WIDTH; // WAS 32;
|
||||
static const int MAX_SAVES = 2;
|
||||
public:
|
||||
ChunkCache(Level* level_, ChunkStorage* storage_, ChunkSource* source_)
|
||||
@@ -24,14 +24,17 @@ public:
|
||||
isChunkCache = true;
|
||||
//emptyChunk = new EmptyLevelChunk(level_, emptyChunkBlocks, 0, 0);
|
||||
emptyChunk = new EmptyLevelChunk(level_, NULL, 0, 0);
|
||||
memset(chunks, 0, sizeof(LevelChunk*) * CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH);
|
||||
|
||||
chunks = new LevelChunk *[LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH];
|
||||
memset(chunks, 0, sizeof(LevelChunk*) * LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH);
|
||||
LOGI("Chunks allocated.");
|
||||
}
|
||||
|
||||
~ChunkCache() {
|
||||
delete source;
|
||||
delete emptyChunk;
|
||||
|
||||
for (int i = 0; i < CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; i++)
|
||||
for (int i = 0; i < LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH; i++)
|
||||
{
|
||||
if (chunks[i])
|
||||
{
|
||||
@@ -42,7 +45,7 @@ public:
|
||||
}
|
||||
|
||||
bool fits(int x, int z) {
|
||||
return (x >= 0 && z >= 0 && x < CHUNK_CACHE_WIDTH && z < CHUNK_CACHE_WIDTH);
|
||||
return (x >= 0 && z >= 0 && x < LevelConstants::CHUNK_CACHE_WIDTH && z < LevelConstants::CHUNK_CACHE_WIDTH);
|
||||
}
|
||||
|
||||
bool hasChunk(int x, int z) {
|
||||
@@ -52,9 +55,9 @@ public:
|
||||
if (x == xLast && z == zLast && last != NULL) {
|
||||
return true;
|
||||
}
|
||||
int xs = x & (CHUNK_CACHE_WIDTH - 1);
|
||||
int zs = z & (CHUNK_CACHE_WIDTH - 1);
|
||||
int slot = xs + zs * CHUNK_CACHE_WIDTH;
|
||||
int xs = x & (LevelConstants::CHUNK_CACHE_WIDTH - 1);
|
||||
int zs = z & (LevelConstants::CHUNK_CACHE_WIDTH - 1);
|
||||
int slot = xs + zs * LevelConstants::CHUNK_CACHE_WIDTH;
|
||||
return chunks[slot] != NULL && (chunks[slot] == emptyChunk || chunks[slot]->isAt(x, z));
|
||||
}
|
||||
|
||||
@@ -71,9 +74,9 @@ public:
|
||||
}
|
||||
if (!fits(x, z)) return emptyChunk;
|
||||
//if (!level->isFindingSpawn && !fits(x, z)) return emptyChunk;
|
||||
int xs = x & (CHUNK_CACHE_WIDTH - 1);
|
||||
int zs = z & (CHUNK_CACHE_WIDTH - 1);
|
||||
int slot = xs + zs * CHUNK_CACHE_WIDTH;
|
||||
int xs = x & (LevelConstants::CHUNK_CACHE_WIDTH - 1);
|
||||
int zs = z & (LevelConstants::CHUNK_CACHE_WIDTH - 1);
|
||||
int slot = xs + zs * LevelConstants::CHUNK_CACHE_WIDTH;
|
||||
if (!hasChunk(x, z)) {
|
||||
if (chunks[slot] != NULL) {
|
||||
chunks[slot]->unload();
|
||||
@@ -199,8 +202,8 @@ public:
|
||||
void saveAll(bool onlyUnsaved) {
|
||||
if (storage != NULL) {
|
||||
std::vector<LevelChunk*> chunks;
|
||||
for (int z = 0; z < CHUNK_CACHE_WIDTH; ++z)
|
||||
for (int x = 0; x < CHUNK_CACHE_WIDTH; ++x) {
|
||||
for (int z = 0; z < LevelConstants::CHUNK_CACHE_WIDTH; ++z)
|
||||
for (int x = 0; x < LevelConstants::CHUNK_CACHE_WIDTH; ++x) {
|
||||
LevelChunk* chunk = level->getChunk(x, z);
|
||||
if (!onlyUnsaved || chunk->shouldSave(false))
|
||||
chunks.push_back( chunk );
|
||||
@@ -211,7 +214,7 @@ public:
|
||||
private:
|
||||
LevelChunk* load(int x, int z) {
|
||||
if (storage == NULL) return emptyChunk;
|
||||
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)
|
||||
{
|
||||
return emptyChunk;
|
||||
}
|
||||
@@ -254,7 +257,7 @@ private:
|
||||
LevelChunk* emptyChunk;
|
||||
ChunkSource* source;
|
||||
ChunkStorage* storage;
|
||||
LevelChunk* chunks[CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH];
|
||||
LevelChunk** chunks;
|
||||
Level* level;
|
||||
|
||||
LevelChunk* last;
|
||||
|
||||
@@ -12,13 +12,14 @@
|
||||
|
||||
/*static*/
|
||||
bool LevelChunk::touchedSky = false;
|
||||
int LevelChunk::ChunkBlockCount;
|
||||
|
||||
LevelChunk::LevelChunk( Level* level, int x, int z )
|
||||
: level(level),
|
||||
x(x),
|
||||
z(z),
|
||||
xt(x * CHUNK_WIDTH),
|
||||
zt(z * CHUNK_DEPTH)
|
||||
xt(x * LevelConstants::CHUNK_WIDTH),
|
||||
zt(z * LevelConstants::CHUNK_DEPTH)
|
||||
{
|
||||
init();
|
||||
}
|
||||
@@ -27,8 +28,8 @@ LevelChunk::LevelChunk( Level* level, unsigned char* blocks, int x, int z )
|
||||
: level(level),
|
||||
x(x),
|
||||
z(z),
|
||||
xt(x * CHUNK_WIDTH),
|
||||
zt(z * CHUNK_DEPTH),
|
||||
xt(x * LevelConstants::CHUNK_WIDTH),
|
||||
zt(z * LevelConstants::CHUNK_DEPTH),
|
||||
blocks(blocks),
|
||||
data(ChunkBlockCount),
|
||||
skyLight(ChunkBlockCount),
|
||||
@@ -45,6 +46,9 @@ LevelChunk::~LevelChunk()
|
||||
|
||||
void LevelChunk::init()
|
||||
{
|
||||
heightmap = new char[LevelConstants::CHUNK_COLUMNS];
|
||||
updateMap = new unsigned char[LevelConstants::CHUNK_COLUMNS];
|
||||
|
||||
terrainPopulated = false;
|
||||
dontSave = false;
|
||||
unsaved = false;
|
||||
|
||||
@@ -106,9 +106,9 @@ private:
|
||||
void recalcHeight(int x, int yStart, int z);
|
||||
public:
|
||||
static bool touchedSky;
|
||||
static const int ChunkBlockCount = CHUNK_BLOCK_COUNT;
|
||||
static const int ChunkSize = ChunkBlockCount;
|
||||
static const int UpdateMapBitShift = 4; // power of (LEVEL_HEIGHT / 8) == 16
|
||||
static int ChunkBlockCount;
|
||||
const int ChunkSize = ChunkBlockCount;
|
||||
static const int UpdateMapBitShift = 4; // power of (LevelConstants::LEVEL_HEIGHT / 8) == 16
|
||||
|
||||
int blocksLength; // ? needed or not? (i.e. are all chunks the same size?)
|
||||
|
||||
@@ -118,12 +118,12 @@ public:
|
||||
DataLayer skyLight;
|
||||
DataLayer blockLight;
|
||||
|
||||
char heightmap[CHUNK_COLUMNS];
|
||||
unsigned char updateMap[CHUNK_COLUMNS]; // marks regions within block columns that have been modified
|
||||
char* heightmap; // [LevelConstants::CHUNK_COLUMNS]
|
||||
unsigned char* updateMap; // marks regions within block columns that have been modified [LevelConstants::CHUNK_COLUMNS]
|
||||
int minHeight;
|
||||
|
||||
const int x, z;
|
||||
const int xt, zt;
|
||||
int x, z;
|
||||
int xt, zt;
|
||||
|
||||
bool terrainPopulated;
|
||||
bool unsaved;
|
||||
|
||||
@@ -64,7 +64,7 @@ RandomLevelSource::~RandomLevelSource() {
|
||||
/*public*/
|
||||
void RandomLevelSource::prepareHeights(int xOffs, int zOffs, unsigned char* blocks, /*Biome*/void* biomes, float* temperatures) {
|
||||
|
||||
int xChunks = 16 / CHUNK_WIDTH;
|
||||
int xChunks = 16 / LevelConstants::CHUNK_WIDTH;
|
||||
int waterHeight = Level::DEPTH - 64;
|
||||
|
||||
int xSize = xChunks + 1;
|
||||
@@ -87,23 +87,23 @@ void RandomLevelSource::prepareHeights(int xOffs, int zOffs, unsigned char* bloc
|
||||
float s3a = (buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 1)] - s3) * yStep;
|
||||
|
||||
for (int y = 0; y < CHUNK_HEIGHT; y++) {
|
||||
float xStep = 1 / (float) CHUNK_WIDTH;
|
||||
float xStep = 1 / (float) LevelConstants::CHUNK_WIDTH;
|
||||
|
||||
float _s0 = s0;
|
||||
float _s1 = s1;
|
||||
float _s0a = (s2 - s0) * xStep;
|
||||
float _s1a = (s3 - s1) * xStep;
|
||||
|
||||
for (int x = 0; x < CHUNK_WIDTH; x++) {
|
||||
int offs = (x + xc * CHUNK_WIDTH) << 11 | (0 + zc * CHUNK_WIDTH) << 7 | (yc * CHUNK_HEIGHT + y);
|
||||
for (int x = 0; x < LevelConstants::CHUNK_WIDTH; x++) {
|
||||
int offs = (x + xc * LevelConstants::CHUNK_WIDTH) << 11 | (0 + zc * LevelConstants::CHUNK_WIDTH) << 7 | (yc * CHUNK_HEIGHT + y);
|
||||
int step = 1 << 7;
|
||||
float zStep = 1 / (float) CHUNK_WIDTH;
|
||||
float zStep = 1 / (float) LevelConstants::CHUNK_WIDTH;
|
||||
|
||||
float val = _s0;
|
||||
float vala = (_s1 - _s0) * zStep;
|
||||
for (int z = 0; z < CHUNK_WIDTH; z++) {
|
||||
// + (zc * CHUNK_WIDTH + z)];
|
||||
float temp = temperatures[(xc * CHUNK_WIDTH + x) * 16 + (zc * CHUNK_WIDTH + z)];
|
||||
for (int z = 0; z < LevelConstants::CHUNK_WIDTH; z++) {
|
||||
// + (zc * LevelConstants::CHUNK_WIDTH + z)];
|
||||
float temp = temperatures[(xc * LevelConstants::CHUNK_WIDTH + x) * 16 + (zc * LevelConstants::CHUNK_WIDTH + z)];
|
||||
int tileId = 0;
|
||||
if (yc * CHUNK_HEIGHT + y < waterHeight) {
|
||||
if (temp < SNOW_CUTOFF && yc * CHUNK_HEIGHT + y >= waterHeight - 1) {
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
#include <cstddef>
|
||||
#include <fstream>
|
||||
#include <ios>
|
||||
#if !defined(DEMO_MODE) && !defined(APPLE_DEMO_PROMOTION)
|
||||
|
||||
#include "LevelData.h"
|
||||
@@ -88,6 +91,9 @@ ExternalFileLevelStorage::ExternalFileLevelStorage(const std::string& levelId, c
|
||||
{
|
||||
createFolderIfNotExists(levelPath.c_str());
|
||||
|
||||
std::string playerFolder = levelPath + "/players";
|
||||
createFolderIfNotExists(playerFolder.c_str());
|
||||
|
||||
std::string datFileName = levelPath + "/" + fnLevelDat;
|
||||
std::string levelFileName = levelPath + "/" + fnPlayerDat;
|
||||
loadedLevelData = new LevelData();
|
||||
@@ -113,6 +119,7 @@ void ExternalFileLevelStorage::saveLevelData(LevelData& levelData, std::vector<P
|
||||
|
||||
void ExternalFileLevelStorage::saveLevelData( const std::string& levelPath, LevelData& levelData, std::vector<Player*>* players )
|
||||
{
|
||||
// @todo: completely rewrite
|
||||
std::string directory = levelPath + "/";
|
||||
std::string tmpFile = directory + fnLevelDatNew;
|
||||
std::string datFile = directory + fnLevelDat;
|
||||
@@ -141,6 +148,67 @@ void ExternalFileLevelStorage::saveLevelData( const std::string& levelPath, Leve
|
||||
|
||||
// Remove the temporary save, if the rename didn't do it
|
||||
remove(tmpFile.c_str());
|
||||
|
||||
// Save players
|
||||
// fuck mojang for that
|
||||
if (!players || players->empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto& player : *players) {
|
||||
if (player != NULL) {
|
||||
savePlayer(*player, directory);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ExternalFileLevelStorage::savePlayer(Player& player, const std::string& worldDir) {
|
||||
std::string playerPath = worldDir + "/players/" + player.name + ".dat";
|
||||
|
||||
LOGI("Saving player %s to %s...\n", player.name.c_str(), playerPath.c_str());
|
||||
|
||||
RakNet::BitStream data;
|
||||
RakDataOutput buf(data);
|
||||
CompoundTag playerTag;
|
||||
player.saveWithoutId(&playerTag);
|
||||
|
||||
NbtIo::write(&playerTag, &buf);
|
||||
|
||||
std::ofstream file(playerPath, std::ios::out | std::ios::binary);
|
||||
file.write((const char*)data.GetData(), (size_t)data.GetNumberOfBytesUsed());
|
||||
}
|
||||
|
||||
bool ExternalFileLevelStorage::loadPlayer(Player& player, const std::string& worldDir) {
|
||||
std::string playerPath = worldDir + "/players/" + player.name + ".dat";
|
||||
|
||||
LOGI("Loading player %s from %s...\n", player.name.c_str(), playerPath.c_str());
|
||||
|
||||
std::ifstream file(playerPath, std::ios::in | std::ios::binary);
|
||||
if (!file.is_open()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<uint8_t> data((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
|
||||
|
||||
RakNet::BitStream bitStream(data.data(), data.size(), false);
|
||||
RakDataInput stream(bitStream);
|
||||
|
||||
CompoundTag* tag = NbtIo::read(&stream);
|
||||
if (tag) {
|
||||
player.load(tag);
|
||||
tag->deleteChildren();
|
||||
delete tag;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ExternalFileLevelStorage::savePlayer(Player& player) {
|
||||
ExternalFileLevelStorage::savePlayer(player, levelPath);
|
||||
}
|
||||
|
||||
bool ExternalFileLevelStorage::loadPlayer(Player& player) {
|
||||
return ExternalFileLevelStorage::loadPlayer(player, levelPath);
|
||||
}
|
||||
|
||||
LevelData* ExternalFileLevelStorage::prepareLevel(Level* _level)
|
||||
@@ -275,8 +343,8 @@ bool ExternalFileLevelStorage::readPlayerData(const std::string& filename, Level
|
||||
Vec3& pos = dest.playerData.pos;
|
||||
if (pos.x < 0.5f) pos.x = 0.5f;
|
||||
if (pos.z < 0.5f) pos.z = 0.5f;
|
||||
if (pos.x > (LEVEL_WIDTH - 0.5f)) pos.x = LEVEL_WIDTH - 0.5f;
|
||||
if (pos.z > (LEVEL_DEPTH - 0.5f)) pos.z = LEVEL_DEPTH - 0.5f;
|
||||
if (pos.x > (LevelConstants::LEVEL_WIDTH - 0.5f)) pos.x = LevelConstants::LEVEL_WIDTH - 0.5f;
|
||||
if (pos.z > (LevelConstants::LEVEL_DEPTH - 0.5f)) pos.z = LevelConstants::LEVEL_DEPTH - 0.5f;
|
||||
if (pos.y < 0) pos.y = 64;
|
||||
|
||||
dest.playerDataVersion = version;
|
||||
@@ -294,14 +362,14 @@ void ExternalFileLevelStorage::tick()
|
||||
LOGI("Saving level...\n");
|
||||
|
||||
// look for chunks that needs to be saved
|
||||
for (int z = 0; z < CHUNK_CACHE_WIDTH; z++)
|
||||
for (int z = 0; z < LevelConstants::CHUNK_CACHE_WIDTH; z++)
|
||||
{
|
||||
for (int x = 0; x < CHUNK_CACHE_WIDTH; x++)
|
||||
for (int x = 0; x < LevelConstants::CHUNK_CACHE_WIDTH; x++)
|
||||
{
|
||||
LevelChunk* chunk = level->getChunk(x, z);
|
||||
if (chunk && chunk->unsaved)
|
||||
{
|
||||
int pos = x + z * CHUNK_CACHE_WIDTH;
|
||||
int pos = x + z * LevelConstants::CHUNK_CACHE_WIDTH;
|
||||
UnsavedChunkList::iterator prev = unsavedChunkList.begin();
|
||||
for ( ; prev != unsavedChunkList.end(); ++prev)
|
||||
{
|
||||
@@ -347,13 +415,13 @@ void ExternalFileLevelStorage::save(Level* level, LevelChunk* levelChunk)
|
||||
|
||||
// Write chunk
|
||||
RakNet::BitStream chunkData;
|
||||
chunkData.Write((const char*)levelChunk->getBlockData(), CHUNK_BLOCK_COUNT);
|
||||
chunkData.Write((const char*)levelChunk->data.data, CHUNK_BLOCK_COUNT / 2);
|
||||
chunkData.Write((const char*)levelChunk->getBlockData(), LevelConstants::CHUNK_BLOCK_COUNT);
|
||||
chunkData.Write((const char*)levelChunk->data.data, LevelConstants::CHUNK_BLOCK_COUNT / 2);
|
||||
|
||||
chunkData.Write((const char*)levelChunk->skyLight.data, CHUNK_BLOCK_COUNT / 2);
|
||||
chunkData.Write((const char*)levelChunk->blockLight.data, CHUNK_BLOCK_COUNT / 2);
|
||||
chunkData.Write((const char*)levelChunk->skyLight.data, LevelConstants::CHUNK_BLOCK_COUNT / 2);
|
||||
chunkData.Write((const char*)levelChunk->blockLight.data, LevelConstants::CHUNK_BLOCK_COUNT / 2);
|
||||
|
||||
chunkData.Write((const char*)levelChunk->updateMap, CHUNK_COLUMNS);
|
||||
chunkData.Write((const char*)levelChunk->updateMap, LevelConstants::CHUNK_COLUMNS);
|
||||
|
||||
regionFile->writeChunk(levelChunk->x, levelChunk->z, chunkData);
|
||||
|
||||
@@ -385,16 +453,16 @@ LevelChunk* ExternalFileLevelStorage::load(Level* level, int x, int z)
|
||||
|
||||
chunkData->ResetReadPointer();
|
||||
|
||||
unsigned char* blockIds = new unsigned char[CHUNK_BLOCK_COUNT];
|
||||
chunkData->Read((char*)blockIds, CHUNK_BLOCK_COUNT);
|
||||
unsigned char* blockIds = new unsigned char[LevelConstants::CHUNK_BLOCK_COUNT];
|
||||
chunkData->Read((char*)blockIds, LevelConstants::CHUNK_BLOCK_COUNT);
|
||||
|
||||
LevelChunk* levelChunk = new LevelChunk(level, blockIds, x, z);
|
||||
chunkData->Read((char*)levelChunk->data.data, CHUNK_BLOCK_COUNT / 2);
|
||||
chunkData->Read((char*)levelChunk->data.data, LevelConstants::CHUNK_BLOCK_COUNT / 2);
|
||||
if (loadedStorageVersion >= ChunkVersion_Light) {
|
||||
chunkData->Read((char*)levelChunk->skyLight.data, CHUNK_BLOCK_COUNT / 2);
|
||||
chunkData->Read((char*)levelChunk->blockLight.data, CHUNK_BLOCK_COUNT / 2);
|
||||
chunkData->Read((char*)levelChunk->skyLight.data, LevelConstants::CHUNK_BLOCK_COUNT / 2);
|
||||
chunkData->Read((char*)levelChunk->blockLight.data, LevelConstants::CHUNK_BLOCK_COUNT / 2);
|
||||
}
|
||||
chunkData->Read((char*)levelChunk->updateMap, CHUNK_COLUMNS);
|
||||
chunkData->Read((char*)levelChunk->updateMap, LevelConstants::CHUNK_COLUMNS);
|
||||
// This will be difficult to maintain.. Storage version could be per chunk
|
||||
// too (but probably better to just read all -> write all, so that all
|
||||
// chunks got same version anyway)
|
||||
@@ -417,7 +485,7 @@ LevelChunk* ExternalFileLevelStorage::load(Level* level, int x, int z)
|
||||
//bool dbg = (x == 7 && z == 9);
|
||||
|
||||
//int t = 0;
|
||||
//for (int i = 0; i < CHUNK_COLUMNS; ++i) {
|
||||
//for (int i = 0; i < LevelConstants::CHUNK_COLUMNS; ++i) {
|
||||
// char bits = levelChunk->updateMap[i];
|
||||
// t += (bits != 0);
|
||||
// int xx = x * 16 + i%16;
|
||||
|
||||
@@ -67,6 +67,19 @@ public:
|
||||
void saveGame(Level* level);
|
||||
void saveAll(Level* level, std::vector<LevelChunk*>& levelChunks);
|
||||
|
||||
/**
|
||||
* @brief Save player to <world name>/player/<player name>.dat file
|
||||
*/
|
||||
static void savePlayer(Player& player, const std::string& worldDir);
|
||||
|
||||
/**
|
||||
* @brief Load player from <world name>/player/<player name>.dat file
|
||||
*/
|
||||
static bool loadPlayer(Player& player, const std::string& worldDir);
|
||||
|
||||
virtual void savePlayer(Player& player);
|
||||
virtual bool loadPlayer(Player& player);
|
||||
|
||||
virtual void tick();
|
||||
virtual void flush() {}
|
||||
private:
|
||||
|
||||
@@ -32,6 +32,9 @@ public:
|
||||
virtual void saveGame(Level* level) {}
|
||||
virtual void loadEntities(Level* level, LevelChunk* levelChunk) {}
|
||||
|
||||
virtual void savePlayer(Player& player) = 0;
|
||||
virtual bool loadPlayer(Player& player) = 0;
|
||||
|
||||
//void checkSession() throws LevelConflictException;
|
||||
//PlayerIO getPlayerIO();
|
||||
};
|
||||
|
||||
@@ -47,7 +47,7 @@ bool Mushroom::mayPlaceOn( int tile ) {
|
||||
}
|
||||
|
||||
bool Mushroom::canSurvive( Level* level, int x, int y, int z ) {
|
||||
if (y < 0 || y >= LEVEL_HEIGHT/*Level::maxBuildHeight*/)
|
||||
if (y < 0 || y >= LevelConstants::LEVEL_HEIGHT/*Level::maxBuildHeight*/)
|
||||
return false;
|
||||
|
||||
int below = level->getTile(x, y - 1, z);
|
||||
|
||||
@@ -53,7 +53,7 @@ bool NetherReactor::canSpawnStartNetherReactor( Level* level, int x, int y, int
|
||||
if(!allPlayersCloseToReactor(level, x, y, z)) {
|
||||
player->displayClientMessage("All players need to be close to the reactor.");
|
||||
return false;
|
||||
} else if(y > LEVEL_HEIGHT - 28) {
|
||||
} else if(y > LevelConstants::LEVEL_HEIGHT - 28) {
|
||||
player->displayClientMessage("The nether reactor needs to be built lower down.");
|
||||
return false;
|
||||
} else if(y < 2) {
|
||||
|
||||
@@ -6,24 +6,23 @@ NetherReactorPattern::NetherReactorPattern( ) {
|
||||
const int netherCoreId = Tile::netherReactor->id;
|
||||
const unsigned int types[3][3][3] =
|
||||
{
|
||||
// Changing all of these values to be unsigned is needed to get the nether reactor pattern to compile. In the past having them be normal ints was fine but the c++ convention has changed
|
||||
// Level 0
|
||||
// Level 0
|
||||
{
|
||||
{static_cast<unsigned int>(goldId), static_cast<unsigned int>(stoneId), static_cast<unsigned int>(goldId)},
|
||||
{static_cast<unsigned int>(stoneId), static_cast<unsigned int>(stoneId), static_cast<unsigned int>(stoneId)},
|
||||
{static_cast<unsigned int>(goldId), static_cast<unsigned int>(stoneId), static_cast<unsigned int>(goldId)}
|
||||
{goldId, stoneId, goldId},
|
||||
{stoneId, stoneId, stoneId},
|
||||
{goldId, stoneId, goldId}
|
||||
},
|
||||
// Level 1
|
||||
{
|
||||
{static_cast<unsigned int>(stoneId), 0, static_cast<unsigned int>(stoneId)},
|
||||
{0, static_cast<unsigned int>(netherCoreId), 0},
|
||||
{static_cast<unsigned int>(stoneId), 0, static_cast<unsigned int>(stoneId)}
|
||||
{stoneId, 0, stoneId},
|
||||
{0, netherCoreId, 0},
|
||||
{stoneId, 0, stoneId}
|
||||
},
|
||||
// Level 2
|
||||
{
|
||||
{0, static_cast<unsigned int>(stoneId), 0},
|
||||
{static_cast<unsigned int>(stoneId), static_cast<unsigned int>(stoneId), static_cast<unsigned int>(stoneId)},
|
||||
{0, static_cast<unsigned int>(stoneId), 0}
|
||||
{0, stoneId, 0},
|
||||
{stoneId, stoneId, stoneId},
|
||||
{0, stoneId, 0}
|
||||
}
|
||||
};
|
||||
for(int setLevel = 0; setLevel <= 2; ++setLevel) {
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "../../item/StoneSlabTileItem.h"
|
||||
#include "../../item/SaplingTileItem.h"
|
||||
#include "../../item/ItemCategory.h"
|
||||
#include "world/level/LevelConstants.h"
|
||||
|
||||
const int Tile::RENDERLAYER_OPAQUE = 0;
|
||||
const int Tile::RENDERLAYER_ALPHATEST = 1;
|
||||
@@ -512,10 +513,15 @@ bool Tile::shouldRenderFace( LevelSource* level, int x, int y, int z, int face )
|
||||
{
|
||||
if (face == 0 && y == -1) return false;
|
||||
// For fixed size worlds //@todo: external constants rather than magic numbers
|
||||
// @fixme @ahtung temp fix
|
||||
|
||||
auto xz = LevelConstants::CHUNK_CACHE_WIDTH == 16 ? 256 :
|
||||
LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH / (LevelConstants::CHUNK_CACHE_WIDTH * LevelConstants::CHUNK_CACHE_WIDTH / 256 / 2);
|
||||
|
||||
if (face == 2 && z == -1) return false;
|
||||
if (face == 3 && z == 256) return false;
|
||||
if (face == 3 && z == xz) return false;
|
||||
if (face == 4 && x == -1) return false;
|
||||
if (face == 5 && x == 256) return false;
|
||||
if (face == 5 && x == xz) return false;
|
||||
// Common
|
||||
if (face == 0 && yy0 > 0) return true;
|
||||
if (face == 1 && yy1 < 1) return true;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user