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
|
||||
|
||||
[*.{cpp,h,lua,txt,glsl,md,c,cmake,java,gradle}]
|
||||
[*.{cpp,h,lua,txt,glsl,c,cmake,java,gradle}]
|
||||
charset = utf-8
|
||||
indent_size = 4
|
||||
indent_style = tab
|
||||
insert_final_newline = 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
|
||||
[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.
|
||||
- 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)
|
||||
- Commit messages should:
|
||||
|
|
7
.github/workflows/android.yml
vendored
7
.github/workflows/android.yml
vendored
|
@ -35,7 +35,12 @@ jobs:
|
|||
- name: Install deps
|
||||
run: |
|
||||
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
|
||||
# We build an AAB as well for uploading to the the Play Store.
|
||||
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
|
||||
run: |
|
||||
./util/test_multiplayer.sh
|
||||
serverconf="profiler.load=true" ./util/test_multiplayer.sh
|
||||
|
||||
luacheck:
|
||||
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'
|
||||
- 'irr/**.[ch]'
|
||||
- 'irr/**.cpp'
|
||||
- 'irr/**.mm' # Objective-C(++)
|
||||
- '**/CMakeLists.txt'
|
||||
- 'cmake/Modules/**'
|
||||
- '.github/workflows/macos.yml'
|
||||
|
@ -28,7 +29,8 @@ on:
|
|||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: macos-latest
|
||||
# use lowest possible macOS running on x86_64 to support more users
|
||||
runs-on: macos-12
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install deps
|
||||
|
@ -58,6 +60,7 @@ jobs:
|
|||
- name: CPack
|
||||
run: |
|
||||
cd build
|
||||
rm -rf macos
|
||||
cmake .. -DINSTALL_DEVTEST=FALSE
|
||||
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
|
||||
appimage-build
|
||||
AppDir
|
||||
# Direnv
|
||||
.direnv/
|
||||
# Nix
|
||||
/result
|
||||
|
||||
## Files related to Minetest development cycle
|
||||
/*.patch
|
||||
|
|
10
.luacheckrc
10
.luacheckrc
|
@ -20,7 +20,7 @@ read_globals = {
|
|||
"PerlinNoise", "PerlinNoiseMap",
|
||||
|
||||
string = {fields = {"split", "trim"}},
|
||||
table = {fields = {"copy", "getn", "indexof", "insert_all"}},
|
||||
table = {fields = {"copy", "getn", "indexof", "keyof", "insert_all"}},
|
||||
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"] = {
|
||||
globals = {
|
||||
"dump", "dump2", "table", "math", "string",
|
||||
|
@ -46,7 +52,7 @@ files["builtin/common/misc_helpers.lua"] = {
|
|||
}
|
||||
|
||||
files["builtin/common/vector.lua"] = {
|
||||
globals = { "vector" },
|
||||
globals = { "vector", "math" },
|
||||
}
|
||||
|
||||
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
|
||||
set(VERSION_MAJOR 5)
|
||||
set(VERSION_MINOR 9)
|
||||
set(VERSION_MINOR 10)
|
||||
set(VERSION_PATCH 0)
|
||||
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()
|
||||
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)
|
||||
if(WIN32)
|
||||
set(DEFAULT_RUN_IN_PLACE TRUE)
|
||||
|
@ -156,7 +161,7 @@ elseif(UNIX) # Linux, BSD etc
|
|||
set(EXAMPLE_CONF_DIR ".")
|
||||
set(MANDIR "unix/man")
|
||||
set(XDG_APPS_DIR "unix/applications")
|
||||
set(APPDATADIR "unix/metainfo")
|
||||
set(METAINFODIR "unix/metainfo")
|
||||
set(ICONDIR "unix/icons")
|
||||
set(LOCALEDIR "locale")
|
||||
else()
|
||||
|
@ -167,7 +172,7 @@ elseif(UNIX) # Linux, BSD etc
|
|||
set(MANDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_MANDIR}")
|
||||
set(EXAMPLE_CONF_DIR ${DOCDIR})
|
||||
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(LOCALEDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LOCALEDIR}")
|
||||
endif()
|
||||
|
@ -258,7 +263,7 @@ install(FILES "minetest.conf.example" DESTINATION "${EXAMPLE_CONF_DIR}")
|
|||
if(UNIX AND NOT APPLE)
|
||||
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.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-xorg-icon-128.png"
|
||||
DESTINATION "${ICONDIR}/hicolor/128x128/apps"
|
||||
|
@ -283,6 +288,8 @@ if(BUILD_UNITTESTS OR BUILD_BENCHMARKS)
|
|||
add_subdirectory(lib/catch2)
|
||||
endif()
|
||||
|
||||
add_subdirectory(lib/tiniergltf)
|
||||
|
||||
# Subdirectories
|
||||
# Be sure to add all relevant definitions above this
|
||||
add_subdirectory(src)
|
||||
|
@ -368,3 +375,19 @@ if(BUILD_DOCUMENTATION)
|
|||
)
|
||||
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 - common information](doc/compiling/README.md)
|
||||
- [Compiling on GNU/Linux](doc/compiling/linux.md)
|
||||
- [Compiling on Windows](doc/compiling/windows.md)
|
||||
- [Compiling on MacOS](doc/compiling/macos.md)
|
||||
|
|
|
@ -1,15 +1,18 @@
|
|||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion 33
|
||||
buildToolsVersion '33.0.2'
|
||||
ndkVersion "$ndk_version"
|
||||
defaultConfig {
|
||||
applicationId 'net.minetest.minetest'
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 33
|
||||
compileSdk 34
|
||||
targetSdkVersion 34
|
||||
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
|
||||
versionCode project.versionCode
|
||||
versionCode versionMajor * 1000000 + versionMinor * 10000 + versionPatch * 100 + versionBuild
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
buildConfig true
|
||||
}
|
||||
|
||||
// load properties
|
||||
|
@ -49,6 +52,7 @@ android {
|
|||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
namespace 'net.minetest.minetest'
|
||||
}
|
||||
|
||||
task prepareAssets() {
|
||||
|
@ -112,18 +116,6 @@ clean {
|
|||
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 {
|
||||
implementation project(':native')
|
||||
implementation 'androidx.appcompat:appcompat:1.6.1'
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="net.minetest.minetest"
|
||||
android:installLocation="auto">
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
|
|
|
@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
|
||||
package net.minetest.minetest;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
|
@ -83,13 +84,18 @@ public class MainActivity extends AppCompatActivity {
|
|||
}
|
||||
};
|
||||
|
||||
@SuppressLint("UnspecifiedRegisterReceiverFlag")
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
IntentFilter filter = new IntentFilter(ACTION_UPDATE);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
registerReceiver(myReceiver, filter, RECEIVER_NOT_EXPORTED);
|
||||
} else {
|
||||
registerReceiver(myReceiver, filter);
|
||||
}
|
||||
|
||||
mProgressBar = findViewById(R.id.progressBar);
|
||||
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) {
|
||||
Intent intentUpdate = new Intent(ACTION_UPDATE);
|
||||
intentUpdate.setPackage(getPackageName());
|
||||
intentUpdate.putExtra(ACTION_PROGRESS, progress);
|
||||
intentUpdate.putExtra(ACTION_PROGRESS_MESSAGE, message);
|
||||
if (!isSuccess)
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
// 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("versionMinor", 9) // Version Minor
|
||||
project.ext.set("versionMinor", 10) // Version Minor
|
||||
project.ext.set("versionPatch", 0) // Version Patch
|
||||
// ^ keep in sync with cmake
|
||||
project.ext.set("versionCode", 46) // Android Version Code
|
||||
// NOTE: +2 after each release!
|
||||
// +1 for ARM and +1 for ARM64 APK's, because
|
||||
// each APK must have a larger `versionCode` than the previous
|
||||
|
||||
project.ext.set("versionBuild", 0) // Version Build
|
||||
// ^ fourth version number to allow releasing Android-only fixes and beta versions
|
||||
|
||||
buildscript {
|
||||
ext.ndk_version = '26.2.11394342'
|
||||
|
@ -16,7 +15,7 @@ buildscript {
|
|||
mavenCentral()
|
||||
}
|
||||
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'
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
|
|
@ -9,3 +9,5 @@ org.gradle.parallel.threads=8
|
|||
org.gradle.configureondemand=true
|
||||
android.enableJetifier=false
|
||||
android.useAndroidX=true
|
||||
android.nonTransitiveRClass=false
|
||||
android.nonFinalResIds=false
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
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
|
||||
validateDistributionUrl=true
|
||||
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/) -->
|
||||
|
||||
<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="256"
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 67.73333 135.46667"
|
||||
viewBox="0 0 135.46666 135.46667"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.1 r15371"
|
||||
sodipodi:docname="rare_controls.svg"
|
||||
inkscape:export-filename="/home/stu/Desktop/icons/png/rare_controls.png"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
|
||||
sodipodi:docname="overflow_btn.svg"
|
||||
inkscape:export-filename="../../textures/base/pack/overflow_btn.png"
|
||||
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
|
||||
id="defs2">
|
||||
<filter
|
||||
|
@ -397,22 +397,24 @@
|
|||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7"
|
||||
inkscape:cx="-59.862018"
|
||||
inkscape:cy="260.34663"
|
||||
inkscape:zoom="0.98994949"
|
||||
inkscape:cx="41.921331"
|
||||
inkscape:cy="163.13964"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer2"
|
||||
showgrid="true"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1023"
|
||||
inkscape:window-height="1011"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="34"
|
||||
inkscape:window-y="32"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:pagecheckerboard="false"
|
||||
inkscape:snap-grids="true"
|
||||
inkscape:snap-page="true"
|
||||
showguides="false">
|
||||
showguides="false"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:deskcolor="#d1d1d1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid16"
|
||||
|
@ -422,7 +424,11 @@
|
|||
color="#40ff40"
|
||||
opacity="0.1254902"
|
||||
empcolor="#40ff40"
|
||||
empopacity="0.25098039" />
|
||||
empopacity="0.25098039"
|
||||
originx="0"
|
||||
originy="0"
|
||||
units="px"
|
||||
visible="true" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata5">
|
||||
|
@ -432,7 +438,6 @@
|
|||
<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>
|
||||
|
@ -496,26 +501,27 @@
|
|||
x="264.65997"
|
||||
y="124.10143"
|
||||
style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara4724" /></flowRoot> <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"
|
||||
width="25.4"
|
||||
height="25.400003"
|
||||
x="21.166666"
|
||||
y="101.6" />
|
||||
id="flowPara4724" /></flowRoot>
|
||||
<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-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"
|
||||
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-5"
|
||||
width="25.4"
|
||||
height="25.400003"
|
||||
x="21.166664"
|
||||
y="8.4666681" />
|
||||
width="96.212502"
|
||||
height="0.61243516"
|
||||
x="19.62678"
|
||||
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>
|
||||
</svg>
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
@ -2,12 +2,11 @@ apply plugin: 'com.android.library'
|
|||
apply plugin: 'de.undercouch.download'
|
||||
|
||||
android {
|
||||
compileSdkVersion 33
|
||||
buildToolsVersion '33.0.2'
|
||||
ndkVersion "$ndk_version"
|
||||
defaultConfig {
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 33
|
||||
compileSdk 34
|
||||
targetSdkVersion 34
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
arguments "-DANDROID_STL=c++_shared",
|
||||
|
@ -40,6 +39,7 @@ android {
|
|||
}
|
||||
}
|
||||
}
|
||||
namespace 'net.minetest'
|
||||
}
|
||||
|
||||
// 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 .. "information_formspecs.lua")
|
||||
dofile(clientpath .. "chatcommands.lua")
|
||||
dofile(clientpath .. "death_formspec.lua")
|
||||
dofile(clientpath .. "misc.lua")
|
||||
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
|
||||
if copy then
|
||||
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
|
||||
core.display_chat_message(msg)
|
||||
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
|
||||
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(mt) == "table", ("attempt to register a %s value as metatable"):format(type(mt)))
|
||||
assert(known_metatables[name] == nil or known_metatables[name] == mt,
|
||||
|
@ -10,4 +10,10 @@ function core.register_async_metatable(name, mt)
|
|||
end
|
||||
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).
|
||||
local string_sub, string_find = string.sub, string.find
|
||||
local math = math
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
local function basic_dump(o)
|
||||
|
@ -205,49 +206,21 @@ function table.indexof(list, val)
|
|||
return -1
|
||||
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()
|
||||
return self:match("^%s*(.-)%s*$")
|
||||
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 = {
|
||||
["\\"] = "\\\\",
|
||||
["["] = "\\[",
|
||||
|
@ -689,6 +662,7 @@ function core.privs_to_string(privs, delim)
|
|||
list[#list + 1] = priv
|
||||
end
|
||||
end
|
||||
table.sort(list)
|
||||
return table.concat(list, delim)
|
||||
end
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
_G.core = {}
|
||||
_G.vector = {metatable = {}}
|
||||
|
||||
dofile("builtin/common/math.lua")
|
||||
dofile("builtin/common/vector.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 = {}
|
||||
dofile("builtin/common/math.lua")
|
||||
dofile("builtin/common/vector.lua")
|
||||
dofile("builtin/common/misc_helpers.lua")
|
||||
|
||||
|
@ -166,6 +167,16 @@ describe("table", function()
|
|||
it("indexof()", function()
|
||||
assert.equal(1, table.indexof({"foo", "bar"}, "foo"))
|
||||
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)
|
||||
|
||||
|
@ -176,3 +187,17 @@ describe("formspec_escape", function()
|
|||
assert.equal("\\[Hello\\\\\\[", core.formspec_escape("[Hello\\["))
|
||||
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 = {}
|
||||
dofile("builtin/common/math.lua")
|
||||
dofile("builtin/common/vector.lua")
|
||||
|
||||
describe("vector", function()
|
||||
|
@ -113,12 +114,35 @@ describe("vector", function()
|
|||
assert.equal(vector.new(0, 1, -1), a:round())
|
||||
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()
|
||||
local i = 0
|
||||
local f = function(x)
|
||||
i = i + 1
|
||||
return x + i
|
||||
end
|
||||
local f2 = function(x, opt1, opt2, opt3)
|
||||
return x + opt1 + opt2 + opt3
|
||||
end
|
||||
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), 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(1.1, 2.9, 2.5), vector.apply(a, 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)
|
||||
|
||||
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.False(vector.in_area(vector.new(-10, -10, -10), vector.new(10, 10, 10), vector.new(-11, -10, -10)))
|
||||
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)
|
||||
|
|
|
@ -5,6 +5,7 @@ Note: The vector.*-functions must be able to accept old vectors that had no meta
|
|||
|
||||
-- localize functions
|
||||
local setmetatable = setmetatable
|
||||
local math = math
|
||||
|
||||
vector = {}
|
||||
|
||||
|
@ -97,18 +98,26 @@ function vector.floor(v)
|
|||
end
|
||||
|
||||
function vector.round(v)
|
||||
return fast_new(
|
||||
math.round(v.x),
|
||||
math.round(v.y),
|
||||
math.round(v.z)
|
||||
)
|
||||
return vector.apply(v, math.round)
|
||||
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(
|
||||
func(v.x),
|
||||
func(v.y),
|
||||
func(v.z)
|
||||
func(v.x, ...),
|
||||
func(v.y, ...),
|
||||
func(v.z, ...)
|
||||
)
|
||||
end
|
||||
|
||||
|
@ -375,6 +384,26 @@ function vector.in_area(pos, min, max)
|
|||
(pos.z >= min.z) and (pos.z <= max.z)
|
||||
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
|
||||
local function read_vector(v)
|
||||
return v.x, v.y, v.z
|
||||
|
|
|
@ -23,6 +23,8 @@ core.add_node = core.set_node
|
|||
-- we don't deal with metadata currently
|
||||
core.swap_node = core.set_node
|
||||
|
||||
core.bulk_swap_node = core.bulk_set_node
|
||||
|
||||
function core.remove_node(pos)
|
||||
return core.vmanip:set_node_at(pos, {name="air"})
|
||||
end
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
local BASE_SPACING = 0.1
|
||||
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
|
||||
|
||||
local function buttonbar_formspec(self)
|
||||
|
@ -28,10 +28,8 @@ local function buttonbar_formspec(self)
|
|||
end
|
||||
|
||||
local formspec = {
|
||||
"style_type[box;noclip=true]",
|
||||
string.format("box[%f,%f;%f,%f;%s]", self.pos.x, self.pos.y, self.size.x,
|
||||
self.size.y, self.bgcolor),
|
||||
"style_type[box;noclip=false]",
|
||||
}
|
||||
|
||||
local btn_size = self.size.y - 2*BASE_SPACING
|
||||
|
@ -71,7 +69,7 @@ local function buttonbar_formspec(self)
|
|||
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.caption, btn.name, btn.tooltip))
|
||||
end
|
||||
|
@ -86,9 +84,6 @@ local function buttonbar_formspec(self)
|
|||
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;<]",
|
||||
btn_prev_pos.x, btn_prev_pos.y, get_scroll_btn_width(), btn_size,
|
||||
self.btn_prev_name))
|
||||
|
@ -102,14 +97,24 @@ local function buttonbar_formspec(self)
|
|||
end
|
||||
|
||||
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
|
||||
if self.cur_page > 1 then
|
||||
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
|
||||
|
||||
if fields[self.btn_next_name] and self.cur_page < self.num_pages then
|
||||
if fields[self.btn_next_name] then
|
||||
if self.cur_page < self.num_pages then
|
||||
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
|
||||
|
||||
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 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
|
||||
prepend = string.format("size[%f,%f,%s]", tsize.width, tsize.height,
|
||||
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
|
||||
prepend = ("formspec_version[%d]"):format(tab.formspec_version) .. prepend
|
||||
end
|
||||
|
@ -78,12 +89,15 @@ local function get_formspec(self)
|
|||
|
||||
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
|
||||
tab_header_size.width = tab_header_size.width - end_button_size - 0.1
|
||||
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
|
||||
formspec = formspec ..
|
||||
|
@ -98,6 +112,8 @@ local function get_formspec(self)
|
|||
self.end_button.name)
|
||||
end
|
||||
|
||||
formspec = formspec .. "container_end[]"
|
||||
|
||||
return formspec
|
||||
end
|
||||
|
||||
|
|
|
@ -221,6 +221,7 @@ core.register_chatcommand("haspriv", {
|
|||
return true, S("No online player has the \"@1\" privilege.",
|
||||
param)
|
||||
else
|
||||
table.sort(players_with_priv)
|
||||
return true, S("Players online with the \"@1\" privilege: @2",
|
||||
param,
|
||||
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,
|
||||
moveresult_new_pos = true,
|
||||
override_item_remove_fields = true,
|
||||
hotbar_hud_element = true,
|
||||
bulk_lbms = true,
|
||||
}
|
||||
|
||||
function core.has_feature(arg)
|
||||
|
|
|
@ -251,11 +251,31 @@ register_builtin_hud_element("minimap", {
|
|||
position = {x = 1, y = 0},
|
||||
alignment = {x = -1, y = 1},
|
||||
offset = {x = -10, y = 10},
|
||||
size = {x = 256, y = 256},
|
||||
size = {x = 0, y = -25},
|
||||
},
|
||||
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++.
|
||||
return flags.minimap and
|
||||
core.get_player_information(player:get_player_name()).protocol_version >= 44
|
||||
return flags.minimap and proto_ver >= 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,
|
||||
})
|
||||
|
|
|
@ -38,6 +38,7 @@ dofile(gamepath .. "forceloading.lua")
|
|||
dofile(gamepath .. "hud.lua")
|
||||
dofile(gamepath .. "knockback.lua")
|
||||
dofile(gamepath .. "async.lua")
|
||||
dofile(gamepath .. "death_screen.lua")
|
||||
|
||||
core.after(0, builtin_shared.cache_content_ids)
|
||||
|
||||
|
|
|
@ -6,14 +6,14 @@ local S = core.get_translator("__builtin")
|
|||
-- Misc. API functions
|
||||
--
|
||||
|
||||
-- @spec core.kick_player(String, String) :: Boolean
|
||||
function core.kick_player(player_name, reason)
|
||||
-- @spec core.kick_player(String, String, Boolean) :: Boolean
|
||||
function core.kick_player(player_name, reason, reconnect)
|
||||
if type(reason) == "string" then
|
||||
reason = "Kicked: " .. reason
|
||||
else
|
||||
reason = "Kicked."
|
||||
end
|
||||
return core.disconnect_player(player_name, reason)
|
||||
return core.disconnect_player(player_name, reason, reconnect)
|
||||
end
|
||||
|
||||
function core.check_player_privs(name, ...)
|
||||
|
@ -272,3 +272,54 @@ function core.get_globals_to_transfer()
|
|||
}
|
||||
return all
|
||||
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
|
||||
check_modname_prefix(spec.name)
|
||||
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
|
||||
spec.mod_origin = core.get_current_modname() or "??"
|
||||
end
|
||||
|
|
|
@ -42,6 +42,7 @@ local scriptdir = core.get_builtin_path()
|
|||
local commonpath = scriptdir .. "common" .. DIR_DELIM
|
||||
local asyncpath = scriptdir .. "async" .. DIR_DELIM
|
||||
|
||||
dofile(commonpath .. "math.lua")
|
||||
dofile(commonpath .. "vector.lua")
|
||||
dofile(commonpath .. "strict.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“.
|
||||
Saving of profile failed: @1=Speichern des Profils fehlgeschlagen: @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».
|
||||
Saving of profile failed: @1=Konservado de profilo malsukcesis: @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'.
|
||||
Saving of profile failed: @1=Penyimpanan profil gagal: @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'.
|
||||
Saving of profile failed: @1=Errore nel salvare il profilo: @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'.
|
||||
Saving of profile failed: @1=Penyimpanan profil telah gagal: @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'.
|
||||
Saving of profile failed: @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:write()
|
||||
end
|
||||
|
||||
pkgmgr.reload_by_type(package.type)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -146,7 +148,6 @@ local function start_install(package, reason)
|
|||
|
||||
start_install(next.package, next.reason)
|
||||
end
|
||||
|
||||
ui.update()
|
||||
end
|
||||
|
||||
|
@ -181,14 +182,26 @@ function contentdb.get_package_by_id(id)
|
|||
end
|
||||
|
||||
|
||||
local function get_raw_dependencies(package)
|
||||
if package.type ~= "mod" then
|
||||
return {}
|
||||
-- Create a coroutine from `fn` and provide results to `callback` when complete (dead).
|
||||
-- Returns a resumer function.
|
||||
local function make_callback_coroutine(fn, callback)
|
||||
local co = coroutine.create(fn)
|
||||
|
||||
local function resumer(...)
|
||||
local ok, result = coroutine.resume(co, ...)
|
||||
|
||||
if not ok then
|
||||
error(result)
|
||||
elseif coroutine.status(co) == "dead" then
|
||||
callback(result)
|
||||
end
|
||||
if package.raw_deps then
|
||||
return package.raw_deps
|
||||
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 version = core.get_version()
|
||||
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 response = http.fetch_sync({ url = url })
|
||||
if not response.succeeded then
|
||||
core.log("error", "Unable to fetch dependencies for " .. package.url_part)
|
||||
return
|
||||
return nil
|
||||
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
|
||||
|
||||
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
|
||||
local package2 = contentdb.package_by_id[id:lower()]
|
||||
|
@ -222,8 +249,8 @@ local function get_raw_dependencies(package)
|
|||
end
|
||||
|
||||
|
||||
function contentdb.has_hard_deps(package)
|
||||
local raw_deps = get_raw_dependencies(package)
|
||||
local function has_hard_deps_co(package, resumer)
|
||||
local raw_deps = get_raw_dependencies_co(package, resumer)
|
||||
if not raw_deps then
|
||||
return nil
|
||||
end
|
||||
|
@ -238,8 +265,14 @@ function contentdb.has_hard_deps(package)
|
|||
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
|
||||
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)
|
||||
-- Check whether it's already installed
|
||||
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)
|
||||
out[dep.name] = result
|
||||
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
|
||||
resolve_dependencies_2(raw_deps2, installed_mods, out)
|
||||
resolve_dependencies_2_co(raw_deps2, installed_mods, out, resumer)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -301,11 +334,10 @@ local function resolve_dependencies_2(raw_deps, installed_mods, out)
|
|||
end
|
||||
|
||||
|
||||
-- Resolve dependencies for a package, calls the recursive version.
|
||||
function contentdb.resolve_dependencies(package, game)
|
||||
local function resolve_dependencies_co(package, game, resumer)
|
||||
assert(game)
|
||||
|
||||
local raw_deps = get_raw_dependencies(package)
|
||||
local raw_deps = get_raw_dependencies_co(package, resumer)
|
||||
local installed_mods = {}
|
||||
|
||||
local mods = {}
|
||||
|
@ -319,7 +351,7 @@ function contentdb.resolve_dependencies(package, game)
|
|||
end
|
||||
|
||||
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
|
||||
end
|
||||
|
||||
|
@ -336,6 +368,13 @@ function contentdb.resolve_dependencies(package, game)
|
|||
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 version = core.get_version()
|
||||
local base_url = core.settings:get("contentdb_url")
|
||||
|
@ -427,8 +466,9 @@ end
|
|||
|
||||
|
||||
function contentdb.update_paths()
|
||||
pkgmgr.load_all()
|
||||
|
||||
local mod_hash = {}
|
||||
pkgmgr.refresh_globals()
|
||||
for _, mod in pairs(pkgmgr.global_mods:get_list()) do
|
||||
local cdb_id = pkgmgr.get_contentdb_id(mod)
|
||||
if cdb_id then
|
||||
|
@ -437,7 +477,6 @@ function contentdb.update_paths()
|
|||
end
|
||||
|
||||
local game_hash = {}
|
||||
pkgmgr.update_gamelist()
|
||||
for _, game in pairs(pkgmgr.games) do
|
||||
local cdb_id = pkgmgr.get_contentdb_id(game)
|
||||
if cdb_id then
|
||||
|
@ -446,7 +485,7 @@ function contentdb.update_paths()
|
|||
end
|
||||
|
||||
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)
|
||||
if cdb_id then
|
||||
txp_hash[contentdb.aliases[cdb_id] or cdb_id] = txp
|
||||
|
|
|
@ -63,21 +63,12 @@ local function install_or_update_package(this, package)
|
|||
end
|
||||
|
||||
local function on_confirm()
|
||||
local has_hard_deps = contentdb.has_hard_deps(package)
|
||||
if has_hard_deps then
|
||||
local dlg = create_install_dialog(package)
|
||||
dlg:set_parent(this)
|
||||
this:hide()
|
||||
dlg:show()
|
||||
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
|
||||
|
||||
dlg:load_deps()
|
||||
end
|
||||
|
||||
if package.type == "mod" and #pkgmgr.games == 0 then
|
||||
|
@ -190,7 +181,7 @@ local function get_info_formspec(text)
|
|||
return table.concat({
|
||||
"formspec_version[6]",
|
||||
"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, "]",
|
||||
"container[0,", H - 0.8 - 0.375, "]",
|
||||
|
@ -221,7 +212,7 @@ local function get_formspec(dlgdata)
|
|||
local formspec = {
|
||||
"formspec_version[6]",
|
||||
"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]",
|
||||
|
||||
|
@ -472,7 +463,7 @@ end
|
|||
local function handle_events(event)
|
||||
if event == "DialogShow" then
|
||||
-- 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.
|
||||
do_auto_install()
|
||||
|
|
|
@ -15,7 +15,31 @@
|
|||
--with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
--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)
|
||||
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"))
|
||||
if not selected_game_idx then
|
||||
selected_game_idx = 1
|
||||
|
@ -27,15 +51,35 @@ local function get_formspec(data)
|
|||
game_list[i] = core.formspec_escape(game.title)
|
||||
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 will_install_deps = data.will_install_deps
|
||||
|
||||
local deps_to_install = 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 = {}
|
||||
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] = core.formspec_escape(dep.name)
|
||||
if dep.installed then
|
||||
|
@ -66,18 +110,18 @@ local function get_formspec(data)
|
|||
message_bg = mt_color_orange
|
||||
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 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_pad = button_w / 2
|
||||
|
||||
local formspec = {
|
||||
"formspec_version[3]",
|
||||
"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]",
|
||||
"box[0,0;", w, ",0.8;#3333]",
|
||||
"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)
|
||||
|
||||
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
|
||||
contentdb.queue_download(dep.package, contentdb.REASON_DEPENDENCY)
|
||||
end
|
||||
|
@ -153,10 +197,50 @@ local function handle_submit(this, fields)
|
|||
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)
|
||||
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.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
|
||||
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