mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Merge remote-tracking branch 'upstream/master' into Visuals-Vol-2
This commit is contained in:
commit
71e648a776
647 changed files with 60434 additions and 37195 deletions
|
@ -1,9 +1,16 @@
|
||||||
[*]
|
[*]
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
|
|
||||||
[*.{cpp,h,lua,txt,glsl,md,c,cmake,java,gradle}]
|
[*.{cpp,h,lua,txt,glsl,c,cmake,java,gradle}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
charset = utf-8
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
3
.github/CONTRIBUTING.md
vendored
3
.github/CONTRIBUTING.md
vendored
|
@ -36,6 +36,9 @@ Contributions are welcome! Here's how you can help:
|
||||||
- Follow the [C/C++](http://dev.minetest.net/Code_style_guidelines) and
|
- Follow the [C/C++](http://dev.minetest.net/Code_style_guidelines) and
|
||||||
[Lua](http://dev.minetest.net/Lua_code_style_guidelines) code style guidelines.
|
[Lua](http://dev.minetest.net/Lua_code_style_guidelines) code style guidelines.
|
||||||
- Check your code works as expected and document any changes to the Lua API.
|
- Check your code works as expected and document any changes to the Lua API.
|
||||||
|
- To avoid conflicting changes between contributions, do not do the following manually. They will be done before each release.
|
||||||
|
- Run `updatepo.sh` or update `minetest.po{,t}` even if your code adds new translatable strings.
|
||||||
|
- Update `minetest.conf.example` and `settings_translation_file.cpp` even if your code adds new core settings.
|
||||||
|
|
||||||
4. Commit & [push](https://help.github.com/articles/pushing-to-a-remote/) your changes to a new branch (not `master`, one change per branch)
|
4. Commit & [push](https://help.github.com/articles/pushing-to-a-remote/) your changes to a new branch (not `master`, one change per branch)
|
||||||
- Commit messages should:
|
- Commit messages should:
|
||||||
|
|
7
.github/workflows/android.yml
vendored
7
.github/workflows/android.yml
vendored
|
@ -35,7 +35,12 @@ jobs:
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y --no-install-recommends gettext openjdk-17-jdk-headless
|
sudo apt-get install -y --no-install-recommends gettext
|
||||||
|
- name: Set up JDK 17
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
distribution: 'temurin'
|
||||||
|
java-version: '17'
|
||||||
- name: Build AAB with Gradle
|
- name: Build AAB with Gradle
|
||||||
# We build an AAB as well for uploading to the the Play Store.
|
# We build an AAB as well for uploading to the the Play Store.
|
||||||
run: cd android; ./gradlew bundlerelease
|
run: cd android; ./gradlew bundlerelease
|
||||||
|
|
2
.github/workflows/lua.yml
vendored
2
.github/workflows/lua.yml
vendored
|
@ -35,7 +35,7 @@ jobs:
|
||||||
|
|
||||||
- name: Integration test + devtest
|
- name: Integration test + devtest
|
||||||
run: |
|
run: |
|
||||||
./util/test_multiplayer.sh
|
serverconf="profiler.load=true" ./util/test_multiplayer.sh
|
||||||
|
|
||||||
luacheck:
|
luacheck:
|
||||||
name: "Builtin Luacheck and Unit Tests"
|
name: "Builtin Luacheck and Unit Tests"
|
||||||
|
|
5
.github/workflows/macos.yml
vendored
5
.github/workflows/macos.yml
vendored
|
@ -10,6 +10,7 @@ on:
|
||||||
- 'src/**.cpp'
|
- 'src/**.cpp'
|
||||||
- 'irr/**.[ch]'
|
- 'irr/**.[ch]'
|
||||||
- 'irr/**.cpp'
|
- 'irr/**.cpp'
|
||||||
|
- 'irr/**.mm' # Objective-C(++)
|
||||||
- '**/CMakeLists.txt'
|
- '**/CMakeLists.txt'
|
||||||
- 'cmake/Modules/**'
|
- 'cmake/Modules/**'
|
||||||
- '.github/workflows/macos.yml'
|
- '.github/workflows/macos.yml'
|
||||||
|
@ -28,7 +29,8 @@ on:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: macos-latest
|
# use lowest possible macOS running on x86_64 to support more users
|
||||||
|
runs-on: macos-12
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
|
@ -58,6 +60,7 @@ jobs:
|
||||||
- name: CPack
|
- name: CPack
|
||||||
run: |
|
run: |
|
||||||
cd build
|
cd build
|
||||||
|
rm -rf macos
|
||||||
cmake .. -DINSTALL_DEVTEST=FALSE
|
cmake .. -DINSTALL_DEVTEST=FALSE
|
||||||
cpack -G ZIP -B macos
|
cpack -G ZIP -B macos
|
||||||
|
|
||||||
|
|
45
.github/workflows/whitespace_checks.yml
vendored
Normal file
45
.github/workflows/whitespace_checks.yml
vendored
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
name: whitespace_checks
|
||||||
|
|
||||||
|
# Check whitespaces of the following file types
|
||||||
|
# Not checked: .lua, .yml, .properties, .conf, .java, .py, .svg, .gradle, .xml, ...
|
||||||
|
# (luacheck already checks .lua files)
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- '**.txt'
|
||||||
|
- '**.md'
|
||||||
|
- '**.[ch]'
|
||||||
|
- '**.cpp'
|
||||||
|
- '**.hpp'
|
||||||
|
- '**.sh'
|
||||||
|
- '**.cmake'
|
||||||
|
- '**.glsl'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '**.txt'
|
||||||
|
- '**.md'
|
||||||
|
- '**.[ch]'
|
||||||
|
- '**.cpp'
|
||||||
|
- '**.hpp'
|
||||||
|
- '**.sh'
|
||||||
|
- '**.cmake'
|
||||||
|
- '**.glsl'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
trailing_whitespaces:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
# Line endings are already ensured by .gitattributes
|
||||||
|
- name: Check trailing whitespaces
|
||||||
|
run: if git ls-files | grep -E '\.txt$|\.md$|\.[ch]$|\.cpp$|\.hpp$|\.sh$|\.cmake$|\.glsl$' | xargs grep -n '\s$'; then echo -e "\033[0;31mFound trailing whitespace"; (exit 1); else (exit 0); fi
|
||||||
|
|
||||||
|
tabs_lua_api_files:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
# Some files should not contain tabs
|
||||||
|
- name: Check tabs in Lua API files
|
||||||
|
run: if grep -n $'\t' doc/lua_api.md doc/client_lua_api.md; then echo -e "\033[0;31mFound tab in markdown file"; (exit 1); else (exit 0); fi
|
||||||
|
|
||||||
|
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -43,6 +43,10 @@ build/.cmake/
|
||||||
*.zsync
|
*.zsync
|
||||||
appimage-build
|
appimage-build
|
||||||
AppDir
|
AppDir
|
||||||
|
# Direnv
|
||||||
|
.direnv/
|
||||||
|
# Nix
|
||||||
|
/result
|
||||||
|
|
||||||
## Files related to Minetest development cycle
|
## Files related to Minetest development cycle
|
||||||
/*.patch
|
/*.patch
|
||||||
|
|
10
.luacheckrc
10
.luacheckrc
|
@ -20,7 +20,7 @@ read_globals = {
|
||||||
"PerlinNoise", "PerlinNoiseMap",
|
"PerlinNoise", "PerlinNoiseMap",
|
||||||
|
|
||||||
string = {fields = {"split", "trim"}},
|
string = {fields = {"split", "trim"}},
|
||||||
table = {fields = {"copy", "getn", "indexof", "insert_all"}},
|
table = {fields = {"copy", "getn", "indexof", "keyof", "insert_all"}},
|
||||||
math = {fields = {"hypot", "round"}},
|
math = {fields = {"hypot", "round"}},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,12 @@ files["builtin/client/register.lua"] = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
files["builtin/common/math.lua"] = {
|
||||||
|
globals = {
|
||||||
|
"math",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
files["builtin/common/misc_helpers.lua"] = {
|
files["builtin/common/misc_helpers.lua"] = {
|
||||||
globals = {
|
globals = {
|
||||||
"dump", "dump2", "table", "math", "string",
|
"dump", "dump2", "table", "math", "string",
|
||||||
|
@ -46,7 +52,7 @@ files["builtin/common/misc_helpers.lua"] = {
|
||||||
}
|
}
|
||||||
|
|
||||||
files["builtin/common/vector.lua"] = {
|
files["builtin/common/vector.lua"] = {
|
||||||
globals = { "vector" },
|
globals = { "vector", "math" },
|
||||||
}
|
}
|
||||||
|
|
||||||
files["builtin/game/voxelarea.lua"] = {
|
files["builtin/game/voxelarea.lua"] = {
|
||||||
|
|
|
@ -11,7 +11,7 @@ set(CLANG_MINIMUM_VERSION "7.0.1")
|
||||||
|
|
||||||
# You should not need to edit these manually, use util/bump_version.sh
|
# You should not need to edit these manually, use util/bump_version.sh
|
||||||
set(VERSION_MAJOR 5)
|
set(VERSION_MAJOR 5)
|
||||||
set(VERSION_MINOR 9)
|
set(VERSION_MINOR 10)
|
||||||
set(VERSION_PATCH 0)
|
set(VERSION_PATCH 0)
|
||||||
set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string")
|
set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string")
|
||||||
|
|
||||||
|
@ -56,6 +56,11 @@ if((WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR APPLE)
|
||||||
endif()
|
endif()
|
||||||
set(ENABLE_LTO ${DEFAULT_ENABLE_LTO} CACHE BOOL "Use Link Time Optimization")
|
set(ENABLE_LTO ${DEFAULT_ENABLE_LTO} CACHE BOOL "Use Link Time Optimization")
|
||||||
|
|
||||||
|
set(BUILD_WITH_TRACY FALSE CACHE BOOL
|
||||||
|
"Fetch and build with the Tracy profiler client")
|
||||||
|
set(FETCH_TRACY_GIT_TAG "master" CACHE STRING
|
||||||
|
"Git tag for fetching Tracy client. Match with your server (gui) version")
|
||||||
|
|
||||||
set(DEFAULT_RUN_IN_PLACE FALSE)
|
set(DEFAULT_RUN_IN_PLACE FALSE)
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(DEFAULT_RUN_IN_PLACE TRUE)
|
set(DEFAULT_RUN_IN_PLACE TRUE)
|
||||||
|
@ -156,7 +161,7 @@ elseif(UNIX) # Linux, BSD etc
|
||||||
set(EXAMPLE_CONF_DIR ".")
|
set(EXAMPLE_CONF_DIR ".")
|
||||||
set(MANDIR "unix/man")
|
set(MANDIR "unix/man")
|
||||||
set(XDG_APPS_DIR "unix/applications")
|
set(XDG_APPS_DIR "unix/applications")
|
||||||
set(APPDATADIR "unix/metainfo")
|
set(METAINFODIR "unix/metainfo")
|
||||||
set(ICONDIR "unix/icons")
|
set(ICONDIR "unix/icons")
|
||||||
set(LOCALEDIR "locale")
|
set(LOCALEDIR "locale")
|
||||||
else()
|
else()
|
||||||
|
@ -167,7 +172,7 @@ elseif(UNIX) # Linux, BSD etc
|
||||||
set(MANDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_MANDIR}")
|
set(MANDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_MANDIR}")
|
||||||
set(EXAMPLE_CONF_DIR ${DOCDIR})
|
set(EXAMPLE_CONF_DIR ${DOCDIR})
|
||||||
set(XDG_APPS_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/applications")
|
set(XDG_APPS_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/applications")
|
||||||
set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/metainfo")
|
set(METAINFODIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/metainfo")
|
||||||
set(ICONDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/icons")
|
set(ICONDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/icons")
|
||||||
set(LOCALEDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LOCALEDIR}")
|
set(LOCALEDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LOCALEDIR}")
|
||||||
endif()
|
endif()
|
||||||
|
@ -258,7 +263,7 @@ install(FILES "minetest.conf.example" DESTINATION "${EXAMPLE_CONF_DIR}")
|
||||||
if(UNIX AND NOT APPLE)
|
if(UNIX AND NOT APPLE)
|
||||||
install(FILES "doc/minetest.6" "doc/minetestserver.6" DESTINATION "${MANDIR}/man6")
|
install(FILES "doc/minetest.6" "doc/minetestserver.6" DESTINATION "${MANDIR}/man6")
|
||||||
install(FILES "misc/net.minetest.minetest.desktop" DESTINATION "${XDG_APPS_DIR}")
|
install(FILES "misc/net.minetest.minetest.desktop" DESTINATION "${XDG_APPS_DIR}")
|
||||||
install(FILES "misc/net.minetest.minetest.appdata.xml" DESTINATION "${APPDATADIR}")
|
install(FILES "misc/net.minetest.minetest.metainfo.xml" DESTINATION "${METAINFODIR}")
|
||||||
install(FILES "misc/minetest.svg" DESTINATION "${ICONDIR}/hicolor/scalable/apps")
|
install(FILES "misc/minetest.svg" DESTINATION "${ICONDIR}/hicolor/scalable/apps")
|
||||||
install(FILES "misc/minetest-xorg-icon-128.png"
|
install(FILES "misc/minetest-xorg-icon-128.png"
|
||||||
DESTINATION "${ICONDIR}/hicolor/128x128/apps"
|
DESTINATION "${ICONDIR}/hicolor/128x128/apps"
|
||||||
|
@ -283,6 +288,8 @@ if(BUILD_UNITTESTS OR BUILD_BENCHMARKS)
|
||||||
add_subdirectory(lib/catch2)
|
add_subdirectory(lib/catch2)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(lib/tiniergltf)
|
||||||
|
|
||||||
# Subdirectories
|
# Subdirectories
|
||||||
# Be sure to add all relevant definitions above this
|
# Be sure to add all relevant definitions above this
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
@ -368,3 +375,19 @@ if(BUILD_DOCUMENTATION)
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Fetch Tracy
|
||||||
|
if(BUILD_WITH_TRACY)
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
message(STATUS "Fetching Tracy (${FETCH_TRACY_GIT_TAG})...")
|
||||||
|
FetchContent_Declare(
|
||||||
|
tracy
|
||||||
|
GIT_REPOSITORY https://github.com/wolfpld/tracy.git
|
||||||
|
GIT_TAG ${FETCH_TRACY_GIT_TAG}
|
||||||
|
GIT_SHALLOW TRUE
|
||||||
|
GIT_PROGRESS TRUE
|
||||||
|
)
|
||||||
|
FetchContent_MakeAvailable(tracy)
|
||||||
|
message(STATUS "Fetching Tracy - done")
|
||||||
|
endif()
|
||||||
|
|
|
@ -119,6 +119,7 @@ Command-line options
|
||||||
Compiling
|
Compiling
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
- [Compiling - common information](doc/compiling/README.md)
|
||||||
- [Compiling on GNU/Linux](doc/compiling/linux.md)
|
- [Compiling on GNU/Linux](doc/compiling/linux.md)
|
||||||
- [Compiling on Windows](doc/compiling/windows.md)
|
- [Compiling on Windows](doc/compiling/windows.md)
|
||||||
- [Compiling on MacOS](doc/compiling/macos.md)
|
- [Compiling on MacOS](doc/compiling/macos.md)
|
||||||
|
|
|
@ -1,15 +1,18 @@
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 33
|
|
||||||
buildToolsVersion '33.0.2'
|
|
||||||
ndkVersion "$ndk_version"
|
ndkVersion "$ndk_version"
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId 'net.minetest.minetest'
|
applicationId 'net.minetest.minetest'
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 33
|
compileSdk 34
|
||||||
|
targetSdkVersion 34
|
||||||
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
|
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
|
||||||
versionCode project.versionCode
|
versionCode versionMajor * 1000000 + versionMinor * 10000 + versionPatch * 100 + versionBuild
|
||||||
|
}
|
||||||
|
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig true
|
||||||
}
|
}
|
||||||
|
|
||||||
// load properties
|
// load properties
|
||||||
|
@ -49,6 +52,7 @@ android {
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
namespace 'net.minetest.minetest'
|
||||||
}
|
}
|
||||||
|
|
||||||
task prepareAssets() {
|
task prepareAssets() {
|
||||||
|
@ -112,18 +116,6 @@ clean {
|
||||||
delete new File("src/main/assets", "Minetest.zip")
|
delete new File("src/main/assets", "Minetest.zip")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map for the version code that gives each ABI a value.
|
|
||||||
import com.android.build.OutputFile
|
|
||||||
|
|
||||||
def abiCodes = ['armeabi-v7a': 0, 'arm64-v8a': 1]
|
|
||||||
android.applicationVariants.all { variant ->
|
|
||||||
variant.outputs.each {
|
|
||||||
output ->
|
|
||||||
def abiName = output.getFilter(OutputFile.ABI)
|
|
||||||
output.versionCodeOverride = abiCodes.get(abiName, 0) + variant.versionCode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(':native')
|
implementation project(':native')
|
||||||
implementation 'androidx.appcompat:appcompat:1.6.1'
|
implementation 'androidx.appcompat:appcompat:1.6.1'
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="net.minetest.minetest"
|
android:installLocation="auto">
|
||||||
android:installLocation="auto">
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
|
@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
|
||||||
package net.minetest.minetest;
|
package net.minetest.minetest;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.app.NotificationChannel;
|
import android.app.NotificationChannel;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
|
@ -83,13 +84,18 @@ public class MainActivity extends AppCompatActivity {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@SuppressLint("UnspecifiedRegisterReceiverFlag")
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_main);
|
setContentView(R.layout.activity_main);
|
||||||
|
|
||||||
IntentFilter filter = new IntentFilter(ACTION_UPDATE);
|
IntentFilter filter = new IntentFilter(ACTION_UPDATE);
|
||||||
registerReceiver(myReceiver, filter);
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
|
registerReceiver(myReceiver, filter, RECEIVER_NOT_EXPORTED);
|
||||||
|
} else {
|
||||||
|
registerReceiver(myReceiver, filter);
|
||||||
|
}
|
||||||
|
|
||||||
mProgressBar = findViewById(R.id.progressBar);
|
mProgressBar = findViewById(R.id.progressBar);
|
||||||
mTextView = findViewById(R.id.textView);
|
mTextView = findViewById(R.id.textView);
|
||||||
|
|
|
@ -186,6 +186,7 @@ public class UnzipService extends IntentService {
|
||||||
|
|
||||||
private void publishProgress(@Nullable Notification.Builder notificationBuilder, @StringRes int message, int progress) {
|
private void publishProgress(@Nullable Notification.Builder notificationBuilder, @StringRes int message, int progress) {
|
||||||
Intent intentUpdate = new Intent(ACTION_UPDATE);
|
Intent intentUpdate = new Intent(ACTION_UPDATE);
|
||||||
|
intentUpdate.setPackage(getPackageName());
|
||||||
intentUpdate.putExtra(ACTION_PROGRESS, progress);
|
intentUpdate.putExtra(ACTION_PROGRESS, progress);
|
||||||
intentUpdate.putExtra(ACTION_PROGRESS_MESSAGE, message);
|
intentUpdate.putExtra(ACTION_PROGRESS_MESSAGE, message);
|
||||||
if (!isSuccess)
|
if (!isSuccess)
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
project.ext.set("versionMajor", 5) // Version Major
|
project.ext.set("versionMajor", 5) // Version Major
|
||||||
project.ext.set("versionMinor", 9) // Version Minor
|
project.ext.set("versionMinor", 10) // Version Minor
|
||||||
project.ext.set("versionPatch", 0) // Version Patch
|
project.ext.set("versionPatch", 0) // Version Patch
|
||||||
// ^ keep in sync with cmake
|
// ^ keep in sync with cmake
|
||||||
project.ext.set("versionCode", 46) // Android Version Code
|
|
||||||
// NOTE: +2 after each release!
|
project.ext.set("versionBuild", 0) // Version Build
|
||||||
// +1 for ARM and +1 for ARM64 APK's, because
|
// ^ fourth version number to allow releasing Android-only fixes and beta versions
|
||||||
// each APK must have a larger `versionCode` than the previous
|
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
ext.ndk_version = '26.2.11394342'
|
ext.ndk_version = '26.2.11394342'
|
||||||
|
@ -16,7 +15,7 @@ buildscript {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:7.4.1'
|
classpath 'com.android.tools.build:gradle:8.5.1'
|
||||||
classpath 'de.undercouch:gradle-download-task:4.1.1'
|
classpath 'de.undercouch:gradle-download-task:4.1.1'
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
|
|
@ -9,3 +9,5 @@ org.gradle.parallel.threads=8
|
||||||
org.gradle.configureondemand=true
|
org.gradle.configureondemand=true
|
||||||
android.enableJetifier=false
|
android.enableJetifier=false
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
|
android.nonTransitiveRClass=false
|
||||||
|
android.nonFinalResIds=false
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|
|
@ -1,194 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="512"
|
|
||||||
height="512"
|
|
||||||
viewBox="0 0 135.46666 135.46667"
|
|
||||||
version="1.1"
|
|
||||||
id="svg8"
|
|
||||||
inkscape:version="0.92.1 r15371"
|
|
||||||
sodipodi:docname="gear_icon.svg"
|
|
||||||
inkscape:export-filename="/home/stu/Desktop/icons/png/gear_icon.png"
|
|
||||||
inkscape:export-xdpi="24"
|
|
||||||
inkscape:export-ydpi="24">
|
|
||||||
<defs
|
|
||||||
id="defs2">
|
|
||||||
<marker
|
|
||||||
style="overflow:visible"
|
|
||||||
refY="0.0"
|
|
||||||
refX="0.0"
|
|
||||||
orient="auto"
|
|
||||||
id="DistanceX">
|
|
||||||
<path
|
|
||||||
id="path4687"
|
|
||||||
style="stroke:#000000; stroke-width:0.5"
|
|
||||||
d="M 3,-3 L -3,3 M 0,-5 L 0,5" />
|
|
||||||
</marker>
|
|
||||||
<pattern
|
|
||||||
y="0"
|
|
||||||
x="0"
|
|
||||||
width="8"
|
|
||||||
patternUnits="userSpaceOnUse"
|
|
||||||
id="Hatch"
|
|
||||||
height="8">
|
|
||||||
<path
|
|
||||||
id="path4690"
|
|
||||||
stroke-width="0.25"
|
|
||||||
stroke="#000000"
|
|
||||||
linecap="square"
|
|
||||||
d="M8 4 l-4,4" />
|
|
||||||
<path
|
|
||||||
id="path4692"
|
|
||||||
stroke-width="0.25"
|
|
||||||
stroke="#000000"
|
|
||||||
linecap="square"
|
|
||||||
d="M6 2 l-4,4" />
|
|
||||||
<path
|
|
||||||
id="path4694"
|
|
||||||
stroke-width="0.25"
|
|
||||||
stroke="#000000"
|
|
||||||
linecap="square"
|
|
||||||
d="M4 0 l-4,4" />
|
|
||||||
</pattern>
|
|
||||||
<marker
|
|
||||||
style="overflow:visible"
|
|
||||||
refY="0.0"
|
|
||||||
refX="0.0"
|
|
||||||
orient="auto"
|
|
||||||
id="DistanceX-3">
|
|
||||||
<path
|
|
||||||
id="path4756"
|
|
||||||
style="stroke:#000000; stroke-width:0.5"
|
|
||||||
d="M 3,-3 L -3,3 M 0,-5 L 0,5" />
|
|
||||||
</marker>
|
|
||||||
<pattern
|
|
||||||
y="0"
|
|
||||||
x="0"
|
|
||||||
width="8"
|
|
||||||
patternUnits="userSpaceOnUse"
|
|
||||||
id="Hatch-6"
|
|
||||||
height="8">
|
|
||||||
<path
|
|
||||||
id="path4759"
|
|
||||||
stroke-width="0.25"
|
|
||||||
stroke="#000000"
|
|
||||||
linecap="square"
|
|
||||||
d="M8 4 l-4,4" />
|
|
||||||
<path
|
|
||||||
id="path4761"
|
|
||||||
stroke-width="0.25"
|
|
||||||
stroke="#000000"
|
|
||||||
linecap="square"
|
|
||||||
d="M6 2 l-4,4" />
|
|
||||||
<path
|
|
||||||
id="path4763"
|
|
||||||
stroke-width="0.25"
|
|
||||||
stroke="#000000"
|
|
||||||
linecap="square"
|
|
||||||
d="M4 0 l-4,4" />
|
|
||||||
</pattern>
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#404040"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="0.5"
|
|
||||||
inkscape:cx="-308.644"
|
|
||||||
inkscape:cy="171.10144"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="true"
|
|
||||||
units="px"
|
|
||||||
inkscape:window-width="1920"
|
|
||||||
inkscape:window-height="1023"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="34"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:pagecheckerboard="false"
|
|
||||||
inkscape:snap-page="true"
|
|
||||||
inkscape:snap-grids="true"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
inkscape:snap-bbox-midpoints="false"
|
|
||||||
inkscape:snap-object-midpoints="true"
|
|
||||||
inkscape:snap-to-guides="false"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:snap-smooth-nodes="true"
|
|
||||||
inkscape:object-nodes="false">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid16"
|
|
||||||
spacingx="2.1166666"
|
|
||||||
spacingy="2.1166666"
|
|
||||||
empspacing="2"
|
|
||||||
color="#40ff40"
|
|
||||||
opacity="0.1254902"
|
|
||||||
empcolor="#40ff40"
|
|
||||||
empopacity="0.25098039" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata5">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
<cc:license
|
|
||||||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
|
||||||
</cc:Work>
|
|
||||||
<cc:License
|
|
||||||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
|
|
||||||
<cc:permits
|
|
||||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
|
||||||
<cc:permits
|
|
||||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
|
||||||
<cc:requires
|
|
||||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
|
||||||
<cc:requires
|
|
||||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
|
||||||
<cc:permits
|
|
||||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
|
||||||
<cc:requires
|
|
||||||
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
|
||||||
</cc:License>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(0,-161.53332)">
|
|
||||||
<g
|
|
||||||
id="g4792"
|
|
||||||
transform="matrix(0.68725287,0,0,0.65623884,67.477909,-509.24679)"
|
|
||||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.74041259;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
|
|
||||||
<g
|
|
||||||
id="g4772"
|
|
||||||
inkscape:label="OpenJsCad"
|
|
||||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.74041259;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
|
|
||||||
<path
|
|
||||||
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="m 256,80.943359 -8.28125,0.72461 -3.63477,5.410156 -5.61328,12.685547 -2.28906,9.259768 -0.35156,5.1875 0.0937,0.86133 0.70703,2.44726 0.60547,9.80664 -2.66602,5.47461 -21.5957,5.78711 -5.04492,-3.40625 -4.37696,-8.79687 -0.61132,-2.47071 -0.35157,-0.79297 -2.89648,-4.31836 -6.60938,-6.87304 -11.20507,-8.17969 -5.84961,-2.86719 -7.53516,3.51367 -6.80859,4.76954 -0.44336,6.50195 1.48047,13.79297 2.64453,9.16406 2.28906,4.66992 0.51172,0.69922 1.83398,1.76563 5.42774,8.18945 0.42773,6.07422 -15.81054,15.81445 -6.07032,-0.42773 -8.18945,-5.42969 -1.76367,-1.83399 -0.69922,-0.51171 -4.66992,-2.28907 -9.15821,-2.64843 -13.79297,-1.47852 -6.5,0.44141 -4.76757,6.8125 -3.51367,7.53515 2.86914,5.85157 8.17382,11.20703 6.87305,6.61132 4.31641,2.90039 0.79297,0.34961 2.4707,0.61133 8.79492,4.37696 3.4043,5.04687 -5.78516,21.60156 -5.47265,2.66602 -9.80469,-0.60547 -2.44727,-0.70703 -0.85937,-0.0918 -5.1875,0.35156 -9.257816,2.28907 -12.68164,5.61523 -5.408203,3.63281 -0.72461,8.28516 0.72461,8.28516 5.408203,3.63281 12.68164,5.61523 9.257816,2.28907 5.1875,0.35156 0.85937,-0.0918 2.44727,-0.70703 9.80469,-0.60547 5.47265,2.66602 5.78516,21.60156 -3.4043,5.04687 -8.79492,4.37696 -2.4707,0.61133 -0.79297,0.34961 -4.31641,2.90039 -6.87305,6.61132 -8.17382,11.20703 -2.86914,5.85157 3.51367,7.53515 4.76757,6.8125 6.5,0.44141 13.79297,-1.47852 9.15821,-2.64843 4.66992,-2.28907 0.69922,-0.50976 1.76367,-1.83594 8.18945,-5.42969 6.07032,-0.42773 15.81054,15.81445 -0.42773,6.07422 -5.42774,8.18945 -1.83398,1.76563 -0.51172,0.69922 -2.28906,4.66992 -2.64453,9.16406 -1.48047,13.79297 0.44336,6.50195 6.80859,4.76758 7.53516,3.51758 5.84961,-2.86914 11.20507,-8.17969 6.60938,-6.87304 2.89648,-4.31836 0.35157,-0.79297 0.61132,-2.47071 4.37696,-8.79687 5.04492,-3.40625 21.5957,5.78711 2.66602,5.47461 -0.60547,9.80664 -0.70703,2.44726 -0.0937,0.85938 0.35156,5.18945 2.28906,9.25977 5.61328,12.68555 3.63477,5.41015 8.28125,0.72461 8.28125,-0.72461 3.63477,-5.41015 5.61328,-12.68555 2.28906,-9.25977 0.35156,-5.18945 -0.0937,-0.85938 -0.70703,-2.44726 -0.60547,-9.80664 2.66602,-5.47461 21.5957,-5.78711 5.04492,3.40625 4.37696,8.79687 0.61132,2.47071 0.35157,0.79297 2.89648,4.31836 6.60938,6.87304 11.20507,8.17969 5.84961,2.86914 7.53516,-3.51758 6.80859,-4.76758 0.44336,-6.50195 -1.48047,-13.79297 -2.64453,-9.16406 -2.28906,-4.66992 -0.51172,-0.69922 -1.83398,-1.76563 -5.42774,-8.18945 -0.42773,-6.07422 15.81054,-15.81445 6.07032,0.42773 8.18945,5.42969 1.76367,1.83594 0.69922,0.50976 4.66992,2.28907 9.15821,2.64843 13.79297,1.47852 6.5,-0.44141 v -0.002 l 4.76757,-6.81055 3.51367,-7.53711 -2.86914,-5.85156 -8.17382,-11.20508 -6.87305,-6.61328 -4.31641,-2.89843 -0.79297,-0.34961 -2.4707,-0.61133 -8.79492,-4.37891 -3.4043,-5.04492 5.78516,-21.60352 5.47265,-2.66797 9.80469,0.60938 2.44727,0.70703 0.85937,0.0918 5.1875,-0.35156 9.25782,-2.28907 12.68164,-5.61718 5.4082,-3.63282 0.72461,-8.28515 -0.72461,-8.28321 -5.4082,-3.63476 -12.68164,-5.61524 -9.25782,-2.28711 -5.1875,-0.35351 -0.85937,0.0937 -2.44727,0.70508 -9.80469,0.60937 -5.47265,-2.66797 -5.78516,-21.59961 3.4043,-5.04882 8.79492,-4.37696 2.4707,-0.61133 0.79297,-0.35156 4.31641,-2.89844 6.87305,-6.61132 8.17382,-11.20703 2.86914,-5.85157 -3.51367,-7.53711 -4.76757,-6.81054 -6.5,-0.44336 -13.79297,1.48047 -9.15821,2.64648 -4.66992,2.28906 -0.69922,0.51172 -1.76367,1.83594 -8.18945,5.42773 -6.07032,0.42774 -15.81054,-15.81446 0.42773,-6.07226 5.42774,-8.18945 1.83398,-1.76563 0.51172,-0.69922 2.28906,-4.67187 2.64453,-9.16016 1.48047,-13.79492 -0.44336,-6.50195 -6.80859,-4.76954 -7.53516,-3.51562 -5.84961,2.87109 -11.20507,8.17578 -6.60938,6.875 -2.89648,4.31836 -0.35157,0.79102 -0.61132,2.47266 -4.37696,8.79687 -5.04492,3.4082 -21.5957,-5.79101 -2.66602,-5.47266 0.60547,-9.80664 0.70703,-2.44726 0.0937,-0.85938 -0.35156,-5.19141 -2.28906,-9.259761 -5.61328,-12.683594 -3.63477,-5.412109 z m 0,97.111331 A 77.946197,77.946197 0 0 1 333.94531,256 77.946197,77.946197 0 0 1 256,333.94531 77.946197,77.946197 0 0 1 178.05469,256 77.946197,77.946197 0 0 1 256,178.05469 Z"
|
|
||||||
transform="matrix(0.38495268,0,0,0.40318156,-98.176247,1022.1341)"
|
|
||||||
id="path4768"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g4774"
|
|
||||||
inkscape:label="0"
|
|
||||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.74041259;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 9.7 KiB |
|
@ -2,23 +2,23 @@
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<svg
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
width="512"
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="256"
|
|
||||||
height="512"
|
height="512"
|
||||||
viewBox="0 0 67.73333 135.46667"
|
viewBox="0 0 135.46666 135.46667"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg8"
|
id="svg8"
|
||||||
inkscape:version="0.92.1 r15371"
|
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
|
||||||
sodipodi:docname="rare_controls.svg"
|
sodipodi:docname="overflow_btn.svg"
|
||||||
inkscape:export-filename="/home/stu/Desktop/icons/png/rare_controls.png"
|
inkscape:export-filename="../../textures/base/pack/overflow_btn.png"
|
||||||
inkscape:export-xdpi="24.000002"
|
inkscape:export-xdpi="24.000002"
|
||||||
inkscape:export-ydpi="24.000002">
|
inkscape:export-ydpi="24.000002"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||||
<defs
|
<defs
|
||||||
id="defs2">
|
id="defs2">
|
||||||
<filter
|
<filter
|
||||||
|
@ -397,22 +397,24 @@
|
||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0"
|
inkscape:pageopacity="0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="0.7"
|
inkscape:zoom="0.98994949"
|
||||||
inkscape:cx="-59.862018"
|
inkscape:cx="41.921331"
|
||||||
inkscape:cy="260.34663"
|
inkscape:cy="163.13964"
|
||||||
inkscape:document-units="mm"
|
inkscape:document-units="mm"
|
||||||
inkscape:current-layer="layer2"
|
inkscape:current-layer="layer2"
|
||||||
showgrid="true"
|
showgrid="true"
|
||||||
units="px"
|
units="px"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1920"
|
||||||
inkscape:window-height="1023"
|
inkscape:window-height="1011"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="34"
|
inkscape:window-y="32"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:pagecheckerboard="false"
|
inkscape:pagecheckerboard="false"
|
||||||
inkscape:snap-grids="true"
|
inkscape:snap-grids="true"
|
||||||
inkscape:snap-page="true"
|
inkscape:snap-page="true"
|
||||||
showguides="false">
|
showguides="false"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:deskcolor="#d1d1d1">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid16"
|
id="grid16"
|
||||||
|
@ -422,7 +424,11 @@
|
||||||
color="#40ff40"
|
color="#40ff40"
|
||||||
opacity="0.1254902"
|
opacity="0.1254902"
|
||||||
empcolor="#40ff40"
|
empcolor="#40ff40"
|
||||||
empopacity="0.25098039" />
|
empopacity="0.25098039"
|
||||||
|
originx="0"
|
||||||
|
originy="0"
|
||||||
|
units="px"
|
||||||
|
visible="true" />
|
||||||
</sodipodi:namedview>
|
</sodipodi:namedview>
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata5">
|
id="metadata5">
|
||||||
|
@ -432,7 +438,6 @@
|
||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title></dc:title>
|
|
||||||
<cc:license
|
<cc:license
|
||||||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
|
@ -496,26 +501,27 @@
|
||||||
x="264.65997"
|
x="264.65997"
|
||||||
y="124.10143"
|
y="124.10143"
|
||||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1" /></flowRegion><flowPara
|
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1" /></flowRegion><flowPara
|
||||||
id="flowPara4724" /></flowRoot> <rect
|
id="flowPara4724" /></flowRoot>
|
||||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="rect5231-9"
|
|
||||||
width="25.4"
|
|
||||||
height="25.400003"
|
|
||||||
x="21.166666"
|
|
||||||
y="101.6" />
|
|
||||||
<rect
|
<rect
|
||||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:5.38756;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
id="rect5231-9-7"
|
|
||||||
width="25.4"
|
|
||||||
height="25.400003"
|
|
||||||
x="21.166666"
|
|
||||||
y="55.033333" />
|
|
||||||
<rect
|
|
||||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="rect5231-9-5"
|
id="rect5231-9-5"
|
||||||
width="25.4"
|
width="96.212502"
|
||||||
height="25.400003"
|
height="0.61243516"
|
||||||
x="21.166664"
|
x="19.62678"
|
||||||
y="8.4666681" />
|
y="33.575779" />
|
||||||
|
<rect
|
||||||
|
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:5.38755;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="rect5231-9-5-7"
|
||||||
|
width="96.212448"
|
||||||
|
height="0.6124543"
|
||||||
|
x="19.627108"
|
||||||
|
y="67.442772" />
|
||||||
|
<rect
|
||||||
|
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:5.38755;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="rect5231-9-5-7-5"
|
||||||
|
width="96.212448"
|
||||||
|
height="0.6124543"
|
||||||
|
x="19.627108"
|
||||||
|
y="101.30978" />
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
@ -2,14 +2,13 @@ apply plugin: 'com.android.library'
|
||||||
apply plugin: 'de.undercouch.download'
|
apply plugin: 'de.undercouch.download'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 33
|
|
||||||
buildToolsVersion '33.0.2'
|
|
||||||
ndkVersion "$ndk_version"
|
ndkVersion "$ndk_version"
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 33
|
compileSdk 34
|
||||||
|
targetSdkVersion 34
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
arguments "-DANDROID_STL=c++_shared",
|
arguments "-DANDROID_STL=c++_shared",
|
||||||
"-DENABLE_CURL=1", "-DENABLE_SOUND=1",
|
"-DENABLE_CURL=1", "-DENABLE_SOUND=1",
|
||||||
"-DENABLE_GETTEXT=1",
|
"-DENABLE_GETTEXT=1",
|
||||||
|
@ -40,6 +39,7 @@ android {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
namespace 'net.minetest'
|
||||||
}
|
}
|
||||||
|
|
||||||
// get precompiled deps
|
// get precompiled deps
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<manifest package="net.minetest" />
|
<manifest />
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
-- CSM death formspec. Only used when clientside modding is enabled, otherwise
|
|
||||||
-- handled by the engine.
|
|
||||||
|
|
||||||
core.register_on_death(function()
|
|
||||||
local formspec = "size[11,5.5]bgcolor[#320000b4;true]" ..
|
|
||||||
"label[4.85,1.35;" .. fgettext("You died") ..
|
|
||||||
"]button_exit[4,3;3,0.5;btn_respawn;".. fgettext("Respawn") .."]"
|
|
||||||
core.show_formspec("bultin:death", formspec)
|
|
||||||
end)
|
|
||||||
|
|
||||||
core.register_on_formspec_input(function(formname, fields)
|
|
||||||
if formname == "bultin:death" then
|
|
||||||
core.send_respawn()
|
|
||||||
end
|
|
||||||
end)
|
|
|
@ -9,6 +9,5 @@ dofile(commonpath .. "mod_storage.lua")
|
||||||
dofile(commonpath .. "chatcommands.lua")
|
dofile(commonpath .. "chatcommands.lua")
|
||||||
dofile(commonpath .. "information_formspecs.lua")
|
dofile(commonpath .. "information_formspecs.lua")
|
||||||
dofile(clientpath .. "chatcommands.lua")
|
dofile(clientpath .. "chatcommands.lua")
|
||||||
dofile(clientpath .. "death_formspec.lua")
|
|
||||||
dofile(clientpath .. "misc.lua")
|
dofile(clientpath .. "misc.lua")
|
||||||
assert(loadfile(commonpath .. "item_s.lua"))({}) -- Just for push/read node functions
|
assert(loadfile(commonpath .. "item_s.lua"))({}) -- Just for push/read node functions
|
||||||
|
|
|
@ -69,7 +69,7 @@ local function build_chatcommands_formspec(name, sel, copy)
|
||||||
description = cmds[2].description
|
description = cmds[2].description
|
||||||
if copy then
|
if copy then
|
||||||
local msg = S("Command: @1 @2",
|
local msg = S("Command: @1 @2",
|
||||||
core.colorize("#0FF", "/" .. cmds[1]), cmds[2].params)
|
core.colorize("#0FF", (INIT == "client" and "." or "/") .. cmds[1]), cmds[2].params)
|
||||||
if INIT == "client" then
|
if INIT == "client" then
|
||||||
core.display_chat_message(msg)
|
core.display_chat_message(msg)
|
||||||
else
|
else
|
||||||
|
|
41
builtin/common/math.lua
Normal file
41
builtin/common/math.lua
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
--[[
|
||||||
|
Math utils.
|
||||||
|
--]]
|
||||||
|
|
||||||
|
function math.hypot(x, y)
|
||||||
|
return math.sqrt(x * x + y * y)
|
||||||
|
end
|
||||||
|
|
||||||
|
function math.sign(x, tolerance)
|
||||||
|
tolerance = tolerance or 0
|
||||||
|
if x > tolerance then
|
||||||
|
return 1
|
||||||
|
elseif x < -tolerance then
|
||||||
|
return -1
|
||||||
|
end
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
function math.factorial(x)
|
||||||
|
assert(x % 1 == 0 and x >= 0, "factorial expects a non-negative integer")
|
||||||
|
if x >= 171 then
|
||||||
|
-- 171! is greater than the biggest double, no need to calculate
|
||||||
|
return math.huge
|
||||||
|
end
|
||||||
|
local v = 1
|
||||||
|
for k = 2, x do
|
||||||
|
v = v * k
|
||||||
|
end
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
|
||||||
|
function math.round(x)
|
||||||
|
if x < 0 then
|
||||||
|
local int = math.ceil(x)
|
||||||
|
local frac = x - int
|
||||||
|
return int - ((frac <= -0.5) and 1 or 0)
|
||||||
|
end
|
||||||
|
local int = math.floor(x)
|
||||||
|
local frac = x - int
|
||||||
|
return int + ((frac >= 0.5) and 1 or 0)
|
||||||
|
end
|
|
@ -1,6 +1,6 @@
|
||||||
-- Registered metatables, used by the C++ packer
|
-- Registered metatables, used by the C++ packer
|
||||||
local known_metatables = {}
|
local known_metatables = {}
|
||||||
function core.register_async_metatable(name, mt)
|
function core.register_portable_metatable(name, mt)
|
||||||
assert(type(name) == "string", ("attempt to use %s value as metatable name"):format(type(name)))
|
assert(type(name) == "string", ("attempt to use %s value as metatable name"):format(type(name)))
|
||||||
assert(type(mt) == "table", ("attempt to register a %s value as metatable"):format(type(mt)))
|
assert(type(mt) == "table", ("attempt to register a %s value as metatable"):format(type(mt)))
|
||||||
assert(known_metatables[name] == nil or known_metatables[name] == mt,
|
assert(known_metatables[name] == nil or known_metatables[name] == mt,
|
||||||
|
@ -10,4 +10,10 @@ function core.register_async_metatable(name, mt)
|
||||||
end
|
end
|
||||||
core.known_metatables = known_metatables
|
core.known_metatables = known_metatables
|
||||||
|
|
||||||
core.register_async_metatable("__builtin:vector", vector.metatable)
|
function core.register_async_metatable(...)
|
||||||
|
core.log("deprecated", "minetest.register_async_metatable is deprecated. " ..
|
||||||
|
"Use minetest.register_portable_metatable instead.")
|
||||||
|
return core.register_portable_metatable(...)
|
||||||
|
end
|
||||||
|
|
||||||
|
core.register_portable_metatable("__builtin:vector", vector.metatable)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
-- Localize functions to avoid table lookups (better performance).
|
-- Localize functions to avoid table lookups (better performance).
|
||||||
local string_sub, string_find = string.sub, string.find
|
local string_sub, string_find = string.sub, string.find
|
||||||
|
local math = math
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
local function basic_dump(o)
|
local function basic_dump(o)
|
||||||
|
@ -205,49 +206,21 @@ function table.indexof(list, val)
|
||||||
return -1
|
return -1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
function table.keyof(tb, val)
|
||||||
|
for k, v in pairs(tb) do
|
||||||
|
if v == val then
|
||||||
|
return k
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
function string:trim()
|
function string:trim()
|
||||||
return self:match("^%s*(.-)%s*$")
|
return self:match("^%s*(.-)%s*$")
|
||||||
end
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
function math.hypot(x, y)
|
|
||||||
return math.sqrt(x * x + y * y)
|
|
||||||
end
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
function math.sign(x, tolerance)
|
|
||||||
tolerance = tolerance or 0
|
|
||||||
if x > tolerance then
|
|
||||||
return 1
|
|
||||||
elseif x < -tolerance then
|
|
||||||
return -1
|
|
||||||
end
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
function math.factorial(x)
|
|
||||||
assert(x % 1 == 0 and x >= 0, "factorial expects a non-negative integer")
|
|
||||||
if x >= 171 then
|
|
||||||
-- 171! is greater than the biggest double, no need to calculate
|
|
||||||
return math.huge
|
|
||||||
end
|
|
||||||
local v = 1
|
|
||||||
for k = 2, x do
|
|
||||||
v = v * k
|
|
||||||
end
|
|
||||||
return v
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
function math.round(x)
|
|
||||||
if x >= 0 then
|
|
||||||
return math.floor(x + 0.5)
|
|
||||||
end
|
|
||||||
return math.ceil(x - 0.5)
|
|
||||||
end
|
|
||||||
|
|
||||||
local formspec_escapes = {
|
local formspec_escapes = {
|
||||||
["\\"] = "\\\\",
|
["\\"] = "\\\\",
|
||||||
["["] = "\\[",
|
["["] = "\\[",
|
||||||
|
@ -689,6 +662,7 @@ function core.privs_to_string(privs, delim)
|
||||||
list[#list + 1] = priv
|
list[#list + 1] = priv
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
table.sort(list)
|
||||||
return table.concat(list, delim)
|
return table.concat(list, delim)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
_G.core = {}
|
_G.core = {}
|
||||||
_G.vector = {metatable = {}}
|
_G.vector = {metatable = {}}
|
||||||
|
|
||||||
|
dofile("builtin/common/math.lua")
|
||||||
dofile("builtin/common/vector.lua")
|
dofile("builtin/common/vector.lua")
|
||||||
dofile("builtin/common/misc_helpers.lua")
|
dofile("builtin/common/misc_helpers.lua")
|
||||||
|
|
||||||
|
|
16
builtin/common/tests/math_spec.lua
Normal file
16
builtin/common/tests/math_spec.lua
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
_G.core = {}
|
||||||
|
dofile("builtin/common/math.lua")
|
||||||
|
|
||||||
|
describe("math", function()
|
||||||
|
it("round()", function()
|
||||||
|
assert.equal(0, math.round(0))
|
||||||
|
assert.equal(10, math.round(10.3))
|
||||||
|
assert.equal(11, math.round(10.5))
|
||||||
|
assert.equal(11, math.round(10.7))
|
||||||
|
assert.equal(-10, math.round(-10.3))
|
||||||
|
assert.equal(-11, math.round(-10.5))
|
||||||
|
assert.equal(-11, math.round(-10.7))
|
||||||
|
assert.equal(0, math.round(0.49999999999999994))
|
||||||
|
assert.equal(0, math.round(-0.49999999999999994))
|
||||||
|
end)
|
||||||
|
end)
|
|
@ -1,4 +1,5 @@
|
||||||
_G.core = {}
|
_G.core = {}
|
||||||
|
dofile("builtin/common/math.lua")
|
||||||
dofile("builtin/common/vector.lua")
|
dofile("builtin/common/vector.lua")
|
||||||
dofile("builtin/common/misc_helpers.lua")
|
dofile("builtin/common/misc_helpers.lua")
|
||||||
|
|
||||||
|
@ -166,6 +167,16 @@ describe("table", function()
|
||||||
it("indexof()", function()
|
it("indexof()", function()
|
||||||
assert.equal(1, table.indexof({"foo", "bar"}, "foo"))
|
assert.equal(1, table.indexof({"foo", "bar"}, "foo"))
|
||||||
assert.equal(-1, table.indexof({"foo", "bar"}, "baz"))
|
assert.equal(-1, table.indexof({"foo", "bar"}, "baz"))
|
||||||
|
assert.equal(-1, table.indexof({[2] = "foo", [3] = "bar"}, "foo"))
|
||||||
|
assert.equal(-1, table.indexof({[1] = "foo", [3] = "bar"}, "bar"))
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("keyof()", function()
|
||||||
|
assert.equal("a", table.keyof({a = "foo", b = "bar"}, "foo"))
|
||||||
|
assert.equal(nil, table.keyof({a = "foo", b = "bar"}, "baz"))
|
||||||
|
assert.equal(1, table.keyof({"foo", "bar"}, "foo"))
|
||||||
|
assert.equal(2, table.keyof({[2] = "foo", [3] = "bar"}, "foo"))
|
||||||
|
assert.equal(3, table.keyof({[1] = "foo", [3] = "bar"}, "bar"))
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@ -176,3 +187,17 @@ describe("formspec_escape", function()
|
||||||
assert.equal("\\[Hello\\\\\\[", core.formspec_escape("[Hello\\["))
|
assert.equal("\\[Hello\\\\\\[", core.formspec_escape("[Hello\\["))
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
describe("math", function()
|
||||||
|
it("round()", function()
|
||||||
|
assert.equal(0, math.round(0))
|
||||||
|
assert.equal(10, math.round(10.3))
|
||||||
|
assert.equal(11, math.round(10.5))
|
||||||
|
assert.equal(11, math.round(10.7))
|
||||||
|
assert.equal(-10, math.round(-10.3))
|
||||||
|
assert.equal(-11, math.round(-10.5))
|
||||||
|
assert.equal(-11, math.round(-10.7))
|
||||||
|
assert.equal(0, math.round(0.49999999999999994))
|
||||||
|
assert.equal(0, math.round(-0.49999999999999994))
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
_G.vector = {}
|
_G.vector = {}
|
||||||
|
dofile("builtin/common/math.lua")
|
||||||
dofile("builtin/common/vector.lua")
|
dofile("builtin/common/vector.lua")
|
||||||
|
|
||||||
describe("vector", function()
|
describe("vector", function()
|
||||||
|
@ -113,12 +114,35 @@ describe("vector", function()
|
||||||
assert.equal(vector.new(0, 1, -1), a:round())
|
assert.equal(vector.new(0, 1, -1), a:round())
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it("ceil()", function()
|
||||||
|
local a = vector.new(0.1, 0.9, -0.5)
|
||||||
|
assert.equal(vector.new(1, 1, 0), vector.ceil(a))
|
||||||
|
assert.equal(vector.new(1, 1, 0), a:ceil())
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("sign()", function()
|
||||||
|
local a = vector.new(-120.3, 0, 231.5)
|
||||||
|
assert.equal(vector.new(-1, 0, 1), vector.sign(a))
|
||||||
|
assert.equal(vector.new(-1, 0, 1), a:sign())
|
||||||
|
assert.equal(vector.new(0, 0, 1), vector.sign(a, 200))
|
||||||
|
assert.equal(vector.new(0, 0, 1), a:sign(200))
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("abs()", function()
|
||||||
|
local a = vector.new(-123.456, 0, 13)
|
||||||
|
assert.equal(vector.new(123.456, 0, 13), vector.abs(a))
|
||||||
|
assert.equal(vector.new(123.456, 0, 13), a:abs())
|
||||||
|
end)
|
||||||
|
|
||||||
it("apply()", function()
|
it("apply()", function()
|
||||||
local i = 0
|
local i = 0
|
||||||
local f = function(x)
|
local f = function(x)
|
||||||
i = i + 1
|
i = i + 1
|
||||||
return x + i
|
return x + i
|
||||||
end
|
end
|
||||||
|
local f2 = function(x, opt1, opt2, opt3)
|
||||||
|
return x + opt1 + opt2 + opt3
|
||||||
|
end
|
||||||
local a = vector.new(0.1, 0.9, -0.5)
|
local a = vector.new(0.1, 0.9, -0.5)
|
||||||
assert.equal(vector.new(1, 1, 0), vector.apply(a, math.ceil))
|
assert.equal(vector.new(1, 1, 0), vector.apply(a, math.ceil))
|
||||||
assert.equal(vector.new(1, 1, 0), a:apply(math.ceil))
|
assert.equal(vector.new(1, 1, 0), a:apply(math.ceil))
|
||||||
|
@ -126,6 +150,9 @@ describe("vector", function()
|
||||||
assert.equal(vector.new(0.1, 0.9, 0.5), a:apply(math.abs))
|
assert.equal(vector.new(0.1, 0.9, 0.5), a:apply(math.abs))
|
||||||
assert.equal(vector.new(1.1, 2.9, 2.5), vector.apply(a, f))
|
assert.equal(vector.new(1.1, 2.9, 2.5), vector.apply(a, f))
|
||||||
assert.equal(vector.new(4.1, 5.9, 5.5), a:apply(f))
|
assert.equal(vector.new(4.1, 5.9, 5.5), a:apply(f))
|
||||||
|
local b = vector.new(1, 2, 3)
|
||||||
|
assert.equal(vector.new(4, 5, 6), vector.apply(b, f2, 1, 1, 1))
|
||||||
|
assert.equal(vector.new(4, 5, 6), b:apply(f2, 1, 1, 1))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("combine()", function()
|
it("combine()", function()
|
||||||
|
@ -469,4 +496,13 @@ describe("vector", function()
|
||||||
assert.True(vector.in_area(vector.new(-10, -10, -10), vector.new(-10, -10, -10), vector.new(10, 10, 10)))
|
assert.True(vector.in_area(vector.new(-10, -10, -10), vector.new(-10, -10, -10), vector.new(10, 10, 10)))
|
||||||
assert.False(vector.in_area(vector.new(-10, -10, -10), vector.new(10, 10, 10), vector.new(-11, -10, -10)))
|
assert.False(vector.in_area(vector.new(-10, -10, -10), vector.new(10, 10, 10), vector.new(-11, -10, -10)))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it("random_in_area()", function()
|
||||||
|
local min = vector.new(-100, -100, -100)
|
||||||
|
local max = vector.new(100, 100, 100)
|
||||||
|
for i = 1, 1000 do
|
||||||
|
local random = vector.random_in_area(min, max)
|
||||||
|
assert.True(vector.in_area(random, min, max))
|
||||||
|
end
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
|
@ -5,6 +5,7 @@ Note: The vector.*-functions must be able to accept old vectors that had no meta
|
||||||
|
|
||||||
-- localize functions
|
-- localize functions
|
||||||
local setmetatable = setmetatable
|
local setmetatable = setmetatable
|
||||||
|
local math = math
|
||||||
|
|
||||||
vector = {}
|
vector = {}
|
||||||
|
|
||||||
|
@ -97,18 +98,26 @@ function vector.floor(v)
|
||||||
end
|
end
|
||||||
|
|
||||||
function vector.round(v)
|
function vector.round(v)
|
||||||
return fast_new(
|
return vector.apply(v, math.round)
|
||||||
math.round(v.x),
|
|
||||||
math.round(v.y),
|
|
||||||
math.round(v.z)
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function vector.apply(v, func)
|
function vector.ceil(v)
|
||||||
|
return vector.apply(v, math.ceil)
|
||||||
|
end
|
||||||
|
|
||||||
|
function vector.sign(v, tolerance)
|
||||||
|
return vector.apply(v, math.sign, tolerance)
|
||||||
|
end
|
||||||
|
|
||||||
|
function vector.abs(v)
|
||||||
|
return vector.apply(v, math.abs)
|
||||||
|
end
|
||||||
|
|
||||||
|
function vector.apply(v, func, ...)
|
||||||
return fast_new(
|
return fast_new(
|
||||||
func(v.x),
|
func(v.x, ...),
|
||||||
func(v.y),
|
func(v.y, ...),
|
||||||
func(v.z)
|
func(v.z, ...)
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -375,6 +384,26 @@ function vector.in_area(pos, min, max)
|
||||||
(pos.z >= min.z) and (pos.z <= max.z)
|
(pos.z >= min.z) and (pos.z <= max.z)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function vector.random_direction()
|
||||||
|
-- Generate a random direction of unit length, via rejection sampling
|
||||||
|
local x, y, z, l2
|
||||||
|
repeat -- expected less than two attempts on average (volume sphere vs. cube)
|
||||||
|
x, y, z = math.random() * 2 - 1, math.random() * 2 - 1, math.random() * 2 - 1
|
||||||
|
l2 = x*x + y*y + z*z
|
||||||
|
until l2 <= 1 and l2 >= 1e-6
|
||||||
|
-- normalize
|
||||||
|
local l = math.sqrt(l2)
|
||||||
|
return fast_new(x/l, y/l, z/l)
|
||||||
|
end
|
||||||
|
|
||||||
|
function vector.random_in_area(min, max)
|
||||||
|
return fast_new(
|
||||||
|
math.random(min.x, max.x),
|
||||||
|
math.random(min.y, max.y),
|
||||||
|
math.random(min.z, max.z)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
if rawget(_G, "core") and core.set_read_vector and core.set_push_vector then
|
if rawget(_G, "core") and core.set_read_vector and core.set_push_vector then
|
||||||
local function read_vector(v)
|
local function read_vector(v)
|
||||||
return v.x, v.y, v.z
|
return v.x, v.y, v.z
|
||||||
|
|
|
@ -23,6 +23,8 @@ core.add_node = core.set_node
|
||||||
-- we don't deal with metadata currently
|
-- we don't deal with metadata currently
|
||||||
core.swap_node = core.set_node
|
core.swap_node = core.set_node
|
||||||
|
|
||||||
|
core.bulk_swap_node = core.bulk_set_node
|
||||||
|
|
||||||
function core.remove_node(pos)
|
function core.remove_node(pos)
|
||||||
return core.vmanip:set_node_at(pos, {name="air"})
|
return core.vmanip:set_node_at(pos, {name="air"})
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
local BASE_SPACING = 0.1
|
local BASE_SPACING = 0.1
|
||||||
local function get_scroll_btn_width()
|
local function get_scroll_btn_width()
|
||||||
return core.settings:get_bool("enable_touch") and 0.8 or 0.5
|
return core.settings:get_bool("touch_gui") and 0.8 or 0.5
|
||||||
end
|
end
|
||||||
|
|
||||||
local function buttonbar_formspec(self)
|
local function buttonbar_formspec(self)
|
||||||
|
@ -28,10 +28,8 @@ local function buttonbar_formspec(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
local formspec = {
|
local formspec = {
|
||||||
"style_type[box;noclip=true]",
|
|
||||||
string.format("box[%f,%f;%f,%f;%s]", self.pos.x, self.pos.y, self.size.x,
|
string.format("box[%f,%f;%f,%f;%s]", self.pos.x, self.pos.y, self.size.x,
|
||||||
self.size.y, self.bgcolor),
|
self.size.y, self.bgcolor),
|
||||||
"style_type[box;noclip=false]",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
local btn_size = self.size.y - 2*BASE_SPACING
|
local btn_size = self.size.y - 2*BASE_SPACING
|
||||||
|
@ -71,7 +69,7 @@ local function buttonbar_formspec(self)
|
||||||
y = self.pos.y + BASE_SPACING,
|
y = self.pos.y + BASE_SPACING,
|
||||||
}
|
}
|
||||||
|
|
||||||
table.insert(formspec, string.format("image_button[%f,%f;%f,%f;%s;%s;%s;true;false]tooltip[%s;%s]",
|
table.insert(formspec, string.format("image_button[%f,%f;%f,%f;%s;%s;%s;false;false]tooltip[%s;%s]",
|
||||||
btn_pos.x, btn_pos.y, btn_size, btn_size, btn.image, btn.name,
|
btn_pos.x, btn_pos.y, btn_size, btn_size, btn.image, btn.name,
|
||||||
btn.caption, btn.name, btn.tooltip))
|
btn.caption, btn.name, btn.tooltip))
|
||||||
end
|
end
|
||||||
|
@ -86,9 +84,6 @@ local function buttonbar_formspec(self)
|
||||||
y = self.pos.y + BASE_SPACING,
|
y = self.pos.y + BASE_SPACING,
|
||||||
}
|
}
|
||||||
|
|
||||||
table.insert(formspec, string.format("style[%s,%s;noclip=true]",
|
|
||||||
self.btn_prev_name, self.btn_next_name))
|
|
||||||
|
|
||||||
table.insert(formspec, string.format("button[%f,%f;%f,%f;%s;<]",
|
table.insert(formspec, string.format("button[%f,%f;%f,%f;%s;<]",
|
||||||
btn_prev_pos.x, btn_prev_pos.y, get_scroll_btn_width(), btn_size,
|
btn_prev_pos.x, btn_prev_pos.y, get_scroll_btn_width(), btn_size,
|
||||||
self.btn_prev_name))
|
self.btn_prev_name))
|
||||||
|
@ -102,14 +97,24 @@ local function buttonbar_formspec(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function buttonbar_buttonhandler(self, fields)
|
local function buttonbar_buttonhandler(self, fields)
|
||||||
if fields[self.btn_prev_name] and self.cur_page > 1 then
|
if fields[self.btn_prev_name] then
|
||||||
self.cur_page = self.cur_page - 1
|
if self.cur_page > 1 then
|
||||||
return true
|
self.cur_page = self.cur_page - 1
|
||||||
|
return true
|
||||||
|
elseif self.cur_page == 1 then
|
||||||
|
self.cur_page = self.num_pages
|
||||||
|
return true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if fields[self.btn_next_name] and self.cur_page < self.num_pages then
|
if fields[self.btn_next_name] then
|
||||||
self.cur_page = self.cur_page + 1
|
if self.cur_page < self.num_pages then
|
||||||
return true
|
self.cur_page = self.cur_page + 1
|
||||||
|
return true
|
||||||
|
elseif self.cur_page == self.num_pages then
|
||||||
|
self.cur_page = 1
|
||||||
|
return true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for _, btn in ipairs(self.buttons) do
|
for _, btn in ipairs(self.buttons) do
|
||||||
|
|
|
@ -66,11 +66,22 @@ local function get_formspec(self)
|
||||||
|
|
||||||
local content, prepend = tab.get_formspec(self, tab.name, tab.tabdata, tab.tabsize)
|
local content, prepend = tab.get_formspec(self, tab.name, tab.tabdata, tab.tabsize)
|
||||||
|
|
||||||
local tsize = tab.tabsize or { width = self.width, height = self.height }
|
local ENABLE_TOUCH = core.settings:get_bool("enable_touch")
|
||||||
|
|
||||||
|
local orig_tsize = tab.tabsize or { width = self.width, height = self.height }
|
||||||
|
local tsize = { width = orig_tsize.width, height = orig_tsize.height }
|
||||||
|
tsize.height = tsize.height
|
||||||
|
+ TABHEADER_H -- tabheader included in formspec size
|
||||||
|
+ (ENABLE_TOUCH and GAMEBAR_OFFSET_TOUCH or GAMEBAR_OFFSET_DESKTOP)
|
||||||
|
+ GAMEBAR_H -- gamebar included in formspec size
|
||||||
|
|
||||||
if self.parent == nil and not prepend then
|
if self.parent == nil and not prepend then
|
||||||
prepend = string.format("size[%f,%f,%s]", tsize.width, tsize.height,
|
prepend = string.format("size[%f,%f,%s]", tsize.width, tsize.height,
|
||||||
dump(self.fixed_size))
|
dump(self.fixed_size))
|
||||||
|
|
||||||
|
local anchor_pos = TABHEADER_H + orig_tsize.height / 2
|
||||||
|
prepend = prepend .. ("anchor[0.5,%f]"):format(anchor_pos / tsize.height)
|
||||||
|
|
||||||
if tab.formspec_version then
|
if tab.formspec_version then
|
||||||
prepend = ("formspec_version[%d]"):format(tab.formspec_version) .. prepend
|
prepend = ("formspec_version[%d]"):format(tab.formspec_version) .. prepend
|
||||||
end
|
end
|
||||||
|
@ -78,12 +89,15 @@ local function get_formspec(self)
|
||||||
|
|
||||||
local end_button_size = 0.75
|
local end_button_size = 0.75
|
||||||
|
|
||||||
local tab_header_size = { width = tsize.width, height = 0.85 }
|
local tab_header_size = { width = tsize.width, height = TABHEADER_H }
|
||||||
if self.end_button then
|
if self.end_button then
|
||||||
tab_header_size.width = tab_header_size.width - end_button_size - 0.1
|
tab_header_size.width = tab_header_size.width - end_button_size - 0.1
|
||||||
end
|
end
|
||||||
|
|
||||||
local formspec = (prepend or "") .. self:tab_header(tab_header_size) .. content
|
local formspec = (prepend or "")
|
||||||
|
formspec = formspec .. ("bgcolor[;neither]container[0,%f]box[0,0;%f,%f;#0000008C]"):format(
|
||||||
|
TABHEADER_H, orig_tsize.width, orig_tsize.height)
|
||||||
|
formspec = formspec .. self:tab_header(tab_header_size) .. content
|
||||||
|
|
||||||
if self.end_button then
|
if self.end_button then
|
||||||
formspec = formspec ..
|
formspec = formspec ..
|
||||||
|
@ -98,6 +112,8 @@ local function get_formspec(self)
|
||||||
self.end_button.name)
|
self.end_button.name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
formspec = formspec .. "container_end[]"
|
||||||
|
|
||||||
return formspec
|
return formspec
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -221,6 +221,7 @@ core.register_chatcommand("haspriv", {
|
||||||
return true, S("No online player has the \"@1\" privilege.",
|
return true, S("No online player has the \"@1\" privilege.",
|
||||||
param)
|
param)
|
||||||
else
|
else
|
||||||
|
table.sort(players_with_priv)
|
||||||
return true, S("Players online with the \"@1\" privilege: @2",
|
return true, S("Players online with the \"@1\" privilege: @2",
|
||||||
param,
|
param,
|
||||||
table.concat(players_with_priv, ", "))
|
table.concat(players_with_priv, ", "))
|
||||||
|
|
31
builtin/game/death_screen.lua
Normal file
31
builtin/game/death_screen.lua
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
local F = core.formspec_escape
|
||||||
|
local S = core.get_translator("__builtin")
|
||||||
|
|
||||||
|
function core.show_death_screen(player, _reason)
|
||||||
|
local fs = {
|
||||||
|
"formspec_version[1]",
|
||||||
|
"size[11,5.5,true]",
|
||||||
|
"bgcolor[#320000b4;true]",
|
||||||
|
"label[4.85,1.35;", F(S("You died")), "]",
|
||||||
|
"button_exit[4,3;3,0.5;btn_respawn;", F(S("Respawn")), "]",
|
||||||
|
}
|
||||||
|
core.show_formspec(player:get_player_name(), "__builtin:death", table.concat(fs, ""))
|
||||||
|
end
|
||||||
|
|
||||||
|
core.register_on_dieplayer(function(player, reason)
|
||||||
|
core.show_death_screen(player, reason)
|
||||||
|
end)
|
||||||
|
|
||||||
|
core.register_on_joinplayer(function(player)
|
||||||
|
if player:get_hp() == 0 then
|
||||||
|
core.show_death_screen(player, nil)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
core.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
|
if formname == "__builtin:death" and fields.quit and player:get_hp() == 0 then
|
||||||
|
player:respawn()
|
||||||
|
core.log("action", player:get_player_name() .. " respawns at " ..
|
||||||
|
player:get_pos():to_string())
|
||||||
|
end
|
||||||
|
end)
|
|
@ -42,6 +42,8 @@ core.features = {
|
||||||
node_interaction_actor = true,
|
node_interaction_actor = true,
|
||||||
moveresult_new_pos = true,
|
moveresult_new_pos = true,
|
||||||
override_item_remove_fields = true,
|
override_item_remove_fields = true,
|
||||||
|
hotbar_hud_element = true,
|
||||||
|
bulk_lbms = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
function core.has_feature(arg)
|
function core.has_feature(arg)
|
||||||
|
|
|
@ -251,11 +251,31 @@ register_builtin_hud_element("minimap", {
|
||||||
position = {x = 1, y = 0},
|
position = {x = 1, y = 0},
|
||||||
alignment = {x = -1, y = 1},
|
alignment = {x = -1, y = 1},
|
||||||
offset = {x = -10, y = 10},
|
offset = {x = -10, y = 10},
|
||||||
size = {x = 256, y = 256},
|
size = {x = 0, y = -25},
|
||||||
},
|
},
|
||||||
show_elem = function(player, flags)
|
show_elem = function(player, flags)
|
||||||
|
local proto_ver = core.get_player_information(player:get_player_name()).protocol_version
|
||||||
-- Don't add a minimap for clients which already have it hardcoded in C++.
|
-- Don't add a minimap for clients which already have it hardcoded in C++.
|
||||||
return flags.minimap and
|
return flags.minimap and proto_ver >= 44
|
||||||
core.get_player_information(player:get_player_name()).protocol_version >= 44
|
end,
|
||||||
|
update_def = function(player, elem_def)
|
||||||
|
local proto_ver = core.get_player_information(player:get_player_name()).protocol_version
|
||||||
|
-- Only use percentage when the client supports it.
|
||||||
|
elem_def.size = proto_ver >= 45 and {x = 0, y = -25} or {x = 256, y = 256}
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
--- Hotbar
|
||||||
|
|
||||||
|
register_builtin_hud_element("hotbar", {
|
||||||
|
elem_def = {
|
||||||
|
type = "hotbar",
|
||||||
|
position = {x = 0.5, y = 1},
|
||||||
|
direction = 0,
|
||||||
|
alignment = {x = 0, y = -1},
|
||||||
|
offset = {x = 0, y = -4}, -- Extra padding below.
|
||||||
|
},
|
||||||
|
show_elem = function(player, flags)
|
||||||
|
return flags.hotbar
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
|
@ -38,6 +38,7 @@ dofile(gamepath .. "forceloading.lua")
|
||||||
dofile(gamepath .. "hud.lua")
|
dofile(gamepath .. "hud.lua")
|
||||||
dofile(gamepath .. "knockback.lua")
|
dofile(gamepath .. "knockback.lua")
|
||||||
dofile(gamepath .. "async.lua")
|
dofile(gamepath .. "async.lua")
|
||||||
|
dofile(gamepath .. "death_screen.lua")
|
||||||
|
|
||||||
core.after(0, builtin_shared.cache_content_ids)
|
core.after(0, builtin_shared.cache_content_ids)
|
||||||
|
|
||||||
|
|
|
@ -6,14 +6,14 @@ local S = core.get_translator("__builtin")
|
||||||
-- Misc. API functions
|
-- Misc. API functions
|
||||||
--
|
--
|
||||||
|
|
||||||
-- @spec core.kick_player(String, String) :: Boolean
|
-- @spec core.kick_player(String, String, Boolean) :: Boolean
|
||||||
function core.kick_player(player_name, reason)
|
function core.kick_player(player_name, reason, reconnect)
|
||||||
if type(reason) == "string" then
|
if type(reason) == "string" then
|
||||||
reason = "Kicked: " .. reason
|
reason = "Kicked: " .. reason
|
||||||
else
|
else
|
||||||
reason = "Kicked."
|
reason = "Kicked."
|
||||||
end
|
end
|
||||||
return core.disconnect_player(player_name, reason)
|
return core.disconnect_player(player_name, reason, reconnect)
|
||||||
end
|
end
|
||||||
|
|
||||||
function core.check_player_privs(name, ...)
|
function core.check_player_privs(name, ...)
|
||||||
|
@ -272,3 +272,54 @@ function core.get_globals_to_transfer()
|
||||||
}
|
}
|
||||||
return all
|
return all
|
||||||
end
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local function valid_object_iterator(objects)
|
||||||
|
local i = 0
|
||||||
|
local function next_valid_object()
|
||||||
|
i = i + 1
|
||||||
|
local obj = objects[i]
|
||||||
|
if obj == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if obj:is_valid() then
|
||||||
|
return obj
|
||||||
|
end
|
||||||
|
return next_valid_object()
|
||||||
|
end
|
||||||
|
return next_valid_object
|
||||||
|
end
|
||||||
|
|
||||||
|
function core.objects_inside_radius(center, radius)
|
||||||
|
return valid_object_iterator(core.get_objects_inside_radius(center, radius))
|
||||||
|
end
|
||||||
|
|
||||||
|
function core.objects_in_area(min_pos, max_pos)
|
||||||
|
return valid_object_iterator(core.get_objects_in_area(min_pos, max_pos))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Helper for LBM execution, called from C++
|
||||||
|
--
|
||||||
|
|
||||||
|
function core.run_lbm(id, pos_list, dtime_s)
|
||||||
|
local lbm = core.registered_lbms[id]
|
||||||
|
assert(lbm, "Entry with given id not found in registered_lbms table")
|
||||||
|
core.set_last_run_mod(lbm.mod_origin)
|
||||||
|
if lbm.bulk_action then
|
||||||
|
return lbm.bulk_action(pos_list, dtime_s)
|
||||||
|
end
|
||||||
|
-- emulate non-bulk LBMs
|
||||||
|
local expect = core.get_node(pos_list[1]).name
|
||||||
|
-- engine guarantees that
|
||||||
|
-- 1) all nodes are the same content type
|
||||||
|
-- 2) the list is up-to-date when we're called
|
||||||
|
assert(expect ~= "ignore")
|
||||||
|
for _, pos in ipairs(pos_list) do
|
||||||
|
local n = core.get_node(pos)
|
||||||
|
if n.name == expect then -- might have been changed by previous call
|
||||||
|
lbm.action(pos, n, dtime_s)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -105,7 +105,12 @@ function core.register_lbm(spec)
|
||||||
-- Add to core.registered_lbms
|
-- Add to core.registered_lbms
|
||||||
check_modname_prefix(spec.name)
|
check_modname_prefix(spec.name)
|
||||||
check_node_list(spec.nodenames, "nodenames")
|
check_node_list(spec.nodenames, "nodenames")
|
||||||
assert(type(spec.action) == "function", "Required field 'action' of type function")
|
local have = spec.action ~= nil
|
||||||
|
local have_bulk = spec.bulk_action ~= nil
|
||||||
|
assert(not have or type(spec.action) == "function", "Field 'action' must be a function")
|
||||||
|
assert(not have_bulk or type(spec.bulk_action) == "function", "Field 'bulk_action' must be a function")
|
||||||
|
assert(have ~= have_bulk, "Either 'action' or 'bulk_action' must be present")
|
||||||
|
|
||||||
core.registered_lbms[#core.registered_lbms + 1] = spec
|
core.registered_lbms[#core.registered_lbms + 1] = spec
|
||||||
spec.mod_origin = core.get_current_modname() or "??"
|
spec.mod_origin = core.get_current_modname() or "??"
|
||||||
end
|
end
|
||||||
|
|
|
@ -42,6 +42,7 @@ local scriptdir = core.get_builtin_path()
|
||||||
local commonpath = scriptdir .. "common" .. DIR_DELIM
|
local commonpath = scriptdir .. "common" .. DIR_DELIM
|
||||||
local asyncpath = scriptdir .. "async" .. DIR_DELIM
|
local asyncpath = scriptdir .. "async" .. DIR_DELIM
|
||||||
|
|
||||||
|
dofile(commonpath .. "math.lua")
|
||||||
dofile(commonpath .. "vector.lua")
|
dofile(commonpath .. "vector.lua")
|
||||||
dofile(commonpath .. "strict.lua")
|
dofile(commonpath .. "strict.lua")
|
||||||
dofile(commonpath .. "serialize.lua")
|
dofile(commonpath .. "serialize.lua")
|
||||||
|
|
3
builtin/locale/__builtin.be.tr
Normal file
3
builtin/locale/__builtin.be.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Вы загінулі
|
||||||
|
Respawn=Адрадзіцца
|
3
builtin/locale/__builtin.bg.tr
Normal file
3
builtin/locale/__builtin.bg.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Умряхте
|
||||||
|
Respawn=Прераждане
|
3
builtin/locale/__builtin.ca.tr
Normal file
3
builtin/locale/__builtin.ca.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Has mort
|
||||||
|
Respawn=Reaparèixer
|
3
builtin/locale/__builtin.cs.tr
Normal file
3
builtin/locale/__builtin.cs.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Zemřel jsi
|
||||||
|
Respawn=Oživit
|
3
builtin/locale/__builtin.cy.tr
Normal file
3
builtin/locale/__builtin.cy.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Buest ti farw
|
||||||
|
Respawn=Atgyfodi
|
3
builtin/locale/__builtin.da.tr
Normal file
3
builtin/locale/__builtin.da.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Du døde
|
||||||
|
Respawn=Genopstå
|
|
@ -244,3 +244,5 @@ A total of @1 sample(s) were taken.=Es wurden insgesamt @1 Datenpunkt(e) aufgeze
|
||||||
The output is limited to '@1'.=Die Ausgabe ist beschränkt auf „@1“.
|
The output is limited to '@1'.=Die Ausgabe ist beschränkt auf „@1“.
|
||||||
Saving of profile failed: @1=Speichern des Profils fehlgeschlagen: @1
|
Saving of profile failed: @1=Speichern des Profils fehlgeschlagen: @1
|
||||||
Profile saved to @1=Profil abgespeichert nach @1
|
Profile saved to @1=Profil abgespeichert nach @1
|
||||||
|
You died=Sie sind gestorben
|
||||||
|
Respawn=Wiederbeleben
|
||||||
|
|
3
builtin/locale/__builtin.el.tr
Normal file
3
builtin/locale/__builtin.el.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Πέθανες
|
||||||
|
Respawn=Επανεμφάνηση
|
|
@ -244,3 +244,5 @@ A total of @1 sample(s) were taken.=Sume @1 ekzemplero(j) konserviĝis.
|
||||||
The output is limited to '@1'.=La eligo estas limigita al «@1».
|
The output is limited to '@1'.=La eligo estas limigita al «@1».
|
||||||
Saving of profile failed: @1=Konservado de profilo malsukcesis: @1
|
Saving of profile failed: @1=Konservado de profilo malsukcesis: @1
|
||||||
Profile saved to @1=Profilo konservita al @1
|
Profile saved to @1=Profilo konservita al @1
|
||||||
|
You died=Vi mortis
|
||||||
|
Respawn=Renaskiĝi
|
||||||
|
|
3
builtin/locale/__builtin.es.tr
Normal file
3
builtin/locale/__builtin.es.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Has muerto
|
||||||
|
Respawn=Reaparecer
|
3
builtin/locale/__builtin.et.tr
Normal file
3
builtin/locale/__builtin.et.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Said surma
|
||||||
|
Respawn=Ärka ellu
|
3
builtin/locale/__builtin.eu.tr
Normal file
3
builtin/locale/__builtin.eu.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Hil zara
|
||||||
|
Respawn=Birsortu
|
3
builtin/locale/__builtin.fi.tr
Normal file
3
builtin/locale/__builtin.fi.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Kuolit
|
||||||
|
Respawn=Synny uudelleen
|
3
builtin/locale/__builtin.fil.tr
Normal file
3
builtin/locale/__builtin.fil.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Namatay ka
|
||||||
|
Respawn=Mag-respawn
|
248
builtin/locale/__builtin.fr.tr
Normal file
248
builtin/locale/__builtin.fr.tr
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
Invalid parameters (see /help @1).=Paramètres invalides (voir /help @1).
|
||||||
|
Too many arguments, try using just /help <command>=Trop de paramètres, essayez /help <command>
|
||||||
|
Available commands: @1=Commandes disponibles : @1
|
||||||
|
Use '/help <cmd>' to get more information, or '/help all' to list everything.=Essayez '/help <cmd>' pour obtenir plus d'informations, ou '/help all' pour tout lister.
|
||||||
|
Available commands:=Commandes disponibles :
|
||||||
|
Command not available: @1=Commande non disponible : @1
|
||||||
|
[all | privs | <cmd>] [-t]=[all | privs | <cmd>] [-t]
|
||||||
|
Get help for commands or list privileges (-t: output in chat)=Obtenir de l'aide pour les commandes ou pour lister les privilèges (-t : affichage dans le tchat)
|
||||||
|
Available privileges:=Privilèges disponibles :
|
||||||
|
Command=Commande
|
||||||
|
Parameters=Paramètres
|
||||||
|
For more information, click on any entry in the list.=Pour plus d'informations, cliquez sur une entrée dans la liste.
|
||||||
|
Double-click to copy the entry to the chat history.=Double-cliquez pour copier une entrée dans l'historique du tchat.
|
||||||
|
Command: @1 @2=Commande : @1 @2
|
||||||
|
Available commands: (see also: /help <cmd>)=Commandes disponibles : (voir aussi : /help <cmd>)
|
||||||
|
Close=Fermer
|
||||||
|
Privilege=Privilège
|
||||||
|
Description=Description
|
||||||
|
Empty command.=Commande vide.
|
||||||
|
Invalid command: @1=Commande invalide : @1
|
||||||
|
Invalid command usage.=Usage invalide de la commande.
|
||||||
|
(@1 s)= (@1 s)
|
||||||
|
Command execution took @1 s=L'exécution de la commande a pris @1 s.
|
||||||
|
You don't have permission to run this command (missing privileges: @1).=Vous n'avez pas la permission d'exécuter cette commande (privilèges manquants : @1)
|
||||||
|
Unable to get position of player @1.=Impossible d'obtenir la position du joueur @1.
|
||||||
|
Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Format incorrect de la zone. Demandé : (x1, y1, z1) (x2, y2, z2)
|
||||||
|
<action>=<action>
|
||||||
|
Show chat action (e.g., '/me orders a pizza' displays '<player name> orders a pizza')=Affiche une action de tchat (ex : '/me commande une pizza' affichage '<joueur> commande une pizza')
|
||||||
|
Show the name of the server owner=Affiche le nom du propriétaire du serveur
|
||||||
|
The administrator of this server is @1.=L'administrateur de ce serveur est @1.
|
||||||
|
There's no administrator named in the config file.=Il n'y a pas d'administrateur indiqué dans le fichier de configuration.
|
||||||
|
@1 does not have any privileges.=@1 ne possède aucun privilège.
|
||||||
|
Privileges of @1: @2=Privilège(s) de @1 : @2
|
||||||
|
[<name>]=[<nom>]
|
||||||
|
Show privileges of yourself or another player=Affiche vos privilèges ou ceux d'un autre joueur.
|
||||||
|
Player @1 does not exist.=Le joueur @1 n'existe pas.
|
||||||
|
<privilege>=<privilège>
|
||||||
|
Return list of all online players with privilege=Renvoie la liste de tous les joueurs en ligne avec un privilège.
|
||||||
|
Invalid parameters (see /help haspriv).=Paramètres invalides (voir /help haspriv)
|
||||||
|
Unknown privilege!=Privilège inconnu !
|
||||||
|
No online player has the "@1" privilege.=Aucun joueur en ligne avant le privilège « @1 »
|
||||||
|
Players online with the "@1" privilege: @2=Joueurs en ligne avec le privilège « @1 » : @2
|
||||||
|
Your privileges are insufficient.=Vos privilèges sont insuffisants.
|
||||||
|
Your privileges are insufficient. '@1' only allows you to grant: @2=Vos privilèges sont insuffisants. '@1' vous autorise seulement d'accorder : @2
|
||||||
|
Unknown privilege: @1=Privilège inconnu : @1
|
||||||
|
@1 granted you privileges: @2=@1 vous a accordé les privilèges : @2
|
||||||
|
<name> (<privilege> [, <privilege2> [<...>]] | all)=<nom> (<privilège> [, <privilège2> [<...>]] | all)
|
||||||
|
Give privileges to player=Accorder le privilège au joueur
|
||||||
|
Invalid parameters (see /help grant).=Paramètres invalides (voir /help grant)
|
||||||
|
<privilege> [, <privilege2> [<...>]] | all=<privilège> [, <privilège2> [<...>]] | all
|
||||||
|
Grant privileges to yourself=Accorder des privilèges à vous-même
|
||||||
|
Invalid parameters (see /help grantme).=Paramètres invalides (voir /help grantme)
|
||||||
|
Your privileges are insufficient. '@1' only allows you to revoke: @2=Vos privilèges sont insuffisants. '@1' vous autorise seulement à révoquer : @2
|
||||||
|
Note: Cannot revoke in singleplayer: @1=Note : Impossible de révoquer en solo : @1
|
||||||
|
Note: Cannot revoke from admin: @1=Note : Impossible de révoquer à l'administrateur : @1
|
||||||
|
No privileges were revoked.=Aucun privilège n'a été révoqué.
|
||||||
|
@1 revoked privileges from you: @2=@1 vous a révoqué le privilège : @2
|
||||||
|
Remove privileges from player=Révoquer les privilèges au joueur
|
||||||
|
Invalid parameters (see /help revoke).=Paramètres invalides (voir /help revoke).
|
||||||
|
Revoke privileges from yourself=Révoquer des privilèges à vous-même
|
||||||
|
Invalid parameters (see /help revokeme).=Paramètres invalides (voir /help revokeme).
|
||||||
|
<name> <password>=<nom> <mot de passe>
|
||||||
|
Set player's password (sent unencrypted, thus insecure)=Voir le mot de passe d'un joueur (envoyé non crypté, soit non sécurisé)
|
||||||
|
Name field required.=Le champ « nom » est requis.
|
||||||
|
Your password was cleared by @1.=Votre mot de passe a été effacé par @1.
|
||||||
|
Password of player "@1" cleared.=Mot de passe du joueur « @1 » effacé.
|
||||||
|
Your password was set by @1.=Votre mot de passe a été défini par @1.
|
||||||
|
Password of player "@1" set.=Mot de passe « @1 » défini.
|
||||||
|
<name>=<nom>
|
||||||
|
Set empty password for a player=Définir un mot de passe pour un joueur
|
||||||
|
Reload authentication data=Recharger les données d'authentification
|
||||||
|
Done.=Fait.
|
||||||
|
Failed.=Échoué.
|
||||||
|
Remove a player's data=Supprimer les données d'un joueur
|
||||||
|
Player "@1" removed.=Joueur « @1 » supprimé.
|
||||||
|
No such player "@1" to remove.=Aucun joueur « @1 » à supprimer.
|
||||||
|
Player "@1" is connected, cannot remove.=Le joueur « @1 » est connecté, impossible de supprimer.
|
||||||
|
Unhandled remove_player return code @1.=La commande remove_player non gérée a retourné le code @1.
|
||||||
|
Cannot teleport out of map bounds!=Impossible de téléporter en dehors des limites de la carte !
|
||||||
|
Cannot get player with name @1.=Impossible d'obtenir le joueur @1.
|
||||||
|
Cannot teleport, @1 is attached to an object!=Impossible de téléporter, @1 est lié à un objet !
|
||||||
|
Teleporting @1 to @2.=Téléportation de @1 vers @2.
|
||||||
|
One does not teleport to oneself.=Impossible de se téléporter vers soi-même.
|
||||||
|
Cannot get teleportee with name @1.=Impossible d'obtenir le téléporté @1.
|
||||||
|
Cannot get target player with name @1.=Impossible d'obtenir le joueur cible @1.
|
||||||
|
Teleporting @1 to @2 at @3.=Téléportation de @1 vers @2 à @3.
|
||||||
|
<X>,<Y>,<Z> | <to_name> | <name> <X>,<Y>,<Z> | <name> <to_name>=<X>, <Y>, <Z> | <vers_nom> | <nom> <X>, <Y>, <Z> | <nom> <vers_nom>
|
||||||
|
Teleport to position or player=Se téléporter vers une position ou un joueur.
|
||||||
|
You don't have permission to teleport other players (missing privilege: @1).=Vous n'avez pas la permission de téléporter des joueurs (privilège manquant : @1).
|
||||||
|
([-n] <name> <value>) | <name>=([-n] <nom> <valeur>) | <nom>
|
||||||
|
Set or read server configuration setting=Définir ou lire un paramètre de configuration du serveur.
|
||||||
|
Failed. Cannot modify secure settings. Edit the settings file manually.=Échoué. Impossible de modifier les paramètres sécurisés. Éditez le fichier manuellement.
|
||||||
|
Failed. Use '/set -n <name> <value>' to create a new setting.=Échoué. Utilisez '/set -n <nom> <valeur>' pour créer un nouveau paramètre.
|
||||||
|
@1 @= @2=@1 @= @2
|
||||||
|
<not set>=<non défini>
|
||||||
|
Invalid parameters (see /help set).=Paramètres invalides (voir /help set).
|
||||||
|
Finished emerging @1 blocks in @2ms.=Fini de générer @1 blocks en @2 ms.
|
||||||
|
emergeblocks update: @1/@2 blocks emerged (@3%)=Mise à jour de emergeblocks : @1/@2 de blocs générés (@3%)
|
||||||
|
(here [<radius>]) | (<pos1> <pos2>)=(here [<rayon>]) | (<pos1> <pos1>)
|
||||||
|
Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=Charger (ou, si inexistant, générer), des blocs contenus dans la zone de pos1 à pos2 (<pos1> et <pos2> doivent être entre parenthèses)
|
||||||
|
Started emerge of area ranging from @1 to @2.=Début de la génération de la zone de @1 à @2.
|
||||||
|
Delete map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=Supprimer les blocs contenus dans la zone de pos1 à pos2 (<pos1> et <pos2> doivent être entre parenthèses)
|
||||||
|
Successfully cleared area ranging from @1 to @2.=La zone de @1 à @2 a été nettoyée avec succès.
|
||||||
|
Failed to clear one or more blocks in area.=Le nettoyage d'un ou plusieurs blocs dans la zone a echoué.
|
||||||
|
Resets lighting in the area between pos1 and pos2 (<pos1> and <pos2> must be in parentheses)=Réinitialiser l'éclairage dans la zone de pos1 à pos2 (<pos1> et <pos2> doivent être entre parenthèses)
|
||||||
|
Successfully reset light in the area ranging from @1 to @2.=L'éclairage dans la zone de @1 à @2 a été réinitialisé avec succès.
|
||||||
|
Failed to load one or more blocks in area.=Le chargement d'un ou plusieurs blocs dans la zone a échoué.
|
||||||
|
List mods installed on the server=Liste les modules installés sur le serveur.
|
||||||
|
No mods installed.=Aucun module installé.
|
||||||
|
Cannot give an empty item.=Impossible de donner un objet vide.
|
||||||
|
Cannot give an unknown item.=Impossible de donner un objet inconnu.
|
||||||
|
Giving 'ignore' is not allowed.=Donner 'ignore' n'est pas autorisé.
|
||||||
|
@1 is not a known player.=Le joueur @1 est inconnu.
|
||||||
|
@1 partially added to inventory.=@1 été partiellement rajouté à l'inventaire.
|
||||||
|
@1 could not be added to inventory.=@1 n'a pas pu être rajouté à l'inventaire.
|
||||||
|
@1 added to inventory.=@1 a été rajouté à l'inventaire.
|
||||||
|
@1 partially added to inventory of @2.=@1 a été partiellement rajouté à l'inventaire de @2.
|
||||||
|
@1 could not be added to inventory of @2.=@1 n'a pas pu être rajouté à l'inventaire de @2.
|
||||||
|
@1 added to inventory of @2.=@1 a été rajouté à l'inventaire de @2.
|
||||||
|
<name> <ItemString> [<count> [<wear>]]=<nom> <CodeObjet> [<nombre> [<usure>]]
|
||||||
|
Give item to player=Donner un objet à un joueur
|
||||||
|
Name and ItemString required.=Le nom et le code de l'objet sont requis
|
||||||
|
<ItemString> [<count> [<wear>]]=<CodeObjet> [<nombre> [<usure>]]
|
||||||
|
Give item to yourself=Donner un objet à vous-même
|
||||||
|
ItemString required.=Code objet requis.
|
||||||
|
<EntityName> [<X>,<Y>,<Z>]=<NomEntité> [<X>, <Y>, <Z>]
|
||||||
|
Spawn entity at given (or your) position=Faire apparaître une entité à une position donnée (ou la vôtre)
|
||||||
|
EntityName required.=Nom de l'entité requis.
|
||||||
|
Unable to spawn entity, player is nil.=Impossible de faire apparaître l'entité, le joueur est inexistant.
|
||||||
|
Cannot spawn an unknown entity.=Impossible de faire apparaître une entité inconnue.
|
||||||
|
Invalid parameters (@1).=Paramètres invalides (@1).
|
||||||
|
@1 spawned.=@1 a apparu.
|
||||||
|
@1 failed to spawn.=@1 a échoué à apparaître.
|
||||||
|
Destroy item in hand=Détruire l'objet dans la main
|
||||||
|
Unable to pulverize, no player.=Impossible de détruire, pas de joueur.
|
||||||
|
Unable to pulverize, no item in hand.=Impossible de détruire, pas d'objet dans la main.
|
||||||
|
An item was pulverized.=Un objet a été détruit.
|
||||||
|
[<range>] [<seconds>] [<limit>]=[<rayon>] [<secondes>] [<limite>]
|
||||||
|
Check who last touched a node or a node near it within the time specified by <seconds>. Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set <seconds> to inf for no time limit=Vérifier qui a le dernier touché un nœud ou un autre aux environs dans le temps spécifié par <secondes>. Par défaut : rayon @= 0, secondes @= 86400 @= 24h, limite @= 5. Définissez <secondes> à inf pour aucune limite de temps.
|
||||||
|
Rollback functions are disabled.=Les fonctions retour sont désactivées.
|
||||||
|
That limit is too high!=Cette limite est trop grande !
|
||||||
|
Checking @1 ...=Vérification de @1 ...
|
||||||
|
Nobody has touched the specified location in @1 seconds.=Personne n'as touché la position spécificée dans les dernières @1 secondes.
|
||||||
|
@1 @2 @3 -> @4 @5 seconds ago.=@1 @2 @3 -> @4 il y a @5 secondes.
|
||||||
|
Punch a node (range@=@1, seconds@=@2, limit@=@3).=Taper un nœud (rayon @= @1, secondes @= @2, limite @= @3).
|
||||||
|
(<name> [<seconds>]) | (:<actor> [<seconds>])=(<nom> [<secondes>]) | (:<acteur> [<secondes>])
|
||||||
|
Revert actions of a player. Default for <seconds> is 60. Set <seconds> to inf for no time limit=Annuler les actions d'un joueur. La valeur par défaut de <secondes> est 60. Définissez <secondes> à inf pour aucune limite de temps.
|
||||||
|
Invalid parameters. See /help rollback and /help rollback_check.=Paramètres invalides. Voir /help rollback et /help rollback_check.
|
||||||
|
Reverting actions of player '@1' since @2 seconds.=Annuler les actions du joueur '@1' depuis @2 secondes.
|
||||||
|
Reverting actions of @1 since @2 seconds.=Annuler les actions de @1 depuis @2 secondes.
|
||||||
|
(log is too long to show)=(le journal est trop long à afficher)
|
||||||
|
Reverting actions succeeded.=Les actions ont été annulées avec succès.
|
||||||
|
Reverting actions FAILED.=L'annulation des actions a échoué.
|
||||||
|
Show server status=Afficher le statut du serveur.
|
||||||
|
This command was disabled by a mod or game.=Cette commande a été désactivée par un module ou un jeu.
|
||||||
|
[<0..23>:<0..59> | <0..24000>]=[<0..23>:<0..59> | <0.24000>]
|
||||||
|
Show or set time of day=Afficher ou définir l'heure du jour.
|
||||||
|
Current time is @1:@2.=L'heure actuelle est @1:@2.
|
||||||
|
You don't have permission to run this command (missing privilege: @1).=Vous n'avez pas la permission d'exécuter cette commande (privilège manquant : @1)
|
||||||
|
Invalid time (must be between 0 and 24000).=Heure invalide (doit être comprise entre 0 et 24000).
|
||||||
|
Time of day changed.=L'heure du jour a changé.
|
||||||
|
Invalid hour (must be between 0 and 23 inclusive).=Heure invalide (doit être comprise entre 0 et 23 inclus).
|
||||||
|
Invalid minute (must be between 0 and 59 inclusive).=Minute invalide (doit être comprise entre 0 et 59 inclus).
|
||||||
|
Show day count since world creation=Afficher le nombre de jours écoulés depuis la création du monde.
|
||||||
|
Current day is @1.=Le jour actuel est @1.
|
||||||
|
[<delay_in_seconds> | -1] [-r] [<message>]=[<délai_en_secondes> | -1] [-r] [<message>]
|
||||||
|
Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)=Éteindre le serveur (-1 annule une extinction programmée, -r autorise les joueurs à se reconnecter)
|
||||||
|
Server shutting down (operator request).=Extinction du serveur (requête de l'opérateur).
|
||||||
|
Ban the IP of a player or show the ban list=Bannir l'IP d'un joueur ou affiche la liste des bans.
|
||||||
|
The ban list is empty.=La liste des bans est vide.
|
||||||
|
Ban list: @1=Liste de bans : @1
|
||||||
|
You cannot ban players in singleplayer!=Vous ne pouvez pas bannir des joueurs en solo !
|
||||||
|
Player is not online.=Le joueur n'est pas en ligne.
|
||||||
|
Failed to ban player.=Le bannissement du joueur a échoué.
|
||||||
|
Banned @1.=@1 a été banni.
|
||||||
|
<name> | <IP_address>=<nom> | <adresse_IP>
|
||||||
|
Remove IP ban belonging to a player/IP=Rétablir un IP appartenant à un joueur ou une adresse IP.
|
||||||
|
Failed to unban player/IP.=Le rétablissement du joueur ou de l'adresse IP a échoué.
|
||||||
|
Unbanned @1.=@1 a été rétabli.
|
||||||
|
<name> [<reason>]=<nom> [<motif>]
|
||||||
|
Kick a player=Expulser un joueur
|
||||||
|
Failed to kick player @1.=L'expulsion du joueur @1 a échoué.
|
||||||
|
Kicked @1.=@1 a été expulsé.
|
||||||
|
[full | quick]=[full | quick]
|
||||||
|
Clear all objects in world=Nettoyer tous les objets dans le monde
|
||||||
|
Invalid usage, see /help clearobjects.=Usage invalide, voir /help clearobjects.
|
||||||
|
Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Nettoyage de tous les objects. Cela peut prendre du temps. Une inactivité peut surveni (par @1).
|
||||||
|
Cleared all objects.=Tous les objets ont été nettoyés.
|
||||||
|
<name> <message>=<nom> <message>
|
||||||
|
Send a direct message to a player=Envoyer un message privé à un joueur.
|
||||||
|
Invalid usage, see /help msg.=Usage invalide, voir /help msg.
|
||||||
|
The player @1 is not online.=Le joueur @1 n'est pas en ligne.
|
||||||
|
DM from @1: @2=Message privé de @1 : @2
|
||||||
|
Message sent.=Message privé envoyé.
|
||||||
|
Get the last login time of a player or yourself=Obtenir l'horodatage de la dernière connexion d'un joueur ou de vous-même.
|
||||||
|
@1's last login time was @2.=@1 s'est connecté pour la dernière fois au @2.
|
||||||
|
@1's last login time is unknown.=L'horodatage de la dernière connexion de @1 est inconnu.
|
||||||
|
Clear the inventory of yourself or another player=Vider votre inventaire ou celui d'un autre joueur.
|
||||||
|
You don't have permission to clear another player's inventory (missing privilege: @1).=Vous n'avez pas la permission de vider l'inventaire d'un autre joueur (privilège manquant : @1).
|
||||||
|
@1 cleared your inventory.=@1 a vidé votre inventaire.
|
||||||
|
Cleared @1's inventory.=L'inventaire de @1 a été vidé.
|
||||||
|
Player must be online to clear inventory!=Le joueur doit être en ligne pour pouvoir vider son inventaire.
|
||||||
|
Players can't be killed, damage has been disabled.=Les joueurs ne peuvent pas être tués, les dommages ont été désactivés.
|
||||||
|
Player @1 is not online.=Le joueur @1 n'est pas en ligne.
|
||||||
|
You are already dead.=Vous êtes déjà mort.
|
||||||
|
@1 is already dead.=@1 est déjà mort.
|
||||||
|
@1 has been killed.=@1 a été tué.
|
||||||
|
Kill player or yourself=Tuer un joueur ou vous-même.
|
||||||
|
@1 joined the game.=@1 a rejoint la partie.
|
||||||
|
@1 left the game.=@1 a quitté la partie.
|
||||||
|
@1 left the game (timed out).=@1 a quitté la partie (inactivité).
|
||||||
|
(no description)=(sans description)
|
||||||
|
Can interact with things and modify the world=Peut interagir avec des éléments ou modifier le monde.
|
||||||
|
Can speak in chat=Peut écrire dans le tchat.
|
||||||
|
Can modify basic privileges (@1)=Peut modifier les privilèges basiques (@1)
|
||||||
|
Can modify privileges=Peut modifier les privilèges
|
||||||
|
Can teleport self=Peut se téléporter
|
||||||
|
Can teleport other players=Peut téléporter d'autres joueurs
|
||||||
|
Can set the time of day using /time=Peut définir l'heure du jour avec /time
|
||||||
|
Can do server maintenance stuff=Peut effectuer des tâches de maintenance du serveur
|
||||||
|
Can bypass node protection in the world=Peut outrepasser la protection des nœuds dans le monde.
|
||||||
|
Can ban and unban players=Peut bannir et rétablir des joueurs.
|
||||||
|
Can kick players=Peut expulser des joueurs.
|
||||||
|
Can use /give and /giveme=Peut utiliser /give et /giveme
|
||||||
|
Can use /setpassword and /clearpassword=Peut utiliser /setpassword et /clearpassword
|
||||||
|
Can use fly mode=Peut utiliser le mode vol
|
||||||
|
Can use fast mode=Peut utiliser le mode rapide
|
||||||
|
Can fly through solid nodes using noclip mode=Peut voler à travers des nœuds solides en utilisant le mode de collisions désactivées.
|
||||||
|
Can use the rollback functionality=Peut utiliser la fonctionnalité de retour
|
||||||
|
Can enable wireframe=Peut activer la vue fil de fer
|
||||||
|
Unknown Item=Objet inconnu
|
||||||
|
Air=Air
|
||||||
|
Ignore=Ignorer
|
||||||
|
You can't place 'ignore' nodes!=Vous ne pouvez pas placé de nœuds 'ignorés' !
|
||||||
|
print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset=print [<filtre>] | dump [<filtre>] | save [<format> [<filtre>]] | reset
|
||||||
|
Handle the profiler and profiling data=Traiter le profileur et les données de profilage
|
||||||
|
Statistics written to action log.=Les statistiques sont écrites dans les journaux d'actions.
|
||||||
|
Statistics were reset.=Les statistiques ont été réinitialisées.
|
||||||
|
Usage: @1=Usage : @1
|
||||||
|
Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=Le format peut être txt, csv, lua, json ou json_pretty (les structures sont sujettes au changement).
|
||||||
|
Values below show absolute/relative times spend per server step by the instrumented function.=Les valeurs inférieures affichent les temps absolu et relatif dépensés par étape du serveur par la fonction utilisée.
|
||||||
|
A total of @1 sample(s) were taken.=@1 échantillons ont été collectés.
|
||||||
|
The output is limited to '@1'.=La sortie est limitée à '@1'.
|
||||||
|
Saving of profile failed: @1=La sauvegarde du profil a échoué : @1
|
||||||
|
Profile saved to @1=Le profil a été sauvegardé dans @1
|
||||||
|
You died=Vous êtes mort
|
||||||
|
Respawn=Réapparaître
|
3
builtin/locale/__builtin.ga.tr
Normal file
3
builtin/locale/__builtin.ga.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Fuair tú bás
|
||||||
|
Respawn=Athsceith
|
3
builtin/locale/__builtin.gl.tr
Normal file
3
builtin/locale/__builtin.gl.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Morreches
|
||||||
|
Respawn=Reaparecer
|
3
builtin/locale/__builtin.hu.tr
Normal file
3
builtin/locale/__builtin.hu.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Meghaltál
|
||||||
|
Respawn=Újraéledés
|
|
@ -244,3 +244,5 @@ A total of @1 sample(s) were taken.=Total @1 sampel yang diambil.
|
||||||
The output is limited to '@1'.=Keluaran dibatasi ke '@1'.
|
The output is limited to '@1'.=Keluaran dibatasi ke '@1'.
|
||||||
Saving of profile failed: @1=Penyimpanan profil gagal: @1
|
Saving of profile failed: @1=Penyimpanan profil gagal: @1
|
||||||
Profile saved to @1=Profil disimpan ke @1
|
Profile saved to @1=Profil disimpan ke @1
|
||||||
|
You died=Anda mati
|
||||||
|
Respawn=Bangkit kembali
|
||||||
|
|
|
@ -245,3 +245,5 @@ A total of @1 sample(s) were taken.=Son stati ottenuti campioni per un totale di
|
||||||
The output is limited to '@1'.=L'output è limitato a '@1'.
|
The output is limited to '@1'.=L'output è limitato a '@1'.
|
||||||
Saving of profile failed: @1=Errore nel salvare il profilo: @1
|
Saving of profile failed: @1=Errore nel salvare il profilo: @1
|
||||||
Profile saved to @1=Profilo salvato in @1
|
Profile saved to @1=Profilo salvato in @1
|
||||||
|
You died=Sei morto
|
||||||
|
Respawn=Rinasci
|
||||||
|
|
3
builtin/locale/__builtin.ja.tr
Normal file
3
builtin/locale/__builtin.ja.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=死んでしまった
|
||||||
|
Respawn=リスポーン
|
3
builtin/locale/__builtin.jbo.tr
Normal file
3
builtin/locale/__builtin.jbo.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=.i do morsi
|
||||||
|
Respawn=tolcanci
|
3
builtin/locale/__builtin.jv.tr
Normal file
3
builtin/locale/__builtin.jv.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Panjenengan pejah
|
||||||
|
Respawn=Bangkit Malilh
|
3
builtin/locale/__builtin.ko.tr
Normal file
3
builtin/locale/__builtin.ko.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=사망했습니다
|
||||||
|
Respawn=리스폰
|
3
builtin/locale/__builtin.kv.tr
Normal file
3
builtin/locale/__builtin.kv.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Кулінныд
|
||||||
|
Respawn=Ловзьыны
|
3
builtin/locale/__builtin.ky.tr
Normal file
3
builtin/locale/__builtin.ky.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Сиз өлдүңүз.
|
||||||
|
Respawn=Кайтадан жаралуу
|
3
builtin/locale/__builtin.lt.tr
Normal file
3
builtin/locale/__builtin.lt.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Jūs numirėte
|
||||||
|
Respawn=Prisikelti
|
3
builtin/locale/__builtin.lv.tr
Normal file
3
builtin/locale/__builtin.lv.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Jūs nomirāt
|
||||||
|
Respawn=Atdzīvoties
|
3
builtin/locale/__builtin.lzh.tr
Normal file
3
builtin/locale/__builtin.lzh.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=尔死矣
|
||||||
|
Respawn=复生
|
3
builtin/locale/__builtin.mn.tr
Normal file
3
builtin/locale/__builtin.mn.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Та үхсэн
|
||||||
|
Respawn=Дахин төрөх
|
3
builtin/locale/__builtin.mr.tr
Normal file
3
builtin/locale/__builtin.mr.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=तू मेलास
|
||||||
|
Respawn=पुनर्जन्म
|
|
@ -244,3 +244,5 @@ A total of @1 sample(s) were taken.=Sebanyak @1 sampel telah diambil secara kese
|
||||||
The output is limited to '@1'.=Output dihadkan kepada '@1'.
|
The output is limited to '@1'.=Output dihadkan kepada '@1'.
|
||||||
Saving of profile failed: @1=Penyimpanan profil telah gagal: @1
|
Saving of profile failed: @1=Penyimpanan profil telah gagal: @1
|
||||||
Profile saved to @1=Profil telah disimpan ke @1
|
Profile saved to @1=Profil telah disimpan ke @1
|
||||||
|
You died=Anda telah meninggal
|
||||||
|
Respawn=Jelma semula
|
||||||
|
|
3
builtin/locale/__builtin.nb.tr
Normal file
3
builtin/locale/__builtin.nb.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Du døde
|
||||||
|
Respawn=Gjenoppstå
|
3
builtin/locale/__builtin.nl.tr
Normal file
3
builtin/locale/__builtin.nl.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Je bent gestorven
|
||||||
|
Respawn=Herboren worden
|
3
builtin/locale/__builtin.nn.tr
Normal file
3
builtin/locale/__builtin.nn.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Du døydde
|
||||||
|
Respawn=Kom opp att
|
3
builtin/locale/__builtin.oc.tr
Normal file
3
builtin/locale/__builtin.oc.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Setz mòrt·a
|
||||||
|
Respawn=Tornar
|
3
builtin/locale/__builtin.pl.tr
Normal file
3
builtin/locale/__builtin.pl.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Nie żyjesz
|
||||||
|
Respawn=Wróć do gry
|
3
builtin/locale/__builtin.pt.tr
Normal file
3
builtin/locale/__builtin.pt.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Você morreu
|
||||||
|
Respawn=Renascer
|
248
builtin/locale/__builtin.pt_BR.tr
Normal file
248
builtin/locale/__builtin.pt_BR.tr
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
Invalid parameters (see /help @1).=Parâmetros inválidos (veja /help @1).
|
||||||
|
Too many arguments, try using just /help <command>=Muitos argumentos, tente usar apenas /help <comando>
|
||||||
|
Available commands: @1=Comandos disponíveis: @1
|
||||||
|
Use '/help <cmd>' to get more information, or '/help all' to list everything.=Use '/help <cmd>' para obter mais informações, ou '/help all' para listar tudo.
|
||||||
|
Available commands:=Comandos disponíveis:
|
||||||
|
Command not available: @1=Comando não disponível: @1
|
||||||
|
[all | privs | <cmd>] [-t]=[all | privs | <cmd>] [-t]
|
||||||
|
Get help for commands or list privileges (-t: output in chat)=Obtenha ajuda para comandos ou liste privilégios (-t: saída no chat)
|
||||||
|
Available privileges:=Privilégios disponíveis:
|
||||||
|
Command=Comando
|
||||||
|
Parameters=Parâmetros
|
||||||
|
For more information, click on any entry in the list.=Para mais informações, clique em qualquer entrada na lista.
|
||||||
|
Double-click to copy the entry to the chat history.=Clique duas vezes para copiar a entrada para o histórico do chat.
|
||||||
|
Command: @1 @2=Comando: @1 @2
|
||||||
|
Available commands: (see also: /help <cmd>)=Comandos disponíveis: (veja também: /help <cmd>)
|
||||||
|
Close=Fechar
|
||||||
|
Privilege=Privilégio
|
||||||
|
Description=Descrição
|
||||||
|
Empty command.=Comando vazio.
|
||||||
|
Invalid command: @1=Comando inválido: @1
|
||||||
|
Invalid command usage.=Uso de comando inválido.
|
||||||
|
(@1 s)= (@1 s)
|
||||||
|
Command execution took @1 s=A execução do comando levou @1 s
|
||||||
|
You don't have permission to run this command (missing privileges: @1).=Você não tem permissão para executar este comando (privilégios faltando: @1).
|
||||||
|
Unable to get position of player @1.=Incapaz de obter a posição do jogador @1.
|
||||||
|
Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Formato de área incorreto. Esperado: (x1,y1,z1) (x2,y2,z2)
|
||||||
|
<action>=<ação>
|
||||||
|
Show chat action (e.g., '/me orders a pizza' displays '<player name> orders a pizza')=Mostra a ação do chat (por exemplo, '/me orders a pizza' exibe '<nome do jogador> pede uma pizza')
|
||||||
|
Show the name of the server owner=Mostra o nome do dono do servidor
|
||||||
|
The administrator of this server is @1.=O administrador deste servidor é @1.
|
||||||
|
There's no administrator named in the config file.=Não há administrador nomeado no arquivo de configuração.
|
||||||
|
@1 does not have any privileges.=@1 não tem nenhum privilégio.
|
||||||
|
Privileges of @1: @2=Privilégios de @1: @2
|
||||||
|
[<name>]=[<nome>]
|
||||||
|
Show privileges of yourself or another player=Mostrar privilégios seus ou de outro jogador
|
||||||
|
Player @1 does not exist.=O jogador @1 não existe.
|
||||||
|
<privilege>=<privilégio>
|
||||||
|
Return list of all online players with privilege=Retornar lista de todos os jogadores online com privilégio
|
||||||
|
Invalid parameters (see /help haspriv).=Parâmetros inválidos (veja /help haspriv).
|
||||||
|
Unknown privilege!=Privilégio desconhecido!
|
||||||
|
No online player has the "@1" privilege.=Nenhum jogador online tem o privilégio "@1".
|
||||||
|
Players online with the "@1" privilege: @2=Jogadores online com o privilégio "@1": @2
|
||||||
|
Your privileges are insufficient.=Seus privilégios são insuficientes.
|
||||||
|
Your privileges are insufficient. '@1' only allows you to grant: @2=Seus privilégios são insuficientes. '@1' só permite que você conceda: @2
|
||||||
|
Unknown privilege: @1=Privilégio desconhecido: @1
|
||||||
|
@1 granted you privileges: @2=@1 concedeu-lhe privilégios: @2
|
||||||
|
<name> (<privilege> [, <privilege2> [<...>]] | all)=<nome> (<privilégio> [, <privilégio2> [<...>]] | all)
|
||||||
|
Give privileges to player=Conceder privilégios ao jogador
|
||||||
|
Invalid parameters (see /help grant).=Parâmetros inválidos (veja /help grant).
|
||||||
|
<privilege> [, <privilege2> [<...>]] | all=<privilégio> [, <privilégio2> [<...>]] | all
|
||||||
|
Grant privileges to yourself=Concede privilégios a você mesmo
|
||||||
|
Invalid parameters (see /help grantme).=Parâmetros inválidos (veja /help grantme).
|
||||||
|
Your privileges are insufficient. '@1' only allows you to revoke: @2=Seus privilégios são insuficientes. '@1' só permite que você revogue: @2
|
||||||
|
Note: Cannot revoke in singleplayer: @1=Nota: Não é possível revogar em singleplayer: @1
|
||||||
|
Note: Cannot revoke from admin: @1=Nota: Não é possível revogar do administrador: @1
|
||||||
|
No privileges were revoked.=Nenhum privilégio foi revogado.
|
||||||
|
@1 revoked privileges from you: @2=@1 revogou seus privilégios: @2
|
||||||
|
Remove privileges from player=Remover privilégios do jogador
|
||||||
|
Invalid parameters (see /help revoke).=Parâmetros inválidos (veja /help revoke).
|
||||||
|
Revoke privileges from yourself=Revogar privilégios de si mesmo
|
||||||
|
Invalid parameters (see /help revokeme).=Parâmetros inválidos (veja /help revokeme).
|
||||||
|
<name> <password>=<nome> <senha>
|
||||||
|
Set player's password (sent unencrypted, thus insecure)=Definir a senha do jogador (enviada sem criptografia, portanto insegura)
|
||||||
|
Name field required.=Campo de nome obrigatório.
|
||||||
|
Your password was cleared by @1.=Sua senha foi limpa por @1.
|
||||||
|
Password of player "@1" cleared.=Senha do jogador "@1" limpa.
|
||||||
|
Your password was set by @1.=Sua senha foi definida por @1.
|
||||||
|
Password of player "@1" set.=Senha do jogador "@1" definida.
|
||||||
|
<name>=<nome>
|
||||||
|
Set empty password for a player=Definir senha vazia para um jogador
|
||||||
|
Reload authentication data=Recarregar dados de autenticação
|
||||||
|
Done.=Pronto.
|
||||||
|
Failed.=Erro.
|
||||||
|
Remove a player's data=Remover dados de um jogador
|
||||||
|
Player "@1" removed.=Jogador "@1" removido.
|
||||||
|
No such player "@1" to remove.=Não existe tal jogador "@1" para remover.
|
||||||
|
Player "@1" is connected, cannot remove.=Jogador "@1" está conectado, não pode ser removido.
|
||||||
|
Unhandled remove_player return code @1.=Código de retorno remove_player não tratado @1.
|
||||||
|
Cannot teleport out of map bounds!=Não é possível teleportar para fora dos limites do mapa!
|
||||||
|
Cannot get player with name @1.=Não é possível obter jogador com o nome @1.
|
||||||
|
Cannot teleport, @1 is attached to an object!=Não é possível teleportar, @1 está anexado a um objeto!
|
||||||
|
Teleporting @1 to @2.=Teleportando @1 para @2.
|
||||||
|
One does not teleport to oneself.=Não tem como se teletransportar para você mesmo.
|
||||||
|
Cannot get teleportee with name @1.=Não é possível teletransportar com o nome @1.
|
||||||
|
Cannot get target player with name @1.=Não é possível obter jogador alvo com o nome @1.
|
||||||
|
Teleporting @1 to @2 at @3.=Teleportando @1 para @2 em @3.
|
||||||
|
<X>,<Y>,<Z> | <to_name> | <name> <X>,<Y>,<Z> | <name> <to_name>=<X>,<Y>,<Z> | <para_nome> | <nome> <X>,<Y>,<Z> | <nome> <para_nome>
|
||||||
|
Teleport to position or player=Teleportar para posição ou um jogador
|
||||||
|
You don't have permission to teleport other players (missing privilege: @1).=Você não tem permissão para teleportar outros jogadores (privilégio faltando: @1).
|
||||||
|
([-n] <name> <value>) | <name>=([-n] <nome> <valor>) | <nome>
|
||||||
|
Set or read server configuration setting=Definir ou ler configuração do servidor
|
||||||
|
Failed. Cannot modify secure settings. Edit the settings file manually.=Falha. Não é possível modificar configurações seguras. Edite o arquivo de configurações manualmente.
|
||||||
|
Failed. Use '/set -n <name> <value>' to create a new setting.=Falhou. Use '/set -n <nome> <valor>' para criar uma nova configuração.
|
||||||
|
@1 @= @2=@1 @= @2
|
||||||
|
<not set>=<não definido>
|
||||||
|
Invalid parameters (see /help set).=Parâmetros inválidos (veja /help set).
|
||||||
|
Finished emerging @1 blocks in @2ms.=Finalizada a emergência de @1 blocos em @2ms.
|
||||||
|
emergeblocks update: @1/@2 blocks emerged (@3%)=atualização de emergeblocks: @1/@2 blocos emergidos (@3%)
|
||||||
|
(here [<radius>]) | (<pos1> <pos2>)=(aqui [<raio>]) | (<pos1> <pos2>)
|
||||||
|
Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=Carregar (ou, se inexistente, gerar) blocos de mapa contidos na área pos1 a pos2 (<pos1> e <pos2> devem estar entre parênteses)
|
||||||
|
Started emerge of area ranging from @1 to @2.=Iniciada o surgimento de áreas que vão de @1 a @2.
|
||||||
|
Delete map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=Excluir blocos de mapa contidos na área pos1 a pos2 (<pos1> e <pos2> devem estar entre parênteses)
|
||||||
|
Successfully cleared area ranging from @1 to @2.=Área limpa com sucesso variando de @1 a @2.
|
||||||
|
Failed to clear one or more blocks in area.=Falha ao limpar um ou mais blocos na área.
|
||||||
|
Resets lighting in the area between pos1 and pos2 (<pos1> and <pos2> must be in parentheses)=Redefine a iluminação na área entre pos1 e pos2 (<pos1> e <pos2> devem estar entre parênteses)
|
||||||
|
Successfully reset light in the area ranging from @1 to @2.=Iluminação redefinida com sucesso na área variando de @1 a @2.
|
||||||
|
Failed to load one or more blocks in area.=Falha ao carregar um ou mais blocos na área.
|
||||||
|
List mods installed on the server=Listar mods instalados no servidor
|
||||||
|
No mods installed.=Sem mods instalados.
|
||||||
|
Cannot give an empty item.=Não é possível dar um item vazio.
|
||||||
|
Cannot give an unknown item.=Não é possível dar um item desconhecido.
|
||||||
|
Giving 'ignore' is not allowed.=Não é permitido dar 'ignore'.
|
||||||
|
@1 is not a known player.=@1 não é um jogador conhecido.
|
||||||
|
@1 partially added to inventory.=@1 parcialmente adicionado ao inventário.
|
||||||
|
@1 could not be added to inventory.=@1 não pôde ser adicionado ao inventário.
|
||||||
|
@1 added to inventory.=@1 adicionado ao inventário.
|
||||||
|
@1 partially added to inventory of @2.=@1 parcialmente adicionado ao inventário de @2.
|
||||||
|
@1 could not be added to inventory of @2.=@1 não pôde ser adicionado ao inventário de @2.
|
||||||
|
@1 added to inventory of @2.=@1 adicionado ao inventário de @2.
|
||||||
|
<name> <ItemString> [<count> [<wear>]]=<nome> <ItemString> [<quantidade> [<desgaste>]]
|
||||||
|
Give item to player=Dar item ao jogador
|
||||||
|
Name and ItemString required.=Nome e ItemString são obrigatórios.
|
||||||
|
<ItemString> [<count> [<wear>]]=<ItemString> [<quantidade> [<desgaste>]]
|
||||||
|
Give item to yourself=Dar item a si mesmo
|
||||||
|
ItemString required.=ItemString é obrigatório.
|
||||||
|
<EntityName> [<X>,<Y>,<Z>]=<NomeDaEntidade> [<X>,<Y>,<Z>]
|
||||||
|
Spawn entity at given (or your) position=Gerar entidade na posição fornecida (ou na sua)
|
||||||
|
EntityName required.=NomeDaEntidade é obrigatório.
|
||||||
|
Unable to spawn entity, player is nil.=Não é possível gerar a entidade, jogador é nulo.
|
||||||
|
Cannot spawn an unknown entity.=Não é possível gerar uma entidade desconhecida.
|
||||||
|
Invalid parameters (@1).=Parâmetros inválidos (@1).
|
||||||
|
@1 spawned.=@1 gerado.
|
||||||
|
@1 failed to spawn.=Falha ao gerar @1.
|
||||||
|
Destroy item in hand=Destruir item na mão
|
||||||
|
Unable to pulverize, no player.=Incapaz de pulverizar, sem jogador.
|
||||||
|
Unable to pulverize, no item in hand.=Incapaz de pulverizar, sem item na mão.
|
||||||
|
An item was pulverized.=Um item foi pulverizado.
|
||||||
|
[<range>] [<seconds>] [<limit>]=[<alcance>] [<segundos>] [<limite>]
|
||||||
|
Check who last touched a node or a node near it within the time specified by <seconds>. Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set <seconds> to inf for no time limit=Verificar quem tocou pela última vez um nó ou um nó próximo dentro do tempo especificado por <segundos>. Padrão: alcance @= 0, segundos @= 86400 @= 24h, limite @= 5. Defina <segundos> como inf para sem limite de tempo
|
||||||
|
Rollback functions are disabled.=Funções de rollback estão desativadas.
|
||||||
|
That limit is too high!=Esse limite é muito alto!
|
||||||
|
Checking @1 ...=Verificando @1 ...
|
||||||
|
Nobody has touched the specified location in @1 seconds.=Ninguém tocou a localização especificada em @1 segundos.
|
||||||
|
@1 @2 @3 -> @4 @5 seconds ago.=@1 @2 @3 -> @4 @5 segundos atrás.
|
||||||
|
Punch a node (range@=@1, seconds@=@2, limit@=@3).=Golpeie um nó (alcance@=@1, segundos@=@2, limite@=@3).
|
||||||
|
(<name> [<seconds>]) | (:<actor> [<seconds>])=(<nome> [<segundos>]) | (:<ator> [<segundos>])
|
||||||
|
Revert actions of a player. Default for <seconds> is 60. Set <seconds> to inf for no time limit=Reverter ações de um jogador. O padrão para <segundos> é 60. Defina <segundos> como inf para sem limite de tempo
|
||||||
|
Invalid parameters. See /help rollback and /help rollback_check.=Parâmetros inválidos. Veja /help rollback e /help rollback_check.
|
||||||
|
Reverting actions of player '@1' since @2 seconds.=Revertendo ações do jogador '@1' desde @2 segundos.
|
||||||
|
Reverting actions of @1 since @2 seconds.=Revertendo ações de @1 desde @2 segundos.
|
||||||
|
(log is too long to show)=O log é muito longo para mostrar
|
||||||
|
Reverting actions succeeded.=Ações revertidas com sucesso.
|
||||||
|
Reverting actions FAILED.=Reversão de ações FALHOU.
|
||||||
|
Show server status=Mostrar status do servidor
|
||||||
|
This command was disabled by a mod or game.=Este comando foi desativado por um mod ou jogo.
|
||||||
|
[<0..23>:<0..59> | <0..24000>]=[<0..23>:<0..59> | <0..24000>]
|
||||||
|
Show or set time of day=Mostrar ou definir hora do dia
|
||||||
|
Current time is @1:@2.=A hora atual é @1:@2.
|
||||||
|
You don't have permission to run this command (missing privilege: @1).=Você não tem permissão para executar este comando (privilégio faltando: @1).
|
||||||
|
Invalid time (must be between 0 and 24000).=Hora inválida (deve estar entre 0 e 24000).
|
||||||
|
Time of day changed.=Hora do dia alterada.
|
||||||
|
Invalid hour (must be between 0 and 23 inclusive).=Hora inválida (deve estar entre 0 e 23 inclusivo).
|
||||||
|
Invalid minute (must be between 0 and 59 inclusive).=Minuto inválido (deve estar entre 0 e 59 inclusivo).
|
||||||
|
Show day count since world creation=Mostrar contagem de dias desde a criação do mundo
|
||||||
|
Current day is @1.=O dia atual é @1.
|
||||||
|
[<delay_in_seconds> | -1] [-r] [<message>]=[<atraso_em_segundos> | -1] [-r] [<mensagem>]
|
||||||
|
Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)=Desligar servidor (-1 cancela o desligamento adiado, -r permite que os jogadores se reconectem)
|
||||||
|
Server shutting down (operator request).=Servidor desligando (solicitação do operador).
|
||||||
|
Ban the IP of a player or show the ban list=Banir o IP de um jogador ou mostrar a lista de banimentos
|
||||||
|
The ban list is empty.=A lista de banimentos está vazia.
|
||||||
|
Ban list: @1=Lista de banimentos: @1
|
||||||
|
You cannot ban players in singleplayer!=Você não pode banir jogadores em singleplayer!
|
||||||
|
Player is not online.=Jogador não está online.
|
||||||
|
Failed to ban player.=Falha ao banir jogador.
|
||||||
|
Banned @1.=Banido @1.
|
||||||
|
<name> | <IP_address>=<nome> | <endereço_IP>
|
||||||
|
Remove IP ban belonging to a player/IP=Remover banimento de IP pertencente a um jogador/IP
|
||||||
|
Failed to unban player/IP.=Falha ao desbanir jogador/IP.
|
||||||
|
Unbanned @1.=Desbanido @1.
|
||||||
|
<name> [<reason>]=<nome> [<motivo>]
|
||||||
|
Kick a player=Expulsar um jogador
|
||||||
|
Failed to kick player @1.=Falha ao expulsar jogador @1.
|
||||||
|
Kicked @1.=Expulso @1.
|
||||||
|
[full | quick]=[full | quick]
|
||||||
|
Clear all objects in world=Limpar todos os objetos no mundo
|
||||||
|
Invalid usage, see /help clearobjects.=Uso inválido, veja /help clearobjects.
|
||||||
|
Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Limpeza de todos os objetos. Isso pode levar muito tempo. Você pode experimentar um tempo limite. (por @1)
|
||||||
|
Cleared all objects.=Todos os objetos foram limpos.
|
||||||
|
<name> <message>=<nome> <mensagem>
|
||||||
|
Send a direct message to a player=Enviar uma mensagem direta a um jogador
|
||||||
|
Invalid usage, see /help msg.=Uso inválido, veja /help msg.
|
||||||
|
The player @1 is not online.=O jogador @1 não está online.
|
||||||
|
DM from @1: @2=DM de @1: @2
|
||||||
|
Message sent.=Mensagem enviada.
|
||||||
|
Get the last login time of a player or yourself=Pegue o último horário de login de um jogador ou de você mesmo
|
||||||
|
@1's last login time was @2.=O último login de @1 foi às @2.
|
||||||
|
@1's last login time is unknown.=O último login de @1 é desconhecido.
|
||||||
|
Clear the inventory of yourself or another player=Limpar o inventário de você mesmo ou de outro jogador
|
||||||
|
You don't have permission to clear another player's inventory (missing privilege: @1).=Você não tem permissão para limpar o inventário de outro jogador (privilégio faltando: @1).
|
||||||
|
@1 cleared your inventory.=@1 limpou seu inventário.
|
||||||
|
Cleared @1's inventory.=Inventário de @1 limpo.
|
||||||
|
Player must be online to clear inventory!=O jogador deve estar online para limpar o inventário!
|
||||||
|
Players can't be killed, damage has been disabled.=Jogadores não podem ser mortos, o dano foi desativado.
|
||||||
|
Player @1 is not online.=Jogador @1 não está online.
|
||||||
|
You are already dead.=Você já está morto.
|
||||||
|
@1 is already dead.=@1 já está morto.
|
||||||
|
@1 has been killed.=@1 foi morto.
|
||||||
|
Kill player or yourself=Matar jogador ou a si mesmo
|
||||||
|
@1 joined the game.=@1 entrou no jogo.
|
||||||
|
@1 left the game.=@1 saiu do jogo.
|
||||||
|
@1 left the game (timed out).=@1 saiu do jogo (tempo esgotado)
|
||||||
|
(no description)=(sem descrição)
|
||||||
|
Can interact with things and modify the world=Pode interagir com as coisas e modificar o mundo
|
||||||
|
Can speak in chat=Pode falar no chat
|
||||||
|
Can modify basic privileges (@1)=Pode modificar privilégios básicos (@1)
|
||||||
|
Can modify privileges=Pode modificar privilégios
|
||||||
|
Can teleport self=Pode se teletransportar
|
||||||
|
Can teleport other players=Pode teletransportar outros jogadores
|
||||||
|
Can set the time of day using /time=Pode definir a hora do dia usando /time
|
||||||
|
Can do server maintenance stuff=Pode realizar tarefas de manutenção do servidor
|
||||||
|
Can bypass node protection in the world=Pode ignorar a proteção de nós no mundo
|
||||||
|
Can ban and unban players=Pode banir e desbanir jogadores
|
||||||
|
Can kick players=Pode chutar jogadores
|
||||||
|
Can use /give and /giveme=Pode usar /give e /giveme
|
||||||
|
Can use /setpassword and /clearpassword=Pode usar /setpassword e /clearpassword
|
||||||
|
Can use fly mode=Pode usar o modo voar
|
||||||
|
Can use fast mode=Pode usar o modo rápido
|
||||||
|
Can fly through solid nodes using noclip mode=Pode voar através de nós sólidos usando o modo noclip
|
||||||
|
Can use the rollback functionality=Pode usar a funcionalidade de reversão
|
||||||
|
Can enable wireframe=Pode ativar wireframe
|
||||||
|
Unknown Item=Item desconhecido
|
||||||
|
Air=Ar
|
||||||
|
Ignore=Ignorar
|
||||||
|
You can't place 'ignore' nodes!=Você não pode colocar nós 'ignorar'!
|
||||||
|
print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset=print [<filtro>] | dump [<filtro>] | save [<formato> [<filtro>]] | reset
|
||||||
|
Handle the profiler and profiling data=Lidar com o criador de perfil e os dados de criação de perfil
|
||||||
|
Statistics written to action log.=Estatísticas salvas no log de ações.
|
||||||
|
Statistics were reset.=As estatísticas foram redefinidas.
|
||||||
|
Usage: @1=Uso: @1
|
||||||
|
Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=O formato pode ser txt, csv, lua, json, json_pretty (as estruturas podem estar sujeitas a alterações).
|
||||||
|
Values below show absolute/relative times spend per server step by the instrumented function.=Os valores abaixo mostram os tempos absolutos/relativos gastos por etapa do servidor pela função instrumentada.
|
||||||
|
A total of @1 sample(s) were taken.=Um total de @1 amostra(s) foi coletada.
|
||||||
|
The output is limited to '@1'.=A saída é limitada a '@1'.
|
||||||
|
Saving of profile failed: @1=Falha ao salvar o perfil: @1
|
||||||
|
Profile saved to @1=Perfil salvo em @1
|
||||||
|
You died=Você morreu
|
||||||
|
Respawn=Reviver
|
3
builtin/locale/__builtin.ro.tr
Normal file
3
builtin/locale/__builtin.ro.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Ai murit
|
||||||
|
Respawn=Reînviere
|
|
@ -244,3 +244,5 @@ A total of @1 sample(s) were taken.=Всего было взято @1 образ
|
||||||
The output is limited to '@1'.=Вывод ограничен значением '@1'.
|
The output is limited to '@1'.=Вывод ограничен значением '@1'.
|
||||||
Saving of profile failed: @1=Не удалось сохранить данные профилирования: @1
|
Saving of profile failed: @1=Не удалось сохранить данные профилирования: @1
|
||||||
Profile saved to @1=Данные профилирования сохранены в @1
|
Profile saved to @1=Данные профилирования сохранены в @1
|
||||||
|
You died=Вы умерли
|
||||||
|
Respawn=Возродиться
|
||||||
|
|
3
builtin/locale/__builtin.sk.tr
Normal file
3
builtin/locale/__builtin.sk.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Zomrel si
|
||||||
|
Respawn=Oživiť
|
3
builtin/locale/__builtin.sl.tr
Normal file
3
builtin/locale/__builtin.sl.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Umrl si
|
||||||
|
Respawn=Ponovno oživi
|
3
builtin/locale/__builtin.sr_Cyrl.tr
Normal file
3
builtin/locale/__builtin.sr_Cyrl.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Умро си
|
||||||
|
Respawn=Врати се у живот
|
3
builtin/locale/__builtin.sr_Latn.tr
Normal file
3
builtin/locale/__builtin.sr_Latn.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Umro/la si.
|
||||||
|
Respawn=Vrati se u zivot
|
3
builtin/locale/__builtin.sv.tr
Normal file
3
builtin/locale/__builtin.sv.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Du dog
|
||||||
|
Respawn=Återuppstå
|
3
builtin/locale/__builtin.sw.tr
Normal file
3
builtin/locale/__builtin.sw.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Umekufa.
|
||||||
|
Respawn=Respawn
|
3
builtin/locale/__builtin.tok.tr
Normal file
3
builtin/locale/__builtin.tok.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=sina moli
|
||||||
|
Respawn=o kama sin
|
3
builtin/locale/__builtin.tr.tr
Normal file
3
builtin/locale/__builtin.tr.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Öldün
|
||||||
|
Respawn=Yeniden Canlan
|
3
builtin/locale/__builtin.tt.tr
Normal file
3
builtin/locale/__builtin.tt.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Сез үлдегез
|
||||||
|
Respawn=Тергезелергә
|
3
builtin/locale/__builtin.uk.tr
Normal file
3
builtin/locale/__builtin.uk.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Ви загинули
|
||||||
|
Respawn=Відродитися
|
3
builtin/locale/__builtin.vi.tr
Normal file
3
builtin/locale/__builtin.vi.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=Bạn đã bị chết
|
||||||
|
Respawn=Hồi sinh
|
3
builtin/locale/__builtin.zh_CN.tr
Normal file
3
builtin/locale/__builtin.zh_CN.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=您已死亡
|
||||||
|
Respawn=重生
|
3
builtin/locale/__builtin.zh_TW.tr
Normal file
3
builtin/locale/__builtin.zh_TW.tr
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# textdomain: __builtin
|
||||||
|
You died=您已死亡
|
||||||
|
Respawn=重生
|
|
@ -133,6 +133,8 @@ local function start_install(package, reason)
|
||||||
conf:set("release", package.release)
|
conf:set("release", package.release)
|
||||||
conf:write()
|
conf:write()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
pkgmgr.reload_by_type(package.type)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -146,7 +148,6 @@ local function start_install(package, reason)
|
||||||
|
|
||||||
start_install(next.package, next.reason)
|
start_install(next.package, next.reason)
|
||||||
end
|
end
|
||||||
|
|
||||||
ui.update()
|
ui.update()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -181,14 +182,26 @@ function contentdb.get_package_by_id(id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function get_raw_dependencies(package)
|
-- Create a coroutine from `fn` and provide results to `callback` when complete (dead).
|
||||||
if package.type ~= "mod" then
|
-- Returns a resumer function.
|
||||||
return {}
|
local function make_callback_coroutine(fn, callback)
|
||||||
end
|
local co = coroutine.create(fn)
|
||||||
if package.raw_deps then
|
|
||||||
return package.raw_deps
|
local function resumer(...)
|
||||||
|
local ok, result = coroutine.resume(co, ...)
|
||||||
|
|
||||||
|
if not ok then
|
||||||
|
error(result)
|
||||||
|
elseif coroutine.status(co) == "dead" then
|
||||||
|
callback(result)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return resumer
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function get_raw_dependencies_async(package)
|
||||||
local url_fmt = "/api/packages/%s/dependencies/?only_hard=1&protocol_version=%s&engine_version=%s"
|
local url_fmt = "/api/packages/%s/dependencies/?only_hard=1&protocol_version=%s&engine_version=%s"
|
||||||
local version = core.get_version()
|
local version = core.get_version()
|
||||||
local base_url = core.settings:get("contentdb_url")
|
local base_url = core.settings:get("contentdb_url")
|
||||||
|
@ -197,11 +210,25 @@ local function get_raw_dependencies(package)
|
||||||
local http = core.get_http_api()
|
local http = core.get_http_api()
|
||||||
local response = http.fetch_sync({ url = url })
|
local response = http.fetch_sync({ url = url })
|
||||||
if not response.succeeded then
|
if not response.succeeded then
|
||||||
core.log("error", "Unable to fetch dependencies for " .. package.url_part)
|
return nil
|
||||||
return
|
end
|
||||||
|
return core.parse_json(response.data) or {}
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function get_raw_dependencies_co(package, resumer)
|
||||||
|
if package.type ~= "mod" then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
if package.raw_deps then
|
||||||
|
return package.raw_deps
|
||||||
end
|
end
|
||||||
|
|
||||||
local data = core.parse_json(response.data) or {}
|
core.handle_async(get_raw_dependencies_async, package, resumer)
|
||||||
|
local data = coroutine.yield()
|
||||||
|
if not data then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
for id, raw_deps in pairs(data) do
|
for id, raw_deps in pairs(data) do
|
||||||
local package2 = contentdb.package_by_id[id:lower()]
|
local package2 = contentdb.package_by_id[id:lower()]
|
||||||
|
@ -222,8 +249,8 @@ local function get_raw_dependencies(package)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function contentdb.has_hard_deps(package)
|
local function has_hard_deps_co(package, resumer)
|
||||||
local raw_deps = get_raw_dependencies(package)
|
local raw_deps = get_raw_dependencies_co(package, resumer)
|
||||||
if not raw_deps then
|
if not raw_deps then
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
@ -238,8 +265,14 @@ function contentdb.has_hard_deps(package)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function contentdb.has_hard_deps(package, callback)
|
||||||
|
local resumer = make_callback_coroutine(has_hard_deps_co, callback)
|
||||||
|
resumer(package, resumer)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- Recursively resolve dependencies, given the installed mods
|
-- Recursively resolve dependencies, given the installed mods
|
||||||
local function resolve_dependencies_2(raw_deps, installed_mods, out)
|
local function resolve_dependencies_2_co(raw_deps, installed_mods, out, resumer)
|
||||||
local function resolve_dep(dep)
|
local function resolve_dep(dep)
|
||||||
-- Check whether it's already installed
|
-- Check whether it's already installed
|
||||||
if installed_mods[dep.name] then
|
if installed_mods[dep.name] then
|
||||||
|
@ -289,9 +322,9 @@ local function resolve_dependencies_2(raw_deps, installed_mods, out)
|
||||||
local result = resolve_dep(dep)
|
local result = resolve_dep(dep)
|
||||||
out[dep.name] = result
|
out[dep.name] = result
|
||||||
if result and result.package and not result.installed then
|
if result and result.package and not result.installed then
|
||||||
local raw_deps2 = get_raw_dependencies(result.package)
|
local raw_deps2 = get_raw_dependencies_co(result.package, resumer)
|
||||||
if raw_deps2 then
|
if raw_deps2 then
|
||||||
resolve_dependencies_2(raw_deps2, installed_mods, out)
|
resolve_dependencies_2_co(raw_deps2, installed_mods, out, resumer)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -301,11 +334,10 @@ local function resolve_dependencies_2(raw_deps, installed_mods, out)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- Resolve dependencies for a package, calls the recursive version.
|
local function resolve_dependencies_co(package, game, resumer)
|
||||||
function contentdb.resolve_dependencies(package, game)
|
|
||||||
assert(game)
|
assert(game)
|
||||||
|
|
||||||
local raw_deps = get_raw_dependencies(package)
|
local raw_deps = get_raw_dependencies_co(package, resumer)
|
||||||
local installed_mods = {}
|
local installed_mods = {}
|
||||||
|
|
||||||
local mods = {}
|
local mods = {}
|
||||||
|
@ -319,7 +351,7 @@ function contentdb.resolve_dependencies(package, game)
|
||||||
end
|
end
|
||||||
|
|
||||||
local out = {}
|
local out = {}
|
||||||
if not resolve_dependencies_2(raw_deps, installed_mods, out) then
|
if not resolve_dependencies_2_co(raw_deps, installed_mods, out, resumer) then
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -336,6 +368,13 @@ function contentdb.resolve_dependencies(package, game)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Resolve dependencies for a package, calls the recursive version.
|
||||||
|
function contentdb.resolve_dependencies(package, game, callback)
|
||||||
|
local resumer = make_callback_coroutine(resolve_dependencies_co, callback)
|
||||||
|
resumer(package, game, resumer)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
local function fetch_pkgs(params)
|
local function fetch_pkgs(params)
|
||||||
local version = core.get_version()
|
local version = core.get_version()
|
||||||
local base_url = core.settings:get("contentdb_url")
|
local base_url = core.settings:get("contentdb_url")
|
||||||
|
@ -427,8 +466,9 @@ end
|
||||||
|
|
||||||
|
|
||||||
function contentdb.update_paths()
|
function contentdb.update_paths()
|
||||||
|
pkgmgr.load_all()
|
||||||
|
|
||||||
local mod_hash = {}
|
local mod_hash = {}
|
||||||
pkgmgr.refresh_globals()
|
|
||||||
for _, mod in pairs(pkgmgr.global_mods:get_list()) do
|
for _, mod in pairs(pkgmgr.global_mods:get_list()) do
|
||||||
local cdb_id = pkgmgr.get_contentdb_id(mod)
|
local cdb_id = pkgmgr.get_contentdb_id(mod)
|
||||||
if cdb_id then
|
if cdb_id then
|
||||||
|
@ -437,7 +477,6 @@ function contentdb.update_paths()
|
||||||
end
|
end
|
||||||
|
|
||||||
local game_hash = {}
|
local game_hash = {}
|
||||||
pkgmgr.update_gamelist()
|
|
||||||
for _, game in pairs(pkgmgr.games) do
|
for _, game in pairs(pkgmgr.games) do
|
||||||
local cdb_id = pkgmgr.get_contentdb_id(game)
|
local cdb_id = pkgmgr.get_contentdb_id(game)
|
||||||
if cdb_id then
|
if cdb_id then
|
||||||
|
@ -446,7 +485,7 @@ function contentdb.update_paths()
|
||||||
end
|
end
|
||||||
|
|
||||||
local txp_hash = {}
|
local txp_hash = {}
|
||||||
for _, txp in pairs(pkgmgr.get_texture_packs()) do
|
for _, txp in pairs(pkgmgr.texture_packs) do
|
||||||
local cdb_id = pkgmgr.get_contentdb_id(txp)
|
local cdb_id = pkgmgr.get_contentdb_id(txp)
|
||||||
if cdb_id then
|
if cdb_id then
|
||||||
txp_hash[contentdb.aliases[cdb_id] or cdb_id] = txp
|
txp_hash[contentdb.aliases[cdb_id] or cdb_id] = txp
|
||||||
|
|
|
@ -63,21 +63,12 @@ local function install_or_update_package(this, package)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function on_confirm()
|
local function on_confirm()
|
||||||
local has_hard_deps = contentdb.has_hard_deps(package)
|
local dlg = create_install_dialog(package)
|
||||||
if has_hard_deps then
|
dlg:set_parent(this)
|
||||||
local dlg = create_install_dialog(package)
|
this:hide()
|
||||||
dlg:set_parent(this)
|
dlg:show()
|
||||||
this:hide()
|
|
||||||
dlg:show()
|
dlg:load_deps()
|
||||||
elseif has_hard_deps == nil then
|
|
||||||
local dlg = messagebox("error_checking_deps",
|
|
||||||
fgettext("Error getting dependencies for package"))
|
|
||||||
dlg:set_parent(this)
|
|
||||||
this:hide()
|
|
||||||
dlg:show()
|
|
||||||
else
|
|
||||||
contentdb.queue_download(package, package.path and contentdb.REASON_UPDATE or contentdb.REASON_NEW)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if package.type == "mod" and #pkgmgr.games == 0 then
|
if package.type == "mod" and #pkgmgr.games == 0 then
|
||||||
|
@ -190,7 +181,7 @@ local function get_info_formspec(text)
|
||||||
return table.concat({
|
return table.concat({
|
||||||
"formspec_version[6]",
|
"formspec_version[6]",
|
||||||
"size[15.75,9.5]",
|
"size[15.75,9.5]",
|
||||||
core.settings:get_bool("enable_touch") and "padding[0.01,0.01]" or "position[0.5,0.55]",
|
core.settings:get_bool("touch_gui") and "padding[0.01,0.01]" or "position[0.5,0.55]",
|
||||||
|
|
||||||
"label[4,4.35;", text, "]",
|
"label[4,4.35;", text, "]",
|
||||||
"container[0,", H - 0.8 - 0.375, "]",
|
"container[0,", H - 0.8 - 0.375, "]",
|
||||||
|
@ -221,7 +212,7 @@ local function get_formspec(dlgdata)
|
||||||
local formspec = {
|
local formspec = {
|
||||||
"formspec_version[6]",
|
"formspec_version[6]",
|
||||||
"size[15.75,9.5]",
|
"size[15.75,9.5]",
|
||||||
core.settings:get_bool("enable_touch") and "padding[0.01,0.01]" or "position[0.5,0.55]",
|
core.settings:get_bool("touch_gui") and "padding[0.01,0.01]" or "position[0.5,0.55]",
|
||||||
|
|
||||||
"style[status,downloading,queued;border=false]",
|
"style[status,downloading,queued;border=false]",
|
||||||
|
|
||||||
|
@ -472,7 +463,7 @@ end
|
||||||
local function handle_events(event)
|
local function handle_events(event)
|
||||||
if event == "DialogShow" then
|
if event == "DialogShow" then
|
||||||
-- On touchscreen, don't show the "MINETEST" header behind the dialog.
|
-- On touchscreen, don't show the "MINETEST" header behind the dialog.
|
||||||
mm_game_theme.set_engine(core.settings:get_bool("enable_touch"))
|
mm_game_theme.set_engine(core.settings:get_bool("touch_gui"))
|
||||||
|
|
||||||
-- If ContentDB is already loaded, auto-install packages here.
|
-- If ContentDB is already loaded, auto-install packages here.
|
||||||
do_auto_install()
|
do_auto_install()
|
||||||
|
|
|
@ -15,7 +15,31 @@
|
||||||
--with this program; if not, write to the Free Software Foundation, Inc.,
|
--with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
local function is_still_visible(dlg)
|
||||||
|
local this = ui.find_by_name("install_dialog")
|
||||||
|
return this == dlg and not dlg.hidden
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function get_loading_formspec()
|
||||||
|
local TOUCH_GUI = core.settings:get_bool("touch_gui")
|
||||||
|
local w = TOUCH_GUI and 14 or 7
|
||||||
|
|
||||||
|
local formspec = {
|
||||||
|
"formspec_version[3]",
|
||||||
|
"size[", w, ",9.05]",
|
||||||
|
TOUCH_GUI and "padding[0.01,0.01]" or "position[0.5,0.55]",
|
||||||
|
"label[3,4.525;", fgettext("Loading..."), "]",
|
||||||
|
}
|
||||||
|
return table.concat(formspec)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
local function get_formspec(data)
|
local function get_formspec(data)
|
||||||
|
if not data.has_hard_deps_ready then
|
||||||
|
return get_loading_formspec()
|
||||||
|
end
|
||||||
|
|
||||||
local selected_game, selected_game_idx = pkgmgr.find_by_gameid(core.settings:get("menu_last_game"))
|
local selected_game, selected_game_idx = pkgmgr.find_by_gameid(core.settings:get("menu_last_game"))
|
||||||
if not selected_game_idx then
|
if not selected_game_idx then
|
||||||
selected_game_idx = 1
|
selected_game_idx = 1
|
||||||
|
@ -27,15 +51,35 @@ local function get_formspec(data)
|
||||||
game_list[i] = core.formspec_escape(game.title)
|
game_list[i] = core.formspec_escape(game.title)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if not data.deps_ready[selected_game_idx] and
|
||||||
|
not data.deps_loading[selected_game_idx] then
|
||||||
|
data.deps_loading[selected_game_idx] = true
|
||||||
|
|
||||||
|
contentdb.resolve_dependencies(data.package, selected_game, function(deps)
|
||||||
|
if not is_still_visible(data.dlg) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
data.deps_ready[selected_game_idx] = deps
|
||||||
|
ui.update()
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- The value of `data.deps_ready[selected_game_idx]` may have changed
|
||||||
|
-- since the last if statement since `contentdb.resolve_dependencies`
|
||||||
|
-- calls the callback immediately if the dependencies are already cached.
|
||||||
|
if not data.deps_ready[selected_game_idx] then
|
||||||
|
return get_loading_formspec()
|
||||||
|
end
|
||||||
|
|
||||||
local package = data.package
|
local package = data.package
|
||||||
local will_install_deps = data.will_install_deps
|
local will_install_deps = data.will_install_deps
|
||||||
|
|
||||||
local deps_to_install = 0
|
local deps_to_install = 0
|
||||||
local deps_not_found = 0
|
local deps_not_found = 0
|
||||||
|
|
||||||
data.dependencies = contentdb.resolve_dependencies(package, selected_game)
|
data.deps_chosen = data.deps_ready[selected_game_idx]
|
||||||
local formatted_deps = {}
|
local formatted_deps = {}
|
||||||
for _, dep in pairs(data.dependencies) do
|
for _, dep in pairs(data.deps_chosen) do
|
||||||
formatted_deps[#formatted_deps + 1] = "#fff"
|
formatted_deps[#formatted_deps + 1] = "#fff"
|
||||||
formatted_deps[#formatted_deps + 1] = core.formspec_escape(dep.name)
|
formatted_deps[#formatted_deps + 1] = core.formspec_escape(dep.name)
|
||||||
if dep.installed then
|
if dep.installed then
|
||||||
|
@ -66,18 +110,18 @@ local function get_formspec(data)
|
||||||
message_bg = mt_color_orange
|
message_bg = mt_color_orange
|
||||||
end
|
end
|
||||||
|
|
||||||
local ENABLE_TOUCH = core.settings:get_bool("enable_touch")
|
local TOUCH_GUI = core.settings:get_bool("touch_gui")
|
||||||
|
|
||||||
local w = ENABLE_TOUCH and 14 or 7
|
local w = TOUCH_GUI and 14 or 7
|
||||||
local padded_w = w - 2*0.375
|
local padded_w = w - 2*0.375
|
||||||
local dropdown_w = ENABLE_TOUCH and 10.2 or 4.25
|
local dropdown_w = TOUCH_GUI and 10.2 or 4.25
|
||||||
local button_w = (padded_w - 0.25) / 3
|
local button_w = (padded_w - 0.25) / 3
|
||||||
local button_pad = button_w / 2
|
local button_pad = button_w / 2
|
||||||
|
|
||||||
local formspec = {
|
local formspec = {
|
||||||
"formspec_version[3]",
|
"formspec_version[3]",
|
||||||
"size[", w, ",9.05]",
|
"size[", w, ",9.05]",
|
||||||
ENABLE_TOUCH and "padding[0.01,0.01]" or "position[0.5,0.55]",
|
TOUCH_GUI and "padding[0.01,0.01]" or "position[0.5,0.55]",
|
||||||
"style[title;border=false]",
|
"style[title;border=false]",
|
||||||
"box[0,0;", w, ",0.8;#3333]",
|
"box[0,0;", w, ",0.8;#3333]",
|
||||||
"button[0,0;", w, ",0.8;title;", fgettext("Install $1", package.title) , "]",
|
"button[0,0;", w, ",0.8;title;", fgettext("Install $1", package.title) , "]",
|
||||||
|
@ -128,7 +172,7 @@ local function handle_submit(this, fields)
|
||||||
contentdb.queue_download(data.package, contentdb.REASON_NEW)
|
contentdb.queue_download(data.package, contentdb.REASON_NEW)
|
||||||
|
|
||||||
if data.will_install_deps then
|
if data.will_install_deps then
|
||||||
for _, dep in pairs(data.dependencies) do
|
for _, dep in pairs(data.deps_chosen) do
|
||||||
if not dep.is_optional and not dep.installed and dep.package then
|
if not dep.is_optional and not dep.installed and dep.package then
|
||||||
contentdb.queue_download(dep.package, contentdb.REASON_DEPENDENCY)
|
contentdb.queue_download(dep.package, contentdb.REASON_DEPENDENCY)
|
||||||
end
|
end
|
||||||
|
@ -153,10 +197,50 @@ local function handle_submit(this, fields)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function load_deps(dlg)
|
||||||
|
local package = dlg.data.package
|
||||||
|
|
||||||
|
contentdb.has_hard_deps(package, function(result)
|
||||||
|
if not is_still_visible(dlg) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if result == nil then
|
||||||
|
local parent = dlg.parent
|
||||||
|
dlg:delete()
|
||||||
|
local dlg2 = messagebox("error_checking_deps",
|
||||||
|
fgettext("Error getting dependencies for package $1", package.url_part))
|
||||||
|
dlg2:set_parent(parent)
|
||||||
|
parent:hide()
|
||||||
|
dlg2:show()
|
||||||
|
elseif result == false then
|
||||||
|
contentdb.queue_download(package, package.path and contentdb.REASON_UPDATE or contentdb.REASON_NEW)
|
||||||
|
dlg:delete()
|
||||||
|
else
|
||||||
|
assert(result == true)
|
||||||
|
dlg.data.has_hard_deps_ready = true
|
||||||
|
end
|
||||||
|
ui.update()
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function create_install_dialog(package)
|
function create_install_dialog(package)
|
||||||
local dlg = dialog_create("install_dialog", get_formspec, handle_submit, nil)
|
local dlg = dialog_create("install_dialog", get_formspec, handle_submit, nil)
|
||||||
dlg.data.dependencies = nil
|
dlg.data.deps_chosen = nil
|
||||||
dlg.data.package = package
|
dlg.data.package = package
|
||||||
dlg.data.will_install_deps = true
|
dlg.data.will_install_deps = true
|
||||||
|
|
||||||
|
dlg.data.has_hard_deps_ready = false
|
||||||
|
dlg.data.deps_ready = {}
|
||||||
|
dlg.data.deps_loading = {}
|
||||||
|
|
||||||
|
dlg.load_deps = load_deps
|
||||||
|
|
||||||
|
-- `get_formspec` needs to access `dlg` to check whether it's still open.
|
||||||
|
-- It doesn't suffice to check that any "install_dialog" instance is open
|
||||||
|
-- via `ui.find_by_name`, it's necessary to check for this exact instance.
|
||||||
|
dlg.data.dlg = dlg
|
||||||
|
|
||||||
return dlg
|
return dlg
|
||||||
end
|
end
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue