1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-22 17:18:39 +00:00

Merge branch 'master' into master

This commit is contained in:
DustyBagel 2024-08-17 00:38:05 -05:00 committed by GitHub
commit c5e5da27fd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
126 changed files with 3626 additions and 3063 deletions

View file

@ -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

View file

@ -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

View file

@ -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 macOS 13 since it's the last one that still runs on x86
runs-on: macos-13
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

4
.gitignore vendored
View file

@ -43,6 +43,10 @@ build/.cmake/
*.zsync
appimage-build
AppDir
# Direnv
.direnv/
# Nix
/result
## Files related to Minetest development cycle
/*.patch

View file

@ -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"}},
}

View file

@ -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")

View file

@ -1,17 +1,20 @@
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
}
buildFeatures {
buildConfig true
}
// load properties
Properties props = new Properties()
def propfile = file('../local.properties')
@ -49,6 +52,7 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
namespace 'net.minetest.minetest'
}
task prepareAssets() {

View file

@ -1,8 +1,7 @@
<?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">
android:installLocation="auto">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

View file

@ -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);
registerReceiver(myReceiver, filter);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerReceiver(myReceiver, filter, RECEIVER_NOT_EXPORTED);
} else {
registerReceiver(myReceiver, filter);
}
mProgressBar = findViewById(R.id.progressBar);
mTextView = findViewById(R.id.textView);

View file

@ -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)

View file

@ -1,10 +1,10 @@
// 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
project.ext.set("versionCode", 48) // 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
@ -16,7 +16,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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

Before After
Before After

View file

@ -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

View file

@ -1 +1 @@
<manifest package="net.minetest" />
<manifest />

View file

@ -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)

View file

@ -205,6 +205,16 @@ 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*$")

View file

@ -166,6 +166,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)

View file

@ -375,6 +375,18 @@ 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
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

View file

@ -0,0 +1,246 @@
# 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

View file

@ -0,0 +1,246 @@
# 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

View file

@ -306,17 +306,36 @@ function make.flags(setting)
"label[0,0.1;" .. get_label(setting) .. "]",
}
local value = core.settings:get(setting.name) or setting.default
self.resettable = core.settings:has(setting.name)
checkboxes = {}
for _, name in ipairs(value:split(",")) do
name = name:trim()
if name:sub(1, 2) == "no" then
checkboxes[name:sub(3)] = false
elseif name ~= "" then
checkboxes[name] = true
for _, name in ipairs(setting.possible) do
checkboxes[name] = false
end
local function apply_flags(flag_string, what)
local prefixed_flags = {}
for _, name in ipairs(flag_string:split(",")) do
prefixed_flags[name:trim()] = true
end
for _, name in ipairs(setting.possible) do
local enabled = prefixed_flags[name]
local disabled = prefixed_flags["no" .. name]
if enabled and disabled then
core.log("warning", "Flag " .. name .. " in " .. what .. " " ..
setting.name .. " both enabled and disabled, ignoring")
elseif enabled then
checkboxes[name] = true
elseif disabled then
checkboxes[name] = false
end
end
end
-- First apply the default, which is necessary since flags
-- which are not overridden may be missing from the value.
apply_flags(setting.default, "default for setting")
local value = core.settings:get(setting.name)
if value then
apply_flags(value, "setting")
end
local columns = math.max(math.floor(avail_w / 2.5), 1)
@ -325,18 +344,16 @@ function make.flags(setting)
local y = 0.55
for _, possible in ipairs(setting.possible) do
if possible:sub(1, 2) ~= "no" then
if x >= avail_w then
x = 0
y = y + 0.5
end
local is_checked = checkboxes[possible]
fs[#fs + 1] = ("checkbox[%f,%f;%s;%s;%s]"):format(
x, y, setting.name .. "_" .. possible,
core.formspec_escape(possible), tostring(is_checked))
x = x + column_width
if x >= avail_w then
x = 0
y = y + 0.5
end
local is_checked = checkboxes[possible]
fs[#fs + 1] = ("checkbox[%f,%f;%s;%s;%s]"):format(
x, y, setting.name .. "_" .. possible,
core.formspec_escape(possible), tostring(is_checked))
x = x + column_width
end
return table.concat(fs, ""), y + 0.25
@ -355,12 +372,10 @@ function make.flags(setting)
if changed then
local values = {}
for _, name in ipairs(setting.possible) do
if name:sub(1, 2) ~= "no" then
if checkboxes[name] then
table.insert(values, name)
else
table.insert(values, "no" .. name)
end
if checkboxes[name] then
table.insert(values, name)
else
table.insert(values, "no" .. name)
end
end

View file

@ -30,6 +30,7 @@ local core_developers = {
"Desour/DS",
"srifqi",
"Gregor Parzefall (grorp)",
"Lars Müller (luatic)",
}
-- currently only https://github.com/orgs/minetest/teams/triagers/members
@ -43,19 +44,24 @@ local core_team = {
-- For updating active/previous contributors, see the script in ./util/gather_git_credits.py
local active_contributors = {
"Wuzzy [Features, translations, documentation]",
"numzero [Optimizations, work on OpenGL driver]",
"ROllerozxa [Bugfixes, Mainmenu]",
"Lars Müller [Bugfixes]",
"AFCMS [Documentation]",
"savilli [Bugfixes]",
"fluxionary [Bugfixes]",
"Bradley Pierce (Thresher) [Documentation]",
"Stvk imension [Android]",
"JosiahWI [Code cleanups]",
"OgelGames [UI, Bugfixes]",
"ndren [Bugfixes]",
"Abdou-31 [Documentation]",
"cx384",
"numzero",
"AFCMS",
"sfence",
"Wuzzy",
"ROllerozxa",
"JosiahWI",
"OgelGames",
"David Heidelberg",
"1F616EMO",
"HybridDog",
"Bradley Pierce (Thresher)",
"savilli",
"Stvk imension",
"y5nw",
"chmodsayshello",
"jordan4ibanez",
"superfloh247",
}
local previous_core_developers = {

View file

@ -153,6 +153,8 @@ invert_hotbar_mouse_wheel (Hotbar: Invert mouse wheel direction) bool false
[*Touchscreen]
# Enables touchscreen mode, allowing you to play the game with a touchscreen.
#
# Requires: !android
enable_touch (Enable touchscreen) bool true
# Touchscreen sensitivity multiplier.
@ -692,6 +694,9 @@ language (Language) enum ,be,bg,ca,cs,da,de,el,en,eo,es,et,eu,fi,fr,gd,gl,hu,i
# edge pixels when images are scaled by non-integer sizes.
gui_scaling (GUI scaling) float 1.0 0.5 20
# Enables smooth scrolling.
smooth_scrolling (Smooth scrolling) bool true
# Enables animation of inventory items.
inventory_items_animations (Inventory items animations) bool false
@ -823,6 +828,9 @@ server_url (Server URL) string https://minetest.net
# Automatically report to the serverlist.
server_announce (Announce server) bool false
# Send names of online players to the serverlist. If disabled only the player count is revealed.
server_announce_send_players (Send player names to the server list) bool tru
# Make local servers visible to local clients.
serverlist_lan (Show local servers) bool true

View file

@ -1,4 +1,4 @@
Minetest Lua Client Modding API Reference 5.9.0
Minetest Lua Client Modding API Reference 5.10.0
================================================
* More information at <http://www.minetest.net/>
* Developer Wiki: <http://dev.minetest.net/>
@ -898,7 +898,7 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or
"node1",
"node2"
},
post_effect_color = Color, -- Color overlayed on the screen when the player is in the node
post_effect_color = Color, -- Color overlaid on the screen when the player is in the node
leveled = number, -- Max level for node
sunlight_propogates = bool, -- Whether light passes through the block
light_source = number, -- Light emitted by the block

View file

@ -1103,7 +1103,6 @@ Table used to specify how a sound is played:
-- its end in `-start_time` seconds.
-- It is unspecified what happens if `loop` is false and `start_time` is
-- smaller than minus the sound's length.
-- Available since feature `sound_params_start_time`.
loop = false,
@ -1117,21 +1116,6 @@ Table used to specify how a sound is played:
-- Attach the sound to an object.
-- Can't be used together with `pos`.
-- For backward compatibility, sounds continue playing at the last location
-- of the object if an object is removed (for example if an entity dies).
-- It is not recommended to rely on this.
-- For death sounds, prefer playing a positional sound instead.
-- If you want to stop a sound when an entity dies or is deactivated,
-- store the handle and call `minetest.sound_stop` in `on_die` / `on_deactivate`.
-- Ephemeral sounds are entirely unaffected by the object being removed
-- or leaving the active object range.
-- Non-ephemeral sounds stop playing on clients if objects leave
-- the active object range; they should start playing again if objects
--- come back into range (but due to a known bug, they don't yet).
to_player = name,
-- Only play for this player.
-- Can't be used together with `exclude_player`.
@ -1504,7 +1488,7 @@ Look for examples in `games/devtest` or `games/minetest_game`.
* For supported model formats see Irrlicht engine documentation.
* `plantlike_rooted`
* Enables underwater `plantlike` without air bubbles around the nodes.
* Consists of a base cube at the co-ordinates of the node plus a
* Consists of a base cube at the coordinates of the node plus a
`plantlike` extension above
* If `paramtype2="leveled", the `plantlike` extension has a height
of `param2 / 16` nodes, otherwise it's the height of 1 node
@ -3078,7 +3062,7 @@ Elements
### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]`
* Scrollable item list showing arbitrary text elements
* `name` fieldname sent to server on doubleclick value is current selected
* `name` fieldname sent to server on double-click value is current selected
element.
* `listelements` can be prepended by #color in hexadecimal format RRGGBB
(only).
@ -3087,7 +3071,7 @@ Elements
### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]`
* Scrollable itemlist showing arbitrary text elements
* `name` fieldname sent to server on doubleclick value is current selected
* `name` fieldname sent to server on double-click value is current selected
element.
* `listelements` can be prepended by #RRGGBB (only) in hexadecimal format
* if you want a listelement to start with "#" write "##"
@ -3224,7 +3208,7 @@ Elements
* Show scrollable table using options defined by the previous `tableoptions[]`
* Displays cells as defined by the previous `tablecolumns[]`
* `name`: fieldname sent to server on row select or doubleclick
* `name`: fieldname sent to server on row select or double-click
* `cell 1`...`cell n`: cell contents given in row-major order
* `selected idx`: index of row to be selected within table (first row = `1`)
* See also `minetest.explode_table_event`
@ -3674,6 +3658,9 @@ Player Inventory lists
* `hand`: list containing an override for the empty hand
* Is not created automatically, use `InvRef:set_size`
* Is only used to enhance the empty hand's tool capabilities
Custom lists can be added and deleted with `InvRef:set_size(name, size)` like
any other inventory.
ItemStack transaction order
---------------------------
@ -3833,6 +3820,8 @@ vectors are written like this: `(x, y, z)`:
`vector.new(v)` does the same as `vector.copy(v)`
* `vector.zero()`:
* Returns a new vector `(0, 0, 0)`.
* `vector.random_direction()`:
* Returns a new vector of length 1, pointing into a direction chosen uniformly at random.
* `vector.copy(v)`:
* Returns a copy of the vector `v`.
* `vector.from_string(s[, init])`:
@ -4036,6 +4025,10 @@ Helper functions
the value `val` in the table `list`. Non-numerical indices are ignored.
If `val` could not be found, `-1` is returned. `list` must not have
negative indices.
* `table.keyof(table, val)`: returns the key containing
the value `val` in the table `table`. If multiple keys contain `val`,
it is unspecified which key will be returned.
If `val` could not be found, `nil` is returned.
* `table.insert_all(table, other_table)`:
* Appends all values in `other_table` to `table` - uses `#table + 1` to
find new indices.
@ -4255,7 +4248,7 @@ Perlin noise
============
Perlin noise creates a continuously-varying value depending on the input values.
Usually in Minetest the input values are either 2D or 3D co-ordinates in nodes.
Usually in Minetest the input values are either 2D or 3D coordinates in nodes.
The result is used during map generation to create the terrain shape, vary heat
and humidity to distribute biomes, vary the density of decorations or vary the
structure of ores.
@ -4518,7 +4511,7 @@ computationally expensive than any other ore.
Creates a single undulating ore stratum that is continuous across mapchunk
borders and horizontally spans the world.
The 2D perlin noise described by `noise_params` defines the Y co-ordinate of
The 2D perlin noise described by `noise_params` defines the Y coordinate of
the stratum midpoint. The 2D perlin noise described by `np_stratum_thickness`
defines the stratum's vertical thickness (in units of nodes). Due to being
continuous across mapchunk borders the stratum's vertical thickness is
@ -5113,12 +5106,15 @@ Callbacks:
to the object (not necessarily an actual rightclick)
* `clicker`: an `ObjectRef` (may or may not be a player)
* `on_attach_child(self, child)`
* `child`: an `ObjectRef` of the child that attaches
* Called after another object is attached to this object.
* `child`: an `ObjectRef` of the child
* `on_detach_child(self, child)`
* `child`: an `ObjectRef` of the child that detaches
* Called after another object has detached from this object.
* `child`: an `ObjectRef` of the child
* `on_detach(self, parent)`
* `parent`: an `ObjectRef` (can be `nil`) from where it got detached
* This happens before the parent object is removed from the world
* Called after detaching from another object.
* `parent`: an `ObjectRef` from where it got detached
* Note: this is also called before removal from the world.
* `get_staticdata(self)`
* Should return a string that will be passed to `on_activate` when the
object is instantiated the next time.
@ -5451,14 +5447,14 @@ Utilities
dynamic_add_media_filepath = true,
-- L-system decoration type (5.9.0)
lsystem_decoration_type = true,
-- Overrideable pointing range using the itemstack meta key `"range"` (5.9.0)
-- Overridable pointing range using the itemstack meta key `"range"` (5.9.0)
item_meta_range = true,
-- Allow passing an optional "actor" ObjectRef to the following functions:
-- minetest.place_node, minetest.dig_node, minetest.punch_node (5.9.0)
node_interaction_actor = true,
-- "new_pos" field in entity moveresult (5.9.0)
moveresult_new_pos = true,
-- Allow removing definition fields in `minetest.override_item`
-- Allow removing definition fields in `minetest.override_item` (5.9.0)
override_item_remove_fields = true,
}
```
@ -5753,7 +5749,7 @@ Call these functions only at load time!
* `minetest.register_on_generated(function(minp, maxp, blockseed))`
* Called after generating a piece of world between `minp` and `maxp`.
* **Avoid using this** whenever possible. As with other callbacks this blocks
the main thread and introduces noticable latency.
the main thread and introduces noticeable latency.
Consider [Mapgen environment] for an alternative.
* `minetest.register_on_newplayer(function(ObjectRef))`
* Called when a new player enters the world for the first time
@ -6417,11 +6413,11 @@ Environment access
* spread these updates to neighbors and can cause a cascade
of nodes to fall.
* `minetest.get_spawn_level(x, z)`
* Returns a player spawn y co-ordinate for the provided (x, z)
co-ordinates, or `nil` for an unsuitable spawn point.
* Returns a player spawn y coordinate for the provided (x, z)
coordinates, or `nil` for an unsuitable spawn point.
* For most mapgens a 'suitable spawn point' is one with y between
`water_level` and `water_level + 16`, and in mgv7 well away from rivers,
so `nil` will be returned for many (x, z) co-ordinates.
so `nil` will be returned for many (x, z) coordinates.
* The spawn level returned is for a player spawn in unmodified terrain.
* The spawn level is intentionally above terrain level to cope with
full-node biome 'dust' nodes.
@ -6731,7 +6727,7 @@ This allows you easy interoperability for delegating work to jobs.
* Register a path to a Lua file to be imported when an async environment
is initialized. You can use this to preload code which you can then call
later using `minetest.handle_async()`.
* `minetest.register_async_metatable(name, mt)`:
* `minetest.register_portable_metatable(name, mt)`:
* Register a metatable that should be preserved when data is transferred
between the main thread and the async environment.
* `name` is a string that identifies the metatable. It is recommended to
@ -6771,7 +6767,7 @@ Functions:
* Standalone helpers such as logging, filesystem, encoding,
hashing or compression APIs
* `minetest.register_async_metatable` (see above)
* `minetest.register_portable_metatable` (see above)
Variables:
@ -6901,7 +6897,7 @@ Server
all players (optional)
* `ephemeral`: boolean that marks the media as ephemeral,
it will not be cached on the client (optional, default false)
* Exactly one of the paramters marked [*] must be specified.
* Exactly one of the parameters marked [*] must be specified.
* `callback`: function with arguments `name`, which is a player name
* Pushes the specified media file to client(s). (details below)
The file must be a supported image, sound or model format.
@ -7101,6 +7097,8 @@ Misc.
* `minetest.is_player(obj)`: boolean, whether `obj` is a player
* `minetest.player_exists(name)`: boolean, whether player exists
(regardless of online status)
* `minetest.is_valid_player_name(name)`: boolean, whether the given name
could be used as a player name (regardless of whether said player exists).
* `minetest.hud_replace_builtin(name, hud_definition)`
* Replaces definition of a builtin hud element
* `name`: `"breath"`, `"health"` or `"minimap"`
@ -7509,6 +7507,8 @@ An `InvRef` is a reference to an inventory.
* `is_empty(listname)`: return `true` if list is empty
* `get_size(listname)`: get size of a list
* `set_size(listname, size)`: set size of a list
* If `listname` is not known, a new list will be created
* Setting `size` to 0 deletes a list
* returns `false` on error (e.g. invalid `listname` or `size`)
* `get_width(listname)`: get width of a list
* `set_width(listname, width)`: set width of list; currently used for crafting
@ -7732,7 +7732,7 @@ metadata_table = {
-- metadata fields (key/value store)
fields = {
infotext = "Container",
anoter_key = "Another Value",
another_key = "Another Value",
},
-- inventory data (for nodes)
@ -7988,6 +7988,29 @@ child will follow movement and rotation of that bone.
* `get_bone_overrides()`: returns all bone overrides as table `{[bonename] = override, ...}`
* `set_properties(object property table)`
* `get_properties()`: returns a table of all object properties
* `set_observers(observers)`: sets observers (players this object is sent to)
* If `observers` is `nil`, the object's observers are "unmanaged":
The object is sent to all players as governed by server settings. This is the default.
* `observers` is a "set" of player names: `{name1 = true, name2 = true, ...}`
* A set is a table where the keys are the elements of the set
(in this case, *valid* player names) and the values are all `true`.
* Attachments: The *effective observers* of an object are made up of
all players who can observe the object *and* are also effective observers
of its parent object (if there is one).
* Players are automatically added to their own observer sets.
Players **must** effectively observe themselves.
* Object activation and deactivation are unaffected by observability.
* Attached sounds do not work correctly and thus should not be used
on objects with managed observers yet.
* `get_observers()`:
* throws an error if the object is invalid
* returns `nil` if the observers are unmanaged
* returns a table with all observer names as keys and `true` values (a "set") otherwise
* `get_effective_observers()`:
* Like `get_observers()`, but returns the "effective" observers, taking into account attachments
* Time complexity: O(nm)
* n: number of observers of the involved entities
* m: number of ancestors along the attachment chain
* `is_player()`: returns true for players, false otherwise
* `get_nametag_attributes()`
* returns a table with the attributes of the nametag of an object
@ -8032,7 +8055,7 @@ child will follow movement and rotation of that bone.
* `rot` is a vector (radians). X is pitch (elevation), Y is yaw (heading)
and Z is roll (bank).
* Does not reset rotation incurred through `automatic_rotate`.
Remove & readd your objects to force a certain rotation.
Remove & re-add your objects to force a certain rotation.
* `get_rotation()`: returns the rotation, a vector (radians)
* `set_yaw(yaw)`: sets the yaw in radians (heading).
* `get_yaw()`: returns number in radians
@ -8233,7 +8256,9 @@ child will follow movement and rotation of that bone.
* See `hud_set_flags` for a list of flags that can be toggled.
* `hud_set_hotbar_itemcount(count)`: sets number of items in builtin hotbar
* `count`: number of items, must be between `1` and `32`
* If `count` exceeds the `"main"` list size, the list size will be used instead.
* `hud_get_hotbar_itemcount()`: returns number of visible items
* This value is also clamped by the `"main"` list size.
* `hud_set_hotbar_image(texturename)`
* sets background image for hotbar
* `hud_get_hotbar_image()`: returns texturename
@ -8412,7 +8437,8 @@ child will follow movement and rotation of that bone.
ColorSpec (alpha ignored, default `#000000`)
* `height`: cloud height, i.e. y of cloud base (default per conf,
usually `120`)
* `thickness`: cloud thickness in nodes (default `16`)
* `thickness`: cloud thickness in nodes (default `16`).
if set to zero the clouds are rendered flat.
* `speed`: 2D cloud speed + direction in nodes per second
(default `{x=0, z=-2}`).
* `get_clouds()`: returns a table with the current cloud parameters as in
@ -8914,7 +8940,10 @@ Player properties need to be saved manually.
Entity definition
-----------------
Used by `minetest.register_entity`.
Used by `minetest.register_entity`.
The entity definition table becomes a metatable of a newly created per-entity
luaentity table, meaning its fields (e.g. `initial_properties`) will be shared
between all instances of an entity.
```lua
{
@ -8971,7 +9000,7 @@ Used by `minetest.register_abm`.
-- Operation interval in seconds
chance = 50,
-- Chance of triggering `action` per-node per-interval is 1.0 / chance
-- Probability of triggering `action` per-node per-interval is 1.0 / chance (integers only)
min_y = -32768,
max_y = 32767,
@ -10361,7 +10390,7 @@ See [Decoration types]. Used by `minetest.register_decoration`.
y_min = -31000,
y_max = 31000,
-- Lower and upper limits for decoration (inclusive).
-- These parameters refer to the Y co-ordinate of the 'place_on' node.
-- These parameters refer to the Y coordinate of the 'place_on' node.
spawn_by = "default:water",
-- Node (or list of nodes) that the decoration only spawns next to.

View file

@ -1,4 +1,4 @@
Minetest Lua Mainmenu API Reference 5.9.0
Minetest Lua Mainmenu API Reference 5.10.0
=========================================
Introduction

View file

@ -151,8 +151,7 @@ are placeholders intended to be overwritten by the game.
* `rangeview_btn.png`
* `debug_btn.png`
* `gear_icon.png`
* `rare_controls.png`
* `overflow_btn.png`
* `exit_btn.png`
Texture Overrides

View file

@ -1,4 +1,5 @@
dofile(minetest.get_modpath("testentities").."/visuals.lua")
dofile(minetest.get_modpath("testentities").."/observers.lua")
dofile(minetest.get_modpath("testentities").."/selectionbox.lua")
dofile(minetest.get_modpath("testentities").."/armor.lua")
dofile(minetest.get_modpath("testentities").."/pointable.lua")

View file

@ -0,0 +1,7 @@
Original model by MirceaKitsune (CC BY-SA 3.0).
Various alterations and fixes by kilbith, sofar, xunto, Rogier-5, TeTpaAka, Desour,
stujones11, An0n3m0us (CC BY-SA 3.0):
testentities_sam.b3d
Jordach (CC BY-SA 3.0):
testentities_sam.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,37 @@
local function player_names_excluding(exclude_player_name)
local player_names = {}
for _, player in ipairs(minetest.get_connected_players()) do
player_names[player:get_player_name()] = true
end
player_names[exclude_player_name] = nil
return player_names
end
minetest.register_entity("testentities:observable", {
initial_properties = {
visual = "sprite",
textures = { "testentities_sprite.png" },
static_save = false,
infotext = "Punch to set observers to anyone but you"
},
on_activate = function(self)
self.object:set_armor_groups({punch_operable = 1})
assert(self.object:get_observers() == nil)
-- Using a value of `false` in the table should error.
assert(not pcall(self.object, self.object.set_observers, self.object, {test = false}))
end,
on_punch = function(self, puncher)
local puncher_name = puncher:get_player_name()
local observers = player_names_excluding(puncher_name)
self.object:set_observers(observers)
local got_observers = self.object:get_observers()
for name in pairs(observers) do
assert(got_observers[name])
end
for name in pairs(got_observers) do
assert(observers[name])
end
self.object:set_properties({infotext = "Excluding " .. puncher_name})
return true
end
})

View file

@ -66,6 +66,19 @@ minetest.register_entity("testentities:mesh_unshaded", {
},
})
minetest.register_entity("testentities:sam", {
initial_properties = {
visual = "mesh",
mesh = "testentities_sam.b3d",
textures = {
"testentities_sam.png"
},
},
on_activate = function(self)
self.object:set_animation({x = 0, y = 219}, 30, 0, true)
end,
})
-- Advanced visual tests
-- An entity for testing animated and yaw-modulated sprites

View file

@ -89,10 +89,12 @@ for a=1,#alphas do
end
minetest.register_node("testnodes:alpha_compositing", {
description = S("Alpha Compositing Test Node") .. "\n" ..
description = S("Texture Overlay Test Node") .. "\n" ..
S("A regular grid should be visible where each cell contains two " ..
"texels with the same colour.") .. "\n" ..
S("Alpha compositing is gamma-incorrect for backwards compatibility."),
"texels with the same color.") .. "\n" ..
S("Texture overlay is gamma-incorrect, " ..
"and in general it does not do alpha compositing, " ..
"both for backwards compatibility."),
drawtype = "glasslike",
paramtype = "light",
tiles = {"testnodes_alpha_compositing_bottom.png^" ..

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 265 B

Before After
Before After

View file

@ -167,18 +167,18 @@ local function test_userdata_passing2(cb, _, pos)
end
unittests.register("test_userdata_passing2", test_userdata_passing2, {map=true, async=true})
local function test_async_metatable_override()
assert(pcall(core.register_async_metatable, "__builtin:vector", vector.metatable),
local function test_portable_metatable_override()
assert(pcall(core.register_portable_metatable, "__builtin:vector", vector.metatable),
"Metatable name aliasing throws an error when it should be allowed")
assert(not pcall(core.register_async_metatable, "__builtin:vector", {}),
assert(not pcall(core.register_portable_metatable, "__builtin:vector", {}),
"Illegal metatable overriding allowed")
end
unittests.register("test_async_metatable_override", test_async_metatable_override)
unittests.register("test_portable_metatable_override", test_portable_metatable_override)
local function test_async_metatable_registration(cb)
local function test_portable_metatable_registration(cb)
local custom_metatable = {}
core.register_async_metatable("unittests:custom_metatable", custom_metatable)
core.register_portable_metatable("unittests:custom_metatable", custom_metatable)
core.handle_async(function(x)
-- unittests.custom_metatable is registered in inside_async_env.lua
@ -193,7 +193,7 @@ local function test_async_metatable_registration(cb)
cb()
end, setmetatable({}, custom_metatable))
end
unittests.register("test_async_metatable_registration", test_async_metatable_registration, {async=true})
unittests.register("test_portable_metatable_registration", test_portable_metatable_registration, {async=true})
local function test_vector_preserve(cb)
local vec = vector.new(1, 2, 3)

View file

@ -40,12 +40,36 @@ core.register_entity("unittests:callbacks", {
end,
on_attach_child = function(self, child)
insert_log("on_attach_child(%s)", objref_str(self, child))
assert(child:get_attach() == self.object)
local ok = false
for _, obj in ipairs(self.object:get_children()) do
if obj == child then
ok = true
end
end
assert(ok, "Child not found in get_children")
end,
on_detach_child = function(self, child)
insert_log("on_detach_child(%s)", objref_str(self, child))
assert(child:get_attach() == nil)
local ok = true
for _, obj in ipairs(self.object:get_children()) do
if obj == child then
ok = false
end
end
assert(ok, "Former child found in get_children")
end,
on_detach = function(self, parent)
insert_log("on_detach(%s)", objref_str(self, parent))
assert(self.object:get_attach() == nil)
local ok = true
for _, obj in ipairs(parent:get_children()) do
if obj == self.object then
ok = false
end
end
assert(ok, "Former child found in get_children")
end,
get_staticdata = function(self)
assert(false)
@ -118,19 +142,25 @@ local function test_entity_attach(player, pos)
-- attach player to entity
player:set_attach(obj)
check_log({"on_attach_child(player)"})
assert(player:get_attach() == obj)
player:set_detach()
check_log({"on_detach_child(player)"})
assert(player:get_attach() == nil)
-- attach entity to player
obj:set_attach(player)
check_log({})
assert(obj:get_attach() == player)
obj:set_detach()
check_log({"on_detach(player)"})
assert(obj:get_attach() == nil)
obj:remove()
end
unittests.register("test_entity_attach", test_entity_attach, {player=true, map=true})
---------
core.register_entity("unittests:dummy", {
initial_properties = {
hp_max = 1,

View file

@ -3,7 +3,7 @@ unittests = {}
core.log("info", "Hello World")
unittests.custom_metatable = {}
core.register_async_metatable("unittests:custom_metatable", unittests.custom_metatable)
core.register_portable_metatable("unittests:custom_metatable", unittests.custom_metatable)
local function do_tests()
assert(core == minetest)

View file

@ -84,3 +84,25 @@ local function run_player_add_pos_tests(player)
end
unittests.register("test_player_add_pos", run_player_add_pos_tests, {player=true})
--
-- Hotbar selection clamp
--
local function run_player_hotbar_clamp_tests(player)
local inv = player:get_inventory()
local old_inv_size = inv:get_size("main")
local old_inv_list = inv:get_list("main") -- Avoid accidentally removing item
local old_bar_size = player:hud_get_hotbar_itemcount()
inv:set_size("main", 5)
player:hud_set_hotbar_itemcount(2)
assert(player:hud_get_hotbar_itemcount() == 2)
player:hud_set_hotbar_itemcount(6)
assert(player:hud_get_hotbar_itemcount() == 5)
inv:set_size("main", old_inv_size)
inv:set_list("main", old_inv_list)
player:hud_set_hotbar_itemcount(old_bar_size)
end
unittests.register("test_player_hotbar_clamp", run_player_hotbar_clamp_tests, {player=true})

View file

@ -45,9 +45,12 @@
#include <X11/Xcursor/Xcursor.h>
#endif
#if defined(_IRR_COMPILE_WITH_X11_) || defined(_IRR_COMPILE_WITH_JOYSTICK_EVENTS_)
#include <unistd.h>
#endif
#if defined _IRR_COMPILE_WITH_JOYSTICK_EVENTS_
#include <fcntl.h>
#include <unistd.h>
#ifdef __FreeBSD__
#include <sys/joystick.h>

View file

@ -343,6 +343,12 @@ CIrrDeviceSDL::CIrrDeviceSDL(const SIrrlichtCreationParameters &param) :
SDL_SetHint(SDL_HINT_APP_NAME, "Minetest");
#endif
// Set IME hints
SDL_SetHint(SDL_HINT_IME_INTERNAL_EDITING, "1");
#if defined(SDL_HINT_IME_SHOW_UI)
SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");
#endif
u32 flags = SDL_INIT_TIMER | SDL_INIT_EVENTS;
if (CreationParams.DriverType != video::EDT_NULL)
flags |= SDL_INIT_VIDEO;

View file

@ -3018,7 +3018,7 @@ IImage *COpenGLDriver::createScreenShot(video::ECOLOR_FORMAT format, video::E_RE
if (newImage)
pixels = static_cast<u8 *>(newImage->getData());
if (pixels) {
glReadBuffer(GL_FRONT);
glReadBuffer(Params.Doublebuffer ? GL_BACK : GL_FRONT);
glReadPixels(0, 0, ScreenSize.Width, ScreenSize.Height, fmt, type, pixels);
testGLError(__LINE__);
glReadBuffer(GL_BACK);

View file

@ -107,6 +107,7 @@ static const VertexType &getVertexTypeDescription(E_VERTEX_TYPE type)
return vtTangents;
default:
assert(false);
CODE_UNREACHABLE();
}
}

View file

@ -10,6 +10,22 @@
#include "ILogger.h"
#include "ITimer.h"
// CODE_UNREACHABLE(): Invokes undefined behavior for unreachable code optimization
#if defined(__cpp_lib_unreachable)
#include <utility>
#define CODE_UNREACHABLE() std::unreachable()
#elif defined(__has_builtin)
#if __has_builtin(__builtin_unreachable)
#define CODE_UNREACHABLE() __builtin_unreachable()
#endif
#elif defined(_MSC_VER)
#define CODE_UNREACHABLE() __assume(false)
#endif
#ifndef CODE_UNREACHABLE
#define CODE_UNREACHABLE() (void)0
#endif
namespace irr
{

View file

@ -116,7 +116,7 @@
# type: bool
# virtual_joystick_triggers_aux1 = false
# The gesture for for punching players/entities.
# The gesture for punching players/entities.
# This can be overridden by games and mods.
#
# * short_tap
@ -707,6 +707,11 @@
# type: string
# contentdb_url = https://content.minetest.net
# If enabled and you have ContentDB packages installed, Minetest may contact ContentDB to
# check for package updates when opening the mainmenu.
# type: bool
# contentdb_enable_updates_indicator = true
# Comma-separated list of flags to hide in the content repository.
# "nonfree" can be used to hide packages which do not qualify as 'free software',
# as defined by the Free Software Foundation.
@ -740,7 +745,7 @@
# type: bool
# enable_split_login_register = true
# URL to JSON file which provides information about the newest Minetest release
# URL to JSON file which provides information about the newest Minetest release.
# If this is empty the engine will never check for updates.
# type: string
# update_information_url = https://www.minetest.net/release_info.json

View file

@ -149,6 +149,6 @@
<update_contact>celeron55@gmail.com</update_contact>
<releases>
<release date="2023-12-04" version="5.8.0"/>
<release date="2024-08-11" version="5.9.0"/>
</releases>
</component>

View file

@ -3,16 +3,16 @@ msgstr ""
"Project-Id-Version: Czech (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-11 15:14+0200\n"
"PO-Revision-Date: 2023-06-19 10:48+0000\n"
"Last-Translator: Robinson <simekm@yahoo.com>\n"
"PO-Revision-Date: 2024-08-02 22:09+0000\n"
"Last-Translator: Honzapkcz <honzapkc@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/minetest/minetest/"
"cs/>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 4.18.1\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"X-Generator: Weblate 5.7-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@ -187,7 +187,7 @@ msgstr "Stahuji..."
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Error getting dependencies for package"
msgstr ""
msgstr "Chyba získávání závislostí balíčku"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Games"
@ -230,7 +230,7 @@ msgstr "Balíčky textur"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "The package $1 was not found."
msgstr ""
msgstr "Balíček $1 nebyl nalezen."
#: builtin/mainmenu/content/dlg_contentdb.lua builtin/mainmenu/tab_content.lua
msgid "Uninstall"
@ -250,7 +250,7 @@ msgstr "Zobrazit více informací v prohlížeči"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "You need to install a game before you can install a mod"
msgstr ""
msgstr "Musíš nainstalovat hru před tím než budeš moct instalovat mod"
#: builtin/mainmenu/content/dlg_install.lua
msgid "$1 and $2 dependencies will be installed."
@ -465,7 +465,7 @@ msgstr "Dekorace"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Desert temples"
msgstr ""
msgstr "Pouštní chrámy"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Development Test is meant for developers."
@ -476,6 +476,8 @@ msgid ""
"Different dungeon variant generated in desert biomes (only if dungeons "
"enabled)"
msgstr ""
"Různé varianty žalářů generované v pouštních biomech (pouze když jsou žaláře "
"povoleny)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@ -671,7 +673,7 @@ msgstr "Registrovat"
#: builtin/mainmenu/dlg_reinstall_mtg.lua
msgid "Dismiss"
msgstr ""
msgstr "Odmítnout"
#: builtin/mainmenu/dlg_reinstall_mtg.lua
msgid ""
@ -679,16 +681,20 @@ msgid ""
"\"Minetest Game\". Since Minetest 5.8.0, Minetest ships without a default "
"game."
msgstr ""
"Po dlouhou dobu, Minetest engine byl dodáván s výchozí hrou „Minetest hra“. "
"Od verze 5.8.0 už Minetest s touto hrou dodáván není."
#: builtin/mainmenu/dlg_reinstall_mtg.lua
msgid ""
"If you want to continue playing in your Minetest Game worlds, you need to "
"reinstall Minetest Game."
msgstr ""
"Pokud chceš pokračovat v hraní tvých světů Menetest Hry, tak si ji musíš "
"přeinstalovat."
#: builtin/mainmenu/dlg_reinstall_mtg.lua
msgid "Minetest Game is no longer installed by default"
msgstr ""
msgstr "Minetest Hra už není instalována jako výchozí"
#: builtin/mainmenu/dlg_reinstall_mtg.lua
#, fuzzy
@ -841,11 +847,11 @@ msgstr "vyhlazení"
#: builtin/mainmenu/settings/dlg_settings.lua
msgid "(Use system language)"
msgstr ""
msgstr "(Použít jazyk systému)"
#: builtin/mainmenu/settings/dlg_settings.lua
msgid "Accessibility"
msgstr ""
msgstr "Přístupnost"
#: builtin/mainmenu/settings/dlg_settings.lua
msgid "Back"
@ -881,7 +887,7 @@ msgstr "Obnovit výchozí"
#: builtin/mainmenu/settings/dlg_settings.lua
msgid "Reset setting to default ($1)"
msgstr ""
msgstr "Vrátit nastavení do původního stavu ($1)"
#: builtin/mainmenu/settings/dlg_settings.lua builtin/mainmenu/tab_online.lua
msgid "Search"
@ -889,7 +895,7 @@ msgstr "Vyhledat"
#: builtin/mainmenu/settings/dlg_settings.lua
msgid "Show advanced settings"
msgstr ""
msgstr "Zobrazit pokročilé nastavení"
#: builtin/mainmenu/settings/dlg_settings.lua
msgid "Show technical names"
@ -909,11 +915,11 @@ msgstr "Obsah: mody"
#: builtin/mainmenu/settings/shadows_component.lua
msgid "(The game will need to enable shadows as well)"
msgstr ""
msgstr "(Hra bude muset také povolit stíny)"
#: builtin/mainmenu/settings/shadows_component.lua
msgid "Custom"
msgstr ""
msgstr "Vlastní"
#: builtin/mainmenu/settings/shadows_component.lua
msgid "Disabled"
@ -966,7 +972,7 @@ msgstr "Hlavní členové týmu"
#: builtin/mainmenu/tab_about.lua
msgid "Irrlicht device:"
msgstr ""
msgstr "Irrlicht zařízení:"
#: builtin/mainmenu/tab_about.lua
msgid "Open User Data Directory"
@ -1073,7 +1079,7 @@ msgstr "Instalovat hry z ContentDB"
#: builtin/mainmenu/tab_local.lua
msgid "Minetest doesn't come with a game by default."
msgstr ""
msgstr "Minetest není dodáván s výchozí hrou."
#: builtin/mainmenu/tab_local.lua
msgid ""
@ -1115,7 +1121,7 @@ msgstr "Spuštění hry"
#: builtin/mainmenu/tab_local.lua
msgid "You need to install a game before you can create a world."
msgstr ""
msgstr "Musíš si nainstalovat hru před tím než si můžeš vytvořit svět."
#: builtin/mainmenu/tab_online.lua
msgid "Address"
@ -1675,7 +1681,7 @@ msgstr "Vymazat"
#: src/client/keycode.cpp
msgid "Down Arrow"
msgstr ""
msgstr "Šipka Dolů"
#: src/client/keycode.cpp
msgid "End"
@ -1911,7 +1917,7 @@ msgstr "Tabulátor"
#: src/client/keycode.cpp
msgid "Up Arrow"
msgstr ""
msgstr "Šipka Nahoru"
#: src/client/keycode.cpp
msgid "X Button 1"
@ -1951,7 +1957,7 @@ msgstr "Nepodařilo se otevřít webovou stránku"
#: src/client/shader.cpp
msgid "Shaders are enabled but GLSL is not supported by the driver."
msgstr ""
msgstr "Shadery jsou povoleny ale GLSL není podporovaný driverem."
#. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3"
#: src/content/mod_configuration.cpp
@ -2147,11 +2153,11 @@ msgstr "stiskni klávesu"
#: src/gui/guiOpenURL.cpp
msgid "Open"
msgstr ""
msgstr "Otevřít"
#: src/gui/guiOpenURL.cpp
msgid "Open URL?"
msgstr ""
msgstr "Otevřít odkaz?"
#: src/gui/guiOpenURL.cpp
#, fuzzy
@ -2279,7 +2285,7 @@ msgstr "2D šum, který umisťuje říční koryta a kanály."
#: src/settings_translation_file.cpp
msgid "3D"
msgstr ""
msgstr "3D"
#: src/settings_translation_file.cpp
msgid "3D clouds"
@ -2445,7 +2451,7 @@ msgstr "Pokročilé"
#: src/settings_translation_file.cpp
msgid "Allows liquids to be translucent."
msgstr ""
msgstr "Povolí průhledné kapaliny."
#: src/settings_translation_file.cpp
msgid ""
@ -2866,6 +2872,9 @@ msgid ""
"Comma-separated list of AL and ALC extensions that should not be used.\n"
"Useful for testing. See al_extensions.[h,cpp] for details."
msgstr ""
"Čárkou oddělený seznam všech AL a ALC rozšíření které by něměly být použity."
"\n"
"Užitečné pro testování. Podívejte se do al_extensions.[h,cpp] pro detaily."
#: src/settings_translation_file.cpp
msgid ""

View file

@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: German (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-11 15:14+0200\n"
"PO-Revision-Date: 2024-02-21 17:02+0000\n"
"Last-Translator: sfan5 <sfan5@live.de>\n"
"PO-Revision-Date: 2024-07-12 14:09+0000\n"
"Last-Translator: Wuzzy <Wuzzy@disroot.org>\n"
"Language-Team: German <https://hosted.weblate.org/projects/minetest/minetest/"
"de/>\n"
"Language: de\n"
@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5-dev\n"
"X-Generator: Weblate 5.7-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@ -71,9 +71,8 @@ msgid "Command not available: "
msgstr "Befehl nicht verfügbar: "
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "Get help for commands (-t: output in chat)"
msgstr "Hilfe für Befehle erhalten"
msgstr "Hilfe für Befehle erhalten (-t: Ausgabe im Chat)"
#: builtin/common/chatcommands.lua
msgid ""
@ -83,9 +82,8 @@ msgstr ""
"all“ benutzen, um alles aufzulisten."
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "[all | <cmd>] [-t]"
msgstr "[all | <Befehl>]"
msgstr "[all | <Befehl>] [-t]"
#: builtin/fstk/ui.lua
msgid "<none available>"
@ -148,13 +146,12 @@ msgid "Failed to download $1"
msgstr "Fehler beim Download von $1"
#: builtin/mainmenu/content/contentdb.lua
#, fuzzy
msgid ""
"Failed to extract \"$1\" (insufficient disk space, unsupported file type or "
"broken archive)"
msgstr ""
"Fehler beim Extrahieren von „$1“ (nicht unterstützter Dateityp oder kaputtes "
"Archiv)"
"Fehler beim Extrahieren von „$1“ (unzureichender Speicherplatz, nicht "
"unterstützter Dateityp oder kaputtes Archiv)"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid ""
@ -187,7 +184,7 @@ msgstr "Herunterladen …"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Error getting dependencies for package"
msgstr ""
msgstr "Fehler beim Holen der Abhängigkeiten für Paket"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Games"
@ -467,7 +464,7 @@ msgstr "Dekorationen"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Desert temples"
msgstr ""
msgstr "Wüstentempel"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Development Test is meant for developers."
@ -478,6 +475,8 @@ msgid ""
"Different dungeon variant generated in desert biomes (only if dungeons "
"enabled)"
msgstr ""
"Andere Verliesvariante, die in Wüstenbiomen generiert wird (nur, wenn "
"Verliese aktiviert sind)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@ -1075,15 +1074,16 @@ msgid "Install games from ContentDB"
msgstr "Spiele aus ContentDB installieren"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "Minetest doesn't come with a game by default."
msgstr "Minetest Game ist nicht länger standardmäßig installiert"
msgstr "Minetest wird standardmäßig nicht mehr mit einem Spiel ausgeliefert."
#: builtin/mainmenu/tab_local.lua
msgid ""
"Minetest is a game-creation platform that allows you to play many different "
"games."
msgstr ""
"Minetest ist eine Spielerschaffungsplattform, welche es Ihnen ermöglicht, "
"viele verschiedene Spiele zu spielen."
#: builtin/mainmenu/tab_local.lua
msgid "New"
@ -1118,10 +1118,9 @@ msgid "Start Game"
msgstr "Spiel starten"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "You need to install a game before you can create a world."
msgstr ""
"Sie müssen ein Spiel installieren, bevor Sie eine Mod installieren können"
"Sie müssen ein Spiel installieren, bevor Sie eine Welt erstellen können."
#: builtin/mainmenu/tab_online.lua
msgid "Address"
@ -1336,7 +1335,6 @@ msgid "Continue"
msgstr "Weiter"
#: src/client/game.cpp
#, fuzzy
msgid ""
"Controls:\n"
"No menu open:\n"
@ -1354,8 +1352,8 @@ msgstr ""
"Steuerung:\n"
"Kein Menü sichtbar:\n"
"- Finger wischen: Umsehen\n"
"- Antippen: Platzieren/benutzen\n"
"- Langes antippen: Graben/schlagen/benutzen\n"
"- Antippen: Platzieren/schlagen/benutzen (Standard)\n"
"- Langes antippen: Graben/benutzen (Standard)\n"
"Menü/Inventar offen:\n"
"- Doppelt antippen (außerhalb):\n"
" --> schließen\n"
@ -1435,9 +1433,8 @@ msgid "Fog enabled"
msgstr "Nebel aktiviert"
#: src/client/game.cpp
#, fuzzy
msgid "Fog enabled by game or mod"
msgstr "Zoom ist momentan von Spiel oder Mod deaktiviert"
msgstr "Nebel von Spiel oder Mod aktiviert"
#: src/client/game.cpp
msgid "Game info:"
@ -1940,13 +1937,13 @@ msgid "Minimap in texture mode"
msgstr "Übersichtskarte im Texturmodus"
#: src/client/shader.cpp
#, fuzzy, c-format
#, c-format
msgid "Failed to compile the \"%s\" shader."
msgstr "Fehler beim Öffnen der Webseite"
msgstr "Fehler beim Kompilieren des „%s“-Shaders."
#: src/client/shader.cpp
msgid "Shaders are enabled but GLSL is not supported by the driver."
msgstr ""
msgstr "Shader sind aktiviert, aber GLSL wird vom Treiber nicht unterstützt."
#. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3"
#: src/content/mod_configuration.cpp
@ -2143,16 +2140,15 @@ msgstr "Taste drücken"
#: src/gui/guiOpenURL.cpp
msgid "Open"
msgstr ""
msgstr "Öffnen"
#: src/gui/guiOpenURL.cpp
msgid "Open URL?"
msgstr ""
msgstr "URL öffnen?"
#: src/gui/guiOpenURL.cpp
#, fuzzy
msgid "Unable to open URL"
msgstr "Fehler beim Öffnen der Webseite"
msgstr "URL konnte nicht geöffnet werden"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
@ -2458,7 +2454,7 @@ msgstr "Erweitert"
#: src/settings_translation_file.cpp
msgid "Allows liquids to be translucent."
msgstr ""
msgstr "Erlaubt Flüssigkeiten, transluzent zu sein."
#: src/settings_translation_file.cpp
msgid ""
@ -2530,6 +2526,14 @@ msgid ""
"With OpenGL ES, dithering only works if the shader supports high\n"
"floating-point precision and it may have a higher performance impact."
msgstr ""
"Dithering anwenden, um Artefakte beim Color-Banding zu reduzieren.\n"
"Dithering erhöht die Größe der verlustfrei komprimierten Bildschirmfotos\n"
"signifikant und es funktioniert nicht richtig, falls die Anzeige oder das\n"
"Betriebssystem zusätzliches Dithering anwendet oder, falls die Farbkanäle\n"
"nicht auf 8 Bits quantisiert sind.\n"
"Mit OpenGL ES funktioniert Dithering nur, falls der Shader eine hohe\n"
"Fließkommazahlenpräzision unterstützt, und das könnte zu höheren\n"
"Einbußen bei der Performanz führen."
#: src/settings_translation_file.cpp
msgid "Arm inertia"
@ -2548,7 +2552,6 @@ msgid "Ask to reconnect after crash"
msgstr "Abfrage zum Neuverbinden nach Absturz"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"At this distance the server will aggressively optimize which blocks are sent "
"to\n"
@ -2564,15 +2567,14 @@ msgstr ""
"aggressiv\n"
"optimieren.\n"
"Kleine Werte werden die Performanz möglicherweise stark erhöhen, auf\n"
"Kosten von sichtbaren Renderfehlern (einige Blöcke werden nicht unter dem "
"Wasser\n"
"und in Höhlen gerendert, sowie manchmal auf dem Land).\n"
"Kosten von sichtbaren Renderfehlern (einige Blöcke können eventuell in "
"Höhlen\n"
"nicht korrekt gerendert werden).\n"
"Wird dieser Wert auf eine Zahl größer als max_block_send_distance gesetzt,\n"
"wird diese Optimierung deaktiviert.\n"
"In Kartenblöcken (16 Blöcke) angegeben."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"At this distance the server will perform a simpler and cheaper occlusion "
"check.\n"
@ -2582,15 +2584,11 @@ msgid ""
"This is especially useful for very large viewing range (upwards of 500).\n"
"Stated in MapBlocks (16 nodes)."
msgstr ""
"In dieser Distanz wird der Server die zu den Clients gesendeten Blöcke "
"aggressiv\n"
"optimieren.\n"
"In dieser Distanz wird der Server einen einfacheren und günstigeren\n"
"Occlusion-Check machen.\n"
"Kleine Werte werden die Performanz möglicherweise stark erhöhen, auf\n"
"Kosten von sichtbaren Renderfehlern (einige Blöcke werden nicht unter dem "
"Wasser\n"
"und in Höhlen gerendert, sowie manchmal auf dem Land).\n"
"Wird dieser Wert auf eine Zahl größer als max_block_send_distance gesetzt,\n"
"wird diese Optimierung deaktiviert.\n"
"Kosten von sichtbaren Renderfehlern (fehlende Blöcke).\n"
"Dies ist besonders nützlich für eine hohe Sichtweite (über 500).\n"
"In Kartenblöcken (16 Blöcke) angegeben."
#: src/settings_translation_file.cpp
@ -2654,9 +2652,8 @@ msgid "Biome noise"
msgstr "Biomrauschen"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Block cull optimize distance"
msgstr "Distanz für Sendeoptimierungen von Kartenblöcken"
msgstr "Block-Cull-Optimierungsdistanz"
#: src/settings_translation_file.cpp
msgid "Block send optimize distance"
@ -2879,6 +2876,9 @@ msgid ""
"Comma-separated list of AL and ALC extensions that should not be used.\n"
"Useful for testing. See al_extensions.[h,cpp] for details."
msgstr ""
"Kommagetrennte Liste von AL- und ALC-Erweiterungen, welche nicht\n"
"benutzt werden sollen. Nützlich zum Testen. Siehe al_extensions.[h,cpp]\n"
"für Details."
#: src/settings_translation_file.cpp
msgid ""
@ -3106,7 +3106,6 @@ msgstr ""
"aber dies verbraucht auch mehr Ressourcen."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Define the oldest clients allowed to connect.\n"
"Older clients are compatible in the sense that they will not crash when "
@ -3118,12 +3117,18 @@ msgid ""
"Minetest still enforces its own internal minimum, and enabling\n"
"strict_protocol_version_checking will effectively override this."
msgstr ""
"Aktivieren, um alten Clients die Verbindung zu verwehren.\n"
"Hier festlegen, welches die ältesten Clients sind, die sich verbinden dürfen."
"\n"
"Ältere Clients sind kompatibel in der Hinsicht, dass sie beim Verbinden zu "
"neuen\n"
"Servern nicht abstürzen, aber sie könnten nicht alle neuen Funktionen, die "
"Sie\n"
"erwarten, unterstützen."
"erwarten, unterstützen.\n"
"Das ermöglicht eine genauere Kontrolle als strict_protocol_version_checking."
"\n"
"Minetest wird immer noch ein internes Minimum erzwingen, und die "
"Aktivierung\n"
"von strict_protocol_version_checking wird dies überschreiben."
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@ -3335,9 +3340,8 @@ msgid "Enable Bloom Debug"
msgstr "Bloom-Debug aktivieren"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Debanding"
msgstr "Schaden einschalten"
msgstr "Debanding aktivieren"
#: src/settings_translation_file.cpp
msgid ""
@ -3366,9 +3370,8 @@ msgstr ""
"erzeugen. Ansonsten wird die PCF-Filterung benutzt."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Post Processing"
msgstr "Nachbearbeitung"
msgstr "Nachbearbeitung aktivieren"
#: src/settings_translation_file.cpp
msgid "Enable Raytraced Culling"
@ -3421,9 +3424,8 @@ msgstr ""
"Mausradscrollen für die Gegenstandsauswahl in der Schnellleiste aktivieren."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable random mod loading (mainly used for testing)."
msgstr "Schaltet zufällige Steuerung ein (nur zum Testen verwendet)."
msgstr "Schaltet zufälliges Modladen ein (nur zum Testen verwendet)."
#: src/settings_translation_file.cpp
msgid "Enable random user input (only used for testing)."
@ -3457,9 +3459,8 @@ msgstr ""
"erwarten, unterstützen."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable touchscreen"
msgstr "Touchscreen"
msgstr "Touchscreen aktivieren"
#: src/settings_translation_file.cpp
msgid ""
@ -3518,16 +3519,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Enables debug and error-checking in the OpenGL driver."
msgstr ""
msgstr "Aktiviert Debug und Fehlerprüfungen im OpenGL-Treiber."
#: src/settings_translation_file.cpp
msgid "Enables the post processing pipeline."
msgstr ""
msgstr "Aktiviert die Nachbearbeitungspipeline."
#: src/settings_translation_file.cpp
msgid ""
"Enables touchscreen mode, allowing you to play the game with a touchscreen."
msgstr ""
"Aktiviert den Touchscreenmodus. Damit können Sie das Spiel mit einem "
"Touchscreen spielen."
#: src/settings_translation_file.cpp
msgid ""
@ -4498,16 +4501,16 @@ msgstr ""
"- Opaque: Transparenz deaktivieren"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Length of a server tick (the interval at which everything is generally "
"updated),\n"
"stated in seconds.\n"
"Does not apply to sessions hosted from the client menu."
msgstr ""
"Länge eines Servertakts und dem Zeitintervall, in dem Objekte über das "
"Netzwerk\n"
"üblicherweise aktualisiert werden; in Sekunden angegeben."
"Länge eines Servertakts (dem Intervall, wo grundsätzlich alles aktualisiert "
"wird),\n"
"in Sekunden.\n"
"Wirkt sich nicht auf Sitzungen aus, die vom Clientmenü gestartet wurden."
#: src/settings_translation_file.cpp
msgid "Length of liquid waves."
@ -4738,7 +4741,6 @@ msgid "Map generation attributes specific to Mapgen v5."
msgstr "Kartengenerierungsattribute speziell für den Kartengenerator v5."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"The 'snowbiomes' flag enables the new 5 biome system.\n"
@ -4750,7 +4752,11 @@ msgstr ""
"Kartengenerierungsattribute speziell für den Kartengenerator v6.\n"
"Das Flag „snowbiomes“ aktiviert das neue 5-Biom-System.\n"
"Falls das „snowbiomes“-Flag aktiviert ist, werden Dschungel automatisch "
"aktiviert und das „jungles“-Flag wird ignoriert."
"aktiviert und\n"
"das „jungles“-Flag wird ignoriert.\n"
"Das „temples“-Flag deaktiviert die Erzeugung von Wüstentempeln. Stattdessen "
"werden\n"
"normale Verliese auftauchen."
#: src/settings_translation_file.cpp
msgid ""
@ -5070,9 +5076,8 @@ msgid "Minimap scan height"
msgstr "Abtasthöhe der Übersichtskarte"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Minimum dig repetition interval"
msgstr "Bauen-Wiederholungsrate"
msgstr "Minimale Grabungswiederholungsrate"
#: src/settings_translation_file.cpp
msgid "Minimum limit of random number of large caves per mapchunk."
@ -5143,9 +5148,8 @@ msgid "Mouse sensitivity multiplier."
msgstr "Faktor für die Mausempfindlichkeit."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Movement threshold"
msgstr "Hohlraumschwellwert"
msgstr "Bewegungsschwellwert"
#: src/settings_translation_file.cpp
msgid "Mud noise"
@ -5307,9 +5311,8 @@ msgstr ""
"Wird nicht pausieren, wenn ein Formspec geöffnet ist."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "OpenGL debug"
msgstr "Kartengenerator-Debugging"
msgstr "OpenGL-Debug"
#: src/settings_translation_file.cpp
msgid "Optional override for chat weblink color."
@ -5447,13 +5450,12 @@ msgid "Proportion of large caves that contain liquid."
msgstr "Anteil der großen Höhlen, die eine Flüssigkeit enthalten."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Protocol version minimum"
msgstr "Protokollversion stimmt nicht überein. "
msgstr "Protokollversionsminimum"
#: src/settings_translation_file.cpp
msgid "Punch gesture"
msgstr ""
msgstr "Schlaggeste"
#: src/settings_translation_file.cpp
msgid ""
@ -5475,7 +5477,7 @@ msgstr "Zufällige Steuerung"
#: src/settings_translation_file.cpp
msgid "Random mod load order"
msgstr ""
msgstr "Zufällige Modladereihenfolge"
#: src/settings_translation_file.cpp
msgid "Recent Chat Messages"
@ -5689,7 +5691,6 @@ msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "Siehe https://www.sqlite.org/pragma.html#pragma_synchronous"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Select the antialiasing method to apply.\n"
"\n"
@ -5715,9 +5716,10 @@ msgstr ""
"* None Keine Kantenglättung (Standard)\n"
"\n"
"* FSAA Von der Hardware bereitgestellte Vollbildkantenglättung (nicht\n"
"kompatibel mit Shadern), auch bekannt als Multi-Sample Antialiasing (MSAA).\n"
"Glättet Blockkanten aus, beeinträchtigt aber nicht die Innenseiten der "
"Texturen.\n"
"kompatibel mit Nachbearbeitung und Unterabtastung), auch bekannt\n"
"als Multi-Sample Antialiasing (MSAA). Glättet Blockkanten aus, "
"beeinträchtigt\n"
"aber nicht die Innenseiten der Texturen.\n"
"Um diese Option zu ändern, ist ein Neustart erforderlich.\n"
"\n"
"* FXAA Schnelle annähende Kantenglättung (benötigt Shader).\n"
@ -5727,7 +5729,7 @@ msgstr ""
"Bildqualität.\n"
"\n"
"* SSAA Super-Sampling-Kantenglättung (benötigt Shader).\n"
"Rendert ein hochauflösendes Bild der Szene, dann skaliert es nach unten, um\n"
"Rendert ein hochauflösendes Bild der Szene, dann skaliert es herunter, um\n"
"die Aliasing-Effekte zu reduzieren. Dies ist die langsamste und genaueste "
"Methode."
@ -5858,12 +5860,11 @@ msgstr ""
"Wertebereich: von -1 zu 1.0"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Set the language. By default, the system language is used.\n"
"A restart is required after changing this."
msgstr ""
"Setzt die Sprache. Leer lassen, um Systemsprache zu verwenden.\n"
"Setzt die Sprache. Standardmäßig wird die Systemsprache zu verwendet.\n"
"Nach Änderung ist ein Neustart erforderlich."
#: src/settings_translation_file.cpp
@ -5910,6 +5911,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Set to true to enable volumetric lighting effect (a.k.a. \"Godrays\")."
msgstr ""
"Auf wahr setzen, um volumetrische Lichteffekte zu aktivieren (auch bekannt "
"als „Gottesstrahlen“/„Godrays“)."
#: src/settings_translation_file.cpp
msgid "Set to true to enable waving leaves."
@ -5955,7 +5958,6 @@ msgid "Shaders"
msgstr "Shader"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Shaders allow advanced visual effects and may increase performance on some "
"video\n"
@ -5963,8 +5965,7 @@ msgid ""
msgstr ""
"Shader ermöglichen fortgeschrittene visuelle Effekte und können die "
"Performanz auf\n"
"einigen Grafikkarten erhöhen.\n"
"Das funktioniert nur mit dem OpenGL-Grafik-Backend."
"einigen Grafikkarten erhöhen."
#: src/settings_translation_file.cpp
msgid "Shadow filter quality"
@ -6085,13 +6086,12 @@ msgid "Smooth lighting"
msgstr "Weiches Licht"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Smooths rotation of camera when in cinematic mode, 0 to disable. Enter "
"cinematic mode by using the key set in Controls."
msgstr ""
"Glättet die Rotation der Kamera im Filmmodus. 0 zum Ausschalten.\n"
"Der Filmmodus kann aktiviert werden, indem die entsprechende Taste in der "
"Glättet die Rotation der Kamera im Filmmodus. 0 zum Ausschalten. Der "
"Filmmodus kann aktiviert werden, indem die entsprechende Taste in der "
"Tastenbelegung benutzt wird."
#: src/settings_translation_file.cpp
@ -6119,9 +6119,8 @@ msgid "Sound"
msgstr "Ton"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Sound Extensions Blacklist"
msgstr "ContentDB: Schwarze Liste"
msgstr "Schwarze Liste der Sounderweiterungen"
#: src/settings_translation_file.cpp
msgid ""
@ -6336,6 +6335,8 @@ msgid ""
"The delay in milliseconds after which a touch interaction is considered a "
"long tap."
msgstr ""
"Die Verzögerung in Millisekunden, nachdem eine Berührungsinteraktion als "
"langes Antippen zählt."
#: src/settings_translation_file.cpp
msgid ""
@ -6355,18 +6356,27 @@ msgid ""
"Known from the classic Minetest mobile controls.\n"
"Combat is more or less impossible."
msgstr ""
"Die Geste für für das Schlagen von Spielern/Entitys.\n"
"Dies kann von Spielen und Mods überschrieben werden.\n"
"\n"
"* short_tap\n"
"Leicht zu benutzen und bekannt von anderen Spielen, die nicht genannt werden "
"sollen.\n"
"\n"
"* long_tap\n"
"Bekannt aus der klassischen Mineteststeuerung für mobile Endgeräte.\n"
"Der Kampf ist mehr oder weniger unmöglich."
#: src/settings_translation_file.cpp
msgid "The identifier of the joystick to use"
msgstr "Die Kennung des zu verwendeten Joysticks"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The length in pixels after which a touch interaction is considered movement."
msgstr ""
"Die Länge in Pixeln, die benötigt wird, damit die Touchscreen-Interaktion "
"beginnt."
"Die Länge in Pixeln, die benötigt wird, damit die Touch-Interaktion als "
"Bewegung zählt."
#: src/settings_translation_file.cpp
msgid ""
@ -6381,13 +6391,13 @@ msgstr ""
"Standard ist 1.0 (1/2 Block)."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The minimum time in seconds it takes between digging nodes when holding\n"
"the dig button."
msgstr ""
"Die Zeit in Sekunden, in dem die Blockplatzierung wiederholt wird, wenn\n"
"die Bautaste gedrückt gehalten wird."
"Die minimale Zeit in Sekunden, die zwischen dem Graben von Blöcken benötigt "
"wird,\n"
"wenn die Grabetaste gedrückt gehalten wird."
#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
@ -6421,7 +6431,6 @@ msgstr ""
"konfiguriert werden."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The rendering back-end.\n"
"Note: A restart is required after changing this!\n"
@ -6432,7 +6441,7 @@ msgstr ""
"Anmerkung: Ein Neustart ist nach einer Änderung notwendig!\n"
"Auf Desktopsystemen ist OpenGL die Standardeinstellung. Bei Android ist "
"OGLES2 die Standardeinstellung.\n"
"Shader werden unter OpenGL und OGLES2 (experimentell) unterstützt."
"Shader werden von allem außer OGLES1 unterstützt."
#: src/settings_translation_file.cpp
msgid ""
@ -6515,7 +6524,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Threshold for long taps"
msgstr ""
msgstr "Schwelle für langes Antippen"
#: src/settings_translation_file.cpp
msgid ""
@ -6578,9 +6587,8 @@ msgid "Tradeoffs for performance"
msgstr "Kompromisse für Performanz"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Translucent liquids"
msgstr "Undurchsichtige Flüssigkeiten"
msgstr "Transluzente Flüssigkeiten"
#: src/settings_translation_file.cpp
msgid "Transparency Sorting Distance"
@ -6629,14 +6637,14 @@ msgstr ""
"haben."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"URL to JSON file which provides information about the newest Minetest "
"release\n"
"If this is empty the engine will never check for updates."
msgstr ""
"URL zu einer JSON-Datei, welche Informationen über das neueste Minetest-"
"Release enthält"
"Release enthält\n"
"Wenn dies leer ist, wird die Engine nie nach Updates suchen."
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
@ -6856,7 +6864,7 @@ msgstr "Tonlautstärke"
#: src/settings_translation_file.cpp
msgid "Volume multiplier when the window is unfocused."
msgstr ""
msgstr "Lautstärkenfaktor, wenn das Fenster nicht im Fokus steht."
#: src/settings_translation_file.cpp
msgid ""
@ -6867,14 +6875,12 @@ msgstr ""
"Dafür muss das Tonsystem aktiviert sein."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Volume when unfocused"
msgstr "Bildwiederholrate wenn Fenster im Hintergrund/Spiel pausiert"
msgstr "Lautstärke außerhalb Fokus"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Volumetric lighting"
msgstr "Weiches Licht"
msgstr "Volumetrisches Licht"
#: src/settings_translation_file.cpp
msgid ""

View file

@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: Spanish (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-11 15:14+0200\n"
"PO-Revision-Date: 2024-06-09 15:09+0000\n"
"Last-Translator: SergioFLS <sergioflsgd@hotmail.com>\n"
"PO-Revision-Date: 2024-07-14 21:23+0000\n"
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/minetest/"
"minetest/es/>\n"
"Language: es\n"
@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6-dev\n"
"X-Generator: Weblate 5.7-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@ -71,9 +71,8 @@ msgid "Command not available: "
msgstr "Comando no disponible: "
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "Get help for commands (-t: output in chat)"
msgstr "Obtener ayuda para los comandos"
msgstr "Obtener ayuda para los comandos (-t: salida en el chat)"
#: builtin/common/chatcommands.lua
msgid ""
@ -83,9 +82,8 @@ msgstr ""
"todo."
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "[all | <cmd>] [-t]"
msgstr "[todo | <cmd>]"
msgstr "[all | <cmd>] [-t]"
#: builtin/fstk/ui.lua
msgid "<none available>"
@ -148,12 +146,12 @@ msgid "Failed to download $1"
msgstr "Fallo al descargar $1"
#: builtin/mainmenu/content/contentdb.lua
#, fuzzy
msgid ""
"Failed to extract \"$1\" (insufficient disk space, unsupported file type or "
"broken archive)"
msgstr ""
"Fallo al extraer \"$1\" (Formato de archivo no soportado o archivo corrupto)"
"No se pudo extraer \"$1\" (espacio en disco insuficiente, tipo de archivo no "
"compatible o archivo dañado)"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid ""
@ -186,7 +184,7 @@ msgstr "Descargando..."
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Error getting dependencies for package"
msgstr ""
msgstr "Error obteniendo dependencias para el paquete"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Games"
@ -466,7 +464,7 @@ msgstr "Decoraciones"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Desert temples"
msgstr ""
msgstr "Templos del desierto"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Development Test is meant for developers."
@ -477,6 +475,8 @@ msgid ""
"Different dungeon variant generated in desert biomes (only if dungeons "
"enabled)"
msgstr ""
"Variante de mazmorras diferente generada en biomas de desierto (solo si las "
"mazmorras están activadas)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@ -1073,15 +1073,16 @@ msgid "Install games from ContentDB"
msgstr "Instalar juegos desde ContentDB"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "Minetest doesn't come with a game by default."
msgstr "Minetest Game ya no es instalado por predeterminado"
msgstr "Minetest Game ya no es instalado por predeterminado."
#: builtin/mainmenu/tab_local.lua
msgid ""
"Minetest is a game-creation platform that allows you to play many different "
"games."
msgstr ""
"Minetest es una plataforma de creación de juegos que te permite jugar a "
"muchos juegos diferentes."
#: builtin/mainmenu/tab_local.lua
msgid "New"
@ -1116,9 +1117,8 @@ msgid "Start Game"
msgstr "Empezar juego"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "You need to install a game before you can create a world."
msgstr "Necesitas instalar un juego antes de que puedas instalar un mod"
msgstr "Necesitas instalar un juego antes de poder crear un mundo."
#: builtin/mainmenu/tab_online.lua
msgid "Address"
@ -1941,13 +1941,13 @@ msgid "Minimap in texture mode"
msgstr "Minimapa en modo textura"
#: src/client/shader.cpp
#, fuzzy, c-format
#, c-format
msgid "Failed to compile the \"%s\" shader."
msgstr "Fallo al abrir la página web"
msgstr "Fallo al compilar el shader \"%s\"."
#: src/client/shader.cpp
msgid "Shaders are enabled but GLSL is not supported by the driver."
msgstr ""
msgstr "Los shaders están activados pero el driver no soporta GLSL."
#. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3"
#: src/content/mod_configuration.cpp
@ -2148,7 +2148,7 @@ msgstr ""
#: src/gui/guiOpenURL.cpp
msgid "Open URL?"
msgstr ""
msgstr "Abrir URL?"
#: src/gui/guiOpenURL.cpp
#, fuzzy
@ -2455,7 +2455,7 @@ msgstr "Avanzado"
#: src/settings_translation_file.cpp
msgid "Allows liquids to be translucent."
msgstr ""
msgstr "Permite que los líquidos sean traslúcidos."
#: src/settings_translation_file.cpp
msgid ""
@ -3510,7 +3510,7 @@ msgstr "Habilitar cacheado de mallas giradas."
#: src/settings_translation_file.cpp
msgid "Enables debug and error-checking in the OpenGL driver."
msgstr ""
msgstr "Activa depuración y comprobación de errores en el driver OpenGL."
#: src/settings_translation_file.cpp
msgid "Enables the post processing pipeline."
@ -3520,6 +3520,7 @@ msgstr ""
msgid ""
"Enables touchscreen mode, allowing you to play the game with a touchscreen."
msgstr ""
"Activa el modo de pantalla táctil, permitiendote jugar con pantalla táctil."
#: src/settings_translation_file.cpp
msgid ""
@ -4474,16 +4475,15 @@ msgstr ""
"- Opaco: Transparencia desactivada"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Length of a server tick (the interval at which everything is generally "
"updated),\n"
"stated in seconds.\n"
"Does not apply to sessions hosted from the client menu."
msgstr ""
"Duración de un tick del servidor y el intervalo en el que los objetos se "
"actualizan generalmente sobre la\n"
"red, expresada en segundos."
"Duración de un tick del servidor y el intervalo en\n"
"el que los objetos se actualizan generalmente\n"
"sobre la red, expresada en segundos."
#: src/settings_translation_file.cpp
msgid "Length of liquid waves."
@ -5423,13 +5423,12 @@ msgid "Proportion of large caves that contain liquid."
msgstr "Proporción de cuevas grandes que contienen líquido."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Protocol version minimum"
msgstr "La versión del protocolo no coincide. "
msgstr "La versión del protocolo no coincide"
#: src/settings_translation_file.cpp
msgid "Punch gesture"
msgstr ""
msgstr "Gesto para golpear"
#: src/settings_translation_file.cpp
msgid ""
@ -5451,7 +5450,7 @@ msgstr "Entrada aleatoria"
#: src/settings_translation_file.cpp
msgid "Random mod load order"
msgstr ""
msgstr "Orden aleatorio de carga de mods"
#: src/settings_translation_file.cpp
msgid "Recent Chat Messages"
@ -5942,16 +5941,15 @@ msgid "Shaders"
msgstr "Shaders (Sombreador)"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Shaders allow advanced visual effects and may increase performance on some "
"video\n"
"cards."
msgstr ""
"Los sombreadores permiten efectos visuales avanzados y pueden aumentar el "
"rendimiento en algunas tarjetas de\n"
"vídeo.\n"
"Esto solo funciona con el motor de vídeo OpenGL."
"rendimiento\n"
"en algunas tarjetas de vídeo. Esto solo funciona con el motor de vídeo "
"OpenGL."
#: src/settings_translation_file.cpp
msgid "Shadow filter quality"
@ -6037,7 +6035,7 @@ msgstr ""
"aumentar este valor por encima de 5.\n"
"Reducir este valor aumenta la densidad de cuevas y mazmorras.\n"
"Alterar este valor es para uso especial, dejarlo sin cambios es\n"
"recomendable"
"recomendable."
#: src/settings_translation_file.cpp
msgid "Sky Body Orbit Tilt"
@ -6068,6 +6066,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Small-scale temperature variation for blending biomes on borders."
msgstr ""
"Variación de temperatura a pequeña escala para mezclar biomas en bordes."
#: src/settings_translation_file.cpp
msgid "Smooth lighting"
@ -6282,17 +6281,23 @@ msgid ""
"The default format in which profiles are being saved,\n"
"when calling `/profiler save [format]` without format."
msgstr ""
"El formato predefinido en que se guardan los perfiles\n"
"al llamar `/profiler save [format]` sin especificar formato."
#: src/settings_translation_file.cpp
msgid ""
"The delay in milliseconds after which a touch interaction is considered a "
"long tap."
msgstr ""
"El retraso en milisegundos a partir del cual una interacción táctil es "
"considerada un toque prolongado."
#: src/settings_translation_file.cpp
msgid ""
"The file path relative to your world path in which profiles will be saved to."
msgstr ""
"La ruta de archivos relativa a la ruta de los mundos en la que se guardarán "
"los perfiles."
#: src/settings_translation_file.cpp
msgid ""
@ -6306,15 +6311,26 @@ msgid ""
"Known from the classic Minetest mobile controls.\n"
"Combat is more or less impossible."
msgstr ""
"El gesto para golpear jugadores/entidades.\n"
"Los juegos y mods pueden ignorar esto.\n"
"\n"
"* sort_tap\n"
"Fácil de usar y muy conocido por otros juegos que no se mencionarán.\n"
"\n"
"* long_tap\n"
"Conocido por los controles clásicos para móviles de Minetest.\n"
"El combate es más o menos imposible."
#: src/settings_translation_file.cpp
msgid "The identifier of the joystick to use"
msgstr ""
msgstr "El identificador del joystick a usar"
#: src/settings_translation_file.cpp
msgid ""
"The length in pixels after which a touch interaction is considered movement."
msgstr ""
"La longitud en píxeles a partir de la cual una interacción táctil es "
"considerada movimiento."
#: src/settings_translation_file.cpp
msgid ""
@ -6342,6 +6358,9 @@ msgid ""
"The privileges that new users automatically get.\n"
"See /privs in game for a full list on your server and mod configuration."
msgstr ""
"Los privilegios que reciben los usuarios nuevos automaticamente.\n"
"Véase /privs en el juego para una lista completa en tu servidor y "
"configuración de mods."
#: src/settings_translation_file.cpp
msgid ""
@ -6361,6 +6380,10 @@ msgid ""
"OpenGL is the default for desktop, and OGLES2 for Android.\n"
"Shaders are supported by everything but OGLES1."
msgstr ""
"El back-end de renderizado.\n"
"Nota: ¡se requiere reinicio después de cambiar esto!\n"
"OpenGL es el predeterminado para PC, y OGLES2 para Android.\n"
"Los shaders son soportados por todo excepto OGLES1."
#: src/settings_translation_file.cpp
msgid ""
@ -6394,6 +6417,8 @@ msgid ""
"The time in seconds it takes between repeated events\n"
"when holding down a joystick button combination."
msgstr ""
"El tiempo en segundos entre eventos repetidos al mantener\n"
"presionada una combinación de botones del joystick."
#: src/settings_translation_file.cpp
msgid ""
@ -6413,6 +6438,10 @@ msgid ""
"enabled. Also, the vertical distance over which humidity drops by 10 if\n"
"'altitude_dry' is enabled."
msgstr ""
"La distancia vertical sobre la cuál el calor decae a 20 si 'altitude_chill' "
"está activo.\n"
"También, la distancia vertical sobre la cual la humedad decae a 10 si\n"
"'altitude_dry' está activo."
#: src/settings_translation_file.cpp
msgid "Third of 4 2D noises that together define hill/mountain range height."
@ -6422,13 +6451,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Threshold for long taps"
msgstr ""
msgstr "Umbral para toques prolongados"
#: src/settings_translation_file.cpp
msgid ""
"Time in seconds for item entity (dropped items) to live.\n"
"Setting it to -1 disables the feature."
msgstr ""
"Tiempo, en segundos, de vida de las entidades objeto (objetos soltados).\n"
"Establecerla a -1 desactiva esta característica."
#: src/settings_translation_file.cpp
msgid "Time of day when a new world is started, in millihours (0-23999)."
@ -6547,15 +6578,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Unload unused server data"
msgstr ""
msgstr "Liberar datos no usados del servidor"
#: src/settings_translation_file.cpp
msgid "Update information URL"
msgstr ""
msgstr "Actualizar información de URLs"
#: src/settings_translation_file.cpp
msgid "Upper Y limit of dungeons."
msgstr ""
msgstr "Límite Y superior de las mazmorras."
#: src/settings_translation_file.cpp
msgid "Upper Y limit of floatlands."
@ -6581,13 +6612,15 @@ msgstr "Usar filtrado bilinear al escalar texturas."
#: src/settings_translation_file.cpp
msgid "Use crosshair for touch screen"
msgstr ""
msgstr "Usar retícula en pantalla táctil"
#: src/settings_translation_file.cpp
msgid ""
"Use crosshair to select object instead of whole screen.\n"
"If enabled, a crosshair will be shown and will be used for selecting object."
msgstr ""
"Usar la retícula para seleccionar objetos en lugar de usar la pantalla.\n"
"Si está activo, una retícula se mostrará y se usará para seleccionar objetos."
#: src/settings_translation_file.cpp
msgid ""
@ -6609,6 +6642,9 @@ msgid ""
"If both bilinear and trilinear filtering are enabled, trilinear filtering\n"
"is applied."
msgstr ""
"Usar filtro trilinear al escalar texturas.\n"
"Si tanto los filtros bilinear y trilinear están activos, se aplica\n"
"el filtro trilinear."
#: src/settings_translation_file.cpp
#, fuzzy
@ -6655,17 +6691,19 @@ msgstr "Variación de la altura maxima de las montañas (En nodos)."
#: src/settings_translation_file.cpp
msgid "Variation of number of caves."
msgstr ""
msgstr "Variación en el número de cuevas."
#: src/settings_translation_file.cpp
msgid ""
"Variation of terrain vertical scale.\n"
"When noise is < -0.55 terrain is near-flat."
msgstr ""
"Variación de la escala vertical.\n"
"Cuando el ruido es < -0.55 el terreno es casi plano."
#: src/settings_translation_file.cpp
msgid "Varies depth of biome surface nodes."
msgstr ""
msgstr "Varía la profundidad de los nodos de la superficie de los biomas."
#: src/settings_translation_file.cpp
msgid ""
@ -6686,10 +6724,12 @@ msgid ""
"Vertical screen synchronization. Your system may still force VSync on even "
"if this is disabled."
msgstr ""
"Sincronización vertical de la pantalla. Tu sistema aún podría forzar la "
"sincronización vertical incluso si está desactivada."
#: src/settings_translation_file.cpp
msgid "Video driver"
msgstr ""
msgstr "Driver de video"
#: src/settings_translation_file.cpp
msgid "View bobbing factor"
@ -6713,7 +6753,7 @@ msgstr "Volumen"
#: src/settings_translation_file.cpp
msgid "Volume multiplier when the window is unfocused."
msgstr ""
msgstr "Multiplicador de volúmen cuando la ventana está desenfocada."
#: src/settings_translation_file.cpp
#, fuzzy
@ -6754,6 +6794,7 @@ msgstr "Velocidad del caminar"
#: src/settings_translation_file.cpp
msgid "Walking, flying and climbing speed in fast mode, in nodes per second."
msgstr ""
"Velocidad al caminar, volar y escalar en modo rápido, en nodos por segundo."
#: src/settings_translation_file.cpp
msgid "Water level"
@ -6761,7 +6802,7 @@ msgstr "Nivel del agua"
#: src/settings_translation_file.cpp
msgid "Water surface level of the world."
msgstr ""
msgstr "Nivel de superficie de agua del mundo."
#: src/settings_translation_file.cpp
msgid "Waving Nodes"
@ -6794,7 +6835,7 @@ msgstr "Movimiento de plantas"
#: src/settings_translation_file.cpp
msgid "Weblink color"
msgstr ""
msgstr "Color de los enlaces web"
#: src/settings_translation_file.cpp
msgid ""
@ -6875,11 +6916,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Width of the selection box lines around nodes."
msgstr ""
msgstr "Ancho de las líneas de la caja de selección alrededor de los nodos."
#: src/settings_translation_file.cpp
msgid "Window maximized"
msgstr ""
msgstr "Ventana maximizada"
#: src/settings_translation_file.cpp
msgid ""
@ -6932,6 +6973,7 @@ msgstr "\"Y\" del límite superior de las grandes cuevas."
#: src/settings_translation_file.cpp
msgid "Y-distance over which caverns expand to full size."
msgstr ""
"Distancia en Y sobre la cual las cavernas se expanden a su tamaño completo."
#: src/settings_translation_file.cpp
msgid ""
@ -6943,7 +6985,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Y-level of average terrain surface."
msgstr ""
msgstr "Nivel Y de superficie de terreno promedio."
#: src/settings_translation_file.cpp
msgid "Y-level of cavern upper limit."
@ -6951,7 +6993,7 @@ msgstr "Nivel Y del límite superior de las cavernas."
#: src/settings_translation_file.cpp
msgid "Y-level of higher terrain that creates cliffs."
msgstr ""
msgstr "Nivel Y de terreno más elevado que crea acantilados."
#: src/settings_translation_file.cpp
msgid "Y-level of lower terrain and seabed."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: Japanese (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-11 15:14+0200\n"
"PO-Revision-Date: 2023-12-16 10:05+0000\n"
"Last-Translator: Jun Nogata <nogajun@gmail.com>\n"
"PO-Revision-Date: 2024-08-08 13:09+0000\n"
"Last-Translator: BreadW <toshiharu.uno@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/minetest/"
"minetest/ja/>\n"
"Language: ja\n"
@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.3\n"
"X-Generator: Weblate 5.7-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@ -71,9 +71,8 @@ msgid "Command not available: "
msgstr "コマンドは使用できません: "
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "Get help for commands (-t: output in chat)"
msgstr "コマンドのヘルプを表示する"
msgstr "コマンドのヘルプを表示 (-t: チャットで出力)"
#: builtin/common/chatcommands.lua
msgid ""
@ -83,9 +82,8 @@ msgstr ""
"べてを一覧表示します。"
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "[all | <cmd>] [-t]"
msgstr "[all | <cmd>]"
msgstr "[all | <cmd>] [-t]"
#: builtin/fstk/ui.lua
msgid "<none available>"
@ -148,12 +146,11 @@ msgid "Failed to download $1"
msgstr "$1のダウンロードに失敗"
#: builtin/mainmenu/content/contentdb.lua
#, fuzzy
msgid ""
"Failed to extract \"$1\" (insufficient disk space, unsupported file type or "
"broken archive)"
msgstr ""
"「$1」の展開に失敗 (サポートされていないファイル形式または壊れたアーカイブ)"
msgstr "「$1」の展開に失敗 (ディスク容量の不足、サポートされていないファイルタイプま"
"たは壊れたアーカイブ)"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid ""
@ -185,7 +182,7 @@ msgstr "ダウンロード中..."
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Error getting dependencies for package"
msgstr ""
msgstr "パッケージの依存関係を取得するエラー"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Games"
@ -463,7 +460,7 @@ msgstr "デコレーション"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Desert temples"
msgstr ""
msgstr "砂漠の寺院"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Development Test is meant for developers."
@ -473,7 +470,8 @@ msgstr "Development Testは開発者用です。"
msgid ""
"Different dungeon variant generated in desert biomes (only if dungeons "
"enabled)"
msgstr ""
msgstr "砂漠のバイオームで生成された異なるダンジョンのバリエーション(ダンジョンが有効"
"になっている場合のみ)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@ -860,7 +858,7 @@ msgstr "Clear"
#: builtin/mainmenu/settings/dlg_settings.lua src/client/game.cpp
#: src/settings_translation_file.cpp
msgid "Controls"
msgstr "操作"
msgstr "キー割り当て"
#: builtin/mainmenu/settings/dlg_settings.lua src/settings_translation_file.cpp
msgid "General"
@ -1064,15 +1062,15 @@ msgid "Install games from ContentDB"
msgstr "コンテンツDBからゲームをインストール"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "Minetest doesn't come with a game by default."
msgstr "Minetest Game は初期状態ではインストールされていない"
msgstr "Minetest は初期状態でゲームが付属していません。"
#: builtin/mainmenu/tab_local.lua
msgid ""
"Minetest is a game-creation platform that allows you to play many different "
"games."
msgstr ""
msgstr "Minetestは、さまざまなゲームで遊ぶことを可能にするゲーム制作プラットフォーム"
"です."
#: builtin/mainmenu/tab_local.lua
msgid "New"
@ -1107,9 +1105,8 @@ msgid "Start Game"
msgstr "ゲームスタート"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "You need to install a game before you can create a world."
msgstr "MODをインストールする前に、ゲームをインストールする必要があります"
msgstr "ワールドを作る前に、ゲームをインストールする必要があります"
#: builtin/mainmenu/tab_online.lua
msgid "Address"
@ -1292,11 +1289,11 @@ msgstr "パスワード変更"
#: src/client/game.cpp
msgid "Cinematic mode disabled"
msgstr "映画風モード 無効"
msgstr "シネマティックモード 無効"
#: src/client/game.cpp
msgid "Cinematic mode enabled"
msgstr "映画風モード 有効"
msgstr "シネマティックモード 有効"
#: src/client/game.cpp
msgid "Client disconnected"
@ -1323,7 +1320,6 @@ msgid "Continue"
msgstr "再開"
#: src/client/game.cpp
#, fuzzy
msgid ""
"Controls:\n"
"No menu open:\n"
@ -1341,15 +1337,15 @@ msgstr ""
"操作方法:\n"
"メニューなし:\n"
"- スライド: 見回す\n"
"- タップ: 置く/使う\n"
"- ロングタップ: 掘る/パンチ/使う  ブロックの破壊- ダブルタップ: 設置/使用\n"
"メニュー/インベントリの操作:\n"
"- タップ: 置く/パンチ/使う(基本)\n"
"- ロングタップ: 掘る/使う(基本)\n"
"メニュー/インベントリを開く:\n"
"- ダブルタップ (メニューの外):\n"
" --> 閉じる\n"
"- アイテムをタッチし、スロットをタッチ:\n"
" --> アイテムを移動\n"
"- タッチしてドラッグし、二本目の指でタップ:\n"
" --> アイテムを1つスロットに置く\n"
" --> スロットにアイテムを1つ置く\n"
#: src/client/game.cpp
#, c-format
@ -1422,9 +1418,8 @@ msgid "Fog enabled"
msgstr "霧 有効"
#: src/client/game.cpp
#, fuzzy
msgid "Fog enabled by game or mod"
msgstr "ズームはゲームやMODによって無効化されている"
msgstr "霧はゲームやMODによって有効化されている"
#: src/client/game.cpp
msgid "Game info:"
@ -1922,13 +1917,13 @@ msgid "Minimap in texture mode"
msgstr "ミニマップ テクスチャモード"
#: src/client/shader.cpp
#, fuzzy, c-format
#, c-format
msgid "Failed to compile the \"%s\" shader."
msgstr "ウェブページを開けませんでした"
msgstr "「%s」シェーダーをコンパイルできませんでした。"
#: src/client/shader.cpp
msgid "Shaders are enabled but GLSL is not supported by the driver."
msgstr ""
msgstr "シェーダーは有効ですが、このドライバはGLSLをサポートしていません。"
#. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3"
#: src/content/mod_configuration.cpp
@ -2045,7 +2040,7 @@ msgstr "キーが重複しています"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Keybindings."
msgstr "キーに対する機能の割り当て。"
msgstr "キーに対する機能の割り当てです。"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Left"
@ -2125,16 +2120,15 @@ msgstr "キー入力待ち"
#: src/gui/guiOpenURL.cpp
msgid "Open"
msgstr ""
msgstr "開く"
#: src/gui/guiOpenURL.cpp
msgid "Open URL?"
msgstr ""
msgstr "URLを開く?"
#: src/gui/guiOpenURL.cpp
#, fuzzy
msgid "Unable to open URL"
msgstr "ウェブページを開けませんでした"
msgstr "URLを開くことができない"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
@ -2418,7 +2412,7 @@ msgstr "詳細"
#: src/settings_translation_file.cpp
msgid "Allows liquids to be translucent."
msgstr ""
msgstr "液体が半透明になることを可能にします。"
#: src/settings_translation_file.cpp
msgid ""
@ -2488,6 +2482,17 @@ msgid ""
"With OpenGL ES, dithering only works if the shader supports high\n"
"floating-point precision and it may have a higher performance impact."
msgstr ""
"色帯状のアーティファクトを減らすためにディザリングを適用します。\n"
"ディザリングにより、可逆圧縮されたスクリーンショットのサイズが大幅に増加しま"
"す。\n"
"また、ディスプレイまたはオペレーティング "
"システムが追加のディザリングを実行する場合、\n"
"またはカラー チャネルが 8 ビットに量子化されていない場合、"
"ディザリングは正しく動作\n"
"しません。\n"
"OpenGL ES では、"
"ディザリングはシェーダーが高い浮動小数点精度をサポートしている場合に\n"
"のみ機能し、パフォーマンスに大きな影響を与える可能性があります。"
#: src/settings_translation_file.cpp
msgid "Arm inertia"
@ -2506,7 +2511,6 @@ msgid "Ask to reconnect after crash"
msgstr "クラッシュ後に再接続を促す"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"At this distance the server will aggressively optimize which blocks are sent "
"to\n"
@ -2522,13 +2526,12 @@ msgstr ""
"最適化します。\n"
"小さい値に設定すると、描画の視覚的な不具合を犠牲にして、\n"
"パフォーマンスが大幅に向上する可能性があります(いくつかのブロックは\n"
"水中や洞窟、時には陸の上でも描画されません)。\n"
"洞窟で正しく描画されません)。\n"
"max_block_send_distance より大きい値に設定すると、この最適化は\n"
"無効になります。 \n"
"マップブロック(16ード)で表記。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"At this distance the server will perform a simpler and cheaper occlusion "
"check.\n"
@ -2538,13 +2541,10 @@ msgid ""
"This is especially useful for very large viewing range (upwards of 500).\n"
"Stated in MapBlocks (16 nodes)."
msgstr ""
"この距離でサーバーはどのブロックをクライアントへ送信するかを積極的に\n"
"最適化します。\n"
"小さい値に設定すると、描画の視覚的な不具合を犠牲にして、\n"
"パフォーマンスが大幅に向上する可能性があります(いくつかのブロックは\n"
"水中や洞窟、時には陸の上でも描画されません)。\n"
"max_block_send_distance より大きい値に設定すると、この最適化は\n"
"無効になります。 \n"
"この距離でサーバーはよりシンプルで安価なオクルージョンチェックを行います。\n"
"小さい値に設定すると、描画の視覚的な不具合(不足するブロック)を一時的に\n"
"犠牲にして、パフォーマンスが向上する可能性があります。\n"
"これは特に非常に広い視野(500以上)に有用です。\n"
"マップブロック(16ード)で表記。"
#: src/settings_translation_file.cpp
@ -2608,9 +2608,8 @@ msgid "Biome noise"
msgstr "バイオームノイズ"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Block cull optimize distance"
msgstr "ブロック送信最適化距離"
msgstr "ブロックカリングの最適化距離"
#: src/settings_translation_file.cpp
msgid "Block send optimize distance"
@ -2670,7 +2669,7 @@ msgstr "カメラの滑らかさ"
#: src/settings_translation_file.cpp
msgid "Camera smoothing in cinematic mode"
msgstr "映画風モードでのカメラの滑らかさ"
msgstr "シネマティックモードでのカメラの滑らかさ"
#: src/settings_translation_file.cpp
msgid "Cave noise"
@ -2833,6 +2832,8 @@ msgid ""
"Comma-separated list of AL and ALC extensions that should not be used.\n"
"Useful for testing. See al_extensions.[h,cpp] for details."
msgstr ""
"使用されるべきでない拡張子ALおよびALCのカンマ区切りリストです。\n"
"テストのために有用です。 詳細は al_extensions.[h,cpp] を参照してください。"
#: src/settings_translation_file.cpp
msgid ""
@ -3053,7 +3054,6 @@ msgstr ""
"しかし、より多くのリソースを消費します。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Define the oldest clients allowed to connect.\n"
"Older clients are compatible in the sense that they will not crash when "
@ -3065,10 +3065,14 @@ msgid ""
"Minetest still enforces its own internal minimum, and enabling\n"
"strict_protocol_version_checking will effectively override this."
msgstr ""
"古いクライアントが接続できないようにします。\n"
"古いクライアントは新しいサーバーに接続してもクラッシュしないという\n"
"意味で互換性がありますが、期待しているすべての新機能をサポート\n"
"しているわけではありません。"
"接続を許可する最も古いクライアントを定義します。\n"
"古いクライアントは、"
"新しいサーバーに接続するときにクラッシュしないという意味では\n"
"互換性がありますが、期待されるすべての新機能をサポートしているわけではない可"
"能性があります。\n"
"これにより、strict_protocol_version_checking よりも細かい管理ができます。\n"
"Minetest は依然として独自の内部最小値を強制しており、\n"
"strict_protocol_version_checking はこれをが効果的に上書きします。"
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@ -3269,9 +3273,8 @@ msgid "Enable Bloom Debug"
msgstr "ブルームデバッグを有効化"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Debanding"
msgstr "ダメージ有効"
msgstr "バンディング除去有効"
#: src/settings_translation_file.cpp
msgid ""
@ -3300,9 +3303,8 @@ msgstr ""
"ときはPCFフィルタリングを使用します。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Post Processing"
msgstr "後処理"
msgstr "後処理有効"
#: src/settings_translation_file.cpp
msgid "Enable Raytraced Culling"
@ -3352,9 +3354,8 @@ msgid "Enable mouse wheel (scroll) for item selection in hotbar."
msgstr "ホットバーの項目選択のためのマウスホイール(スクロール)を有効にします。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable random mod loading (mainly used for testing)."
msgstr "ランダムなユーザー入力を有効にします (テストにのみ使用)。"
msgstr "ランダムなMODの読み込みを有効にします(主にテストに使用されます)。"
#: src/settings_translation_file.cpp
msgid "Enable random user input (only used for testing)."
@ -3386,9 +3387,8 @@ msgstr ""
"しているわけではありません。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable touchscreen"
msgstr "タッチスクリーン"
msgstr "タッチスクリーン有効"
#: src/settings_translation_file.cpp
msgid ""
@ -3442,16 +3442,17 @@ msgstr "facedir回転メッシュのキャッシングを有効にします。"
#: src/settings_translation_file.cpp
msgid "Enables debug and error-checking in the OpenGL driver."
msgstr ""
msgstr "OpenGL ドライバでデバッグとエラーチェックを有効にします。"
#: src/settings_translation_file.cpp
msgid "Enables the post processing pipeline."
msgstr ""
msgstr "後処理パイプラインを有効にします。"
#: src/settings_translation_file.cpp
msgid ""
"Enables touchscreen mode, allowing you to play the game with a touchscreen."
msgstr ""
msgstr "タッチスクリーンモードを有効にし、タッチスクリーンでゲームを遊ぶことができま"
"す。"
#: src/settings_translation_file.cpp
msgid ""
@ -4374,15 +4375,14 @@ msgstr ""
"- Opaque: 透明性を無効化"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Length of a server tick (the interval at which everything is generally "
"updated),\n"
"stated in seconds.\n"
"Does not apply to sessions hosted from the client menu."
msgstr ""
"サーバーが時を刻む間隔とオブジェクトが通常ネットワーク上で更新される間隔を\n"
"秒単位で定めます。"
"サーバーが時を刻む長さ (通常、すべてが更新される間隔) を秒単位で定めます。\n"
"クライアント メニューからホストされるセッションには適用されません。"
#: src/settings_translation_file.cpp
msgid "Length of liquid waves."
@ -4607,7 +4607,6 @@ msgid "Map generation attributes specific to Mapgen v5."
msgstr "マップジェネレータ v5 に固有のマップ生成属性。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"The 'snowbiomes' flag enables the new 5 biome system.\n"
@ -4619,7 +4618,9 @@ msgstr ""
"マップジェネレータ v6 に固有のマップ生成属性。\n"
"'snowbiomes' フラグは新しい5つのバイオームシステムを有効にします。\n"
"'snowbiomes' フラグを有効にすると、ジャングルが自動的に有効になり、\n"
"'jungles' フラグは無視されます。"
"'jungles' フラグは無視されます。\n"
"'temples' フラグは砂漠の寺院の生成を無効にします。代わりに通常のダンジョンが"
"生成されます。"
#: src/settings_translation_file.cpp
msgid ""
@ -4924,9 +4925,8 @@ msgid "Minimap scan height"
msgstr "ミニマップのスキャン高さ"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Minimum dig repetition interval"
msgstr "設置の繰り返し間隔"
msgstr "繰り返し掘る最小間隔"
#: src/settings_translation_file.cpp
msgid "Minimum limit of random number of large caves per mapchunk."
@ -4997,9 +4997,8 @@ msgid "Mouse sensitivity multiplier."
msgstr "マウス感度の倍率。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Movement threshold"
msgstr "大きな洞窟のしきい値"
msgstr "動きのしきい値"
#: src/settings_translation_file.cpp
msgid "Mud noise"
@ -5152,9 +5151,8 @@ msgstr ""
"フォームスペックが開かれているときはポーズメニューを開きません。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "OpenGL debug"
msgstr "マップジェネレータのデバッグ"
msgstr "OpenGLのデバッグ"
#: src/settings_translation_file.cpp
msgid "Optional override for chat weblink color."
@ -5287,13 +5285,12 @@ msgid "Proportion of large caves that contain liquid."
msgstr "大きな洞窟の液体を含む割合です。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Protocol version minimum"
msgstr "プロトコルのバージョンが一致していません。 "
msgstr "プロトコルバージョンの最小限"
#: src/settings_translation_file.cpp
msgid "Punch gesture"
msgstr ""
msgstr "パンチのジェスチャー"
#: src/settings_translation_file.cpp
msgid ""
@ -5314,7 +5311,7 @@ msgstr "ランダム入力"
#: src/settings_translation_file.cpp
msgid "Random mod load order"
msgstr ""
msgstr "MODのランダム読み込み"
#: src/settings_translation_file.cpp
msgid "Recent Chat Messages"
@ -5523,7 +5520,6 @@ msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "参照 https://www.sqlite.org/pragma.html#pragma_synchronous"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Select the antialiasing method to apply.\n"
"\n"
@ -5548,8 +5544,8 @@ msgstr ""
"\n"
"* 必須なし - アンチエイリアシングなし (既定)\n"
"\n"
"* FSAA - ハードウェア認証フルスクリーンアンチエイリアシング(シェーダーと互換"
"性なし)\n"
"* FSAA - ハードウェアによるフルスクリーンアンチエイリアシング\n"
"(後処理およびアンダーサンプリングと互換性なし)\n"
"別名 マルチサンプルアンチエイリアシング(MSAA)\n"
"ブロックの縁を滑らかにしますが、テクスチャの内部には影響しません。\n"
"このオプションを変更するには再起動が必要です。\n"
@ -5560,8 +5556,8 @@ msgstr ""
"処理速度と画質のバランスをとります。\n"
"\n"
"* SSAA - スーパーサンプリングアンチエイリアシング(シェーダーが必要)\n"
"シーンの高解像度画像をレンダリングした後、スケールダウンしてエイリアシング効"
"果を\n"
"シーンの高解像度画像をレンダリングした後、"
"スケールダウンしてエイリアシング効果を\n"
"軽減します。これは最も遅く、最も正確な方式です。"
#: src/settings_translation_file.cpp
@ -5691,13 +5687,12 @@ msgstr ""
"範囲: -1 から 1.0 まで"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Set the language. By default, the system language is used.\n"
"A restart is required after changing this."
msgstr ""
"言語を設定してください。システム言語を使用するには空のままにします。\n"
"変更後再起動が必要です。"
"言語を設定してください。初期状態ではシステム言語が使用されます。\n"
"変更後再起動が必要です。"
#: src/settings_translation_file.cpp
msgid ""
@ -5739,7 +5734,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Set to true to enable volumetric lighting effect (a.k.a. \"Godrays\")."
msgstr ""
msgstr "true "
"に設定すると、ボリュームライティング効果(別名「Godrays」)が有効になります。"
#: src/settings_translation_file.cpp
msgid "Set to true to enable waving leaves."
@ -5784,15 +5780,13 @@ msgid "Shaders"
msgstr "シェーダー"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Shaders allow advanced visual effects and may increase performance on some "
"video\n"
"cards."
msgstr ""
"シェーダーは高度な視覚効果を可能にし、ビデオカードによっては\n"
"パフォーマンスが向上する可能性があります。\n"
"これはOpenGLビデオバックエンドでのみ機能します。"
"シェーダーにより高度な視覚効果が可能になり、一部のビデオ カードの\n"
"パフォーマンスが向上する場合があります。"
#: src/settings_translation_file.cpp
msgid "Shadow filter quality"
@ -5909,13 +5903,12 @@ msgid "Smooth lighting"
msgstr "滑らかな照明"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Smooths rotation of camera when in cinematic mode, 0 to disable. Enter "
"cinematic mode by using the key set in Controls."
msgstr ""
"映画風モードでのカメラの旋回を滑らかにします。無効にするには 0。キー変更で設"
"定されたキーを使用して映画風モードに切替えます。"
"シネマティックモードでのカメラの旋回を滑らかにし、0 で無効にします。\n"
"キー割り当てで設定されたキーを使用してシネマティックモードに切替えます。"
#: src/settings_translation_file.cpp
msgid ""
@ -5942,9 +5935,8 @@ msgid "Sound"
msgstr "サウンド"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Sound Extensions Blacklist"
msgstr "コンテンツDBフラグのブラックリスト"
msgstr "音声拡張子のブラックリスト"
#: src/settings_translation_file.cpp
msgid ""
@ -6151,7 +6143,7 @@ msgstr ""
msgid ""
"The delay in milliseconds after which a touch interaction is considered a "
"long tap."
msgstr ""
msgstr "タッチ操作がロングタップとみなされるまでのミリ秒単位の遅延。"
#: src/settings_translation_file.cpp
msgid ""
@ -6170,16 +6162,24 @@ msgid ""
"Known from the classic Minetest mobile controls.\n"
"Combat is more or less impossible."
msgstr ""
"プレイヤー/エンティティをパンチするためのジェスチャーです。\n"
"これはゲームやMODによって上書きされる可能性があります。\n"
"\n"
"* ショートタップ\n"
"使いやすく、名前は挙げませんが他のゲームでもよく知られています。\n"
"\n"
"* ロングタップ\n"
"古典的な Minetest のモバイル版操作として知られています。\n"
"戦闘はほぼ不可能です。"
#: src/settings_translation_file.cpp
msgid "The identifier of the joystick to use"
msgstr "使用するジョイスティックの識別子"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The length in pixels after which a touch interaction is considered movement."
msgstr "タッチスクリーン操作が開始されるまでにかかるピクセル単位の長さ。"
msgstr "タッチ操作が動きと見なされるまでのピクセル単位の長さです。"
#: src/settings_translation_file.cpp
msgid ""
@ -6194,11 +6194,12 @@ msgstr ""
"既定は 1.0 (1/2 ノード) です。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The minimum time in seconds it takes between digging nodes when holding\n"
"the dig button."
msgstr "設置ボタンを押したままノードの設置を繰り返す秒単位の間隔。"
msgstr ""
"掘削ボタンを押したときにノードを掘る間にかかる秒単位の\n"
"最小時間です。"
#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
@ -6230,7 +6231,6 @@ msgstr ""
"これは active_object_send_range_blocks と一緒に設定する必要があります。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The rendering back-end.\n"
"Note: A restart is required after changing this!\n"
@ -6238,9 +6238,9 @@ msgid ""
"Shaders are supported by everything but OGLES1."
msgstr ""
"レンダリングのバックエンドです。\n"
"注:これを変更した後は再起動が必要です\n"
"注:これを変更した後は再起動が必要です\n"
"デスクトップでは OpenGL が、Android では OGLES2 が規定です。\n"
"シェーダーは OpenGL と OGLES2 (実験的) でサポートされています。"
"シェーダーは OGLES1 以外のすべてでサポートされています。"
#: src/settings_translation_file.cpp
msgid ""
@ -6310,7 +6310,7 @@ msgstr "一緒に丘陵/山岳地帯の高さを定義する2Dイズ4つの
#: src/settings_translation_file.cpp
msgid "Threshold for long taps"
msgstr ""
msgstr "ロングタップのしきい値"
#: src/settings_translation_file.cpp
msgid ""
@ -6370,9 +6370,8 @@ msgid "Tradeoffs for performance"
msgstr "パフォーマンスのためのトレードオフ"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Translucent liquids"
msgstr "透明な液体"
msgstr "透明な液体"
#: src/settings_translation_file.cpp
msgid "Transparency Sorting Distance"
@ -6417,12 +6416,13 @@ msgstr ""
"パフォーマンスの問題がある場合のみ、この設定を変更する必要があります。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"URL to JSON file which provides information about the newest Minetest "
"release\n"
"If this is empty the engine will never check for updates."
msgstr "最新のMinetestリリースに関する情報を提供するJSONファイルへのURL"
msgstr ""
"最新の Minetest リリースに関する情報を提供する JSON ファイルへの URL\n"
"これが空の場合、エンジンは更新をチェックしません。"
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
@ -6631,7 +6631,7 @@ msgstr "音量"
#: src/settings_translation_file.cpp
msgid "Volume multiplier when the window is unfocused."
msgstr ""
msgstr "ウィンドウがフォーカスされていないときの音量乗数です。"
#: src/settings_translation_file.cpp
msgid ""
@ -6642,14 +6642,12 @@ msgstr ""
"サウンド システムを有効にする必要があります。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Volume when unfocused"
msgstr "非アクティブまたはポーズメニュー表示中のFPS"
msgstr "フォーカスされていないときの音量"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Volumetric lighting"
msgstr "滑らかな照明"
msgstr "ボリュームライティング"
#: src/settings_translation_file.cpp
msgid ""

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-11 15:14+0200\n"
"PO-Revision-Date: 2024-05-27 12:33+0000\n"
"PO-Revision-Date: 2024-08-06 19:09+0000\n"
"Last-Translator: Mićadźoridź <otto.grotovel@gmail.com>\n"
"Language-Team: Komi <https://hosted.weblate.org/projects/minetest/minetest/"
"kv/>\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6-dev\n"
"X-Generator: Weblate 5.7-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@ -76,9 +76,8 @@ msgid "Command not available: "
msgstr "Командаыс сиптӧма: "
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "Get help for commands (-t: output in chat)"
msgstr "Командаяс йылысь юӧр босьтны"
msgstr "Командаяс йылысь юӧр босьтны (-t: чатӧ гижӧм)"
#: builtin/common/chatcommands.lua
msgid ""
@ -86,9 +85,8 @@ msgid ""
msgstr "Гиж «.help <cmd>» содтӧд юӧрла али «.help all» — тыр лыддьӧгла."
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "[all | <cmd>] [-t]"
msgstr "[all | <команда>]"
msgstr "[all | <команда>] [-t]"
#: builtin/fstk/ui.lua
msgid "<none available>"
@ -151,11 +149,12 @@ msgid "Failed to download $1"
msgstr "$1 бӧсьтӧм эз артмы"
#: builtin/mainmenu/content/contentdb.lua
#, fuzzy
msgid ""
"Failed to extract \"$1\" (insufficient disk space, unsupported file type or "
"broken archive)"
msgstr "«$1» перйыны эз артмы (уджавтӧм файл сикас али жугалӧм топӧдӧм файл)"
msgstr ""
"«$1» перйыны эз артмы (дискын пуктанін этша, уджавтӧм файл сикас али жугалӧм "
"топӧдӧм файл)"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid ""
@ -273,7 +272,6 @@ msgid "Already installed"
msgstr "Нин пуктӧма"
#: builtin/mainmenu/content/dlg_install.lua
#, fuzzy
msgid "Base Game:"
msgstr "Медшӧр ворсӧм:"
@ -572,7 +570,6 @@ msgid "Seed"
msgstr "Сид"
#: builtin/mainmenu/dlg_create_world.lua
#, fuzzy
msgid "Smooth transition between biomes"
msgstr "Биомъяс костын лайкыд вуджӧм"
@ -588,15 +585,15 @@ msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert"
msgstr "Шӧр климат, Пустыня"
msgstr "Шӧр климата ин, Лыааин"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle"
msgstr "Шӧр климат, Пустыня, Джунгли"
msgstr "Шӧр климата ин, Лыааин, Джунгли"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle, Tundra, Taiga"
msgstr "Шӧр климат, Пустыня, Джунгли, Тундра, Парма"
msgstr "Шӧр климата ин, Лыааин, Джунгли, Тундра, Парма"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Terrain surface erosion"
@ -692,7 +689,7 @@ msgstr ""
#: builtin/mainmenu/dlg_reinstall_mtg.lua
msgid "Reinstall Minetest Game"
msgstr "Minetest Game вылысь пуктыны"
msgstr "Minetest Game выльысь пуктыны"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
@ -713,7 +710,6 @@ msgid "A new $1 version is available"
msgstr "Выль $1 версия восьтӧма"
#: builtin/mainmenu/dlg_version_info.lua
#, fuzzy
msgid ""
"Installed version: $1\n"
"New version: $2\n"
@ -722,8 +718,8 @@ msgid ""
msgstr ""
"Пуктӧм версия: $1\n"
"Выль версия: $2\n"
"$3-ӧ пырӧй медвыль версия босьтӧмла да выль функцияяс да веськӧдӧмъяс йылысь "
"тӧдмалӧмла."
"Медвыль версия босьтӧм да выль функцияяс али лӧсьӧдӧмъяс йылысь тӧдмалӧм "
"могысь пырӧй $3-ӧ."
#: builtin/mainmenu/dlg_version_info.lua
msgid "Later"
@ -743,7 +739,7 @@ msgstr "Лӧсьӧданін"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Public server list is disabled"
msgstr "Восьса серверъяслӧн лыддьӧг кусӧдӧма"
msgstr "Восьса серверъяслӧн лыддьӧгныс кусӧдӧма"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Try reenabling public serverlist and check your internet connection."
@ -789,7 +785,6 @@ msgstr "Октавъяс"
#: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Offset"
msgstr "Вештӧм"
@ -803,14 +798,12 @@ msgid "Scale"
msgstr "Бердӧг"
#: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua
#, fuzzy
msgid "X spread"
msgstr "X паськалӧм"
msgstr "X кузя разалӧм"
#: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua
#, fuzzy
msgid "Y spread"
msgstr "Y паськалӧм"
msgstr "Y кузя разалӧм"
#: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua
msgid "Z spread"
@ -870,9 +863,8 @@ msgid "General"
msgstr "Медшӧр"
#: builtin/mainmenu/settings/dlg_settings.lua
#, fuzzy
msgid "Movement"
msgstr "Вештӧм"
msgstr "Вуджӧм"
#: builtin/mainmenu/settings/dlg_settings.lua
msgid "Reset setting to default"
@ -956,12 +948,10 @@ msgid "Active renderer:"
msgstr ""
#: builtin/mainmenu/tab_about.lua
#, fuzzy
msgid "Core Developers"
msgstr "Медшӧр артмӧдысь"
msgstr "Медшӧр артмӧдысьяс"
#: builtin/mainmenu/tab_about.lua
#, fuzzy
msgid "Core Team"
msgstr "Медшӧр котыр"
@ -1112,9 +1102,8 @@ msgid "Start Game"
msgstr "Ворсны кутны"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "You need to install a game before you can create a world."
msgstr "Мод пуктытӧдз тіянлы колӧ ворсӧм пуктыны"
msgstr "Енкӧла вӧчтӧдз тіянлы колӧ пуктыны ворсӧм."
#: builtin/mainmenu/tab_online.lua
msgid "Address"
@ -1126,9 +1115,8 @@ msgstr ""
#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Damage / PvP"
msgstr "Воштӧм / PvP"
msgstr "Доймӧм / PvP"
#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
@ -1212,7 +1200,7 @@ msgstr "Ворсысьлӧн нимыс вывті кузь."
#: src/client/clientlauncher.cpp
msgid "Please choose a name!"
msgstr "Ен могысь, ним бӧрйы!"
msgstr "Ен могысь, ним бӧрйӧй!"
#: src/client/clientlauncher.cpp
msgid "Provided password file failed to open: "
@ -1247,7 +1235,7 @@ msgstr "- РvP: "
#: src/client/game.cpp
msgid "- Server Name: "
msgstr "- Серверлӧн нимыс: "
msgstr "- Серверлӧн ним: "
#: src/client/game.cpp
msgid "A serialization error occurred:"
@ -1662,9 +1650,8 @@ msgid "Erase EOF"
msgstr ""
#: src/client/keycode.cpp
#, fuzzy
msgid "Execute"
msgstr "Лэдзны"
msgstr "Вӧчны"
#: src/client/keycode.cpp
msgid "Help"
@ -1963,9 +1950,8 @@ msgid "Autoforward"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
#, fuzzy
msgid "Automatic jumping"
msgstr "Автоматика чеччалӧм"
msgstr "Автоматӧн чеччыштӧм"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Aux1"
@ -1976,9 +1962,8 @@ msgid "Backward"
msgstr "Бӧрӧ"
#: src/gui/guiKeyChangeMenu.cpp
#, fuzzy
msgid "Block bounds"
msgstr "Блок доръяс"
msgstr "Мапблоклӧн доръяс"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Change camera"
@ -2057,9 +2042,8 @@ msgid "Prev. item"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
#, fuzzy
msgid "Range select"
msgstr "Тыдалан шымыртӧм"
msgstr "Тыдалан диапазон"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Right"
@ -2360,7 +2344,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Admin name"
msgstr "Веськӧдлысьлӧн нимыс"
msgstr "Веськӧдлысьлӧн ним"
#: src/settings_translation_file.cpp
msgid "Advanced"
@ -2435,9 +2419,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Arm inertia"
msgstr "Лайкъялӧм ки"
msgstr "Довкъялысь ки"
#: src/settings_translation_file.cpp
msgid ""
@ -2527,7 +2510,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Biome API"
msgstr "Биомлӧн API'ыс"
msgstr "Биомлӧн API"
#: src/settings_translation_file.cpp
msgid "Biome noise"
@ -2603,11 +2586,11 @@ msgstr "Рудӧглӧн шувгӧм"
#: src/settings_translation_file.cpp
msgid "Cave noise #1"
msgstr "Рудӧглӧн шувгӧмыс #1"
msgstr "Рудӧглӧн шувгӧм #1"
#: src/settings_translation_file.cpp
msgid "Cave noise #2"
msgstr "Рудӧглӧн шувгӧмыс #2"
msgstr "Рудӧглӧн шувгӧм #2"
#: src/settings_translation_file.cpp
msgid "Cave width"
@ -2657,7 +2640,7 @@ msgstr "Чатлӧн командаяс"
#: src/settings_translation_file.cpp
msgid "Chat font size"
msgstr "Чатса шрифтлӧн ыдждаыс"
msgstr "Чатса шрифтлӧн ыджда"
#: src/settings_translation_file.cpp
msgid "Chat log level"
@ -2743,7 +2726,7 @@ msgstr "Менюын кымӧръяс"
#: src/settings_translation_file.cpp
msgid "Colored fog"
msgstr "Рӧма ру"
msgstr "Рӧма руалӧм"
#: src/settings_translation_file.cpp
msgid "Colored shadows"
@ -2808,15 +2791,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Console alpha"
msgstr "Консольлӧн сӧдзлуныс"
msgstr "Консольлӧн сӧдзлун"
#: src/settings_translation_file.cpp
msgid "Console color"
msgstr "Консольлӧн рӧмыс"
msgstr "Консольлӧн рӧм"
#: src/settings_translation_file.cpp
msgid "Console height"
msgstr "Консольлӧн сутдас"
msgstr "Консольлӧн судта"
#: src/settings_translation_file.cpp
msgid "Content Repository"
@ -2832,7 +2815,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "ContentDB URL"
msgstr "ContentDB-лӧн инпасыс"
msgstr "ContentDB-лӧн инпас"
#: src/settings_translation_file.cpp
msgid ""
@ -2878,7 +2861,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Crosshair color"
msgstr "Витанторлӧн рӧмыс"
msgstr "Витанторлӧн рӧм"
#: src/settings_translation_file.cpp
msgid ""
@ -2895,9 +2878,8 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Debugging"
msgstr "Ладвыв пуктӧм"
msgstr "Лӧсьӧдӧм"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@ -3134,9 +3116,8 @@ msgid "Enable Bloom Debug"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Debanding"
msgstr "Ставсӧ ӧзтыны"
msgstr "Лӧсьӧдӧм ӧзтыны"
#: src/settings_translation_file.cpp
msgid ""
@ -3158,9 +3139,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Post Processing"
msgstr "Контроллерсӧ ӧзтыны"
msgstr "Содтӧд эффектъяслысь вӧччӧм ӧзтыны"
#: src/settings_translation_file.cpp
msgid "Enable Raytraced Culling"
@ -3431,9 +3411,8 @@ msgid "Fog"
msgstr "Ру"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Fog start"
msgstr "Руалӧм суйӧр"
msgstr "Руалӧмлӧн доръяс"
#: src/settings_translation_file.cpp
msgid "Font"
@ -3457,7 +3436,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Font size"
msgstr "Шрифтлӧн ыдждаыс"
msgstr "Шрифтлӧн ыджда"
#: src/settings_translation_file.cpp
msgid "Font size divisible by"
@ -4222,7 +4201,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Main menu script"
msgstr "Медшӧр менюлӧн скриптыс"
msgstr "Медшӧр менюлӧн скрипт"
#: src/settings_translation_file.cpp
msgid ""
@ -4628,9 +4607,8 @@ msgid "Mouse sensitivity multiplier."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Movement threshold"
msgstr "Вештӧм"
msgstr "Вуджан тагӧс"
#: src/settings_translation_file.cpp
msgid "Mud noise"
@ -4816,9 +4794,8 @@ msgid "Player transfer distance"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Poisson filtering"
msgstr "Пуассонлӧн юклӧм"
msgstr "Пуассон серти разӧдӧм"
#: src/settings_translation_file.cpp
msgid "Post Processing"
@ -4867,9 +4844,8 @@ msgid "Proportion of large caves that contain liquid."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Protocol version minimum"
msgstr "Протоколлӧн версияыс оз лӧсяв. "
msgstr "Протоколлӧн медічӧт версия"
#: src/settings_translation_file.cpp
msgid "Punch gesture"
@ -5146,11 +5122,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Server URL"
msgstr "Серверлӧн инпасыс"
msgstr "Серверлӧн инпас"
#: src/settings_translation_file.cpp
msgid "Server address"
msgstr "Серверлӧн доменыс"
msgstr "Серверлӧн домен"
#: src/settings_translation_file.cpp
msgid "Server description"
@ -5158,7 +5134,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Server name"
msgstr "Серверлӧн нимыс"
msgstr "Серверлӧн ним"
#: src/settings_translation_file.cpp
msgid "Server port"
@ -5303,7 +5279,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Shadow strength gamma"
msgstr "Вуджӧрлӧн гаммаыс"
msgstr "Вуджӧрлӧн гамма"
#: src/settings_translation_file.cpp
msgid "Show debug info"
@ -5751,9 +5727,8 @@ msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Translucent liquids"
msgstr "Сӧдзтӧм кизьӧрторъяс"
msgstr "Сӧдзов кизьӧрторъяс"
#: src/settings_translation_file.cpp
msgid "Transparency Sorting Distance"
@ -5800,7 +5775,6 @@ msgid "URL to the server list displayed in the Multiplayer Tab."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Undersampling"
msgstr "Субдискретизация"
@ -5888,7 +5862,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "User Interfaces"
msgstr "Интерфейсъяс"
@ -6057,7 +6030,7 @@ msgstr "Лайкъялысь быдмӧгъяс"
#: src/settings_translation_file.cpp
msgid "Weblink color"
msgstr "Ыстӧглӧн рӧмыс"
msgstr "Ыстӧглӧн рӧм"
#: src/settings_translation_file.cpp
msgid ""
@ -6220,7 +6193,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "cURL"
msgstr "cURL"
msgstr "URL"
#: src/settings_translation_file.cpp
msgid "cURL file download timeout"

File diff suppressed because it is too large Load diff

View file

@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: Romanian (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-11 15:14+0200\n"
"PO-Revision-Date: 2024-03-04 07:35+0000\n"
"Last-Translator: Lars Müller <appgurulars@gmx.de>\n"
"PO-Revision-Date: 2024-07-27 04:09+0000\n"
"Last-Translator: AlexTECPlayz <alextec70@outlook.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/minetest/"
"minetest/ro/>\n"
"Language: ro\n"
@ -13,7 +13,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2;\n"
"X-Generator: Weblate 5.5-dev\n"
"X-Generator: Weblate 5.7-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@ -72,9 +72,8 @@ msgid "Command not available: "
msgstr "Comandă indisponibilă: "
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "Get help for commands (-t: output in chat)"
msgstr "Obține ajutor pentru comenzi"
msgstr "Obțineți ajutor pentru comenzi (-t: răspuns în chat)"
#: builtin/common/chatcommands.lua
msgid ""
@ -84,9 +83,8 @@ msgstr ""
"complete."
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "[all | <cmd>] [-t]"
msgstr "[all | <cmd>]"
msgstr "[all | <cmd>] [-t]"
#: builtin/fstk/ui.lua
msgid "<none available>"
@ -121,7 +119,6 @@ msgid "Protocol version mismatch. "
msgstr "Nepotrivire versiune protocol. "
#: builtin/mainmenu/common.lua
#, fuzzy
msgid "Server enforces protocol version $1. "
msgstr "Serverul forțează versiunea protocolului $1. "
@ -150,11 +147,10 @@ msgid "Failed to download $1"
msgstr "Nu s-a putut descărca $1"
#: builtin/mainmenu/content/contentdb.lua
#, fuzzy
msgid ""
"Failed to extract \"$1\" (insufficient disk space, unsupported file type or "
"broken archive)"
msgstr "Eroare la despachetarea „$1” (fișier incompatibil sau arhivă defectă)"
msgstr "Eroare în extragerea „$1” (fișier incompatibil sau arhivă coruptă)"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid ""
@ -186,7 +182,7 @@ msgstr "Descărcare..."
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Error getting dependencies for package"
msgstr ""
msgstr "Eroare la obținerea dependențelor pentru pachet"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Games"
@ -464,7 +460,7 @@ msgstr "Decorațiuni"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Desert temples"
msgstr ""
msgstr "Temple în deșert"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Development Test is meant for developers."
@ -474,7 +470,7 @@ msgstr "„Development Test” este destinat dezvoltatorilor."
msgid ""
"Different dungeon variant generated in desert biomes (only if dungeons "
"enabled)"
msgstr ""
msgstr "Variantă diferită de temniță generată în ecosisteme deșertice"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@ -695,9 +691,8 @@ msgid "Minetest Game is no longer installed by default"
msgstr "Minetest Game nu mai este instalat în mod implicit"
#: builtin/mainmenu/dlg_reinstall_mtg.lua
#, fuzzy
msgid "Reinstall Minetest Game"
msgstr "Instalează un alt joc"
msgstr "Reinstalați jocul Minetest"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
@ -774,9 +769,8 @@ msgid "Select file"
msgstr "Selectează fila"
#: builtin/mainmenu/settings/components.lua
#, fuzzy
msgid "Set"
msgstr "Selectează"
msgstr "Selectați"
#: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua
msgid "(No description of setting given)"
@ -878,9 +872,8 @@ msgid "Movement"
msgstr "Mișscare"
#: builtin/mainmenu/settings/dlg_settings.lua
#, fuzzy
msgid "Reset setting to default"
msgstr "Restabilește valori implicite"
msgstr "Restabiliți la valorile implicite"
#: builtin/mainmenu/settings/dlg_settings.lua
msgid "Reset setting to default ($1)"
@ -1000,18 +993,16 @@ msgid "Browse online content"
msgstr "Căutați conținut online"
#: builtin/mainmenu/tab_content.lua
#, fuzzy
msgid "Browse online content [$1]"
msgstr "Căutați conținut online"
msgstr "Explorați conținut online [$1]"
#: builtin/mainmenu/tab_content.lua
msgid "Content"
msgstr "Conţinut"
#: builtin/mainmenu/tab_content.lua
#, fuzzy
msgid "Content [$1]"
msgstr "Conţinut"
msgstr "Conţinut [$1]"
#: builtin/mainmenu/tab_content.lua
msgid "Disable Texture Pack"
@ -1034,9 +1025,8 @@ msgid "Rename"
msgstr "Redenumiți"
#: builtin/mainmenu/tab_content.lua
#, fuzzy
msgid "Update available?"
msgstr "<indisponibilă>"
msgstr "Actualizare disponibilă?"
#: builtin/mainmenu/tab_content.lua
msgid "Use Texture Pack"
@ -1075,15 +1065,16 @@ msgid "Install games from ContentDB"
msgstr "Instalarea jocurilor din ContentDB"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "Minetest doesn't come with a game by default."
msgstr "Minetest Game nu mai este instalat în mod implicit"
msgstr "Minetest nu vine cu un joc preinstalat."
#: builtin/mainmenu/tab_local.lua
msgid ""
"Minetest is a game-creation platform that allows you to play many different "
"games."
msgstr ""
"Minetest este o platformă de creare de jocuri care vă permite să jucați "
"multe jocuri diferite."
#: builtin/mainmenu/tab_local.lua
msgid "New"
@ -1118,9 +1109,8 @@ msgid "Start Game"
msgstr "Începe Jocul"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "You need to install a game before you can create a world."
msgstr "Trebuie să instalezi un joc înainte să poți instala un mod"
msgstr "Trebuie să instalați un joc înainte să puteți crea o lume."
#: builtin/mainmenu/tab_online.lua
msgid "Address"
@ -1294,10 +1284,8 @@ msgid "Camera update enabled"
msgstr "Actualizarea camerei este activată"
#: src/client/game.cpp
#, fuzzy
msgid "Can't show block bounds (disabled by game or mod)"
msgstr ""
"Nu se pot afișa limitele blocurilor (dezactivate de modificare sau joc)"
msgstr "Nu se pot afișa limitele blocurilor (dezactivate de mod sau joc)"
#: src/client/game.cpp
msgid "Change Password"
@ -1336,7 +1324,6 @@ msgid "Continue"
msgstr "Continuă"
#: src/client/game.cpp
#, fuzzy
msgid ""
"Controls:\n"
"No menu open:\n"
@ -1351,18 +1338,18 @@ msgid ""
"- touch&drag, tap 2nd finger\n"
" --> place single item to slot\n"
msgstr ""
"Controale implicite:\n"
"Niciun meniu vizibil:\n"
"- apăsare unică: activare buton\n"
"- apăsare dublă: plasare / utilizare\n"
"- deget glisant: privește în jur\n"
"Meniu / Inventar vizibil:\n"
"- apăsare dublă (exterior):\n"
" -> close\n"
"- touch stack, slot pentru atingere:\n"
" -> mută stiva\n"
"- atingeți și trageți, atingeți al doilea deget\n"
" -> plasați un singur element în slot\n"
"Controale:\n"
"Niciun meniu deschis:\n"
"- glisați degetul: priviți în jur\n"
"- apăsați: plasați/perforați/utilizați (implicit)\n"
"- apăsați lung: săpați/utilizați (implicit)\n"
"Meniu/inventar deschis:\n"
"- dublă apăsare (în exterior):\n"
" --> închideți\n"
"- atingeți grămada, atingeți slotul:\n"
" --> mutați grămada\n"
"- atingeți și trageți, apăsați cu un al doilea deget\n"
" --> plasați un singur articol în slot\n"
#: src/client/game.cpp
#, c-format
@ -1435,9 +1422,8 @@ msgid "Fog enabled"
msgstr "Ceață activată"
#: src/client/game.cpp
#, fuzzy
msgid "Fog enabled by game or mod"
msgstr "Zoom dezactivat în prezent de joc sau mod"
msgstr "Ceață activată de joc sau mod"
#: src/client/game.cpp
msgid "Game info:"
@ -1559,23 +1545,21 @@ msgid "Unable to listen on %s because IPv6 is disabled"
msgstr "Ascultarea pe %s nu este posibilă pentru că IPv6 este dezactivat"
#: src/client/game.cpp
#, fuzzy
msgid "Unlimited viewing range disabled"
msgstr "Interval de vizualizare nelimitat activat"
msgstr "Distanță de vizibilitate nelimitată dezactivată"
#: src/client/game.cpp
#, fuzzy
msgid "Unlimited viewing range enabled"
msgstr "Interval de vizualizare nelimitat activat"
msgstr "Distanță de vizibilitate nelimitată activată"
#: src/client/game.cpp
msgid "Unlimited viewing range enabled, but forbidden by game or mod"
msgstr "Rază infinită de vedere activată. dar interzisă de joc sau mod"
#: src/client/game.cpp
#, fuzzy, c-format
#, c-format
msgid "Viewing changed to %d (the minimum)"
msgstr "Intervalul de vizualizare este cel puțin: %d"
msgstr "Distanța de vizibilitate schimbată la %d (minimă)"
#: src/client/game.cpp
#, c-format
@ -1589,9 +1573,9 @@ msgid "Viewing range changed to %d"
msgstr "Intervalul de vizualizare s-a modificat la %d"
#: src/client/game.cpp
#, fuzzy, c-format
#, c-format
msgid "Viewing range changed to %d (the maximum)"
msgstr "Intervalul de vizualizare s-a modificat la %d"
msgstr "Distanța de vizibilitate schimbată la %d (maximă)"
#: src/client/game.cpp
#, c-format
@ -1601,9 +1585,10 @@ msgstr ""
"Vederea schimbată la %d (maximul), dar limitată la %d de către joc sau mod"
#: src/client/game.cpp
#, fuzzy, c-format
#, c-format
msgid "Viewing range changed to %d, but limited to %d by game or mod"
msgstr "Intervalul de vizualizare s-a modificat la %d"
msgstr ""
"Distanța de vizibilitate schimbată la %d, dar limitată la %d de joc sau mod"
#: src/client/game.cpp
#, c-format
@ -1657,28 +1642,24 @@ msgstr "Înapoi"
#. ~ Usually paired with the Pause key
#: src/client/keycode.cpp
#, fuzzy
msgid "Break Key"
msgstr "Cheie pentru furiș"
msgstr "Tasta de pauză"
#: src/client/keycode.cpp
msgid "Caps Lock"
msgstr "Majuscule"
#: src/client/keycode.cpp
#, fuzzy
msgid "Clear Key"
msgstr "Șterge"
msgstr "Tasta de eliminare"
#: src/client/keycode.cpp
#, fuzzy
msgid "Control Key"
msgstr "Control"
msgstr "Tasta Control"
#: src/client/keycode.cpp
#, fuzzy
msgid "Delete Key"
msgstr "Șterge"
msgstr "Tasta de ștergere"
#: src/client/keycode.cpp
msgid "Down Arrow"
@ -1729,9 +1710,8 @@ msgid "Insert"
msgstr "Insert"
#: src/client/keycode.cpp
#, fuzzy
msgid "Left Arrow"
msgstr "Ctrl Stânga"
msgstr "Săgeată stânga"
#: src/client/keycode.cpp
msgid "Left Button"
@ -1755,9 +1735,8 @@ msgstr "Windows Stânga"
#. ~ Key name, common on Windows keyboards
#: src/client/keycode.cpp
#, fuzzy
msgid "Menu Key"
msgstr "Meniu"
msgstr "Tastă Meniu"
#: src/client/keycode.cpp
msgid "Middle Button"
@ -1832,20 +1811,17 @@ msgid "OEM Clear"
msgstr "Curățare OEM"
#: src/client/keycode.cpp
#, fuzzy
msgid "Page Down"
msgstr "Pagină în jos"
msgstr "Pagină jos"
#: src/client/keycode.cpp
#, fuzzy
msgid "Page Up"
msgstr "Pagină sus"
#. ~ Usually paired with the Break key
#: src/client/keycode.cpp
#, fuzzy
msgid "Pause Key"
msgstr "Pauză"
msgstr "Tasta Pauză"
#: src/client/keycode.cpp
msgid "Play"
@ -1857,14 +1833,12 @@ msgid "Print"
msgstr "Imprimare"
#: src/client/keycode.cpp
#, fuzzy
msgid "Return Key"
msgstr "Înapoi"
msgstr "Tasta Retur"
#: src/client/keycode.cpp
#, fuzzy
msgid "Right Arrow"
msgstr "Ctrl Dreapta"
msgstr "Săgeată dreapta"
#: src/client/keycode.cpp
msgid "Right Button"
@ -1896,9 +1870,8 @@ msgid "Select"
msgstr "Selectează"
#: src/client/keycode.cpp
#, fuzzy
msgid "Shift Key"
msgstr "Shift"
msgstr "Tasta Shift"
#: src/client/keycode.cpp
msgid "Sleep"
@ -1929,9 +1902,8 @@ msgid "X Button 2"
msgstr "X Butonul 2"
#: src/client/keycode.cpp
#, fuzzy
msgid "Zoom Key"
msgstr "Mărire"
msgstr "Tasta Mărire"
#: src/client/minimap.cpp
msgid "Minimap hidden"
@ -1952,13 +1924,13 @@ msgid "Minimap in texture mode"
msgstr "Mini hartă în modul de textură"
#: src/client/shader.cpp
#, fuzzy, c-format
#, c-format
msgid "Failed to compile the \"%s\" shader."
msgstr "Pagina nu s-a putut deschide"
msgstr "Eroare la compilarea shaderului \"%s\"."
#: src/client/shader.cpp
msgid "Shaders are enabled but GLSL is not supported by the driver."
msgstr ""
msgstr "Shaderele sunt activate dar GLSL nu este suportat de driver."
#. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3"
#: src/content/mod_configuration.cpp
@ -2155,16 +2127,15 @@ msgstr "apasă o tastă"
#: src/gui/guiOpenURL.cpp
msgid "Open"
msgstr ""
msgstr "Deschideți"
#: src/gui/guiOpenURL.cpp
msgid "Open URL?"
msgstr ""
msgstr "Deschideți URL?"
#: src/gui/guiOpenURL.cpp
#, fuzzy
msgid "Unable to open URL"
msgstr "Pagina nu s-a putut deschide"
msgstr "URL nu s-a putut deschide"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
@ -2215,9 +2186,9 @@ msgid "Name is taken. Please choose another name"
msgstr "Numele este folosit. Vă rugăm să alegeți altul"
#: src/server.cpp
#, fuzzy, c-format
#, c-format
msgid "%s while shutting down: "
msgstr "Se închide..."
msgstr "%s în timp ce se închide: "
#: src/settings_translation_file.cpp
msgid ""
@ -2462,7 +2433,7 @@ msgstr "Avansat"
#: src/settings_translation_file.cpp
msgid "Allows liquids to be translucent."
msgstr ""
msgstr "Permiteți lichidelor să fie transparente."
#: src/settings_translation_file.cpp
msgid ""
@ -3132,19 +3103,21 @@ msgstr "Definește zonele unde copacii pot avea mere."
#: src/settings_translation_file.cpp
msgid "Defines areas with sandy beaches."
msgstr ""
msgstr "Definește zone cu plaje nisipoase."
#: src/settings_translation_file.cpp
msgid "Defines distribution of higher terrain and steepness of cliffs."
msgstr ""
msgstr "Definește distribuția de teren înalt și înclinația stâncilor."
#: src/settings_translation_file.cpp
msgid "Defines distribution of higher terrain."
msgstr ""
msgstr "Definește distribuția de teren înalt."
#: src/settings_translation_file.cpp
msgid "Defines full size of caverns, smaller values create larger caverns."
msgstr ""
"Definește mărimea totală a cavernelor, valori mai mici vor crea caverne mai "
"mari."
#: src/settings_translation_file.cpp
msgid ""
@ -3155,25 +3128,27 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Defines large-scale river channel structure."
msgstr ""
msgstr "Definește structura canalelor de scală mare."
#: src/settings_translation_file.cpp
msgid "Defines location and terrain of optional hills and lakes."
msgstr ""
msgstr "Definește locația și terenul dealurilor și lacurilor opționale."
#: src/settings_translation_file.cpp
msgid "Defines the base ground level."
msgstr ""
msgstr "Definește nivelul de bază al solului."
#: src/settings_translation_file.cpp
msgid "Defines the depth of the river channel."
msgstr ""
msgstr "Definește adâncimea canalul unui râu."
#: src/settings_translation_file.cpp
msgid ""
"Defines the magnitude of bloom overexposure.\n"
"Range: from 0.1 to 10.0, default: 1.0"
msgstr ""
"Definește magnitudinea supraexpunerii la strălucire.\n"
"Interval: de la 0.1 la 10.0, implicit: 1.0"
#: src/settings_translation_file.cpp
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: Russian (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-11 15:14+0200\n"
"PO-Revision-Date: 2024-07-07 10:09+0000\n"
"PO-Revision-Date: 2024-07-16 12:09+0000\n"
"Last-Translator: BlackImpostor <SkyBuilderOFFICAL@yandex.ru>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/minetest/"
"minetest/ru/>\n"
@ -11,8 +11,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.7-dev\n"
#: builtin/client/chatcommands.lua
@ -72,9 +72,8 @@ msgid "Command not available: "
msgstr "Команда недоступна: "
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "Get help for commands (-t: output in chat)"
msgstr "Получить справку по командам"
msgstr "Получить справку по командам (-t: вывод в чат)"
#: builtin/common/chatcommands.lua
msgid ""
@ -84,9 +83,8 @@ msgstr ""
"help all» для вывода всего списка."
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "[all | <cmd>] [-t]"
msgstr "[all | <команда>]"
msgstr "[all | <команда>] [-t]"
#: builtin/fstk/ui.lua
msgid "<none available>"
@ -149,12 +147,12 @@ msgid "Failed to download $1"
msgstr "Не удалось загрузить $1"
#: builtin/mainmenu/content/contentdb.lua
#, fuzzy
msgid ""
"Failed to extract \"$1\" (insufficient disk space, unsupported file type or "
"broken archive)"
msgstr ""
"Не удалось извлечь «$1» (неподдерживаемый тип файла или повреждённый архив)"
"Не удалось извлечь «$1» (недостаточно места на диске, неподдерживаемый тип "
"файла или поврежденный архив)"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid ""
@ -186,7 +184,7 @@ msgstr "Загрузка…"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Error getting dependencies for package"
msgstr ""
msgstr "Ошибка при получении зависимостей для дополнения"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Games"
@ -464,7 +462,7 @@ msgstr "Декорации"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Desert temples"
msgstr ""
msgstr "Пустынные храмы"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Development Test is meant for developers."
@ -475,6 +473,8 @@ msgid ""
"Different dungeon variant generated in desert biomes (only if dungeons "
"enabled)"
msgstr ""
"Другой вариант данжей, генерируемый в биомах пустыни (только если включены "
"сами данжи)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@ -1069,15 +1069,16 @@ msgid "Install games from ContentDB"
msgstr "Установить игры с ContentDB"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "Minetest doesn't come with a game by default."
msgstr "Minetest Game больше не установлен по умолчанию"
msgstr "Minetest Game больше не стоит по умолчанию."
#: builtin/mainmenu/tab_local.lua
msgid ""
"Minetest is a game-creation platform that allows you to play many different "
"games."
msgstr ""
"Minetest - это платформа для создания модификаций, которая позволяет вам "
"играть во множество различных игр и устанавливать дополнения."
#: builtin/mainmenu/tab_local.lua
msgid "New"
@ -1112,9 +1113,8 @@ msgid "Start Game"
msgstr "Начать игру"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "You need to install a game before you can create a world."
msgstr "Вам нужно установить игру, прежде чем вы сможете установить мод"
msgstr "Вам требуется установить игру, прежде чем вы сможете создать мир."
#: builtin/mainmenu/tab_online.lua
msgid "Address"
@ -1328,7 +1328,6 @@ msgid "Continue"
msgstr "Продолжить"
#: src/client/game.cpp
#, fuzzy
msgid ""
"Controls:\n"
"No menu open:\n"
@ -1343,17 +1342,17 @@ msgid ""
"- touch&drag, tap 2nd finger\n"
" --> place single item to slot\n"
msgstr ""
"Управление по умолчанию:\n"
"Меню скрыто:\n"
"Управление:\n"
"Нет открытых меню:\n"
"- провести пальцем: осмотреться\n"
"- нажатие: разместить/применить\n"
"- долгое нажатие: копать/удар/применить\n"
"В меню/инвентаре:\n"
"В открытом меню:\n"
"- двойное нажатие (вне меню)\n"
" --> закрыть меню\n"
"- нажать на стак, затем на слот:\n"
" --> передвинуть стак\n"
"- потащить стак, нажать вторым пальцем:\n"
"- нажать и потащить стак, нажать вторым пальцем:\n"
" --> положить один предмет в слот\n"
#: src/client/game.cpp
@ -1427,9 +1426,8 @@ msgid "Fog enabled"
msgstr "Туман включён"
#: src/client/game.cpp
#, fuzzy
msgid "Fog enabled by game or mod"
msgstr "Приближение на данный момент отключено игрой или модом"
msgstr "Туман включён игрой или модом"
#: src/client/game.cpp
msgid "Game info:"
@ -1929,13 +1927,13 @@ msgid "Minimap in texture mode"
msgstr "Миникарта в текстурном режиме"
#: src/client/shader.cpp
#, fuzzy, c-format
#, c-format
msgid "Failed to compile the \"%s\" shader."
msgstr "Не удалось открыть страницу"
msgstr "Не удалось скомпилировать шейдер «%s»."
#: src/client/shader.cpp
msgid "Shaders are enabled but GLSL is not supported by the driver."
msgstr ""
msgstr "Шейдеры включены, но GLSL не поддерживается драйвером."
#. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3"
#: src/content/mod_configuration.cpp
@ -2131,16 +2129,15 @@ msgstr "нажмите клавишу"
#: src/gui/guiOpenURL.cpp
msgid "Open"
msgstr ""
msgstr "Открыто"
#: src/gui/guiOpenURL.cpp
msgid "Open URL?"
msgstr ""
msgstr "Открыть URL-адрес?"
#: src/gui/guiOpenURL.cpp
#, fuzzy
msgid "Unable to open URL"
msgstr "Не удалось открыть страницу"
msgstr "Не удается открыть URL-адрес"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
@ -2432,7 +2429,7 @@ msgstr "Дополнительно"
#: src/settings_translation_file.cpp
msgid "Allows liquids to be translucent."
msgstr ""
msgstr "Позволяет жидкостям быть прозрачными."
#: src/settings_translation_file.cpp
msgid ""
@ -2502,6 +2499,16 @@ msgid ""
"With OpenGL ES, dithering only works if the shader supports high\n"
"floating-point precision and it may have a higher performance impact."
msgstr ""
"Примените сглаживание, чтобы уменьшить искажения цветовых полос.\n"
"Сглаживание значительно увеличивает размер\n"
"скриншотов, сжатых без потерь, и работает некорректно, если дисплей или "
"операционная система\n"
"выполняют дополнительное сглаживание или если цветовые каналы не квантованы\n"
"до 8 бит.\n"
"В OpenGL ES сглаживание работает только в том случае, если шейдер "
"поддерживает высокую\n"
"точность с плавающей запятой, и это может оказать более высокое влияние на "
"производительность."
#: src/settings_translation_file.cpp
msgid "Arm inertia"
@ -2520,7 +2527,6 @@ msgid "Ask to reconnect after crash"
msgstr "Запрашивать переподключение после краха"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"At this distance the server will aggressively optimize which blocks are sent "
"to\n"
@ -2532,17 +2538,19 @@ msgid ""
"optimization.\n"
"Stated in MapBlocks (16 nodes)."
msgstr ""
"На этом расстоянии сервер будет агрессивно оптимизировать то, какие\n"
"мапблоки будут отправлены клиентам.\n"
"Малые значения могут увеличить производительность за счёт заметных\n"
"проблем визуализации (некоторые фрагменты не будут отрисовываться\n"
"под водой, в пещерах, а иногда и на суше).\n"
"Установка этого значения больше, чем max_block_send_distance\n"
"отключит эту оптимизацию.\n"
"Указывается в мапблоках карты (16 нод)."
"На таком расстоянии сервер будет активно оптимизировать, какие блоки будут "
"отправляться\n"
"клиентам.\n"
"Небольшие значения потенциально значительно повышают производительность за "
"счет видимых\n"
"сбоев в рендеринге (некоторые блоки могут отображаться некорректно в шахтах)."
"\n"
"Установка значения, превышающего значение max_block_send_distance, отключает "
"эту\n"
"оптимизацию.\n"
"Указано в MapBlocks (16 нод)."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"At this distance the server will perform a simpler and cheaper occlusion "
"check.\n"
@ -2552,14 +2560,13 @@ msgid ""
"This is especially useful for very large viewing range (upwards of 500).\n"
"Stated in MapBlocks (16 nodes)."
msgstr ""
"На этом расстоянии сервер будет агрессивно оптимизировать то, какие\n"
"мапблоки будут отправлены клиентам.\n"
"Малые значения могут увеличить производительность за счёт заметных\n"
"проблем визуализации (некоторые фрагменты не будут отрисовываться\n"
"под водой, в пещерах, а иногда и на суше).\n"
"Установка этого значения больше, чем max_block_send_distance\n"
"отключит эту оптимизацию.\n"
"Указывается в мапблоках карты (16 нод)."
"На таком расстоянии сервер выполнит более простую и дешевую проверку "
"окклюзии.\n"
"Меньшие значения потенциально повышают производительность за счет временно "
"заметных\n"
"сбоев в рендеринге (пропущенных блоков).\n"
"Это особенно полезно при очень большом диапазоне просмотра (более 500).\n"
"Указано в MapBlocks (16 узлов)."
#: src/settings_translation_file.cpp
msgid "Audio"
@ -2622,9 +2629,8 @@ msgid "Biome noise"
msgstr "Шум биомов"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Block cull optimize distance"
msgstr "Дистанция оптимизирования отправки мапблока"
msgstr "Отбраковка блоков оптимизирует расстояние"
#: src/settings_translation_file.cpp
msgid "Block send optimize distance"
@ -2847,6 +2853,10 @@ msgid ""
"Comma-separated list of AL and ALC extensions that should not be used.\n"
"Useful for testing. See al_extensions.[h,cpp] for details."
msgstr ""
"Список разделенных запятыми расширений AL и ALC, которые не следует "
"использовать.\n"
"Полезно для тестирования. Подробности смотрите в разделе "
"al_extensions.[h,cpp]."
#: src/settings_translation_file.cpp
msgid ""
@ -3069,7 +3079,6 @@ msgstr ""
"но также использует больше ресурсов."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Define the oldest clients allowed to connect.\n"
"Older clients are compatible in the sense that they will not crash when "
@ -3081,11 +3090,16 @@ msgid ""
"Minetest still enforces its own internal minimum, and enabling\n"
"strict_protocol_version_checking will effectively override this."
msgstr ""
"Включите, чтобы запретить подключение старых клиентов.\n"
"Старые клиенты совместимы в том смысле, что они не будут крашиться при "
"подключении\n"
"к новым серверам, однако они могут не поддерживать всех новых функций, "
"которые вы ожидаете."
"Определите, к каким самым старым клиентам разрешено подключаться.\n"
"Старые клиенты совместимы в том смысле, что они не будут выходить из строя "
"при подключении\n"
"к новым серверам, но они могут поддерживать не все новые функции, которые вы "
"ожидаете.\n"
"Это позволяет осуществлять более детальный контроль, чем "
"strict_protocol_version_checking.\n"
"Minetest по-прежнему применяет свой собственный внутренний минимум, и "
"включение\n"
"strict_protocol_version_checking эффективно отменит это."
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@ -3291,9 +3305,8 @@ msgid "Enable Bloom Debug"
msgstr "Включить отладку свечения"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Debanding"
msgstr "Включить урон"
msgstr "Включить Дебандинг"
#: src/settings_translation_file.cpp
msgid ""
@ -3322,9 +3335,8 @@ msgstr ""
"противном случае используется фильтрация PCF."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Post Processing"
msgstr "Постобработка"
msgstr "Включить Постобработку"
#: src/settings_translation_file.cpp
msgid "Enable Raytraced Culling"
@ -3376,9 +3388,9 @@ msgid "Enable mouse wheel (scroll) for item selection in hotbar."
msgstr "Включает колёсико мыши (прокрутку) для выбора предмета в хотбаре."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable random mod loading (mainly used for testing)."
msgstr "Включить случайный ввод пользователя (только для тестов)."
msgstr ""
"Включите случайную загрузку модов (в основном используемых для тестирования)."
#: src/settings_translation_file.cpp
msgid "Enable random user input (only used for testing)."
@ -3411,9 +3423,8 @@ msgstr ""
"которые вы ожидаете."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable touchscreen"
msgstr "Сенсорный экран"
msgstr "Включить сенсорный экран"
#: src/settings_translation_file.cpp
msgid ""
@ -3468,16 +3479,18 @@ msgstr "Включает кэширование повёрнутых мешей.
#: src/settings_translation_file.cpp
msgid "Enables debug and error-checking in the OpenGL driver."
msgstr ""
msgstr "Включает отладку и проверку ошибок в драйвере OpenGL."
#: src/settings_translation_file.cpp
msgid "Enables the post processing pipeline."
msgstr ""
msgstr "Включает конвейер последующей обработки."
#: src/settings_translation_file.cpp
msgid ""
"Enables touchscreen mode, allowing you to play the game with a touchscreen."
msgstr ""
"Включает сенсорный режим, позволяющий играть в игру с помощью сенсорного "
"экрана."
#: src/settings_translation_file.cpp
msgid ""
@ -4400,15 +4413,15 @@ msgstr ""
"- Opaque: прозачность отключена"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Length of a server tick (the interval at which everything is generally "
"updated),\n"
"stated in seconds.\n"
"Does not apply to sessions hosted from the client menu."
msgstr ""
"Длительность шага сервера и интервал, с которым объекты обычно\n"
"обновляются по сети, в секундах."
"Длительность тика сервера (интервал, с которым обычно все обновляется),\n"
"указанная в секундах.\n"
"Не применяется к сеансам, размещенным из клиентского меню."
#: src/settings_translation_file.cpp
msgid "Length of liquid waves."
@ -4636,7 +4649,6 @@ msgid "Map generation attributes specific to Mapgen v5."
msgstr "Атрибуты генерации для мапгена v5."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"The 'snowbiomes' flag enables the new 5 biome system.\n"
@ -4645,10 +4657,12 @@ msgid ""
"The 'temples' flag disables generation of desert temples. Normal dungeons "
"will appear instead."
msgstr ""
"Атрибуты генерации для мапгена v6.\n"
"Параметр «snowbiomes» (снежные биомы) включает новую систему с 5 биомами.\n"
"Если «snowbiomes» включён, то автоматически активируются джунгли,\n"
"а флаг «jungles» не учитывается."
"Атрибуты создания карт, специфичные для Mapgen v6.\n"
"Флаг «snowbiomes» включает новую систему 5 биомов.\n"
"При включенном флаге «snowbiomes» автоматически включаются джунгли, а\n"
"флаг «jungles» игнорируется.\n"
"Флаг «temples» отключает создание храмов в пустыне. Вместо них появятся "
"обычные данжи."
#: src/settings_translation_file.cpp
msgid ""
@ -4954,9 +4968,8 @@ msgid "Minimap scan height"
msgstr "Высота сканирования миникарты"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Minimum dig repetition interval"
msgstr "Интервал повторного размещения"
msgstr "Минимальный интервал повторения раскопок"
#: src/settings_translation_file.cpp
msgid "Minimum limit of random number of large caves per mapchunk."
@ -5027,9 +5040,8 @@ msgid "Mouse sensitivity multiplier."
msgstr "Множитель чувствительности мыши."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Movement threshold"
msgstr "Порог пещер"
msgstr "Порог перемещения"
#: src/settings_translation_file.cpp
msgid "Mud noise"
@ -5184,9 +5196,8 @@ msgstr ""
"Не срабатывает, если какая-либо форма уже открыта."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "OpenGL debug"
msgstr "Отладка мапгена"
msgstr "Отладка OpenGL"
#: src/settings_translation_file.cpp
msgid "Optional override for chat weblink color."
@ -5322,13 +5333,12 @@ msgid "Proportion of large caves that contain liquid."
msgstr "Соотношение больших пещер, которые содержат жидкости."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Protocol version minimum"
msgstr "Несоответствие версии протокола. "
msgstr "Минимальная версия протокола"
#: src/settings_translation_file.cpp
msgid "Punch gesture"
msgstr ""
msgstr "Жест удара кулаком"
#: src/settings_translation_file.cpp
msgid ""
@ -5349,7 +5359,7 @@ msgstr "Случайный ввод"
#: src/settings_translation_file.cpp
msgid "Random mod load order"
msgstr ""
msgstr "Случайный порядок загрузки мода"
#: src/settings_translation_file.cpp
msgid "Recent Chat Messages"
@ -5560,7 +5570,6 @@ msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "См. http://www.sqlite.org/pragma.html#pragma_synchronous"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Select the antialiasing method to apply.\n"
"\n"
@ -5583,22 +5592,25 @@ msgid ""
msgstr ""
"Выберите метод сглаживания, который необходимо применить.\n"
"\n"
"* None - сглаживание отсутствует (по умолчанию)\n"
"* * Нет - сглаживание отсутствует (по умолчанию).\n"
"\n"
"* FSAA - аппаратное полноэкранное сглаживание (несовместимое с шейдерами)\n"
", известное как сглаживание с несколькими выборками (MSAA)\n"
"* FSAA - Аппаратное полноэкранное сглаживание\n"
"(несовместимое с постобработкой и недостаточной дискретизацией)\n"
", аналогичное сглаживанию с несколькими выборками (MSAA)\n"
"Сглаживает края блоков, но не влияет на внутреннюю часть текстур.\n"
"Для изменения этого параметра требуется перезагрузка.\n"
"\n"
"* FXAA - быстрое приблизительное сглаживание (требуются шейдеры)\n"
"Применяет фильтр постобработки для обнаружения и сглаживания "
"* FXAA - Быстрое приблизительное сглаживание (требуется использование "
"шейдеров)\n"
"Применяется фильтр последующей обработки для обнаружения и сглаживания "
"высококонтрастных краев.\n"
"Обеспечивает баланс между скоростью и качеством изображения.\n"
"\n"
"* SSAA - сглаживание с супер-выборкой (требуются шейдеры)\n"
"Рендерит изображение сцены с более высоким разрешением, затем уменьшает "
"масштаб,\n"
"чтобы уменьшить эффекты наложения. Это самый медленный и точный метод."
"* SSAA - сглаживание с использованием суперсэмплирования (требуются шейдеры)"
"\n"
"Визуализирует изображение сцены с более высоким разрешением, затем уменьшает "
"масштаб, чтобы уменьшить\n"
"эффекты наложения. Это самый медленный и точный метод."
#: src/settings_translation_file.cpp
msgid "Selection box border color (R,G,B)."
@ -5727,13 +5739,12 @@ msgstr ""
"Диапазон: от -1 до 1.0"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Set the language. By default, the system language is used.\n"
"A restart is required after changing this."
msgstr ""
"Устанавливает язык. Оставьте пустым, чтобы использовать системный язык.\n"
"Требует перезапуска после изменения."
"Установит язык. По умолчанию используется язык системы.\n"
"После изменения этого параметра требуется перезагрузка."
#: src/settings_translation_file.cpp
msgid ""
@ -5776,6 +5787,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Set to true to enable volumetric lighting effect (a.k.a. \"Godrays\")."
msgstr ""
"Установите значение true, чтобы включить эффект объемного освещения (он же "
"\"Божественные лучи\")."
#: src/settings_translation_file.cpp
msgid "Set to true to enable waving leaves."
@ -5822,16 +5835,14 @@ msgid "Shaders"
msgstr "Шейдеры"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Shaders allow advanced visual effects and may increase performance on some "
"video\n"
"cards."
msgstr ""
"Шейдеры позволяют использовать дополнительные визуальные эффекты и могут "
"увеличить\n"
"производительность некоторых видеоплат.\n"
"Работают только с движком отрисовки OpenGL."
"Шейдеры позволяют создавать расширенные визуальные эффекты и могут повысить "
"производительность некоторых\n"
"видеокарт."
#: src/settings_translation_file.cpp
msgid "Shadow filter quality"
@ -5952,14 +5963,13 @@ msgid "Smooth lighting"
msgstr "Мягкое освещение"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Smooths rotation of camera when in cinematic mode, 0 to disable. Enter "
"cinematic mode by using the key set in Controls."
msgstr ""
"Плавное вращение камеры в кинематографичном режиме, 0 для отключения. "
"Включите кинематографичный режим клавишей, определённой в настройках "
"управления."
"Сглаживает поворот камеры в кинематографическом режиме, 0 для отключения. "
"Войдите в кинематографический режим, используя клавишу, установленную в "
"элементах управления."
#: src/settings_translation_file.cpp
msgid ""
@ -5986,9 +5996,8 @@ msgid "Sound"
msgstr "Звук"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Sound Extensions Blacklist"
msgstr "Чёрный список меток ContentDB"
msgstr "Черный список Расширений Звука"
#: src/settings_translation_file.cpp
msgid ""
@ -6204,6 +6213,8 @@ msgid ""
"The delay in milliseconds after which a touch interaction is considered a "
"long tap."
msgstr ""
"Задержка в миллисекундах, после которой сенсорное взаимодействие считается "
"длительным нажатием."
#: src/settings_translation_file.cpp
msgid ""
@ -6223,17 +6234,26 @@ msgid ""
"Known from the classic Minetest mobile controls.\n"
"Combat is more or less impossible."
msgstr ""
"Жест, обозначающий удар по игроку/объекту.\n"
"Его можно изменить в играх и модах.\n"
"\n"
"* короткий удар\n"
"Прост в использовании и хорошо известен по другим играм, названия которых не "
"указываются.\n"
"\n"
"* длинный удар\n"
"Известен по классическому мобильному элементу управления Minetest.\n"
"Сражение более или менее невозможно."
#: src/settings_translation_file.cpp
msgid "The identifier of the joystick to use"
msgstr "Идентификатор используемого контроллера"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The length in pixels after which a touch interaction is considered movement."
msgstr ""
"Расстояние в пикселях, с которого начинается действие от сенсорного экрана."
"Длина в пикселях, после которой сенсорное взаимодействие считается движением."
#: src/settings_translation_file.cpp
msgid ""
@ -6248,13 +6268,13 @@ msgstr ""
"Значение по умолчанию — 1.0 (1/2 ноды)."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The minimum time in seconds it takes between digging nodes when holding\n"
"the dig button."
msgstr ""
"Задержка в секундах перед повторным размещением ноды\n"
"при удержании клавиши размещения."
"Минимальное время в секундах, которое требуется между копающими узлами при "
"удерживании\n"
"кнопки копать."
#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
@ -6287,17 +6307,17 @@ msgstr ""
"Это должно быть настроено вместе с active_object_send_range_blocks."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The rendering back-end.\n"
"Note: A restart is required after changing this!\n"
"OpenGL is the default for desktop, and OGLES2 for Android.\n"
"Shaders are supported by everything but OGLES1."
msgstr ""
"Движок отрисовки.\n"
"Примечение: после изменения этой настройки требуется перезапуск!\n"
"OpenGL по умолчанию для компьютеров и OGLES2 для Android.\n"
"Шейдеры поддерживаются OpenGL и OGLES2 (экспериментально)."
"Серверная часть рендеринга.\n"
"Примечание: После изменения этого параметра требуется перезагрузка!\n"
"По умолчанию для настольных компьютеров используется OpenGL, а для Android - "
"OGLES2.\n"
"Шейдеры поддерживаются всеми, кроме OGLES1."
#: src/settings_translation_file.cpp
msgid ""
@ -6377,7 +6397,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Threshold for long taps"
msgstr ""
msgstr "Порог для длинных нажатий"
#: src/settings_translation_file.cpp
msgid ""
@ -6438,9 +6458,8 @@ msgid "Tradeoffs for performance"
msgstr "Компромиссы для производительности"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Translucent liquids"
msgstr "Непрозрачные жидкости"
msgstr "Полупрозрачные жидкости"
#: src/settings_translation_file.cpp
msgid "Transparency Sorting Distance"
@ -6487,14 +6506,14 @@ msgstr ""
"производительностью."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"URL to JSON file which provides information about the newest Minetest "
"release\n"
"If this is empty the engine will never check for updates."
msgstr ""
"Адрес к файлу JSON, который предоставляет сведения о последнем выпуске "
"Minetest"
"URL-адрес файла JSON, который предоставляет информацию о последней версии "
"Minetest\n"
"Если поле не заполнено, движок никогда не будет проверять наличие обновлений."
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
@ -6709,7 +6728,7 @@ msgstr "Громкость"
#: src/settings_translation_file.cpp
msgid "Volume multiplier when the window is unfocused."
msgstr ""
msgstr "Увеличивается громкость, когда окно не сфокусировано."
#: src/settings_translation_file.cpp
msgid ""
@ -6720,14 +6739,12 @@ msgstr ""
"Требует включенной звуковой системы."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Volume when unfocused"
msgstr "Максимум FPS при паузе или вне фокуса"
msgstr "Громкость при расфокусировке"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Volumetric lighting"
msgstr "Мягкое освещение"
msgstr "Объемное освещение"
#: src/settings_translation_file.cpp
msgid ""

View file

@ -3,17 +3,17 @@ msgstr ""
"Project-Id-Version: Ukrainian (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-11 15:14+0200\n"
"PO-Revision-Date: 2024-06-23 19:09+0000\n"
"Last-Translator: YearOfFuture <yearoffuture@gmail.com>\n"
"PO-Revision-Date: 2024-08-04 22:09+0000\n"
"Last-Translator: Yof <Yof@users.noreply.hosted.weblate.org>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/minetest/"
"minetest/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.6-rc\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.7-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@ -72,9 +72,8 @@ msgid "Command not available: "
msgstr "Команда недоступна: "
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "Get help for commands (-t: output in chat)"
msgstr "Отримати довідку щодо команд"
msgstr "Отримати довідку щодо команд (-t: вивести у чаті)"
#: builtin/common/chatcommands.lua
msgid ""
@ -84,9 +83,8 @@ msgstr ""
"all', щоб перелічити все."
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "[all | <cmd>] [-t]"
msgstr "[all | <команда>]"
msgstr "[all | <команда>] [-t]"
#: builtin/fstk/ui.lua
msgid "<none available>"
@ -149,12 +147,12 @@ msgid "Failed to download $1"
msgstr "Не вдалося завантажити $1"
#: builtin/mainmenu/content/contentdb.lua
#, fuzzy
msgid ""
"Failed to extract \"$1\" (insufficient disk space, unsupported file type or "
"broken archive)"
msgstr ""
"Не вдалося витягти \"$1\" (непідтримуваний тип файлу або пошкоджений архів)"
"Не вдалося витягти \"$1\" (недостатнє місце на диску, непідтримуваний тип "
"файлу або пошкоджений архів)"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid ""
@ -186,7 +184,7 @@ msgstr "Завантаження..."
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Error getting dependencies for package"
msgstr ""
msgstr "Помилка при отриманні залежностей для пакунку"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Games"
@ -464,7 +462,7 @@ msgstr "Декорації"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Desert temples"
msgstr ""
msgstr "Храми пустель"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Development Test is meant for developers."
@ -475,6 +473,8 @@ msgid ""
"Different dungeon variant generated in desert biomes (only if dungeons "
"enabled)"
msgstr ""
"Інший варіант підземель, що генерується у біомах пустелі (тільки якщо "
"увімкнені підземелля)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@ -1068,15 +1068,15 @@ msgid "Install games from ContentDB"
msgstr "Встановити ігри з ContentDB"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "Minetest doesn't come with a game by default."
msgstr "Minetest Game більше не встановлюється за замовчуванням"
msgstr "Minetest більше не встановлювається з грою."
#: builtin/mainmenu/tab_local.lua
msgid ""
"Minetest is a game-creation platform that allows you to play many different "
"games."
msgstr ""
"Minetest це ігрова платформа, що дозволяє вам грати у багато різних ігор."
#: builtin/mainmenu/tab_local.lua
msgid "New"
@ -1111,9 +1111,8 @@ msgid "Start Game"
msgstr "Почати гру"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "You need to install a game before you can create a world."
msgstr "Вам потрібно встановити гру перед тим, як встановлювати мод"
msgstr "Вам потрібно встановити гру перед ти, як створювати світ."
#: builtin/mainmenu/tab_online.lua
msgid "Address"
@ -1327,7 +1326,6 @@ msgid "Continue"
msgstr "Продовжити"
#: src/client/game.cpp
#, fuzzy
msgid ""
"Controls:\n"
"No menu open:\n"
@ -1343,16 +1341,16 @@ msgid ""
" --> place single item to slot\n"
msgstr ""
"Керування:\n"
"Коли меню не відображається:\n"
"- провести пальцем: роззирнутися\n"
"- дотик: встановити/використати\n"
"- довгий дотик: копати/вдарити/використати\n"
"Коли відображається меню або інвертар:\n"
"- дотикнутися двічі (поза межами):\n"
"Коли немає відкритих меню:\n"
"- проведення пальцем: роззирнутися\n"
"- дотик: встановити/вдарити/використати\n"
"- довгий дотик: копати/використати\n"
"У відкритому меню або інвертарі:\n"
"- подвійний дотик (поза межами):\n"
" --> закрити\n"
"- Торкнутися купи, торкнутися комірки:\n"
"- доторкання купи, доторкання комірки\n"
" --> перемістити купу\n"
"- Торкнутися і тягнути, дотикнутися другим пальцем\n"
"- доторкання і перетягування, дотик другим пальцем\n"
" --> помістити один предмет у комірку\n"
#: src/client/game.cpp
@ -1426,9 +1424,8 @@ msgid "Fog enabled"
msgstr "Туман увімкнено"
#: src/client/game.cpp
#, fuzzy
msgid "Fog enabled by game or mod"
msgstr "Наближення (бінокль) вимкнено грою або модифікацією"
msgstr "Туман увімкнено грою або модом"
#: src/client/game.cpp
msgid "Game info:"
@ -1926,13 +1923,13 @@ msgid "Minimap in texture mode"
msgstr "Мінімапа в текстурному режимі"
#: src/client/shader.cpp
#, fuzzy, c-format
#, c-format
msgid "Failed to compile the \"%s\" shader."
msgstr "Не вдалося завантажити вебсторінку"
msgstr "Не вдалося скомпілювати шейдер \"%s\"."
#: src/client/shader.cpp
msgid "Shaders are enabled but GLSL is not supported by the driver."
msgstr ""
msgstr "Відтінювачі увімкнені, але GLSL не підтримується драйвером."
#. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3"
#: src/content/mod_configuration.cpp
@ -2129,16 +2126,15 @@ msgstr "натисніть клавішу"
#: src/gui/guiOpenURL.cpp
msgid "Open"
msgstr ""
msgstr "Відкрити"
#: src/gui/guiOpenURL.cpp
msgid "Open URL?"
msgstr ""
msgstr "Відкрити URL?"
#: src/gui/guiOpenURL.cpp
#, fuzzy
msgid "Unable to open URL"
msgstr "Не вдалося завантажити вебсторінку"
msgstr "Не вдалося відкрити URL"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
@ -2426,7 +2422,7 @@ msgstr "Додатково"
#: src/settings_translation_file.cpp
msgid "Allows liquids to be translucent."
msgstr ""
msgstr "Дозволяє рідинам бути напівпрозорими."
#: src/settings_translation_file.cpp
msgid ""
@ -2496,6 +2492,13 @@ msgid ""
"With OpenGL ES, dithering only works if the shader supports high\n"
"floating-point precision and it may have a higher performance impact."
msgstr ""
"Застосуйте згладжування, щоб зменшити кількість артефактів кольорових смуг.\n"
"Згладжування значно збільшує розмір знімків екрана, стиснутих без втрат,\n"
"і працює некоректно, якщо екран або операційна система виконує\n"
"додаткове згладжування або якщо кольорові канали не квантуються\n"
"до 8 бітів.\n"
"З OpenGL ES згладжування працює лише якщо відтінювач підтримує високу\n"
"точність чисел з плаваючою комою й може більше впливати на продуктивність."
#: src/settings_translation_file.cpp
msgid "Arm inertia"
@ -2514,7 +2517,6 @@ msgid "Ask to reconnect after crash"
msgstr "Запитувати про перезʼєднання під час збою"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"At this distance the server will aggressively optimize which blocks are sent "
"to\n"
@ -2526,17 +2528,15 @@ msgid ""
"optimization.\n"
"Stated in MapBlocks (16 nodes)."
msgstr ""
"На цій відстані сервер буде агресивно оптимізувати те, які блоки\n"
"надсилаються клієнтам.\n"
"Маленькі значення можуть значно покращити продуктивність, за\n"
"рахунок проблем відображення (деякі блоки не будуть\n"
"відображені під водою й у печерах, а також иноді на поверхні).\n"
"Виставлення цього до значення, що більше, ніж\n"
"max_block_send_distance, вимикає цю оптимізацію.\n"
"На цій відстані сервер буде агресивно оптимізувати, які блоки\n"
"надсилатимуться клієнтам.\n"
"Меньші значення потенційно значно підвищують продуктивність за рахунок\n"
"проблем промальовування (блоки можуть неправильно відображатися у печерах).\n"
"Виставлення цього до значення більше за max_block_send_distance вимикає\n"
"цю оптимізацію.\n"
"Зазначається у блоках мапи (16 блоків)."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"At this distance the server will perform a simpler and cheaper occlusion "
"check.\n"
@ -2546,13 +2546,11 @@ msgid ""
"This is especially useful for very large viewing range (upwards of 500).\n"
"Stated in MapBlocks (16 nodes)."
msgstr ""
"На цій відстані сервер буде агресивно оптимізувати те, які блоки\n"
"надсилаються клієнтам.\n"
"Маленькі значення можуть значно покращити продуктивність, за\n"
"рахунок проблем відображення (деякі блоки не будуть\n"
"відображені під водою й у печерах, а також иноді на поверхні).\n"
"Виставлення цього до значення, що більше, ніж\n"
"max_block_send_distance, вимикає цю оптимізацію.\n"
"На цій відстані сервер буде виконувати простіше й дешевше перевірку "
"затінення.\n"
"Меньші значення потенційно підвищують продуктивність, за рахунок тимчасово\n"
"видимих проблем відображення (зниклі блоки).\n"
"Це особливо корисно для дуже великого діапазону огляду (понад 500).\n"
"Зазначається у блоках мапи (16 блоків)."
#: src/settings_translation_file.cpp
@ -2616,9 +2614,8 @@ msgid "Biome noise"
msgstr "Шум біому"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Block cull optimize distance"
msgstr "Оптимальна відстань надсилання блока"
msgstr "Відстань оптимізації вибракування блоків"
#: src/settings_translation_file.cpp
msgid "Block send optimize distance"
@ -2840,6 +2837,9 @@ msgid ""
"Comma-separated list of AL and ALC extensions that should not be used.\n"
"Useful for testing. See al_extensions.[h,cpp] for details."
msgstr ""
"Розділений комами перелік розширень AL і ALC, які не повинно використовувати."
"\n"
"Корисно для тестування. Подробиці у файлах al_extensions.[h,cpp]."
#: src/settings_translation_file.cpp
msgid ""
@ -2851,9 +2851,9 @@ msgid ""
"These flags are independent from Minetest versions,\n"
"so see a full list at https://content.minetest.net/help/content_flags/"
msgstr ""
"Розділений комами перелік міток, які треба приховувати у репозиторії "
"вмісту.\n"
"\"nonfree\" використовується для приховання пакетів, що не є \"вільним "
"Розділений комами перелік міток, які треба приховувати у репозиторії вмісту."
"\n"
"\"nonfree\" використовується для приховання пакунків, що не є \"вільним "
"програмним\n"
"забезпеченням\", як визначено Фондом вільного програмного забезпечення.\n"
"Ви також можете вказувати оцінки вмісту.\n"
@ -3064,7 +3064,6 @@ msgstr ""
"диск, але також використовує більше ресурсів."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Define the oldest clients allowed to connect.\n"
"Older clients are compatible in the sense that they will not crash when "
@ -3076,10 +3075,14 @@ msgid ""
"Minetest still enforces its own internal minimum, and enabling\n"
"strict_protocol_version_checking will effectively override this."
msgstr ""
"Увімкніть, щоб заборонити підключення старим клієнтам.\n"
"Старші клієнти сумісні у тому сенсі, що вони не зазнаватимуть збою при\n"
"підключенні до нових серверів, але вони можуть не підтримувати усі нові "
"функції, на які ви очікуєте."
"Визначте найстаріші клієнти, яким дозволено під'єднуватися.\n"
"Старіші клієнти сумісні у тому сенсі, що вони не зазнаватимуть збою при "
"підключенні\n"
"до нових серверів, але можуть не підтримувати усі нові функції, на які ви "
"очікуєте.\n"
"Це дозволяє детальніший контроль, ніж strict_protocol_version_checking.\n"
"Minetest все ще примушує свій внутрішній мінімум, і включення\n"
"strict_protocol_version_checking перевизначить це ефективно."
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@ -3283,9 +3286,8 @@ msgid "Enable Bloom Debug"
msgstr "Увімкнути зневадження світіння"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Debanding"
msgstr "Пошкодження"
msgstr "Увімкнути дебандинг"
#: src/settings_translation_file.cpp
msgid ""
@ -3314,9 +3316,8 @@ msgstr ""
"тіней\". Інакше використовується PCF."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Post Processing"
msgstr "Постобробка"
msgstr "Увімкнути постобробку"
#: src/settings_translation_file.cpp
msgid "Enable Raytraced Culling"
@ -3369,9 +3370,8 @@ msgstr ""
"доступу."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable random mod loading (mainly used for testing)."
msgstr "Увімкнути випадкове введення користувача (тільки для тестування)."
msgstr "Увімкнути випадкове завантаження модів (в основному для тестування)."
#: src/settings_translation_file.cpp
msgid "Enable random user input (only used for testing)."
@ -3403,9 +3403,8 @@ msgstr ""
"функції, на які ви очікуєте."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable touchscreen"
msgstr "Сенсорний екран"
msgstr "Увімкнути сенсорний екран"
#: src/settings_translation_file.cpp
msgid ""
@ -3443,7 +3442,7 @@ msgid ""
"appearance of high dynamic range images. Mid-range contrast is slightly\n"
"enhanced, highlights and shadows are gradually compressed."
msgstr ""
"Вмикає кінематографічне тональне відображення Hable's «Uncharted 2».\n"
"Вмикає кінематографічне тональне відображення \"Uncharted 2\".\n"
"Імітує криву тона фотоплівки й наближає\n"
"зображення до більшого динамічного діапазону. Середній контраст злегка\n"
"посилюється, відблиски й тіні поступово стискається."
@ -3458,16 +3457,17 @@ msgstr "Вмикає кешування мешів, яких повернули.
#: src/settings_translation_file.cpp
msgid "Enables debug and error-checking in the OpenGL driver."
msgstr ""
msgstr "Вмикає зневадження й перевірку помилок у драйвері OpenGL."
#: src/settings_translation_file.cpp
msgid "Enables the post processing pipeline."
msgstr ""
msgstr "Вмикає конвеєр постобробки."
#: src/settings_translation_file.cpp
msgid ""
"Enables touchscreen mode, allowing you to play the game with a touchscreen."
msgstr ""
"Вмикає режим сенсорного екрану, дозволяючи вам грати з сенсорним екраном."
#: src/settings_translation_file.cpp
msgid ""
@ -4387,15 +4387,15 @@ msgstr ""
"- Opaque: вимкнути прозорість"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Length of a server tick (the interval at which everything is generally "
"updated),\n"
"stated in seconds.\n"
"Does not apply to sessions hosted from the client menu."
msgstr ""
"Довжина кроку серверу й інтервал, з яким об'єкти загалом оновлюються по\n"
"мережі, зазначається у секундах."
"Довжина кроку серверу (інтервал, з яким все зазвичай оновлюються),\n"
"зазначається у секундах.\n"
"Не застовується до сесій, які запущено з клієнтського меню."
#: src/settings_translation_file.cpp
msgid "Length of liquid waves."
@ -4625,7 +4625,6 @@ msgid "Map generation attributes specific to Mapgen v5."
msgstr "Спеціальні атрибути генерації для генератору світу V5."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"The 'snowbiomes' flag enables the new 5 biome system.\n"
@ -4634,10 +4633,12 @@ msgid ""
"The 'temples' flag disables generation of desert temples. Normal dungeons "
"will appear instead."
msgstr ""
"Спеціальні атрибути генерації для генератору світу V6.\n"
"Спеціальні атрибути генерації для генератору світу v6.\n"
"Мітка \"snowbiomes\" вмикає нову систему з 5 біомами.\n"
"Коли мітку \"snowbiomes\" увімкнено, автоматично увімкаються джунглі,\n"
"ігноруючи мітку \"jungles\"."
"Коли мітку \"snowbiomes\" увімкнено, автоматично увімкаються джунглі й\n"
"мітка \"jungles\" ігнорується.\n"
"Мітка \"temples\" вимикає генерацію храмів пустель. Замість них "
"з'являтимуться звичайні підземелля."
#: src/settings_translation_file.cpp
msgid ""
@ -4943,9 +4944,8 @@ msgid "Minimap scan height"
msgstr "Висота сканування мінімапи"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Minimum dig repetition interval"
msgstr "Інтервал повторного розміщення"
msgstr "Мінімальний інтервал повторення копання"
#: src/settings_translation_file.cpp
msgid "Minimum limit of random number of large caves per mapchunk."
@ -5016,9 +5016,8 @@ msgid "Mouse sensitivity multiplier."
msgstr "Множник чутливості миші."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Movement threshold"
msgstr "Поріг каверн"
msgstr "Поріг переміщення"
#: src/settings_translation_file.cpp
msgid "Mud noise"
@ -5172,9 +5171,8 @@ msgstr ""
"Не відкриває, якщо будь-яка форму вже відкрито."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "OpenGL debug"
msgstr "Налагодження генератора світу"
msgstr "Зневадження OpenGL"
#: src/settings_translation_file.cpp
msgid "Optional override for chat weblink color."
@ -5308,13 +5306,12 @@ msgid "Proportion of large caves that contain liquid."
msgstr "Співвідношення великих печер, що містять рідину."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Protocol version minimum"
msgstr "Невідповідність версії протоколу. "
msgstr "Мінімальна версія протоколу"
#: src/settings_translation_file.cpp
msgid "Punch gesture"
msgstr ""
msgstr "Жест удару"
#: src/settings_translation_file.cpp
msgid ""
@ -5335,7 +5332,7 @@ msgstr "Випадковий ввід"
#: src/settings_translation_file.cpp
msgid "Random mod load order"
msgstr ""
msgstr "Випадковий порядок завантаження модів"
#: src/settings_translation_file.cpp
msgid "Recent Chat Messages"
@ -5545,7 +5542,6 @@ msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "Дивіться https://www.sqlite.org/pragma.html#pragma_synchronous"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Select the antialiasing method to apply.\n"
"\n"
@ -5570,9 +5566,9 @@ msgstr ""
"\n"
"* None - без згладжування (за замовчуванням)\n"
"\n"
"* FSAA - апаратне повноекранне згладжування (несумісно із відтінювачами),\n"
"також відоме як згладжування з декількома вибірками (multi-sample "
"antialiasing, MSAA)\n"
"* FSAA - апаратне повноекранне згладжування\n"
"(несумісне з пост-обробкою й субдискретизацією),\n"
"також відоме як multi-sample antialiasing (MSAA)\n"
"Згладжує кути блоків, але не впливає на внутрішню частину текстур.\n"
"Для змінення цього вибору потребується перезавантаження.\n"
"\n"
@ -5582,9 +5578,8 @@ msgstr ""
"Забезпечує баланс між швидкістю і якістю зображення.\n"
"\n"
"* SSAA - згладжування із супер-вибіркою (потребує відтінювачів)\n"
"Промальовує зображення сцени з вищою роздільністю, потім зменьшує масштаб, "
"для зменьшення\n"
"ефектів накладення. Це найповільніший і найточніший метод."
"Промальовує зображення сцени з вищою роздільністю, потім зменьшує масштаб,\n"
"для зменшення ефектів накладення. Це найповільніший і найточніший метод."
#: src/settings_translation_file.cpp
msgid "Selection box border color (R,G,B)."
@ -5713,13 +5708,12 @@ msgstr ""
"Діапазон: від -1 до 1.0"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Set the language. By default, the system language is used.\n"
"A restart is required after changing this."
msgstr ""
"Вказати мову. Залиште порожнім, щоб використовувати системну мову.\n"
"Потрібен перезапуск після цієї зміни."
"Вкажіть мову. За замовчування використовується системна мова.\n"
ісля зміни цього потрібен перезапуск."
#: src/settings_translation_file.cpp
msgid ""
@ -5762,7 +5756,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Set to true to enable volumetric lighting effect (a.k.a. \"Godrays\")."
msgstr ""
msgstr "Увімкніть ефект об'ємного освітлення (також відомий як \"Godrays\")."
#: src/settings_translation_file.cpp
msgid "Set to true to enable waving leaves."
@ -5809,15 +5803,13 @@ msgid "Shaders"
msgstr "Відтінювачі"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Shaders allow advanced visual effects and may increase performance on some "
"video\n"
"cards."
msgstr ""
"Відтінювачі дозволяють додаткові визуальні ефекти й можуть збільшити\n"
"продуктивність на деяких відеокартах.\n"
"Це працює тільки з двигуном промальовування OpenGL."
"Відтінювачі дозволяють просунуті визуальні ефекти й можуть збільшити\n"
"продуктивність на деяких відеокартах."
#: src/settings_translation_file.cpp
msgid "Shadow filter quality"
@ -5939,14 +5931,12 @@ msgid "Smooth lighting"
msgstr "Згладжене освітлення"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Smooths rotation of camera when in cinematic mode, 0 to disable. Enter "
"cinematic mode by using the key set in Controls."
msgstr ""
"Робить обертання камери плавним у кінематографічному режимі, 0 для "
"відключення. Входіть у кінематографічний режім клавішою, визначеною у "
"Змінити клавіші."
"Згладжує обертання камери у кінематографічному режимі, 0 для відключення. "
"Входьте у кінематографічний режім клавішою, визначеною у Керування."
#: src/settings_translation_file.cpp
msgid ""
@ -5973,9 +5963,8 @@ msgid "Sound"
msgstr "Звук"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Sound Extensions Blacklist"
msgstr "Чорний список міток ContentDB"
msgstr "Чорний список розширень звуку"
#: src/settings_translation_file.cpp
msgid ""
@ -6191,6 +6180,8 @@ msgid ""
"The delay in milliseconds after which a touch interaction is considered a "
"long tap."
msgstr ""
"Затримка в мілісекундах, після якої сенсорна взаємодія вважається довгим "
"дотиком."
#: src/settings_translation_file.cpp
msgid ""
@ -6210,16 +6201,25 @@ msgid ""
"Known from the classic Minetest mobile controls.\n"
"Combat is more or less impossible."
msgstr ""
"Жест, що означає удар по гравцю або сутності.\n"
"Це перевизначатися іграми або модами.\n"
"\n"
"* short_tap (короткий дотик)\n"
"Простий у використанні й відомий за іншими іграми, які не повинні бути "
"названі.\n"
"\n"
"* long_tap (довгий дотик)\n"
"Відомий за класичному мобільному управлінні Minetest.\n"
"Бої більш-менш неможливі."
#: src/settings_translation_file.cpp
msgid "The identifier of the joystick to use"
msgstr "Ідентифікатор джойстика, що використовується"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The length in pixels after which a touch interaction is considered movement."
msgstr "Довжина в пікселях, з якої починається дія з сенсорним екраном."
msgstr "Довжина в пікселях, після якої сенсорна взаємодія вважається рухом."
#: src/settings_translation_file.cpp
msgid ""
@ -6234,13 +6234,12 @@ msgstr ""
"За замовчуванням 1.0 (1/2 блоки)."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The minimum time in seconds it takes between digging nodes when holding\n"
"the dig button."
msgstr ""
"Затримка в секундах між повторними розміщеннями блоків при\n"
"затисканні кнопки розміщення."
"Мінімальний час у секундах у перервах на копання блоків при\n"
"затисканні кнопки копання."
#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
@ -6273,7 +6272,6 @@ msgstr ""
"Це повинно бути налаштовано разом з active_object_send_range_blocks."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"The rendering back-end.\n"
"Note: A restart is required after changing this!\n"
@ -6283,7 +6281,7 @@ msgstr ""
"Двигун промальовування.\n"
"Примітка: після змінення цього потрібен перезапуск!\n"
"За замовчуванням OpenGL для ПК, й OGLES2 для Android.\n"
"Відтінювачі підтримуються OpenGL і OGLES2 (експериментально)."
"Відтінювачі підтримуються усіма крім OGLES1."
#: src/settings_translation_file.cpp
msgid ""
@ -6328,7 +6326,7 @@ msgid ""
"The time in seconds it takes between repeated events\n"
"when holding down a joystick button combination."
msgstr ""
"Затримка в секундах між подіями, що повторюються,\n"
"Затримка в секундах між подіями, що повторюються\n"
"при затисканні комбінації кнопок джойстику."
#: src/settings_translation_file.cpp
@ -6359,7 +6357,7 @@ msgstr "Третій з 4 шумів 2D що разом визначають д
#: src/settings_translation_file.cpp
msgid "Threshold for long taps"
msgstr ""
msgstr "Поріг для довгих дотиків"
#: src/settings_translation_file.cpp
msgid ""
@ -6420,9 +6418,8 @@ msgid "Tradeoffs for performance"
msgstr "Домовленності для продуктивності"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Translucent liquids"
msgstr "Непрозорі рідини"
msgstr "Напівпрозорі рідини"
#: src/settings_translation_file.cpp
msgid "Transparency Sorting Distance"
@ -6469,13 +6466,13 @@ msgstr ""
"продуктивністю."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"URL to JSON file which provides information about the newest Minetest "
"release\n"
"If this is empty the engine will never check for updates."
msgstr ""
"Адреса файлу JSON, що забезпечує інформацію про найновіший реліз Minetest"
"URL до файлу JSON, що забезпечує інформацію про найновіший реліз Minetest\n"
"Якщо ще порожнє, рушій ніколи не перевірятиме оновлення."
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
@ -6688,7 +6685,7 @@ msgstr "Гучність"
#: src/settings_translation_file.cpp
msgid "Volume multiplier when the window is unfocused."
msgstr ""
msgstr "Множник гучності, коли вікно не сфокусовано."
#: src/settings_translation_file.cpp
msgid ""
@ -6699,14 +6696,12 @@ msgstr ""
"Вимагає увімкнення системи звуку."
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Volume when unfocused"
msgstr "FPS, при паузі або поза фокусом"
msgstr "Гучність поза фокусом"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Volumetric lighting"
msgstr "Згладжене освітлення"
msgstr "Об'ємне освітлення"
#: src/settings_translation_file.cpp
msgid ""

View file

@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: Chinese (Simplified) (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-11 15:14+0200\n"
"PO-Revision-Date: 2024-01-30 16:01+0000\n"
"Last-Translator: yue weikai <send52@outlook.com>\n"
"PO-Revision-Date: 2024-07-31 22:09+0000\n"
"Last-Translator: y5nw <y5nw@users.noreply.hosted.weblate.org>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"minetest/minetest/zh_Hans/>\n"
"Language: zh_CN\n"
@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.4-dev\n"
"X-Generator: Weblate 5.7-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@ -82,9 +82,8 @@ msgstr ""
"使用 '.help <cmd>' 获取该命令的更多信息,或使用 '.help all' 列出所有内容。"
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "[all | <cmd>] [-t]"
msgstr "[all | <命令>]"
msgstr "[all | <命令>] [-t]"
#: builtin/fstk/ui.lua
msgid "<none available>"
@ -151,7 +150,7 @@ msgstr "下载 $1 失败"
msgid ""
"Failed to extract \"$1\" (insufficient disk space, unsupported file type or "
"broken archive)"
msgstr "安装:\"$1\" 的文件类型不支持或压缩包已损坏"
msgstr "无法解压\"$1\":存储空间不足、文件类型不支持或压缩包已损坏"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid ""
@ -182,8 +181,9 @@ msgid "Downloading..."
msgstr "下载中..."
#: builtin/mainmenu/content/dlg_contentdb.lua
#, fuzzy
msgid "Error getting dependencies for package"
msgstr ""
msgstr "无法获取这个包的依赖项"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Games"
@ -1102,7 +1102,7 @@ msgstr "启动游戏"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "You need to install a game before you can create a world."
msgstr "在安装mod前你需要先安装一个子游戏"
msgstr "您需要先安装一个子游戏才能创建新的世界。"
#: builtin/mainmenu/tab_online.lua
msgid "Address"
@ -1417,7 +1417,7 @@ msgstr "雾气已启用"
#: src/client/game.cpp
#, fuzzy
msgid "Fog enabled by game or mod"
msgstr "缩放被当前子游戏或 mod 禁用"
msgstr "雾被当前子游戏或 mod 启用"
#: src/client/game.cpp
msgid "Game info:"
@ -1917,11 +1917,12 @@ msgstr "材质模式小地图"
#: src/client/shader.cpp
#, fuzzy, c-format
msgid "Failed to compile the \"%s\" shader."
msgstr "网页打不开"
msgstr "无法编译“%s”着色器。"
#: src/client/shader.cpp
#, fuzzy
msgid "Shaders are enabled but GLSL is not supported by the driver."
msgstr ""
msgstr "着色器已启用,但是驱动程序不支持 GLSL。"
#. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3"
#: src/content/mod_configuration.cpp
@ -2114,16 +2115,17 @@ msgstr "按键"
#: src/gui/guiOpenURL.cpp
msgid "Open"
msgstr ""
msgstr "打开"
#: src/gui/guiOpenURL.cpp
#, fuzzy
msgid "Open URL?"
msgstr ""
msgstr "是否打开网页?"
#: src/gui/guiOpenURL.cpp
#, fuzzy
msgid "Unable to open URL"
msgstr "网页打不开"
msgstr "无法打开网页"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
@ -3335,7 +3337,7 @@ msgstr "启用鼠标滚轮(滚动),以便在热栏中选择项目。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable random mod loading (mainly used for testing)."
msgstr "启用随机用户输入(仅用于测试)。"
msgstr "使用随机顺序加载 mod主要用于测试)。"
#: src/settings_translation_file.cpp
msgid "Enable random user input (only used for testing)."
@ -3428,9 +3430,10 @@ msgid "Enables the post processing pipeline."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Enables touchscreen mode, allowing you to play the game with a touchscreen."
msgstr ""
msgstr "启用触摸屏模式。启用后您可以使用触摸屏玩游戏。"
#: src/settings_translation_file.cpp
msgid ""
@ -5097,9 +5100,8 @@ msgstr ""
"则不暂停。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "OpenGL debug"
msgstr "地图生成器调试"
msgstr "OpenGL 调试"
#: src/settings_translation_file.cpp
msgid "Optional override for chat weblink color."
@ -5230,7 +5232,7 @@ msgstr "包含液体的大洞穴的比例。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Protocol version minimum"
msgstr "协议版本不匹配。 "
msgstr "最低协议版本"
#: src/settings_translation_file.cpp
msgid "Punch gesture"
@ -5254,8 +5256,9 @@ msgid "Random input"
msgstr "随机输入"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Random mod load order"
msgstr ""
msgstr "使用随机顺序加载 Mod"
#: src/settings_translation_file.cpp
msgid "Recent Chat Messages"
@ -5633,7 +5636,7 @@ msgid ""
"Set the language. By default, the system language is used.\n"
"A restart is required after changing this."
msgstr ""
"设定语言。留空以使用系统语言。\n"
"设定语言。默认使用系统语言。\n"
"变更后须重新启动。"
#: src/settings_translation_file.cpp
@ -6166,10 +6169,10 @@ msgid ""
"OpenGL is the default for desktop, and OGLES2 for Android.\n"
"Shaders are supported by everything but OGLES1."
msgstr ""
"于渲染的后端引擎\n"
"于渲染的后端引擎\n"
"注:更改之后要重启游戏!\n"
"OpenGL是默认的电脑端渲染引擎OGLES2是用于安卓的.\n"
"实验性被OpenGL和OGLES2的着色器."
"除了OGLES1之外的后端引擎都支持着色器"
#: src/settings_translation_file.cpp
msgid ""
@ -6302,9 +6305,8 @@ msgid "Tradeoffs for performance"
msgstr "性能权衡"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Translucent liquids"
msgstr "透明液体"
msgstr "透明液体"
#: src/settings_translation_file.cpp
msgid "Transparency Sorting Distance"
@ -6573,7 +6575,7 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Volume when unfocused"
msgstr "游戏暂停时最高 FPS"
msgstr "游戏暂停时的音量"
#: src/settings_translation_file.cpp
#, fuzzy

View file

@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: Chinese (Traditional) (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-11 15:14+0200\n"
"PO-Revision-Date: 2024-01-14 12:31+0000\n"
"Last-Translator: reimu105 <peter112548@gmail.com>\n"
"PO-Revision-Date: 2024-08-10 06:09+0000\n"
"Last-Translator: hugoalh <hugoalh@users.noreply.hosted.weblate.org>\n"
"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
"minetest/minetest/zh_Hant/>\n"
"Language: zh_TW\n"
@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.4-dev\n"
"X-Generator: Weblate 5.7-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@ -71,9 +71,8 @@ msgid "Command not available: "
msgstr "指令無法使用: "
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "Get help for commands (-t: output in chat)"
msgstr "取得指令的說明"
msgstr "取得指令幫助(-t輸出至聊天中"
#: builtin/common/chatcommands.lua
msgid ""
@ -81,9 +80,8 @@ msgid ""
msgstr "使用「.help <cmd>」來取得更多資訊,或使用「.help all」來列出所有指令。"
#: builtin/common/chatcommands.lua
#, fuzzy
msgid "[all | <cmd>] [-t]"
msgstr "[all | <命令>]"
msgstr "[all | <指令>] [-t]"
#: builtin/fstk/ui.lua
msgid "<none available>"
@ -182,7 +180,7 @@ msgstr "正在下載..."
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Error getting dependencies for package"
msgstr ""
msgstr "獲取套件的相依元件時發生錯誤"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Games"
@ -196,7 +194,7 @@ msgstr "安裝"
#: builtin/mainmenu/content/dlg_contentdb.lua
#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp
msgid "Loading..."
msgstr "正在載入..."
msgstr "載入中…"
#: builtin/mainmenu/content/dlg_contentdb.lua
msgid "Mods"
@ -458,7 +456,7 @@ msgstr "裝飾物"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Desert temples"
msgstr ""
msgstr "沙漠聖殿"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Development Test is meant for developers."
@ -468,7 +466,7 @@ msgstr "開發測試是針對開發人員的。"
msgid ""
"Different dungeon variant generated in desert biomes (only if dungeons "
"enabled)"
msgstr ""
msgstr "在沙漠生物群落中生成不同的地牢變體(僅當啟用地牢時)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@ -645,7 +643,7 @@ msgstr "缺少名稱"
#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
#: builtin/mainmenu/tab_online.lua
msgid "Name"
msgstr "名"
msgstr "名"
#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
#: builtin/mainmenu/tab_online.lua
@ -719,7 +717,7 @@ msgstr ""
#: builtin/mainmenu/dlg_version_info.lua
msgid "Later"
msgstr "稍後提醒"
msgstr "稍後"
#: builtin/mainmenu/dlg_version_info.lua
msgid "Never"
@ -1054,15 +1052,14 @@ msgid "Install games from ContentDB"
msgstr "從 ContentDB 安裝遊戲"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "Minetest doesn't come with a game by default."
msgstr "預設不再安裝 Minetest 遊戲"
msgstr "預設不再安裝 Minetest 遊戲"
#: builtin/mainmenu/tab_local.lua
msgid ""
"Minetest is a game-creation platform that allows you to play many different "
"games."
msgstr ""
msgstr "Minetest 是一個遊戲創建平台,可以讓你遊玩許多不同的遊戲。"
#: builtin/mainmenu/tab_local.lua
msgid "New"
@ -1097,9 +1094,8 @@ msgid "Start Game"
msgstr "開始遊戲"
#: builtin/mainmenu/tab_local.lua
#, fuzzy
msgid "You need to install a game before you can create a world."
msgstr "您需要先安裝遊戲才能安裝模組"
msgstr "您需要先安裝遊戲才能安裝模組"
#: builtin/mainmenu/tab_online.lua
msgid "Address"
@ -1128,7 +1124,7 @@ msgstr "加入遊戲"
#: builtin/mainmenu/tab_online.lua
msgid "Login"
msgstr "登"
msgstr "登"
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
@ -1412,9 +1408,8 @@ msgid "Fog enabled"
msgstr "已啟用霧氣"
#: src/client/game.cpp
#, fuzzy
msgid "Fog enabled by game or mod"
msgstr "遠近調整目前已被遊戲或模組停用"
msgstr "霧已由遊戲或模組啟用"
#: src/client/game.cpp
msgid "Game info:"
@ -1442,7 +1437,7 @@ msgstr "MiB/秒"
#: src/client/game.cpp
msgid "Minimap currently disabled by game or mod"
msgstr "迷你地圖目前已被遊戲或 Mod 停用"
msgstr "迷你地圖目前已被遊戲或模組停用"
#: src/client/game.cpp
msgid "Multiplayer"
@ -1639,9 +1634,8 @@ msgid "Caps Lock"
msgstr "大寫鎖定鍵"
#: src/client/keycode.cpp
#, fuzzy
msgid "Clear Key"
msgstr "清除"
msgstr "清除"
#: src/client/keycode.cpp
msgid "Control Key"
@ -1669,7 +1663,7 @@ msgstr "執行"
#: src/client/keycode.cpp
msgid "Help"
msgstr "說明"
msgstr "幫助"
#: src/client/keycode.cpp
msgid "Home"
@ -1725,9 +1719,8 @@ msgstr "左 Windows 鍵"
#. ~ Key name, common on Windows keyboards
#: src/client/keycode.cpp
#, fuzzy
msgid "Menu Key"
msgstr "選單"
msgstr "選單"
#: src/client/keycode.cpp
msgid "Middle Button"
@ -1813,9 +1806,8 @@ msgstr "Page up"
#. ~ Usually paired with the Break key
#: src/client/keycode.cpp
#, fuzzy
msgid "Pause Key"
msgstr "暫停"
msgstr "暫停"
#: src/client/keycode.cpp
msgid "Play"
@ -1866,9 +1858,8 @@ msgid "Select"
msgstr "選擇"
#: src/client/keycode.cpp
#, fuzzy
msgid "Shift Key"
msgstr "Shift"
msgstr "Shift"
#: src/client/keycode.cpp
msgid "Sleep"
@ -1905,7 +1896,7 @@ msgstr "遠近調整"
#: src/client/minimap.cpp
msgid "Minimap hidden"
msgstr "已隱藏迷你地圖"
msgstr "迷你地圖已隱藏"
#: src/client/minimap.cpp
#, c-format
@ -1922,13 +1913,13 @@ msgid "Minimap in texture mode"
msgstr "材質模式的迷你地圖"
#: src/client/shader.cpp
#, fuzzy, c-format
#, c-format
msgid "Failed to compile the \"%s\" shader."
msgstr "無法開啟網頁"
msgstr "無法編譯「%s」著色器。"
#: src/client/shader.cpp
msgid "Shaders are enabled but GLSL is not supported by the driver."
msgstr ""
msgstr "著色器已啟用,但是驅動程式不支援 GLSL。"
#. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3"
#: src/content/mod_configuration.cpp
@ -2121,16 +2112,15 @@ msgstr "按下按鍵"
#: src/gui/guiOpenURL.cpp
msgid "Open"
msgstr ""
msgstr "開啟"
#: src/gui/guiOpenURL.cpp
msgid "Open URL?"
msgstr ""
msgstr "開啟網址?"
#: src/gui/guiOpenURL.cpp
#, fuzzy
msgid "Unable to open URL"
msgstr "無法開啟網"
msgstr "無法開啟網"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
@ -2396,16 +2386,15 @@ msgid ""
"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n"
"to be sure) creates a solid floatland layer."
msgstr ""
"調整浮層的密度。\n"
"增加值以增加密度。 可以是正值,也可以是負值。\n"
"值 = 0.050% 的體積是浮。\n"
"值 = 2.0(可以更高,取決於“mgv7_np_floatland”始終測試\n"
"可以肯定的是)創造了一個堅固的浮地層。"
"調整浮空島層的密度。\n"
"增加數值以增加密度。可以是正值或負值。\n"
"值 = 0.050% 的體積是浮空島。\n"
"值 = 2.0(可以更高,取決於「mgv7_np_floatland」總是進行測試以確定建立一個"
"堅固的浮空島層。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Admin name"
msgstr "將物品名稱加至末尾"
msgstr "管理員名稱"
#: src/settings_translation_file.cpp
msgid "Advanced"
@ -2413,7 +2402,7 @@ msgstr "進階"
#: src/settings_translation_file.cpp
msgid "Allows liquids to be translucent."
msgstr ""
msgstr "允許液體呈半透明狀。"
#: src/settings_translation_file.cpp
msgid ""
@ -2430,9 +2419,8 @@ msgstr ""
"在夜晚的自然光照下作用很小。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Always fly fast"
msgstr "總是啟用飛行與快速模式"
msgstr "總是快速飛行"
#: src/settings_translation_file.cpp
msgid "Ambient occlusion gamma"
@ -2572,9 +2560,8 @@ msgid "Base terrain height."
msgstr "基礎地形高度。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Base texture size"
msgstr "過濾器的最大材質大小"
msgstr "基礎材質大小"
#: src/settings_translation_file.cpp
msgid "Basic privileges"
@ -2597,9 +2584,8 @@ msgid "Bind address"
msgstr "綁定地址"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Biome API"
msgstr "生物雜訊"
msgstr "生物群落 API"
#: src/settings_translation_file.cpp
msgid "Biome noise"
@ -2619,14 +2605,12 @@ msgid "Bloom"
msgstr "泛光"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Bloom Intensity"
msgstr "泛光度"
msgstr "泛光度"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Bloom Radius"
msgstr "雲朵範圍"
msgstr "泛光半徑"
#: src/settings_translation_file.cpp
msgid "Bloom Strength Factor"
@ -3048,7 +3032,6 @@ msgstr ""
"但也使用更多的資源。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Define the oldest clients allowed to connect.\n"
"Older clients are compatible in the sense that they will not crash when "
@ -3060,9 +3043,12 @@ msgid ""
"Minetest still enforces its own internal minimum, and enabling\n"
"strict_protocol_version_checking will effectively override this."
msgstr ""
"啟用以讓舊的用戶端無法連線。\n"
"較舊的用戶端在這個意義上相容,它們不會在連線至\n"
"新伺服器時當掉,但它們可能會不支援一些您預期會有的新功能。"
"定義允許連線的最早的客戶端。\n"
"較舊的客戶端是相容的,因為它們在連接時不會崩潰\n"
"到新伺服器,但它們可能不支援您期望的所有新功能。\n"
"這允許比 strict_protocol_version_checking 更細粒度的控制。\n"
"Minetest 仍然強制執行其自己的內部最低限度,並啟用\n"
"strict_protocol_version_checking 將有效地覆蓋這一點。"
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@ -3292,9 +3278,8 @@ msgstr ""
"使用泊松盤演算法來產生“軟陰影”。 不啟用的話就會使用 PCF 濾鏡。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable Post Processing"
msgstr "後製處理"
msgstr "啟用後製處理"
#: src/settings_translation_file.cpp
msgid "Enable Raytraced Culling"
@ -3378,9 +3363,8 @@ msgstr ""
"新伺服器時當掉,但它們可能會不支援一些您預期會有的新功能。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable touchscreen"
msgstr "海灘雜訊閾值"
msgstr "啟用觸控螢幕"
#: src/settings_translation_file.cpp
msgid ""
@ -3442,7 +3426,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Enables touchscreen mode, allowing you to play the game with a touchscreen."
msgstr ""
msgstr "啟用觸控螢幕模式,讓你可以使用觸控螢幕玩遊戲。"
#: src/settings_translation_file.cpp
msgid ""
@ -4651,7 +4635,6 @@ msgid "Mapgen Flat specific flags"
msgstr "地圖產生器平地標籤"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mapgen Fractal"
msgstr "地圖產生器分形"
@ -4922,14 +4905,12 @@ msgid "Miscellaneous"
msgstr "各種的"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mod Profiler"
msgstr "分析器"
msgstr "模組分析器"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mod Security"
msgstr "安全"
msgstr "模組安全"
#: src/settings_translation_file.cpp
msgid "Mod channels"
@ -4979,9 +4960,8 @@ msgid "Mouse sensitivity multiplier."
msgstr "滑鼠靈敏度倍數。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Movement threshold"
msgstr "洞穴閾值"
msgstr "移動閾值"
#: src/settings_translation_file.cpp
msgid "Mud noise"
@ -5035,7 +5015,6 @@ msgstr ""
"當從主選單啟動時,這個值將會被覆寫。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Networking"
msgstr "網路"
@ -5136,9 +5115,8 @@ msgstr ""
"打開。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "OpenGL debug"
msgstr "Mapgen 除錯"
msgstr "OpenGL 偵錯"
#: src/settings_translation_file.cpp
msgid "Optional override for chat weblink color."
@ -5252,26 +5230,24 @@ msgid "Prometheus listener address"
msgstr "Prometheus 監聽器位址"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Prometheus listener address.\n"
"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
"enable metrics listener for Prometheus on that address.\n"
"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
"Prometheus 监听器地址。\n"
"如果Minetest在编译时启用了ENABLE_PROMETHEUS选项\n"
"在该地址上为 Prometheus 启用指标侦听器。\n"
"可以从 http://127.0.0.1:30000/metrics 获取指标"
"Prometheus 監聽器地址。\n"
"如果Minetest在編輯時啓用了ENABLE_PROMETHEUS選項\n"
"在該地址上為 Prometheus 啓用指標偵聽器。\n"
"可以從 http://127.0.0.1:30000/metrics 獲取指標"
#: src/settings_translation_file.cpp
msgid "Proportion of large caves that contain liquid."
msgstr "含有液體的大型洞穴的比例。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Protocol version minimum"
msgstr "協定版本不符合"
msgstr "協定版本不符合"
#: src/settings_translation_file.cpp
msgid "Punch gesture"
@ -5296,19 +5272,17 @@ msgstr "隨機輸入"
#: src/settings_translation_file.cpp
msgid "Random mod load order"
msgstr ""
msgstr "依隨機順序載入 mod"
#: src/settings_translation_file.cpp
msgid "Recent Chat Messages"
msgstr "最近聊天訊息"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Regular font path"
msgstr "報告路徑"
msgstr "常規字型路徑"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Remember screen size"
msgstr "自動儲存視窗大小"
@ -5487,7 +5461,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Screenshots"
msgstr "螢幕擷取"
msgstr "螢幕截圖"
#: src/settings_translation_file.cpp
msgid "Seabed noise"
@ -5672,13 +5646,12 @@ msgstr ""
"範圍:從-1到1.0"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Set the language. By default, the system language is used.\n"
"A restart is required after changing this."
msgstr ""
"設定語言。留空以使用系統語言。\n"
"變更後必須重新啟動以使其生效。"
"設定語言。預設情況下,使用系統語言。\n"
"變更後需要重新啟動。"
#: src/settings_translation_file.cpp
msgid ""
@ -5764,15 +5737,13 @@ msgid "Shaders"
msgstr "著色器"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Shaders allow advanced visual effects and may increase performance on some "
"video\n"
"cards."
msgstr ""
"著色器可實現高級視覺效果,並可能提高某些影片的效能\n"
"牌。\n"
"這僅適用於 OpenGL 視訊後端。"
"著色器允許實現高級視覺效果,\n"
"並可能提高某些顯示卡的性能。"
#: src/settings_translation_file.cpp
msgid "Shadow filter quality"
@ -6332,28 +6303,24 @@ msgid "Tooltip delay"
msgstr "工具提示延遲"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Touchscreen"
msgstr "海灘雜訊閾值"
msgstr "觸控螢幕"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Touchscreen sensitivity"
msgstr "滑鼠靈敏度"
msgstr "觸控螢幕靈敏度"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Touchscreen sensitivity multiplier."
msgstr "滑鼠靈敏度倍數。"
msgstr "觸控螢幕靈敏度倍數。"
#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr "性能的權衡"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Translucent liquids"
msgstr "透明液體"
msgstr "透明液體"
#: src/settings_translation_file.cpp
msgid "Transparency Sorting Distance"
@ -6368,7 +6335,6 @@ msgid "Trilinear filtering"
msgstr "三線性過濾器"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"True = 256\n"
"False = 128\n"
@ -6376,7 +6342,7 @@ msgid ""
msgstr ""
"True = 256\n"
"False = 128\n"
"對於讓迷你地圖在較慢的機器上變得流暢有效。"
"使迷你地圖在速度較慢的機器上更加平滑。"
#: src/settings_translation_file.cpp
msgid "Trusted mods"
@ -6691,18 +6657,16 @@ msgid "Waving liquids wave speed"
msgstr "波動的水速度"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Waving liquids wavelength"
msgstr "波動的水長度"
msgstr "波動液體的波長"
#: src/settings_translation_file.cpp
msgid "Waving plants"
msgstr "植物擺動"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Weblink color"
msgstr "色彩選取框"
msgstr "網路連結顏色"
#: src/settings_translation_file.cpp
msgid ""
@ -6831,9 +6795,8 @@ msgstr ""
"若從主選單啟動則不需要。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "World start time"
msgstr "世界遊戲"
msgstr "世界開始時間"
#: src/settings_translation_file.cpp
msgid ""

25
shell.nix Normal file
View file

@ -0,0 +1,25 @@
{ pkgs ? import <nixpkgs> {}, }:
pkgs.mkShell {
LOCALE_ARCHIVE = "${pkgs.glibcLocales}/lib/locale/locale-archive";
env.LANG = "C.UTF-8";
env.LC_ALL = "C.UTF-8";
packages = [
pkgs.gcc
pkgs.cmake
pkgs.zlib
pkgs.zstd
pkgs.libjpeg
pkgs.libpng
pkgs.libGL
pkgs.SDL2
pkgs.openal
pkgs.curl
pkgs.libvorbis
pkgs.libogg
pkgs.gettext
pkgs.freetype
pkgs.sqlite
];
}

View file

@ -152,17 +152,19 @@ typedef std::unordered_map<std::string, BoneOverride> BoneOverrideMap;
class ActiveObject
{
public:
ActiveObject(u16 id):
typedef u16 object_t;
ActiveObject(object_t id):
m_id(id)
{
}
u16 getId() const
object_t getId() const
{
return m_id;
}
void setId(u16 id)
void setId(object_t id)
{
m_id = id;
}
@ -193,14 +195,22 @@ public:
virtual bool collideWithObjects() const = 0;
virtual void setAttachment(int parent_id, const std::string &bone, v3f position,
virtual void setAttachment(object_t parent_id, const std::string &bone, v3f position,
v3f rotation, bool force_visible) {}
virtual void getAttachment(int *parent_id, std::string *bone, v3f *position,
virtual void getAttachment(object_t *parent_id, std::string *bone, v3f *position,
v3f *rotation, bool *force_visible) const {}
// Detach all children
virtual void clearChildAttachments() {}
virtual void clearParentAttachment() {}
virtual void addAttachmentChild(int child_id) {}
virtual void removeAttachmentChild(int child_id) {}
// Detach from parent
virtual void clearParentAttachment()
{
setAttachment(0, "", v3f(), v3f(), false);
}
// To be be called from setAttachment() and descendants, but not manually!
virtual void addAttachmentChild(object_t child_id) {}
virtual void removeAttachmentChild(object_t child_id) {}
protected:
u16 m_id; // 0 is invalid, "no id"
object_t m_id; // 0 is invalid, "no id"
};

View file

@ -1594,7 +1594,7 @@ Inventory* Client::getInventory(const InventoryLocation &loc)
{
// Check if we are working with local player inventory
LocalPlayer *player = m_env.getLocalPlayer();
if (!player || strcmp(player->getName(), loc.name.c_str()) != 0)
if (!player || player->getName() != loc.name)
return NULL;
return &player->inventory;
}

View file

@ -368,7 +368,7 @@ void ClientEnvironment::addActiveObject(u16 id, u8 type,
void ClientEnvironment::removeActiveObject(u16 id)
{
// Get current attachment childs to detach them visually
std::unordered_set<int> attachment_childs;
std::unordered_set<ClientActiveObject::object_t> attachment_childs;
if (auto *obj = getActiveObject(id))
attachment_childs = obj->getAttachmentChildIds();

View file

@ -57,8 +57,8 @@ public:
virtual bool isLocalPlayer() const { return false; }
virtual ClientActiveObject *getParent() const { return nullptr; };
virtual const std::unordered_set<int> &getAttachmentChildIds() const
{ static std::unordered_set<int> rv; return rv; }
virtual const std::unordered_set<object_t> &getAttachmentChildIds() const
{ static std::unordered_set<object_t> rv; return rv; }
virtual void updateAttachments() {};
virtual bool doShowSelectionBox() { return true; }

View file

@ -127,7 +127,7 @@ void Clouds::updateMesh()
m_last_noise_center = center_of_drawing_in_noise_i;
m_mesh_valid = true;
const u32 num_faces_to_draw = m_enable_3d ? 6 : 1;
const u32 num_faces_to_draw = is3D() ? 6 : 1;
// The world position of the integer center point of drawing in the noise
v2f world_center_of_drawing_in_noise_f = v2f(
@ -220,7 +220,7 @@ void Clouds::updateMesh()
const f32 rx = cloud_size / 2.0f;
// if clouds are flat, the top layer should be at the given height
const f32 ry = m_enable_3d ? m_params.thickness * BS : 0.0f;
const f32 ry = is3D() ? m_params.thickness * BS : 0.0f;
const f32 rz = cloud_size / 2;
for(u32 i = 0; i < num_faces_to_draw; i++)
@ -363,7 +363,7 @@ void Clouds::render()
updateAbsolutePosition();
}
m_material.BackfaceCulling = m_enable_3d;
m_material.BackfaceCulling = is3D();
if (m_enable_shaders)
m_material.EmissiveColor = m_color.toSColor();
@ -413,7 +413,7 @@ void Clouds::update(const v3f &camera_p, const video::SColorf &color_diffuse)
// is the camera inside the cloud mesh?
m_camera_pos = camera_p;
m_camera_inside_cloud = false; // default
if (m_enable_3d) {
if (is3D()) {
float camera_height = camera_p.Y - BS * m_camera_offset.Y;
if (camera_height >= m_box.MinEdge.Y &&
camera_height <= m_box.MaxEdge.Y) {

View file

@ -145,6 +145,11 @@ private:
bool gridFilled(int x, int y) const;
// Are the clouds 3D?
inline bool is3D() const {
return m_enable_3d && m_params.thickness >= 0.01f;
}
video::SMaterial m_material;
irr_ptr<scene::SMeshBuffer> m_meshbuffer;
// Value of m_origin at the time the mesh was last updated

View file

@ -385,7 +385,7 @@ void GenericCAO::processInitData(const std::string &data)
if (m_is_player) {
// Check if it's the current player
LocalPlayer *player = m_env->getLocalPlayer();
if (player && strcmp(player->getName(), m_name.c_str()) == 0) {
if (player && player->getName() == m_name) {
m_is_local_player = true;
m_is_visible = false;
player->setCAO(this);
@ -465,7 +465,7 @@ scene::IAnimatedMeshSceneNode *GenericCAO::getAnimatedMeshSceneNode() const
void GenericCAO::setChildrenVisible(bool toset)
{
for (u16 cao_id : m_attachment_child_ids) {
for (object_t cao_id : m_attachment_child_ids) {
GenericCAO *obj = m_env->getGenericCAO(cao_id);
if (obj) {
// Check if the entity is forced to appear in first person.
@ -474,10 +474,10 @@ void GenericCAO::setChildrenVisible(bool toset)
}
}
void GenericCAO::setAttachment(int parent_id, const std::string &bone,
void GenericCAO::setAttachment(object_t parent_id, const std::string &bone,
v3f position, v3f rotation, bool force_visible)
{
int old_parent = m_attachment_parent_id;
const auto old_parent = m_attachment_parent_id;
m_attachment_parent_id = parent_id;
m_attachment_bone = bone;
m_attachment_position = position;
@ -509,7 +509,7 @@ void GenericCAO::setAttachment(int parent_id, const std::string &bone,
}
}
void GenericCAO::getAttachment(int *parent_id, std::string *bone, v3f *position,
void GenericCAO::getAttachment(object_t *parent_id, std::string *bone, v3f *position,
v3f *rotation, bool *force_visible) const
{
*parent_id = m_attachment_parent_id;
@ -523,29 +523,21 @@ void GenericCAO::clearChildAttachments()
{
// Cannot use for-loop here: setAttachment() modifies 'm_attachment_child_ids'!
while (!m_attachment_child_ids.empty()) {
int child_id = *m_attachment_child_ids.begin();
const auto child_id = *m_attachment_child_ids.begin();
if (ClientActiveObject *child = m_env->getActiveObject(child_id))
child->setAttachment(0, "", v3f(), v3f(), false);
removeAttachmentChild(child_id);
if (auto *child = m_env->getActiveObject(child_id))
child->clearParentAttachment();
else
removeAttachmentChild(child_id);
}
}
void GenericCAO::clearParentAttachment()
{
if (m_attachment_parent_id)
setAttachment(0, "", m_attachment_position, m_attachment_rotation, false);
else
setAttachment(0, "", v3f(), v3f(), false);
}
void GenericCAO::addAttachmentChild(int child_id)
void GenericCAO::addAttachmentChild(object_t child_id)
{
m_attachment_child_ids.insert(child_id);
}
void GenericCAO::removeAttachmentChild(int child_id)
void GenericCAO::removeAttachmentChild(object_t child_id)
{
m_attachment_child_ids.erase(child_id);
}

View file

@ -106,8 +106,8 @@ private:
// stores position and rotation for each bone name
BoneOverrideMap m_bone_override;
int m_attachment_parent_id = 0;
std::unordered_set<int> m_attachment_child_ids;
object_t m_attachment_parent_id = 0;
std::unordered_set<object_t> m_attachment_child_ids;
std::string m_attachment_bone = "";
v3f m_attachment_position;
v3f m_attachment_rotation;
@ -226,16 +226,15 @@ public:
}
void setChildrenVisible(bool toset);
void setAttachment(int parent_id, const std::string &bone, v3f position,
void setAttachment(object_t parent_id, const std::string &bone, v3f position,
v3f rotation, bool force_visible) override;
void getAttachment(int *parent_id, std::string *bone, v3f *position,
void getAttachment(object_t *parent_id, std::string *bone, v3f *position,
v3f *rotation, bool *force_visible) const override;
void clearChildAttachments() override;
void clearParentAttachment() override;
void addAttachmentChild(int child_id) override;
void removeAttachmentChild(int child_id) override;
void addAttachmentChild(object_t child_id) override;
void removeAttachmentChild(object_t child_id) override;
ClientActiveObject *getParent() const override;
const std::unordered_set<int> &getAttachmentChildIds() const override
const std::unordered_set<object_t> &getAttachmentChildIds() const override
{ return m_attachment_child_ids; }
void updateAttachments() override;

View file

@ -2188,12 +2188,14 @@ void Game::processItemSelection(u16 *new_playeritem)
{
LocalPlayer *player = client->getEnv().getLocalPlayer();
*new_playeritem = player->getWieldIndex();
u16 max_item = player->getMaxHotbarItemcount();
if (max_item == 0)
return;
max_item -= 1;
/* Item selection using mouse wheel
*/
*new_playeritem = player->getWieldIndex();
u16 max_item = MYMIN(PLAYER_INVENTORY_SIZE - 1,
player->hud_hotbar_itemcount - 1);
s32 wheel = input->getMouseWheel();
if (!m_enable_hotbar_mouse_wheel)
wheel = 0;

View file

@ -783,7 +783,7 @@ void Hud::drawHotbar(u16 playeritem)
v2s32 centerlowerpos(m_displaycenter.X, m_screensize.Y);
s32 hotbar_itemcount = player->hud_hotbar_itemcount;
s32 hotbar_itemcount = player->getMaxHotbarItemcount();
s32 width = hotbar_itemcount * (m_hotbar_imagesize + m_padding * 2);
v2s32 pos = centerlowerpos - v2s32(width / 2, m_hotbar_imagesize + m_padding * 3);

View file

@ -371,14 +371,12 @@ void blitBaseImage(video::IImage* &src, video::IImage* &dst)
namespace {
/** Calculate the color of a single pixel drawn on top of another pixel without
* gamma correction
/** Calculate the result of the overlay texture modifier (`^`) for a single
* pixel
*
* The color mixing is a little more complicated than just
* video::SColor::getInterpolated because getInterpolated does not handle alpha
* correctly.
* For example, a pixel with alpha=64 drawn atop a pixel with alpha=128 should
* yield a pixel with alpha=160, while getInterpolated would yield alpha=96.
* This is not alpha blending if both src and dst are semi-transparent. The
* reason this is that an old implementation did it wrong, and fixing it would
* break backwards compatibility (see #14847).
*
* \tparam overlay If enabled, only modify dst_col if it is fully opaque
* \param src_col Color of the top pixel

View file

@ -75,7 +75,7 @@ void PlayerSettings::settingsChangedCallback(const std::string &name, void *data
LocalPlayer
*/
LocalPlayer::LocalPlayer(Client *client, const char *name):
LocalPlayer::LocalPlayer(Client *client, const std::string &name):
Player(name, client->idef()),
m_client(client)
{

View file

@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "constants.h"
#include "settings.h"
#include "lighting.h"
#include <string>
class Client;
class Environment;
@ -63,7 +64,8 @@ private:
class LocalPlayer : public Player
{
public:
LocalPlayer(Client *client, const char *name);
LocalPlayer(Client *client, const std::string &name);
virtual ~LocalPlayer();
// Initialize hp to 0, so that no hearts will be shown if server

View file

@ -48,8 +48,7 @@ void PlayerDatabaseFiles::deSerialize(RemotePlayer *p, std::istream &is,
p->m_dirty = true;
//args.getS32("version"); // Version field value not used
const std::string &name = args.get("name");
strlcpy(p->m_name, name.c_str(), PLAYERNAME_SIZE);
p->m_name = args.get("name");
if (sao) {
try {
@ -96,7 +95,7 @@ void PlayerDatabaseFiles::deSerialize(RemotePlayer *p, std::istream &is,
p->inventory.deSerialize(is);
} catch (SerializationError &e) {
errorstream << "Failed to deserialize player inventory. player_name="
<< name << " " << e.what() << std::endl;
<< p->getName() << " " << e.what() << std::endl;
}
if (!p->inventory.getList("craftpreview") && p->inventory.getList("craftresult")) {
@ -119,7 +118,7 @@ void PlayerDatabaseFiles::serialize(RemotePlayer *p, std::ostream &os)
// Utilize a Settings object for storing values
Settings args("PlayerArgsEnd");
args.setS32("version", 1);
args.set("name", p->m_name);
args.set("name", p->getName());
PlayerSAO *sao = p->getPlayerSAO();
// This should not happen
@ -171,7 +170,7 @@ void PlayerDatabaseFiles::savePlayer(RemotePlayer *player)
deSerialize(&testplayer, is, path, NULL);
is.close();
if (strcmp(testplayer.getName(), player->getName()) == 0) {
if (testplayer.getName() == player->getName()) {
path_found = true;
continue;
}

View file

@ -468,7 +468,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
std::string hp = itos(sao->getHP());
std::string breath = itos(sao->getBreath());
const char *values[] = {
player->getName(),
player->getName().c_str(),
pitch.c_str(),
yaw.c_str(),
posx.c_str(), posy.c_str(), posz.c_str(),
@ -476,7 +476,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
breath.c_str()
};
const char* rmvalues[] = { player->getName() };
const char* rmvalues[] = { player->getName().c_str() };
beginSave();
if (getPGVersion() < 90500) {
@ -501,7 +501,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
inv_id = itos(i), lsize = itos(list->getSize());
const char* inv_values[] = {
player->getName(),
player->getName().c_str(),
inv_id.c_str(),
width.c_str(),
name.c_str(),
@ -516,7 +516,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
std::string itemStr = oss.str(), slotId = itos(j);
const char* invitem_values[] = {
player->getName(),
player->getName().c_str(),
inv_id.c_str(),
slotId.c_str(),
itemStr.c_str()
@ -529,7 +529,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
const StringMap &attrs = sao->getMeta().getStrings();
for (const auto &attr : attrs) {
const char *meta_values[] = {
player->getName(),
player->getName().c_str(),
attr.first.c_str(),
attr.second.c_str()
};
@ -545,7 +545,7 @@ bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
sanity_check(sao);
verifyDatabase();
const char *values[] = { player->getName() };
const char *values[] = { player->getName().c_str() };
PGresult *results = execPrepared("load_player", 1, values, false, false);
// Player not found, return not found
@ -580,7 +580,7 @@ bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
std::string invIdStr = itos(invId);
const char* values2[] = {
player->getName(),
player->getName().c_str(),
invIdStr.c_str()
};
PGresult *results2 = execPrepared("load_player_inventory_items", 2,

View file

@ -299,6 +299,7 @@ void set_default_settings()
settings->setDefault("gui_scaling", "1.0");
settings->setDefault("gui_scaling_filter", "false");
settings->setDefault("gui_scaling_filter_txr2img", "true");
settings->setDefault("smooth_scrolling", "true");
settings->setDefault("desynchronize_mapblock_texture_animation", "false");
settings->setDefault("hud_hotbar_max_width", "1.0");
settings->setDefault("enable_local_map_saving", "false");
@ -536,6 +537,7 @@ void set_default_settings()
settings->setDefault("server_address", "");
settings->setDefault("server_name", "");
settings->setDefault("server_description", "");
settings->setDefault("server_announce_send_players", "true");
settings->setDefault("enable_console", "false");
settings->setDefault("display_density_factor", "1");

View file

@ -697,32 +697,43 @@ bool MoveDir(const std::string &source, const std::string &target)
bool PathStartsWith(const std::string &path, const std::string &prefix)
{
if (prefix.empty())
return path.empty();
size_t pathsize = path.size();
size_t pathpos = 0;
size_t prefixsize = prefix.size();
size_t prefixpos = 0;
for(;;){
// Test if current characters at path and prefix are delimiter OR EOS
bool delim1 = pathpos == pathsize
|| IsDirDelimiter(path[pathpos]);
bool delim2 = prefixpos == prefixsize
|| IsDirDelimiter(prefix[prefixpos]);
// Return false if it's delimiter/EOS in one path but not in the other
if(delim1 != delim2)
return false;
if(delim1){
// Skip consequent delimiters in path, in prefix
while(pathpos < pathsize &&
IsDirDelimiter(path[pathpos]))
++pathpos;
while(prefixpos < prefixsize &&
IsDirDelimiter(prefix[prefixpos]))
++prefixpos;
// Return true if prefix has ended (at delimiter/EOS)
if(prefixpos == prefixsize)
return true;
// Return false if path has ended (at delimiter/EOS)
// while prefix did not.
if(pathpos == pathsize)
return false;
}
else{
// Skip pairwise-equal characters in path and prefix until
// delimiter/EOS in path or prefix.
// Return false if differing characters are met.
size_t len = 0;
do{
char pathchar = path[pathpos+len];

View file

@ -342,7 +342,7 @@ void GUIFormSpecMenu::parseContainer(parserData* data, const std::string &elemen
errorstream<< "Invalid container start element (" << parts.size() << "): '" << element << "'" << std::endl;
}
void GUIFormSpecMenu::parseContainerEnd(parserData* data)
void GUIFormSpecMenu::parseContainerEnd(parserData* data, const std::string &)
{
if (container_stack.empty()) {
errorstream<< "Invalid container end element, no matching container start element" << std::endl;
@ -419,7 +419,7 @@ void GUIFormSpecMenu::parseScrollContainer(parserData *data, const std::string &
pos_offset.Y = 0.0f;
}
void GUIFormSpecMenu::parseScrollContainerEnd(parserData *data)
void GUIFormSpecMenu::parseScrollContainerEnd(parserData *data, const std::string &)
{
if (data->current_parent == this || data->current_parent->getParent() == this ||
container_stack.empty()) {
@ -641,6 +641,11 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data, const std::string &element
m_fields.push_back(spec);
}
void GUIFormSpecMenu::parseRealCoordinates(parserData* data, const std::string &element)
{
data->real_coordinates = is_yes(element);
}
void GUIFormSpecMenu::parseScrollBar(parserData* data, const std::string &element)
{
std::vector<std::string> parts;
@ -973,10 +978,9 @@ void GUIFormSpecMenu::parseItemImage(parserData* data, const std::string &elemen
m_fields.push_back(spec);
}
void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element,
const std::string &type)
void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element)
{
int expected_parts = (type == "button_url" || type == "button_url_exit") ? 5 : 4;
int expected_parts = (data->type == "button_url" || data->type == "button_url_exit") ? 5 : 4;
std::vector<std::string> parts;
if (!precheckElement("button", element, expected_parts, expected_parts, parts))
return;
@ -986,7 +990,7 @@ void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element,
std::string name = parts[2];
std::string label = parts[3];
std::string url;
if (type == "button_url" || type == "button_url_exit")
if (data->type == "button_url" || data->type == "button_url_exit")
url = parts[4];
MY_CHECKPOS("button",0);
@ -1022,15 +1026,15 @@ void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element,
258 + m_fields.size()
);
spec.ftype = f_Button;
if (type == "button_exit" || type == "button_url_exit")
if (data->type == "button_exit" || data->type == "button_url_exit")
spec.is_exit = true;
if (type == "button_url" || type == "button_url_exit")
if (data->type == "button_url" || data->type == "button_url_exit")
spec.url = url;
GUIButton *e = GUIButton::addButton(Environment, rect, m_tsrc,
data->current_parent, spec.fid, spec.flabel.c_str());
auto style = getStyleForElement(type, name, (type != "button") ? "button" : "");
auto style = getStyleForElement(data->type, name, (data->type != "button") ? "button" : "");
spec.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, "");
@ -1188,7 +1192,9 @@ void GUIFormSpecMenu::parseTable(parserData* data, const std::string &element)
std::vector<std::string> v_pos = split(parts[0],',');
std::vector<std::string> v_geom = split(parts[1],',');
std::string name = parts[2];
std::vector<std::string> items = split(parts[3],',');
std::vector<std::string> items;
if (!parts[3].empty())
items = split(parts[3],',');
std::string str_initial_selection;
if (parts.size() >= 5)
@ -1258,7 +1264,9 @@ void GUIFormSpecMenu::parseTextList(parserData* data, const std::string &element
std::vector<std::string> v_pos = split(parts[0],',');
std::vector<std::string> v_geom = split(parts[1],',');
std::string name = parts[2];
std::vector<std::string> items = split(parts[3],',');
std::vector<std::string> items;
if (!parts[3].empty())
items = split(parts[3],',');
std::string str_initial_selection;
std::string str_transparent = "false";
@ -1686,11 +1694,10 @@ void GUIFormSpecMenu::parseTextArea(parserData* data, std::vector<std::string>&
m_fields.push_back(spec);
}
void GUIFormSpecMenu::parseField(parserData* data, const std::string &element,
const std::string &type)
void GUIFormSpecMenu::parseField(parserData* data, const std::string &element)
{
std::vector<std::string> parts;
if (!precheckElement(type, element, 3, 5, parts))
if (!precheckElement(data->type, element, 3, 5, parts))
return;
if (parts.size() == 3 || parts.size() == 4) {
@ -1699,7 +1706,7 @@ void GUIFormSpecMenu::parseField(parserData* data, const std::string &element,
}
// Else: >= 5 arguments in "parts"
parseTextArea(data, parts, type);
parseTextArea(data, parts, data->type);
}
void GUIFormSpecMenu::parseHyperText(parserData *data, const std::string &element)
@ -1922,8 +1929,7 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data, const std::string &elemen
m_clickthrough_elements.push_back(e);
}
void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &element,
const std::string &type)
void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &element)
{
std::vector<std::string> parts;
if (!precheckElement("image_button", element, 5, 8, parts))
@ -1980,7 +1986,8 @@ void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &elem
258 + m_fields.size()
);
spec.ftype = f_Button;
if (type == "image_button_exit")
if (data->type == "image_button_exit")
spec.is_exit = true;
GUIButtonImage *e = GUIButtonImage::addButton(Environment, rect, m_tsrc,
@ -2580,14 +2587,21 @@ void GUIFormSpecMenu::parsePadding(parserData *data, const std::string &element)
<< "'" << std::endl;
}
bool GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element, bool style_type)
void GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element)
{
if (data->type != "style" && data->type != "style_type") {
errorstream << "Invalid style element type: '" << data->type << "'" << std::endl;
return;
}
bool style_type = (data->type == "style_type");
std::vector<std::string> parts = split(element, ';');
if (parts.size() < 2) {
errorstream << "Invalid style element (" << parts.size() << "): '" << element
<< "'" << std::endl;
return false;
return;
}
StyleSpec spec;
@ -2598,7 +2612,7 @@ bool GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element, b
if (equal_pos == std::string::npos) {
errorstream << "Invalid style element (Property missing value): '" << element
<< "'" << std::endl;
return false;
return;
}
std::string propname = trim(parts[i].substr(0, equal_pos));
@ -2713,10 +2727,10 @@ bool GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element, b
}
}
return true;
return;
}
void GUIFormSpecMenu::parseSetFocus(const std::string &element)
void GUIFormSpecMenu::parseSetFocus(parserData*, const std::string &element)
{
std::vector<std::string> parts;
if (!precheckElement("set_focus", element, 1, 2, parts))
@ -2842,6 +2856,55 @@ void GUIFormSpecMenu::removeAll()
scroll_container_it.second->drop();
}
const std::unordered_map<std::string, std::function<void(GUIFormSpecMenu*, GUIFormSpecMenu::parserData *data,
const std::string &description)>> GUIFormSpecMenu::element_parsers = {
{"container", &GUIFormSpecMenu::parseContainer},
{"container_end", &GUIFormSpecMenu::parseContainerEnd},
{"list", &GUIFormSpecMenu::parseList},
{"listring", &GUIFormSpecMenu::parseListRing},
{"checkbox", &GUIFormSpecMenu::parseCheckbox},
{"image", &GUIFormSpecMenu::parseImage},
{"animated_image", &GUIFormSpecMenu::parseAnimatedImage},
{"item_image", &GUIFormSpecMenu::parseItemImage},
{"button", &GUIFormSpecMenu::parseButton},
{"button_exit", &GUIFormSpecMenu::parseButton},
{"button_url", &GUIFormSpecMenu::parseButton},
{"button_url_exit", &GUIFormSpecMenu::parseButton},
{"background", &GUIFormSpecMenu::parseBackground},
{"background9", &GUIFormSpecMenu::parseBackground},
{"tableoptions", &GUIFormSpecMenu::parseTableOptions},
{"tablecolumns", &GUIFormSpecMenu::parseTableColumns},
{"table", &GUIFormSpecMenu::parseTable},
{"textlist", &GUIFormSpecMenu::parseTextList},
{"dropdown", &GUIFormSpecMenu::parseDropDown},
{"field_enter_after_edit", &GUIFormSpecMenu::parseFieldEnterAfterEdit},
{"field_close_on_enter", &GUIFormSpecMenu::parseFieldCloseOnEnter},
{"pwdfield", &GUIFormSpecMenu::parsePwdField},
{"field", &GUIFormSpecMenu::parseField},
{"textarea", &GUIFormSpecMenu::parseField},
{"hypertext", &GUIFormSpecMenu::parseHyperText},
{"label", &GUIFormSpecMenu::parseLabel},
{"vertlabel", &GUIFormSpecMenu::parseVertLabel},
{"item_image_button", &GUIFormSpecMenu::parseItemImageButton},
{"image_button", &GUIFormSpecMenu::parseImageButton},
{"image_button_exit", &GUIFormSpecMenu::parseImageButton},
{"tabheader", &GUIFormSpecMenu::parseTabHeader},
{"box", &GUIFormSpecMenu::parseBox},
{"bgcolor", &GUIFormSpecMenu::parseBackgroundColor},
{"listcolors", &GUIFormSpecMenu::parseListColors},
{"tooltip", &GUIFormSpecMenu::parseTooltip},
{"scrollbar", &GUIFormSpecMenu::parseScrollBar},
{"real_coordinates", &GUIFormSpecMenu::parseRealCoordinates},
{"style", &GUIFormSpecMenu::parseStyle},
{"style_type", &GUIFormSpecMenu::parseStyle},
{"scrollbaroptions", &GUIFormSpecMenu::parseScrollBarOptions},
{"scroll_container", &GUIFormSpecMenu::parseScrollContainer},
{"scroll_container_end", &GUIFormSpecMenu::parseScrollContainerEnd},
{"set_focus", &GUIFormSpecMenu::parseSetFocus},
{"model", &GUIFormSpecMenu::parseModel},
};
void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element)
{
//some prechecks
@ -2858,195 +2921,15 @@ void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element)
std::string type = trim(element.substr(0, pos));
std::string description = element.substr(pos+1);
if (type == "container") {
parseContainer(data, description);
// They remain here due to bool flags, for now
data->type = type;
auto it = element_parsers.find(type);
if (it != element_parsers.end()) {
it->second(this, data, description);
return;
}
if (type == "container_end") {
parseContainerEnd(data);
return;
}
if (type == "list") {
parseList(data, description);
return;
}
if (type == "listring") {
parseListRing(data, description);
return;
}
if (type == "checkbox") {
parseCheckbox(data, description);
return;
}
if (type == "image") {
parseImage(data, description);
return;
}
if (type == "animated_image") {
parseAnimatedImage(data, description);
return;
}
if (type == "item_image") {
parseItemImage(data, description);
return;
}
if (type == "button" || type == "button_exit" || type == "button_url" || type == "button_url_exit") {
parseButton(data, description, type);
return;
}
if (type == "background" || type == "background9") {
parseBackground(data, description);
return;
}
if (type == "tableoptions"){
parseTableOptions(data,description);
return;
}
if (type == "tablecolumns"){
parseTableColumns(data,description);
return;
}
if (type == "table"){
parseTable(data,description);
return;
}
if (type == "textlist"){
parseTextList(data,description);
return;
}
if (type == "dropdown"){
parseDropDown(data,description);
return;
}
if (type == "field_enter_after_edit") {
parseFieldEnterAfterEdit(data, description);
return;
}
if (type == "field_close_on_enter") {
parseFieldCloseOnEnter(data, description);
return;
}
if (type == "pwdfield") {
parsePwdField(data,description);
return;
}
if ((type == "field") || (type == "textarea")){
parseField(data,description,type);
return;
}
if (type == "hypertext") {
parseHyperText(data,description);
return;
}
if (type == "label") {
parseLabel(data,description);
return;
}
if (type == "vertlabel") {
parseVertLabel(data,description);
return;
}
if (type == "item_image_button") {
parseItemImageButton(data,description);
return;
}
if ((type == "image_button") || (type == "image_button_exit")) {
parseImageButton(data,description,type);
return;
}
if (type == "tabheader") {
parseTabHeader(data,description);
return;
}
if (type == "box") {
parseBox(data,description);
return;
}
if (type == "bgcolor") {
parseBackgroundColor(data,description);
return;
}
if (type == "listcolors") {
parseListColors(data,description);
return;
}
if (type == "tooltip") {
parseTooltip(data,description);
return;
}
if (type == "scrollbar") {
parseScrollBar(data, description);
return;
}
if (type == "real_coordinates") {
data->real_coordinates = is_yes(description);
return;
}
if (type == "style") {
parseStyle(data, description, false);
return;
}
if (type == "style_type") {
parseStyle(data, description, true);
return;
}
if (type == "scrollbaroptions") {
parseScrollBarOptions(data, description);
return;
}
if (type == "scroll_container") {
parseScrollContainer(data, description);
return;
}
if (type == "scroll_container_end") {
parseScrollContainerEnd(data);
return;
}
if (type == "set_focus") {
parseSetFocus(description);
return;
}
if (type == "model") {
parseModel(data, description);
return;
}
// Ignore others
infostream << "Unknown DrawSpec: type=" << type << ", data=\"" << description << "\""

View file

@ -423,8 +423,11 @@ private:
// used to restore table selection/scroll/treeview state
std::unordered_map<std::string, GUITable::DynamicData> table_dyndata;
std::string type;
};
static const std::unordered_map<std::string, std::function<void(GUIFormSpecMenu*, GUIFormSpecMenu::parserData *data, const std::string &description)>> element_parsers;
struct fs_key_pending {
bool key_up;
bool key_down;
@ -442,17 +445,16 @@ private:
void parseSize(parserData* data, const std::string &element);
void parseContainer(parserData* data, const std::string &element);
void parseContainerEnd(parserData* data);
void parseContainerEnd(parserData* data, const std::string &element);
void parseScrollContainer(parserData *data, const std::string &element);
void parseScrollContainerEnd(parserData *data);
void parseScrollContainerEnd(parserData *data, const std::string &element);
void parseList(parserData* data, const std::string &element);
void parseListRing(parserData* data, const std::string &element);
void parseCheckbox(parserData* data, const std::string &element);
void parseImage(parserData* data, const std::string &element);
void parseAnimatedImage(parserData *data, const std::string &element);
void parseItemImage(parserData* data, const std::string &element);
void parseButton(parserData* data, const std::string &element,
const std::string &typ);
void parseButton(parserData* data, const std::string &element);
void parseBackground(parserData* data, const std::string &element);
void parseTableOptions(parserData* data, const std::string &element);
void parseTableColumns(parserData* data, const std::string &element);
@ -462,7 +464,7 @@ private:
void parseFieldEnterAfterEdit(parserData *data, const std::string &element);
void parseFieldCloseOnEnter(parserData *data, const std::string &element);
void parsePwdField(parserData* data, const std::string &element);
void parseField(parserData* data, const std::string &element, const std::string &type);
void parseField(parserData* data, const std::string &element);
void createTextField(parserData *data, FieldSpec &spec,
core::rect<s32> &rect, bool is_multiline);
void parseSimpleField(parserData* data,std::vector<std::string> &parts);
@ -471,8 +473,7 @@ private:
void parseHyperText(parserData *data, const std::string &element);
void parseLabel(parserData* data, const std::string &element);
void parseVertLabel(parserData* data, const std::string &element);
void parseImageButton(parserData* data, const std::string &element,
const std::string &type);
void parseImageButton(parserData* data, const std::string &element);
void parseItemImageButton(parserData* data, const std::string &element);
void parseTabHeader(parserData* data, const std::string &element);
void parseBox(parserData* data, const std::string &element);
@ -481,6 +482,7 @@ private:
void parseTooltip(parserData* data, const std::string &element);
bool parseVersionDirect(const std::string &data);
bool parseSizeDirect(parserData* data, const std::string &element);
void parseRealCoordinates(parserData* data, const std::string &element);
void parseScrollBar(parserData* data, const std::string &element);
void parseScrollBarOptions(parserData *data, const std::string &element);
bool parsePositionDirect(parserData *data, const std::string &element);
@ -489,8 +491,8 @@ private:
void parseAnchor(parserData *data, const std::string &element);
bool parsePaddingDirect(parserData *data, const std::string &element);
void parsePadding(parserData *data, const std::string &element);
bool parseStyle(parserData *data, const std::string &element, bool style_type);
void parseSetFocus(const std::string &element);
void parseStyle(parserData *data, const std::string &element);
void parseSetFocus(parserData *, const std::string &element);
void parseModel(parserData *data, const std::string &element);
bool parseMiddleRect(const std::string &value, core::rect<s32> *parsed_rect);

View file

@ -377,6 +377,7 @@ void GUIKeyChangeMenu::add_key(int id, std::wstring button_name, const std::stri
key_settings.push_back(k);
}
// compare with button_titles in touchscreengui.cpp
void GUIKeyChangeMenu::init_keys()
{
this->add_key(GUI_ID_KEY_FORWARD_BUTTON, wstrgettext("Forward"), "keymap_forward");

View file

@ -13,6 +13,7 @@ the arrow buttons where there is insufficient space.
#include "guiScrollBar.h"
#include "guiButton.h"
#include "porting.h"
#include "settings.h"
#include <IGUISkin.h>
GUIScrollBar::GUIScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s32 id,
@ -101,19 +102,9 @@ bool GUIScrollBar::OnEvent(const SEvent &event)
tray_clicked = !dragged_by_slider;
if (tray_clicked) {
const s32 new_pos = getPosFromMousePos(p);
const s32 old_pos = scroll_pos;
setPos(new_pos);
setPosAndSend(new_pos);
// drag in the middle
drag_offset = thumb_size / 2;
// report the scroll event
if (scroll_pos != old_pos && Parent) {
SEvent e;
e.EventType = EET_GUI_EVENT;
e.GUIEvent.Caller = this;
e.GUIEvent.Element = nullptr;
e.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
Parent->OnEvent(e);
}
}
Environment->setFocus(this);
return true;
@ -147,18 +138,8 @@ bool GUIScrollBar::OnEvent(const SEvent &event)
}
const s32 new_pos = getPosFromMousePos(p);
const s32 old_pos = scroll_pos;
setPosAndSend(new_pos);
setPos(new_pos);
if (scroll_pos != old_pos && Parent) {
SEvent e;
e.EventType = EET_GUI_EVENT;
e.GUIEvent.Caller = this;
e.GUIEvent.Element = nullptr;
e.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
Parent->OnEvent(e);
}
return is_inside;
}
default:
@ -300,8 +281,27 @@ void GUIScrollBar::setPos(const s32 &pos)
target_pos = std::nullopt;
}
void GUIScrollBar::setPosAndSend(const s32 &pos)
{
const s32 old_pos = scroll_pos;
setPos(pos);
if (scroll_pos != old_pos && Parent) {
SEvent e;
e.EventType = EET_GUI_EVENT;
e.GUIEvent.Caller = this;
e.GUIEvent.Element = nullptr;
e.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
Parent->OnEvent(e);
}
}
void GUIScrollBar::setPosInterpolated(const s32 &pos)
{
if (!g_settings->getBool("smooth_scrolling")) {
setPosAndSend(pos);
return;
}
s32 clamped = core::s32_clamp(pos, min_pos, max_pos);
if (scroll_pos != clamped) {
target_pos = clamped;

View file

@ -53,6 +53,8 @@ public:
//! Sets a position immediately, aborting any ongoing interpolation.
// setPos does not send EGET_SCROLL_BAR_CHANGED events for you.
void setPos(const s32 &pos);
//! The same as setPos, but it takes care of sending EGET_SCROLL_BAR_CHANGED events.
void setPosAndSend(const s32 &pos);
//! Sets a target position for interpolation.
// If you want to do an interpolated addition, use
// setPosInterpolated(getTargetPos() + x).

View file

@ -319,6 +319,11 @@ bool GUIModalMenu::preprocessEvent(const SEvent &event)
}
#endif
// If the second touch arrives here again, that means nobody handled it.
// Abort to avoid infinite recursion.
if (m_second_touch)
return true;
// Convert touch events into mouse events.
if (event.EventType == EET_TOUCH_INPUT_EVENT) {
irr_ptr<GUIModalMenu> holder;

View file

@ -31,6 +31,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "client/keycode.h"
#include "client/renderingengine.h"
#include "util/numeric.h"
#include "gettext.h"
#include "IGUIStaticText.h"
#include "IGUIFont.h"
#include <ISceneCollisionManager.h>
#include <iostream>
@ -43,8 +46,7 @@ static const char *button_image_names[] = {
"down.png",
"zoom.png",
"aux1_btn.png",
"gear_icon.png",
"rare_controls.png",
"overflow_btn.png",
"fly_btn.png",
"noclip_btn.png",
@ -65,6 +67,33 @@ static const char *button_image_names[] = {
"joystick_center.png",
};
// compare with GUIKeyChangeMenu::init_keys
static const char *button_titles[] = {
N_("Jump"),
N_("Sneak"),
N_("Zoom"),
N_("Aux1"),
N_("Overflow menu"),
N_("Toggle fly"),
N_("Toggle noclip"),
N_("Toggle fast"),
N_("Toggle debug"),
N_("Change camera"),
N_("Range select"),
N_("Toggle minimap"),
N_("Toggle chat log"),
N_("Chat"),
N_("Inventory"),
N_("Drop"),
N_("Exit"),
N_("Joystick"),
N_("Joystick"),
N_("Joystick"),
};
static void load_button_texture(IGUIImage *gui_button, const std::string &path,
const recti &button_rect, ISimpleTextureSource *tsrc, video::IVideoDriver *driver)
{
@ -243,165 +272,6 @@ static EKEY_CODE id_to_keycode(touch_gui_button_id id)
return code;
}
AutoHideButtonBar::AutoHideButtonBar(IrrlichtDevice *device, ISimpleTextureSource *tsrc,
touch_gui_button_id starter_id, const std::string &starter_img,
recti starter_rect, autohide_button_bar_dir dir) :
m_driver(device->getVideoDriver()),
m_guienv(device->getGUIEnvironment()),
m_receiver(device->getEventReceiver()),
m_texturesource(tsrc)
{
m_upper_left = starter_rect.UpperLeftCorner;
m_lower_right = starter_rect.LowerRightCorner;
IGUIImage *starter_gui_button = m_guienv->addImage(starter_rect, nullptr,
starter_id);
load_button_texture(starter_gui_button, starter_img, starter_rect,
m_texturesource, m_driver);
m_starter = grab_gui_element<IGUIImage>(starter_gui_button);
m_dir = dir;
}
void AutoHideButtonBar::addButton(touch_gui_button_id id, const std::string &image)
{
int button_size = 0;
if (m_dir == AHBB_Dir_Top_Bottom || m_dir == AHBB_Dir_Bottom_Top)
button_size = m_lower_right.X - m_upper_left.X;
else
button_size = m_lower_right.Y - m_upper_left.Y;
recti current_button;
if (m_dir == AHBB_Dir_Right_Left || m_dir == AHBB_Dir_Left_Right) {
int x_start = 0;
int x_end = 0;
if (m_dir == AHBB_Dir_Left_Right) {
x_start = m_lower_right.X + button_size * 1.25f * m_buttons.size()
+ button_size * 0.25f;
x_end = x_start + button_size;
} else {
x_end = m_upper_left.X - button_size * 1.25f * m_buttons.size()
- button_size * 0.25f;
x_start = x_end - button_size;
}
current_button = recti(x_start, m_upper_left.Y, x_end, m_lower_right.Y);
} else {
double y_start = 0;
double y_end = 0;
if (m_dir == AHBB_Dir_Top_Bottom) {
y_start = m_lower_right.X + button_size * 1.25f * m_buttons.size()
+ button_size * 0.25f;
y_end = y_start + button_size;
} else {
y_end = m_upper_left.X - button_size * 1.25f * m_buttons.size()
- button_size * 0.25f;
y_start = y_end - button_size;
}
current_button = recti(m_upper_left.X, y_start, m_lower_right.Y, y_end);
}
IGUIImage *btn_gui_button = m_guienv->addImage(current_button, nullptr, id);
btn_gui_button->setVisible(false);
btn_gui_button->setEnabled(false);
load_button_texture(btn_gui_button, image, current_button, m_texturesource, m_driver);
button_info btn{};
btn.keycode = id_to_keycode(id);
btn.gui_button = grab_gui_element<IGUIImage>(btn_gui_button);
m_buttons.push_back(btn);
}
void AutoHideButtonBar::addToggleButton(touch_gui_button_id id,
const std::string &image_1, const std::string &image_2)
{
addButton(id, image_1);
button_info &btn = m_buttons.back();
btn.toggleable = button_info::FIRST_TEXTURE;
btn.toggle_textures[0] = image_1;
btn.toggle_textures[1] = image_2;
}
bool AutoHideButtonBar::handlePress(size_t pointer_id, IGUIElement *element)
{
if (m_active) {
return buttons_handlePress(m_buttons, pointer_id, element, m_driver,
m_receiver, m_texturesource);
}
if (m_starter.get() == element) {
activate();
return true;
}
return false;
}
bool AutoHideButtonBar::handleRelease(size_t pointer_id)
{
return buttons_handleRelease(m_buttons, pointer_id, m_driver,
m_receiver, m_texturesource);
}
void AutoHideButtonBar::step(float dtime)
{
// Since buttons can stay pressed after the buttonbar is deactivated,
// we call the step function even if the buttonbar is inactive.
bool has_pointers = buttons_step(m_buttons, dtime, m_driver, m_receiver,
m_texturesource);
if (m_active) {
if (!has_pointers) {
m_timeout += dtime;
if (m_timeout > BUTTONBAR_HIDE_DELAY)
deactivate();
} else {
m_timeout = 0.0f;
}
}
}
void AutoHideButtonBar::updateVisibility() {
bool starter_visible = m_visible && !m_active;
bool inner_visible = m_visible && m_active;
m_starter->setVisible(starter_visible);
m_starter->setEnabled(starter_visible);
for (auto &button : m_buttons) {
button.gui_button->setVisible(inner_visible);
button.gui_button->setEnabled(inner_visible);
}
}
void AutoHideButtonBar::activate()
{
m_active = true;
m_timeout = 0.0f;
updateVisibility();
}
void AutoHideButtonBar::deactivate()
{
m_active = false;
updateVisibility();
}
void AutoHideButtonBar::show()
{
m_visible = true;
updateVisibility();
}
void AutoHideButtonBar::hide()
{
m_visible = false;
updateVisibility();
}
TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, ISimpleTextureSource *tsrc):
m_device(device),
@ -421,44 +291,44 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, ISimpleTextureSource *tsr
// Initialize joystick display "button".
// Joystick is placed on the bottom left of screen.
if (m_fixed_joystick) {
m_joystick_btn_off = grab_gui_element<IGUIImage>(makeJoystickButton(joystick_off_id,
m_joystick_btn_off = grab_gui_element<IGUIImage>(makeButtonDirect(joystick_off_id,
recti(m_button_size,
m_screensize.Y - m_button_size * 4,
m_button_size * 4,
m_screensize.Y - m_button_size), true));
} else {
m_joystick_btn_off = grab_gui_element<IGUIImage>(makeJoystickButton(joystick_off_id,
m_joystick_btn_off = grab_gui_element<IGUIImage>(makeButtonDirect(joystick_off_id,
recti(m_button_size,
m_screensize.Y - m_button_size * 3,
m_button_size * 3,
m_screensize.Y - m_button_size), true));
}
m_joystick_btn_bg = grab_gui_element<IGUIImage>(makeJoystickButton(joystick_bg_id,
m_joystick_btn_bg = grab_gui_element<IGUIImage>(makeButtonDirect(joystick_bg_id,
recti(m_button_size,
m_screensize.Y - m_button_size * 4,
m_button_size * 4,
m_screensize.Y - m_button_size), false));
m_joystick_btn_center = grab_gui_element<IGUIImage>(makeJoystickButton(joystick_center_id,
m_joystick_btn_center = grab_gui_element<IGUIImage>(makeButtonDirect(joystick_center_id,
recti(0, 0, m_button_size, m_button_size), false));
// init jump button
addButton(jump_id, button_image_names[jump_id],
addButton(m_buttons, jump_id, button_image_names[jump_id],
recti(m_screensize.X - 1.75f * m_button_size,
m_screensize.Y - m_button_size,
m_screensize.X - 0.25f * m_button_size,
m_screensize.Y));
// init sneak button
addButton(sneak_id, button_image_names[sneak_id],
addButton(m_buttons, sneak_id, button_image_names[sneak_id],
recti(m_screensize.X - 3.25f * m_button_size,
m_screensize.Y - m_button_size,
m_screensize.X - 1.75f * m_button_size,
m_screensize.Y));
// init zoom button
addButton(zoom_id, button_image_names[zoom_id],
addButton(m_buttons, zoom_id, button_image_names[zoom_id],
recti(m_screensize.X - 1.25f * m_button_size,
m_screensize.Y - 4 * m_button_size,
m_screensize.X - 0.25f * m_button_size,
@ -466,72 +336,112 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, ISimpleTextureSource *tsr
// init aux1 button
if (!m_joystick_triggers_aux1)
addButton(aux1_id, button_image_names[aux1_id],
addButton(m_buttons, aux1_id, button_image_names[aux1_id],
recti(m_screensize.X - 1.25f * m_button_size,
m_screensize.Y - 2.5f * m_button_size,
m_screensize.X - 0.25f * m_button_size,
m_screensize.Y - 1.5f * m_button_size));
AutoHideButtonBar &settings_bar = m_buttonbars.emplace_back(m_device, m_texturesource,
settings_starter_id, button_image_names[settings_starter_id],
recti(m_screensize.X - 1.25f * m_button_size,
m_screensize.Y - (SETTINGS_BAR_Y_OFFSET + 1.0f) * m_button_size
+ 0.5f * m_button_size,
m_screensize.X - 0.25f * m_button_size,
m_screensize.Y - SETTINGS_BAR_Y_OFFSET * m_button_size
+ 0.5f * m_button_size),
AHBB_Dir_Right_Left);
// init overflow button
m_overflow_btn = grab_gui_element<IGUIImage>(makeButtonDirect(overflow_id,
recti(m_screensize.X - 1.25f * m_button_size,
m_screensize.Y - 5.5f * m_button_size,
m_screensize.X - 0.25f * m_button_size,
m_screensize.Y - 4.5f * m_button_size), true));
const static touch_gui_button_id settings_bar_buttons[] {
const static touch_gui_button_id overflow_buttons[] {
chat_id, inventory_id, drop_id, exit_id,
fly_id, noclip_id, fast_id, debug_id, camera_id, range_id, minimap_id,
toggle_chat_id,
};
for (auto id : settings_bar_buttons) {
if (id_to_keycode(id) == KEY_UNKNOWN)
continue;
settings_bar.addButton(id, button_image_names[id]);
IGUIStaticText *background = m_guienv->addStaticText(L"",
recti(v2s32(0, 0), dimension2du(m_screensize)));
background->setBackgroundColor(video::SColor(140, 0, 0, 0));
background->setVisible(false);
m_overflow_bg = grab_gui_element<IGUIStaticText>(background);
s32 cols = 4;
s32 rows = 3;
f32 screen_aspect = (f32)m_screensize.X / (f32)m_screensize.Y;
while ((s32)ARRLEN(overflow_buttons) > cols * rows) {
f32 aspect = (f32)cols / (f32)rows;
if (aspect > screen_aspect)
rows++;
else
cols++;
}
// Chat is shown by default, so chat_hide_btn.png is shown first.
settings_bar.addToggleButton(toggle_chat_id,
"chat_hide_btn.png", "chat_show_btn.png");
v2s32 size(m_button_size, m_button_size);
v2s32 spacing(m_screensize.X / (cols + 1), m_screensize.Y / (rows + 1));
v2s32 pos(spacing);
AutoHideButtonBar &rare_controls_bar = m_buttonbars.emplace_back(m_device, m_texturesource,
rare_controls_starter_id, button_image_names[rare_controls_starter_id],
recti(0.25f * m_button_size,
m_screensize.Y - (RARE_CONTROLS_BAR_Y_OFFSET + 1.0f) * m_button_size
+ 0.5f * m_button_size,
0.75f * m_button_size,
m_screensize.Y - RARE_CONTROLS_BAR_Y_OFFSET * m_button_size
+ 0.5f * m_button_size),
AHBB_Dir_Left_Right);
const static touch_gui_button_id rare_controls_bar_buttons[] {
chat_id, inventory_id, drop_id, exit_id,
};
for (auto id : rare_controls_bar_buttons) {
for (auto id : overflow_buttons) {
if (id_to_keycode(id) == KEY_UNKNOWN)
continue;
rare_controls_bar.addButton(id, button_image_names[id]);
recti rect(pos - size / 2, dimension2du(size.X, size.Y));
if (rect.LowerRightCorner.X > (s32)m_screensize.X) {
pos.X = spacing.X;
pos.Y += spacing.Y;
rect = recti(pos - size / 2, dimension2du(size.X, size.Y));
}
if (id == toggle_chat_id)
// Chat is shown by default, so chat_hide_btn.png is shown first.
addToggleButton(m_overflow_buttons, id, "chat_hide_btn.png",
"chat_show_btn.png", rect, false);
else
addButton(m_overflow_buttons, id, button_image_names[id], rect, false);
std::wstring str = wstrgettext(button_titles[id]);
IGUIStaticText *text = m_guienv->addStaticText(str.c_str(), recti());
IGUIFont *font = text->getActiveFont();
dimension2du dim = font->getDimension(str.c_str());
dim = dimension2du(dim.Width * 1.25f, dim.Height * 1.25f); // avoid clipping
text->setRelativePosition(recti(pos.X - dim.Width / 2, pos.Y + size.Y / 2,
pos.X + dim.Width / 2, pos.Y + size.Y / 2 + dim.Height));
text->setTextAlignment(EGUIA_CENTER, EGUIA_UPPERLEFT);
text->setVisible(false);
m_overflow_button_titles.push_back(grab_gui_element<IGUIStaticText>(text));
rect.addInternalPoint(text->getRelativePosition().UpperLeftCorner);
rect.addInternalPoint(text->getRelativePosition().LowerRightCorner);
m_overflow_button_rects.push_back(rect);
pos.X += spacing.X;
}
}
void TouchScreenGUI::addButton(touch_gui_button_id id, const std::string &image, const recti &rect)
void TouchScreenGUI::addButton(std::vector<button_info> &buttons, touch_gui_button_id id,
const std::string &image, const recti &rect, bool visible)
{
IGUIImage *btn_gui_button = m_guienv->addImage(rect, nullptr, id);
btn_gui_button->setVisible(visible);
load_button_texture(btn_gui_button, image, rect,
m_texturesource, m_device->getVideoDriver());
button_info &btn = m_buttons.emplace_back();
button_info &btn = buttons.emplace_back();
btn.keycode = id_to_keycode(id);
btn.gui_button = grab_gui_element<IGUIImage>(btn_gui_button);
}
IGUIImage *TouchScreenGUI::makeJoystickButton(touch_gui_button_id id,
const recti &button_rect, bool visible)
void TouchScreenGUI::addToggleButton(std::vector<button_info> &buttons, touch_gui_button_id id,
const std::string &image_1, const std::string &image_2, const recti &rect, bool visible)
{
IGUIImage *btn_gui_button = m_guienv->addImage(button_rect, nullptr, id);
addButton(buttons, id, image_1, rect, visible);
button_info &btn = buttons.back();
btn.toggleable = button_info::FIRST_TEXTURE;
btn.toggle_textures[0] = image_1;
btn.toggle_textures[1] = image_2;
}
IGUIImage *TouchScreenGUI::makeButtonDirect(touch_gui_button_id id,
const recti &rect, bool visible)
{
IGUIImage *btn_gui_button = m_guienv->addImage(rect, nullptr, id);
btn_gui_button->setVisible(visible);
load_button_texture(btn_gui_button, button_image_names[id], button_rect,
load_button_texture(btn_gui_button, button_image_names[id], rect,
m_texturesource, m_device->getVideoDriver());
return btn_gui_button;
@ -566,17 +476,17 @@ void TouchScreenGUI::handleReleaseEvent(size_t pointer_id)
m_pointer_downpos.erase(pointer_id);
m_pointer_pos.erase(pointer_id);
if (m_overflow_open) {
buttons_handleRelease(m_overflow_buttons, pointer_id, m_device->getVideoDriver(),
m_receiver, m_texturesource);
return;
}
// handle buttons
if (buttons_handleRelease(m_buttons, pointer_id, m_device->getVideoDriver(),
m_receiver, m_texturesource))
return;
// handle buttonbars
for (AutoHideButtonBar &bar : m_buttonbars) {
if (bar.handleRelease(pointer_id))
return;
}
if (m_has_move_id && pointer_id == m_move_id) {
// handle the point used for moving view
m_has_move_id = false;
@ -584,7 +494,8 @@ void TouchScreenGUI::handleReleaseEvent(size_t pointer_id)
// If m_tap_state is already set to TapState::ShortTap, we must keep
// that value. Otherwise, many short taps will be ignored if you tap
// very fast.
if (!m_move_has_really_moved && m_tap_state != TapState::LongTap) {
if (!m_move_has_really_moved && !m_move_prevent_short_tap &&
m_tap_state != TapState::LongTap) {
m_tap_state = TapState::ShortTap;
} else {
m_tap_state = TapState::None;
@ -635,41 +546,48 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
m_pointer_downpos[pointer_id] = touch_pos;
m_pointer_pos[pointer_id] = touch_pos;
bool prevent_short_tap = false;
IGUIElement *element = m_guienv->getRootGUIElement()->getElementFromPoint(touch_pos);
// handle overflow menu
if (!m_overflow_open) {
if (element == m_overflow_btn.get()) {
toggleOverflowMenu();
return;
}
} else {
for (size_t i = 0; i < m_overflow_buttons.size(); i++) {
if (m_overflow_button_rects[i].isPointInside(touch_pos)) {
element = m_overflow_buttons[i].gui_button.get();
break;
}
}
if (buttons_handlePress(m_overflow_buttons, pointer_id, element,
m_device->getVideoDriver(), m_receiver, m_texturesource))
return;
toggleOverflowMenu();
// refresh since visibility of buttons has changed
element = m_guienv->getRootGUIElement()->getElementFromPoint(touch_pos);
// restore after releaseAll in toggleOverflowMenu
m_pointer_downpos[pointer_id] = touch_pos;
m_pointer_pos[pointer_id] = touch_pos;
// continue processing, but avoid accidentally placing a node
// when closing the overflow menu
prevent_short_tap = true;
}
// handle buttons
if (buttons_handlePress(m_buttons, pointer_id, element,
m_device->getVideoDriver(), m_receiver, m_texturesource)) {
for (AutoHideButtonBar &bar : m_buttonbars)
bar.deactivate();
m_device->getVideoDriver(), m_receiver, m_texturesource))
return;
}
// handle buttonbars
for (AutoHideButtonBar &bar : m_buttonbars) {
if (bar.handlePress(pointer_id, element)) {
for (AutoHideButtonBar &other : m_buttonbars)
if (other != bar)
other.deactivate();
return;
}
}
// handle hotbar
if (isHotbarButton(event)) {
if (isHotbarButton(event))
// already handled in isHotbarButton()
for (AutoHideButtonBar &bar : m_buttonbars)
bar.deactivate();
return;
}
// handle non button events
for (AutoHideButtonBar &bar : m_buttonbars) {
if (bar.isActive()) {
bar.deactivate();
return;
}
}
// Select joystick when joystick tapped (fixed joystick position) or
// when left 1/3 of screen dragged (free joystick position)
@ -704,6 +622,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
// DON'T reset m_tap_state here, otherwise many short taps
// will be ignored if you tap very fast.
m_had_move_id = true;
m_move_prevent_short_tap = prevent_short_tap;
}
}
}
@ -713,6 +632,9 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
} else {
assert(event.TouchInput.Event == ETIE_MOVED);
if (m_overflow_open)
return;
if (!(m_has_joystick_id && m_fixed_joystick) &&
m_pointer_pos[event.TouchInput.ID] == touch_pos)
return;
@ -798,10 +720,13 @@ void TouchScreenGUI::applyJoystickStatus()
void TouchScreenGUI::step(float dtime)
{
if (m_overflow_open) {
buttons_step(m_overflow_buttons, dtime, m_device->getVideoDriver(), m_receiver, m_texturesource);
return;
}
// simulate keyboard repeats
buttons_step(m_buttons, dtime, m_device->getVideoDriver(), m_receiver, m_texturesource);
for (AutoHideButtonBar &bar : m_buttonbars)
bar.step(dtime);
// joystick
applyJoystickStatus();
@ -844,42 +769,65 @@ void TouchScreenGUI::registerHotbarRect(u16 index, const recti &rect)
void TouchScreenGUI::setVisible(bool visible)
{
if (m_visible == visible)
return;
m_visible = visible;
for (auto &button : m_buttons) {
if (button.gui_button)
button.gui_button->setVisible(visible);
}
if (m_joystick_btn_off)
m_joystick_btn_off->setVisible(visible);
// clear all active buttons
// order matters
if (!visible) {
while (!m_pointer_pos.empty())
handleReleaseEvent(m_pointer_pos.begin()->first);
for (AutoHideButtonBar &bar : m_buttonbars) {
bar.deactivate();
bar.hide();
}
} else {
for (AutoHideButtonBar &bar : m_buttonbars)
bar.show();
releaseAll();
m_overflow_open = false;
}
updateVisibility();
}
void TouchScreenGUI::toggleOverflowMenu()
{
releaseAll(); // must be done first
m_overflow_open = !m_overflow_open;
updateVisibility();
}
void TouchScreenGUI::updateVisibility()
{
bool regular_visible = m_visible && !m_overflow_open;
for (auto &button : m_buttons)
button.gui_button->setVisible(regular_visible);
m_overflow_btn->setVisible(regular_visible);
m_joystick_btn_off->setVisible(regular_visible);
bool overflow_visible = m_visible && m_overflow_open;
m_overflow_bg->setVisible(overflow_visible);
for (auto &button : m_overflow_buttons)
button.gui_button->setVisible(overflow_visible);
for (auto &text : m_overflow_button_titles)
text->setVisible(overflow_visible);
}
void TouchScreenGUI::releaseAll()
{
while (!m_pointer_pos.empty())
handleReleaseEvent(m_pointer_pos.begin()->first);
// Release those manually too since the change initiated by
// handleReleaseEvent will only be applied later by applyContextControls.
if (m_dig_pressed) {
emitMouseEvent(EMIE_LMOUSE_LEFT_UP);
m_dig_pressed = false;
}
if (m_place_pressed) {
emitMouseEvent(EMIE_RMOUSE_LEFT_UP);
m_place_pressed = false;
}
}
void TouchScreenGUI::hide()
{
if (!m_visible)
return;
setVisible(false);
}
void TouchScreenGUI::show()
{
if (m_visible)
return;
setVisible(true);
}

View file

@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#pragma once
#include "IGUIStaticText.h"
#include "irrlichttypes.h"
#include <IEventReceiver.h>
#include <IGUIImage.h>
@ -74,8 +75,7 @@ enum touch_gui_button_id
sneak_id,
zoom_id,
aux1_id,
settings_starter_id,
rare_controls_starter_id,
overflow_id,
// usually in the "settings bar"
fly_id,
@ -99,25 +99,16 @@ enum touch_gui_button_id
joystick_center_id,
};
enum autohide_button_bar_dir
{
AHBB_Dir_Top_Bottom,
AHBB_Dir_Bottom_Top,
AHBB_Dir_Left_Right,
AHBB_Dir_Right_Left
};
#define BUTTON_REPEAT_DELAY 0.5f
#define BUTTON_REPEAT_INTERVAL 0.333f
#define BUTTONBAR_HIDE_DELAY 3.0f
#define SETTINGS_BAR_Y_OFFSET 5
#define RARE_CONTROLS_BAR_Y_OFFSET 5
// Our simulated clicks last some milliseconds so that server-side mods have a
// chance to detect them via l_get_player_control.
// If you tap faster than this value, the simulated clicks are of course shorter.
#define SIMULATED_CLICK_DURATION_MS 50
struct button_info
{
float repeat_counter;
@ -136,52 +127,6 @@ struct button_info
IEventReceiver *receiver, ISimpleTextureSource *tsrc);
};
class AutoHideButtonBar
{
public:
AutoHideButtonBar(IrrlichtDevice *device, ISimpleTextureSource *tsrc,
touch_gui_button_id starter_id, const std::string &starter_image,
recti starter_rect, autohide_button_bar_dir dir);
void addButton(touch_gui_button_id id, const std::string &image);
void addToggleButton(touch_gui_button_id id,
const std::string &image_1, const std::string &image_2);
bool handlePress(size_t pointer_id, IGUIElement *element);
bool handleRelease(size_t pointer_id);
void step(float dtime);
void activate();
void deactivate();
bool isActive() { return m_active; }
void show();
void hide();
bool operator==(const AutoHideButtonBar &other)
{ return m_starter.get() == other.m_starter.get(); }
bool operator!=(const AutoHideButtonBar &other)
{ return m_starter.get() != other.m_starter.get(); }
private:
irr::video::IVideoDriver *m_driver = nullptr;
IGUIEnvironment *m_guienv = nullptr;
IEventReceiver *m_receiver = nullptr;
ISimpleTextureSource *m_texturesource = nullptr;
std::shared_ptr<IGUIImage> m_starter;
std::vector<button_info> m_buttons;
v2s32 m_upper_left;
v2s32 m_lower_right;
bool m_active = false;
bool m_visible = true;
float m_timeout = 0.0f;
autohide_button_bar_dir m_dir = AHBB_Dir_Right_Left;
void updateVisibility();
};
class TouchScreenGUI
{
@ -262,6 +207,7 @@ private:
// This is needed so that we don't miss if m_has_move_id is true for less
// than one client step, i.e. press and release happen in the same step.
bool m_had_move_id = false;
bool m_move_prevent_short_tap = false;
bool m_has_joystick_id = false;
size_t m_joystick_id;
@ -277,13 +223,28 @@ private:
std::shared_ptr<IGUIImage> m_joystick_btn_center;
std::vector<button_info> m_buttons;
std::shared_ptr<IGUIImage> m_overflow_btn;
bool m_overflow_open = false;
std::shared_ptr<IGUIStaticText> m_overflow_bg;
std::vector<button_info> m_overflow_buttons;
std::vector<std::shared_ptr<IGUIStaticText>> m_overflow_button_titles;
std::vector<recti> m_overflow_button_rects;
void toggleOverflowMenu();
void updateVisibility();
void releaseAll();
// initialize a button
void addButton(touch_gui_button_id id, const std::string &image,
const recti &rect);
void addButton(std::vector<button_info> &buttons,
touch_gui_button_id id, const std::string &image,
const recti &rect, bool visible=true);
void addToggleButton(std::vector<button_info> &buttons,
touch_gui_button_id id,
const std::string &image_1, const std::string &image_2,
const recti &rect, bool visible=true);
// initialize a joystick button
IGUIImage *makeJoystickButton(touch_gui_button_id id,
IGUIImage *makeButtonDirect(touch_gui_button_id id,
const recti &rect, bool visible);
// handle pressing hotbar items
@ -300,8 +261,6 @@ private:
// map to store the IDs and positions of currently pressed pointers
std::unordered_map<size_t, v2s32> m_pointer_pos;
std::vector<AutoHideButtonBar> m_buttonbars;
v2s32 getPointerPos();
void emitMouseEvent(EMOUSE_INPUT_EVENT type);
TouchInteractionMode m_last_mode = TouchInteractionMode_END;

View file

@ -1095,13 +1095,9 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings &
if (cmd_args.exists("terminal")) {
#if USE_CURSES
bool name_ok = true;
std::string admin_nick = g_settings->get("name");
name_ok = name_ok && !admin_nick.empty();
name_ok = name_ok && string_allowed(admin_nick, PLAYERNAME_ALLOWED_CHARS);
if (!name_ok) {
if (!is_valid_player_name(admin_nick)) {
if (admin_nick.empty()) {
errorstream << "No name given for admin. "
<< "Please check your minetest.conf that it "
@ -1110,7 +1106,8 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings &
} else {
errorstream << "Name for admin '"
<< admin_nick << "' is not valid. "
<< "Please check that it only contains allowed characters. "
<< "Please check that it only contains allowed characters "
<< "and that it is at most 20 characters long. "
<< "Valid characters are: " << PLAYERNAME_ALLOWED_CHARS_USER_EXPL
<< std::endl;
}

View file

@ -471,6 +471,8 @@ void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt)
for (u16 i = 0; i < removed_count; i++) {
*pkt >> id;
m_env.removeActiveObject(id);
// Object-attached sounds MUST NOT be removed here because they might
// have started to play immediately before the entity was removed.
}
// Read added objects

View file

@ -615,7 +615,7 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
// If something goes wrong, this player is to blame
RollbackScopeActor rollback_scope(m_rollback,
std::string("player:")+player->getName());
"player:" + player->getName());
/*
Note: Always set inventory not sent, to repair cases
@ -852,11 +852,11 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt)
*pkt >> item;
if (item >= player->getHotbarItemcount()) {
if (item >= player->getMaxHotbarItemcount()) {
actionstream << "Player: " << player->getName()
<< " tried to access item=" << item
<< " out of hotbar_itemcount="
<< player->getHotbarItemcount()
<< player->getMaxHotbarItemcount()
<< "; ignoring." << std::endl;
return;
}
@ -983,11 +983,11 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
// Update wielded item
if (item_i >= player->getHotbarItemcount()) {
if (item_i >= player->getMaxHotbarItemcount()) {
actionstream << "Player: " << player->getName()
<< " tried to access item=" << item_i
<< " out of hotbar_itemcount="
<< player->getHotbarItemcount()
<< player->getMaxHotbarItemcount()
<< "; ignoring." << std::endl;
return;
}
@ -1069,7 +1069,7 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
If something goes wrong, this player is to blame
*/
RollbackScopeActor rollback_scope(m_rollback,
std::string("player:")+player->getName());
"player:" + player->getName());
switch (action) {
// Start digging or punch object
@ -1400,7 +1400,7 @@ void Server::handleCommand_NodeMetaFields(NetworkPacket* pkt)
// If something goes wrong, this player is to blame
RollbackScopeActor rollback_scope(m_rollback,
std::string("player:")+player->getName());
"player:" + player->getName());
// Check the target node for rollback data; leave others unnoticed
RollbackNode rn_old(&m_env->getMap(), p, this);

View file

@ -30,10 +30,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "porting.h" // strlcpy
Player::Player(const char *name, IItemDefManager *idef):
bool is_valid_player_name(std::string_view name) {
return !name.empty() && name.size() <= PLAYERNAME_SIZE && string_allowed(name, PLAYERNAME_ALLOWED_CHARS);
}
Player::Player(const std::string &name, IItemDefManager *idef):
inventory(idef)
{
strlcpy(m_name, name, PLAYERNAME_SIZE);
m_name = name;
inventory.clear();
inventory.addList("main", PLAYER_INVENTORY_SIZE);
@ -88,6 +92,11 @@ void Player::setWieldIndex(u16 index)
m_wield_index = MYMIN(index, mlist ? mlist->getSize() : 0);
}
u16 Player::getWieldIndex()
{
return std::min(m_wield_index, getMaxHotbarItemcount());
}
ItemStack &Player::getWieldedItem(ItemStack *selected, ItemStack *hand) const
{
assert(selected);
@ -157,6 +166,12 @@ void Player::clearHud()
}
}
u16 Player::getMaxHotbarItemcount()
{
InventoryList *mainlist = inventory.getList("main");
return mainlist ? std::min(mainlist->getSize(), (u32) hud_hotbar_itemcount) : 0;
}
#ifndef SERVER
u32 PlayerControl::getKeysPressed() const

View file

@ -24,16 +24,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "constants.h"
#include "network/networkprotocol.h"
#include "util/basic_macros.h"
#include "util/string.h"
#include <list>
#include <mutex>
#include <functional>
#include <tuple>
#include <string>
#define PLAYERNAME_SIZE 20
#define PLAYERNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
#define PLAYERNAME_ALLOWED_CHARS_USER_EXPL "'a' to 'z', 'A' to 'Z', '0' to '9', '-', '_'"
bool is_valid_player_name(std::string_view name);
struct PlayerFovSpec
{
f32 fov;
@ -158,7 +162,7 @@ class Player
{
public:
Player(const char *name, IItemDefManager *idef);
Player(const std::string &name, IItemDefManager *idef);
virtual ~Player() = 0;
DISABLE_CLASS_COPY(Player);
@ -178,7 +182,7 @@ public:
// in BS-space
v3f getSpeed() const { return m_speed; }
const char *getName() const { return m_name; }
const std::string& getName() const { return m_name; }
u32 getFreeHudID()
{
@ -223,7 +227,7 @@ public:
// Returns non-empty `selected` ItemStack. `hand` is a fallback, if specified
ItemStack &getWieldedItem(ItemStack *selected, ItemStack *hand) const;
void setWieldIndex(u16 index);
u16 getWieldIndex() const { return m_wield_index; }
u16 getWieldIndex();
bool setFov(const PlayerFovSpec &spec)
{
@ -247,8 +251,11 @@ public:
u32 hud_flags;
s32 hud_hotbar_itemcount;
// Get actual usable number of hotbar items (clamped to size of "main" list)
u16 getMaxHotbarItemcount();
protected:
char m_name[PLAYERNAME_SIZE];
std::string m_name;
v3f m_speed; // velocity; in BS-space
u16 m_wield_index = 0;
PlayerFovSpec m_fov_override_spec = { 0.0f, false, 0.0f };

View file

@ -37,7 +37,7 @@ bool RemotePlayer::m_setting_cache_loaded = false;
float RemotePlayer::m_setting_chat_message_limit_per_10sec = 0.0f;
u16 RemotePlayer::m_setting_chat_message_limit_trigger_kick = 0;
RemotePlayer::RemotePlayer(const char *name, IItemDefManager *idef):
RemotePlayer::RemotePlayer(const std::string &name, IItemDefManager *idef):
Player(name, idef)
{
if (!RemotePlayer::m_setting_cache_loaded) {

View file

@ -41,7 +41,7 @@ class RemotePlayer : public Player
friend class PlayerDatabaseFiles;
public:
RemotePlayer(const char *name, IItemDefManager *idef);
RemotePlayer(const std::string &name, IItemDefManager *idef);
virtual ~RemotePlayer();
PlayerSAO *getPlayerSAO() { return m_sao; }

View file

@ -246,7 +246,7 @@ void ScriptApiServer::freeDynamicMediaCallback(u32 token)
lua_pop(L, 2);
}
void ScriptApiServer::on_dynamic_media_added(u32 token, const char *playername)
void ScriptApiServer::on_dynamic_media_added(u32 token, const std::string &playername)
{
SCRIPTAPI_PRECHECKHEADER
@ -257,6 +257,6 @@ void ScriptApiServer::on_dynamic_media_added(u32 token, const char *playername)
lua_rawgeti(L, -1, token);
luaL_checktype(L, -1, LUA_TFUNCTION);
lua_pushstring(L, playername);
lua_pushstring(L, playername.c_str());
PCALL_RES(lua_pcall(L, 1, 0, error_handler));
}

View file

@ -53,7 +53,7 @@ public:
/* dynamic media handling */
static u32 allocateDynamicMediaCallback(lua_State *L, int f_idx);
void freeDynamicMediaCallback(u32 token);
void on_dynamic_media_added(u32 token, const char *playername);
void on_dynamic_media_added(u32 token, const std::string &playername);
private:
void getAuthHandler();

View file

@ -970,8 +970,8 @@ int ModApiEnvBase::findNodesInArea(lua_State *L, const NodeDefManager *ndef,
});
// last filter table is at top of stack
u32 i = filter.size() - 1;
do {
u32 i = filter.size();
while (i --> 0) {
if (idx[i] == 0) {
// No such node found -> drop the empty table
lua_pop(L, 1);
@ -979,7 +979,7 @@ int ModApiEnvBase::findNodesInArea(lua_State *L, const NodeDefManager *ndef,
// This node was found -> put table into the return table
lua_setfield(L, base, ndef->get(filter[i]).name.c_str());
}
} while (i-- != 0);
}
assert(lua_gettop(L) == base);
return 1;

View file

@ -72,7 +72,7 @@ int LuaLocalPlayer::l_get_name(lua_State *L)
{
LocalPlayer *player = getobject(L, 1);
lua_pushstring(L, player->getName());
lua_pushstring(L, player->getName().c_str());
return 1;
}

View file

@ -27,6 +27,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "common/c_converter.h"
#include "common/c_content.h"
#include "log.h"
#include "player.h"
#include "server/serveractiveobject.h"
#include "tool.h"
#include "remoteplayer.h"
#include "server.h"
@ -36,12 +38,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "server/player_sao.h"
#include "server/serverinventorymgr.h"
#include "server/unit_sao.h"
#include "util/string.h"
using object_t = ServerActiveObject::object_t;
/*
ObjectRef
*/
ServerActiveObject* ObjectRef::getobject(ObjectRef *ref)
{
ServerActiveObject *sao = ref->m_object;
@ -99,9 +103,6 @@ int ObjectRef::l_remove(lua_State *L)
if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER)
return 0;
sao->clearChildAttachments();
sao->clearParentAttachment();
verbosestream << "ObjectRef::l_remove(): id=" << sao->getId() << std::endl;
sao->markForRemoval();
return 0;
@ -724,25 +725,17 @@ int ObjectRef::l_set_attach(lua_State *L)
if (sao == parent)
throw LuaError("ObjectRef::set_attach: attaching object to itself is not allowed.");
int parent_id;
std::string bone;
v3f position;
v3f rotation;
bool force_visible;
sao->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible);
if (parent_id) {
ServerActiveObject *old_parent = env->getActiveObject(parent_id);
old_parent->removeAttachmentChild(sao->getId());
}
bone = readParam<std::string>(L, 3, "");
position = readParam<v3f>(L, 4, v3f(0, 0, 0));
rotation = readParam<v3f>(L, 5, v3f(0, 0, 0));
force_visible = readParam<bool>(L, 6, false);
sao->setAttachment(parent->getId(), bone, position, rotation, force_visible);
parent->addAttachmentChild(sao->getId());
return 0;
}
@ -755,7 +748,7 @@ int ObjectRef::l_get_attach(lua_State *L)
if (sao == nullptr)
return 0;
int parent_id;
object_t parent_id;
std::string bone;
v3f position;
v3f rotation;
@ -783,11 +776,11 @@ int ObjectRef::l_get_children(lua_State *L)
if (sao == nullptr)
return 0;
const std::unordered_set<int> child_ids = sao->getAttachmentChildIds();
const auto &child_ids = sao->getAttachmentChildIds();
int i = 0;
lua_createtable(L, child_ids.size(), 0);
for (const int id : child_ids) {
for (const object_t id : child_ids) {
ServerActiveObject *child = env->getActiveObject(id);
getScriptApiBase(L)->objectrefGetOrCreate(L, child);
lua_rawseti(L, -2, ++i);
@ -847,6 +840,81 @@ int ObjectRef::l_get_properties(lua_State *L)
return 1;
}
// set_observers(self, observers)
int ObjectRef::l_set_observers(lua_State *L)
{
GET_ENV_PTR;
ObjectRef *ref = checkObject<ObjectRef>(L, 1);
ServerActiveObject *sao = getobject(ref);
if (sao == nullptr)
throw LuaError("Invalid ObjectRef");
// Reset object to "unmanaged" (sent to everyone)?
if (lua_isnoneornil(L, 2)) {
sao->m_observers.reset();
return 0;
}
std::unordered_set<std::string> observer_names;
lua_pushnil(L);
while (lua_next(L, 2) != 0) {
std::string name = readParam<std::string>(L, -2);
if (!is_valid_player_name(name))
throw LuaError("Observer name is not a valid player name");
if (!lua_toboolean(L, -1)) // falsy value?
throw LuaError("Values in the `observers` table need to be true");
observer_names.insert(std::move(name));
lua_pop(L, 1); // pop value, keep key
}
RemotePlayer *player = getplayer(ref);
if (player != nullptr) {
observer_names.insert(player->getName());
}
sao->m_observers = std::move(observer_names);
return 0;
}
template<typename F>
static int get_observers(lua_State *L, F observer_getter)
{
ObjectRef *ref = ObjectRef::checkObject<ObjectRef>(L, 1);
ServerActiveObject *sao = ObjectRef::getobject(ref);
if (sao == nullptr)
throw LuaError("invalid ObjectRef");
const auto observers = observer_getter(sao);
if (!observers) {
lua_pushnil(L);
return 1;
}
// Push set of observers {[name] = true}
lua_createtable(L, 0, observers->size());
for (auto &name : *observers) {
lua_pushboolean(L, true);
lua_setfield(L, -2, name.c_str());
}
return 1;
}
// get_observers(self)
int ObjectRef::l_get_observers(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
return get_observers(L, [](auto sao) { return sao->m_observers; });
}
// get_effective_observers(self)
int ObjectRef::l_get_effective_observers(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
return get_observers(L, [](auto sao) {
// The cache may be outdated, so we always have to recalculate.
return sao->recalculateEffectiveObservers();
});
}
// is_player(self)
int ObjectRef::l_is_player(lua_State *L)
{
@ -1176,7 +1244,7 @@ int ObjectRef::l_get_player_name(lua_State *L)
return 1;
}
lua_pushstring(L, player->getName());
lua_pushstring(L, player->getName().c_str());
return 1;
}
@ -1852,7 +1920,7 @@ int ObjectRef::l_hud_get_hotbar_itemcount(lua_State *L)
if (player == nullptr)
return 0;
lua_pushinteger(L, player->getHotbarItemcount());
lua_pushinteger(L, player->getMaxHotbarItemcount());
return 1;
}
@ -2686,6 +2754,9 @@ luaL_Reg ObjectRef::methods[] = {
luamethod(ObjectRef, get_properties),
luamethod(ObjectRef, set_nametag_attributes),
luamethod(ObjectRef, get_nametag_attributes),
luamethod(ObjectRef, set_observers),
luamethod(ObjectRef, get_observers),
luamethod(ObjectRef, get_effective_observers),
luamethod_aliased(ObjectRef, set_velocity, setvelocity),
luamethod_aliased(ObjectRef, add_velocity, add_player_velocity),

Some files were not shown because too many files have changed in this diff Show more